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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-09-10 17:36:27 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-09-10 17:36:27 +0400
commit353713afe827610501f0123b44b0054f49bf56ed (patch)
treede966b9d426b06708e37ad647a145e0940e4f535
parentfce87339750d50303f8b0324d88b517a10b76d52 (diff)
parent322dbc9a0fa7d0e1c82fa2968728cbfc5c536445 (diff)
Merged changes in the trunk up to revision 40096.
Conflicts resolved: source/blender/makesrna/intern/rna_scene.c source/blender/python/intern/CMakeLists.txt Note for branch builders: Enabling Blender Player may cause linker errors.
-rw-r--r--CMakeLists.txt15
-rw-r--r--build_files/cmake/Modules/FindOpenCOLLADA.cmake27
-rw-r--r--build_files/cmake/Modules/FindPCRE.cmake43
-rw-r--r--build_files/cmake/Modules/FindXML2.cmake88
-rw-r--r--build_files/cmake/macros.cmake1
-rw-r--r--build_files/scons/config/darwin-config.py2
-rw-r--r--build_files/scons/config/linuxcross-config.py1
-rw-r--r--build_files/scons/config/win32-mingw-config.py2
-rw-r--r--doc/python_api/examples/bge.texture.1.py2
-rw-r--r--doc/python_api/examples/bpy.types.Operator.py2
-rw-r--r--doc/python_api/rst/bgl.rst90
-rw-r--r--doc/python_api/rst/gpu.rst531
-rw-r--r--doc/python_api/rst/info_best_practice.rst65
-rw-r--r--doc/python_api/rst/info_quickstart.rst48
-rw-r--r--doc/python_api/rst/info_tips_and_tricks.rst227
-rw-r--r--doc/python_api/sphinx_doc_gen.py3
-rw-r--r--extern/CMakeLists.txt4
-rw-r--r--extern/SConscript1
-rw-r--r--extern/recastnavigation/CMakeLists.txt66
-rw-r--r--extern/recastnavigation/Detour/Include/DetourCommon.h167
-rw-r--r--extern/recastnavigation/Detour/Include/DetourNode.h149
-rw-r--r--extern/recastnavigation/Detour/Include/DetourStatNavMesh.h234
-rw-r--r--extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h33
-rw-r--r--extern/recastnavigation/Detour/Include/DetourTileNavMesh.h315
-rw-r--r--extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h29
-rw-r--r--extern/recastnavigation/Detour/Source/DetourCommon.cpp244
-rw-r--r--extern/recastnavigation/Detour/Source/DetourNode.cpp140
-rw-r--r--extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp876
-rw-r--r--extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp346
-rw-r--r--extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp1428
-rw-r--r--extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp213
-rw-r--r--extern/recastnavigation/License.txt18
-rw-r--r--extern/recastnavigation/Readme.txt120
-rw-r--r--extern/recastnavigation/Recast/Include/Recast.h501
-rw-r--r--extern/recastnavigation/Recast/Include/RecastLog.h80
-rw-r--r--extern/recastnavigation/Recast/Include/RecastTimer.h31
-rw-r--r--extern/recastnavigation/Recast/Source/Recast.cpp272
-rw-r--r--extern/recastnavigation/Recast/Source/RecastContour.cpp732
-rw-r--r--extern/recastnavigation/Recast/Source/RecastFilter.cpp249
-rw-r--r--extern/recastnavigation/Recast/Source/RecastLog.cpp77
-rw-r--r--extern/recastnavigation/Recast/Source/RecastMesh.cpp1218
-rw-r--r--extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp989
-rw-r--r--extern/recastnavigation/Recast/Source/RecastRasterization.cpp308
-rw-r--r--extern/recastnavigation/Recast/Source/RecastRegion.cpp1081
-rw-r--r--extern/recastnavigation/Recast/Source/RecastTimer.cpp58
-rw-r--r--extern/recastnavigation/SConscript11
-rw-r--r--intern/ghost/intern/GHOST_NDOFManager.cpp4
-rw-r--r--intern/guardedalloc/MEM_sys_types.h5
-rw-r--r--intern/opennl/CMakeLists.txt7
-rw-r--r--intern/smoke/CMakeLists.txt2
-rw-r--r--intern/smoke/SConscript2
-rw-r--r--intern/smoke/intern/FFT_NOISE.h2
-rw-r--r--intern/smoke/intern/WTURBULENCE.cpp2
-rw-r--r--release/datafiles/blenderbuttonsbin215334 -> 214916 bytes
-rw-r--r--release/scripts/modules/bpy_types.py26
-rw-r--r--release/scripts/startup/bl_operators/animsys_update.py1
-rw-r--r--release/scripts/startup/bl_operators/nla.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_data_armature.py12
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py159
-rw-r--r--release/scripts/startup/bl_ui/properties_data_speaker.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_game.py108
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fluid.py2
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py13
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py7
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_global.h2
-rw-r--r--source/blender/blenkernel/BKE_node.h344
-rw-r--r--source/blender/blenkernel/BKE_sound.h9
-rw-r--r--source/blender/blenkernel/intern/blender.c11
-rw-r--r--source/blender/blenkernel/intern/customdata.c12
-rw-r--r--source/blender/blenkernel/intern/material.c9
-rw-r--r--source/blender/blenkernel/intern/node.c3321
-rw-r--r--source/blender/blenkernel/intern/object.c1
-rw-r--r--source/blender/blenkernel/intern/sca.c16
-rw-r--r--source/blender/blenkernel/intern/scene.c17
-rw-r--r--source/blender/blenkernel/intern/sequencer.c3
-rw-r--r--source/blender/blenkernel/intern/sound.c34
-rw-r--r--source/blender/blenkernel/intern/texture.c4
-rw-r--r--source/blender/blenlib/BLI_math_inline.h5
-rw-r--r--source/blender/blenlib/BLI_math_matrix.h3
-rw-r--r--source/blender/blenlib/BLI_math_vector.h1
-rw-r--r--source/blender/blenlib/BLI_utildefines.h6
-rw-r--r--source/blender/blenlib/intern/math_matrix.c18
-rw-r--r--source/blender/blenlib/intern/math_vector.c8
-rw-r--r--source/blender/blenlib/intern/noise.c16
-rw-r--r--source/blender/blenlib/intern/string.c4
-rw-r--r--source/blender/blenloader/BLO_sys_types.h9
-rw-r--r--source/blender/blenloader/CMakeLists.txt1
-rw-r--r--source/blender/blenloader/SConscript2
-rw-r--r--source/blender/blenloader/intern/readfile.c359
-rw-r--r--source/blender/blenloader/intern/writefile.c68
-rw-r--r--source/blender/collada/AnimationExporter.cpp1700
-rw-r--r--source/blender/collada/AnimationImporter.cpp405
-rw-r--r--source/blender/collada/AnimationImporter.h14
-rw-r--r--source/blender/collada/ArmatureExporter.cpp8
-rw-r--r--source/blender/collada/ArmatureExporter.h33
-rw-r--r--source/blender/collada/ArmatureImporter.cpp11
-rw-r--r--source/blender/collada/ArmatureImporter.h4
-rw-r--r--source/blender/collada/CMakeLists.txt6
-rw-r--r--source/blender/collada/CameraExporter.cpp6
-rw-r--r--source/blender/collada/CameraExporter.h8
-rw-r--r--source/blender/collada/DocumentExporter.cpp199
-rw-r--r--source/blender/collada/DocumentExporter.h7
-rw-r--r--source/blender/collada/DocumentImporter.cpp22
-rw-r--r--source/blender/collada/EffectExporter.cpp6
-rw-r--r--source/blender/collada/EffectExporter.h8
-rw-r--r--source/blender/collada/ErrorHandler.cpp90
-rw-r--r--source/blender/collada/ErrorHandler.h58
-rw-r--r--source/blender/collada/ExportSettings.cpp29
-rw-r--r--source/blender/collada/ExportSettings.h39
-rw-r--r--source/blender/collada/GeometryExporter.cpp6
-rw-r--r--source/blender/collada/GeometryExporter.h8
-rw-r--r--source/blender/collada/ImageExporter.cpp8
-rw-r--r--source/blender/collada/ImageExporter.h10
-rw-r--r--source/blender/collada/LightExporter.cpp6
-rw-r--r--source/blender/collada/LightExporter.h7
-rw-r--r--source/blender/collada/MaterialExporter.cpp6
-rw-r--r--source/blender/collada/MaterialExporter.h6
-rw-r--r--source/blender/collada/MeshImporter.cpp10
-rw-r--r--source/blender/collada/SceneExporter.cpp161
-rw-r--r--source/blender/collada/SceneExporter.h109
-rw-r--r--source/blender/collada/SkinInfo.cpp6
-rw-r--r--source/blender/collada/TransformReader.cpp1
-rw-r--r--source/blender/collada/TransformWriter.cpp2
-rw-r--r--source/blender/collada/collada.cpp13
-rw-r--r--source/blender/editors/animation/anim_ops.c4
-rw-r--r--source/blender/editors/datafiles/blenderbuttons.c13449
-rw-r--r--source/blender/editors/gpencil/CMakeLists.txt1
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c2
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c4
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h7
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c263
-rw-r--r--source/blender/editors/gpencil/gpencil_undo.c168
-rw-r--r--source/blender/editors/include/ED_gpencil.h4
-rw-r--r--source/blender/editors/include/ED_navmesh_conversion.h96
-rw-r--r--source/blender/editors/include/ED_node.h5
-rw-r--r--source/blender/editors/include/ED_object.h4
-rw-r--r--source/blender/editors/include/ED_sequencer.h4
-rw-r--r--source/blender/editors/include/UI_icons.h2
-rw-r--r--source/blender/editors/interface/interface_layout.c42
-rw-r--r--source/blender/editors/interface/interface_templates.c42
-rw-r--r--source/blender/editors/interface/interface_widgets.c389
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c12
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c14
-rw-r--r--source/blender/editors/object/CMakeLists.txt11
-rw-r--r--source/blender/editors/object/SConscript6
-rw-r--r--source/blender/editors/object/object_hook.c21
-rw-r--r--source/blender/editors/object/object_intern.h5
-rw-r--r--source/blender/editors/object/object_modifier.c7
-rw-r--r--source/blender/editors/object/object_navmesh.cpp628
-rw-r--r--source/blender/editors/object/object_ops.c7
-rw-r--r--source/blender/editors/object/object_relations.c25
-rw-r--r--source/blender/editors/object/object_select.c34
-rw-r--r--source/blender/editors/screen/screen_ops.c21
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c5
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c4
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c5
-rw-r--r--source/blender/editors/sound/sound_ops.c2
-rw-r--r--source/blender/editors/space_graph/graph_ops.c4
-rw-r--r--source/blender/editors/space_logic/logic_ops.c6
-rw-r--r--source/blender/editors/space_logic/logic_window.c80
-rw-r--r--source/blender/editors/space_node/drawnode.c749
-rw-r--r--source/blender/editors/space_node/node_buttons.c4
-rw-r--r--source/blender/editors/space_node/node_draw.c681
-rw-r--r--source/blender/editors/space_node/node_edit.c693
-rw-r--r--source/blender/editors/space_node/node_header.c195
-rw-r--r--source/blender/editors/space_node/node_intern.h15
-rw-r--r--source/blender/editors/space_node/node_ops.c3
-rw-r--r--source/blender/editors/space_node/node_select.c24
-rw-r--r--source/blender/editors/space_node/node_state.c34
-rw-r--r--source/blender/editors/space_node/space_node.c22
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c46
-rw-r--r--source/blender/editors/space_outliner/outliner_edit.c8
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h21
-rw-r--r--source/blender/editors/space_outliner/outliner_select.c2
-rw-r--r--source/blender/editors/space_outliner/outliner_tools.c10
-rw-r--r--source/blender/editors/space_outliner/outliner_tree.c38
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c2
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c138
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c148
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c46
-rw-r--r--source/blender/editors/transform/transform.c9
-rw-r--r--source/blender/editors/transform/transform_conversions.c19
-rw-r--r--source/blender/editors/util/CMakeLists.txt8
-rw-r--r--source/blender/editors/util/SConscript8
-rw-r--r--source/blender/editors/util/navmesh_conversion.cpp450
-rw-r--r--source/blender/editors/util/undo.c6
-rw-r--r--source/blender/gpu/GPU_extensions.h2
-rw-r--r--source/blender/gpu/GPU_material.h74
-rw-r--r--source/blender/gpu/SConscript2
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c139
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h103
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c7
-rw-r--r--source/blender/gpu/intern/gpu_material.c210
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl24
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c2514
-rw-r--r--source/blender/imbuf/intern/cineon/cineonlib.c5
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.h4
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h25
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h4
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h4
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h178
-rw-r--r--source/blender/makesdna/DNA_node_types.h171
-rw-r--r--source/blender/makesdna/DNA_object_types.h5
-rw-r--r--source/blender/makesdna/DNA_outliner_types.h2
-rw-r--r--source/blender/makesdna/DNA_scene_types.h51
-rw-r--r--source/blender/makesdna/DNA_space_types.h1
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h6
-rw-r--r--source/blender/makesrna/RNA_access.h21
-rw-r--r--source/blender/makesrna/RNA_enum_types.h2
-rw-r--r--source/blender/makesrna/RNA_types.h5
-rw-r--r--source/blender/makesrna/SConscript1
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt2
-rw-r--r--source/blender/makesrna/intern/SConscript2
-rw-r--r--source/blender/makesrna/intern/rna_access.c21
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c214
-rw-r--r--source/blender/makesrna/intern/rna_internal.h1
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c381
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c440
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h10
-rw-r--r--source/blender/makesrna/intern/rna_object.c45
-rw-r--r--source/blender/makesrna/intern/rna_particle.c16
-rw-r--r--source/blender/makesrna/intern/rna_rna.c36
-rw-r--r--source/blender/makesrna/intern/rna_scene.c135
-rw-r--r--source/blender/makesrna/intern/rna_screen.c3
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c2
-rw-r--r--source/blender/makesrna/intern/rna_space.c50
-rw-r--r--source/blender/makesrna/intern/rna_texture.c4
-rw-r--r--source/blender/makesrna/intern/rna_texture_api.c54
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c32
-rw-r--r--source/blender/makesrna/intern/rna_wm.c3
-rw-r--r--source/blender/makesrna/intern/rna_world.c2
-rw-r--r--source/blender/modifiers/CMakeLists.txt15
-rw-r--r--source/blender/modifiers/MOD_modifiertypes.h4
-rw-r--r--source/blender/modifiers/SConscript8
-rw-r--r--source/blender/modifiers/intern/MOD_navmesh.cpp279
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c4
-rw-r--r--source/blender/modifiers/intern/MOD_util.c4
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.c306
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.h90
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c326
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgmix.c466
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c567
-rw-r--r--source/blender/nodes/CMakeLists.txt230
-rw-r--r--source/blender/nodes/NOD_composite.h (renamed from source/blender/nodes/CMP_node.h)12
-rw-r--r--source/blender/nodes/NOD_shader.h (renamed from source/blender/nodes/SHD_node.h)12
-rw-r--r--source/blender/nodes/NOD_socket.h90
-rw-r--r--source/blender/nodes/NOD_texture.h (renamed from source/blender/nodes/TEX_node.h)12
-rw-r--r--source/blender/nodes/SConscript8
-rw-r--r--source/blender/nodes/composite/node_composite_tree.c837
-rw-r--r--source/blender/nodes/composite/node_composite_util.c (renamed from source/blender/nodes/intern/CMP_util.c)10
-rw-r--r--source/blender/nodes/composite/node_composite_util.h (renamed from source/blender/nodes/intern/CMP_util.h)7
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_alphaOver.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_bilateralblur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_blur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_blur.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_brightness.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_brightness.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_channelMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_chromaMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorSpill.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorbalance.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_common.c373
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_composite.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_composite.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_crop.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_crop.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_curves.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_curves.c)48
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_defocus.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_defocus.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_diffMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_dilate.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_dilate.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_directionalblur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_displace.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_displace.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_distanceMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_filter.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_filter.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_flip.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_flip.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_gamma.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_gamma.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_glare.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_glare.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_hueSatVal.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_huecorrect.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_idMask.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_idMask.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_image.c)30
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_invert.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_invert.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_lensdist.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c)23
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_levels.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_levels.c)35
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_lummaMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mapUV.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mapValue.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_math.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_math.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mixrgb.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_normal.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_normal.c)34
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_normalize.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_normalize.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_outputFile.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_premulkey.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_rgb.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_rgb.c)27
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_rotate.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_rotate.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_scale.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_scale.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_setalpha.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_splitViewer.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_texture.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_texture.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_tonemap.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_translate.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_translate.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_valToRgb.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c)30
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_value.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_value.c)27
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_vecBlur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_viewer.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_viewer.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_zcombine.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c)24
-rw-r--r--source/blender/nodes/intern/SHD_util.c219
-rw-r--r--source/blender/nodes/intern/node_common.c983
-rw-r--r--source/blender/nodes/intern/node_common.h66
-rw-r--r--source/blender/nodes/intern/node_exec.c309
-rw-r--r--source/blender/nodes/intern/node_exec.h90
-rw-r--r--source/blender/nodes/intern/node_socket.c433
-rw-r--r--source/blender/nodes/intern/node_util.c18
-rw-r--r--source/blender/nodes/intern/node_util.h13
-rw-r--r--source/blender/nodes/shader/node_shader_tree.c226
-rw-r--r--source/blender/nodes/shader/node_shader_util.c287
-rw-r--r--source/blender/nodes/shader/node_shader_util.h (renamed from source/blender/nodes/intern/SHD_util.h)13
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_camera.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_camera.c)16
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_common.c327
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_curves.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_curves.c)36
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_dynamic.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c)8
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_geom.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_geom.c)28
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_hueSatVal.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c)26
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_invert.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_invert.c)18
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mapping.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_mapping.c)18
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_material.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_material.c)84
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_math.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_math.c)18
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mixRgb.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c)22
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_normal.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_normal.c)34
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_output.c)16
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_rgb.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_rgb.c)30
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c)38
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_squeeze.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c)26
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_texture.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_texture.c)20
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_valToRgb.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c)32
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_value.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_value.c)30
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_vectMath.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c)20
-rw-r--r--source/blender/nodes/texture/node_texture_tree.c251
-rw-r--r--source/blender/nodes/texture/node_texture_util.c (renamed from source/blender/nodes/intern/TEX_util.c)53
-rw-r--r--source/blender/nodes/texture/node_texture_util.h (renamed from source/blender/nodes/intern/TEX_util.h)10
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_at.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_at.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_bricks.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_bricks.c)34
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_checker.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_checker.c)23
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_common.c271
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_compose.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_compose.c)25
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_coord.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_coord.c)15
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_curves.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_curves.c)31
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_decompose.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_decompose.c)25
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_distance.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_distance.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_hueSatVal.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c)27
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_image.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_image.c)16
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_invert.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_invert.c)19
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_math.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_math.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_mixRgb.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c)23
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_output.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_output.c)19
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_proc.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_proc.c)88
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_rotate.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_rotate.c)23
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_scale.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_scale.c)19
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_texture.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_texture.c)25
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_translate.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_translate.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_valToNor.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_valToRgb.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c)30
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_viewer.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_viewer.c)17
-rw-r--r--source/blender/python/SConscript2
-rw-r--r--source/blender/python/generic/bpy_internal_import.c4
-rw-r--r--source/blender/python/generic/py_capi_utils.c76
-rw-r--r--source/blender/python/intern/CMakeLists.txt3
-rw-r--r--source/blender/python/intern/bpy_driver.c7
-rw-r--r--source/blender/python/intern/bpy_interface.c2
-rw-r--r--source/blender/python/intern/bpy_rna.c26
-rw-r--r--source/blender/python/intern/gpu.c289
-rw-r--r--source/blender/python/intern/gpu.h41
-rw-r--r--source/blender/python/mathutils/mathutils_geometry.c12
-rw-r--r--source/blender/render/intern/source/render_texture.c6
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c25
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c12
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c4
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c1
-rw-r--r--source/creator/CMakeLists.txt4
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp5
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp2
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.cpp4
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp52
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp2
-rw-r--r--source/gameengine/Converter/CMakeLists.txt1
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp6
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp62
-rw-r--r--source/gameengine/Converter/KX_IpoConvert.cpp2
-rw-r--r--source/gameengine/Converter/SConscript1
-rw-r--r--source/gameengine/Expressions/IfExpr.h2
-rw-r--r--source/gameengine/Expressions/ListValue.cpp4
-rw-r--r--source/gameengine/Expressions/Value.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.h1
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt9
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp18
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h14
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_NavMeshObject.cpp708
-rw-r--r--source/gameengine/Ketsji/KX_NavMeshObject.h83
-rw-r--r--source/gameengine/Ketsji/KX_ObstacleSimulation.cpp869
-rw-r--r--source/gameengine/Ketsji/KX_ObstacleSimulation.h145
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp25
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.h3
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp37
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h8
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp10
-rw-r--r--source/gameengine/Ketsji/KX_SteeringActuator.cpp630
-rw-r--r--source/gameengine/Ketsji/KX_SteeringActuator.h130
-rw-r--r--source/gameengine/Ketsji/SConscript2
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h4
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp64
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h39
-rw-r--r--source/gameengine/VideoTexture/CMakeLists.txt1
-rw-r--r--source/gameengine/VideoTexture/blendVideoTex.cpp4
420 files changed, 39823 insertions, 15794 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 38ce8689855..ea89cbddb9f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -452,15 +452,8 @@ if(UNIX AND NOT APPLE)
if(WITH_OPENCOLLADA)
find_package(OpenCOLLADA)
if(OPENCOLLADA_FOUND)
- set(PCRE /usr CACHE PATH "PCRE Directory")
- mark_as_advanced(PCRE)
- set(PCRE_LIBPATH ${PCRE}/lib)
- set(PCRE_LIB pcre)
-
- set(EXPAT /usr CACHE PATH "Expat Directory")
- mark_as_advanced(EXPAT)
- set(EXPAT_LIBPATH ${EXPAT}/lib)
- set(EXPAT_LIB expat)
+ find_package(XML2)
+ find_package(PCRE)
else()
set(WITH_OPENCOLLADA OFF)
endif()
@@ -797,7 +790,7 @@ elseif(WIN32)
else()
# keep GCC spesific stuff here
if(CMAKE_COMPILER_IS_GNUCC)
- set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid")
+ set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid -lwsock32")
set(PLATFORM_CFLAGS "-pipe -funsigned-char -fno-strict-aliasing")
add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE)
@@ -1267,6 +1260,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_POINTER_ARITH -Wpointer-arith)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNUSED_PARAMETER -Wunused-parameter)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_WRITE_STRINGS -Wwrite-strings)
+ ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNDEFINED -Wundef)
# disable because it gives warnings for printf() & friends.
# ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_DOUBLE_PROMOTION -Wdouble-promotion -Wno-error=double-promotion)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
@@ -1274,6 +1268,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF -Wno-invalid-offsetof)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE -Wno-sign-compare)
+ ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNDEFINED -Wundef)
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
diff --git a/build_files/cmake/Modules/FindOpenCOLLADA.cmake b/build_files/cmake/Modules/FindOpenCOLLADA.cmake
index c7637283514..a9a1d544507 100644
--- a/build_files/cmake/Modules/FindOpenCOLLADA.cmake
+++ b/build_files/cmake/Modules/FindOpenCOLLADA.cmake
@@ -49,12 +49,14 @@ SET(_opencollada_FIND_COMPONENTS
OpenCOLLADAFramework
OpenCOLLADABaseUtils
GeneratedSaxParser
- UTF
MathMLSolver
- pcre
+)
+
+# Fedora openCOLLADA package links these statically
+SET(_opencollada_FIND_STATIC_COMPONENTS
+ UTF
ftoa
buffer
- xml2
)
SET(_opencollada_SEARCH_DIRS
@@ -104,6 +106,25 @@ FOREACH(COMPONENT ${_opencollada_FIND_COMPONENTS})
LIST(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}")
ENDFOREACH()
+FOREACH(COMPONENT ${_opencollada_FIND_STATIC_COMPONENTS})
+ STRING(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+
+ FIND_LIBRARY(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY
+ NAMES
+ ${COMPONENT}
+ HINTS
+ ${_opencollada_SEARCH_DIRS}
+ PATH_SUFFIXES
+ lib64 lib
+ # Ubuntu ppa needs this.
+ lib64/opencollada lib/opencollada
+ )
+ IF(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY)
+ MARK_AS_ADVANCED(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY)
+ LIST(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}")
+ ENDIF()
+ENDFOREACH()
+
# handle the QUIETLY and REQUIRED arguments and set OPENCOLLADA_FOUND to TRUE if
# all listed variables are TRUE
diff --git a/build_files/cmake/Modules/FindPCRE.cmake b/build_files/cmake/Modules/FindPCRE.cmake
new file mode 100644
index 00000000000..a09375287a6
--- /dev/null
+++ b/build_files/cmake/Modules/FindPCRE.cmake
@@ -0,0 +1,43 @@
+# - Try to find the PCRE regular expression library
+# Once done this will define
+#
+# PCRE_FOUND - system has the PCRE library
+# PCRE_INCLUDE_DIR - the PCRE include directory
+# PCRE_LIBRARIES - The libraries needed to use PCRE
+
+# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+
+if (PCRE_INCLUDE_DIR AND PCRE_PCREPOSIX_LIBRARY AND PCRE_PCRE_LIBRARY)
+ # Already in cache, be silent
+ set(PCRE_FIND_QUIETLY TRUE)
+endif (PCRE_INCLUDE_DIR AND PCRE_PCREPOSIX_LIBRARY AND PCRE_PCRE_LIBRARY)
+
+if (NOT WIN32)
+ # use pkg-config to get the directories and then use these values
+ # in the FIND_PATH() and FIND_LIBRARY() calls
+ find_package(PkgConfig)
+ pkg_check_modules(PC_PCRE QUIET libpcre)
+ set(PCRE_DEFINITIONS ${PC_PCRE_CFLAGS_OTHER})
+endif (NOT WIN32)
+
+find_path(PCRE_INCLUDE_DIR pcre.h
+ HINTS ${PC_PCRE_INCLUDEDIR} ${PC_PCRE_INCLUDE_DIRS}
+ PATH_SUFFIXES pcre)
+
+find_library(PCRE_PCRE_LIBRARY NAMES pcre HINTS ${PC_PCRE_LIBDIR} ${PC_PCRE_LIBRARY_DIRS})
+
+find_library(PCRE_PCREPOSIX_LIBRARY NAMES pcreposix HINTS ${PC_PCRE_LIBDIR} ${PC_PCRE_LIBRARY_DIRS})
+
+include(FindPackageHandleStandardArgs)
+
+IF(NOT WIN32)
+ find_package_handle_standard_args(PCRE DEFAULT_MSG PCRE_INCLUDE_DIR PCRE_PCRE_LIBRARY PCRE_PCREPOSIX_LIBRARY )
+ mark_as_advanced(PCRE_INCLUDE_DIR PCRE_LIBRARIES PCRE_PCREPOSIX_LIBRARY PCRE_PCRE_LIBRARY)
+ set(PCRE_LIBRARIES ${PCRE_PCRE_LIBRARY} ${PCRE_PCREPOSIX_LIBRARY})
+ELSE()
+ find_package_handle_standard_args(PCRE DEFAULT_MSG PCRE_INCLUDE_DIR PCRE_PCRE_LIBRARY )
+ set(PCRE_LIBRARIES ${PCRE_PCRE_LIBRARY} )
+ mark_as_advanced(PCRE_INCLUDE_DIR PCRE_LIBRARIES PCRE_PCRE_LIBRARY)
+ENDIF()
diff --git a/build_files/cmake/Modules/FindXML2.cmake b/build_files/cmake/Modules/FindXML2.cmake
new file mode 100644
index 00000000000..e9f9fb3ca74
--- /dev/null
+++ b/build_files/cmake/Modules/FindXML2.cmake
@@ -0,0 +1,88 @@
+# - Try to find XML2
+# Once done this will define
+#
+# XML2_FOUND - system has XML2
+# XML2_INCLUDE_DIRS - the XML2 include directory
+# XML2_LIBRARIES - Link these to use XML2
+# XML2_DEFINITIONS - Compiler switches required for using XML2
+#
+# Copyright (c) 2008 Andreas Schneider <mail@cynapses.org>
+#
+# Redistribution and use is allowed according to the terms of the New
+# BSD license.
+#
+
+
+if (XML2_LIBRARIES AND XML2_INCLUDE_DIRS)
+ # in cache already
+ set(XML2_FOUND TRUE)
+else (XML2_LIBRARIES AND XML2_INCLUDE_DIRS)
+ # use pkg-config to get the directories and then use these values
+ # in the FIND_PATH() and FIND_LIBRARY() calls
+ if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
+ include(UsePkgConfig)
+ pkgconfig(libxml-2.0 _XML2_INCLUDEDIR _XML2_LIBDIR _XML2_LDFLAGS _XML2_CFLAGS)
+ else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
+ find_package(PkgConfig)
+ if (PKG_CONFIG_FOUND)
+ pkg_check_modules(_XML2 libxml-2.0)
+ endif (PKG_CONFIG_FOUND)
+ endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
+ find_path(XML2_INCLUDE_DIR
+ NAMES
+ libxml/xpath.h
+ PATHS
+ ${_XML2_INCLUDEDIR}
+ /usr/include
+ /usr/local/include
+ /opt/local/include
+ /sw/include
+ PATH_SUFFIXES
+ libxml2
+ )
+
+ find_library(XML2_LIBRARY
+ NAMES
+ xml2
+ PATHS
+ ${_XML2_LIBDIR}
+ /usr/lib
+ /usr/local/lib
+ /opt/local/lib
+ /sw/lib
+ )
+
+ if (XML2_LIBRARY)
+ set(XML2_FOUND TRUE)
+ endif (XML2_LIBRARY)
+
+ set(XML2_INCLUDE_DIRS
+ ${XML2_INCLUDE_DIR}
+ )
+
+ if (XML2_FOUND)
+ set(XML2_LIBRARIES
+ ${XML2_LIBRARIES}
+ ${XML2_LIBRARY}
+ )
+ endif (XML2_FOUND)
+
+ if (XML2_INCLUDE_DIRS AND XML2_LIBRARIES)
+ set(XML2_FOUND TRUE)
+ endif (XML2_INCLUDE_DIRS AND XML2_LIBRARIES)
+
+ if (XML2_FOUND)
+ if (NOT XML2_FIND_QUIETLY)
+ message(STATUS "Found XML2: ${XML2_LIBRARIES}")
+ endif (NOT XML2_FIND_QUIETLY)
+ else (XML2_FOUND)
+ if (XML2_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find XML2")
+ endif (XML2_FIND_REQUIRED)
+ endif (XML2_FOUND)
+
+ # show the XML2_INCLUDE_DIRS and XML2_LIBRARIES variables only in the advanced view
+ mark_as_advanced(XML2_INCLUDE_DIRS XML2_LIBRARIES)
+
+endif (XML2_LIBRARIES AND XML2_INCLUDE_DIRS)
+
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 58938c8b0b0..d09215d040d 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -392,6 +392,7 @@ macro(remove_strict_flags)
remove_flag("-Wstrict-prototypes")
remove_flag("-Wunused-parameter")
remove_flag("-Wwrite-strings")
+ remove_flag("-Wundef")
remove_flag("-Wshadow")
remove_flag("-Werror=[^ ]+")
remove_flag("-Werror")
diff --git a/build_files/scons/config/darwin-config.py b/build_files/scons/config/darwin-config.py
index 102ec73a4e3..29d2b39323e 100644
--- a/build_files/scons/config/darwin-config.py
+++ b/build_files/scons/config/darwin-config.py
@@ -14,7 +14,7 @@ USE_SDK=True
################### Cocoa & architecture settings ##################
#############################################################################
WITH_GHOST_COCOA=True
-MACOSX_ARCHITECTURE = 'x86_64' # valid archs: ppc, i386, ppc64, x86_64
+MACOSX_ARCHITECTURE = 'i386' # valid archs: ppc, i386, ppc64, x86_64
cmd = 'uname -p'
diff --git a/build_files/scons/config/linuxcross-config.py b/build_files/scons/config/linuxcross-config.py
index 1bdf735f458..8057d478c31 100644
--- a/build_files/scons/config/linuxcross-config.py
+++ b/build_files/scons/config/linuxcross-config.py
@@ -127,6 +127,7 @@ WITH_BF_BINRELOC = False
WITH_BF_FFMPEG = True # -DWITH_FFMPEG
BF_FFMPEG = LIBDIR + '/ffmpeg'
BF_FFMPEG_LIB = 'avformat-53 avcodec-53 avdevice-53 avutil-51 swscale-2'
+BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll'
BF_FFMPEG_INC = '${BF_FFMPEG}/include'
BF_FFMPEG_LIBPATH = '${BF_FFMPEG}/lib'
BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll'
diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py
index c815b76ef73..37d693db560 100644
--- a/build_files/scons/config/win32-mingw-config.py
+++ b/build_files/scons/config/win32-mingw-config.py
@@ -174,7 +174,7 @@ C_WARN = ['-Wno-char-subscripts', '-Wdeclaration-after-statement', '-Wstrict-pro
CC_WARN = [ '-Wall' ]
-LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid']
+LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', '-lwsock32']
PLATFORM_LINKFLAGS = ['--stack,2097152']
diff --git a/doc/python_api/examples/bge.texture.1.py b/doc/python_api/examples/bge.texture.1.py
index faa0ae736e8..4be6f51de67 100644
--- a/doc/python_api/examples/bge.texture.1.py
+++ b/doc/python_api/examples/bge.texture.1.py
@@ -14,7 +14,7 @@ def createTexture(cont):
object = cont.owner
# get the reference pointer (ID) of the internal texture
- ID = texture.materialID(obj, 'IMoriginal.png')
+ ID = texture.materialID(object, 'IMoriginal.png')
# create a texture object
object_texture = texture.Texture(object, ID)
diff --git a/doc/python_api/examples/bpy.types.Operator.py b/doc/python_api/examples/bpy.types.Operator.py
index 52edfa0a61b..0981712e1ff 100644
--- a/doc/python_api/examples/bpy.types.Operator.py
+++ b/doc/python_api/examples/bpy.types.Operator.py
@@ -21,7 +21,7 @@ class HelloWorldOperator(bpy.types.Operator):
print("Hello World")
return {'FINISHED'}
-bpy.utils.register_class(SimpleOperator)
+bpy.utils.register_class(HelloWorldOperator)
# test call to the newly defined operator
bpy.ops.wm.hello_world()
diff --git a/doc/python_api/rst/bgl.rst b/doc/python_api/rst/bgl.rst
index 5f3158bf5dd..61400351d16 100644
--- a/doc/python_api/rst/bgl.rst
+++ b/doc/python_api/rst/bgl.rst
@@ -56,9 +56,9 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures to be queried.
- :type textures: :class:`Buffer` object I{type GL_INT}
+ :type textures: :class:`bgl.Buffer` object I{type GL_INT}
:arg textures: Specifies an array containing the names of the textures to be queried
- :type residences: :class:`Buffer` object I{type GL_INT}(boolean)
+ :type residences: :class:`bgl.Buffer` object I{type GL_INT}(boolean)
:arg residences: An array in which the texture residence status in returned.
The residence status of a texture named by an element of textures is
returned in the corresponding element of residences.
@@ -101,7 +101,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type xmove, ymove: float
:arg xmove, ymove: Specify the x and y offsets to be added to the current raster position after
the bitmap is drawn.
- :type bitmap: :class:`Buffer` object I{type GL_BYTE}
+ :type bitmap: :class:`bgl.Buffer` object I{type GL_BYTE}
:arg bitmap: Specifies the address of the bitmap image.
@@ -139,7 +139,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg n: Specifies the number of display lists to be executed.
:type type: Enumerated constant
:arg type: Specifies the type of values in lists.
- :type lists: :class:`Buffer` object
+ :type lists: :class:`bgl.Buffer` object
:arg lists: Specifies the address of an array of name offsets in the display list.
The pointer type is void because the offsets can be bytes, shorts, ints, or floats,
depending on the value of type.
@@ -217,7 +217,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type plane: Enumerated constant
:arg plane: Specifies which clipping plane is being positioned.
- :type equation: :class:`Buffer` object I{type GL_FLOAT}(double)
+ :type equation: :class:`bgl.Buffer` object I{type GL_FLOAT}(double)
:arg equation: Specifies the address of an array of four double- precision
floating-point values. These values are interpreted as a plane equation.
@@ -340,7 +340,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures to be deleted
- :type textures: :class:`Buffer` I{GL_INT}
+ :type textures: :class:`bgl.Buffer` I{GL_INT}
:arg textures: Specifies an array of textures to be deleted
@@ -413,7 +413,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type for pixels.
- :type pixels: :class:`Buffer` object
+ :type pixels: :class:`bgl.Buffer` object
:arg pixels: Specifies a pointer to the pixel data.
@@ -512,7 +512,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type type: Enumerated constant
:arg type: Specifies a symbolic constant that describes the information that
will be returned for each vertex.
- :type buffer: :class:`Buffer` object I{GL_FLOAT}
+ :type buffer: :class:`bgl.Buffer` object I{GL_FLOAT}
:arg buffer: Returns the feedback data.
@@ -592,7 +592,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures name to be generated.
- :type textures: :class:`Buffer` object I{type GL_INT}
+ :type textures: :class:`bgl.Buffer` object I{type GL_INT}
:arg textures: Specifies an array in which the generated textures names are stored.
@@ -620,7 +620,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg plane: Specifies a clipping plane. The number of clipping planes depends on the
implementation, but at least six clipping planes are supported. They are identified by
symbolic names of the form GL_CLIP_PLANEi where 0 < i < GL_MAX_CLIP_PLANES.
- :type equation: :class:`Buffer` object I{type GL_FLOAT}
+ :type equation: :class:`bgl.Buffer` object I{type GL_FLOAT}
:arg equation: Returns four float (double)-precision values that are the coefficients of the
plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
@@ -646,7 +646,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
names of the form GL_LIGHTi where 0 < i < GL_MAX_LIGHTS.
:type pname: Enumerated constant
:arg pname: Specifies a light source parameter for light.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -662,7 +662,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg target: Specifies the symbolic name of a map.
:type query: Enumerated constant
:arg query: Specifies which parameter to return.
- :type v: :class:`Buffer` object. Depends on function prototype.
+ :type v: :class:`bgl.Buffer` object. Depends on function prototype.
:arg v: Returns the requested data.
@@ -679,7 +679,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
representing the front and back materials, respectively.
:type pname: Enumerated constant
:arg pname: Specifies the material parameter to return.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -693,7 +693,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type map: Enumerated constant
:arg map: Specifies the name of the pixel map to return.
- :type values: :class:`Buffer` object. Depends on function prototype.
+ :type values: :class:`bgl.Buffer` object. Depends on function prototype.
:arg values: Returns the pixel map contents.
@@ -703,7 +703,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getpolygonstipple.html>`_
- :type mask: :class:`Buffer` object I{type GL_BYTE}
+ :type mask: :class:`bgl.Buffer` object I{type GL_BYTE}
:arg mask: Returns the stipple pattern. The initial value is all 1's.
@@ -730,7 +730,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg target: Specifies a texture environment. Must be GL_TEXTURE_ENV.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name of a texture environment parameter.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -746,7 +746,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg coord: Specifies a texture coordinate.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name of the value(s) to be returned.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -765,7 +765,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies a pixel format for the returned data.
:type type: Enumerated constant
:arg type: Specifies a pixel type for the returned data.
- :type pixels: :class:`Buffer` object.
+ :type pixels: :class:`bgl.Buffer` object.
:arg pixels: Returns the texture image. Should be a pointer to an array of the
type specified by type
@@ -785,7 +785,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
Level 0 is the base image level. Level n is the nth mipmap reduction image.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name of a texture parameter.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -801,7 +801,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg target: Specifies the symbolic name of the target texture.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name the target texture.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the texture parameters.
@@ -826,7 +826,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/index_.html>`_
- :type c: :class:`Buffer` object. Depends on function prototype.
+ :type c: :class:`bgl.Buffer` object. Depends on function prototype.
:arg c: Specifies a pointer to a one element array that contains the new value for
the current color index.
@@ -956,7 +956,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadmatrix.html>`_
- :type m: :class:`Buffer` object. Depends on function prototype.
+ :type m: :class:`bgl.Buffer` object. Depends on function prototype.
:arg m: Specifies a pointer to 16 consecutive values, which are used as the elements
of a 4x4 column-major matrix.
@@ -1002,7 +1002,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
occupy contiguous memory locations.
:type order: int
:arg order: Specifies the number of control points. Must be positive.
- :type points: :class:`Buffer` object. Depends on function prototype.
+ :type points: :class:`bgl.Buffer` object. Depends on function prototype.
:arg points: Specifies a pointer to the array of control points.
@@ -1043,7 +1043,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type vorder: int
:arg vorder: Specifies the dimension of the control point array in the v axis.
Must be positive. The initial value is 1.
- :type points: :class:`Buffer` object. Depends on function prototype.
+ :type points: :class:`bgl.Buffer` object. Depends on function prototype.
:arg points: Specifies a pointer to the array of control points.
@@ -1103,7 +1103,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/multmatrix.html>`_
- :type m: :class:`Buffer` object. Depends on function prototype.
+ :type m: :class:`bgl.Buffer` object. Depends on function prototype.
:arg m: Points to 16 consecutive values that are used as the elements of a 4x4 column
major matrix.
@@ -1132,7 +1132,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type nx, ny, nz: Depends on function prototype. (non - 'v' prototypes only)
:arg nx, ny, nz: Specify the x, y, and z coordinates of the new current normal.
The initial value of the current normal is the unit vector, (0, 0, 1).
- :type v: :class:`Buffer` object. Depends on function prototype. ('v' prototypes)
+ :type v: :class:`bgl.Buffer` object. Depends on function prototype. ('v' prototypes)
:arg v: Specifies a pointer to an array of three elements: the x, y, and z coordinates
of the new current normal.
@@ -1177,7 +1177,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg map: Specifies a symbolic map name.
:type mapsize: int
:arg mapsize: Specifies the size of the map being defined.
- :type values: :class:`Buffer` object. Depends on function prototype.
+ :type values: :class:`bgl.Buffer` object. Depends on function prototype.
:arg values: Specifies an array of mapsize values.
@@ -1266,7 +1266,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonstipple.html>`_
- :type mask: :class:`Buffer` object I{type GL_BYTE}
+ :type mask: :class:`bgl.Buffer` object I{type GL_BYTE}
:arg mask: Specifies a pointer to a 32x32 stipple pattern that will be unpacked
from memory in the same way that glDrawPixels unpacks pixels.
@@ -1307,9 +1307,9 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures to be prioritized.
- :type textures: :class:`Buffer` I{type GL_INT}
+ :type textures: :class:`bgl.Buffer` I{type GL_INT}
:arg textures: Specifies an array containing the names of the textures to be prioritized.
- :type priorities: :class:`Buffer` I{type GL_FLOAT}
+ :type priorities: :class:`bgl.Buffer` I{type GL_FLOAT}
:arg priorities: Specifies an array containing the texture priorities.
A priority given in an element of priorities applies to the texture named
by the corresponding element of textures.
@@ -1417,7 +1417,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type of the pixel data.
- :type pixels: :class:`Buffer` object
+ :type pixels: :class:`bgl.Buffer` object
:arg pixels: Returns the pixel data.
@@ -1496,7 +1496,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type size: int
:arg size: Specifies the size of buffer
- :type buffer: :class:`Buffer` I{type GL_INT}
+ :type buffer: :class:`bgl.Buffer` I{type GL_INT}
:arg buffer: Returns the selection data
@@ -1575,7 +1575,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type s, t, r, q: Depends on function prototype. (r and q for '3' and '4' prototypes only)
:arg s, t, r, q: Specify s, t, r, and q texture coordinates. Not all parameters are
present in all forms of the command.
- :type v: :class:`Buffer` object. Depends on function prototype. (for 'v' prototypes only)
+ :type v: :class:`bgl.Buffer` object. Depends on function prototype. (for 'v' prototypes only)
:arg v: Specifies a pointer to an array of one, two, three, or four elements,
which in turn specify the s, t, r, and q texture coordinates.
@@ -1642,7 +1642,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type of the pixel data.
- :type pixels: :class:`Buffer` object.
+ :type pixels: :class:`bgl.Buffer` object.
:arg pixels: Specifies a pointer to the image data in memory.
@@ -1673,7 +1673,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type of the pixel data.
- :type pixels: :class:`Buffer` object.
+ :type pixels: :class:`bgl.Buffer` object.
:arg pixels: Specifies a pointer to the image data in memory.
@@ -1720,7 +1720,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type x, y, z, w: Depends on function prototype (z and w for '3' and '4' prototypes only)
:arg x, y, z, w: Specify x, y, z, and w coordinates of a vertex. Not all parameters
are present in all forms of the command.
- :type v: :class:`Buffer` object. Depends of function prototype (for 'v'
+ :type v: :class:`bgl.Buffer` object. Depends of function prototype (for 'v'
prototypes only)
:arg v: Specifies a pointer to an array of two, three, or four elements. The
elements of a two-element array are x and y; of a three-element array,
@@ -1795,7 +1795,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg x, y: Specify the center of a picking region in window coordinates.
:type width, height: double
:arg width, height: Specify the width and height, respectively, of the picking region in window coordinates.
- :type viewport: :class:`Buffer` object. [int]
+ :type viewport: :class:`bgl.Buffer` object. [int]
:arg viewport: Specifies the current viewport.
@@ -1807,13 +1807,13 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type objx, objy, objz: double
:arg objx, objy, objz: Specify the object coordinates.
- :type modelMatrix: :class:`Buffer` object. [double]
+ :type modelMatrix: :class:`bgl.Buffer` object. [double]
:arg modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- :type projMatrix: :class:`Buffer` object. [double]
+ :type projMatrix: :class:`bgl.Buffer` object. [double]
:arg projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- :type viewport: :class:`Buffer` object. [int]
+ :type viewport: :class:`bgl.Buffer` object. [int]
:arg viewport: Specifies the current viewport (as from a glGetIntegerv call).
- :type winx, winy, winz: :class:`Buffer` object. [double]
+ :type winx, winy, winz: :class:`bgl.Buffer` object. [double]
:arg winx, winy, winz: Return the computed window coordinates.
@@ -1825,13 +1825,13 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type winx, winy, winz: double
:arg winx, winy, winz: Specify the window coordinates to be mapped.
- :type modelMatrix: :class:`Buffer` object. [double]
+ :type modelMatrix: :class:`bgl.Buffer` object. [double]
:arg modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- :type projMatrix: :class:`Buffer` object. [double]
+ :type projMatrix: :class:`bgl.Buffer` object. [double]
:arg projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- :type viewport: :class:`Buffer` object. [int]
+ :type viewport: :class:`bgl.Buffer` object. [int]
:arg viewport: Specifies the current viewport (as from a glGetIntegerv call).
- :type objx, objy, objz: :class:`Buffer` object. [double]
+ :type objx, objy, objz: :class:`bgl.Buffer` object. [double]
:arg objx, objy, objz: Return the computed object coordinates.
diff --git a/doc/python_api/rst/gpu.rst b/doc/python_api/rst/gpu.rst
new file mode 100644
index 00000000000..72a5dc2f5d3
--- /dev/null
+++ b/doc/python_api/rst/gpu.rst
@@ -0,0 +1,531 @@
+
+GPU functions (gpu)
+===================
+
+*****
+Intro
+*****
+
+Module to provide functions concerning the GPU implementation in Blender, in particular
+the GLSL shaders that blender generates automatically to render materials in the 3D view
+and in the game engine.
+
+.. warning::
+
+ The API provided by this module should be consider unstable. The data exposed by the API
+ are are closely related to Blender's internal GLSL code and may change if the GLSL code
+ is modified (e.g. new uniform type).
+
+.. module:: gpu
+
+*********
+Constants
+*********
+
+--------------
+GLSL data type
+--------------
+
+.. _data-type:
+
+Type of GLSL data.
+For shader uniforms, the data type determines which glUniform function
+variant to use to send the uniform value to the GPU.
+For vertex attributes, the data type determines which glVertexAttrib function
+variant to use to send the vertex attribute to the GPU.
+
+See export_shader_
+
+.. data:: GPU_DATA_1I
+
+ one integer
+
+ :value: 1
+
+.. data:: GPU_DATA_1F
+
+ one float
+
+ :value: 2
+
+.. data:: GPU_DATA_2F
+
+ two floats
+
+ :value: 3
+
+.. data:: GPU_DATA_3F
+
+ three floats
+
+ :value: 4
+
+.. data:: GPU_DATA_4F
+
+ four floats
+
+ :value: 5
+
+.. data:: GPU_DATA_9F
+
+ matrix 3x3 in column-major order
+
+ :value: 6
+
+.. data:: GPU_DATA_16F
+
+ matrix 4x4 in column-major order
+
+ :value: 7
+
+.. data:: GPU_DATA_4UB
+
+ four unsigned byte
+
+ :value: 8
+
+-----------------
+GLSL uniform type
+-----------------
+
+.. _uniform-type:
+
+Constants that specify the type of uniform used in a GLSL shader.
+The uniform type determines the data type, origin and method
+of calculation used by Blender to compute the uniform value.
+
+The calculation of some of the uniforms is based on matrices available in the scene:
+
+ .. _mat4_cam_to_world:
+ .. _mat4_world_to_cam:
+
+ *mat4_cam_to_world*
+ Model matrix of the camera. OpenGL 4x4 matrix that converts
+ camera local coordinates to world coordinates. In blender this is obtained from the
+ 'matrix_world' attribute of the camera object.
+
+ Some uniform will need the *mat4_world_to_cam*
+ matrix computed as the inverse of this matrix.
+
+ .. _mat4_object_to_world:
+ .. _mat4_world_to_object:
+
+ *mat4_object_to_world*
+ Model matrix of the object that is being rendered. OpenGL 4x4 matric that converts
+ object local coordinates to world coordinates. In blender this is obtained from the
+ 'matrix_world' attribute of the object.
+
+ Some uniform will need the *mat4_world_to_object* matrix, computed as the inverse of this matrix.
+
+ .. _mat4_lamp_to_world:
+ .. _mat4_world_to_lamp:
+
+ *mat4_lamp_to_world*
+ Model matrix of the lamp lighting the object. OpenGL 4x4 matrix that converts lamp
+ local coordinates to world coordinates. In blender this is obtained from the
+ 'matrix_world' attribute of the lamp object.
+
+ Some uniform will need the *mat4_world_to_lamp* matrix
+ computed as the inverse of this matrix.
+
+.. data:: GPU_DYNAMIC_OBJECT_VIEWMAT
+
+ The uniform is a 4x4 GL matrix that converts world coordinates to
+ camera coordinates (see mat4_world_to_cam_). Can be set once per frame.
+ There is at most one uniform of that type per shader.
+
+ :value: 1
+
+.. data:: GPU_DYNAMIC_OBJECT_MAT
+
+ The uniform is a 4x4 GL matrix that converts object coordinates
+ to world coordinates (see mat4_object_to_world_). Must be set before drawing the object.
+ There is at most one uniform of that type per shader.
+
+ :value: 2
+
+.. data:: GPU_DYNAMIC_OBJECT_VIEWIMAT
+
+ The uniform is a 4x4 GL matrix that converts coordinates
+ in camera space to world coordinates (see mat4_cam_to_world_).
+ Can be set once per frame.
+ There is at most one uniform of that type per shader.
+
+ :value: 3
+
+.. data:: GPU_DYNAMIC_OBJECT_IMAT
+
+ The uniform is a 4x4 GL matrix that converts world coodinates
+ to object coordinates (see mat4_world_to_object_).
+ Must be set before drawing the object.
+ There is at most one uniform of that type per shader.
+
+ :value: 4
+
+.. data:: GPU_DYNAMIC_OBJECT_COLOR
+
+ The uniform is a vector of 4 float representing a RGB color + alpha defined at object level.
+ Each values between 0.0 and 1.0. In blender it corresponds to the 'color' attribute of the object.
+ Must be set before drawing the object.
+ There is at most one uniform of that type per shader.
+
+ :value: 5
+
+.. data:: GPU_DYNAMIC_LAMP_DYNVEC
+
+ The uniform is a vector of 3 float representing the direction of light in camera space.
+ In Blender, this is computed by
+
+ mat4_world_to_cam_ * (-vec3_lamp_Z_axis)
+
+ as the lamp Z axis points to the opposite direction of light.
+ The norm of the vector should be unity. Can be set once per frame.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 6
+
+.. data:: GPU_DYNAMIC_LAMP_DYNCO
+
+ The uniform is a vector of 3 float representing the position of the light in camera space.
+ Computed as
+
+ mat4_world_to_cam_ * vec3_lamp_pos
+
+ Can be set once per frame.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 7
+
+.. data:: GPU_DYNAMIC_LAMP_DYNIMAT
+
+ The uniform is a 4x4 GL matrix that converts vector in camera space to lamp space.
+ Computed as
+
+ mat4_world_to_lamp_ * mat4_cam_to_world_
+
+ Can be set once per frame.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 8
+
+.. data:: GPU_DYNAMIC_LAMP_DYNPERSMAT
+
+ The uniform is a 4x4 GL matrix that converts a vector in camera space to shadow buffer depth space.
+ Computed as
+
+ mat4_perspective_to_depth_ * mat4_lamp_to_perspective_ * mat4_world_to_lamp_ * mat4_cam_to_world_.
+
+ .. _mat4_perspective_to_depth:
+
+ *mat4_perspective_to_depth* is a fixed matrix defined as follow::
+
+ 0.5 0.0 0.0 0.5
+ 0.0 0.5 0.0 0.5
+ 0.0 0.0 0.5 0.5
+ 0.0 0.0 0.0 1.0
+
+ This uniform can be set once per frame. There is one uniform of that type per lamp casting shadow in the scene.
+
+ :value: 9
+
+.. data:: GPU_DYNAMIC_LAMP_DYNENERGY
+
+ The uniform is a single float representing the lamp energy. In blender it corresponds
+ to the 'energy' attribute of the lamp data block.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 10
+
+.. data:: GPU_DYNAMIC_LAMP_DYNCOL
+
+ The uniform is a vector of 3 float representing the lamp color.
+ Color elements are between 0.0 and 1.0. In blender it corresponds
+ to the 'color' attribute of the lamp data block.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 11
+
+.. data:: GPU_DYNAMIC_SAMPLER_2DBUFFER
+
+ The uniform is an integer representing an internal texture used for certain effect
+ (color band, etc).
+
+ :value: 12
+
+.. data:: GPU_DYNAMIC_SAMPLER_2DIMAGE
+
+ The uniform is an integer representing a texture loaded from an image file.
+
+ :value: 13
+
+.. data:: GPU_DYNAMIC_SAMPLER_2DSHADOW
+
+ The uniform is an integer representing a shadow buffer corresponding to a lamp
+ casting shadow.
+
+ :value: 14
+
+-------------------
+GLSL attribute type
+-------------------
+
+.. _attribute-type:
+
+Type of the vertex attribute used in the GLSL shader. Determines the mesh custom data
+layer that contains the vertex attribute.
+
+.. data:: CD_MTFACE
+
+ Vertex attribute is a UV layer. Data type is vector of 2 float.
+
+ There can be more than one attribute of that type, they are differenciated by name.
+ In blender, you can retrieve the attribute data with:
+
+ .. code-block:: python
+
+ mesh.uv_textures[attribute['name']]
+
+ :value: 5
+
+.. data:: CD_MCOL
+
+ Vertex attribute is color layer. Data type is vector 4 unsigned byte (RGBA).
+
+ There can be more than one attribute of that type, they are differenciated by name.
+ In blender you can retrieve the attribute data with:
+
+ .. code-block:: python
+
+ mesh.vertex_colors[attribute['name']]
+
+ :value: 6
+
+.. data:: CD_ORCO
+
+ Vertex attribute is original coordinates. Data type is vector 3 float.
+
+ There can be only 1 attribute of that type per shader.
+ In blender you can retrieve the attribute data with:
+
+ .. code-block:: python
+
+ mesh.vertices
+
+ :value: 14
+
+.. data:: CD_TANGENT
+
+ Vertex attribute is the tangent vector. Data type is vector 4 float.
+
+ There can be only 1 attribute of that type per shader.
+ There is currently no way to retrieve this attribute data via the RNA API but a standalone
+ C function to compute the tangent layer from the other layers can be obtained from
+ blender.org.
+
+ :value: 18
+
+*********
+Functions
+*********
+
+.. _export_shader:
+
+.. function:: export_shader(scene,material)
+
+ Extracts the GLSL shader producing the visual effect of material in scene for the purpose of
+ reusing the shader in an external engine. This function is meant to be used in material exporter
+ so that the GLSL shader can be exported entirely. The return value is a dictionary containing the
+ shader source code and all associated data.
+
+ :arg scene: the scene in which the material in rendered.
+ :type scene: :class:`bpy.types.Scene`
+ :arg material: the material that you want to export the GLSL shader
+ :type material: :class:`bpy.types.Material`
+ :return: the shader source code and all associated data in a dictionary
+ :rtype: dictionary
+
+ The dictionary contains the following elements:
+
+ * ['fragment'] : string
+ fragment shader source code.
+
+ * ['vertex'] : string
+ vertex shader source code.
+
+ * ['uniforms'] : sequence
+ list of uniforms used in fragment shader, can be empty list. Each element of the
+ sequence is a dictionary with the following elements:
+
+ * ['varname'] : string
+ name of the uniform in the fragment shader. Always of the form 'unf<number>'.
+
+ * ['datatype'] : integer
+ data type of the uniform variable. Can be one of the following:
+
+ * :data:`gpu.GPU_DATA_1I` : use glUniform1i
+ * :data:`gpu.GPU_DATA_1F` : use glUniform1fv
+ * :data:`gpu.GPU_DATA_2F` : use glUniform2fv
+ * :data:`gpu.GPU_DATA_3F` : use glUniform3fv
+ * :data:`gpu.GPU_DATA_4F` : use glUniform4fv
+ * :data:`gpu.GPU_DATA_9F` : use glUniformMatrix3fv
+ * :data:`gpu.GPU_DATA_16F` : use glUniformMatrix4fv
+
+ * ['type'] : integer
+ type of uniform, determines the origin and method of calculation. See uniform-type_.
+ Depending on the type, more elements will be be present.
+
+ * ['lamp'] : :class:`bpy.types.Object`
+ Reference to the lamp object from which the uniforms value are extracted. Set for the following uniforms types:
+
+ .. hlist::
+ :columns: 3
+
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNVEC`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNCO`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNIMAT`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNENERGY`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNCOL`
+ * :data:`gpu.GPU_DYNAMIC_SAMPLER_2DSHADOW`
+
+ Notes:
+
+ * The uniforms :data:`gpu.GPU_DYNAMIC_LAMP_DYNVEC`, :data:`gpu.GPU_DYNAMIC_LAMP_DYNCO`, :data:`gpu.GPU_DYNAMIC_LAMP_DYNIMAT` and :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT`
+ refer to the lamp object position and orientation, both of can be derived from the object world matrix:
+
+ .. code-block:: python
+
+ obmat = uniform['lamp'].matrix_world
+
+ where obmat is the mat4_lamp_to_world_ matrix of the lamp as a 2 dimensional array,
+ the lamp world location location is in obmat[3].
+
+ * The uniform types :data:`gpu.GPU_DYNAMIC_LAMP_DYNENERGY` and :data:`gpu.GPU_DYNAMIC_LAMP_DYNCOL` refer to the lamp data bloc that you get from:
+
+ .. code-block:: python
+
+ la = uniform['lamp'].data
+
+ from which you get la.energy and la.color
+
+ * Lamp duplication is not supported: if you have duplicated lamps in your scene
+ (i.e. lamp that are instantiated by dupligroup, etc), this element will only
+ give you a reference to the orignal lamp and you will not know which instance
+ of the lamp it is refering too. You can still handle that case in the exporter
+ by distributing the uniforms amongst the duplicated lamps.
+
+ * ['image'] : :class:`bpy.types.Image`
+ Reference to the image databloc. Set for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE`. You can get the image data from:
+
+ .. code-block:: python
+
+ # full path to image file
+ uniform['image'].filepath
+ # image size as a 2-dimensional array of int
+ uniform['image'].size
+
+ * ['texnumber'] : integer
+ Channel number to which the texture is bound when drawing the object.
+ Set for uniform types :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`, :data:`gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE` and :data:`gpu.GPU_DYNAMIC_SAMPLER_2DSHADOW`.
+
+ This is provided for information only: when reusing the shader outside blencer,
+ you are free to assign the textures to the channel of your choice and to pass
+ that number channel to the GPU in the uniform.
+
+ * ['texpixels'] : byte array
+ texture data for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`. Although
+ the corresponding uniform is a 2D sampler, the texture is always a 1D texture
+ of n x 1 pixel. The texture size n is provided in ['texsize'] element.
+ These texture are only used for computer generated texture (colorband, etc).
+ The texture data is provided so that you can make a real image out of it in the
+ exporter.
+
+ * ['texsize'] : integer
+ horizontal size of texture for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`.
+ The texture data is in ['texpixels'].
+
+ * ['attributes'] : sequence
+ list of attributes used in vertex shader, can be empty. Blender doesn't use
+ standard attributes except for vertex position and normal. All other vertex
+ attributes must be passed using the generic glVertexAttrib functions.
+ The attribute data can be found in the derived mesh custom data using RNA.
+ Each element of the sequence is a dictionary containing the following elements:
+
+ * ['varname'] : string
+ name of the uniform in the vertex shader. Always of the form 'att<number>'.
+
+ * ['datatype'] : integer
+ data type of vertex attribute, can be one of the following:
+
+ * :data:`gpu.GPU_DATA_2F` : use glVertexAttrib2fv
+ * :data:`gpu.GPU_DATA_3F` : use glVertexAttrib3fv
+ * :data:`gpu.GPU_DATA_4F` : use glVertexAttrib4fv
+ * :data:`gpu.GPU_DATA_4UB` : use glVertexAttrib4ubv
+
+ * ['number'] : integer
+ generic attribute number. This is provided for information only. Blender
+ doesn't use glBindAttribLocation to place generic attributes at specific location,
+ it lets the shader compiler place the attributes automatically and query the
+ placement with glGetAttribLocation. The result of this placement is returned in
+ this element.
+
+ When using this shader in a render engine, you should either use
+ glBindAttribLocation to force the attribute at this location or use
+ glGetAttribLocation to get the placement chosen by the compiler of your GPU.
+
+ * ['type'] : integer
+ type of the mesh custom data from which the vertex attribute is loaded.
+ See attribute-type_.
+
+ * ['name'] : string or integer
+ custom data layer name, used for attribute type :data:`gpu.CD_MTFACE` and :data:`gpu.CD_MCOL`.
+
+ Example:
+
+ .. code-block:: python
+
+ import gpu
+ # get GLSL shader of material Mat.001 in scene Scene.001
+ scene = bpy.data.scenes['Scene.001']
+ material = bpy.data.materials['Mat.001']
+ shader = gpu.export_shader(scene,material)
+ # scan the uniform list and find the images used in the shader
+ for uniform in shader['uniforms']:
+ if uniform['type'] == gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE:
+ print("uniform {0} is using image {1}".format(uniform['varname'], uniform['image'].filepath))
+ # scan the attribute list and find the UV layer used in the shader
+ for attribute in shader['attributes']:
+ if attribute['type'] == gpu.CD_MTFACE:
+ print("attribute {0} is using UV layer {1}".format(attribute['varname'], attribute['name']))
+
+*****
+Notes
+*****
+
+.. _mat4_lamp_to_perspective:
+
+1. Calculation of the *mat4_lamp_to_perspective* matrix for a spot lamp.
+
+ The following pseudo code shows how the *mat4_lamp_to_perspective* matrix is computed
+ in blender for uniforms of :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT` type::
+
+ #Get the lamp datablock with:
+ lamp=bpy.data.objects[uniform['lamp']].data
+
+ #Compute the projection matrix:
+ # You will need these lamp attributes:
+ # lamp.clipsta : near clip plane in world unit
+ # lamp.clipend : far clip plane in world unit
+ # lamp.spotsize : angle in degree of the spot light
+
+ #The size of the projection plane is computed with the usual formula:
+ wsize = lamp.clista * tan(lamp.spotsize/2)
+
+ #And the projection matrix:
+ mat4_lamp_to_perspective = glFrustum(-wsize,wsize,-wsize,wsize,lamp.clista,lamp.clipend)
+
+2. Creation of the shadow map for a spot lamp.
+
+ The shadow map is the depth buffer of a render performed by placing the camera at the
+ spot light position. The size of the shadow map is given by the attribute lamp.bufsize :
+ shadow map size in pixel, same size in both dimensions.
diff --git a/doc/python_api/rst/info_best_practice.rst b/doc/python_api/rst/info_best_practice.rst
new file mode 100644
index 00000000000..2fbc636613c
--- /dev/null
+++ b/doc/python_api/rst/info_best_practice.rst
@@ -0,0 +1,65 @@
+*************
+Best Practice
+*************
+
+
+TODO: Intro text
+
+
+Style Conventions
+=================
+
+For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects.
+
+Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender.
+
+This style guide is known as pep8 and can be found `here <http://www.python.org/dev/peps/pep-0008>`_
+
+A brief listing of pep8 criteria.
+
+* camel caps for class names: MyClass
+
+* all lower case underscore separated module names: my_module
+
+* indentation of 4 spaces (no tabs)
+
+* spaces around operators. ``1 + 1``, not ``1+1``
+
+* only use explicit imports, (no importing '*')
+
+* don't use single line: ``if val: body``, separate onto 2 lines instead.
+
+
+As well as pep8 we have other conventions used for blender python scripts.
+
+* Use single quotes for enums, and double quotes for strings.
+
+ Both are of course strings but in our internal API enums are unique items from a limited set. eg.
+
+ .. code-block:: python
+
+ bpy.context.scene.render.file_format = 'PNG'
+ bpy.context.scene.render.filepath = "//render_out"
+
+* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script.
+
+Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script.
+
+``# <pep8 compliant>``
+
+To enable line length checks use this instead.
+
+``# <pep8-80 compliant>``
+
+
+User Interface Layout
+=====================
+
+TODO: Thomas
+
+
+Script Efficiency
+=================
+
+TODO: Campbell
+
diff --git a/doc/python_api/rst/info_quickstart.rst b/doc/python_api/rst/info_quickstart.rst
index e77e9a76d7f..e7f2900b212 100644
--- a/doc/python_api/rst/info_quickstart.rst
+++ b/doc/python_api/rst/info_quickstart.rst
@@ -156,7 +156,7 @@ Note that these properties can only be assigned basic Python types.
* array of ints/floats
-* dictionary (only string keys types on this list)
+* dictionary (only string keys are supported, values must be basic types too)
These properties are valid outside of Python. They can be animated by curves or used in driver paths.
@@ -420,49 +420,3 @@ Using Low-Level Functions:
fcu_z.keyframe_points[0].co = 10.0, 0.0
fcu_z.keyframe_points[1].co = 20.0, 1.0
-
-Style Conventions
-=================
-
-For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects.
-
-Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender.
-
-This style guide is known as pep8 and can be found `here <http://www.python.org/dev/peps/pep-0008>`_
-
-A brief listing of pep8 criteria.
-
-* camel caps for class names: MyClass
-
-* all lower case underscore separated module names: my_module
-
-* indentation of 4 spaces (no tabs)
-
-* spaces around operators. ``1 + 1``, not ``1+1``
-
-* only use explicit imports, (no importing '*')
-
-* don't use single line: ``if val: body``, separate onto 2 lines instead.
-
-
-As well as pep8 we have other conventions used for blender python scripts.
-
-* Use single quotes for enums, and double quotes for strings.
-
- Both are of course strings but in our internal API enums are unique items from a limited set. eg.
-
- .. code-block:: python
-
- bpy.context.scene.render.file_format = 'PNG'
- bpy.context.scene.render.filepath = "//render_out"
-
-* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script.
-
-Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script.
-
-``# <pep8 compliant>``
-
-To enable line length checks use this instead.
-
-``# <pep8-80 compliant>``
-
diff --git a/doc/python_api/rst/info_tips_and_tricks.rst b/doc/python_api/rst/info_tips_and_tricks.rst
index bd5faf000c8..bd3ed196193 100644
--- a/doc/python_api/rst/info_tips_and_tricks.rst
+++ b/doc/python_api/rst/info_tips_and_tricks.rst
@@ -1,57 +1,228 @@
-###############
+***************
Tips and Tricks
-###############
+***************
-Some of these are just python features that scripters may not have thaught to use with blender.
+Here are various suggestions that you might find useful when writing scripts.
+
+Some of these are just python features that scripters may not have thought to use with blender, others are blender specific.
-****************
Use The Terminal
-****************
+================
+
+When writing python scripts, its useful to have a terminal open, this is not the built-in python console but a terminal application which is used to start blender.
+
+There are 3 main uses for the terminal, these are:
+
+* You can see the output of `print()` as you're script runs, which is useful to view debug info.
+
+* The error trace-back is printed in full to the terminal which wont always generate an error popup in blenders user interface (depending on how the script is executed).
+
+* If the script runs for too long or you accidentally enter an infinite loop, Ctrl+C in the terminal (Ctrl+Break on Windows) will quit the script early.
+
+.. note::
+ For Linux and OSX users this means starting the terminal first, then running blender from within it. On Windows the terminal can be enabled from the help menu.
+
+
+Use an External Editor
+======================
+
+Blenders text editor is fine for small changes and writing tests but its not full featured, for larger projects you'll probably want to use a standalone editor or python IDE.
+
+Editing a text file externally and having the same text open in blender does work but isn't that optimal so here are 2 ways you can easily use an external file from blender.
+
+Using the following examples you'll still need textblock in blender to execute, but reference an external file rather then including it directly.
+
+Executing External Scripts
+--------------------------
+
+This is the equivalent to running the script directly, referencing a scripts path from a 2 line textblock.
+
+.. code-block:: python
+
+ filename = "/full/path/to/myscript.py"
+ exec(compile(open(filename).read(), filename, 'exec'))
+
+
+You might want to reference a script relative to the blend file.
+
+.. code-block:: python
+
+ import bpy
+ import os
+
+ filename = os.path.join(os.path.basename(bpy.data.filepath), "myscript.py")
+ exec(compile(open(filename).read(), filename, 'exec'))
+
-For Linux and OSX users this means starting the terminal first, then running blender from within it. on Windows the terminal can be enabled from the help menu.
+Executing Modules
+-----------------
-********************
-Run External Scripts
-********************
+This example shows loading a script in as a module and executing a module function.
+
+.. code-block:: python
+
+ import myscript
+ import imp
+
+ imp.reload(myscript)
+ myscript.main()
+
+
+Notice that the script is reloaded every time, this forces use of the modified version otherwise the cached one in `sys.modules` would be used until blender was restarted.
+
+The important difference between this and executing the script directly is it has to call a function in the module, in this case `main()` but it can be any function, an advantage with this is you can pass arguments to the function from this small script which is often useful for testing different settings quickly.
+
+The other issue with this is the script has to be in pythons module search path.
+While this is not best practice - for testing you can extend the search path, this example adds the current blend files directory to the search path, then loads the script as a module.
+
+.. code-block:: python
+
+ import sys
+ import os
+ import bpy
+
+ blend_dir = os.path.basename(bpy.data.filepath)
+ if blend_dir not in sys.path:
+ sys.path.append(blend_dir)
+
+ import myscript
+ import imp
+ imp.reload(myscript)
+ myscript.main()
-******************
Don't Use Blender!
-******************
+==================
+
+While developing your own scripts blenders interface can get in the way, manually reloading, running the scripts, opening file import etc. adds overhead.
+
+For scripts that are not interactive it can end up being more efficient not to use blenders interface at all and instead execute the script on the command line.
+
+.. code-block:: python
+
+ blender --background --python myscript.py
+
+
+You might want to run this with a blend file so the script has some data to operate on.
+
+.. code-block:: python
+
+ blender myscene.blend --background --python myscript.py
+
+
+.. note::
+
+ Depending on you're setup you might have to enter the full path to the blender executable.
+
+
+Once the script is running properly in background mode, you'll want to check the output of the script, this depends completely on the task at hand however here are some suggestions.
+
+* render the output to an image, use an image viewer and keep writing over the same image each time.
+
+* save a new blend file, or export the file using one of blenders exporters.
+
+* if the results can be displayed as text - print them or write them to a file.
+
+
+This can take a little time to setup, but it can be well worth the effort to reduce the time it takes to test changes - you can even have blender running the script ever few seconds with a viewer updating the results, so no need to leave you're text editor to see changes.
-******************
Use External Tools
-******************
+==================
+
+When there are no readily available python modules to perform specific tasks its worth keeping in mind you may be able to have python execute an external command on you're data and read the result back in.
+
+Using external programs adds an extra dependency and may limit who can use the script but to quickly setup you're own custom pipeline or writing one-off scripts this can be handy.
+
+Examples include:
+
+* Run The Gimp in batch mode to execute custom scripts for advanced image processing.
+* Write out 3D models to use external mesh manipulation tools and read back in the results.
-**************
-Bundled Python
-**************
+* Convert files into recognizable formats before reading.
-Blender from blender.org includes a compleate python installation on all platforms, this has the disadvantage that any extensions you have installed in you're systems python wont be found by blender.
+
+Bundled Python & Extensions
+===========================
+
+The Blender releases distributed from blender.org include a complete python installation on all platforms, this has the disadvantage that any extensions you have installed in you're systems python wont be found by blender.
There are 2 ways around this:
-* remove blender python subdirectory, blender will then look for the systems python and use that instead **python version must match the one that blender comes with**.
+* remove blender python sub-directory, blender will then fallback on the systems python and use that instead **python version must match the one that blender comes with**.
+
+* copy the extensions into blender's python sub-directory so blender can access them, you could also copy the entire python installation into blenders sub-directory, replacing the one blender comes with. This works as long as the python versions match and the paths are created in the same relative locations. Doing this has the advantage that you can redistribute this bundle to others with blender and/or the game player, including any extensions you rely on.
+
+
+Drop Into a Python Interpreter in You're Script
+===============================================
+
+In the middle of a script you may want to inspect some variables, run some function and generally dig about to see whats going on.
+
+.. code-block:: python
+
+ import code
+ code.interact(local=locals())
+
+
+If you want to access both global and local variables do this...
+
+.. code-block:: python
+
+ import code
+ namespace = globals().copy()
+ namespace.update(locals())
+ code.interact(local=namespace)
+
+
+The next example is an equivalent single line version of the script above which is easier to paste into you're code:
+
+.. code-block:: python
+
+ __import__('code').interact(local={k: v for ns in (globals(), locals()) for k, v in ns.items()})
+
+
+`code.interact` can be added at any line in the script and will pause the script an launch an interactive interpreter in the terminal, when you're done you can quit the interpreter and the script will continue execution.
+
+
+Admittedly this highlights the lack of any python debugging support built into blender, but its still handy to know.
+
+.. note::
+
+ This works in the game engine as well, it can be handy to inspect the state of a running game.
-* copy the extensions into blender's python subdirectry so blender can access them, you could also copy the entire python installation into blenders subdirectory, replacing the one blender comes with. This works as long as the python versions match and the paths are created in the same location relative locations. Doing this has the advantage that you can redistribute this bundle to others with blender and/or the game player, including any extensions you rely on.
-********
Advanced
-********
+========
-===================
Blender as a module
-===================
+-------------------
+
+From a python perspective its nicer to have everything as an extension which lets the python script combine many components.
+
+Advantages include:
+
+* you can use external editors/IDE's with blenders python API and execute scripts within the IDE (step over code, inspect variables as the script runs).
+
+* editors/IDE's can auto complete blender modules & variables.
+
+* existing scripts can import blender API's without having to run inside blender.
+
+
+This is marked advanced because to run blender as a python module requires a special build option.
+
+For instructions on building see `Building blender as a python module <http://wiki.blender.org/index.php/User:Ideasman42/BlenderAsPyModule>`_
-============================
Python Safety (Build Option)
-============================
+----------------------------
+
+Since its possible to accessed data which has been removed (see Gotcha's), this can be a hard to track down the cause of crashes.
+
+To raise python exceptions on accessing freed data (rather then crashing), enable the CMake build option WITH_PYTHON_SAFETY.
+
+This enables data tracking which makes data access about 2x slower which is why the option is not enabled in release builds.
-=================
-CTypes in Blender
-=================
diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py
index 787d6d69118..df17c54b55f 100644
--- a/doc/python_api/sphinx_doc_gen.py
+++ b/doc/python_api/sphinx_doc_gen.py
@@ -104,6 +104,8 @@ sphinx-build doc/python_api/sphinx-in doc/python_api/sphinx-out
INFO_DOCS = (
("info_quickstart.rst", "Blender/Python Quickstart: new to blender/scripting and want to get you're feet wet?"),
("info_overview.rst", "Blender/Python API Overview: a more complete explanation of python integration"),
+ ("info_best_practice.rst", "Best Practice: Conventions to follow for writing good scripts"),
+ ("info_tips_and_tricks.rst", "Tips and Tricks: Hints to help you while writeing scripts for blender"),
("info_gotcha.rst", "Gotcha's: some of the problems you may come up against when writing scripts"),
)
@@ -586,6 +588,7 @@ def pycontext2sphinx(BASEPATH):
"sequences": ("Sequence", True),
"smoke": ("SmokeModifier", False),
"soft_body": ("SoftBodyModifier", False),
+ "speaker": ("Speaker", False),
"texture": ("Texture", False),
"texture_slot": ("MaterialTextureSlot", False),
"vertex_paint_object": ("Object", False),
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index 3990d132757..0386b3d71d8 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -43,6 +43,10 @@ if(WITH_BUILTIN_GLEW)
add_subdirectory(glew)
endif()
+if(WITH_GAMEENGINE)
+ add_subdirectory(recastnavigation)
+endif()
+
if(WITH_IMAGE_OPENJPEG AND (NOT UNIX OR APPLE))
add_subdirectory(libopenjpeg)
endif()
diff --git a/extern/SConscript b/extern/SConscript
index 061bd1ba6a3..88aeb400d13 100644
--- a/extern/SConscript
+++ b/extern/SConscript
@@ -3,6 +3,7 @@
Import('env')
SConscript(['glew/SConscript'])
+SConscript(['recastnavigation/SConscript'])
if env['WITH_BF_ELTOPO']:
SConscript(['eltopo/SConscript'])
diff --git a/extern/recastnavigation/CMakeLists.txt b/extern/recastnavigation/CMakeLists.txt
new file mode 100644
index 00000000000..1af01b1b427
--- /dev/null
+++ b/extern/recastnavigation/CMakeLists.txt
@@ -0,0 +1,66 @@
+# $Id$
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Daniel Genrich
+#
+# ***** END GPL LICENSE BLOCK *****
+
+set(INC
+ Recast/Include
+ Detour/Include
+)
+
+set(INC_SYS
+
+)
+
+set(SRC
+ Detour/Source/DetourCommon.cpp
+ Detour/Source/DetourNode.cpp
+ Detour/Source/DetourStatNavMesh.cpp
+ Detour/Source/DetourStatNavMeshBuilder.cpp
+ Detour/Source/DetourTileNavMesh.cpp
+ Detour/Source/DetourTileNavMeshBuilder.cpp
+
+ Detour/Include/DetourCommon.h
+ Detour/Include/DetourNode.h
+ Detour/Include/DetourStatNavMesh.h
+ Detour/Include/DetourStatNavMeshBuilder.h
+ Detour/Include/DetourTileNavMesh.h
+ Detour/Include/DetourTileNavMeshBuilder.h
+
+ Recast/Source/Recast.cpp
+ Recast/Source/RecastContour.cpp
+ Recast/Source/RecastFilter.cpp
+ Recast/Source/RecastLog.cpp
+ Recast/Source/RecastMesh.cpp
+ Recast/Source/RecastMeshDetail.cpp
+ Recast/Source/RecastRasterization.cpp
+ Recast/Source/RecastRegion.cpp
+ Recast/Source/RecastTimer.cpp
+
+ Recast/Include/Recast.h
+ Recast/Include/RecastLog.h
+ Recast/Include/RecastTimer.h
+)
+
+blender_add_lib(extern_recastnavigation "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/extern/recastnavigation/Detour/Include/DetourCommon.h b/extern/recastnavigation/Detour/Include/DetourCommon.h
new file mode 100644
index 00000000000..d824efc06e4
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourCommon.h
@@ -0,0 +1,167 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURCOMMON_H
+#define DETOURCOMMON_H
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+template<class T> inline void swap(T& a, T& b) { T t = a; a = b; b = t; }
+template<class T> inline T min(T a, T b) { return a < b ? a : b; }
+template<class T> inline T max(T a, T b) { return a > b ? a : b; }
+template<class T> inline T abs(T a) { return a < 0 ? -a : a; }
+template<class T> inline T sqr(T a) { return a*a; }
+template<class T> inline T clamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); }
+
+inline void vcross(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[1]*v2[2] - v1[2]*v2[1];
+ dest[1] = v1[2]*v2[0] - v1[0]*v2[2];
+ dest[2] = v1[0]*v2[1] - v1[1]*v2[0];
+}
+
+inline float vdot(const float* v1, const float* v2)
+{
+ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+
+inline void vmad(float* dest, const float* v1, const float* v2, const float s)
+{
+ dest[0] = v1[0]+v2[0]*s;
+ dest[1] = v1[1]+v2[1]*s;
+ dest[2] = v1[2]+v2[2]*s;
+}
+
+inline void vadd(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]+v2[0];
+ dest[1] = v1[1]+v2[1];
+ dest[2] = v1[2]+v2[2];
+}
+
+inline void vsub(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]-v2[0];
+ dest[1] = v1[1]-v2[1];
+ dest[2] = v1[2]-v2[2];
+}
+
+inline void vmin(float* mn, const float* v)
+{
+ mn[0] = min(mn[0], v[0]);
+ mn[1] = min(mn[1], v[1]);
+ mn[2] = min(mn[2], v[2]);
+}
+
+inline void vmax(float* mx, const float* v)
+{
+ mx[0] = max(mx[0], v[0]);
+ mx[1] = max(mx[1], v[1]);
+ mx[2] = max(mx[2], v[2]);
+}
+
+inline void vcopy(float* dest, const float* a)
+{
+ dest[0] = a[0];
+ dest[1] = a[1];
+ dest[2] = a[2];
+}
+
+inline float vdist(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return sqrtf(dx*dx + dy*dy + dz*dz);
+}
+
+inline float vdistSqr(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return dx*dx + dy*dy + dz*dz;
+}
+
+inline void vnormalize(float* v)
+{
+ float d = 1.0f / sqrtf(sqr(v[0]) + sqr(v[1]) + sqr(v[2]));
+ v[0] *= d;
+ v[1] *= d;
+ v[2] *= d;
+}
+
+inline bool vequal(const float* p0, const float* p1)
+{
+ static const float thr = sqr(1.0f/16384.0f);
+ const float d = vdistSqr(p0, p1);
+ return d < thr;
+}
+
+inline int nextPow2(int v)
+{
+ v--;
+ v |= v >> 1;
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+ v++;
+ return v;
+}
+
+inline float vdot2D(const float* u, const float* v)
+{
+ return u[0]*v[0] + u[2]*v[2];
+}
+
+inline float vperp2D(const float* u, const float* v)
+{
+ return u[2]*v[0] - u[0]*v[2];
+}
+
+inline float triArea2D(const float* a, const float* b, const float* c)
+{
+ return ((b[0]*a[2] - a[0]*b[2]) + (c[0]*b[2] - b[0]*c[2]) + (a[0]*c[2] - c[0]*a[2])) * 0.5f;
+}
+
+inline bool checkOverlapBox(const unsigned short amin[3], const unsigned short amax[3],
+ const unsigned short bmin[3], const unsigned short bmax[3])
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap;
+ return overlap;
+}
+
+void closestPtPointTriangle(float* closest, const float* p,
+ const float* a, const float* b, const float* c);
+
+bool closestHeightPointTriangle(const float* p, const float* a, const float* b, const float* c, float& h);
+
+bool intersectSegmentPoly2D(const float* p0, const float* p1,
+ const float* verts, int nverts,
+ float& tmin, float& tmax,
+ int& segMin, int& segMax);
+
+float distancePtSegSqr2D(const float* pt, const float* p, const float* q, float& t);
+
+void calcPolyCenter(float* tc, const unsigned short* idx, int nidx, const float* verts);
+
+#endif // DETOURCOMMON_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Include/DetourNode.h b/extern/recastnavigation/Detour/Include/DetourNode.h
new file mode 100644
index 00000000000..316d5bf4cf6
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourNode.h
@@ -0,0 +1,149 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURNODE_H
+#define DETOURNODE_H
+
+enum dtNodeFlags
+{
+ DT_NODE_OPEN = 0x01,
+ DT_NODE_CLOSED = 0x02,
+};
+
+struct dtNode
+{
+ float cost;
+ float total;
+ unsigned int id;
+ unsigned int pidx : 30;
+ unsigned int flags : 2;
+};
+
+class dtNodePool
+{
+public:
+ dtNodePool(int maxNodes, int hashSize);
+ ~dtNodePool();
+ inline void operator=(const dtNodePool&) {}
+ void clear();
+ dtNode* getNode(unsigned int id);
+ const dtNode* findNode(unsigned int id) const;
+
+ inline unsigned int getNodeIdx(const dtNode* node) const
+ {
+ if (!node) return 0;
+ return (unsigned int)(node - m_nodes)+1;
+ }
+
+ inline dtNode* getNodeAtIdx(unsigned int idx)
+ {
+ if (!idx) return 0;
+ return &m_nodes[idx-1];
+ }
+
+ inline int getMemUsed() const
+ {
+ return sizeof(*this) +
+ sizeof(dtNode)*m_maxNodes +
+ sizeof(unsigned short)*m_maxNodes +
+ sizeof(unsigned short)*m_hashSize;
+ }
+
+private:
+ inline unsigned int hashint(unsigned int a) const
+ {
+ a += ~(a<<15);
+ a ^= (a>>10);
+ a += (a<<3);
+ a ^= (a>>6);
+ a += ~(a<<11);
+ a ^= (a>>16);
+ return a;
+ }
+
+ dtNode* m_nodes;
+ unsigned short* m_first;
+ unsigned short* m_next;
+ const int m_maxNodes;
+ const int m_hashSize;
+ int m_nodeCount;
+};
+
+class dtNodeQueue
+{
+public:
+ dtNodeQueue(int n);
+ ~dtNodeQueue();
+ inline void operator=(dtNodeQueue&) {}
+
+ inline void clear()
+ {
+ m_size = 0;
+ }
+
+ inline dtNode* top()
+ {
+ return m_heap[0];
+ }
+
+ inline dtNode* pop()
+ {
+ dtNode* result = m_heap[0];
+ m_size--;
+ trickleDown(0, m_heap[m_size]);
+ return result;
+ }
+
+ inline void push(dtNode* node)
+ {
+ m_size++;
+ bubbleUp(m_size-1, node);
+ }
+
+ inline void modify(dtNode* node)
+ {
+ for (int i = 0; i < m_size; ++i)
+ {
+ if (m_heap[i] == node)
+ {
+ bubbleUp(i, node);
+ return;
+ }
+ }
+ }
+
+ inline bool empty() const { return m_size == 0; }
+
+ inline int getMemUsed() const
+ {
+ return sizeof(*this) +
+ sizeof(dtNode*)*(m_capacity+1);
+ }
+
+
+private:
+ void bubbleUp(int i, dtNode* node);
+ void trickleDown(int i, dtNode* node);
+
+ dtNode** m_heap;
+ const int m_capacity;
+ int m_size;
+};
+
+
+#endif // DETOURNODE_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h b/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h
new file mode 100644
index 00000000000..71ee4cb0b51
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h
@@ -0,0 +1,234 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURSTATNAVMESH_H
+#define DETOURSTATNAVMESH_H
+
+// Reference to navigation polygon.
+typedef unsigned short dtStatPolyRef;
+
+// Maximum number of vertices per navigation polygon.
+static const int DT_STAT_VERTS_PER_POLYGON = 6;
+
+// Structure holding the navigation polygon data.
+struct dtStatPoly
+{
+ unsigned short v[DT_STAT_VERTS_PER_POLYGON]; // Indices to vertices of the poly.
+ dtStatPolyRef n[DT_STAT_VERTS_PER_POLYGON]; // Refs to neighbours of the poly.
+ unsigned char nv; // Number of vertices.
+ unsigned char flags; // Flags (not used).
+};
+
+struct dtStatPolyDetail
+{
+ unsigned short vbase; // Offset to detail vertex array.
+ unsigned short nverts; // Number of vertices in the detail mesh.
+ unsigned short tbase; // Offset to detail triangle array.
+ unsigned short ntris; // Number of triangles.
+};
+
+const int DT_STAT_NAVMESH_MAGIC = 'NAVM';
+const int DT_STAT_NAVMESH_VERSION = 3;
+
+struct dtStatBVNode
+{
+ unsigned short bmin[3], bmax[3];
+ int i;
+};
+
+struct dtStatNavMeshHeader
+{
+ int magic;
+ int version;
+ int npolys;
+ int nverts;
+ int nnodes;
+ int ndmeshes;
+ int ndverts;
+ int ndtris;
+ float cs;
+ float bmin[3], bmax[3];
+ dtStatPoly* polys;
+ float* verts;
+ dtStatBVNode* bvtree;
+ dtStatPolyDetail* dmeshes;
+ float* dverts;
+ unsigned char* dtris;
+};
+
+class dtStatNavMesh
+{
+public:
+
+ dtStatNavMesh();
+ ~dtStatNavMesh();
+
+ // Initializes the navmesh with data.
+ // Params:
+ // data - (in) Pointer to navmesh data.
+ // dataSize - (in) size of the navmesh data.
+ // ownsData - (in) Flag indicating if the navmesh should own and delete the data.
+ bool init(unsigned char* data, int dataSize, bool ownsData);
+
+ // Finds the nearest navigation polygon around the center location.
+ // Params:
+ // center - (in) The center of the search box.
+ // extents - (in) The extents of the search box.
+ // Returns: Reference identifier for the polygon, or 0 if no polygons found.
+ dtStatPolyRef findNearestPoly(const float* center, const float* extents);
+
+ // Returns polygons which touch the query box.
+ // Params:
+ // center - (in) the center of the search box.
+ // extents - (in) the extents of the search box.
+ // polys - (out) array holding the search result.
+ // maxPolys - (in) The max number of polygons the polys array can hold.
+ // Returns: Number of polygons in search result array.
+ int queryPolygons(const float* center, const float* extents,
+ dtStatPolyRef* polys, const int maxPolys);
+
+ // Finds path from start polygon to end polygon.
+ // If target polygon canno be reached through the navigation graph,
+ // the last node on the array is nearest node to the end polygon.
+ // Params:
+ // startRef - (in) ref to path start polygon.
+ // endRef - (in) ref to path end polygon.
+ // path - (out) array holding the search result.
+ // maxPathSize - (in) The max number of polygons the path array can hold.
+ // Returns: Number of polygons in search result array.
+ int findPath(dtStatPolyRef startRef, dtStatPolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtStatPolyRef* path, const int maxPathSize);
+
+ // Finds a straight path from start to end locations within the corridor
+ // described by the path polygons.
+ // Start and end locations will be clamped on the corridor.
+ // Params:
+ // startPos - (in) Path start location.
+ // endPos - (in) Path end location.
+ // path - (in) Array of connected polygons describing the corridor.
+ // pathSize - (in) Number of polygons in path array.
+ // straightPath - (out) Points describing the straight path.
+ // maxStraightPathSize - (in) The max number of points the straight path array can hold.
+ // Returns: Number of points in the path.
+ int findStraightPath(const float* startPos, const float* endPos,
+ const dtStatPolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize);
+
+ // Finds intersection againts walls starting from start pos.
+ // Params:
+ // startRef - (in) ref to the polygon where the start lies.
+ // startPos - (in) start position of the query.
+ // endPos - (in) end position of the query.
+ // t - (out) hit parameter along the segment, 0 if no hit.
+ // endRef - (out) ref to the last polygon which was processed.
+ // Returns: Number of polygons in path or 0 if failed.
+ int raycast(dtStatPolyRef startRef, const float* startPos, const float* endPos,
+ float& t, dtStatPolyRef* path, const int pathSize);
+
+ // Returns distance to nearest wall from the specified location.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle.
+ // maxRadius - (in) max search radius.
+ // hitPos - (out) location of the nearest hit.
+ // hitNormal - (out) normal of the nearest hit.
+ // Returns: Distance to nearest wall from the test location.
+ float findDistanceToWall(dtStatPolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal);
+
+ // Finds polygons found along the navigation graph which touch the specified circle.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle
+ // radius - (in) radius of the query circle
+ // resultRef - (out, opt) refs to the polygons touched by the circle.
+ // resultParent - (out, opt) parent of each result polygon.
+ // resultCost - (out, opt) search cost at each result polygon.
+ // maxResult - (int) maximum capacity of search results.
+ // Returns: Number of results.
+ int findPolysAround(dtStatPolyRef centerRef, const float* centerPos, float radius,
+ dtStatPolyRef* resultRef, dtStatPolyRef* resultParent, float* resultCost,
+ const int maxResult);
+
+ // Returns closest point on navigation polygon.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point to check.
+ // closest - (out) closest point.
+ // Returns: true if closest point found.
+ bool closestPointToPoly(dtStatPolyRef ref, const float* pos, float* closest) const;
+
+ // Returns height of the polygon at specified location.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point where to locate the height.
+ // height - (out) height at the location.
+ // Returns: true if oer polygon.
+ bool getPolyHeight(dtStatPolyRef ref, const float* pos, float* height) const;
+
+ // Returns pointer to a polygon based on ref.
+ const dtStatPoly* getPolyByRef(dtStatPolyRef ref) const;
+ // Returns polygon index based on ref, or -1 if failed.
+ int getPolyIndexByRef(dtStatPolyRef ref) const;
+ // Returns number of navigation polygons.
+ inline int getPolyCount() const { return m_header ? m_header->npolys : 0; }
+ // Rerturns pointer to specified navigation polygon.
+ inline const dtStatPoly* getPoly(int i) const { return &m_header->polys[i]; }
+ // Returns number of vertices.
+ inline int getVertexCount() const { return m_header ? m_header->nverts : 0; }
+ // Returns pointer to specified vertex.
+ inline const float* getVertex(int i) const { return &m_header->verts[i*3]; }
+ // Returns number of navigation polygons details.
+ inline int getPolyDetailCount() const { return m_header ? m_header->ndmeshes : 0; }
+ // Rerturns pointer to specified navigation polygon detail.
+ const dtStatPolyDetail* getPolyDetail(int i) const { return &m_header->dmeshes[i]; }
+ // Returns pointer to specified vertex.
+ inline const float* getDetailVertex(int i) const { return &m_header->dverts[i*3]; }
+ // Returns pointer to specified vertex.
+ inline const unsigned char* getDetailTri(int i) const { return &m_header->dtris[i*4]; }
+
+ bool isInClosedList(dtStatPolyRef ref) const;
+
+ int getMemUsed() const;
+
+ inline unsigned char* getData() const { return m_data; }
+ inline int getDataSize() const { return m_dataSize; }
+ inline const dtStatNavMeshHeader* getHeader() const { return m_header; }
+ inline const dtStatBVNode* getBvTreeNodes() const { return m_header ? m_header->bvtree : 0; }
+ inline int getBvTreeNodeCount() const { return m_header ? m_header->nnodes : 0; }
+
+private:
+
+ // Copies the locations of vertices of a polygon to an array.
+ int getPolyVerts(dtStatPolyRef ref, float* verts) const;
+ // Returns portal points between two polygons.
+ bool getPortalPoints(dtStatPolyRef from, dtStatPolyRef to, float* left, float* right) const;
+ // Returns edge mid point between two polygons.
+ bool getEdgeMidPoint(dtStatPolyRef from, dtStatPolyRef to, float* mid) const;
+
+ unsigned char* m_data;
+ int m_dataSize;
+
+ dtStatNavMeshHeader* m_header;
+
+ class dtNodePool* m_nodePool;
+ class dtNodeQueue* m_openList;
+};
+
+#endif // DETOURSTATNAVMESH_H
diff --git a/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h
new file mode 100644
index 00000000000..03c79c429e7
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h
@@ -0,0 +1,33 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURSTATNAVMESHBUILDER_H
+#define DETOURSTATNAVMESHBUILDER_H
+
+bool dtCreateNavMeshData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const float* bmin, const float* bmax, float cs, float ch,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ unsigned char** outData, int* outDataSize);
+
+int createBVTree(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ float cs, float ch, int nnodes, dtStatBVNode* nodes);
+
+#endif // DETOURSTATNAVMESHBUILDER_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h b/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h
new file mode 100644
index 00000000000..d615b1748f0
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h
@@ -0,0 +1,315 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURTILENAVMESH_H
+#define DETOURTILENAVMESH_H
+
+// Reference to navigation polygon.
+typedef unsigned int dtTilePolyRef;
+
+// The bits used in the poly ref.
+static const int DT_TILE_REF_SALT_BITS = 12;
+static const int DT_TILE_REF_TILE_BITS = 12;
+static const int DT_TILE_REF_POLY_BITS = 8;
+static const int DT_TILE_REF_SALT_MASK = (1<<DT_TILE_REF_SALT_BITS)-1;
+static const int DT_TILE_REF_TILE_MASK = (1<<DT_TILE_REF_TILE_BITS)-1;
+static const int DT_TILE_REF_POLY_MASK = (1<<DT_TILE_REF_POLY_BITS)-1;
+
+// Maximum number of vertices per navigation polygon.
+static const int DT_TILE_VERTS_PER_POLYGON = 6;
+
+static const int DT_MAX_TILES = 1 << DT_TILE_REF_TILE_BITS;
+static const int DT_MAX_POLYGONS = 1 << DT_TILE_REF_POLY_BITS;
+
+static const int DT_TILE_NAVMESH_MAGIC = 'NAVT';
+static const int DT_TILE_NAVMESH_VERSION = 2;
+
+// Structure holding the navigation polygon data.
+struct dtTilePoly
+{
+ unsigned short v[DT_TILE_VERTS_PER_POLYGON]; // Indices to vertices of the poly.
+ unsigned short n[DT_TILE_VERTS_PER_POLYGON]; // Refs to neighbours of the poly.
+ unsigned short links; // Base index to header 'links' array.
+ unsigned char nlinks; // Number of links for
+ unsigned char nv; // Number of vertices.
+ unsigned char flags; // Flags (not used).
+};
+
+struct dtTilePolyDetail
+{
+ unsigned short vbase; // Offset to detail vertex array.
+ unsigned short nverts; // Number of vertices in the detail mesh.
+ unsigned short tbase; // Offset to detail triangle array.
+ unsigned short ntris; // Number of triangles.
+};
+
+// Stucture holding a link to another polygon.
+struct dtTileLink
+{
+ dtTilePolyRef ref; // Neighbour reference.
+ unsigned short p; // Index to polygon which owns this link.
+ unsigned char e; // Index to polygon edge which owns this link.
+ unsigned char side; // If boundary link, defines on which side the link is.
+ unsigned char bmin, bmax; // If boundary link, defines the sub edge area.
+};
+
+struct dtTileHeader
+{
+ int magic; // Magic number, used to identify the data.
+ int version; // Data version number.
+ int npolys; // Number of polygons in the tile.
+ int nverts; // Number of vertices in the tile.
+ int nlinks; // Number of links in the tile (will be updated when tile is added).
+ int maxlinks; // Number of allocated links.
+ int ndmeshes;
+ int ndverts;
+ int ndtris;
+ float bmin[3], bmax[3]; // Bounding box of the tile.
+ dtTilePoly* polys; // Pointer to the polygons (will be updated when tile is added).
+ float* verts; // Pointer to the vertices (will be updated when tile added).
+ dtTileLink* links; // Pointer to the links (will be updated when tile added).
+ dtTilePolyDetail* dmeshes;
+ float* dverts;
+ unsigned char* dtris;
+};
+
+struct dtTile
+{
+ int salt; // Counter describing modifications to the tile.
+ int x,y; // Grid location of the tile.
+ dtTileHeader* header; // Pointer to tile header.
+ unsigned char* data; // Pointer to tile data.
+ int dataSize; // Size of the tile data.
+ bool ownsData; // Flag indicating of the navmesh should release the data.
+ dtTile* next; // Next free tile or, next tile in spatial grid.
+};
+
+// Encodes a tile id.
+inline dtTilePolyRef dtEncodeTileId(unsigned int salt, unsigned int it, unsigned int ip)
+{
+ return (salt << (DT_TILE_REF_POLY_BITS+DT_TILE_REF_TILE_BITS)) | ((it+1) << DT_TILE_REF_POLY_BITS) | ip;
+}
+
+// Decodes a tile id.
+inline void dtDecodeTileId(dtTilePolyRef ref, unsigned int& salt, unsigned int& it, unsigned int& ip)
+{
+ salt = (ref >> (DT_TILE_REF_POLY_BITS+DT_TILE_REF_TILE_BITS)) & DT_TILE_REF_SALT_MASK;
+ it = ((ref >> DT_TILE_REF_POLY_BITS) & DT_TILE_REF_TILE_MASK) - 1;
+ ip = ref & DT_TILE_REF_POLY_MASK;
+}
+
+static const int DT_TILE_LOOKUP_SIZE = DT_MAX_TILES/4;
+
+class dtTiledNavMesh
+{
+public:
+ dtTiledNavMesh();
+ ~dtTiledNavMesh();
+
+ // Initializes the nav mesh.
+ // Params:
+ // orig - (in) origin of the nav mesh tile space.
+ // tileSiz - (in) size of a tile.
+ // portalheight - (in) height of the portal region between tiles.
+ // Returns: True if succeed, else false.
+ bool init(const float* orig, float tileSize, float portalHeight);
+
+ // Adds new tile into the navmesh.
+ // The add will fail if the data is in wrong format,
+ // there is not enough tiles left, or if there is a tile already at the location.
+ // Params:
+ // x,y - (in) Location of the new tile.
+ // data - (in) Data of the new tile mesh.
+ // dataSize - (in) Data size of the new tile mesh.
+ // ownsData - (in) Flag indicating if the navmesh should own and delete the data.
+ // Returns: True if tile was added, else false.
+ bool addTileAt(int x, int y, unsigned char* data, int dataSize, bool ownsData);
+
+ // Removes tile at specified location.
+ // Params:
+ // x,y - (in) Location of the tile to remove.
+ // data - (out) Data associated with deleted tile.
+ // dataSize - (out) Size of the data associated with deleted tile.
+ // Returns: True if remove suceed, else false.
+ bool removeTileAt(int x, int y, unsigned char** data, int* dataSize);
+
+ // Returns pointer to tile at specified location.
+ // Params:
+ // x,y - (in) Location of the tile to get.
+ // Returns: pointer to tile if tile exists or 0 tile does not exists.
+ dtTile* getTileAt(int x, int y);
+
+ // Returns pointer to tile in the tile array.
+ // Params:
+ // i - (in) Index to the tile to retrieve, must be in range [0,DT_MAX_TILES[
+ // Returns: Pointer to specified tile.
+ dtTile* getTile(int i);
+ const dtTile* getTile(int i) const;
+
+ // Finds the nearest navigation polygon around the center location.
+ // Params:
+ // center - (in) The center of the search box.
+ // extents - (in) The extents of the search box.
+ // Returns: Reference identifier for the polygon, or 0 if no polygons found.
+ dtTilePolyRef findNearestPoly(const float* center, const float* extents);
+
+ // Returns polygons which touch the query box.
+ // Params:
+ // center - (in) the center of the search box.
+ // extents - (in) the extents of the search box.
+ // polys - (out) array holding the search result.
+ // maxPolys - (in) The max number of polygons the polys array can hold.
+ // Returns: Number of polygons in search result array.
+ int queryPolygons(const float* center, const float* extents,
+ dtTilePolyRef* polys, const int maxPolys);
+
+ // Finds path from start polygon to end polygon.
+ // If target polygon canno be reached through the navigation graph,
+ // the last node on the array is nearest node to the end polygon.
+ // Params:
+ // startRef - (in) ref to path start polygon.
+ // endRef - (in) ref to path end polygon.
+ // path - (out) array holding the search result.
+ // maxPathSize - (in) The max number of polygons the path array can hold.
+ // Returns: Number of polygons in search result array.
+ int findPath(dtTilePolyRef startRef, dtTilePolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtTilePolyRef* path, const int maxPathSize);
+
+ // Finds a straight path from start to end locations within the corridor
+ // described by the path polygons.
+ // Start and end locations will be clamped on the corridor.
+ // Params:
+ // startPos - (in) Path start location.
+ // endPos - (in) Path end location.
+ // path - (in) Array of connected polygons describing the corridor.
+ // pathSize - (in) Number of polygons in path array.
+ // straightPath - (out) Points describing the straight path.
+ // maxStraightPathSize - (in) The max number of points the straight path array can hold.
+ // Returns: Number of points in the path.
+ int findStraightPath(const float* startPos, const float* endPos,
+ const dtTilePolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize);
+
+ // Finds intersection againts walls starting from start pos.
+ // Params:
+ // startRef - (in) ref to the polygon where the start lies.
+ // startPos - (in) start position of the query.
+ // endPos - (in) end position of the query.
+ // t - (out) hit parameter along the segment, 0 if no hit.
+ // endRef - (out) ref to the last polygon which was processed.
+ // Returns: Number of polygons in path or 0 if failed.
+ int raycast(dtTilePolyRef startRef, const float* startPos, const float* endPos,
+ float& t, dtTilePolyRef* path, const int pathSize);
+
+ // Returns distance to nearest wall from the specified location.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle.
+ // maxRadius - (in) max search radius.
+ // hitPos - (out) location of the nearest hit.
+ // hitNormal - (out) normal of the nearest hit.
+ // Returns: Distance to nearest wall from the test location.
+ float findDistanceToWall(dtTilePolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal);
+
+ // Finds polygons found along the navigation graph which touch the specified circle.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle
+ // radius - (in) radius of the query circle
+ // resultRef - (out, opt) refs to the polygons touched by the circle.
+ // resultParent - (out, opt) parent of each result polygon.
+ // resultCost - (out, opt) search cost at each result polygon.
+ // maxResult - (int) maximum capacity of search results.
+ // Returns: Number of results.
+ int findPolysAround(dtTilePolyRef centerRef, const float* centerPos, float radius,
+ dtTilePolyRef* resultRef, dtTilePolyRef* resultParent, float* resultCost,
+ const int maxResult);
+
+ // Returns closest point on navigation polygon.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point to check.
+ // closest - (out) closest point.
+ // Returns: true if closest point found.
+ bool closestPointToPoly(dtTilePolyRef ref, const float* pos, float* closest) const;
+
+ // Returns height of the polygon at specified location.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point where to locate the height.
+ // height - (out) height at the location.
+ // Returns: true if over polygon.
+ bool getPolyHeight(dtTilePolyRef ref, const float* pos, float* height) const;
+
+ // Returns pointer to a polygon based on ref.
+ const dtTilePoly* getPolyByRef(dtTilePolyRef ref) const;
+
+ // Returns pointer to a polygon vertices based on ref.
+ const float* getPolyVertsByRef(dtTilePolyRef ref) const;
+
+ // Returns pointer to a polygon link based on ref.
+ const dtTileLink* getPolyLinksByRef(dtTilePolyRef ref) const;
+
+private:
+
+ // Returns base id for the tile.
+ dtTilePolyRef getTileId(dtTile* tile);
+ // Returns neighbour tile based on side.
+ dtTile* getNeighbourTileAt(int x, int y, int side);
+ // Returns all polygons in neighbour tile based on portal defined by the segment.
+ int findConnectingPolys(const float* va, const float* vb,
+ dtTile* tile, int side,
+ dtTilePolyRef* con, float* conarea, int maxcon);
+ // Builds internal polygons links for a tile.
+ void buildIntLinks(dtTile* tile);
+ // Builds external polygon links for a tile.
+ void buildExtLinks(dtTile* tile, dtTile* target, int side);
+ // Removes external links at specified side.
+ void removeExtLinks(dtTile* tile, int side);
+ // Queries polygons within a tile.
+ int queryTilePolygons(dtTile* tile, const float* qmin, const float* qmax,
+ dtTilePolyRef* polys, const int maxPolys);
+
+ float getCost(dtTilePolyRef prev, dtTilePolyRef from, dtTilePolyRef to) const;
+ float getFirstCost(const float* pos, dtTilePolyRef from, dtTilePolyRef to) const;
+ float getLastCost(dtTilePolyRef from, dtTilePolyRef to, const float* pos) const;
+ float getHeuristic(const float* from, const float* to) const;
+
+ // Returns portal points between two polygons.
+ bool getPortalPoints(dtTilePolyRef from, dtTilePolyRef to, float* left, float* right) const;
+ // Returns edge mid point between two polygons.
+ bool getEdgeMidPoint(dtTilePolyRef from, dtTilePolyRef to, float* mid) const;
+
+ float m_orig[3];
+ float m_tileSize;
+ float m_portalHeight;
+
+ dtTile* m_posLookup[DT_TILE_LOOKUP_SIZE];
+ dtTile* m_nextFree;
+ dtTile m_tiles[DT_MAX_TILES];
+
+ dtTileLink* m_tmpLinks;
+ int m_ntmpLinks;
+
+ class dtNodePool* m_nodePool;
+ class dtNodeQueue* m_openList;
+};
+
+#endif // DETOURTILENAVMESH_H
diff --git a/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h b/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h
new file mode 100644
index 00000000000..643dec1edb1
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h
@@ -0,0 +1,29 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURTILEDNAVMESHBUILDER_H
+#define DETOURTILEDNAVMESHBUILDER_H
+
+bool dtCreateNavMeshTileData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ const float* bmin, const float* bmax, float cs, float ch, int tileSize, int walkableClimb,
+ unsigned char** outData, int* outDataSize);
+
+#endif // DETOURTILEDNAVMESHBUILDER_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Source/DetourCommon.cpp b/extern/recastnavigation/Detour/Source/DetourCommon.cpp
new file mode 100644
index 00000000000..e55ce5e6351
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourCommon.cpp
@@ -0,0 +1,244 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include "DetourCommon.h"
+
+void closestPtPointTriangle(float* closest, const float* p,
+ const float* a, const float* b, const float* c)
+{
+ // Check if P in vertex region outside A
+ float ab[3], ac[3], ap[3];
+ vsub(ab, b, a);
+ vsub(ac, c, a);
+ vsub(ap, p, a);
+ float d1 = vdot(ab, ap);
+ float d2 = vdot(ac, ap);
+ if (d1 <= 0.0f && d2 <= 0.0f)
+ {
+ // barycentric coordinates (1,0,0)
+ vcopy(closest, a);
+ return;
+ }
+
+ // Check if P in vertex region outside B
+ float bp[3];
+ vsub(bp, p, b);
+ float d3 = vdot(ab, bp);
+ float d4 = vdot(ac, bp);
+ if (d3 >= 0.0f && d4 <= d3)
+ {
+ // barycentric coordinates (0,1,0)
+ vcopy(closest, b);
+ return;
+ }
+
+ // Check if P in edge region of AB, if so return projection of P onto AB
+ float vc = d1*d4 - d3*d2;
+ if (vc <= 0.0f && d1 >= 0.0f && d3 <= 0.0f)
+ {
+ // barycentric coordinates (1-v,v,0)
+ float v = d1 / (d1 - d3);
+ closest[0] = a[0] + v * ab[0];
+ closest[1] = a[1] + v * ab[1];
+ closest[2] = a[2] + v * ab[2];
+ return;
+ }
+
+ // Check if P in vertex region outside C
+ float cp[3];
+ vsub(cp, p, c);
+ float d5 = vdot(ab, cp);
+ float d6 = vdot(ac, cp);
+ if (d6 >= 0.0f && d5 <= d6)
+ {
+ // barycentric coordinates (0,0,1)
+ vcopy(closest, c);
+ return;
+ }
+
+ // Check if P in edge region of AC, if so return projection of P onto AC
+ float vb = d5*d2 - d1*d6;
+ if (vb <= 0.0f && d2 >= 0.0f && d6 <= 0.0f)
+ {
+ // barycentric coordinates (1-w,0,w)
+ float w = d2 / (d2 - d6);
+ closest[0] = a[0] + w * ac[0];
+ closest[1] = a[1] + w * ac[1];
+ closest[2] = a[2] + w * ac[2];
+ return;
+ }
+
+ // Check if P in edge region of BC, if so return projection of P onto BC
+ float va = d3*d6 - d5*d4;
+ if (va <= 0.0f && (d4 - d3) >= 0.0f && (d5 - d6) >= 0.0f)
+ {
+ // barycentric coordinates (0,1-w,w)
+ float w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
+ closest[0] = b[0] + w * (c[0] - b[0]);
+ closest[1] = b[1] + w * (c[1] - b[1]);
+ closest[2] = b[2] + w * (c[2] - b[2]);
+ return;
+ }
+
+ // P inside face region. Compute Q through its barycentric coordinates (u,v,w)
+ float denom = 1.0f / (va + vb + vc);
+ float v = vb * denom;
+ float w = vc * denom;
+ closest[0] = a[0] + ab[0] * v + ac[0] * w;
+ closest[1] = a[1] + ab[1] * v + ac[1] * w;
+ closest[2] = a[2] + ab[2] * v + ac[2] * w;
+}
+
+bool intersectSegmentPoly2D(const float* p0, const float* p1,
+ const float* verts, int nverts,
+ float& tmin, float& tmax,
+ int& segMin, int& segMax)
+{
+ static const float EPS = 0.00000001f;
+
+ tmin = 0;
+ tmax = 1;
+ segMin = -1;
+ segMax = -1;
+
+ float dir[3];
+ vsub(dir, p1, p0);
+
+ for (int i = 0, j = nverts-1; i < nverts; j=i++)
+ {
+ float edge[3], diff[3];
+ vsub(edge, &verts[i*3], &verts[j*3]);
+ vsub(diff, p0, &verts[j*3]);
+ float n = vperp2D(edge, diff);
+ float d = -vperp2D(edge, dir);
+ if (fabs(d) < EPS)
+ {
+ // S is nearly parallel to this edge
+ if (n < 0)
+ return false;
+ else
+ continue;
+ }
+ float t = n / d;
+ if (d < 0)
+ {
+ // segment S is entering across this edge
+ if (t > tmin)
+ {
+ tmin = t;
+ segMin = j;
+ // S enters after leaving polygon
+ if (tmin > tmax)
+ return false;
+ }
+ }
+ else
+ {
+ // segment S is leaving across this edge
+ if (t < tmax)
+ {
+ tmax = t;
+ segMax = j;
+ // S leaves before entering polygon
+ if (tmax < tmin)
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+float distancePtSegSqr2D(const float* pt, const float* p, const float* q, float& t)
+{
+ float pqx = q[0] - p[0];
+ float pqz = q[2] - p[2];
+ float dx = pt[0] - p[0];
+ float dz = pt[2] - p[2];
+ float d = pqx*pqx + pqz*pqz;
+ t = pqx*dx + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = p[0] + t*pqx - pt[0];
+ dz = p[2] + t*pqz - pt[2];
+
+ return dx*dx + dz*dz;
+}
+
+void calcPolyCenter(float* tc, const unsigned short* idx, int nidx, const float* verts)
+{
+ tc[0] = 0.0f;
+ tc[1] = 0.0f;
+ tc[2] = 0.0f;
+ for (int j = 0; j < nidx; ++j)
+ {
+ const float* v = &verts[idx[j]*3];
+ tc[0] += v[0];
+ tc[1] += v[1];
+ tc[2] += v[2];
+ }
+ const float s = 1.0f / nidx;
+ tc[0] *= s;
+ tc[1] *= s;
+ tc[2] *= s;
+}
+
+inline float vdot2(const float* a, const float* b)
+{
+ return a[0]*b[0] + a[2]*b[2];
+}
+
+#include <stdio.h>
+
+bool closestHeightPointTriangle(const float* p, const float* a, const float* b, const float* c, float& h)
+{
+ float v0[3], v1[3], v2[3];
+ vsub(v0, c,a);
+ vsub(v1, b,a);
+ vsub(v2, p,a);
+
+ const float dot00 = vdot2(v0, v0);
+ const float dot01 = vdot2(v0, v1);
+ const float dot02 = vdot2(v0, v2);
+ const float dot11 = vdot2(v1, v1);
+ const float dot12 = vdot2(v1, v2);
+
+ // Compute barycentric coordinates
+ float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
+ float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ // The (sloppy) epsilon is needed to allow to get height of points which
+ // are interpolated along the edges of the triangles.
+ static const float EPS = 1e-4f;
+
+ // If point lies inside the triangle, return interpolated ycoord.
+ if (u >= -EPS && v >= -EPS && (u+v) <= 1+EPS)
+ {
+ h = a[1] + v0[1]*u + v1[1]*v;
+ return true;
+ }
+
+ return false;
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourNode.cpp b/extern/recastnavigation/Detour/Source/DetourNode.cpp
new file mode 100644
index 00000000000..1a2305fcede
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourNode.cpp
@@ -0,0 +1,140 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include "DetourNode.h"
+#include <string.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtNodePool::dtNodePool(int maxNodes, int hashSize) :
+
+ m_nodes(0),
+ m_first(0),
+ m_next(0),
+ m_maxNodes(maxNodes),
+ m_hashSize(hashSize),
+ m_nodeCount(0)
+{
+ m_nodes = new dtNode[m_maxNodes];
+ m_next = new unsigned short[m_maxNodes];
+ m_first = new unsigned short[hashSize];
+ memset(m_first, 0xff, sizeof(unsigned short)*m_hashSize);
+ memset(m_next, 0xff, sizeof(unsigned short)*m_maxNodes);
+}
+
+dtNodePool::~dtNodePool()
+{
+ delete [] m_nodes;
+ delete [] m_next;
+ delete [] m_first;
+}
+
+void dtNodePool::clear()
+{
+ memset(m_first, 0xff, sizeof(unsigned short)*m_hashSize);
+ m_nodeCount = 0;
+}
+
+const dtNode* dtNodePool::findNode(unsigned int id) const
+{
+ unsigned int bucket = hashint(id) & (m_hashSize-1);
+ unsigned short i = m_first[bucket];
+ while (i != 0xffff)
+ {
+ if (m_nodes[i].id == id)
+ return &m_nodes[i];
+ i = m_next[i];
+ }
+ return 0;
+}
+
+dtNode* dtNodePool::getNode(unsigned int id)
+{
+ unsigned int bucket = hashint(id) & (m_hashSize-1);
+ unsigned short i = m_first[bucket];
+ dtNode* node = 0;
+ while (i != 0xffff)
+ {
+ if (m_nodes[i].id == id)
+ return &m_nodes[i];
+ i = m_next[i];
+ }
+
+ if (m_nodeCount >= m_maxNodes)
+ return 0;
+
+ i = (unsigned short)m_nodeCount;
+ m_nodeCount++;
+
+ // Init node
+ node = &m_nodes[i];
+ node->pidx = 0;
+ node->cost = 0;
+ node->total = 0;
+ node->id = id;
+ node->flags = 0;
+
+ m_next[i] = m_first[bucket];
+ m_first[bucket] = i;
+
+ return node;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtNodeQueue::dtNodeQueue(int n) :
+ m_heap(0),
+ m_capacity(n),
+ m_size(0)
+{
+ m_heap = new dtNode*[m_capacity+1];
+}
+
+dtNodeQueue::~dtNodeQueue()
+{
+ delete [] m_heap;
+}
+
+void dtNodeQueue::bubbleUp(int i, dtNode* node)
+{
+ int parent = (i-1)/2;
+ // note: (index > 0) means there is a parent
+ while ((i > 0) && (m_heap[parent]->total > node->total))
+ {
+ m_heap[i] = m_heap[parent];
+ i = parent;
+ parent = (i-1)/2;
+ }
+ m_heap[i] = node;
+}
+
+void dtNodeQueue::trickleDown(int i, dtNode* node)
+{
+ int child = (i*2)+1;
+ while (child < m_size)
+ {
+ if (((child+1) < m_size) &&
+ (m_heap[child]->total > m_heap[child+1]->total))
+ {
+ child++;
+ }
+ m_heap[i] = m_heap[child];
+ i = child;
+ child = (i*2)+1;
+ }
+ bubbleUp(i, node);
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp b/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp
new file mode 100644
index 00000000000..bf59cd89dda
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp
@@ -0,0 +1,876 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdio.h>
+#include "DetourStatNavMesh.h"
+#include "DetourNode.h"
+#include "DetourCommon.h"
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtStatNavMesh::dtStatNavMesh() :
+ m_data(0),
+ m_dataSize(0),
+ m_header(0),
+ m_nodePool(0),
+ m_openList(0)
+{
+}
+
+dtStatNavMesh::~dtStatNavMesh()
+{
+ delete m_nodePool;
+ delete m_openList;
+ if (m_data)
+ delete [] m_data;
+}
+
+bool dtStatNavMesh::init(unsigned char* data, int dataSize, bool ownsData)
+{
+ dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)data;
+
+ if (header->magic != DT_STAT_NAVMESH_MAGIC)
+ return false;
+ if (header->version != DT_STAT_NAVMESH_VERSION)
+ return false;
+
+ const int headerSize = sizeof(dtStatNavMeshHeader);
+ const int vertsSize = sizeof(float)*3*header->nverts;
+ const int polysSize = sizeof(dtStatPoly)*header->npolys;
+ const int nodesSize = sizeof(dtStatBVNode)*header->npolys*2;
+ const int detailMeshesSize = sizeof(dtStatPolyDetail)*header->ndmeshes;
+ const int detailVertsSize = sizeof(float)*3*header->ndverts;
+ const int detailTrisSize = sizeof(unsigned char)*4*header->ndtris;
+
+
+ unsigned char* d = data + headerSize;
+ header->verts = (float*)d; d += vertsSize;
+ header->polys = (dtStatPoly*)d; d += polysSize;
+ header->bvtree = (dtStatBVNode*)d; d += nodesSize;
+ header->dmeshes = (dtStatPolyDetail*)d; d += detailMeshesSize;
+ header->dverts = (float*)d; d += detailVertsSize;
+ header->dtris = (unsigned char*)d; d += detailTrisSize;
+
+ m_nodePool = new dtNodePool(2048, 256);
+ if (!m_nodePool)
+ return false;
+
+ m_openList = new dtNodeQueue(2048);
+ if (!m_openList)
+ return false;
+
+ if (ownsData)
+ {
+ m_data = data;
+ m_dataSize = dataSize;
+ }
+
+ m_header = header;
+
+ return true;
+}
+
+const dtStatPoly* dtStatNavMesh::getPolyByRef(dtStatPolyRef ref) const
+{
+ if (!m_header || ref == 0 || (int)ref > m_header->npolys) return 0;
+ return &m_header->polys[ref-1];
+}
+
+int dtStatNavMesh::getPolyIndexByRef(dtStatPolyRef ref) const
+{
+ if (!m_header || ref == 0 || (int)ref > m_header->npolys) return -1;
+ return (int)ref-1;
+}
+
+int dtStatNavMesh::findPath(dtStatPolyRef startRef, dtStatPolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtStatPolyRef* path, const int maxPathSize)
+{
+ if (!m_header) return 0;
+
+ if (!startRef || !endRef)
+ return 0;
+
+ if (!maxPathSize)
+ return 0;
+
+ if (startRef == endRef)
+ {
+ path[0] = startRef;
+ return 1;
+ }
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ static const float H_SCALE = 1.1f; // Heuristic scale.
+
+ dtNode* startNode = m_nodePool->getNode(startRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = vdist(startPos, endPos) * H_SCALE;
+ startNode->id = startRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ dtNode* lastBestNode = startNode;
+ float lastBestNodeCost = startNode->total;
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ if (bestNode->id == endRef)
+ {
+ lastBestNode = bestNode;
+ break;
+ }
+
+ const dtStatPoly* poly = getPoly(bestNode->id-1);
+ for (int i = 0; i < (int)poly->nv; ++i)
+ {
+ dtStatPolyRef neighbour = poly->n[i];
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Calculate cost.
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, startPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.cost = parent->cost + vdist(p0,p1);
+ // Special case for last node.
+ if (newNode.id == endRef)
+ newNode.cost += vdist(p1, endPos);
+
+ // Heuristic
+ const float h = vdist(p1,endPos)*H_SCALE;
+ newNode.total = newNode.cost + h;
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->cost = newNode.cost;
+ actualNode->total = newNode.total;
+
+ if (h < lastBestNodeCost)
+ {
+ lastBestNodeCost = h;
+ lastBestNode = actualNode;
+ }
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+ }
+
+ // Reverse the path.
+ dtNode* prev = 0;
+ dtNode* node = lastBestNode;
+ do
+ {
+ dtNode* next = m_nodePool->getNodeAtIdx(node->pidx);
+ node->pidx = m_nodePool->getNodeIdx(prev);
+ prev = node;
+ node = next;
+ }
+ while (node);
+
+ // Store path
+ node = prev;
+ int n = 0;
+ do
+ {
+ path[n++] = node->id;
+ node = m_nodePool->getNodeAtIdx(node->pidx);
+ }
+ while (node && n < maxPathSize);
+
+ return n;
+}
+
+bool dtStatNavMesh::closestPointToPoly(dtStatPolyRef ref, const float* pos, float* closest) const
+{
+ int idx = getPolyIndexByRef(ref);
+ if (idx == -1)
+ return false;
+
+ float closestDistSqr = FLT_MAX;
+ const dtStatPoly* p = getPoly(idx);
+ const dtStatPolyDetail* pd = getPolyDetail(idx);
+
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = getDetailTri(pd->tbase+j);
+ const float* v[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ if (t[k] < p->nv)
+ v[k] = getVertex(p->v[t[k]]);
+ else
+ v[k] = getDetailVertex(pd->vbase+(t[k]-p->nv));
+ }
+ float pt[3];
+ closestPtPointTriangle(pt, pos, v[0], v[1], v[2]);
+ float d = vdistSqr(pos, pt);
+ if (d < closestDistSqr)
+ {
+ vcopy(closest, pt);
+ closestDistSqr = d;
+ }
+ }
+
+ return true;
+}
+
+bool dtStatNavMesh::getPolyHeight(dtStatPolyRef ref, const float* pos, float* height) const
+{
+ int idx = getPolyIndexByRef(ref);
+ if (idx == -1)
+ return false;
+
+ const dtStatPoly* p = getPoly(idx);
+ const dtStatPolyDetail* pd = getPolyDetail(idx);
+
+ for (int i = 0; i < pd->ntris; ++i)
+ {
+ const unsigned char* t = getDetailTri(pd->tbase+i);
+ const float* v[3];
+ for (int j = 0; j < 3; ++j)
+ {
+ if (t[j] < p->nv)
+ v[j] = getVertex(p->v[t[j]]);
+ else
+ v[j] = getDetailVertex(pd->vbase+(t[j]-p->nv));
+ }
+ float h;
+ if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h))
+ {
+ if (height)
+ *height = h;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+int dtStatNavMesh::findStraightPath(const float* startPos, const float* endPos,
+ const dtStatPolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize)
+{
+ if (!m_header) return 0;
+
+ if (!maxStraightPathSize)
+ return 0;
+
+ if (!path[0])
+ return 0;
+
+ int straightPathSize = 0;
+
+ float closestStartPos[3];
+ if (!closestPointToPoly(path[0], startPos, closestStartPos))
+ return 0;
+
+ // Add start point.
+ vcopy(&straightPath[straightPathSize*3], closestStartPos);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+
+ float closestEndPos[3];
+ if (!closestPointToPoly(path[pathSize-1], endPos, closestEndPos))
+ return 0;
+
+ float portalApex[3], portalLeft[3], portalRight[3];
+
+ if (pathSize > 1)
+ {
+ vcopy(portalApex, closestStartPos);
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ int apexIndex = 0;
+ int leftIndex = 0;
+ int rightIndex = 0;
+
+ for (int i = 0; i < pathSize; ++i)
+ {
+ float left[3], right[3];
+ if (i < pathSize-1)
+ {
+ // Next portal.
+ getPortalPoints(path[i], path[i+1], left, right);
+ }
+ else
+ {
+ // End of the path.
+ vcopy(left, closestEndPos);
+ vcopy(right, closestEndPos);
+ }
+
+ // Right vertex.
+ if (vequal(portalApex, portalRight))
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalRight, right) <= 0.0f)
+ {
+ if (triArea2D(portalApex, portalLeft, right) > 0.0f)
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalLeft);
+ apexIndex = leftIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+
+ // Left vertex.
+ if (vequal(portalApex, portalLeft))
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalLeft, left) >= 0.0f)
+ {
+ if (triArea2D(portalApex, portalRight, left) < 0.0f)
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalRight);
+ apexIndex = rightIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ // Add end point.
+ vcopy(&straightPath[straightPathSize*3], closestEndPos);
+ straightPathSize++;
+
+ return straightPathSize;
+}
+
+int dtStatNavMesh::getPolyVerts(dtStatPolyRef ref, float* verts) const
+{
+ if (!m_header) return 0;
+ const dtStatPoly* poly = getPolyByRef(ref);
+ if (!poly) return 0;
+ float* v = verts;
+ for (int i = 0; i < (int)poly->nv; ++i)
+ {
+ const float* cv = &m_header->verts[poly->v[i]*3];
+ *v++ = cv[0];
+ *v++ = cv[1];
+ *v++ = cv[2];
+ }
+ return (int)poly->nv;
+}
+
+int dtStatNavMesh::raycast(dtStatPolyRef centerRef, const float* startPos, const float* endPos,
+ float& t, dtStatPolyRef* path, const int pathSize)
+{
+ if (!m_header) return 0;
+ if (!centerRef) return 0;
+
+ dtStatPolyRef prevRef = centerRef;
+ dtStatPolyRef curRef = centerRef;
+ t = 0;
+
+ float verts[DT_STAT_VERTS_PER_POLYGON*3];
+ int n = 0;
+
+ while (curRef)
+ {
+ // Cast ray against current polygon.
+ int nv = getPolyVerts(curRef, verts);
+ if (nv < 3)
+ {
+ // Hit bad polygon, report hit.
+ return n;
+ }
+
+ float tmin, tmax;
+ int segMin, segMax;
+ if (!intersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax))
+ {
+ // Could not a polygon, keep the old t and report hit.
+ return n;
+ }
+ // Keep track of furthest t so far.
+ if (tmax > t)
+ t = tmax;
+
+ if (n < pathSize)
+ path[n++] = curRef;
+
+ // Check the neighbour of this polygon.
+ const dtStatPoly* poly = getPolyByRef(curRef);
+ dtStatPolyRef nextRef = poly->n[segMax];
+ if (!nextRef)
+ {
+ // No neighbour, we hit a wall.
+ return n;
+ }
+
+ // No hit, advance to neighbour polygon.
+ prevRef = curRef;
+ curRef = nextRef;
+ }
+
+ return n;
+}
+
+
+float dtStatNavMesh::findDistanceToWall(dtStatPolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal)
+{
+ if (!m_header) return 0;
+ if (!centerRef) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ float radiusSqr = sqr(maxRadius);
+
+ hitNormal[0] = 1;
+ hitNormal[1] = 0;
+ hitNormal[2] = 0;
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+ const dtStatPoly* poly = getPoly(bestNode->id-1);
+
+ // Hit test walls.
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ // Skip non-solid edges.
+ if (poly->n[j]) continue;
+
+ // Calc distance to the edge.
+ const float* vj = getVertex(poly->v[j]);
+ const float* vi = getVertex(poly->v[i]);
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // Edge is too far, skip.
+ if (distSqr > radiusSqr)
+ continue;
+
+ // Hit wall, update radius.
+ radiusSqr = distSqr;
+ // Calculate hit pos.
+ hitPos[0] = vj[0] + (vi[0] - vj[0])*tseg;
+ hitPos[1] = vj[1] + (vi[1] - vj[1])*tseg;
+ hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg;
+ }
+
+ // Check to see if teh circle expands to one of the neighbours and expand.
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ // Skip solid edges.
+ if (!poly->n[j]) continue;
+
+ // Expand to neighbour if not visited yet.
+ dtStatPolyRef neighbour = poly->n[j];
+
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* vj = getVertex(poly->v[j]);
+ const float* vi = getVertex(poly->v[i]);
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // Edge is too far, skip.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Cost
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+ }
+
+ // Calc hit normal.
+ vsub(hitNormal, centerPos, hitPos);
+ vnormalize(hitNormal);
+
+ return sqrtf(radiusSqr);
+}
+
+int dtStatNavMesh::findPolysAround(dtStatPolyRef centerRef, const float* centerPos, float radius,
+ dtStatPolyRef* resultRef, dtStatPolyRef* resultParent, float* resultCost,
+ const int maxResult)
+{
+ if (!m_header) return 0;
+ if (!centerRef) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ int n = 0;
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = startNode->id;
+ if (resultParent)
+ resultParent[n] = 0;
+ if (resultCost)
+ resultCost[n] = 0;
+ ++n;
+ }
+
+ const float radiusSqr = sqr(radius);
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+ const dtStatPoly* poly = getPoly(bestNode->id-1);
+ for (unsigned i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j=i++)
+ {
+ dtStatPolyRef neighbour = poly->n[j];
+
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* vj = getVertex(poly->v[j]);
+ const float* vi = getVertex(poly->v[i]);
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // If the circle is not touching the next polygon, skip it.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Cost
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = actualNode->id;
+ if (resultParent)
+ resultParent[n] = m_nodePool->getNodeAtIdx(actualNode->pidx)->id;
+ if (resultCost)
+ resultCost[n] = actualNode->total;
+ ++n;
+ }
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+
+ }
+
+ return n;
+}
+
+// Returns polygons which are withing certain radius from the query location.
+int dtStatNavMesh::queryPolygons(const float* center, const float* extents,
+ dtStatPolyRef* polys, const int maxIds)
+{
+ if (!m_header) return 0;
+
+ const dtStatBVNode* node = &m_header->bvtree[0];
+ const dtStatBVNode* end = &m_header->bvtree[m_header->nnodes];
+
+ // Calculate quantized box
+ const float ics = 1.0f / m_header->cs;
+ unsigned short bmin[3], bmax[3];
+ // Clamp query box to world box.
+ float minx = clamp(center[0] - extents[0], m_header->bmin[0], m_header->bmax[0]) - m_header->bmin[0];
+ float miny = clamp(center[1] - extents[1], m_header->bmin[1], m_header->bmax[1]) - m_header->bmin[1];
+ float minz = clamp(center[2] - extents[2], m_header->bmin[2], m_header->bmax[2]) - m_header->bmin[2];
+ float maxx = clamp(center[0] + extents[0], m_header->bmin[0], m_header->bmax[0]) - m_header->bmin[0];
+ float maxy = clamp(center[1] + extents[1], m_header->bmin[1], m_header->bmax[1]) - m_header->bmin[1];
+ float maxz = clamp(center[2] + extents[2], m_header->bmin[2], m_header->bmax[2]) - m_header->bmin[2];
+ // Quantize
+ bmin[0] = (unsigned short)(ics * minx) & 0xfffe;
+ bmin[1] = (unsigned short)(ics * miny) & 0xfffe;
+ bmin[2] = (unsigned short)(ics * minz) & 0xfffe;
+ bmax[0] = (unsigned short)(ics * maxx + 1) | 1;
+ bmax[1] = (unsigned short)(ics * maxy + 1) | 1;
+ bmax[2] = (unsigned short)(ics * maxz + 1) | 1;
+
+ // Traverse tree
+ int n = 0;
+ while (node < end)
+ {
+ bool overlap = checkOverlapBox(bmin, bmax, node->bmin, node->bmax);
+ bool isLeafNode = node->i >= 0;
+
+ if (isLeafNode && overlap)
+ {
+ if (n < maxIds)
+ {
+ polys[n] = (dtStatPolyRef)node->i;
+ n++;
+ }
+ }
+
+ if (overlap || isLeafNode)
+ node++;
+ else
+ {
+ const int escapeIndex = -node->i;
+ node += escapeIndex;
+ }
+ }
+
+ return n;
+}
+
+dtStatPolyRef dtStatNavMesh::findNearestPoly(const float* center, const float* extents)
+{
+ if (!m_header) return 0;
+
+ // Get nearby polygons from proximity grid.
+ dtStatPolyRef polys[128];
+ int npolys = queryPolygons(center, extents, polys, 128);
+
+ // Find nearest polygon amongst the nearby polygons.
+ dtStatPolyRef nearest = 0;
+ float nearestDistanceSqr = FLT_MAX;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyRef ref = polys[i];
+ float closest[3];
+ if (!closestPointToPoly(ref, center, closest))
+ continue;
+ float d = vdistSqr(center, closest);
+ if (d < nearestDistanceSqr)
+ {
+ nearestDistanceSqr = d;
+ nearest = ref;
+ }
+ }
+
+ return nearest;
+}
+
+bool dtStatNavMesh::getPortalPoints(dtStatPolyRef from, dtStatPolyRef to, float* left, float* right) const
+{
+ const dtStatPoly* fromPoly = getPolyByRef(from);
+ if (!fromPoly)
+ return false;
+
+ // Find common edge between the polygons and returns the segment end points.
+ for (unsigned i = 0, j = (int)fromPoly->nv - 1; i < (int)fromPoly->nv; j = i++)
+ {
+ unsigned short neighbour = fromPoly->n[j];
+ if (neighbour == to)
+ {
+ vcopy(left, getVertex(fromPoly->v[j]));
+ vcopy(right, getVertex(fromPoly->v[i]));
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool dtStatNavMesh::getEdgeMidPoint(dtStatPolyRef from, dtStatPolyRef to, float* mid) const
+{
+ float left[3], right[3];
+ if (!getPortalPoints(from, to, left,right)) return false;
+ mid[0] = (left[0]+right[0])*0.5f;
+ mid[1] = (left[1]+right[1])*0.5f;
+ mid[2] = (left[2]+right[2])*0.5f;
+ return true;
+}
+
+bool dtStatNavMesh::isInClosedList(dtStatPolyRef ref) const
+{
+ if (!m_nodePool) return false;
+ const dtNode* node = m_nodePool->findNode(ref);
+ return node && node->flags & DT_NODE_CLOSED;
+}
+
+int dtStatNavMesh::getMemUsed() const
+{
+ if (!m_nodePool || ! m_openList)
+ return 0;
+ return sizeof(*this) + m_dataSize +
+ m_nodePool->getMemUsed() +
+ m_openList->getMemUsed();
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp
new file mode 100644
index 00000000000..2ca455fb53d
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp
@@ -0,0 +1,346 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "DetourStatNavMesh.h"
+
+struct BVItem
+{
+ unsigned short bmin[3];
+ unsigned short bmax[3];
+ int i;
+};
+
+static int compareItemX(const void* va, const void* vb)
+{
+ const BVItem* a = (const BVItem*)va;
+ const BVItem* b = (const BVItem*)vb;
+ if (a->bmin[0] < b->bmin[0])
+ return -1;
+ if (a->bmin[0] > b->bmin[0])
+ return 1;
+ return 0;
+}
+
+static int compareItemY(const void* va, const void* vb)
+{
+ const BVItem* a = (const BVItem*)va;
+ const BVItem* b = (const BVItem*)vb;
+ if (a->bmin[1] < b->bmin[1])
+ return -1;
+ if (a->bmin[1] > b->bmin[1])
+ return 1;
+ return 0;
+}
+
+static int compareItemZ(const void* va, const void* vb)
+{
+ const BVItem* a = (const BVItem*)va;
+ const BVItem* b = (const BVItem*)vb;
+ if (a->bmin[2] < b->bmin[2])
+ return -1;
+ if (a->bmin[2] > b->bmin[2])
+ return 1;
+ return 0;
+}
+
+static void calcExtends(BVItem* items, int nitems, int imin, int imax,
+ unsigned short* bmin, unsigned short* bmax)
+{
+ bmin[0] = items[imin].bmin[0];
+ bmin[1] = items[imin].bmin[1];
+ bmin[2] = items[imin].bmin[2];
+
+ bmax[0] = items[imin].bmax[0];
+ bmax[1] = items[imin].bmax[1];
+ bmax[2] = items[imin].bmax[2];
+
+ for (int i = imin+1; i < imax; ++i)
+ {
+ const BVItem& it = items[i];
+ if (it.bmin[0] < bmin[0]) bmin[0] = it.bmin[0];
+ if (it.bmin[1] < bmin[1]) bmin[1] = it.bmin[1];
+ if (it.bmin[2] < bmin[2]) bmin[2] = it.bmin[2];
+
+ if (it.bmax[0] > bmax[0]) bmax[0] = it.bmax[0];
+ if (it.bmax[1] > bmax[1]) bmax[1] = it.bmax[1];
+ if (it.bmax[2] > bmax[2]) bmax[2] = it.bmax[2];
+ }
+}
+
+inline int longestAxis(unsigned short x, unsigned short y, unsigned short z)
+{
+ int axis = 0;
+ unsigned short maxVal = x;
+ if (y > maxVal)
+ {
+ axis = 1;
+ maxVal = y;
+ }
+ if (z > maxVal)
+ {
+ axis = 2;
+ maxVal = z;
+ }
+ return axis;
+}
+
+static void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNode, dtStatBVNode* nodes)
+{
+ int inum = imax - imin;
+ int icur = curNode;
+
+ dtStatBVNode& node = nodes[curNode++];
+
+ if (inum == 1)
+ {
+ // Leaf
+ node.bmin[0] = items[imin].bmin[0];
+ node.bmin[1] = items[imin].bmin[1];
+ node.bmin[2] = items[imin].bmin[2];
+
+ node.bmax[0] = items[imin].bmax[0];
+ node.bmax[1] = items[imin].bmax[1];
+ node.bmax[2] = items[imin].bmax[2];
+
+ node.i = items[imin].i;
+ }
+ else
+ {
+ // Split
+ calcExtends(items, nitems, imin, imax, node.bmin, node.bmax);
+
+ int axis = longestAxis(node.bmax[0] - node.bmin[0],
+ node.bmax[1] - node.bmin[1],
+ node.bmax[2] - node.bmin[2]);
+
+ if (axis == 0)
+ {
+ // Sort along x-axis
+ qsort(items+imin, inum, sizeof(BVItem), compareItemX);
+ }
+ else if (axis == 1)
+ {
+ // Sort along y-axis
+ qsort(items+imin, inum, sizeof(BVItem), compareItemY);
+ }
+ else
+ {
+ // Sort along z-axis
+ qsort(items+imin, inum, sizeof(BVItem), compareItemZ);
+ }
+
+ int isplit = imin+inum/2;
+
+ // Left
+ subdivide(items, nitems, imin, isplit, curNode, nodes);
+ // Right
+ subdivide(items, nitems, isplit, imax, curNode, nodes);
+
+ int iescape = curNode - icur;
+ // Negative index means escape.
+ node.i = -iescape;
+ }
+}
+
+/*static*/ int createBVTree(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ float cs, float ch,
+ int nnodes, dtStatBVNode* nodes)
+{
+ // Build tree
+ BVItem* items = new BVItem[npolys];
+ for (int i = 0; i < npolys; i++)
+ {
+ BVItem& it = items[i];
+ it.i = i+1;
+ // Calc polygon bounds.
+ const unsigned short* p = &polys[i*nvp*2];
+ it.bmin[0] = it.bmax[0] = verts[p[0]*3+0];
+ it.bmin[1] = it.bmax[1] = verts[p[0]*3+1];
+ it.bmin[2] = it.bmax[2] = verts[p[0]*3+2];
+
+ for (int j = 1; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ unsigned short x = verts[p[j]*3+0];
+ unsigned short y = verts[p[j]*3+1];
+ unsigned short z = verts[p[j]*3+2];
+
+ if (x < it.bmin[0]) it.bmin[0] = x;
+ if (y < it.bmin[1]) it.bmin[1] = y;
+ if (z < it.bmin[2]) it.bmin[2] = z;
+
+ if (x > it.bmax[0]) it.bmax[0] = x;
+ if (y > it.bmax[1]) it.bmax[1] = y;
+ if (z > it.bmax[2]) it.bmax[2] = z;
+ }
+ // Remap y
+ it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs);
+ it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs);
+ }
+
+ int curNode = 0;
+ subdivide(items, npolys, 0, npolys, curNode, nodes);
+
+ delete [] items;
+
+ return curNode;
+}
+
+
+bool dtCreateNavMeshData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const float* bmin, const float* bmax, float cs, float ch,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ unsigned char** outData, int* outDataSize)
+{
+ if (nvp > DT_STAT_VERTS_PER_POLYGON)
+ return false;
+ if (nverts >= 0xffff)
+ return false;
+
+ if (!nverts)
+ return false;
+ if (!npolys)
+ return false;
+ if (!dmeshes || !dverts || ! dtris)
+ return false;
+
+ // Find unique detail vertices.
+ int uniqueDetailVerts = 0;
+ if (dmeshes)
+ {
+ for (int i = 0; i < npolys; ++i)
+ {
+ const unsigned short* p = &polys[i*nvp*2];
+ int ndv = dmeshes[i*4+1];
+ int nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ nv++;
+ }
+ ndv -= nv;
+ uniqueDetailVerts += ndv;
+ }
+ }
+
+ // Calculate data size
+ const int headerSize = sizeof(dtStatNavMeshHeader);
+ const int vertsSize = sizeof(float)*3*nverts;
+ const int polysSize = sizeof(dtStatPoly)*npolys;
+ const int nodesSize = sizeof(dtStatBVNode)*npolys*2;
+ const int detailMeshesSize = sizeof(dtStatPolyDetail)*npolys;
+ const int detailVertsSize = sizeof(float)*3*uniqueDetailVerts;
+ const int detailTrisSize = sizeof(unsigned char)*4*ndtris;
+
+ const int dataSize = headerSize + vertsSize + polysSize + nodesSize +
+ detailMeshesSize + detailVertsSize + detailTrisSize;
+ unsigned char* data = new unsigned char[dataSize];
+ if (!data)
+ return false;
+ memset(data, 0, dataSize);
+
+ unsigned char* d = data;
+ dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)d; d += headerSize;
+ float* navVerts = (float*)d; d += vertsSize;
+ dtStatPoly* navPolys = (dtStatPoly*)d; d += polysSize;
+ dtStatBVNode* navNodes = (dtStatBVNode*)d; d += nodesSize;
+ dtStatPolyDetail* navDMeshes = (dtStatPolyDetail*)d; d += detailMeshesSize;
+ float* navDVerts = (float*)d; d += detailVertsSize;
+ unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize;
+
+ // Store header
+ header->magic = DT_STAT_NAVMESH_MAGIC;
+ header->version = DT_STAT_NAVMESH_VERSION;
+ header->npolys = npolys;
+ header->nverts = nverts;
+ header->cs = cs;
+ header->bmin[0] = bmin[0];
+ header->bmin[1] = bmin[1];
+ header->bmin[2] = bmin[2];
+ header->bmax[0] = bmax[0];
+ header->bmax[1] = bmax[1];
+ header->bmax[2] = bmax[2];
+ header->ndmeshes = dmeshes ? npolys : 0;
+ header->ndverts = dmeshes ? uniqueDetailVerts : 0;
+ header->ndtris = dmeshes ? ndtris : 0;
+
+ // Store vertices
+ for (int i = 0; i < nverts; ++i)
+ {
+ const unsigned short* iv = &verts[i*3];
+ float* v = &navVerts[i*3];
+ v[0] = bmin[0] + iv[0] * cs;
+ v[1] = bmin[1] + iv[1] * ch;
+ v[2] = bmin[2] + iv[2] * cs;
+ }
+
+ // Store polygons
+ const unsigned short* src = polys;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPoly* p = &navPolys[i];
+ p->nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (src[j] == 0xffff) break;
+ p->v[j] = src[j];
+ p->n[j] = src[nvp+j]+1;
+ p->nv++;
+ }
+ src += nvp*2;
+ }
+
+ header->nnodes = createBVTree(verts, nverts, polys, npolys, nvp,
+ cs, ch, npolys*2, navNodes);
+
+
+ // Store detail meshes and vertices.
+ // The nav polygon vertices are stored as the first vertices on each mesh.
+ // We compress the mesh data by skipping them and using the navmesh coordinates.
+ unsigned short vbase = 0;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyDetail& dtl = navDMeshes[i];
+ const int vb = dmeshes[i*4+0];
+ const int ndv = dmeshes[i*4+1];
+ const int nv = navPolys[i].nv;
+ dtl.vbase = vbase;
+ dtl.nverts = ndv-nv;
+ dtl.tbase = dmeshes[i*4+2];
+ dtl.ntris = dmeshes[i*4+3];
+ // Copy vertices except the first 'nv' verts which are equal to nav poly verts.
+ if (ndv-nv)
+ {
+ memcpy(&navDVerts[vbase*3], &dverts[(vb+nv)*3], sizeof(float)*3*(ndv-nv));
+ vbase += ndv-nv;
+ }
+ }
+ // Store triangles.
+ memcpy(navDTris, dtris, sizeof(unsigned char)*4*ndtris);
+
+ *outData = data;
+ *outDataSize = dataSize;
+
+ return true;
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp b/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp
new file mode 100644
index 00000000000..0813c7755cc
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp
@@ -0,0 +1,1428 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdio.h>
+#include "DetourTileNavMesh.h"
+#include "DetourNode.h"
+#include "DetourCommon.h"
+
+
+inline int opposite(int side) { return (side+2) & 0x3; }
+
+inline bool overlapBoxes(const float* amin, const float* amax,
+ const float* bmin, const float* bmax)
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap;
+ return overlap;
+}
+
+inline bool overlapRects(const float* amin, const float* amax,
+ const float* bmin, const float* bmax)
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ return overlap;
+}
+
+static void calcRect(const float* va, const float* vb,
+ float* bmin, float* bmax,
+ int side, float padx, float pady)
+{
+ if ((side&1) == 0)
+ {
+ bmin[0] = min(va[2],vb[2]) + padx;
+ bmin[1] = min(va[1],vb[1]) - pady;
+ bmax[0] = max(va[2],vb[2]) - padx;
+ bmax[1] = max(va[1],vb[1]) + pady;
+ }
+ else
+ {
+ bmin[0] = min(va[0],vb[0]) + padx;
+ bmin[1] = min(va[1],vb[1]) - pady;
+ bmax[0] = max(va[0],vb[0]) - padx;
+ bmax[1] = max(va[1],vb[1]) + pady;
+ }
+}
+
+inline int computeTileHash(int x, int y)
+{
+ const unsigned int h1 = 0x8da6b343; // Large multiplicative constants;
+ const unsigned int h2 = 0xd8163841; // here arbitrarily chosen primes
+ unsigned int n = h1 * x + h2 * y;
+ return (int)(n & (DT_TILE_LOOKUP_SIZE-1));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtTiledNavMesh::dtTiledNavMesh() :
+ m_tileSize(0),
+ m_portalHeight(0),
+ m_nextFree(0),
+ m_tmpLinks(0),
+ m_ntmpLinks(0),
+ m_nodePool(0),
+ m_openList(0)
+{
+}
+
+dtTiledNavMesh::~dtTiledNavMesh()
+{
+ for (int i = 0; i < DT_MAX_TILES; ++i)
+ {
+ if (m_tiles[i].data && m_tiles[i].dataSize < 0)
+ {
+ delete [] m_tiles[i].data;
+ m_tiles[i].data = 0;
+ m_tiles[i].dataSize = 0;
+ }
+ }
+ delete [] m_tmpLinks;
+ delete m_nodePool;
+ delete m_openList;
+}
+
+bool dtTiledNavMesh::init(const float* orig, float tileSize, float portalHeight)
+{
+ vcopy(m_orig, orig);
+ m_tileSize = tileSize;
+ m_portalHeight = portalHeight;
+
+ // Init tiles
+ memset(m_tiles, 0, sizeof(dtTile)*DT_MAX_TILES);
+ memset(m_posLookup, 0, sizeof(dtTile*)*DT_TILE_LOOKUP_SIZE);
+ m_nextFree = 0;
+ for (int i = DT_MAX_TILES-1; i >= 0; --i)
+ {
+ m_tiles[i].next = m_nextFree;
+ m_nextFree = &m_tiles[i];
+ }
+
+ if (!m_nodePool)
+ {
+ m_nodePool = new dtNodePool(2048, 256);
+ if (!m_nodePool)
+ return false;
+ }
+
+ if (!m_openList)
+ {
+ m_openList = new dtNodeQueue(2048);
+ if (!m_openList)
+ return false;
+ }
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+int dtTiledNavMesh::findConnectingPolys(const float* va, const float* vb,
+ dtTile* tile, int side,
+ dtTilePolyRef* con, float* conarea, int maxcon)
+{
+ if (!tile) return 0;
+ dtTileHeader* h = tile->header;
+
+ float amin[2], amax[2];
+ calcRect(va,vb, amin,amax, side, 0.01f, m_portalHeight);
+
+ // Remove links pointing to 'side' and compact the links array.
+ float bmin[2], bmax[2];
+ unsigned short m = 0x8000 | (unsigned short)side;
+ int n = 0;
+
+ dtTilePolyRef base = getTileId(tile);
+
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ // Skip edges which do not point to the right side.
+ if (poly->n[j] != m) continue;
+ // Check if the segments touch.
+ const float* vc = &h->verts[poly->v[j]*3];
+ const float* vd = &h->verts[poly->v[(j+1) % (int)poly->nv]*3];
+ calcRect(vc,vd, bmin,bmax, side, 0.01f, m_portalHeight);
+ if (!overlapRects(amin,amax, bmin,bmax)) continue;
+ // Add return value.
+ if (n < maxcon)
+ {
+ conarea[n*2+0] = max(amin[0], bmin[0]);
+ conarea[n*2+1] = min(amax[0], bmax[0]);
+ con[n] = base | (unsigned int)i;
+ n++;
+ }
+ break;
+ }
+ }
+ return n;
+}
+
+void dtTiledNavMesh::removeExtLinks(dtTile* tile, int side)
+{
+ if (!tile) return;
+ dtTileHeader* h = tile->header;
+
+ // Remove links pointing to 'side' and compact the links array.
+ dtTileLink* pool = m_tmpLinks;
+ int nlinks = 0;
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ int plinks = nlinks;
+ int nplinks = 0;
+ for (int j = 0; j < poly->nlinks; ++j)
+ {
+ dtTileLink* link = &h->links[poly->links+j];
+ if ((int)link->side != side)
+ {
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* dst = &pool[nlinks++];
+ memcpy(dst, link, sizeof(dtTileLink));
+ nplinks++;
+ }
+ }
+ }
+ poly->links = plinks;
+ poly->nlinks = nplinks;
+ }
+ h->nlinks = nlinks;
+ if (h->nlinks)
+ memcpy(h->links, m_tmpLinks, sizeof(dtTileLink)*nlinks);
+}
+
+void dtTiledNavMesh::buildExtLinks(dtTile* tile, dtTile* target, int side)
+{
+ if (!tile) return;
+ dtTileHeader* h = tile->header;
+
+ // Remove links pointing to 'side' and compact the links array.
+ dtTileLink* pool = m_tmpLinks;
+ int nlinks = 0;
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ int plinks = nlinks;
+ int nplinks = 0;
+ // Copy internal and other external links.
+ for (int j = 0; j < poly->nlinks; ++j)
+ {
+ dtTileLink* link = &h->links[poly->links+j];
+ if ((int)link->side != side)
+ {
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* dst = &pool[nlinks++];
+ memcpy(dst, link, sizeof(dtTileLink));
+ nplinks++;
+ }
+ }
+ }
+ // Create new links.
+ unsigned short m = 0x8000 | (unsigned short)side;
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ // Skip edges which do not point to the right side.
+ if (poly->n[j] != m) continue;
+
+ // Create new links
+ const float* va = &h->verts[poly->v[j]*3];
+ const float* vb = &h->verts[poly->v[(j+1)%(int)poly->nv]*3];
+ dtTilePolyRef nei[4];
+ float neia[4*2];
+ int nnei = findConnectingPolys(va,vb, target, opposite(side), nei,neia,4);
+ for (int k = 0; k < nnei; ++k)
+ {
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* link = &pool[nlinks++];
+ link->ref = nei[k];
+ link->p = (unsigned short)i;
+ link->e = (unsigned char)j;
+ link->side = (unsigned char)side;
+
+ // Compress portal limits to a byte value.
+ if (side == 0 || side == 2)
+ {
+ const float lmin = min(va[2], vb[2]);
+ const float lmax = max(va[2], vb[2]);
+ link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ }
+ else
+ {
+ const float lmin = min(va[0], vb[0]);
+ const float lmax = max(va[0], vb[0]);
+ link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ }
+ nplinks++;
+ }
+ }
+ }
+
+ poly->links = plinks;
+ poly->nlinks = nplinks;
+ }
+ h->nlinks = nlinks;
+ if (h->nlinks)
+ memcpy(h->links, m_tmpLinks, sizeof(dtTileLink)*nlinks);
+}
+
+void dtTiledNavMesh::buildIntLinks(dtTile* tile)
+{
+ if (!tile) return;
+ dtTileHeader* h = tile->header;
+
+ dtTilePolyRef base = getTileId(tile);
+ dtTileLink* pool = h->links;
+ int nlinks = 0;
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ poly->links = nlinks;
+ poly->nlinks = 0;
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ // Skip hard and non-internal edges.
+ if (poly->n[j] == 0 || (poly->n[j] & 0x8000)) continue;
+
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* link = &pool[nlinks++];
+ link->ref = base | (unsigned int)(poly->n[j]-1);
+ link->p = (unsigned short)i;
+ link->e = (unsigned char)j;
+ link->side = 0xff;
+ link->bmin = link->bmax = 0;
+ poly->nlinks++;
+ }
+ }
+ }
+ h->nlinks = nlinks;
+}
+
+bool dtTiledNavMesh::addTileAt(int x, int y, unsigned char* data, int dataSize, bool ownsData)
+{
+ if (getTileAt(x,y))
+ return false;
+ // Make sure there is enough space for new tile.
+ if (!m_nextFree)
+ return false;
+ // Make sure the data is in right format.
+ dtTileHeader* header = (dtTileHeader*)data;
+ if (header->magic != DT_TILE_NAVMESH_MAGIC)
+ return false;
+ if (header->version != DT_TILE_NAVMESH_VERSION)
+ return false;
+
+ // Make sure the tmp link array is large enough.
+ if (header->maxlinks > m_ntmpLinks)
+ {
+ m_ntmpLinks = header->maxlinks;
+ delete [] m_tmpLinks;
+ m_tmpLinks = 0;
+ m_tmpLinks = new dtTileLink[m_ntmpLinks];
+ }
+ if (!m_tmpLinks)
+ return false;
+
+ // Allocate a tile.
+ dtTile* tile = m_nextFree;
+ m_nextFree = tile->next;
+ tile->next = 0;
+
+ // Insert tile into the position lut.
+ int h = computeTileHash(x,y);
+ tile->next = m_posLookup[h];
+ m_posLookup[h] = tile;
+
+ // Patch header pointers.
+ const int headerSize = sizeof(dtTileHeader);
+ const int vertsSize = sizeof(float)*3*header->nverts;
+ const int polysSize = sizeof(dtTilePoly)*header->npolys;
+ const int linksSize = sizeof(dtTileLink)*(header->maxlinks);
+ const int detailMeshesSize = sizeof(dtTilePolyDetail)*header->ndmeshes;
+ const int detailVertsSize = sizeof(float)*3*header->ndverts;
+ const int detailTrisSize = sizeof(unsigned char)*4*header->ndtris;
+
+ unsigned char* d = data + headerSize;
+ header->verts = (float*)d; d += vertsSize;
+ header->polys = (dtTilePoly*)d; d += polysSize;
+ header->links = (dtTileLink*)d; d += linksSize;
+ header->dmeshes = (dtTilePolyDetail*)d; d += detailMeshesSize;
+ header->dverts = (float*)d; d += detailVertsSize;
+ header->dtris = (unsigned char*)d; d += detailTrisSize;
+
+ // Init tile.
+ tile->header = header;
+ tile->x = x;
+ tile->y = y;
+ tile->data = data;
+ tile->dataSize = dataSize;
+ tile->ownsData = ownsData;
+
+ buildIntLinks(tile);
+
+ // Create connections connections.
+ for (int i = 0; i < 4; ++i)
+ {
+ dtTile* nei = getNeighbourTileAt(x,y,i);
+ if (nei)
+ {
+ buildExtLinks(tile, nei, i);
+ buildExtLinks(nei, tile, opposite(i));
+ }
+ }
+
+ return true;
+}
+
+dtTile* dtTiledNavMesh::getTileAt(int x, int y)
+{
+ // Find tile based on hash.
+ int h = computeTileHash(x,y);
+ dtTile* tile = m_posLookup[h];
+ while (tile)
+ {
+ if (tile->x == x && tile->y == y)
+ return tile;
+ tile = tile->next;
+ }
+ return 0;
+}
+
+dtTile* dtTiledNavMesh::getTile(int i)
+{
+ return &m_tiles[i];
+}
+
+const dtTile* dtTiledNavMesh::getTile(int i) const
+{
+ return &m_tiles[i];
+}
+
+dtTile* dtTiledNavMesh::getNeighbourTileAt(int x, int y, int side)
+{
+ switch (side)
+ {
+ case 0: x++; break;
+ case 1: y++; break;
+ case 2: x--; break;
+ case 3: y--; break;
+ };
+ return getTileAt(x,y);
+}
+
+bool dtTiledNavMesh::removeTileAt(int x, int y, unsigned char** data, int* dataSize)
+{
+ // Remove tile from hash lookup.
+ int h = computeTileHash(x,y);
+ dtTile* prev = 0;
+ dtTile* tile = m_posLookup[h];
+ while (tile)
+ {
+ if (tile->x == x && tile->y == y)
+ {
+ if (prev)
+ prev->next = tile->next;
+ else
+ m_posLookup[h] = tile->next;
+ break;
+ }
+ prev = tile;
+ tile = tile->next;
+ }
+ if (!tile)
+ return false;
+
+ // Remove connections to neighbour tiles.
+ for (int i = 0; i < 4; ++i)
+ {
+ dtTile* nei = getNeighbourTileAt(x,y,i);
+ if (!nei) continue;
+ removeExtLinks(nei, opposite(i));
+ }
+
+
+ // Reset tile.
+ if (tile->ownsData)
+ {
+ // Owns data
+ delete [] tile->data;
+ tile->data = 0;
+ tile->dataSize = 0;
+ if (data) *data = 0;
+ if (dataSize) *dataSize = 0;
+ }
+ else
+ {
+ if (data) *data = tile->data;
+ if (dataSize) *dataSize = tile->dataSize;
+ }
+ tile->header = 0;
+ tile->x = tile->y = 0;
+ tile->salt++;
+
+ // Add to free list.
+ tile->next = m_nextFree;
+ m_nextFree = tile;
+
+ return true;
+}
+
+
+
+bool dtTiledNavMesh::closestPointToPoly(dtTilePolyRef ref, const float* pos, float* closest) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return false;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
+ const dtTileHeader* header = m_tiles[it].header;
+
+ if (ip >= (unsigned int)header->npolys) return false;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ float closestDistSqr = FLT_MAX;
+ const dtTilePolyDetail* pd = &header->dmeshes[ip];
+
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = &header->dtris[(pd->tbase+j)*4];
+ const float* v[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ if (t[k] < poly->nv)
+ v[k] = &header->verts[poly->v[t[k]]*3];
+ else
+ v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3];
+ }
+ float pt[3];
+ closestPtPointTriangle(pt, pos, v[0], v[1], v[2]);
+ float d = vdistSqr(pos, pt);
+ if (d < closestDistSqr)
+ {
+ vcopy(closest, pt);
+ closestDistSqr = d;
+ }
+ }
+
+ return true;
+}
+
+bool dtTiledNavMesh::getPolyHeight(dtTilePolyRef ref, const float* pos, float* height) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return false;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
+ const dtTileHeader* header = m_tiles[it].header;
+
+ if (ip >= (unsigned int)header->npolys) return false;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ const dtTilePolyDetail* pd = &header->dmeshes[ip];
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = &header->dtris[(pd->tbase+j)*4];
+ const float* v[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ if (t[k] < poly->nv)
+ v[k] = &header->verts[poly->v[t[k]]*3];
+ else
+ v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3];
+ }
+ float h;
+ if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h))
+ {
+ if (height)
+ *height = h;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+dtTilePolyRef dtTiledNavMesh::findNearestPoly(const float* center, const float* extents)
+{
+ // Get nearby polygons from proximity grid.
+ dtTilePolyRef polys[128];
+ int npolys = queryPolygons(center, extents, polys, 128);
+
+ // Find nearest polygon amongst the nearby polygons.
+ dtTilePolyRef nearest = 0;
+ float nearestDistanceSqr = FLT_MAX;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePolyRef ref = polys[i];
+ float closest[3];
+ if (!closestPointToPoly(ref, center, closest))
+ continue;
+ float d = vdistSqr(center, closest);
+ if (d < nearestDistanceSqr)
+ {
+ nearestDistanceSqr = d;
+ nearest = ref;
+ }
+ }
+
+ return nearest;
+}
+
+dtTilePolyRef dtTiledNavMesh::getTileId(dtTile* tile)
+{
+ if (!tile) return 0;
+ const unsigned int it = tile - m_tiles;
+ return dtEncodeTileId(tile->salt, it, 0);
+}
+
+int dtTiledNavMesh::queryTilePolygons(dtTile* tile,
+ const float* qmin, const float* qmax,
+ dtTilePolyRef* polys, const int maxPolys)
+{
+ float bmin[3], bmax[3];
+ const dtTileHeader* header = tile->header;
+ int n = 0;
+ dtTilePolyRef base = getTileId(tile);
+ for (int i = 0; i < header->npolys; ++i)
+ {
+ // Calc polygon bounds.
+ dtTilePoly* p = &header->polys[i];
+ const float* v = &header->verts[p->v[0]*3];
+ vcopy(bmin, v);
+ vcopy(bmax, v);
+ for (int j = 1; j < p->nv; ++j)
+ {
+ v = &header->verts[p->v[j]*3];
+ vmin(bmin, v);
+ vmax(bmax, v);
+ }
+ if (overlapBoxes(qmin,qmax, bmin,bmax))
+ {
+ if (n < maxPolys)
+ polys[n++] = base | (dtTilePolyRef)i;
+ }
+ }
+ return n;
+}
+
+int dtTiledNavMesh::queryPolygons(const float* center, const float* extents,
+ dtTilePolyRef* polys, const int maxPolys)
+{
+ float bmin[3], bmax[3];
+ bmin[0] = center[0] - extents[0];
+ bmin[1] = center[1] - extents[1];
+ bmin[2] = center[2] - extents[2];
+
+ bmax[0] = center[0] + extents[0];
+ bmax[1] = center[1] + extents[1];
+ bmax[2] = center[2] + extents[2];
+
+ // Find tiles the query touches.
+ const int minx = (int)floorf((bmin[0]-m_orig[0]) / m_tileSize);
+ const int maxx = (int)ceilf((bmax[0]-m_orig[0]) / m_tileSize);
+
+ const int miny = (int)floorf((bmin[2]-m_orig[2]) / m_tileSize);
+ const int maxy = (int)ceilf((bmax[2]-m_orig[2]) / m_tileSize);
+
+ int n = 0;
+ for (int y = miny; y < maxy; ++y)
+ {
+ for (int x = minx; x < maxx; ++x)
+ {
+ dtTile* tile = getTileAt(x,y);
+ if (!tile) continue;
+ n += queryTilePolygons(tile, bmin, bmax, polys+n, maxPolys-n);
+ if (n >= maxPolys) return n;
+ }
+ }
+
+ return n;
+}
+
+int dtTiledNavMesh::findPath(dtTilePolyRef startRef, dtTilePolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtTilePolyRef* path, const int maxPathSize)
+{
+ if (!startRef || !endRef)
+ return 0;
+
+ if (!maxPathSize)
+ return 0;
+
+ if (!getPolyByRef(startRef) || !getPolyByRef(endRef))
+ return 0;
+
+ if (startRef == endRef)
+ {
+ path[0] = startRef;
+ return 1;
+ }
+
+ if (!m_nodePool || !m_openList)
+ return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ static const float H_SCALE = 1.1f; // Heuristic scale.
+
+ dtNode* startNode = m_nodePool->getNode(startRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = vdist(startPos, endPos) * H_SCALE;
+ startNode->id = startRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ dtNode* lastBestNode = startNode;
+ float lastBestNodeCost = startNode->total;
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ if (bestNode->id == endRef)
+ {
+ lastBestNode = bestNode;
+ break;
+ }
+
+ // Get poly and tile.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(bestNode->id, salt, it, ip);
+ // The API input has been cheked already, skip checking internal data.
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ dtTilePolyRef neighbour = header->links[poly->links+i].ref;
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Calculate cost.
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, startPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.cost = parent->cost + vdist(p0,p1);
+ // Special case for last node.
+ if (newNode.id == endRef)
+ newNode.cost += vdist(p1, endPos);
+
+ // Heuristic
+ const float h = vdist(p1,endPos)*H_SCALE;
+ newNode.total = newNode.cost + h;
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->cost = newNode.cost;
+ actualNode->total = newNode.total;
+
+ if (h < lastBestNodeCost)
+ {
+ lastBestNodeCost = h;
+ lastBestNode = actualNode;
+ }
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+ }
+
+ // Reverse the path.
+ dtNode* prev = 0;
+ dtNode* node = lastBestNode;
+ do
+ {
+ dtNode* next = m_nodePool->getNodeAtIdx(node->pidx);
+ node->pidx = m_nodePool->getNodeIdx(prev);
+ prev = node;
+ node = next;
+ }
+ while (node);
+
+ // Store path
+ node = prev;
+ int n = 0;
+ do
+ {
+ path[n++] = node->id;
+ node = m_nodePool->getNodeAtIdx(node->pidx);
+ }
+ while (node && n < maxPathSize);
+
+ return n;
+}
+
+int dtTiledNavMesh::findStraightPath(const float* startPos, const float* endPos,
+ const dtTilePolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize)
+{
+ if (!maxStraightPathSize)
+ return 0;
+
+ if (!path[0])
+ return 0;
+
+ int straightPathSize = 0;
+
+ float closestStartPos[3];
+ if (!closestPointToPoly(path[0], startPos, closestStartPos))
+ return 0;
+
+ // Add start point.
+ vcopy(&straightPath[straightPathSize*3], closestStartPos);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+
+ float closestEndPos[3];
+ if (!closestPointToPoly(path[pathSize-1], endPos, closestEndPos))
+ return 0;
+
+ float portalApex[3], portalLeft[3], portalRight[3];
+
+ if (pathSize > 1)
+ {
+ vcopy(portalApex, closestStartPos);
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ int apexIndex = 0;
+ int leftIndex = 0;
+ int rightIndex = 0;
+
+ for (int i = 0; i < pathSize; ++i)
+ {
+ float left[3], right[3];
+ if (i < pathSize-1)
+ {
+ // Next portal.
+ if (!getPortalPoints(path[i], path[i+1], left, right))
+ {
+ if (!closestPointToPoly(path[i], endPos, closestEndPos))
+ return 0;
+ vcopy(&straightPath[straightPathSize*3], closestEndPos);
+ straightPathSize++;
+ return straightPathSize;
+ }
+ }
+ else
+ {
+ // End of the path.
+ vcopy(left, closestEndPos);
+ vcopy(right, closestEndPos);
+ }
+
+ // Right vertex.
+ if (vequal(portalApex, portalRight))
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalRight, right) <= 0.0f)
+ {
+ if (triArea2D(portalApex, portalLeft, right) > 0.0f)
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalLeft);
+ apexIndex = leftIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+
+ // Left vertex.
+ if (vequal(portalApex, portalLeft))
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalLeft, left) >= 0.0f)
+ {
+ if (triArea2D(portalApex, portalRight, left) < 0.0f)
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalRight);
+ apexIndex = rightIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ // Add end point.
+ vcopy(&straightPath[straightPathSize*3], closestEndPos);
+ straightPathSize++;
+
+ return straightPathSize;
+}
+
+// Returns portal points between two polygons.
+bool dtTiledNavMesh::getPortalPoints(dtTilePolyRef from, dtTilePolyRef to, float* left, float* right) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(from, salt, it, ip);
+ if (it >= DT_MAX_TILES) return false;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return false;
+ const dtTileHeader* fromHeader = m_tiles[it].header;
+ const dtTilePoly* fromPoly = &fromHeader->polys[ip];
+
+ for (int i = 0; i < fromPoly->nlinks; ++i)
+ {
+ const dtTileLink* link = &fromHeader->links[fromPoly->links+i];
+ if (link->ref == to)
+ {
+ // Find portal vertices.
+ const int v0 = fromPoly->v[link->e];
+ const int v1 = fromPoly->v[(link->e+1) % fromPoly->nv];
+ vcopy(left, &fromHeader->verts[v0*3]);
+ vcopy(right, &fromHeader->verts[v1*3]);
+ // If the link is at tile boundary, clamp the vertices to
+ // the link width.
+ if (link->side == 0 || link->side == 2)
+ {
+ // Unpack portal limits.
+ const float smin = min(left[2],right[2]);
+ const float smax = max(left[2],right[2]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ left[2] = max(left[2],lmin);
+ left[2] = min(left[2],lmax);
+ right[2] = max(right[2],lmin);
+ right[2] = min(right[2],lmax);
+ }
+ else if (link->side == 1 || link->side == 3)
+ {
+ // Unpack portal limits.
+ const float smin = min(left[0],right[0]);
+ const float smax = max(left[0],right[0]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ left[0] = max(left[0],lmin);
+ left[0] = min(left[0],lmax);
+ right[0] = max(right[0],lmin);
+ right[0] = min(right[0],lmax);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+// Returns edge mid point between two polygons.
+bool dtTiledNavMesh::getEdgeMidPoint(dtTilePolyRef from, dtTilePolyRef to, float* mid) const
+{
+ float left[3], right[3];
+ if (!getPortalPoints(from, to, left,right)) return false;
+ mid[0] = (left[0]+right[0])*0.5f;
+ mid[1] = (left[1]+right[1])*0.5f;
+ mid[2] = (left[2]+right[2])*0.5f;
+ return true;
+}
+
+int dtTiledNavMesh::raycast(dtTilePolyRef centerRef, const float* startPos, const float* endPos,
+ float& t, dtTilePolyRef* path, const int pathSize)
+{
+ t = 0;
+
+ if (!centerRef || !getPolyByRef(centerRef))
+ return 0;
+
+ dtTilePolyRef curRef = centerRef;
+ float verts[DT_TILE_VERTS_PER_POLYGON*3];
+ int n = 0;
+
+ while (curRef)
+ {
+ // Cast ray against current polygon.
+
+ // The API input has been cheked already, skip checking internal data.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(curRef, salt, it, ip);
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ // Collect vertices.
+ int nv = 0;
+ for (int i = 0; i < (int)poly->nv; ++i)
+ {
+ vcopy(&verts[nv*3], &header->verts[poly->v[i]*3]);
+ nv++;
+ }
+ if (nv < 3)
+ {
+ // Hit bad polygon, report hit.
+ return n;
+ }
+
+ float tmin, tmax;
+ int segMin, segMax;
+ if (!intersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax))
+ {
+ // Could not hit the polygon, keep the old t and report hit.
+ return n;
+ }
+ // Keep track of furthest t so far.
+ if (tmax > t)
+ t = tmax;
+
+ if (n < pathSize)
+ path[n++] = curRef;
+
+ // Follow neighbours.
+ dtTilePolyRef nextRef = 0;
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ if ((int)link->e == segMax)
+ {
+ // If the link is internal, just return the ref.
+ if (link->side == 0xff)
+ {
+ nextRef = link->ref;
+ break;
+ }
+
+ // If the link is at tile boundary,
+ const int v0 = poly->v[link->e];
+ const int v1 = poly->v[(link->e+1) % poly->nv];
+ const float* left = &header->verts[v0*3];
+ const float* right = &header->verts[v1*3];
+
+ // Check that the intersection lies inside the link portal.
+ if (link->side == 0 || link->side == 2)
+ {
+ // Calculate link size.
+ const float smin = min(left[2],right[2]);
+ const float smax = max(left[2],right[2]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ // Find Z intersection.
+ float z = startPos[2] + (endPos[2]-startPos[2])*tmax;
+ if (z >= lmin && z <= lmax)
+ {
+ nextRef = link->ref;
+ break;
+ }
+ }
+ else if (link->side == 1 || link->side == 3)
+ {
+ // Calculate link size.
+ const float smin = min(left[0],right[0]);
+ const float smax = max(left[0],right[0]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ // Find X intersection.
+ float x = startPos[0] + (endPos[0]-startPos[0])*tmax;
+ if (x >= lmin && x <= lmax)
+ {
+ nextRef = link->ref;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!nextRef)
+ {
+ // No neighbour, we hit a wall.
+ return n;
+ }
+
+ // No hit, advance to neighbour polygon.
+ curRef = nextRef;
+ }
+
+ return n;
+}
+
+int dtTiledNavMesh::findPolysAround(dtTilePolyRef centerRef, const float* centerPos, float radius,
+ dtTilePolyRef* resultRef, dtTilePolyRef* resultParent, float* resultCost,
+ const int maxResult)
+{
+ if (!centerRef) return 0;
+ if (!getPolyByRef(centerRef)) return 0;
+ if (!m_nodePool || !m_openList) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ int n = 0;
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = startNode->id;
+ if (resultParent)
+ resultParent[n] = 0;
+ if (resultCost)
+ resultCost[n] = 0;
+ ++n;
+ }
+
+ const float radiusSqr = sqr(radius);
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ // Get poly and tile.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(bestNode->id, salt, it, ip);
+ // The API input has been cheked already, skip checking internal data.
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ dtTilePolyRef neighbour = link->ref;
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* va = &header->verts[poly->v[link->e]*3];
+ const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3];
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg);
+
+ // If the circle is not touching the next polygon, skip it.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Cost
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = actualNode->id;
+ if (resultParent)
+ resultParent[n] = m_nodePool->getNodeAtIdx(actualNode->pidx)->id;
+ if (resultCost)
+ resultCost[n] = actualNode->total;
+ ++n;
+ }
+ actualNode->flags = DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ }
+
+ return n;
+}
+
+float dtTiledNavMesh::findDistanceToWall(dtTilePolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal)
+{
+ if (!centerRef) return 0;
+ if (!getPolyByRef(centerRef)) return 0;
+ if (!m_nodePool || !m_openList) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ float radiusSqr = sqr(maxRadius);
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ // Get poly and tile.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(bestNode->id, salt, it, ip);
+ // The API input has been cheked already, skip checking internal data.
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ // Hit test walls.
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ // Skip non-solid edges.
+ if (poly->n[j] & 0x8000)
+ {
+ // Tile border.
+ bool solid = true;
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ if (link->e == j && link->ref != 0)
+ {
+ solid = false;
+ break;
+ }
+ }
+ if (!solid) continue;
+ }
+ else if (poly->n[j])
+ {
+ // Internal edge
+ continue;
+ }
+
+ // Calc distance to the edge.
+ const float* vj = &header->verts[poly->v[j]*3];
+ const float* vi = &header->verts[poly->v[i]*3];
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // Edge is too far, skip.
+ if (distSqr > radiusSqr)
+ continue;
+
+ // Hit wall, update radius.
+ radiusSqr = distSqr;
+ // Calculate hit pos.
+ hitPos[0] = vj[0] + (vi[0] - vj[0])*tseg;
+ hitPos[1] = vj[1] + (vi[1] - vj[1])*tseg;
+ hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg;
+ }
+
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ dtTilePolyRef neighbour = link->ref;
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* va = &header->verts[poly->v[link->e]*3];
+ const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3];
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg);
+
+ // If the circle is not touching the next polygon, skip it.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags = DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ }
+
+ // Calc hit normal.
+ vsub(hitNormal, centerPos, hitPos);
+ vnormalize(hitNormal);
+
+ return sqrtf(radiusSqr);
+}
+
+const dtTilePoly* dtTiledNavMesh::getPolyByRef(dtTilePolyRef ref) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return 0;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0;
+ return &m_tiles[it].header->polys[ip];
+}
+
+const float* dtTiledNavMesh::getPolyVertsByRef(dtTilePolyRef ref) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return 0;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0;
+ return m_tiles[it].header->verts;
+}
+
+const dtTileLink* dtTiledNavMesh::getPolyLinksByRef(dtTilePolyRef ref) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return 0;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0;
+ return m_tiles[it].header->links;
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp b/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp
new file mode 100644
index 00000000000..95dd34b04f6
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp
@@ -0,0 +1,213 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "DetourTileNavMesh.h"
+#include "DetourCommon.h"
+
+bool dtCreateNavMeshTileData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ const float* bmin, const float* bmax, float cs, float ch, int tileSize, int walkableClimb,
+ unsigned char** outData, int* outDataSize)
+{
+ if (nvp != DT_TILE_VERTS_PER_POLYGON)
+ return false;
+ if (nverts >= 0xffff)
+ return false;
+
+ if (!nverts)
+ return false;
+ if (!npolys)
+ return false;
+ if (!dmeshes || !dverts || ! dtris)
+ return false;
+
+ // Find portal edges which are at tile borders.
+ int nedges = 0;
+ int nportals = 0;
+ for (int i = 0; i < npolys; ++i)
+ {
+ const unsigned short* p = &polys[i*2*nvp];
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ int nj = j+1;
+ if (nj >= nvp || p[nj] == 0xffff) nj = 0;
+ const unsigned short* va = &verts[p[j]*3];
+ const unsigned short* vb = &verts[p[nj]*3];
+
+ nedges++;
+
+ if (va[0] == tileSize && vb[0] == tileSize)
+ nportals++; // x+
+ else if (va[2] == tileSize && vb[2] == tileSize)
+ nportals++; // z+
+ else if (va[0] == 0 && vb[0] == 0)
+ nportals++; // x-
+ else if (va[2] == 0 && vb[2] == 0)
+ nportals++; // z-
+ }
+ }
+
+ const int maxLinks = nedges + nportals*2;
+
+
+ // Find unique detail vertices.
+ int uniqueDetailVerts = 0;
+ if (dmeshes)
+ {
+ for (int i = 0; i < npolys; ++i)
+ {
+ const unsigned short* p = &polys[i*nvp*2];
+ int ndv = dmeshes[i*4+1];
+ int nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ nv++;
+ }
+ ndv -= nv;
+ uniqueDetailVerts += ndv;
+ }
+ }
+
+ // Calculate data size
+ const int headerSize = sizeof(dtTileHeader);
+ const int vertsSize = sizeof(float)*3*nverts;
+ const int polysSize = sizeof(dtTilePoly)*npolys;
+ const int linksSize = sizeof(dtTileLink)*maxLinks;
+ const int detailMeshesSize = sizeof(dtTilePolyDetail)*npolys;
+ const int detailVertsSize = sizeof(float)*3*uniqueDetailVerts;
+ const int detailTrisSize = sizeof(unsigned char)*4*ndtris;
+
+ const int dataSize = headerSize + vertsSize + polysSize + linksSize +
+ detailMeshesSize + detailVertsSize + detailTrisSize;
+ unsigned char* data = new unsigned char[dataSize];
+ if (!data)
+ return false;
+ memset(data, 0, dataSize);
+
+ unsigned char* d = data;
+ dtTileHeader* header = (dtTileHeader*)d; d += headerSize;
+ float* navVerts = (float*)d; d += vertsSize;
+ dtTilePoly* navPolys = (dtTilePoly*)d; d += polysSize;
+ d += linksSize;
+ dtTilePolyDetail* navDMeshes = (dtTilePolyDetail*)d; d += detailMeshesSize;
+ float* navDVerts = (float*)d; d += detailVertsSize;
+ unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize;
+
+
+ // Store header
+ header->magic = DT_TILE_NAVMESH_MAGIC;
+ header->version = DT_TILE_NAVMESH_VERSION;
+ header->npolys = npolys;
+ header->nverts = nverts;
+ header->maxlinks = maxLinks;
+ header->bmin[0] = bmin[0];
+ header->bmin[1] = bmin[1];
+ header->bmin[2] = bmin[2];
+ header->bmax[0] = bmax[0];
+ header->bmax[1] = bmax[1];
+ header->bmax[2] = bmax[2];
+ header->ndmeshes = npolys;
+ header->ndverts = uniqueDetailVerts;
+ header->ndtris = ndtris;
+
+ // Store vertices
+ for (int i = 0; i < nverts; ++i)
+ {
+ const unsigned short* iv = &verts[i*3];
+ float* v = &navVerts[i*3];
+ v[0] = bmin[0] + iv[0] * cs;
+ v[1] = bmin[1] + iv[1] * ch;
+ v[2] = bmin[2] + iv[2] * cs;
+ }
+
+ // Store polygons
+ const unsigned short* src = polys;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePoly* p = &navPolys[i];
+ p->nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (src[j] == 0xffff) break;
+ p->v[j] = src[j];
+ p->n[j] = (src[nvp+j]+1) & 0xffff;
+ p->nv++;
+ }
+ src += nvp*2;
+ }
+
+ // Store portal edges.
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePoly* poly = &navPolys[i];
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ int nj = j+1;
+ if (nj >= poly->nv) nj = 0;
+
+ const unsigned short* va = &verts[poly->v[j]*3];
+ const unsigned short* vb = &verts[poly->v[nj]*3];
+
+ if (va[0] == tileSize && vb[0] == tileSize) // x+
+ poly->n[j] = 0x8000 | 0;
+ else if (va[2] == tileSize && vb[2] == tileSize) // z+
+ poly->n[j] = 0x8000 | 1;
+ else if (va[0] == 0 && vb[0] == 0) // x-
+ poly->n[j] = 0x8000 | 2;
+ else if (va[2] == 0 && vb[2] == 0) // z-
+ poly->n[j] = 0x8000 | 3;
+ }
+ }
+
+ // Store detail meshes and vertices.
+ // The nav polygon vertices are stored as the first vertices on each mesh.
+ // We compress the mesh data by skipping them and using the navmesh coordinates.
+ unsigned short vbase = 0;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePolyDetail& dtl = navDMeshes[i];
+ const int vb = dmeshes[i*4+0];
+ const int ndv = dmeshes[i*4+1];
+ const int nv = navPolys[i].nv;
+ dtl.vbase = vbase;
+ dtl.nverts = ndv-nv;
+ dtl.tbase = dmeshes[i*4+2];
+ dtl.ntris = dmeshes[i*4+3];
+ // Copy vertices except the first 'nv' verts which are equal to nav poly verts.
+ if (ndv-nv)
+ {
+ memcpy(&navDVerts[vbase*3], &dverts[(vb+nv)*3], sizeof(float)*3*(ndv-nv));
+ vbase += ndv-nv;
+ }
+ }
+ // Store triangles.
+ memcpy(navDTris, dtris, sizeof(unsigned char)*4*ndtris);
+
+ *outData = data;
+ *outDataSize = dataSize;
+
+ return true;
+}
diff --git a/extern/recastnavigation/License.txt b/extern/recastnavigation/License.txt
new file mode 100644
index 00000000000..95f4bfc9654
--- /dev/null
+++ b/extern/recastnavigation/License.txt
@@ -0,0 +1,18 @@
+Copyright (c) 2009 Mikko Mononen memon@inside.org
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
diff --git a/extern/recastnavigation/Readme.txt b/extern/recastnavigation/Readme.txt
new file mode 100644
index 00000000000..0c2f7b1675f
--- /dev/null
+++ b/extern/recastnavigation/Readme.txt
@@ -0,0 +1,120 @@
+
+Recast & Detour Version 1.4
+
+
+Recast
+
+Recast is state of the art navigation mesh construction toolset for games.
+
+ * It is automatic, which means that you can throw any level geometry
+ at it and you will get robust mesh out
+ * It is fast which means swift turnaround times for level designers
+ * It is open source so it comes with full source and you can
+ customize it to your hearts content.
+
+The Recast process starts with constructing a voxel mold from a level geometry
+and then casting a navigation mesh over it. The process consists of three steps,
+building the voxel mold, partitioning the mold into simple regions, peeling off
+the regions as simple polygons.
+
+ 1. The voxel mold is build from the input triangle mesh by rasterizing
+ the triangles into a multi-layer heightfield. Some simple filters are
+ then applied to the mold to prune out locations where the character
+ would not be able to move.
+ 2. The walkable areas described by the mold are divided into simple
+ overlayed 2D regions. The resulting regions have only one non-overlapping
+ contour, which simplifies the final step of the process tremendously.
+ 3. The navigation polygons are peeled off from the regions by first tracing
+ the boundaries and then simplifying them. The resulting polygons are
+ finally converted to convex polygons which makes them perfect for
+ pathfinding and spatial reasoning about the level.
+
+The toolset code is located in the Recast folder and demo application using the Recast
+toolset is located in the RecastDemo folder.
+
+The project files with this distribution can be compiled with Microsoft Visual C++ 2008
+(you can download it for free) and XCode 3.1.
+
+
+Detour
+
+Recast is accompanied with Detour, path-finding and spatial reasoning toolkit. You can use any navigation mesh with Detour, but of course the data generated with Recast fits perfectly.
+
+Detour offers simple static navigation mesh which is suitable for many simple cases, as well as tiled navigation mesh which allows you to plug in and out pieces of the mesh. The tiled mesh allows to create systems where you stream new navigation data in and out as the player progresses the level, or you may regenerate tiles as the world changes.
+
+
+Latest code available at http://code.google.com/p/recastnavigation/
+
+
+--
+
+Release Notes
+
+----------------
+* Recast 1.4
+ Released August 24th, 2009
+
+- Added detail height mesh generation (RecastDetailMesh.cpp) for single,
+ tiled statmeshes as well as tilemesh.
+- Added feature to contour tracing which detects extra vertices along
+ tile edges which should be removed later.
+- Changed the tiled stat mesh preprocess, so that it first generated
+ polymeshes per tile and finally combines them.
+- Fixed bug in the GUI code where invisible buttons could be pressed.
+
+----------------
+* Recast 1.31
+ Released July 24th, 2009
+
+- Better cost and heuristic functions.
+- Fixed tile navmesh raycast on tile borders.
+
+----------------
+* Recast 1.3
+ Released July 14th, 2009
+
+- Added dtTileNavMesh which allows to dynamically add and remove navmesh pieces at runtime.
+- Renamed stat navmesh types to dtStat* (i.e. dtPoly is now dtStatPoly).
+- Moved common code used by tile and stat navmesh to DetourNode.h/cpp and DetourCommon.h/cpp.
+- Refactores the demo code.
+
+----------------
+* Recast 1.2
+ Released June 17th, 2009
+
+- Added tiled mesh generation. The tiled generation allows to generate navigation for
+ much larger worlds, it removes some of the artifacts that comes from distance fields
+ in open areas, and allows later streaming and dynamic runtime generation
+- Improved and added some debug draw modes
+- API change: The helper function rcBuildNavMesh does not exists anymore,
+ had to change few internal things to cope with the tiled processing,
+ similar API functionality will be added later once the tiled process matures
+- The demo is getting way too complicated, need to split demos
+- Fixed several filtering functions so that the mesh is tighter to the geometry,
+ sometimes there could be up error up to tow voxel units close to walls,
+ now it should be just one.
+
+----------------
+* Recast 1.1
+ Released April 11th, 2009
+
+This is the first release of Detour.
+
+----------------
+* Recast 1.0
+ Released March 29th, 2009
+
+This is the first release of Recast.
+
+The process is not always as robust as I would wish. The watershed phase sometimes swallows tiny islands
+which are close to edges. These droppings are handled in rcBuildContours, but the code is not
+particularly robust either.
+
+Another non-robust case is when portal contours (contours shared between two regions) are always
+assumed to be straight. That can lead to overlapping contours specially when the level has
+large open areas.
+
+
+
+Mikko Mononen
+memon@inside.org
diff --git a/extern/recastnavigation/Recast/Include/Recast.h b/extern/recastnavigation/Recast/Include/Recast.h
new file mode 100644
index 00000000000..f25ab47f8fa
--- /dev/null
+++ b/extern/recastnavigation/Recast/Include/Recast.h
@@ -0,0 +1,501 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef RECAST_H
+#define RECAST_H
+
+// The units of the parameters are specified in parenthesis as follows:
+// (vx) voxels, (wu) world units
+struct rcConfig
+{
+ int width, height; // Dimensions of the rasterized heighfield (vx)
+ int tileSize; // Width and Height of a tile (vx)
+ int borderSize; // Non-navigable Border around the heightfield (vx)
+ float cs, ch; // Grid cell size and height (wu)
+ float bmin[3], bmax[3]; // Grid bounds (wu)
+ float walkableSlopeAngle; // Maximum walkble slope angle in degrees.
+ int walkableHeight; // Minimum height where the agent can still walk (vx)
+ int walkableClimb; // Maximum height between grid cells the agent can climb (vx)
+ int walkableRadius; // Radius of the agent in cells (vx)
+ int maxEdgeLen; // Maximum contour edge length (vx)
+ float maxSimplificationError; // Maximum distance error from contour to cells (vx)
+ int minRegionSize; // Minimum regions size. Smaller regions will be deleted (vx)
+ int mergeRegionSize; // Minimum regions size. Smaller regions will be merged (vx)
+ int maxVertsPerPoly; // Max number of vertices per polygon
+ float detailSampleDist; // Detail mesh sample spacing.
+ float detailSampleMaxError; // Detail mesh simplification max sample error.
+};
+
+// Heightfield span.
+struct rcSpan
+{
+ unsigned int smin : 15; // Span min height.
+ unsigned int smax : 15; // Span max height.
+ unsigned int flags : 2; // Span flags.
+ rcSpan* next; // Next span in column.
+};
+
+static const int RC_SPANS_PER_POOL = 2048;
+
+// Memory pool used for quick span allocation.
+struct rcSpanPool
+{
+ rcSpanPool* next; // Pointer to next pool.
+ rcSpan items[1]; // Array of spans (size RC_SPANS_PER_POOL).
+};
+
+// Dynamic span-heightfield.
+struct rcHeightfield
+{
+ inline rcHeightfield() : width(0), height(0), spans(0), pools(0), freelist(0) {}
+ inline ~rcHeightfield()
+ {
+ // Delete span array.
+ delete [] spans;
+ // Delete span pools.
+ while (pools)
+ {
+ rcSpanPool* next = pools->next;
+ delete [] reinterpret_cast<unsigned char*>(pools);
+ pools = next;
+ }
+ }
+ int width, height; // Dimension of the heightfield.
+ float bmin[3], bmax[3]; // Bounding box of the heightfield
+ float cs, ch; // Cell size and height.
+ rcSpan** spans; // Heightfield of spans (width*height).
+ rcSpanPool* pools; // Linked list of span pools.
+ rcSpan* freelist; // Pointer to next free span.
+};
+
+struct rcCompactCell
+{
+ unsigned int index : 24; // Index to first span in column.
+ unsigned int count : 8; // Number of spans in this column.
+};
+
+struct rcCompactSpan
+{
+ unsigned short y; // Bottom coordinate of the span.
+ unsigned short reg; // Region ID
+ unsigned short dist; // Distance to border
+ unsigned short con; // Connections to neighbour cells.
+ unsigned char h; // Height of the span.
+ unsigned char flags; // Flags.
+};
+
+// Compact static heightfield.
+struct rcCompactHeightfield
+{
+ inline rcCompactHeightfield() : maxDistance(0), maxRegions(0), cells(0), spans(0) {}
+ inline ~rcCompactHeightfield() { delete [] cells; delete [] spans; }
+ int width, height; // Width and height of the heighfield.
+ int spanCount; // Number of spans in the heightfield.
+ int walkableHeight, walkableClimb; // Agent properties.
+ unsigned short maxDistance; // Maximum distance value stored in heightfield.
+ unsigned short maxRegions; // Maximum Region Id stored in heightfield.
+ float bmin[3], bmax[3]; // Bounding box of the heightfield.
+ float cs, ch; // Cell size and height.
+ rcCompactCell* cells; // Pointer to width*height cells.
+ rcCompactSpan* spans; // Pointer to spans.
+};
+
+struct rcContour
+{
+ inline rcContour() : verts(0), nverts(0), rverts(0), nrverts(0) { }
+ inline ~rcContour() { delete [] verts; delete [] rverts; }
+ int* verts; // Vertex coordinates, each vertex contains 4 components.
+ int nverts; // Number of vertices.
+ int* rverts; // Raw vertex coordinates, each vertex contains 4 components.
+ int nrverts; // Number of raw vertices.
+ unsigned short reg; // Region ID of the contour.
+};
+
+struct rcContourSet
+{
+ inline rcContourSet() : conts(0), nconts(0) {}
+ inline ~rcContourSet() { delete [] conts; }
+ rcContour* conts; // Pointer to all contours.
+ int nconts; // Number of contours.
+ float bmin[3], bmax[3]; // Bounding box of the heightfield.
+ float cs, ch; // Cell size and height.
+};
+
+// Polymesh store a connected mesh of polygons.
+// The polygons are store in an array where each polygons takes
+// 'nvp*2' elements. The first 'nvp' elements are indices to vertices
+// and the second 'nvp' elements are indices to neighbour polygons.
+// If a polygona has less than 'bvp' vertices, the remaining indices
+// are set os 0xffff. If an polygon edge does not have a neighbour
+// the neighbour index is set to 0xffff.
+// Vertices can be transformed into world space as follows:
+// x = bmin[0] + verts[i*3+0]*cs;
+// y = bmin[1] + verts[i*3+1]*ch;
+// z = bmin[2] + verts[i*3+2]*cs;
+struct rcPolyMesh
+{
+ inline rcPolyMesh() : verts(0), polys(0), regs(0), nverts(0), npolys(0), nvp(3) {}
+ inline ~rcPolyMesh() { delete [] verts; delete [] polys; delete [] regs; }
+ unsigned short* verts; // Vertices of the mesh, 3 elements per vertex.
+ unsigned short* polys; // Polygons of the mesh, nvp*2 elements per polygon.
+ unsigned short* regs; // Regions of the polygons.
+ int nverts; // Number of vertices.
+ int npolys; // Number of polygons.
+ int nvp; // Max number of vertices per polygon.
+ float bmin[3], bmax[3]; // Bounding box of the mesh.
+ float cs, ch; // Cell size and height.
+};
+
+// Detail mesh generated from a rcPolyMesh.
+// Each submesh represents a polygon in the polymesh and they are stored in
+// excatly same order. Each submesh is described as 4 values:
+// base vertex, vertex count, base triangle, triangle count. That is,
+// const unsigned char* t = &dtl.tris[(tbase+i)*3]; and
+// const float* v = &dtl.verts[(vbase+t[j])*3];
+// If the input polygon has 'n' vertices, those vertices are first in the
+// submesh vertex list. This allows to compres the mesh by not storing the
+// first vertices and using the polymesh vertices instead.
+
+struct rcPolyMeshDetail
+{
+ inline rcPolyMeshDetail() :
+ meshes(0), verts(0), tris(0),
+ nmeshes(0), nverts(0), ntris(0) {}
+ inline ~rcPolyMeshDetail()
+ {
+ delete [] meshes; delete [] verts; delete [] tris;
+ }
+
+ unsigned short* meshes; // Pointer to all mesh data.
+ float* verts; // Pointer to all vertex data.
+ unsigned char* tris; // Pointer to all triangle data.
+ int nmeshes; // Number of meshes.
+ int nverts; // Number of total vertices.
+ int ntris; // Number of triangles.
+};
+
+
+// Simple dynamic array ints.
+class rcIntArray
+{
+ int* m_data;
+ int m_size, m_cap;
+public:
+ inline rcIntArray() : m_data(0), m_size(0), m_cap(0) {}
+ inline rcIntArray(int n) : m_data(0), m_size(0), m_cap(n) { m_data = new int[n]; }
+ inline ~rcIntArray() { delete [] m_data; }
+ void resize(int n);
+ inline void push(int item) { resize(m_size+1); m_data[m_size-1] = item; }
+ inline int pop() { if (m_size > 0) m_size--; return m_data[m_size]; }
+ inline const int& operator[](int i) const { return m_data[i]; }
+ inline int& operator[](int i) { return m_data[i]; }
+ inline int size() const { return m_size; }
+};
+
+enum rcSpanFlags
+{
+ RC_WALKABLE = 0x01,
+ RC_REACHABLE = 0x02,
+};
+
+// If heightfield region ID has the following bit set, the region is on border area
+// and excluded from many calculations.
+static const unsigned short RC_BORDER_REG = 0x8000;
+
+// If contour region ID has the following bit set, the vertex will be later
+// removed in order to match the segments and vertices at tile boundaries.
+static const int RC_BORDER_VERTEX = 0x10000;
+
+// Compact span neighbour helpers.
+inline int rcGetCon(const rcCompactSpan& s, int dir)
+{
+ return (s.con >> (dir*4)) & 0xf;
+}
+
+inline int rcGetDirOffsetX(int dir)
+{
+ const int offset[4] = { -1, 0, 1, 0, };
+ return offset[dir&0x03];
+}
+
+inline int rcGetDirOffsetY(int dir)
+{
+ const int offset[4] = { 0, 1, 0, -1 };
+ return offset[dir&0x03];
+}
+
+// Common helper functions
+template<class T> inline void rcSwap(T& a, T& b) { T t = a; a = b; b = t; }
+template<class T> inline T rcMin(T a, T b) { return a < b ? a : b; }
+template<class T> inline T rcMax(T a, T b) { return a > b ? a : b; }
+template<class T> inline T rcAbs(T a) { return a < 0 ? -a : a; }
+template<class T> inline T rcSqr(T a) { return a*a; }
+template<class T> inline T rcClamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); }
+
+// Common vector helper functions.
+inline void vcross(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[1]*v2[2] - v1[2]*v2[1];
+ dest[1] = v1[2]*v2[0] - v1[0]*v2[2];
+ dest[2] = v1[0]*v2[1] - v1[1]*v2[0];
+}
+
+inline float vdot(const float* v1, const float* v2)
+{
+ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+
+inline void vmad(float* dest, const float* v1, const float* v2, const float s)
+{
+ dest[0] = v1[0]+v2[0]*s;
+ dest[1] = v1[1]+v2[1]*s;
+ dest[2] = v1[2]+v2[2]*s;
+}
+
+inline void vadd(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]+v2[0];
+ dest[1] = v1[1]+v2[1];
+ dest[2] = v1[2]+v2[2];
+}
+
+inline void vsub(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]-v2[0];
+ dest[1] = v1[1]-v2[1];
+ dest[2] = v1[2]-v2[2];
+}
+
+inline void vmin(float* mn, const float* v)
+{
+ mn[0] = rcMin(mn[0], v[0]);
+ mn[1] = rcMin(mn[1], v[1]);
+ mn[2] = rcMin(mn[2], v[2]);
+}
+
+inline void vmax(float* mx, const float* v)
+{
+ mx[0] = rcMax(mx[0], v[0]);
+ mx[1] = rcMax(mx[1], v[1]);
+ mx[2] = rcMax(mx[2], v[2]);
+}
+
+inline void vcopy(float* dest, const float* v)
+{
+ dest[0] = v[0];
+ dest[1] = v[1];
+ dest[2] = v[2];
+}
+
+inline float vdist(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return sqrtf(dx*dx + dy*dy + dz*dz);
+}
+
+inline float vdistSqr(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return dx*dx + dy*dy + dz*dz;
+}
+
+inline void vnormalize(float* v)
+{
+ float d = 1.0f / sqrtf(rcSqr(v[0]) + rcSqr(v[1]) + rcSqr(v[2]));
+ v[0] *= d;
+ v[1] *= d;
+ v[2] *= d;
+}
+
+inline bool vequal(const float* p0, const float* p1)
+{
+ static const float thr = rcSqr(1.0f/16384.0f);
+ const float d = vdistSqr(p0, p1);
+ return d < thr;
+}
+
+
+// Calculated bounding box of array of vertices.
+// Params:
+// verts - (in) array of vertices
+// nv - (in) vertex count
+// bmin, bmax - (out) bounding box
+void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax);
+
+// Calculates grid size based on bounding box and grid cell size.
+// Params:
+// bmin, bmax - (in) bounding box
+// cs - (in) grid cell size
+// w - (out) grid width
+// h - (out) grid height
+void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h);
+
+// Creates and initializes new heightfield.
+// Params:
+// hf - (in/out) heightfield to initialize.
+// width - (in) width of the heightfield.
+// height - (in) height of the heightfield.
+// bmin, bmax - (in) bounding box of the heightfield
+// cs - (in) grid cell size
+// ch - (in) grid cell height
+bool rcCreateHeightfield(rcHeightfield& hf, int width, int height,
+ const float* bmin, const float* bmax,
+ float cs, float ch);
+
+// Sets the WALKABLE flag for every triangle whose slope is below
+// the maximun walkable slope angle.
+// Params:
+// walkableSlopeAngle - (in) maximun slope angle in degrees.
+// verts - (in) array of vertices
+// nv - (in) vertex count
+// tris - (in) array of triangle vertex indices
+// nt - (in) triangle count
+// flags - (out) array of triangle flags
+void rcMarkWalkableTriangles(const float walkableSlopeAngle,
+ const float* verts, int nv,
+ const int* tris, int nt,
+ unsigned char* flags);
+
+// Rasterizes a triangle into heightfield spans.
+// Params:
+// v0,v1,v2 - (in) the vertices of the triangle.
+// flags - (in) triangle flags (uses WALKABLE)
+// solid - (in) heighfield where the triangle is rasterized
+void rcRasterizeTriangle(const float* v0, const float* v1, const float* v2,
+ unsigned char flags, rcHeightfield& solid);
+
+// Rasterizes the triangles into heightfield spans.
+// Params:
+// verts - (in) array of vertices
+// nv - (in) vertex count
+// tris - (in) array of triangle vertex indices
+// norms - (in) array of triangle normals
+// flags - (in) array of triangle flags (uses WALKABLE)
+// nt - (in) triangle count
+// solid - (in) heighfield where the triangles are rasterized
+void rcRasterizeTriangles(const float* verts, int nv,
+ const int* tris, const unsigned char* flags, int nt,
+ rcHeightfield& solid);
+
+// Removes WALKABLE flag from all spans that are at ledges. This filtering
+// removes possible overestimation of the conservative voxelization so that
+// the resulting mesh will not have regions hanging in air over ledges.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// walkableClimb - (in) maximum height between grid cells the agent can climb
+// solid - (in/out) heightfield describing the solid space
+void rcFilterLedgeSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid);
+
+// Removes WALKABLE flag from all spans which have smaller than
+// 'walkableHeight' clearane above them.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// solid - (in/out) heightfield describing the solid space
+void rcFilterWalkableLowHeightSpans(int walkableHeight,
+ rcHeightfield& solid);
+
+// Marks spans which are reachable from any of the topmost spans.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// walkableClimb - (in) maximum height between grid cells the agent can climb
+// solid - (in/out) heightfield describing the solid space
+// Returns false if operation ran out of memory.
+bool rcMarkReachableSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid);
+
+// Builds compact representation of the heightfield.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// walkableClimb - (in) maximum height between grid cells the agent can climb
+// hf - (in) heightfield to be compacted
+// chf - (out) compact heightfield representing the open space.
+// Returns false if operation ran out of memory.
+bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb,
+ unsigned char flags,
+ rcHeightfield& hf,
+ rcCompactHeightfield& chf);
+
+// Builds distance field and stores it into the combat heightfield.
+// Params:
+// chf - (in/out) compact heightfield representing the open space.
+// Returns false if operation ran out of memory.
+bool rcBuildDistanceField(rcCompactHeightfield& chf);
+
+// Divides the walkable heighfied into simple regions.
+// Each region has only one contour and no overlaps.
+// The regions are stored in the compact heightfield 'reg' field.
+// The regions will be shrinked by the radius of the agent.
+// The process sometimes creates small regions. The parameter
+// 'minRegionSize' specifies the smallest allowed regions size.
+// If the area of a regions is smaller than allowed, the regions is
+// removed or merged to neighbour region.
+// Params:
+// chf - (in/out) compact heightfield representing the open space.
+// walkableRadius - (in) the radius of the agent.
+// minRegionSize - (in) the smallest allowed regions size.
+// maxMergeRegionSize - (in) the largest allowed regions size which can be merged.
+// Returns false if operation ran out of memory.
+bool rcBuildRegions(rcCompactHeightfield& chf,
+ int walkableRadius, int borderSize,
+ int minRegionSize, int mergeRegionSize);
+
+// Builds simplified contours from the regions outlines.
+// Params:
+// chf - (in) compact heightfield which has regions set.
+// maxError - (in) maximum allowed distance between simplified countour and cells.
+// maxEdgeLen - (in) maximum allowed contour edge length in cells.
+// cset - (out) Resulting contour set.
+// Returns false if operation ran out of memory.
+bool rcBuildContours(rcCompactHeightfield& chf,
+ const float maxError, const int maxEdgeLen,
+ rcContourSet& cset);
+
+// Builds connected convex polygon mesh from contour polygons.
+// Params:
+// cset - (in) contour set.
+// nvp - (in) maximum number of vertices per polygon.
+// mesh - (out) poly mesh.
+// Returns false if operation ran out of memory.
+bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh);
+
+bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh);
+
+// Builds detail triangle mesh for each polygon in the poly mesh.
+// Params:
+// mesh - (in) poly mesh to detail.
+// chf - (in) compacy height field, used to query height for new vertices.
+// sampleDist - (in) spacing between height samples used to generate more detail into mesh.
+// sampleMaxError - (in) maximum allowed distance between simplified detail mesh and height sample.
+// pmdtl - (out) detail mesh.
+// Returns false if operation ran out of memory.
+bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& chf,
+ const float sampleDist, const float sampleMaxError,
+ rcPolyMeshDetail& dmesh);
+
+bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPolyMeshDetail& mesh);
+
+bool buildMeshAdjacency(unsigned short* polys, const int npolys, const int nverts, const int vertsPerPoly);
+
+#endif // RECAST_H
diff --git a/extern/recastnavigation/Recast/Include/RecastLog.h b/extern/recastnavigation/Recast/Include/RecastLog.h
new file mode 100644
index 00000000000..026ef73a3aa
--- /dev/null
+++ b/extern/recastnavigation/Recast/Include/RecastLog.h
@@ -0,0 +1,80 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef RECAST_LOG_H
+#define RECAST_LOG_H
+
+enum rcLogCategory
+{
+ RC_LOG_PROGRESS = 1,
+ RC_LOG_WARNING,
+ RC_LOG_ERROR,
+};
+
+class rcLog
+{
+public:
+ rcLog();
+ ~rcLog();
+
+ void log(rcLogCategory category, const char* format, ...);
+ inline void clear() { m_messageCount = 0; m_textPoolSize = 0; }
+ inline int getMessageCount() const { return m_messageCount; }
+ inline char getMessageType(int i) const { return *m_messages[i]; }
+ inline const char* getMessageText(int i) const { return m_messages[i]+1; }
+
+private:
+ static const int MAX_MESSAGES = 1000;
+ const char* m_messages[MAX_MESSAGES];
+ int m_messageCount;
+ static const int TEXT_POOL_SIZE = 8000;
+ char m_textPool[TEXT_POOL_SIZE];
+ int m_textPoolSize;
+};
+
+struct rcBuildTimes
+{
+ int rasterizeTriangles;
+ int buildCompact;
+ int buildContours;
+ int buildContoursTrace;
+ int buildContoursSimplify;
+ int filterBorder;
+ int filterWalkable;
+ int filterMarkReachable;
+ int buildPolymesh;
+ int buildDistanceField;
+ int buildDistanceFieldDist;
+ int buildDistanceFieldBlur;
+ int buildRegions;
+ int buildRegionsReg;
+ int buildRegionsExp;
+ int buildRegionsFlood;
+ int buildRegionsFilter;
+ int buildDetailMesh;
+ int mergePolyMesh;
+ int mergePolyMeshDetail;
+};
+
+void rcSetLog(rcLog* log);
+rcLog* rcGetLog();
+
+void rcSetBuildTimes(rcBuildTimes* btimes);
+rcBuildTimes* rcGetBuildTimes();
+
+#endif // RECAST_LOG_H
diff --git a/extern/recastnavigation/Recast/Include/RecastTimer.h b/extern/recastnavigation/Recast/Include/RecastTimer.h
new file mode 100644
index 00000000000..d4f21e58776
--- /dev/null
+++ b/extern/recastnavigation/Recast/Include/RecastTimer.h
@@ -0,0 +1,31 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+#ifndef RECAST_TIMER_H
+#define RECAST_TIMER_H
+
+#ifdef __GNUC__
+#include <stdint.h>
+typedef int64_t rcTimeVal;
+#else
+typedef __int64 rcTimeVal;
+#endif
+
+rcTimeVal rcGetPerformanceTimer();
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end);
+
+#endif // RECAST_TIMER_H
diff --git a/extern/recastnavigation/Recast/Source/Recast.cpp b/extern/recastnavigation/Recast/Source/Recast.cpp
new file mode 100644
index 00000000000..0db26c2c1cd
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/Recast.cpp
@@ -0,0 +1,272 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <float.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+void rcIntArray::resize(int n)
+{
+ if (n > m_cap)
+ {
+ if (!m_cap) m_cap = 8;
+ while (m_cap < n) m_cap *= 2;
+ int* newData = new int[m_cap];
+ if (m_size && newData) memcpy(newData, m_data, m_size*sizeof(int));
+ delete [] m_data;
+ m_data = newData;
+ }
+ m_size = n;
+}
+
+void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax)
+{
+ // Calculate bounding box.
+ vcopy(bmin, verts);
+ vcopy(bmax, verts);
+ for (int i = 1; i < nv; ++i)
+ {
+ const float* v = &verts[i*3];
+ vmin(bmin, v);
+ vmax(bmax, v);
+ }
+}
+
+void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h)
+{
+ *w = (int)((bmax[0] - bmin[0])/cs+0.5f);
+ *h = (int)((bmax[2] - bmin[2])/cs+0.5f);
+}
+
+bool rcCreateHeightfield(rcHeightfield& hf, int width, int height,
+ const float* bmin, const float* bmax,
+ float cs, float ch)
+{
+ hf.width = width;
+ hf.height = height;
+ hf.spans = new rcSpan*[hf.width*hf.height];
+ vcopy(hf.bmin, bmin);
+ vcopy(hf.bmax, bmax);
+ hf.cs = cs;
+ hf.ch = ch;
+ if (!hf.spans)
+ return false;
+ memset(hf.spans, 0, sizeof(rcSpan*)*hf.width*hf.height);
+ return true;
+}
+
+static void calcTriNormal(const float* v0, const float* v1, const float* v2, float* norm)
+{
+ float e0[3], e1[3];
+ vsub(e0, v1, v0);
+ vsub(e1, v2, v0);
+ vcross(norm, e0, e1);
+ vnormalize(norm);
+}
+
+void rcMarkWalkableTriangles(const float walkableSlopeAngle,
+ const float* verts, int nv,
+ const int* tris, int nt,
+ unsigned char* flags)
+{
+ const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI);
+
+ float norm[3];
+
+ for (int i = 0; i < nt; ++i)
+ {
+ const int* tri = &tris[i*3];
+ calcTriNormal(&verts[tri[0]*3], &verts[tri[1]*3], &verts[tri[2]*3], norm);
+ // Check if the face is walkable.
+ if (norm[1] > walkableThr)
+ flags[i] |= RC_WALKABLE;
+ }
+}
+
+static int getSpanCount(unsigned char flags, rcHeightfield& hf)
+{
+ const int w = hf.width;
+ const int h = hf.height;
+ int spanCount = 0;
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ for (rcSpan* s = hf.spans[x + y*w]; s; s = s->next)
+ {
+ if (s->flags == flags)
+ spanCount++;
+ }
+ }
+ }
+ return spanCount;
+}
+
+inline void setCon(rcCompactSpan& s, int dir, int i)
+{
+ s.con &= ~(0xf << (dir*4));
+ s.con |= (i&0xf) << (dir*4);
+}
+
+bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb,
+ unsigned char flags, rcHeightfield& hf,
+ rcCompactHeightfield& chf)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = hf.width;
+ const int h = hf.height;
+ const int spanCount = getSpanCount(flags, hf);
+
+ // Fill in header.
+ chf.width = w;
+ chf.height = h;
+ chf.spanCount = spanCount;
+ chf.walkableHeight = walkableHeight;
+ chf.walkableClimb = walkableClimb;
+ chf.maxRegions = 0;
+ vcopy(chf.bmin, hf.bmin);
+ vcopy(chf.bmax, hf.bmax);
+ chf.bmax[1] += walkableHeight*hf.ch;
+ chf.cs = hf.cs;
+ chf.ch = hf.ch;
+ chf.cells = new rcCompactCell[w*h];
+ if (!chf.cells)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildCompactHeightfield: Out of memory 'chf.cells' (%d)", w*h);
+ return false;
+ }
+ memset(chf.cells, 0, sizeof(rcCompactCell)*w*h);
+ chf.spans = new rcCompactSpan[spanCount];
+ if (!chf.spans)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildCompactHeightfield: Out of memory 'chf.spans' (%d)", spanCount);
+ return false;
+ }
+ memset(chf.spans, 0, sizeof(rcCompactSpan)*spanCount);
+
+ const int MAX_HEIGHT = 0xffff;
+
+ // Fill in cells and spans.
+ int idx = 0;
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcSpan* s = hf.spans[x + y*w];
+ // If there are no spans at this cell, just leave the data to index=0, count=0.
+ if (!s) continue;
+ rcCompactCell& c = chf.cells[x+y*w];
+ c.index = idx;
+ c.count = 0;
+ while (s)
+ {
+ if (s->flags == flags)
+ {
+ const int bot = (int)s->smax;
+ const int top = s->next ? (int)s->next->smin : MAX_HEIGHT;
+ chf.spans[idx].y = (unsigned short)rcClamp(bot, 0, 0xffff);
+ chf.spans[idx].h = (unsigned char)rcClamp(top - bot, 0, 0xff);
+ idx++;
+ c.count++;
+ }
+ s = s->next;
+ }
+ }
+ }
+
+ // Find neighbour connections.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ rcCompactSpan& s = chf.spans[i];
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ setCon(s, dir, 0xf);
+ const int nx = x + rcGetDirOffsetX(dir);
+ const int ny = y + rcGetDirOffsetY(dir);
+ // First check that the neighbour cell is in bounds.
+ if (nx < 0 || ny < 0 || nx >= w || ny >= h)
+ continue;
+ // Iterate over all neighbour spans and check if any of the is
+ // accessible from current cell.
+ const rcCompactCell& nc = chf.cells[nx+ny*w];
+ for (int k = (int)nc.index, nk = (int)(nc.index+nc.count); k < nk; ++k)
+ {
+ const rcCompactSpan& ns = chf.spans[k];
+ const int bot = rcMax(s.y, ns.y);
+ const int top = rcMin(s.y+s.h, ns.y+ns.h);
+
+ // Check that the gap between the spans is walkable,
+ // and that the climb height between the gaps is not too high.
+ if ((top - bot) >= walkableHeight && rcAbs((int)ns.y - (int)s.y) <= walkableClimb)
+ {
+ // Mark direction as walkable.
+ setCon(s, dir, k - (int)nc.index);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->buildCompact += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+}
+
+static int getHeightfieldMemoryUsage(const rcHeightfield& hf)
+{
+ int size = 0;
+ size += sizeof(hf);
+ size += hf.width * hf.height * sizeof(rcSpan*);
+
+ rcSpanPool* pool = hf.pools;
+ while (pool)
+ {
+ size += (sizeof(rcSpanPool) - sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL;
+ pool = pool->next;
+ }
+ return size;
+}
+
+static int getCompactHeightFieldMemoryusage(const rcCompactHeightfield& chf)
+{
+ int size = 0;
+ size += sizeof(rcCompactHeightfield);
+ size += sizeof(rcCompactSpan) * chf.spanCount;
+ size += sizeof(rcCompactCell) * chf.width * chf.height;
+ return size;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastContour.cpp b/extern/recastnavigation/Recast/Source/RecastContour.cpp
new file mode 100644
index 00000000000..96f763a18f3
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastContour.cpp
@@ -0,0 +1,732 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+static int getCornerHeight(int x, int y, int i, int dir,
+ const rcCompactHeightfield& chf,
+ bool& isBorderVertex)
+{
+ const rcCompactSpan& s = chf.spans[i];
+ int ch = (int)s.y;
+ int dirp = (dir+1) & 0x3;
+
+ unsigned short regs[4] = {0,0,0,0};
+
+ regs[0] = s.reg;
+
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ const rcCompactSpan& as = chf.spans[ai];
+ ch = rcMax(ch, (int)as.y);
+ regs[1] = as.reg;
+ if (rcGetCon(as, dirp) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dirp);
+ const int ay2 = ay + rcGetDirOffsetY(dirp);
+ const int ai2 = (int)chf.cells[ax2+ay2*chf.width].index + rcGetCon(as, dirp);
+ const rcCompactSpan& as2 = chf.spans[ai2];
+ ch = rcMax(ch, (int)as2.y);
+ regs[2] = as2.reg;
+ }
+ }
+ if (rcGetCon(s, dirp) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dirp);
+ const int ay = y + rcGetDirOffsetY(dirp);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dirp);
+ const rcCompactSpan& as = chf.spans[ai];
+ ch = rcMax(ch, (int)as.y);
+ regs[3] = as.reg;
+ if (rcGetCon(as, dir) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dir);
+ const int ay2 = ay + rcGetDirOffsetY(dir);
+ const int ai2 = (int)chf.cells[ax2+ay2*chf.width].index + rcGetCon(as, dir);
+ const rcCompactSpan& as2 = chf.spans[ai2];
+ ch = rcMax(ch, (int)as2.y);
+ regs[2] = as2.reg;
+ }
+ }
+
+ // Check if the vertex is special edge vertex, these vertices will be removed later.
+ for (int j = 0; j < 4; ++j)
+ {
+ const int a = j;
+ const int b = (j+1) & 0x3;
+ const int c = (j+2) & 0x3;
+ const int d = (j+3) & 0x3;
+
+ // The vertex is a border vertex there are two same exterior cells in a row,
+ // followed by two interior cells and none of the regions are out of bounds.
+ const bool twoSameExts = (regs[a] & regs[b] & RC_BORDER_REG) != 0 && regs[a] == regs[b];
+ const bool twoInts = ((regs[c] | regs[d]) & RC_BORDER_REG) == 0;
+ const bool noZeros = regs[a] != 0 && regs[b] != 0 && regs[c] != 0 && regs[d] != 0;
+ if (twoSameExts && twoInts && noZeros)
+ {
+ isBorderVertex = true;
+ break;
+ }
+ }
+
+ return ch;
+}
+
+static void walkContour(int x, int y, int i,
+ rcCompactHeightfield& chf,
+ unsigned char* flags, rcIntArray& points)
+{
+ // Choose the first non-connected edge
+ unsigned char dir = 0;
+ while ((flags[i] & (1 << dir)) == 0)
+ dir++;
+
+ unsigned char startDir = dir;
+ int starti = i;
+
+ int iter = 0;
+ while (++iter < 40000)
+ {
+ if (flags[i] & (1 << dir))
+ {
+ // Choose the edge corner
+ bool isBorderVertex = false;
+ int px = x;
+ int py = getCornerHeight(x, y, i, dir, chf, isBorderVertex);
+ int pz = y;
+ switch(dir)
+ {
+ case 0: pz++; break;
+ case 1: px++; pz++; break;
+ case 2: px++; break;
+ }
+ int r = 0;
+ const rcCompactSpan& s = chf.spans[i];
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ const rcCompactSpan& as = chf.spans[ai];
+ r = (int)as.reg;
+ }
+ if (isBorderVertex)
+ r |= RC_BORDER_VERTEX;
+ points.push(px);
+ points.push(py);
+ points.push(pz);
+ points.push(r);
+
+ flags[i] &= ~(1 << dir); // Remove visited edges
+ dir = (dir+1) & 0x3; // Rotate CW
+ }
+ else
+ {
+ int ni = -1;
+ const int nx = x + rcGetDirOffsetX(dir);
+ const int ny = y + rcGetDirOffsetY(dir);
+ const rcCompactSpan& s = chf.spans[i];
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const rcCompactCell& nc = chf.cells[nx+ny*chf.width];
+ ni = (int)nc.index + rcGetCon(s, dir);
+ }
+ if (ni == -1)
+ {
+ // Should not happen.
+ return;
+ }
+ x = nx;
+ y = ny;
+ i = ni;
+ dir = (dir+3) & 0x3; // Rotate CCW
+ }
+
+ if (starti == i && startDir == dir)
+ {
+ break;
+ }
+ }
+}
+
+static float distancePtSeg(int x, int y, int z,
+ int px, int py, int pz,
+ int qx, int qy, int qz)
+{
+/* float pqx = (float)(qx - px);
+ float pqy = (float)(qy - py);
+ float pqz = (float)(qz - pz);
+ float dx = (float)(x - px);
+ float dy = (float)(y - py);
+ float dz = (float)(z - pz);
+ float d = pqx*pqx + pqy*pqy + pqz*pqz;
+ float t = pqx*dx + pqy*dy + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = px + t*pqx - x;
+ dy = py + t*pqy - y;
+ dz = pz + t*pqz - z;
+
+ return dx*dx + dy*dy + dz*dz;*/
+
+ float pqx = (float)(qx - px);
+ float pqz = (float)(qz - pz);
+ float dx = (float)(x - px);
+ float dz = (float)(z - pz);
+ float d = pqx*pqx + pqz*pqz;
+ float t = pqx*dx + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = px + t*pqx - x;
+ dz = pz + t*pqz - z;
+
+ return dx*dx + dz*dz;
+}
+
+static void simplifyContour(rcIntArray& points, rcIntArray& simplified, float maxError, int maxEdgeLen)
+{
+ // Add initial points.
+ bool noConnections = true;
+ for (int i = 0; i < points.size(); i += 4)
+ {
+ if ((points[i+3] & 0xffff) != 0)
+ {
+ noConnections = false;
+ break;
+ }
+ }
+
+ if (noConnections)
+ {
+ // If there is no connections at all,
+ // create some initial points for the simplification process.
+ // Find lower-left and upper-right vertices of the contour.
+ int llx = points[0];
+ int lly = points[1];
+ int llz = points[2];
+ int lli = 0;
+ int urx = points[0];
+ int ury = points[1];
+ int urz = points[2];
+ int uri = 0;
+ for (int i = 0; i < points.size(); i += 4)
+ {
+ int x = points[i+0];
+ int y = points[i+1];
+ int z = points[i+2];
+ if (x < llx || (x == llx && z < llz))
+ {
+ llx = x;
+ lly = y;
+ llz = z;
+ lli = i/4;
+ }
+ if (x >= urx || (x == urx && z > urz))
+ {
+ urx = x;
+ ury = y;
+ urz = z;
+ uri = i/4;
+ }
+ }
+ simplified.push(llx);
+ simplified.push(lly);
+ simplified.push(llz);
+ simplified.push(lli);
+
+ simplified.push(urx);
+ simplified.push(ury);
+ simplified.push(urz);
+ simplified.push(uri);
+ }
+ else
+ {
+ // The contour has some portals to other regions.
+ // Add a new point to every location where the region changes.
+ for (int i = 0, ni = points.size()/4; i < ni; ++i)
+ {
+ int ii = (i+1) % ni;
+ if ((points[i*4+3] & 0xffff) != (points[ii*4+3] & 0xffff))
+ {
+ simplified.push(points[i*4+0]);
+ simplified.push(points[i*4+1]);
+ simplified.push(points[i*4+2]);
+ simplified.push(i);
+ }
+ }
+ }
+
+ // Add points until all raw points are within
+ // error tolerance to the simplified shape.
+ const int pn = points.size()/4;
+ for (int i = 0; i < simplified.size()/4; )
+ {
+ int ii = (i+1) % (simplified.size()/4);
+
+ int ax = simplified[i*4+0];
+ int ay = simplified[i*4+1];
+ int az = simplified[i*4+2];
+ int ai = simplified[i*4+3];
+
+ int bx = simplified[ii*4+0];
+ int by = simplified[ii*4+1];
+ int bz = simplified[ii*4+2];
+ int bi = simplified[ii*4+3];
+
+ // Find maximum deviation from the segment.
+ float maxd = 0;
+ int maxi = -1;
+ int ci = (ai+1) % pn;
+
+ // Tesselate only outer edges.
+ if ((points[ci*4+3] & 0xffff) == 0)
+ {
+ while (ci != bi)
+ {
+ float d = distancePtSeg(points[ci*4+0], points[ci*4+1]/4, points[ci*4+2],
+ ax, ay/4, az, bx, by/4, bz);
+ if (d > maxd)
+ {
+ maxd = d;
+ maxi = ci;
+ }
+ ci = (ci+1) % pn;
+ }
+ }
+
+
+ // If the max deviation is larger than accepted error,
+ // add new point, else continue to next segment.
+ if (maxi != -1 && maxd > (maxError*maxError))
+ {
+ // Add space for the new point.
+ simplified.resize(simplified.size()+4);
+ int n = simplified.size()/4;
+ for (int j = n-1; j > i; --j)
+ {
+ simplified[j*4+0] = simplified[(j-1)*4+0];
+ simplified[j*4+1] = simplified[(j-1)*4+1];
+ simplified[j*4+2] = simplified[(j-1)*4+2];
+ simplified[j*4+3] = simplified[(j-1)*4+3];
+ }
+ // Add the point.
+ simplified[(i+1)*4+0] = points[maxi*4+0];
+ simplified[(i+1)*4+1] = points[maxi*4+1];
+ simplified[(i+1)*4+2] = points[maxi*4+2];
+ simplified[(i+1)*4+3] = maxi;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+
+ // Split too long edges.
+ if (maxEdgeLen > 0)
+ {
+ for (int i = 0; i < simplified.size()/4; )
+ {
+ int ii = (i+1) % (simplified.size()/4);
+
+ int ax = simplified[i*4+0];
+ int az = simplified[i*4+2];
+ int ai = simplified[i*4+3];
+
+ int bx = simplified[ii*4+0];
+ int bz = simplified[ii*4+2];
+ int bi = simplified[ii*4+3];
+
+ // Find maximum deviation from the segment.
+ int maxi = -1;
+ int ci = (ai+1) % pn;
+
+ // Tesselate only outer edges.
+ if ((points[ci*4+3] & 0xffff) == 0)
+ {
+ int dx = bx - ax;
+ int dz = bz - az;
+ if (dx*dx + dz*dz > maxEdgeLen*maxEdgeLen)
+ {
+ int n = bi < ai ? (bi+pn - ai) : (bi - ai);
+ maxi = (ai + n/2) % pn;
+ }
+ }
+
+ // If the max deviation is larger than accepted error,
+ // add new point, else continue to next segment.
+ if (maxi != -1)
+ {
+ // Add space for the new point.
+ simplified.resize(simplified.size()+4);
+ int n = simplified.size()/4;
+ for (int j = n-1; j > i; --j)
+ {
+ simplified[j*4+0] = simplified[(j-1)*4+0];
+ simplified[j*4+1] = simplified[(j-1)*4+1];
+ simplified[j*4+2] = simplified[(j-1)*4+2];
+ simplified[j*4+3] = simplified[(j-1)*4+3];
+ }
+ // Add the point.
+ simplified[(i+1)*4+0] = points[maxi*4+0];
+ simplified[(i+1)*4+1] = points[maxi*4+1];
+ simplified[(i+1)*4+2] = points[maxi*4+2];
+ simplified[(i+1)*4+3] = maxi;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+ }
+
+ for (int i = 0; i < simplified.size()/4; ++i)
+ {
+ // The edge vertex flag is take from the current raw point,
+ // and the neighbour region is take from the next raw point.
+ const int ai = (simplified[i*4+3]+1) % pn;
+ const int bi = simplified[i*4+3];
+ simplified[i*4+3] = (points[ai*4+3] & 0xffff) | (points[bi*4+3] & RC_BORDER_VERTEX);
+ }
+
+}
+
+static void removeDegenerateSegments(rcIntArray& simplified)
+{
+ // Remove adjacent vertices which are equal on xz-plane,
+ // or else the triangulator will get confused.
+ for (int i = 0; i < simplified.size()/4; ++i)
+ {
+ int ni = i+1;
+ if (ni >= (simplified.size()/4))
+ ni = 0;
+
+ if (simplified[i*4+0] == simplified[ni*4+0] &&
+ simplified[i*4+2] == simplified[ni*4+2])
+ {
+ // Degenerate segment, remove.
+ for (int j = i; j < simplified.size()/4-1; ++j)
+ {
+ simplified[j*4+0] = simplified[(j+1)*4+0];
+ simplified[j*4+1] = simplified[(j+1)*4+1];
+ simplified[j*4+2] = simplified[(j+1)*4+2];
+ simplified[j*4+3] = simplified[(j+1)*4+3];
+ }
+ simplified.pop();
+ }
+ }
+}
+
+static int calcAreaOfPolygon2D(const int* verts, const int nverts)
+{
+ int area = 0;
+ for (int i = 0, j = nverts-1; i < nverts; j=i++)
+ {
+ const int* vi = &verts[i*4];
+ const int* vj = &verts[j*4];
+ area += vi[0] * vj[2] - vj[0] * vi[2];
+ }
+ return (area+1) / 2;
+}
+
+static void getClosestIndices(const int* vertsa, const int nvertsa,
+ const int* vertsb, const int nvertsb,
+ int& ia, int& ib)
+{
+ int closestDist = 0xfffffff;
+ for (int i = 0; i < nvertsa; ++i)
+ {
+ const int* va = &vertsa[i*4];
+ for (int j = 0; j < nvertsb; ++j)
+ {
+ const int* vb = &vertsb[j*4];
+ const int dx = vb[0] - va[0];
+ const int dz = vb[2] - va[2];
+ const int d = dx*dx + dz*dz;
+ if (d < closestDist)
+ {
+ ia = i;
+ ib = j;
+ closestDist = d;
+ }
+ }
+ }
+}
+
+static bool mergeContours(rcContour& ca, rcContour& cb, int ia, int ib)
+{
+ const int maxVerts = ca.nverts + cb.nverts + 2;
+ int* verts = new int[maxVerts*4];
+ if (!verts)
+ return false;
+
+ int nv = 0;
+
+ // Copy contour A.
+ for (int i = 0; i <= ca.nverts; ++i)
+ {
+ int* dst = &verts[nv*4];
+ const int* src = &ca.verts[((ia+i)%ca.nverts)*4];
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ dst[3] = src[3];
+ nv++;
+ }
+
+ // Copy contour B
+ for (int i = 0; i <= cb.nverts; ++i)
+ {
+ int* dst = &verts[nv*4];
+ const int* src = &cb.verts[((ib+i)%cb.nverts)*4];
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ dst[3] = src[3];
+ nv++;
+ }
+
+ delete [] ca.verts;
+ ca.verts = verts;
+ ca.nverts = nv;
+
+ delete [] cb.verts;
+ cb.verts = 0;
+ cb.nverts = 0;
+
+ return true;
+}
+
+bool rcBuildContours(rcCompactHeightfield& chf,
+ const float maxError, const int maxEdgeLen,
+ rcContourSet& cset)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ vcopy(cset.bmin, chf.bmin);
+ vcopy(cset.bmax, chf.bmax);
+ cset.cs = chf.cs;
+ cset.ch = chf.ch;
+
+ const int maxContours = chf.maxRegions*2;
+ cset.conts = new rcContour[maxContours];
+ if (!cset.conts)
+ return false;
+ cset.nconts = 0;
+
+ unsigned char* flags = new unsigned char[chf.spanCount];
+ if (!flags)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildContours: Out of memory 'flags'.");
+ return false;
+ }
+
+ rcTimeVal traceStartTime = rcGetPerformanceTimer();
+
+
+ // Mark boundaries.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ unsigned char res = 0;
+ const rcCompactSpan& s = chf.spans[i];
+ if (!s.reg || (s.reg & RC_BORDER_REG))
+ {
+ flags[i] = 0;
+ continue;
+ }
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ unsigned short r = 0;
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir);
+ const rcCompactSpan& as = chf.spans[ai];
+ r = as.reg;
+ }
+ if (r == s.reg)
+ res |= (1 << dir);
+ }
+ flags[i] = res ^ 0xf; // Inverse, mark non connected edges.
+ }
+ }
+ }
+
+ rcTimeVal traceEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal simplifyStartTime = rcGetPerformanceTimer();
+
+ rcIntArray verts(256);
+ rcIntArray simplified(64);
+
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (flags[i] == 0 || flags[i] == 0xf)
+ {
+ flags[i] = 0;
+ continue;
+ }
+ unsigned short reg = chf.spans[i].reg;
+ if (!reg || (reg & RC_BORDER_REG))
+ continue;
+
+ verts.resize(0);
+ simplified.resize(0);
+ walkContour(x, y, i, chf, flags, verts);
+ simplifyContour(verts, simplified, maxError, maxEdgeLen);
+ removeDegenerateSegments(simplified);
+
+ // Store region->contour remap info.
+ // Create contour.
+ if (simplified.size()/4 >= 3)
+ {
+ if (cset.nconts >= maxContours)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildContours: Too many contours %d, max %d.", cset.nconts, maxContours);
+ return false;
+ }
+
+ rcContour* cont = &cset.conts[cset.nconts++];
+
+ cont->nverts = simplified.size()/4;
+ cont->verts = new int[cont->nverts*4];
+ memcpy(cont->verts, &simplified[0], sizeof(int)*cont->nverts*4);
+
+ cont->nrverts = verts.size()/4;
+ cont->rverts = new int[cont->nrverts*4];
+ memcpy(cont->rverts, &verts[0], sizeof(int)*cont->nrverts*4);
+
+/* cont->cx = cont->cy = cont->cz = 0;
+ for (int i = 0; i < cont->nverts; ++i)
+ {
+ cont->cx += cont->verts[i*4+0];
+ cont->cy += cont->verts[i*4+1];
+ cont->cz += cont->verts[i*4+2];
+ }
+ cont->cx /= cont->nverts;
+ cont->cy /= cont->nverts;
+ cont->cz /= cont->nverts;*/
+
+ cont->reg = reg;
+ }
+ }
+ }
+ }
+
+ // Check and merge droppings.
+ // Sometimes the previous algorithms can fail and create several countours
+ // per area. This pass will try to merge the holes into the main region.
+ for (int i = 0; i < cset.nconts; ++i)
+ {
+ rcContour& cont = cset.conts[i];
+ // Check if the contour is would backwards.
+ if (calcAreaOfPolygon2D(cont.verts, cont.nverts) < 0)
+ {
+ // Find another contour which has the same region ID.
+ int mergeIdx = -1;
+ for (int j = 0; j < cset.nconts; ++j)
+ {
+ if (i == j) continue;
+ if (cset.conts[j].nverts && cset.conts[j].reg == cont.reg)
+ {
+ // Make sure the polygon is correctly oriented.
+ if (calcAreaOfPolygon2D(cset.conts[j].verts, cset.conts[j].nverts))
+ {
+ mergeIdx = j;
+ break;
+ }
+ }
+ }
+ if (mergeIdx == -1)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "rcBuildContours: Could not find merge target for bad contour %d.", i);
+ }
+ else
+ {
+ rcContour& mcont = cset.conts[mergeIdx];
+ // Merge by closest points.
+ int ia, ib;
+ getClosestIndices(mcont.verts, mcont.nverts, cont.verts, cont.nverts, ia, ib);
+ if (!mergeContours(mcont, cont, ia, ib))
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "rcBuildContours: Failed to merge contours %d and %d.", i, mergeIdx);
+ }
+ }
+ }
+ }
+
+
+ delete [] flags;
+
+ rcTimeVal simplifyEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// {
+// rcGetLog()->log(RC_LOG_PROGRESS, "Create contours: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+// rcGetLog()->log(RC_LOG_PROGRESS, " - boundary: %.3f ms", rcGetDeltaTimeUsec(boundaryStartTime, boundaryEndTime)/1000.0f);
+// rcGetLog()->log(RC_LOG_PROGRESS, " - contour: %.3f ms", rcGetDeltaTimeUsec(contourStartTime, contourEndTime)/1000.0f);
+// }
+
+ if (rcGetBuildTimes())
+ {
+ rcGetBuildTimes()->buildContours += rcGetDeltaTimeUsec(startTime, endTime);
+ rcGetBuildTimes()->buildContoursTrace += rcGetDeltaTimeUsec(traceStartTime, traceEndTime);
+ rcGetBuildTimes()->buildContoursSimplify += rcGetDeltaTimeUsec(simplifyStartTime, simplifyEndTime);
+ }
+
+ return true;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastFilter.cpp b/extern/recastnavigation/Recast/Source/RecastFilter.cpp
new file mode 100644
index 00000000000..ebe60714a18
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastFilter.cpp
@@ -0,0 +1,249 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+void rcFilterLedgeSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = solid.width;
+ const int h = solid.height;
+ const int MAX_HEIGHT = 0xffff;
+
+ // Mark border spans.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ for (rcSpan* s = solid.spans[x + y*w]; s; s = s->next)
+ {
+ // Skip non walkable spans.
+ if ((s->flags & RC_WALKABLE) == 0)
+ continue;
+
+ const int bot = (int)s->smax;
+ const int top = s->next ? (int)s->next->smin : MAX_HEIGHT;
+
+ // Find neighbours minimum height.
+ int minh = MAX_HEIGHT;
+
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ int dx = x + rcGetDirOffsetX(dir);
+ int dy = y + rcGetDirOffsetY(dir);
+ // Skip neighbours which are out of bounds.
+ if (dx < 0 || dy < 0 || dx >= w || dy >= h)
+ {
+ minh = rcMin(minh, -walkableClimb - bot);
+ continue;
+ }
+
+ // From minus infinity to the first span.
+ rcSpan* ns = solid.spans[dx + dy*w];
+ int nbot = -walkableClimb;
+ int ntop = ns ? (int)ns->smin : MAX_HEIGHT;
+ // Skip neightbour if the gap between the spans is too small.
+ if (rcMin(top,ntop) - rcMax(bot,nbot) > walkableHeight)
+ minh = rcMin(minh, nbot - bot);
+
+ // Rest of the spans.
+ for (ns = solid.spans[dx + dy*w]; ns; ns = ns->next)
+ {
+ nbot = (int)ns->smax;
+ ntop = ns->next ? (int)ns->next->smin : MAX_HEIGHT;
+ // Skip neightbour if the gap between the spans is too small.
+ if (rcMin(top,ntop) - rcMax(bot,nbot) > walkableHeight)
+ minh = rcMin(minh, nbot - bot);
+ }
+ }
+
+ // The current span is close to a ledge if the drop to any
+ // neighbour span is less than the walkableClimb.
+ if (minh < -walkableClimb)
+ s->flags &= ~RC_WALKABLE;
+
+ }
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Filter border: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->filterBorder += rcGetDeltaTimeUsec(startTime, endTime);
+}
+
+void rcFilterWalkableLowHeightSpans(int walkableHeight,
+ rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = solid.width;
+ const int h = solid.height;
+ const int MAX_HEIGHT = 0xffff;
+
+ // Remove walkable flag from spans which do not have enough
+ // space above them for the agent to stand there.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ for (rcSpan* s = solid.spans[x + y*w]; s; s = s->next)
+ {
+ const int bot = (int)s->smax;
+ const int top = s->next ? (int)s->next->smin : MAX_HEIGHT;
+ if ((top - bot) <= walkableHeight)
+ s->flags &= ~RC_WALKABLE;
+ }
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Filter walkable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->filterWalkable += rcGetDeltaTimeUsec(startTime, endTime);
+}
+
+
+struct rcReachableSeed
+{
+ inline void set(int ix, int iy, rcSpan* is)
+ {
+ x = (unsigned short)ix;
+ y = (unsigned short)iy;
+ s = is;
+ }
+ unsigned short x, y;
+ rcSpan* s;
+};
+
+bool rcMarkReachableSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid)
+{
+ const int w = solid.width;
+ const int h = solid.height;
+ const int MAX_HEIGHT = 0xffff;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ // Build navigable space.
+ const int MAX_SEEDS = w*h;
+ rcReachableSeed* stack = new rcReachableSeed[MAX_SEEDS];
+ if (!stack)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMarkReachableSpans: Out of memory 'stack' (%d).", MAX_SEEDS);
+ return false;
+ }
+ int stackSize = 0;
+
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ rcSpan* topSpan = solid.spans[x + y*w];
+ if (!topSpan)
+ continue;
+ while (topSpan->next)
+ topSpan = topSpan->next;
+
+ // If the span is not walkable, skip it.
+ if ((topSpan->flags & RC_WALKABLE) == 0)
+ continue;
+ // If the span has been visited already, skip it.
+ if (topSpan->flags & RC_REACHABLE)
+ continue;
+
+ // Start flood fill.
+ topSpan->flags |= RC_REACHABLE;
+ stackSize = 0;
+ stack[stackSize].set(x, y, topSpan);
+ stackSize++;
+
+ while (stackSize)
+ {
+ // Pop a seed from the stack.
+ stackSize--;
+ rcReachableSeed cur = stack[stackSize];
+
+ const int bot = (int)cur.s->smax;
+ const int top = cur.s->next ? (int)cur.s->next->smin : MAX_HEIGHT;
+
+ // Visit neighbours in all 4 directions.
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ int dx = (int)cur.x + rcGetDirOffsetX(dir);
+ int dy = (int)cur.y + rcGetDirOffsetY(dir);
+ // Skip neighbour which are out of bounds.
+ if (dx < 0 || dy < 0 || dx >= w || dy >= h)
+ continue;
+ for (rcSpan* ns = solid.spans[dx + dy*w]; ns; ns = ns->next)
+ {
+ // Skip neighbour if it is not walkable.
+ if ((ns->flags & RC_WALKABLE) == 0)
+ continue;
+ // Skip the neighbour if it has been visited already.
+ if (ns->flags & RC_REACHABLE)
+ continue;
+
+ const int nbot = (int)ns->smax;
+ const int ntop = ns->next ? (int)ns->next->smin : MAX_HEIGHT;
+ // Skip neightbour if the gap between the spans is too small.
+ if (rcMin(top,ntop) - rcMax(bot,nbot) < walkableHeight)
+ continue;
+ // Skip neightbour if the climb height to the neighbour is too high.
+ if (rcAbs(nbot - bot) >= walkableClimb)
+ continue;
+
+ // This neighbour has not been visited yet.
+ // Mark it as reachable and add it to the seed stack.
+ ns->flags |= RC_REACHABLE;
+ if (stackSize < MAX_SEEDS)
+ {
+ stack[stackSize].set(dx, dy, ns);
+ stackSize++;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ delete [] stack;
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Mark reachable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->filterMarkReachable += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastLog.cpp b/extern/recastnavigation/Recast/Source/RecastLog.cpp
new file mode 100644
index 00000000000..27868042a1c
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastLog.cpp
@@ -0,0 +1,77 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include "RecastLog.h"
+#include <stdio.h>
+#include <stdarg.h>
+
+static rcLog* g_log = 0;
+static rcBuildTimes* g_btimes = 0;
+
+rcLog::rcLog() :
+ m_messageCount(0),
+ m_textPoolSize(0)
+{
+}
+
+rcLog::~rcLog()
+{
+ if (g_log == this)
+ g_log = 0;
+}
+
+void rcLog::log(rcLogCategory category, const char* format, ...)
+{
+ if (m_messageCount >= MAX_MESSAGES)
+ return;
+ char* dst = &m_textPool[m_textPoolSize];
+ int n = TEXT_POOL_SIZE - m_textPoolSize;
+ if (n < 2)
+ return;
+ // Store category
+ *dst = (char)category;
+ n--;
+ // Store message
+ va_list ap;
+ va_start(ap, format);
+ int ret = vsnprintf(dst+1, n-1, format, ap);
+ va_end(ap);
+ if (ret > 0)
+ m_textPoolSize += ret+2;
+ m_messages[m_messageCount++] = dst;
+}
+
+void rcSetLog(rcLog* log)
+{
+ g_log = log;
+}
+
+rcLog* rcGetLog()
+{
+ return g_log;
+}
+
+void rcSetBuildTimes(rcBuildTimes* btimes)
+{
+ g_btimes = btimes;
+}
+
+rcBuildTimes* rcGetBuildTimes()
+{
+ return g_btimes;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastMesh.cpp b/extern/recastnavigation/Recast/Source/RecastMesh.cpp
new file mode 100644
index 00000000000..38d62904213
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastMesh.cpp
@@ -0,0 +1,1218 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+struct rcEdge
+{
+ unsigned short vert[2];
+ unsigned short polyEdge[2];
+ unsigned short poly[2];
+};
+
+/*static */bool buildMeshAdjacency(unsigned short* polys, const int npolys,
+ const int nverts, const int vertsPerPoly)
+{
+ // Based on code by Eric Lengyel from:
+ // http://www.terathon.com/code/edges.php
+
+ int maxEdgeCount = npolys*vertsPerPoly;
+ unsigned short* firstEdge = new unsigned short[nverts + maxEdgeCount];
+ if (!firstEdge)
+ return false;
+ unsigned short* nextEdge = firstEdge + nverts;
+ int edgeCount = 0;
+
+ rcEdge* edges = new rcEdge[maxEdgeCount];
+ if (!edges)
+ return false;
+
+ for (int i = 0; i < nverts; i++)
+ firstEdge[i] = 0xffff;
+
+ // Invalida indices are marked as 0xffff, the following code
+ // handles them just fine.
+
+ for (int i = 0; i < npolys; ++i)
+ {
+ unsigned short* t = &polys[i*vertsPerPoly*2];
+ for (int j = 0; j < vertsPerPoly; ++j)
+ {
+ unsigned short v0 = t[j];
+ unsigned short v1 = (j+1 >= vertsPerPoly || t[j+1] == 0xffff) ? t[0] : t[j+1];
+ if (v0 < v1)
+ {
+ rcEdge& edge = edges[edgeCount];
+ edge.vert[0] = v0;
+ edge.vert[1] = v1;
+ edge.poly[0] = (unsigned short)i;
+ edge.polyEdge[0] = (unsigned short)j;
+ edge.poly[1] = (unsigned short)i;
+ edge.polyEdge[1] = 0;
+ // Insert edge
+ nextEdge[edgeCount] = firstEdge[v0];
+ firstEdge[v0] = edgeCount;
+ edgeCount++;
+ }
+ }
+ }
+
+ for (int i = 0; i < npolys; ++i)
+ {
+ unsigned short* t = &polys[i*vertsPerPoly*2];
+ for (int j = 0; j < vertsPerPoly; ++j)
+ {
+ unsigned short v0 = t[j];
+ unsigned short v1 = (j+1 >= vertsPerPoly || t[j+1] == 0xffff) ? t[0] : t[j+1];
+ if (v0 > v1)
+ {
+ for (unsigned short e = firstEdge[v1]; e != 0xffff; e = nextEdge[e])
+ {
+ rcEdge& edge = edges[e];
+ if (edge.vert[1] == v0 && edge.poly[0] == edge.poly[1])
+ {
+ edge.poly[1] = (unsigned short)i;
+ edge.polyEdge[1] = (unsigned short)j;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Store adjacency
+ for (int i = 0; i < edgeCount; ++i)
+ {
+ const rcEdge& e = edges[i];
+ if (e.poly[0] != e.poly[1])
+ {
+ unsigned short* p0 = &polys[e.poly[0]*vertsPerPoly*2];
+ unsigned short* p1 = &polys[e.poly[1]*vertsPerPoly*2];
+ p0[vertsPerPoly + e.polyEdge[0]] = e.poly[1];
+ p1[vertsPerPoly + e.polyEdge[1]] = e.poly[0];
+ }
+ }
+
+ delete [] firstEdge;
+ delete [] edges;
+
+ return true;
+}
+
+
+static const int VERTEX_BUCKET_COUNT = (1<<12);
+
+inline int computeVertexHash(int x, int y, int z)
+{
+ const unsigned int h1 = 0x8da6b343; // Large multiplicative constants;
+ const unsigned int h2 = 0xd8163841; // here arbitrarily chosen primes
+ const unsigned int h3 = 0xcb1ab31f;
+ unsigned int n = h1 * x + h2 * y + h3 * z;
+ return (int)(n & (VERTEX_BUCKET_COUNT-1));
+}
+
+static int addVertex(unsigned short x, unsigned short y, unsigned short z,
+ unsigned short* verts, int* firstVert, int* nextVert, int& nv)
+{
+ int bucket = computeVertexHash(x, 0, z);
+ int i = firstVert[bucket];
+
+ while (i != -1)
+ {
+ const unsigned short* v = &verts[i*3];
+ if (v[0] == x && (rcAbs(v[1] - y) <= 2) && v[2] == z)
+ return i;
+ i = nextVert[i]; // next
+ }
+
+ // Could not find, create new.
+ i = nv; nv++;
+ unsigned short* v = &verts[i*3];
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+ nextVert[i] = firstVert[bucket];
+ firstVert[bucket] = i;
+
+ return i;
+}
+
+inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; }
+inline int next(int i, int n) { return i+1 < n ? i+1 : 0; }
+
+inline int area2(const int* a, const int* b, const int* c)
+{
+ return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]);
+}
+
+// Exclusive or: true iff exactly one argument is true.
+// The arguments are negated to ensure that they are 0/1
+// values. Then the bitwise Xor operator may apply.
+// (This idea is due to Michael Baldwin.)
+inline bool xorb(bool x, bool y)
+{
+ return !x ^ !y;
+}
+
+// Returns true iff c is strictly to the left of the directed
+// line through a to b.
+inline bool left(const int* a, const int* b, const int* c)
+{
+ return area2(a, b, c) < 0;
+}
+
+inline bool leftOn(const int* a, const int* b, const int* c)
+{
+ return area2(a, b, c) <= 0;
+}
+
+inline bool collinear(const int* a, const int* b, const int* c)
+{
+ return area2(a, b, c) == 0;
+}
+
+// Returns true iff ab properly intersects cd: they share
+// a point interior to both segments. The properness of the
+// intersection is ensured by using strict leftness.
+bool intersectProp(const int* a, const int* b, const int* c, const int* d)
+{
+ // Eliminate improper cases.
+ if (collinear(a,b,c) || collinear(a,b,d) ||
+ collinear(c,d,a) || collinear(c,d,b))
+ return false;
+
+ return xorb(left(a,b,c), left(a,b,d)) && xorb(left(c,d,a), left(c,d,b));
+}
+
+// Returns T iff (a,b,c) are collinear and point c lies
+// on the closed segement ab.
+static bool between(const int* a, const int* b, const int* c)
+{
+ if (!collinear(a, b, c))
+ return false;
+ // If ab not vertical, check betweenness on x; else on y.
+ if (a[0] != b[0])
+ return ((a[0] <= c[0]) && (c[0] <= b[0])) || ((a[0] >= c[0]) && (c[0] >= b[0]));
+ else
+ return ((a[2] <= c[2]) && (c[2] <= b[2])) || ((a[2] >= c[2]) && (c[2] >= b[2]));
+}
+
+// Returns true iff segments ab and cd intersect, properly or improperly.
+static bool intersect(const int* a, const int* b, const int* c, const int* d)
+{
+ if (intersectProp(a, b, c, d))
+ return true;
+ else if (between(a, b, c) || between(a, b, d) ||
+ between(c, d, a) || between(c, d, b))
+ return true;
+ else
+ return false;
+}
+
+static bool vequal(const int* a, const int* b)
+{
+ return a[0] == b[0] && a[2] == b[2];
+}
+
+// Returns T iff (v_i, v_j) is a proper internal *or* external
+// diagonal of P, *ignoring edges incident to v_i and v_j*.
+static bool diagonalie(int i, int j, int n, const int* verts, int* indices)
+{
+ const int* d0 = &verts[(indices[i] & 0x0fffffff) * 4];
+ const int* d1 = &verts[(indices[j] & 0x0fffffff) * 4];
+
+ // For each edge (k,k+1) of P
+ for (int k = 0; k < n; k++)
+ {
+ int k1 = next(k, n);
+ // Skip edges incident to i or j
+ if (!((k == i) || (k1 == i) || (k == j) || (k1 == j)))
+ {
+ const int* p0 = &verts[(indices[k] & 0x0fffffff) * 4];
+ const int* p1 = &verts[(indices[k1] & 0x0fffffff) * 4];
+
+ if (vequal(d0, p0) || vequal(d1, p0) || vequal(d0, p1) || vequal(d1, p1))
+ continue;
+
+ if (intersect(d0, d1, p0, p1))
+ return false;
+ }
+ }
+ return true;
+}
+
+// Returns true iff the diagonal (i,j) is strictly internal to the
+// polygon P in the neighborhood of the i endpoint.
+static bool inCone(int i, int j, int n, const int* verts, int* indices)
+{
+ const int* pi = &verts[(indices[i] & 0x0fffffff) * 4];
+ const int* pj = &verts[(indices[j] & 0x0fffffff) * 4];
+ const int* pi1 = &verts[(indices[next(i, n)] & 0x0fffffff) * 4];
+ const int* pin1 = &verts[(indices[prev(i, n)] & 0x0fffffff) * 4];
+
+ // If P[i] is a convex vertex [ i+1 left or on (i-1,i) ].
+ if (leftOn(pin1, pi, pi1))
+ return left(pi, pj, pin1) && left(pj, pi, pi1);
+ // Assume (i-1,i,i+1) not collinear.
+ // else P[i] is reflex.
+ return !(leftOn(pi, pj, pi1) && leftOn(pj, pi, pin1));
+}
+
+// Returns T iff (v_i, v_j) is a proper internal
+// diagonal of P.
+static bool diagonal(int i, int j, int n, const int* verts, int* indices)
+{
+ return inCone(i, j, n, verts, indices) && diagonalie(i, j, n, verts, indices);
+}
+
+int triangulate(int n, const int* verts, int* indices, int* tris)
+{
+ int ntris = 0;
+ int* dst = tris;
+
+ // The last bit of the index is used to indicate if the vertex can be removed.
+ for (int i = 0; i < n; i++)
+ {
+ int i1 = next(i, n);
+ int i2 = next(i1, n);
+ if (diagonal(i, i2, n, verts, indices))
+ indices[i1] |= 0x80000000;
+ }
+
+ while (n > 3)
+ {
+ int minLen = -1;
+ int mini = -1;
+ for (int i = 0; i < n; i++)
+ {
+ int i1 = next(i, n);
+ if (indices[i1] & 0x80000000)
+ {
+ const int* p0 = &verts[(indices[i] & 0x0fffffff) * 4];
+ const int* p2 = &verts[(indices[next(i1, n)] & 0x0fffffff) * 4];
+
+ int dx = p2[0] - p0[0];
+ int dy = p2[2] - p0[2];
+ int len = dx*dx + dy*dy;
+
+ if (minLen < 0 || len < minLen)
+ {
+ minLen = len;
+ mini = i;
+ }
+ }
+ }
+
+ if (mini == -1)
+ {
+ // Should not happen.
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "triangulate: Failed to triangulate polygon.");
+/* printf("mini == -1 ntris=%d n=%d\n", ntris, n);
+ for (int i = 0; i < n; i++)
+ {
+ printf("%d ", indices[i] & 0x0fffffff);
+ }
+ printf("\n");*/
+ return -ntris;
+ }
+
+ int i = mini;
+ int i1 = next(i, n);
+ int i2 = next(i1, n);
+
+ *dst++ = indices[i] & 0x0fffffff;
+ *dst++ = indices[i1] & 0x0fffffff;
+ *dst++ = indices[i2] & 0x0fffffff;
+ ntris++;
+
+ // Removes P[i1] by copying P[i+1]...P[n-1] left one index.
+ n--;
+ for (int k = i1; k < n; k++)
+ indices[k] = indices[k+1];
+
+ if (i1 >= n) i1 = 0;
+ i = prev(i1,n);
+ // Update diagonal flags.
+ if (diagonal(prev(i, n), i1, n, verts, indices))
+ indices[i] |= 0x80000000;
+ else
+ indices[i] &= 0x0fffffff;
+
+ if (diagonal(i, next(i1, n), n, verts, indices))
+ indices[i1] |= 0x80000000;
+ else
+ indices[i1] &= 0x0fffffff;
+ }
+
+ // Append the remaining triangle.
+ *dst++ = indices[0] & 0x0fffffff;
+ *dst++ = indices[1] & 0x0fffffff;
+ *dst++ = indices[2] & 0x0fffffff;
+ ntris++;
+
+ return ntris;
+}
+
+static int countPolyVerts(const unsigned short* p, const int nvp)
+{
+ for (int i = 0; i < nvp; ++i)
+ if (p[i] == 0xffff)
+ return i;
+ return nvp;
+}
+
+inline bool uleft(const unsigned short* a, const unsigned short* b, const unsigned short* c)
+{
+ return ((int)b[0] - (int)a[0]) * ((int)c[2] - (int)a[2]) -
+ ((int)c[0] - (int)a[0]) * ((int)b[2] - (int)a[2]) < 0;
+}
+
+static int getPolyMergeValue(unsigned short* pa, unsigned short* pb,
+ const unsigned short* verts, int& ea, int& eb,
+ const int nvp)
+{
+ const int na = countPolyVerts(pa, nvp);
+ const int nb = countPolyVerts(pb, nvp);
+
+ // If the merged polygon would be too big, do not merge.
+ if (na+nb-2 > nvp)
+ return -1;
+
+ // Check if the polygons share an edge.
+ ea = -1;
+ eb = -1;
+
+ for (int i = 0; i < na; ++i)
+ {
+ unsigned short va0 = pa[i];
+ unsigned short va1 = pa[(i+1) % na];
+ if (va0 > va1)
+ rcSwap(va0, va1);
+ for (int j = 0; j < nb; ++j)
+ {
+ unsigned short vb0 = pb[j];
+ unsigned short vb1 = pb[(j+1) % nb];
+ if (vb0 > vb1)
+ rcSwap(vb0, vb1);
+ if (va0 == vb0 && va1 == vb1)
+ {
+ ea = i;
+ eb = j;
+ break;
+ }
+ }
+ }
+
+ // No common edge, cannot merge.
+ if (ea == -1 || eb == -1)
+ return -1;
+
+ // Check to see if the merged polygon would be convex.
+ unsigned short va, vb, vc;
+
+ va = pa[(ea+na-1) % na];
+ vb = pa[ea];
+ vc = pb[(eb+2) % nb];
+ if (!uleft(&verts[va*3], &verts[vb*3], &verts[vc*3]))
+ return -1;
+
+ va = pb[(eb+nb-1) % nb];
+ vb = pb[eb];
+ vc = pa[(ea+2) % na];
+ if (!uleft(&verts[va*3], &verts[vb*3], &verts[vc*3]))
+ return -1;
+
+ va = pa[ea];
+ vb = pa[(ea+1)%na];
+
+ int dx = (int)verts[va*3+0] - (int)verts[vb*3+0];
+ int dy = (int)verts[va*3+2] - (int)verts[vb*3+2];
+
+ return dx*dx + dy*dy;
+}
+
+static void mergePolys(unsigned short* pa, unsigned short* pb,
+ const unsigned short* verts, int ea, int eb,
+ unsigned short* tmp, const int nvp)
+{
+ const int na = countPolyVerts(pa, nvp);
+ const int nb = countPolyVerts(pb, nvp);
+
+ // Merge polygons.
+ memset(tmp, 0xff, sizeof(unsigned short)*nvp);
+ int n = 0;
+ // Add pa
+ for (int i = 0; i < na-1; ++i)
+ tmp[n++] = pa[(ea+1+i) % na];
+ // Add pb
+ for (int i = 0; i < nb-1; ++i)
+ tmp[n++] = pb[(eb+1+i) % nb];
+
+ memcpy(pa, tmp, sizeof(unsigned short)*nvp);
+}
+
+static void pushFront(int v, int* arr, int& an)
+{
+ an++;
+ for (int i = an-1; i > 0; --i) arr[i] = arr[i-1];
+ arr[0] = v;
+}
+
+static void pushBack(int v, int* arr, int& an)
+{
+ arr[an] = v;
+ an++;
+}
+
+static bool removeVertex(rcPolyMesh& mesh, const unsigned short rem, const int maxTris)
+{
+ unsigned short* tmpPoly;
+ int ntris;
+
+ static const int nvp = mesh.nvp;
+
+ int* edges = 0;
+ int nedges = 0;
+ int* hole = 0;
+ int nhole = 0;
+ int* hreg = 0;
+ int nhreg = 0;
+ int* tris = 0;
+ int* tverts = 0;
+ int* thole = 0;
+ unsigned short* polys = 0;
+ unsigned short* pregs = 0;
+ int npolys = 0;
+
+ // Count number of polygons to remove.
+ int nrem = 0;
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ unsigned short* p = &mesh.polys[i*nvp*2];
+ for (int j = 0; j < nvp; ++j)
+ if (p[j] == rem) { nrem++; break; }
+ }
+
+ edges = new int[nrem*nvp*3];
+ if (!edges)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'edges' (%d).", nrem*nvp*3);
+ goto failure;
+ }
+
+ hole = new int[nrem*nvp];
+ if (!hole)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'hole' (%d).", nrem*nvp);
+ goto failure;
+ }
+ hreg = new int[nrem*nvp];
+ if (!hreg)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'hreg' (%d).", nrem*nvp);
+ goto failure;
+ }
+
+
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ unsigned short* p = &mesh.polys[i*nvp*2];
+ const int nv = countPolyVerts(p, nvp);
+ bool hasRem = false;
+ for (int j = 0; j < nv; ++j)
+ if (p[j] == rem) hasRem = true;
+ if (hasRem)
+ {
+ // Collect edges which does not touch the removed vertex.
+ for (int j = 0, k = nv-1; j < nv; k = j++)
+ {
+ if (p[j] != rem && p[k] != rem)
+ {
+ int* e = &edges[nedges*3];
+ e[0] = p[k];
+ e[1] = p[j];
+ e[2] = mesh.regs[i];
+ nedges++;
+ }
+ }
+ // Remove the polygon.
+ unsigned short* p2 = &mesh.polys[(mesh.npolys-1)*nvp*2];
+ memcpy(p,p2,sizeof(unsigned short)*nvp);
+ mesh.regs[i] = mesh.regs[mesh.npolys-1];
+ mesh.npolys--;
+ --i;
+ }
+ }
+
+ // Remove vertex.
+ for (int i = (int)rem; i < mesh.nverts; ++i)
+ {
+ mesh.verts[i*3+0] = mesh.verts[(i+1)*3+0];
+ mesh.verts[i*3+1] = mesh.verts[(i+1)*3+1];
+ mesh.verts[i*3+2] = mesh.verts[(i+1)*3+2];
+ }
+ mesh.nverts--;
+
+ // Adjust indices to match the removed vertex layout.
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ unsigned short* p = &mesh.polys[i*nvp*2];
+ const int nv = countPolyVerts(p, nvp);
+ for (int j = 0; j < nv; ++j)
+ if (p[j] > rem) p[j]--;
+ }
+ for (int i = 0; i < nedges; ++i)
+ {
+ if (edges[i*3+0] > rem) edges[i*3+0]--;
+ if (edges[i*3+1] > rem) edges[i*3+1]--;
+ }
+
+ if (nedges == 0)
+ return true;
+
+ hole[nhole] = edges[0];
+ hreg[nhole] = edges[2];
+ nhole++;
+
+ while (nedges)
+ {
+ bool match = false;
+
+ for (int i = 0; i < nedges; ++i)
+ {
+ const int ea = edges[i*3+0];
+ const int eb = edges[i*3+1];
+ const int r = edges[i*3+2];
+ bool add = false;
+ if (hole[0] == eb)
+ {
+ pushFront(ea, hole, nhole);
+ pushFront(r, hreg, nhreg);
+ add = true;
+ }
+ else if (hole[nhole-1] == ea)
+ {
+ pushBack(eb, hole, nhole);
+ pushBack(r, hreg, nhreg);
+ add = true;
+ }
+ if (add)
+ {
+ // Remove edge.
+ edges[i*3+0] = edges[(nedges-1)*3+0];
+ edges[i*3+1] = edges[(nedges-1)*3+1];
+ edges[i*3+2] = edges[(nedges-1)*3+2];
+ --nedges;
+ match = true;
+ --i;
+ }
+ }
+
+ if (!match)
+ break;
+ }
+
+ tris = new int[nhole*3];
+ if (!tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'tris' (%d).", nhole*3);
+ goto failure;
+ }
+
+ tverts = new int[nhole*4];
+ if (!tverts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'tverts' (%d).", nhole*4);
+ goto failure;
+ }
+
+ thole = new int[nhole];
+ if (!tverts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'thole' (%d).", nhole);
+ goto failure;
+ }
+
+ // Generate temp vertex array for triangulation.
+ for (int i = 0; i < nhole; ++i)
+ {
+ const int pi = hole[i];
+ tverts[i*4+0] = mesh.verts[pi*3+0];
+ tverts[i*4+1] = mesh.verts[pi*3+1];
+ tverts[i*4+2] = mesh.verts[pi*3+2];
+ tverts[i*4+3] = 0;
+ thole[i] = i;
+ }
+
+ // Triangulate the hole.
+ ntris = triangulate(nhole, &tverts[0], &thole[0], tris);
+
+ // Merge the hole triangles back to polygons.
+ polys = new unsigned short[(ntris+1)*nvp];
+ if (!polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'polys' (%d).", (ntris+1)*nvp);
+ goto failure;
+ }
+ pregs = new unsigned short[ntris];
+ if (!pregs)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'pregs' (%d).", ntris);
+ goto failure;
+ }
+
+ tmpPoly = &polys[ntris*nvp];
+
+ // Build initial polygons.
+ memset(polys, 0xff, ntris*nvp*sizeof(unsigned short));
+ for (int j = 0; j < ntris; ++j)
+ {
+ int* t = &tris[j*3];
+ if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2])
+ {
+ polys[npolys*nvp+0] = (unsigned short)hole[t[0]];
+ polys[npolys*nvp+1] = (unsigned short)hole[t[1]];
+ polys[npolys*nvp+2] = (unsigned short)hole[t[2]];
+ pregs[npolys] = hreg[t[0]];
+ npolys++;
+ }
+ }
+ if (!npolys)
+ return true;
+
+ // Merge polygons.
+ if (nvp > 3)
+ {
+ while (true)
+ {
+ // Find best polygons to merge.
+ int bestMergeVal = 0;
+ int bestPa, bestPb, bestEa, bestEb;
+
+ for (int j = 0; j < npolys-1; ++j)
+ {
+ unsigned short* pj = &polys[j*nvp];
+ for (int k = j+1; k < npolys; ++k)
+ {
+ unsigned short* pk = &polys[k*nvp];
+ int ea, eb;
+ int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb, nvp);
+ if (v > bestMergeVal)
+ {
+ bestMergeVal = v;
+ bestPa = j;
+ bestPb = k;
+ bestEa = ea;
+ bestEb = eb;
+ }
+ }
+ }
+
+ if (bestMergeVal > 0)
+ {
+ // Found best, merge.
+ unsigned short* pa = &polys[bestPa*nvp];
+ unsigned short* pb = &polys[bestPb*nvp];
+ mergePolys(pa, pb, mesh.verts, bestEa, bestEb, tmpPoly, nvp);
+ memcpy(pb, &polys[(npolys-1)*nvp], sizeof(unsigned short)*nvp);
+ pregs[bestPb] = pregs[npolys-1];
+ npolys--;
+ }
+ else
+ {
+ // Could not merge any polygons, stop.
+ break;
+ }
+ }
+ }
+
+ // Store polygons.
+ for (int i = 0; i < npolys; ++i)
+ {
+ if (mesh.npolys >= maxTris) break;
+ unsigned short* p = &mesh.polys[mesh.npolys*nvp*2];
+ memset(p,0xff,sizeof(unsigned short)*nvp*2);
+ for (int j = 0; j < nvp; ++j)
+ p[j] = polys[i*nvp+j];
+ mesh.regs[mesh.npolys] = pregs[i];
+ mesh.npolys++;
+ }
+
+ delete [] edges;
+ delete [] hole;
+ delete [] hreg;
+ delete [] tris;
+ delete [] thole;
+ delete [] tverts;
+ delete [] polys;
+ delete [] pregs;
+
+ return true;
+
+failure:
+ delete [] edges;
+ delete [] hole;
+ delete [] hreg;
+ delete [] tris;
+ delete [] thole;
+ delete [] tverts;
+ delete [] polys;
+ delete [] pregs;
+
+ return false;
+}
+
+
+bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh)
+{
+ unsigned short* tmpPoly;
+ rcTimeVal startTime = rcGetPerformanceTimer();
+ rcTimeVal endTime;
+
+ vcopy(mesh.bmin, cset.bmin);
+ vcopy(mesh.bmax, cset.bmax);
+ mesh.cs = cset.cs;
+ mesh.ch = cset.ch;
+
+ int maxVertices = 0;
+ int maxTris = 0;
+ int maxVertsPerCont = 0;
+ for (int i = 0; i < cset.nconts; ++i)
+ {
+ maxVertices += cset.conts[i].nverts;
+ maxTris += cset.conts[i].nverts - 2;
+ maxVertsPerCont = rcMax(maxVertsPerCont, cset.conts[i].nverts);
+ }
+
+ if (maxVertices >= 0xfffe)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Too many vertices %d.", maxVertices);
+ return false;
+ }
+
+ unsigned char* vflags = 0;
+ int* nextVert = 0;
+ int* firstVert = 0;
+ int* indices = 0;
+ int* tris = 0;
+ unsigned short* polys = 0;
+
+ vflags = new unsigned char[maxVertices];
+ if (!vflags)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.verts' (%d).", maxVertices);
+ goto failure;
+ }
+ memset(vflags, 0, maxVertices);
+
+ mesh.verts = new unsigned short[maxVertices*3];
+ if (!mesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.verts' (%d).", maxVertices);
+ goto failure;
+ }
+ mesh.polys = new unsigned short[maxTris*nvp*2];
+ if (!mesh.polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.polys' (%d).", maxTris*nvp*2);
+ goto failure;
+ }
+ mesh.regs = new unsigned short[maxTris];
+ if (!mesh.regs)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.regs' (%d).", maxTris);
+ goto failure;
+ }
+ mesh.nverts = 0;
+ mesh.npolys = 0;
+ mesh.nvp = nvp;
+
+ memset(mesh.verts, 0, sizeof(unsigned short)*maxVertices*3);
+ memset(mesh.polys, 0xff, sizeof(unsigned short)*maxTris*nvp*2);
+ memset(mesh.regs, 0, sizeof(unsigned short)*maxTris);
+
+ nextVert = new int[maxVertices];
+ if (!nextVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'nextVert' (%d).", maxVertices);
+ goto failure;
+ }
+ memset(nextVert, 0, sizeof(int)*maxVertices);
+
+ firstVert = new int[VERTEX_BUCKET_COUNT];
+ if (!firstVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'firstVert' (%d).", VERTEX_BUCKET_COUNT);
+ goto failure;
+ }
+ for (int i = 0; i < VERTEX_BUCKET_COUNT; ++i)
+ firstVert[i] = -1;
+
+ indices = new int[maxVertsPerCont];
+ if (!indices)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'indices' (%d).", maxVertsPerCont);
+ goto failure;
+ }
+ tris = new int[maxVertsPerCont*3];
+ if (!tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'tris' (%d).", maxVertsPerCont*3);
+ goto failure;
+ }
+ polys = new unsigned short[(maxVertsPerCont+1)*nvp];
+ if (!polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'polys' (%d).", maxVertsPerCont*nvp);
+ goto failure;
+ }
+ tmpPoly = &polys[maxVertsPerCont*nvp];
+
+ for (int i = 0; i < cset.nconts; ++i)
+ {
+ rcContour& cont = cset.conts[i];
+
+ // Skip empty contours.
+ if (cont.nverts < 3)
+ continue;
+
+ // Triangulate contour
+ for (int j = 0; j < cont.nverts; ++j)
+ indices[j] = j;
+
+ int ntris = triangulate(cont.nverts, cont.verts, &indices[0], &tris[0]);
+ if (ntris <= 0)
+ {
+ // Bad triangulation, should not happen.
+/* for (int k = 0; k < cont.nverts; ++k)
+ {
+ const int* v = &cont.verts[k*4];
+ printf("\t\t%d,%d,%d,%d,\n", v[0], v[1], v[2], v[3]);
+ if (nBadPos < 100)
+ {
+ badPos[nBadPos*3+0] = v[0];
+ badPos[nBadPos*3+1] = v[1];
+ badPos[nBadPos*3+2] = v[2];
+ nBadPos++;
+ }
+ }*/
+ ntris = -ntris;
+ }
+ // Add and merge vertices.
+ for (int j = 0; j < cont.nverts; ++j)
+ {
+ const int* v = &cont.verts[j*4];
+ indices[j] = addVertex((unsigned short)v[0], (unsigned short)v[1], (unsigned short)v[2],
+ mesh.verts, firstVert, nextVert, mesh.nverts);
+ if (v[3] & RC_BORDER_VERTEX)
+ {
+ // This vertex should be removed.
+ vflags[indices[j]] = 1;
+ }
+ }
+
+ // Build initial polygons.
+ int npolys = 0;
+ memset(polys, 0xff, maxVertsPerCont*nvp*sizeof(unsigned short));
+ for (int j = 0; j < ntris; ++j)
+ {
+ int* t = &tris[j*3];
+ if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2])
+ {
+ polys[npolys*nvp+0] = (unsigned short)indices[t[0]];
+ polys[npolys*nvp+1] = (unsigned short)indices[t[1]];
+ polys[npolys*nvp+2] = (unsigned short)indices[t[2]];
+ npolys++;
+ }
+ }
+ if (!npolys)
+ continue;
+
+ // Merge polygons.
+ if (nvp > 3)
+ {
+ while (true)
+ {
+ // Find best polygons to merge.
+ int bestMergeVal = 0;
+ int bestPa, bestPb, bestEa, bestEb;
+
+ for (int j = 0; j < npolys-1; ++j)
+ {
+ unsigned short* pj = &polys[j*nvp];
+ for (int k = j+1; k < npolys; ++k)
+ {
+ unsigned short* pk = &polys[k*nvp];
+ int ea, eb;
+ int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb, nvp);
+ if (v > bestMergeVal)
+ {
+ bestMergeVal = v;
+ bestPa = j;
+ bestPb = k;
+ bestEa = ea;
+ bestEb = eb;
+ }
+ }
+ }
+
+ if (bestMergeVal > 0)
+ {
+ // Found best, merge.
+ unsigned short* pa = &polys[bestPa*nvp];
+ unsigned short* pb = &polys[bestPb*nvp];
+ mergePolys(pa, pb, mesh.verts, bestEa, bestEb, tmpPoly, nvp);
+ memcpy(pb, &polys[(npolys-1)*nvp], sizeof(unsigned short)*nvp);
+ npolys--;
+ }
+ else
+ {
+ // Could not merge any polygons, stop.
+ break;
+ }
+ }
+ }
+
+
+ // Store polygons.
+ for (int j = 0; j < npolys; ++j)
+ {
+ unsigned short* p = &mesh.polys[mesh.npolys*nvp*2];
+ unsigned short* q = &polys[j*nvp];
+ for (int k = 0; k < nvp; ++k)
+ p[k] = q[k];
+ mesh.regs[mesh.npolys] = cont.reg;
+ mesh.npolys++;
+ }
+ }
+
+
+ // Remove edge vertices.
+ for (int i = 0; i < mesh.nverts; ++i)
+ {
+ if (vflags[i])
+ {
+ if (!removeVertex(mesh, i, maxTris))
+ goto failure;
+ for (int j = i; j < mesh.nverts-1; ++j)
+ vflags[j] = vflags[j+1];
+ --i;
+ }
+ }
+
+ delete [] vflags;
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] indices;
+ delete [] tris;
+
+ // Calculate adjacency.
+ if (!buildMeshAdjacency(mesh.polys, mesh.npolys, mesh.nverts, nvp))
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Adjacency failed.");
+ return false;
+ }
+
+ endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Build polymesh: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->buildPolymesh += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+
+failure:
+ delete [] vflags;
+ delete [] tmpPoly;
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] indices;
+ delete [] tris;
+
+ return false;
+}
+
+bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh)
+{
+ if (!nmeshes || !meshes)
+ return true;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+ rcTimeVal endTime;
+
+ int* nextVert = 0;
+ int* firstVert = 0;
+ unsigned short* vremap = 0;
+
+ mesh.nvp = meshes[0]->nvp;
+ mesh.cs = meshes[0]->cs;
+ mesh.ch = meshes[0]->ch;
+ vcopy(mesh.bmin, meshes[0]->bmin);
+ vcopy(mesh.bmax, meshes[0]->bmax);
+
+ int maxVerts = 0;
+ int maxPolys = 0;
+ int maxVertsPerMesh = 0;
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ vmin(mesh.bmin, meshes[i]->bmin);
+ vmax(mesh.bmax, meshes[i]->bmax);
+ maxVertsPerMesh = rcMax(maxVertsPerMesh, meshes[i]->nverts);
+ maxVerts += meshes[i]->nverts;
+ maxPolys += meshes[i]->npolys;
+ }
+
+ mesh.nverts = 0;
+ mesh.verts = new unsigned short[maxVerts*3];
+ if (!mesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.verts' (%d).", maxVerts*3);
+ return false;
+ }
+
+ mesh.npolys = 0;
+ mesh.polys = new unsigned short[maxPolys*2*mesh.nvp];
+ if (!mesh.polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.polys' (%d).", maxPolys*2*mesh.nvp);
+ return false;
+ }
+ memset(mesh.polys, 0xff, sizeof(unsigned short)*maxPolys*2*mesh.nvp);
+
+ mesh.regs = new unsigned short[maxPolys];
+ if (!mesh.regs)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.regs' (%d).", maxPolys);
+ return false;
+ }
+ memset(mesh.regs, 0, sizeof(unsigned short)*maxPolys);
+
+ nextVert = new int[maxVerts];
+ if (!nextVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'nextVert' (%d).", maxVerts);
+ goto failure;
+ }
+ memset(nextVert, 0, sizeof(int)*maxVerts);
+
+ firstVert = new int[VERTEX_BUCKET_COUNT];
+ if (!firstVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'firstVert' (%d).", VERTEX_BUCKET_COUNT);
+ goto failure;
+ }
+ for (int i = 0; i < VERTEX_BUCKET_COUNT; ++i)
+ firstVert[i] = -1;
+
+ vremap = new unsigned short[maxVertsPerMesh];
+ if (!vremap)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'vremap' (%d).", maxVertsPerMesh);
+ goto failure;
+ }
+ memset(nextVert, 0, sizeof(int)*maxVerts);
+
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ const rcPolyMesh* pmesh = meshes[i];
+
+ const unsigned short ox = (unsigned short)floorf((pmesh->bmin[0]-mesh.bmin[0])/mesh.cs+0.5f);
+ const unsigned short oz = (unsigned short)floorf((pmesh->bmin[2]-mesh.bmin[2])/mesh.cs+0.5f);
+
+ for (int j = 0; j < pmesh->nverts; ++j)
+ {
+ unsigned short* v = &pmesh->verts[j*3];
+ vremap[j] = addVertex(v[0]+ox, v[1], v[2]+oz,
+ mesh.verts, firstVert, nextVert, mesh.nverts);
+ }
+
+ for (int j = 0; j < pmesh->npolys; ++j)
+ {
+ unsigned short* tgt = &mesh.polys[mesh.npolys*2*mesh.nvp];
+ unsigned short* src = &pmesh->polys[j*2*mesh.nvp];
+ mesh.regs[mesh.npolys] = pmesh->regs[j];
+ mesh.npolys++;
+ for (int k = 0; k < mesh.nvp; ++k)
+ {
+ if (src[k] == 0xffff) break;
+ tgt[k] = vremap[src[k]];
+ }
+ }
+ }
+
+ // Calculate adjacency.
+ if (!buildMeshAdjacency(mesh.polys, mesh.npolys, mesh.nverts, mesh.nvp))
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Adjacency failed.");
+ return false;
+ }
+
+
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] vremap;
+
+ endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->mergePolyMesh += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+
+failure:
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] vremap;
+
+ return false;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
new file mode 100644
index 00000000000..b43346c53e2
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
@@ -0,0 +1,989 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <float.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+struct rcHeightPatch
+{
+ inline rcHeightPatch() : data(0) {}
+ inline ~rcHeightPatch() { delete [] data; }
+ unsigned short* data;
+ int xmin, ymin, width, height;
+};
+
+
+static int circumCircle(const float xp, const float yp,
+ const float x1, const float y1,
+ const float x2, const float y2,
+ const float x3, const float y3,
+ float& xc, float& yc, float& rsqr)
+{
+ static const float EPSILON = 1e-6f;
+
+ const float fabsy1y2 = rcAbs(y1-y2);
+ const float fabsy2y3 = rcAbs(y2-y3);
+
+ /* Check for coincident points */
+ if (fabsy1y2 < EPSILON && fabsy2y3 < EPSILON)
+ return 0;
+
+ if (fabsy1y2 < EPSILON)
+ {
+ const float m2 = - (x3-x2) / (y3-y2);
+ const float mx2 = (x2 + x3) / 2.0f;
+ const float my2 = (y2 + y3) / 2.0f;
+ xc = (x2 + x1) / 2.0f;
+ yc = m2 * (xc - mx2) + my2;
+ }
+ else if (fabsy2y3 < EPSILON)
+ {
+ const float m1 = - (x2-x1) / (y2-y1);
+ const float mx1 = (x1 + x2) / 2.0f;
+ const float my1 = (y1 + y2) / 2.0f;
+ xc = (x3 + x2) / 2.0f;
+ yc = m1 * (xc - mx1) + my1;
+ }
+ else
+ {
+ const float m1 = - (x2-x1) / (y2-y1);
+ const float m2 = - (x3-x2) / (y3-y2);
+ const float mx1 = (x1 + x2) / 2.0f;
+ const float mx2 = (x2 + x3) / 2.0f;
+ const float my1 = (y1 + y2) / 2.0f;
+ const float my2 = (y2 + y3) / 2.0f;
+ xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
+ if (fabsy1y2 > fabsy2y3)
+ yc = m1 * (xc - mx1) + my1;
+ else
+ yc = m2 * (xc - mx2) + my2;
+ }
+
+ float dx,dy;
+
+ dx = x2 - xc;
+ dy = y2 - yc;
+ rsqr = dx*dx + dy*dy;
+
+ dx = xp - xc;
+ dy = yp - yc;
+ const float drsqr = dx*dx + dy*dy;
+
+ return (drsqr <= rsqr) ? 1 : 0;
+}
+
+#if defined(_MSC_VER)
+static int ptcmp(void* up, const void *v1, const void *v2)
+#else
+static int ptcmp(const void *v1, const void *v2, void* up)
+#endif
+{
+ const float* verts = (const float*)up;
+ const float* p1 = &verts[(*(const int*)v1)*3];
+ const float* p2 = &verts[(*(const int*)v2)*3];
+ if (p1[0] < p2[0])
+ return -1;
+ else if (p1[0] > p2[0])
+ return 1;
+ else
+ return 0;
+}
+
+// Based on Paul Bourke's triangulate.c
+// http://astronomy.swin.edu.au/~pbourke/terrain/triangulate/triangulate.c
+static void delaunay(const int nv, float *verts, rcIntArray& idx, rcIntArray& tris, rcIntArray& edges)
+{
+ // Sort vertices
+ idx.resize(nv);
+ for (int i = 0; i < nv; ++i)
+ idx[i] = i;
+#if defined(_MSC_VER)
+ qsort_s(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
+#else
+ qsort_r(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
+#endif
+
+ // Find the maximum and minimum vertex bounds.
+ // This is to allow calculation of the bounding triangle
+ float xmin = verts[0];
+ float ymin = verts[2];
+ float xmax = xmin;
+ float ymax = ymin;
+ for (int i = 1; i < nv; ++i)
+ {
+ xmin = rcMin(xmin, verts[i*3+0]);
+ xmax = rcMax(xmax, verts[i*3+0]);
+ ymin = rcMin(ymin, verts[i*3+2]);
+ ymax = rcMax(ymax, verts[i*3+2]);
+ }
+ float dx = xmax - xmin;
+ float dy = ymax - ymin;
+ float dmax = (dx > dy) ? dx : dy;
+ float xmid = (xmax + xmin) / 2.0f;
+ float ymid = (ymax + ymin) / 2.0f;
+
+ // Set up the supertriangle
+ // This is a triangle which encompasses all the sample points.
+ // The supertriangle coordinates are added to the end of the
+ // vertex list. The supertriangle is the first triangle in
+ // the triangle list.
+ float sv[3*3];
+
+ sv[0] = xmid - 20 * dmax;
+ sv[1] = 0;
+ sv[2] = ymid - dmax;
+
+ sv[3] = xmid;
+ sv[4] = 0;
+ sv[5] = ymid + 20 * dmax;
+
+ sv[6] = xmid + 20 * dmax;
+ sv[7] = 0;
+ sv[8] = ymid - dmax;
+
+ tris.push(-3);
+ tris.push(-2);
+ tris.push(-1);
+ tris.push(0); // not completed
+
+ for (int i = 0; i < nv; ++i)
+ {
+ const float xp = verts[idx[i]*3+0];
+ const float yp = verts[idx[i]*3+2];
+
+ edges.resize(0);
+
+ // Set up the edge buffer.
+ // If the point (xp,yp) lies inside the circumcircle then the
+ // three edges of that triangle are added to the edge buffer
+ // and that triangle is removed.
+ for (int j = 0; j < tris.size()/4; ++j)
+ {
+ int* t = &tris[j*4];
+ if (t[3]) // completed?
+ continue;
+ const float* v1 = t[0] < 0 ? &sv[(t[0]+3)*3] : &verts[idx[t[0]]*3];
+ const float* v2 = t[1] < 0 ? &sv[(t[1]+3)*3] : &verts[idx[t[1]]*3];
+ const float* v3 = t[2] < 0 ? &sv[(t[2]+3)*3] : &verts[idx[t[2]]*3];
+ float xc,yc,rsqr;
+ int inside = circumCircle(xp,yp, v1[0],v1[2], v2[0],v2[2], v3[0],v3[2], xc,yc,rsqr);
+ if (xc < xp && rcSqr(xp-xc) > rsqr)
+ t[3] = 1;
+ if (inside)
+ {
+ // Collect triangle edges.
+ edges.push(t[0]);
+ edges.push(t[1]);
+ edges.push(t[1]);
+ edges.push(t[2]);
+ edges.push(t[2]);
+ edges.push(t[0]);
+ // Remove triangle j.
+ t[0] = tris[tris.size()-4];
+ t[1] = tris[tris.size()-3];
+ t[2] = tris[tris.size()-2];
+ t[3] = tris[tris.size()-1];
+ tris.resize(tris.size()-4);
+ j--;
+ }
+ }
+
+ // Remove duplicate edges.
+ const int ne = edges.size()/2;
+ for (int j = 0; j < ne-1; ++j)
+ {
+ for (int k = j+1; k < ne; ++k)
+ {
+ // Dupe?, make null.
+ if ((edges[j*2+0] == edges[k*2+1]) && (edges[j*2+1] == edges[k*2+0]))
+ {
+ edges[j*2+0] = 0;
+ edges[j*2+1] = 0;
+ edges[k*2+0] = 0;
+ edges[k*2+1] = 0;
+ }
+ }
+ }
+
+ // Form new triangles for the current point
+ // Skipping over any null.
+ // All edges are arranged in clockwise order.
+ for (int j = 0; j < ne; ++j)
+ {
+ if (edges[j*2+0] == edges[j*2+1]) continue;
+ tris.push(edges[j*2+0]);
+ tris.push(edges[j*2+1]);
+ tris.push(i);
+ tris.push(0); // not completed
+ }
+ }
+
+ // Remove triangles with supertriangle vertices
+ // These are triangles which have a vertex number greater than nv
+ for (int i = 0; i < tris.size()/4; ++i)
+ {
+ int* t = &tris[i*4];
+ if (t[0] < 0 || t[1] < 0 || t[2] < 0)
+ {
+ t[0] = tris[tris.size()-4];
+ t[1] = tris[tris.size()-3];
+ t[2] = tris[tris.size()-2];
+ t[3] = tris[tris.size()-1];
+ tris.resize(tris.size()-4);
+ i--;
+ }
+ }
+ // Triangle vertices are pointing to sorted vertices, remap indices.
+ for (int i = 0; i < tris.size(); ++i)
+ tris[i] = idx[tris[i]];
+}
+
+inline float vdot2(const float* a, const float* b)
+{
+ return a[0]*b[0] + a[2]*b[2];
+}
+
+static float distPtTri(const float* p, const float* a, const float* b, const float* c)
+{
+ float v0[3], v1[3], v2[3];
+ vsub(v0, c,a);
+ vsub(v1, b,a);
+ vsub(v2, p,a);
+
+ const float dot00 = vdot2(v0, v0);
+ const float dot01 = vdot2(v0, v1);
+ const float dot02 = vdot2(v0, v2);
+ const float dot11 = vdot2(v1, v1);
+ const float dot12 = vdot2(v1, v2);
+
+ // Compute barycentric coordinates
+ float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
+ float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ // If point lies inside the triangle, return interpolated y-coord.
+ static const float EPS = 1e-4f;
+ if (u >= -EPS && v >= -EPS && (u+v) <= 1+EPS)
+ {
+ float y = a[1] + v0[1]*u + v1[1]*v;
+ return fabsf(y-p[1]);
+ }
+ return FLT_MAX;
+}
+
+static float distancePtSeg(const float* pt, const float* p, const float* q)
+{
+ float pqx = q[0] - p[0];
+ float pqy = q[1] - p[1];
+ float pqz = q[2] - p[2];
+ float dx = pt[0] - p[0];
+ float dy = pt[1] - p[1];
+ float dz = pt[2] - p[2];
+ float d = pqx*pqx + pqy*pqy + pqz*pqz;
+ float t = pqx*dx + pqy*dy + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = p[0] + t*pqx - pt[0];
+ dy = p[1] + t*pqy - pt[1];
+ dz = p[2] + t*pqz - pt[2];
+
+ return dx*dx + dy*dy + dz*dz;
+}
+
+static float distancePtSeg2d(const float* pt, const float* p, const float* q)
+{
+ float pqx = q[0] - p[0];
+ float pqz = q[2] - p[2];
+ float dx = pt[0] - p[0];
+ float dz = pt[2] - p[2];
+ float d = pqx*pqx + pqz*pqz;
+ float t = pqx*dx + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = p[0] + t*pqx - pt[0];
+ dz = p[2] + t*pqz - pt[2];
+
+ return dx*dx + dz*dz;
+}
+
+static float distToTriMesh(const float* p, const float* verts, int nverts, const int* tris, int ntris)
+{
+ float dmin = FLT_MAX;
+ for (int i = 0; i < ntris; ++i)
+ {
+ const float* va = &verts[tris[i*4+0]*3];
+ const float* vb = &verts[tris[i*4+1]*3];
+ const float* vc = &verts[tris[i*4+2]*3];
+ float d = distPtTri(p, va,vb,vc);
+ if (d < dmin)
+ dmin = d;
+ }
+ if (dmin == FLT_MAX) return -1;
+ return dmin;
+}
+
+static float distToPoly(int nvert, const float* verts, const float* p)
+{
+
+ float dmin = FLT_MAX;
+ int i, j, c = 0;
+ for (i = 0, j = nvert-1; i < nvert; j = i++)
+ {
+ const float* vi = &verts[i*3];
+ const float* vj = &verts[j*3];
+ if (((vi[2] > p[2]) != (vj[2] > p[2])) &&
+ (p[0] < (vj[0]-vi[0]) * (p[2]-vi[2]) / (vj[2]-vi[2]) + vi[0]) )
+ c = !c;
+ dmin = rcMin(dmin, distancePtSeg2d(p, vj, vi));
+ }
+ return c ? -dmin : dmin;
+}
+
+
+static unsigned short getHeight(const float* pos, const float* bmin, const float ics, const rcHeightPatch& hp)
+{
+ int ix = (int)floorf((pos[0]-bmin[0])*ics + 0.01f);
+ int iz = (int)floorf((pos[2]-bmin[2])*ics + 0.01f);
+ ix = rcClamp(ix-hp.xmin, 0, hp.width);
+ iz = rcClamp(iz-hp.ymin, 0, hp.height);
+ unsigned short h = hp.data[ix+iz*hp.width];
+ return h;
+}
+
+static bool buildPolyDetail(const float* in, const int nin, unsigned short reg,
+ const float sampleDist, const float sampleMaxError,
+ const rcCompactHeightfield& chf, const rcHeightPatch& hp,
+ float* verts, int& nverts, rcIntArray& tris,
+ rcIntArray& edges, rcIntArray& idx, rcIntArray& samples)
+{
+ static const int MAX_VERTS = 256;
+ static const int MAX_EDGE = 64;
+ float edge[(MAX_EDGE+1)*3];
+
+ nverts = 0;
+
+ for (int i = 0; i < nin; ++i)
+ vcopy(&verts[i*3], &in[i*3]);
+ nverts = nin;
+
+ const float ics = 1.0f/chf.cs;
+
+ // Tesselate outlines.
+ // This is done in separate pass in order to ensure
+ // seamless height values across the ply boundaries.
+ if (sampleDist > 0)
+ {
+ for (int i = 0, j = nin-1; i < nin; j=i++)
+ {
+ const float* vj = &in[j*3];
+ const float* vi = &in[i*3];
+ // Make sure the segments are always handled in same order
+ // using lexological sort or else there will be seams.
+ if (fabsf(vj[0]-vi[0]) < 1e-6f)
+ {
+ if (vj[2] > vi[2])
+ rcSwap(vj,vi);
+ }
+ else
+ {
+ if (vj[0] > vi[0])
+ rcSwap(vj,vi);
+ }
+ // Create samples along the edge.
+ float dx = vi[0] - vj[0];
+ float dy = vi[1] - vj[1];
+ float dz = vi[2] - vj[2];
+ float d = sqrtf(dx*dx + dz*dz);
+ int nn = 1 + (int)floorf(d/sampleDist);
+ if (nn > MAX_EDGE) nn = MAX_EDGE;
+ if (nverts+nn >= MAX_VERTS)
+ nn = MAX_VERTS-1-nverts;
+ for (int k = 0; k <= nn; ++k)
+ {
+ float u = (float)k/(float)nn;
+ float* pos = &edge[k*3];
+ pos[0] = vj[0] + dx*u;
+ pos[1] = vj[1] + dy*u;
+ pos[2] = vj[2] + dz*u;
+ pos[1] = chf.bmin[1] + getHeight(pos, chf.bmin, ics, hp)*chf.ch;
+ }
+ // Simplify samples.
+ int idx[MAX_EDGE] = {0,nn};
+ int nidx = 2;
+ for (int k = 0; k < nidx-1; )
+ {
+ const int a = idx[k];
+ const int b = idx[k+1];
+ const float* va = &edge[a*3];
+ const float* vb = &edge[b*3];
+ // Find maximum deviation along the segment.
+ float maxd = 0;
+ int maxi = -1;
+ for (int m = a+1; m < b; ++m)
+ {
+ float d = distancePtSeg(&edge[m*3],va,vb);
+ if (d > maxd)
+ {
+ maxd = d;
+ maxi = m;
+ }
+ }
+ // If the max deviation is larger than accepted error,
+ // add new point, else continue to next segment.
+ if (maxi != -1 && maxd > rcSqr(sampleMaxError))
+ {
+ for (int m = nidx; m > k; --m)
+ idx[m] = idx[m-1];
+ idx[k+1] = maxi;
+ nidx++;
+ }
+ else
+ {
+ ++k;
+ }
+ }
+ // Add new vertices.
+ for (int k = 1; k < nidx-1; ++k)
+ {
+ vcopy(&verts[nverts*3], &edge[idx[k]*3]);
+ nverts++;
+ }
+ }
+ }
+
+ // Tesselate the base mesh.
+ edges.resize(0);
+ tris.resize(0);
+ idx.resize(0);
+ delaunay(nverts, verts, idx, tris, edges);
+
+ if (sampleDist > 0)
+ {
+ // Create sample locations in a grid.
+ float bmin[3], bmax[3];
+ vcopy(bmin, in);
+ vcopy(bmax, in);
+ for (int i = 1; i < nin; ++i)
+ {
+ vmin(bmin, &in[i*3]);
+ vmax(bmax, &in[i*3]);
+ }
+ int x0 = (int)floorf(bmin[0]/sampleDist);
+ int x1 = (int)ceilf(bmax[0]/sampleDist);
+ int z0 = (int)floorf(bmin[2]/sampleDist);
+ int z1 = (int)ceilf(bmax[2]/sampleDist);
+ samples.resize(0);
+ for (int z = z0; z < z1; ++z)
+ {
+ for (int x = x0; x < x1; ++x)
+ {
+ float pt[3];
+ pt[0] = x*sampleDist;
+ pt[2] = z*sampleDist;
+ // Make sure the samples are not too close to the edges.
+ if (distToPoly(nin,in,pt) > -sampleDist/2) continue;
+ samples.push(x);
+ samples.push(getHeight(pt, chf.bmin, ics, hp));
+ samples.push(z);
+ }
+ }
+
+ // Add the samples starting from the one that has the most
+ // error. The procedure stops when all samples are added
+ // or when the max error is within treshold.
+ const int nsamples = samples.size()/3;
+ for (int iter = 0; iter < nsamples; ++iter)
+ {
+ // Find sample with most error.
+ float bestpt[3];
+ float bestd = 0;
+ for (int i = 0; i < nsamples; ++i)
+ {
+ float pt[3];
+ pt[0] = samples[i*3+0]*sampleDist;
+ pt[1] = chf.bmin[1] + samples[i*3+1]*chf.ch;
+ pt[2] = samples[i*3+2]*sampleDist;
+ float d = distToTriMesh(pt, verts, nverts, &tris[0], tris.size()/4);
+ if (d < 0) continue; // did not hit the mesh.
+ if (d > bestd)
+ {
+ bestd = d;
+ vcopy(bestpt,pt);
+ }
+ }
+ // If the max error is within accepted threshold, stop tesselating.
+ if (bestd <= sampleMaxError)
+ break;
+
+ // Add the new sample point.
+ vcopy(&verts[nverts*3],bestpt);
+ nverts++;
+
+ // Create new triangulation.
+ // TODO: Incremental add instead of full rebuild.
+ edges.resize(0);
+ tris.resize(0);
+ idx.resize(0);
+ delaunay(nverts, verts, idx, tris, edges);
+
+ if (nverts >= MAX_VERTS)
+ break;
+ }
+ }
+
+ return true;
+}
+
+static void getHeightData(const rcCompactHeightfield& chf,
+ const unsigned short* poly, const int npoly,
+ const unsigned short* verts,
+ rcHeightPatch& hp, rcIntArray& stack)
+{
+ // Floodfill the heightfield to get 2D height data,
+ // starting at vertex locations as seeds.
+
+ memset(hp.data, 0xff, sizeof(unsigned short)*hp.width*hp.height);
+
+ stack.resize(0);
+
+ // Use poly vertices as seed points for the flood fill.
+ for (int j = 0; j < npoly; ++j)
+ {
+ const int ax = (int)verts[poly[j]*3+0];
+ const int ay = (int)verts[poly[j]*3+1];
+ const int az = (int)verts[poly[j]*3+2];
+ if (ax < hp.xmin || ax >= hp.xmin+hp.width ||
+ az < hp.ymin || az >= hp.ymin+hp.height)
+ continue;
+
+ const rcCompactCell& c = chf.cells[ax+az*chf.width];
+ int dmin = 0xffff;
+ int ai = -1;
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+ int d = rcAbs(ay - (int)s.y);
+ if (d < dmin)
+ {
+ ai = i;
+ dmin = d;
+ }
+ }
+ if (ai != -1)
+ {
+ stack.push(ax);
+ stack.push(az);
+ stack.push(ai);
+ }
+ }
+
+ while (stack.size() > 0)
+ {
+ int ci = stack.pop();
+ int cy = stack.pop();
+ int cx = stack.pop();
+
+ // Skip already visited locations.
+ int idx = cx-hp.xmin+(cy-hp.ymin)*hp.width;
+ if (hp.data[idx] != 0xffff)
+ continue;
+
+ const rcCompactSpan& cs = chf.spans[ci];
+ hp.data[idx] = cs.y;
+
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(cs, dir) == 0xf) continue;
+
+ const int ax = cx + rcGetDirOffsetX(dir);
+ const int ay = cy + rcGetDirOffsetY(dir);
+
+ if (ax < hp.xmin || ax >= (hp.xmin+hp.width) ||
+ ay < hp.ymin || ay >= (hp.ymin+hp.height))
+ continue;
+
+ if (hp.data[ax-hp.xmin+(ay-hp.ymin)*hp.width] != 0xffff)
+ continue;
+
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(cs, dir);
+
+ stack.push(ax);
+ stack.push(ay);
+ stack.push(ai);
+ }
+ }
+}
+
+static unsigned char getEdgeFlags(const float* va, const float* vb,
+ const float* vpoly, const int npoly)
+{
+ // Return true if edge (va,vb) is part of the polygon.
+ static const float thrSqr = rcSqr(0.001f);
+ for (int i = 0, j = npoly-1; i < npoly; j=i++)
+ {
+ if (distancePtSeg2d(va, &vpoly[j*3], &vpoly[i*3]) < thrSqr &&
+ distancePtSeg2d(vb, &vpoly[j*3], &vpoly[i*3]) < thrSqr)
+ return 1;
+ }
+ return 0;
+}
+
+static unsigned char getTriFlags(const float* va, const float* vb, const float* vc,
+ const float* vpoly, const int npoly)
+{
+ unsigned char flags = 0;
+ flags |= getEdgeFlags(va,vb,vpoly,npoly) << 0;
+ flags |= getEdgeFlags(vb,vc,vpoly,npoly) << 2;
+ flags |= getEdgeFlags(vc,va,vpoly,npoly) << 4;
+ return flags;
+}
+
+
+
+bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& chf,
+ const float sampleDist, const float sampleMaxError,
+ rcPolyMeshDetail& dmesh)
+{
+ if (mesh.nverts == 0 || mesh.npolys == 0)
+ return true;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+ rcTimeVal endTime;
+
+ int vcap;
+ int tcap;
+
+ const int nvp = mesh.nvp;
+ const float cs = mesh.cs;
+ const float ch = mesh.ch;
+ const float* orig = mesh.bmin;
+
+ rcIntArray edges(64);
+ rcIntArray tris(512);
+ rcIntArray idx(512);
+ rcIntArray stack(512);
+ rcIntArray samples(512);
+ float verts[256*3];
+ float* poly = 0;
+ int* bounds = 0;
+ rcHeightPatch hp;
+ int nPolyVerts = 0;
+ int maxhw = 0, maxhh = 0;
+
+ bounds = new int[mesh.npolys*4];
+ if (!bounds)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'bounds' (%d).", mesh.npolys*4);
+ goto failure;
+ }
+ poly = new float[nvp*3];
+ if (!bounds)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'poly' (%d).", nvp*3);
+ goto failure;
+ }
+
+ // Find max size for a polygon area.
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ const unsigned short* p = &mesh.polys[i*nvp*2];
+ int& xmin = bounds[i*4+0];
+ int& xmax = bounds[i*4+1];
+ int& ymin = bounds[i*4+2];
+ int& ymax = bounds[i*4+3];
+ xmin = chf.width;
+ xmax = 0;
+ ymin = chf.height;
+ ymax = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if(p[j] == 0xffff) break;
+ const unsigned short* v = &mesh.verts[p[j]*3];
+ xmin = rcMin(xmin, (int)v[0]);
+ xmax = rcMax(xmax, (int)v[0]);
+ ymin = rcMin(ymin, (int)v[2]);
+ ymax = rcMax(ymax, (int)v[2]);
+ nPolyVerts++;
+ }
+ xmin = rcMax(0,xmin-1);
+ xmax = rcMin(chf.width,xmax+1);
+ ymin = rcMax(0,ymin-1);
+ ymax = rcMin(chf.height,ymax+1);
+ if (xmin >= xmax || ymin >= ymax) continue;
+ maxhw = rcMax(maxhw, xmax-xmin);
+ maxhh = rcMax(maxhh, ymax-ymin);
+ }
+
+ hp.data = new unsigned short[maxhw*maxhh];
+ if (!hp.data)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'hp.data' (%d).", maxhw*maxhh);
+ goto failure;
+ }
+
+ dmesh.nmeshes = mesh.npolys;
+ dmesh.nverts = 0;
+ dmesh.ntris = 0;
+ dmesh.meshes = new unsigned short[dmesh.nmeshes*4];
+ if (!dmesh.meshes)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.meshes' (%d).", dmesh.nmeshes*4);
+ goto failure;
+ }
+
+ vcap = nPolyVerts+nPolyVerts/2;
+ tcap = vcap*2;
+
+ dmesh.nverts = 0;
+ dmesh.verts = new float[vcap*3];
+ if (!dmesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.verts' (%d).", vcap*3);
+ goto failure;
+ }
+ dmesh.ntris = 0;
+ dmesh.tris = new unsigned char[tcap*4];
+ if (!dmesh.tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.tris' (%d).", tcap*4);
+ goto failure;
+ }
+
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ const unsigned short* p = &mesh.polys[i*nvp*2];
+
+ // Find polygon bounding box.
+ int npoly = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if(p[j] == 0xffff) break;
+ const unsigned short* v = &mesh.verts[p[j]*3];
+ poly[j*3+0] = orig[0] + v[0]*cs;
+ poly[j*3+1] = orig[1] + v[1]*ch;
+ poly[j*3+2] = orig[2] + v[2]*cs;
+ npoly++;
+ }
+
+ // Get the height data from the area of the polygon.
+ hp.xmin = bounds[i*4+0];
+ hp.ymin = bounds[i*4+2];
+ hp.width = bounds[i*4+1]-bounds[i*4+0];
+ hp.height = bounds[i*4+3]-bounds[i*4+2];
+ getHeightData(chf, p, npoly, mesh.verts, hp, stack);
+
+ // Build detail mesh.
+ int nverts = 0;
+ if (!buildPolyDetail(poly, npoly, mesh.regs[i],
+ sampleDist, sampleMaxError,
+ chf, hp, verts, nverts, tris,
+ edges, idx, samples))
+ {
+ goto failure;
+ }
+
+ // Offset detail vertices, unnecassary?
+ for (int j = 0; j < nverts; ++j)
+ verts[j*3+1] += chf.ch;
+
+ // Store detail submesh.
+ const int ntris = tris.size()/4;
+
+ dmesh.meshes[i*4+0] = dmesh.nverts;
+ dmesh.meshes[i*4+1] = (unsigned short)nverts;
+ dmesh.meshes[i*4+2] = dmesh.ntris;
+ dmesh.meshes[i*4+3] = (unsigned short)ntris;
+
+ // Store vertices, allocate more memory if necessary.
+ if (dmesh.nverts+nverts > vcap)
+ {
+ while (dmesh.nverts+nverts > vcap)
+ vcap += 256;
+
+ float* newv = new float[vcap*3];
+ if (!newv)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'newv' (%d).", vcap*3);
+ goto failure;
+ }
+ if (dmesh.nverts)
+ memcpy(newv, dmesh.verts, sizeof(float)*3*dmesh.nverts);
+ delete [] dmesh.verts;
+ dmesh.verts = newv;
+ }
+ for (int j = 0; j < nverts; ++j)
+ {
+ dmesh.verts[dmesh.nverts*3+0] = verts[j*3+0];
+ dmesh.verts[dmesh.nverts*3+1] = verts[j*3+1];
+ dmesh.verts[dmesh.nverts*3+2] = verts[j*3+2];
+ dmesh.nverts++;
+ }
+
+ // Store triangles, allocate more memory if necessary.
+ if (dmesh.ntris+ntris > tcap)
+ {
+ while (dmesh.ntris+ntris > tcap)
+ tcap += 256;
+ unsigned char* newt = new unsigned char[tcap*4];
+ if (!newt)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'newt' (%d).", tcap*4);
+ goto failure;
+ }
+ if (dmesh.ntris)
+ memcpy(newt, dmesh.tris, sizeof(unsigned char)*4*dmesh.ntris);
+ delete [] dmesh.tris;
+ dmesh.tris = newt;
+ }
+ for (int j = 0; j < ntris; ++j)
+ {
+ const int* t = &tris[j*4];
+ dmesh.tris[dmesh.ntris*4+0] = (unsigned char)t[0];
+ dmesh.tris[dmesh.ntris*4+1] = (unsigned char)t[1];
+ dmesh.tris[dmesh.ntris*4+2] = (unsigned char)t[2];
+ dmesh.tris[dmesh.ntris*4+3] = getTriFlags(&verts[t[0]*3], &verts[t[1]*3], &verts[t[2]*3], poly, npoly);
+ dmesh.ntris++;
+ }
+ }
+
+ delete [] bounds;
+ delete [] poly;
+
+ endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->buildDetailMesh += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+
+failure:
+
+ delete [] bounds;
+ delete [] poly;
+
+ return false;
+}
+
+bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPolyMeshDetail& mesh)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ int maxVerts = 0;
+ int maxTris = 0;
+ int maxMeshes = 0;
+
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ if (!meshes[i]) continue;
+ maxVerts += meshes[i]->nverts;
+ maxTris += meshes[i]->ntris;
+ maxMeshes += meshes[i]->nmeshes;
+ }
+
+ mesh.nmeshes = 0;
+ mesh.meshes = new unsigned short[maxMeshes*4];
+ if (!mesh.meshes)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'pmdtl.meshes' (%d).", maxMeshes*4);
+ return false;
+ }
+
+ mesh.ntris = 0;
+ mesh.tris = new unsigned char[maxTris*4];
+ if (!mesh.tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.tris' (%d).", maxTris*4);
+ return false;
+ }
+
+ mesh.nverts = 0;
+ mesh.verts = new float[maxVerts*3];
+ if (!mesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.verts' (%d).", maxVerts*3);
+ return false;
+ }
+
+ // Merge datas.
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ rcPolyMeshDetail* dm = meshes[i];
+ if (!dm) continue;
+ for (int j = 0; j < dm->nmeshes; ++j)
+ {
+ unsigned short* dst = &mesh.meshes[mesh.nmeshes*4];
+ unsigned short* src = &dm->meshes[j*4];
+ dst[0] = mesh.nverts+src[0];
+ dst[1] = src[1];
+ dst[2] = mesh.ntris+src[2];
+ dst[3] = src[3];
+ mesh.nmeshes++;
+ }
+
+ for (int k = 0; k < dm->nverts; ++k)
+ {
+ vcopy(&mesh.verts[mesh.nverts*3], &dm->verts[k*3]);
+ mesh.nverts++;
+ }
+ for (int k = 0; k < dm->ntris; ++k)
+ {
+ mesh.tris[mesh.ntris*4+0] = dm->tris[k*4+0];
+ mesh.tris[mesh.ntris*4+1] = dm->tris[k*4+1];
+ mesh.tris[mesh.ntris*4+2] = dm->tris[k*4+2];
+ mesh.tris[mesh.ntris*4+3] = dm->tris[k*4+3];
+ mesh.ntris++;
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->mergePolyMeshDetail += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+}
+
diff --git a/extern/recastnavigation/Recast/Source/RecastRasterization.cpp b/extern/recastnavigation/Recast/Source/RecastRasterization.cpp
new file mode 100644
index 00000000000..658b0e1fb51
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastRasterization.cpp
@@ -0,0 +1,308 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastTimer.h"
+#include "RecastLog.h"
+
+inline bool overlapBounds(const float* amin, const float* amax, const float* bmin, const float* bmax)
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap;
+ return overlap;
+}
+
+inline bool overlapInterval(unsigned short amin, unsigned short amax,
+ unsigned short bmin, unsigned short bmax)
+{
+ if (amax < bmin) return false;
+ if (amin > bmax) return false;
+ return true;
+}
+
+
+static rcSpan* allocSpan(rcHeightfield& hf)
+{
+ // If running out of memory, allocate new page and update the freelist.
+ if (!hf.freelist || !hf.freelist->next)
+ {
+ // Create new page.
+ // Allocate memory for the new pool.
+ const int size = (sizeof(rcSpanPool)-sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL;
+ rcSpanPool* pool = reinterpret_cast<rcSpanPool*>(new unsigned char[size]);
+ if (!pool) return 0;
+ pool->next = 0;
+ // Add the pool into the list of pools.
+ pool->next = hf.pools;
+ hf.pools = pool;
+ // Add new items to the free list.
+ rcSpan* freelist = hf.freelist;
+ rcSpan* head = &pool->items[0];
+ rcSpan* it = &pool->items[RC_SPANS_PER_POOL];
+ do
+ {
+ --it;
+ it->next = freelist;
+ freelist = it;
+ }
+ while (it != head);
+ hf.freelist = it;
+ }
+
+ // Pop item from in front of the free list.
+ rcSpan* it = hf.freelist;
+ hf.freelist = hf.freelist->next;
+ return it;
+}
+
+static void freeSpan(rcHeightfield& hf, rcSpan* ptr)
+{
+ if (!ptr) return;
+ // Add the node in front of the free list.
+ ptr->next = hf.freelist;
+ hf.freelist = ptr;
+}
+
+static void addSpan(rcHeightfield& hf, int x, int y,
+ unsigned short smin, unsigned short smax,
+ unsigned short flags)
+{
+ int idx = x + y*hf.width;
+
+ rcSpan* s = allocSpan(hf);
+ s->smin = smin;
+ s->smax = smax;
+ s->flags = flags;
+ s->next = 0;
+
+ // Empty cell, add he first span.
+ if (!hf.spans[idx])
+ {
+ hf.spans[idx] = s;
+ return;
+ }
+ rcSpan* prev = 0;
+ rcSpan* cur = hf.spans[idx];
+
+ // Insert and merge spans.
+ while (cur)
+ {
+ if (cur->smin > s->smax)
+ {
+ // Current span is further than the new span, break.
+ break;
+ }
+ else if (cur->smax < s->smin)
+ {
+ // Current span is before the new span advance.
+ prev = cur;
+ cur = cur->next;
+ }
+ else
+ {
+ // Merge spans.
+ if (cur->smin < s->smin)
+ s->smin = cur->smin;
+ if (cur->smax > s->smax)
+ s->smax = cur->smax;
+
+ // Merge flags.
+// if (s->smax == cur->smax)
+ if (rcAbs((int)s->smax - (int)cur->smax) <= 1)
+ s->flags |= cur->flags;
+
+ // Remove current span.
+ rcSpan* next = cur->next;
+ freeSpan(hf, cur);
+ if (prev)
+ prev->next = next;
+ else
+ hf.spans[idx] = next;
+ cur = next;
+ }
+ }
+
+ // Insert new span.
+ if (prev)
+ {
+ s->next = prev->next;
+ prev->next = s;
+ }
+ else
+ {
+ s->next = hf.spans[idx];
+ hf.spans[idx] = s;
+ }
+}
+
+static int clipPoly(const float* in, int n, float* out, float pnx, float pnz, float pd)
+{
+ float d[12];
+ for (int i = 0; i < n; ++i)
+ d[i] = pnx*in[i*3+0] + pnz*in[i*3+2] + pd;
+
+ int m = 0;
+ for (int i = 0, j = n-1; i < n; j=i, ++i)
+ {
+ bool ina = d[j] >= 0;
+ bool inb = d[i] >= 0;
+ if (ina != inb)
+ {
+ float s = d[j] / (d[j] - d[i]);
+ out[m*3+0] = in[j*3+0] + (in[i*3+0] - in[j*3+0])*s;
+ out[m*3+1] = in[j*3+1] + (in[i*3+1] - in[j*3+1])*s;
+ out[m*3+2] = in[j*3+2] + (in[i*3+2] - in[j*3+2])*s;
+ m++;
+ }
+ if (inb)
+ {
+ out[m*3+0] = in[i*3+0];
+ out[m*3+1] = in[i*3+1];
+ out[m*3+2] = in[i*3+2];
+ m++;
+ }
+ }
+ return m;
+}
+
+static void rasterizeTri(const float* v0, const float* v1, const float* v2,
+ unsigned char flags, rcHeightfield& hf,
+ const float* bmin, const float* bmax,
+ const float cs, const float ics, const float ich)
+{
+ const int w = hf.width;
+ const int h = hf.height;
+ float tmin[3], tmax[3];
+ const float by = bmax[1] - bmin[1];
+
+ // Calculate the bounding box of the triangle.
+ vcopy(tmin, v0);
+ vcopy(tmax, v0);
+ vmin(tmin, v1);
+ vmin(tmin, v2);
+ vmax(tmax, v1);
+ vmax(tmax, v2);
+
+ // If the triangle does not touch the bbox of the heightfield, skip the triagle.
+ if (!overlapBounds(bmin, bmax, tmin, tmax))
+ return;
+
+ // Calculate the footpring of the triangle on the grid.
+ int x0 = (int)((tmin[0] - bmin[0])*ics);
+ int y0 = (int)((tmin[2] - bmin[2])*ics);
+ int x1 = (int)((tmax[0] - bmin[0])*ics);
+ int y1 = (int)((tmax[2] - bmin[2])*ics);
+ x0 = rcClamp(x0, 0, w-1);
+ y0 = rcClamp(y0, 0, h-1);
+ x1 = rcClamp(x1, 0, w-1);
+ y1 = rcClamp(y1, 0, h-1);
+
+ // Clip the triangle into all grid cells it touches.
+ float in[7*3], out[7*3], inrow[7*3];
+
+ for (int y = y0; y <= y1; ++y)
+ {
+ // Clip polygon to row.
+ vcopy(&in[0], v0);
+ vcopy(&in[1*3], v1);
+ vcopy(&in[2*3], v2);
+ int nvrow = 3;
+ const float cz = bmin[2] + y*cs;
+ nvrow = clipPoly(in, nvrow, out, 0, 1, -cz);
+ if (nvrow < 3) continue;
+ nvrow = clipPoly(out, nvrow, inrow, 0, -1, cz+cs);
+ if (nvrow < 3) continue;
+
+ for (int x = x0; x <= x1; ++x)
+ {
+ // Clip polygon to column.
+ int nv = nvrow;
+ const float cx = bmin[0] + x*cs;
+ nv = clipPoly(inrow, nv, out, 1, 0, -cx);
+ if (nv < 3) continue;
+ nv = clipPoly(out, nv, in, -1, 0, cx+cs);
+ if (nv < 3) continue;
+
+ // Calculate min and max of the span.
+ float smin = in[1], smax = in[1];
+ for (int i = 1; i < nv; ++i)
+ {
+ smin = rcMin(smin, in[i*3+1]);
+ smax = rcMax(smax, in[i*3+1]);
+ }
+ smin -= bmin[1];
+ smax -= bmin[1];
+ // Skip the span if it is outside the heightfield bbox
+ if (smax < 0.0f) continue;
+ if (smin > by) continue;
+ // Clamp the span to the heightfield bbox.
+ if (smin < 0.0f) smin = bmin[1];
+ if (smax > by) smax = bmax[1];
+
+ // Snap the span to the heightfield height grid.
+ unsigned short ismin = (unsigned short)rcClamp((int)floorf(smin * ich), 0, 0x7fff);
+ unsigned short ismax = (unsigned short)rcClamp((int)ceilf(smax * ich), 0, 0x7fff);
+
+ addSpan(hf, x, y, ismin, ismax, flags);
+ }
+ }
+}
+
+void rcRasterizeTriangle(const float* v0, const float* v1, const float* v2,
+ unsigned char flags, rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const float ics = 1.0f/solid.cs;
+ const float ich = 1.0f/solid.ch;
+ rasterizeTri(v0, v1, v2, flags, solid, solid.bmin, solid.bmax, solid.cs, ics, ich);
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime);
+}
+
+void rcRasterizeTriangles(const float* verts, int nv,
+ const int* tris, const unsigned char* flags, int nt,
+ rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const float ics = 1.0f/solid.cs;
+ const float ich = 1.0f/solid.ch;
+ // Rasterize triangles.
+ for (int i = 0; i < nt; ++i)
+ {
+ const float* v0 = &verts[tris[i*3+0]*3];
+ const float* v1 = &verts[tris[i*3+1]*3];
+ const float* v2 = &verts[tris[i*3+2]*3];
+ // Rasterize.
+ rasterizeTri(v0, v1, v2, flags[i], solid, solid.bmin, solid.bmax, solid.cs, ics, ich);
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime);
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastRegion.cpp b/extern/recastnavigation/Recast/Source/RecastRegion.cpp
new file mode 100644
index 00000000000..5c557cf0681
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastRegion.cpp
@@ -0,0 +1,1081 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <float.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+static unsigned short* calculateDistanceField(rcCompactHeightfield& chf,
+ unsigned short* src, unsigned short* dst,
+ unsigned short& maxDist)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ // Init distance and points.
+ for (int i = 0; i < chf.spanCount; ++i)
+ src[i] = 0xffff;
+
+ // Mark boundary cells.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+ int nc = 0;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(s, dir) != 0xf)
+ nc++;
+ }
+ if (nc != 4)
+ src[i] = 0;
+ }
+ }
+ }
+
+ // Pass 1
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+
+ if (rcGetCon(s, 0) != 0xf)
+ {
+ // (-1,0)
+ const int ax = x + rcGetDirOffsetX(0);
+ const int ay = y + rcGetDirOffsetY(0);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 0);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (-1,-1)
+ if (rcGetCon(as, 3) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(3);
+ const int aay = ay + rcGetDirOffsetY(3);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 3);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ if (rcGetCon(s, 3) != 0xf)
+ {
+ // (0,-1)
+ const int ax = x + rcGetDirOffsetX(3);
+ const int ay = y + rcGetDirOffsetY(3);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 3);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (1,-1)
+ if (rcGetCon(as, 2) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(2);
+ const int aay = ay + rcGetDirOffsetY(2);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 2);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ }
+ }
+ }
+
+ // Pass 2
+ for (int y = h-1; y >= 0; --y)
+ {
+ for (int x = w-1; x >= 0; --x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+
+ if (rcGetCon(s, 2) != 0xf)
+ {
+ // (1,0)
+ const int ax = x + rcGetDirOffsetX(2);
+ const int ay = y + rcGetDirOffsetY(2);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 2);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (1,1)
+ if (rcGetCon(as, 1) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(1);
+ const int aay = ay + rcGetDirOffsetY(1);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 1);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ if (rcGetCon(s, 1) != 0xf)
+ {
+ // (0,1)
+ const int ax = x + rcGetDirOffsetX(1);
+ const int ay = y + rcGetDirOffsetY(1);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 1);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (-1,1)
+ if (rcGetCon(as, 0) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(0);
+ const int aay = ay + rcGetDirOffsetY(0);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 0);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ }
+ }
+ }
+
+ maxDist = 0;
+ for (int i = 0; i < chf.spanCount; ++i)
+ maxDist = rcMax(src[i], maxDist);
+
+ return src;
+
+}
+
+static unsigned short* boxBlur(rcCompactHeightfield& chf, int thr,
+ unsigned short* src, unsigned short* dst)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ thr *= 2;
+
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+ int cd = (int)src[i];
+ if (cd <= thr)
+ {
+ dst[i] = cd;
+ continue;
+ }
+
+ int d = cd;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir);
+ d += (int)src[ai];
+
+ const rcCompactSpan& as = chf.spans[ai];
+ const int dir2 = (dir+1) & 0x3;
+ if (rcGetCon(as, dir2) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dir2);
+ const int ay2 = ay + rcGetDirOffsetY(dir2);
+ const int ai2 = (int)chf.cells[ax2+ay2*w].index + rcGetCon(as, dir2);
+ d += (int)src[ai2];
+ }
+ else
+ {
+ d += cd;
+ }
+ }
+ else
+ {
+ d += cd*2;
+ }
+ }
+ dst[i] = (unsigned short)((d+5)/9);
+ }
+ }
+ }
+ return dst;
+}
+
+
+static bool floodRegion(int x, int y, int i,
+ unsigned short level, unsigned short minLevel, unsigned short r,
+ rcCompactHeightfield& chf,
+ unsigned short* src,
+ rcIntArray& stack)
+{
+ const int w = chf.width;
+
+ // Flood fill mark region.
+ stack.resize(0);
+ stack.push((int)x);
+ stack.push((int)y);
+ stack.push((int)i);
+ src[i*2] = r;
+ src[i*2+1] = 0;
+
+ unsigned short lev = level >= minLevel+2 ? level-2 : minLevel;
+ int count = 0;
+
+ while (stack.size() > 0)
+ {
+ int ci = stack.pop();
+ int cy = stack.pop();
+ int cx = stack.pop();
+
+ const rcCompactSpan& cs = chf.spans[ci];
+
+ // Check if any of the neighbours already have a valid region set.
+ unsigned short ar = 0;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ // 8 connected
+ if (rcGetCon(cs, dir) != 0xf)
+ {
+ const int ax = cx + rcGetDirOffsetX(dir);
+ const int ay = cy + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(cs, dir);
+ unsigned short nr = src[ai*2];
+ if (nr != 0 && nr != r)
+ ar = nr;
+
+ const rcCompactSpan& as = chf.spans[ai];
+
+ const int dir2 = (dir+1) & 0x3;
+ if (rcGetCon(as, dir2) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dir2);
+ const int ay2 = ay + rcGetDirOffsetY(dir2);
+ const int ai2 = (int)chf.cells[ax2+ay2*w].index + rcGetCon(as, dir2);
+
+ unsigned short nr = src[ai2*2];
+ if (nr != 0 && nr != r)
+ ar = nr;
+ }
+ }
+ }
+ if (ar != 0)
+ {
+ src[ci*2] = 0;
+ continue;
+ }
+ count++;
+
+ // Expand neighbours.
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(cs, dir) != 0xf)
+ {
+ const int ax = cx + rcGetDirOffsetX(dir);
+ const int ay = cy + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(cs, dir);
+ if (chf.spans[ai].dist >= lev)
+ {
+ if (src[ai*2] == 0)
+ {
+ src[ai*2] = r;
+ src[ai*2+1] = 0;
+ stack.push(ax);
+ stack.push(ay);
+ stack.push(ai);
+ }
+ }
+ }
+ }
+ }
+
+ return count > 0;
+}
+
+static unsigned short* expandRegions(int maxIter, unsigned short level,
+ rcCompactHeightfield& chf,
+ unsigned short* src,
+ unsigned short* dst,
+ rcIntArray& stack)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ // Find cells revealed by the raised level.
+ stack.resize(0);
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (chf.spans[i].dist >= level && src[i*2] == 0)
+ {
+ stack.push(x);
+ stack.push(y);
+ stack.push(i);
+ }
+ }
+ }
+ }
+
+ int iter = 0;
+ while (stack.size() > 0)
+ {
+ int failed = 0;
+
+ memcpy(dst, src, sizeof(unsigned short)*chf.spanCount*2);
+
+ for (int j = 0; j < stack.size(); j += 3)
+ {
+ int x = stack[j+0];
+ int y = stack[j+1];
+ int i = stack[j+2];
+ if (i < 0)
+ {
+ failed++;
+ continue;
+ }
+
+ unsigned short r = src[i*2];
+ unsigned short d2 = 0xffff;
+ const rcCompactSpan& s = chf.spans[i];
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(s, dir) == 0xf) continue;
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir);
+ if (src[ai*2] > 0 && (src[ai*2] & RC_BORDER_REG) == 0)
+ {
+ if ((int)src[ai*2+1]+2 < (int)d2)
+ {
+ r = src[ai*2];
+ d2 = src[ai*2+1]+2;
+ }
+ }
+ }
+ if (r)
+ {
+ stack[j+2] = -1; // mark as used
+ dst[i*2] = r;
+ dst[i*2+1] = d2;
+ }
+ else
+ {
+ failed++;
+ }
+ }
+
+ // rcSwap source and dest.
+ rcSwap(src, dst);
+
+ if (failed*3 == stack.size())
+ break;
+
+ if (level > 0)
+ {
+ ++iter;
+ if (iter >= maxIter)
+ break;
+ }
+ }
+
+ return src;
+}
+
+
+struct rcRegion
+{
+ inline rcRegion() : count(0), id(0), remap(false) {}
+
+ int count;
+ unsigned short id;
+ bool remap;
+ rcIntArray connections;
+ rcIntArray floors;
+};
+
+static void removeAdjacentNeighbours(rcRegion& reg)
+{
+ // Remove adjacent duplicates.
+ for (int i = 0; i < reg.connections.size() && reg.connections.size() > 1; )
+ {
+ int ni = (i+1) % reg.connections.size();
+ if (reg.connections[i] == reg.connections[ni])
+ {
+ // Remove duplicate
+ for (int j = i; j < reg.connections.size()-1; ++j)
+ reg.connections[j] = reg.connections[j+1];
+ reg.connections.pop();
+ }
+ else
+ ++i;
+ }
+}
+
+static void replaceNeighbour(rcRegion& reg, unsigned short oldId, unsigned short newId)
+{
+ bool neiChanged = false;
+ for (int i = 0; i < reg.connections.size(); ++i)
+ {
+ if (reg.connections[i] == oldId)
+ {
+ reg.connections[i] = newId;
+ neiChanged = true;
+ }
+ }
+ for (int i = 0; i < reg.floors.size(); ++i)
+ {
+ if (reg.floors[i] == oldId)
+ reg.floors[i] = newId;
+ }
+ if (neiChanged)
+ removeAdjacentNeighbours(reg);
+}
+
+static bool canMergeWithRegion(rcRegion& reg, unsigned short id)
+{
+ int n = 0;
+ for (int i = 0; i < reg.connections.size(); ++i)
+ {
+ if (reg.connections[i] == id)
+ n++;
+ }
+ if (n > 1)
+ return false;
+ for (int i = 0; i < reg.floors.size(); ++i)
+ {
+ if (reg.floors[i] == id)
+ return false;
+ }
+ return true;
+}
+
+static void addUniqueFloorRegion(rcRegion& reg, unsigned short n)
+{
+ for (int i = 0; i < reg.floors.size(); ++i)
+ if (reg.floors[i] == n)
+ return;
+ reg.floors.push(n);
+}
+
+static bool mergeRegions(rcRegion& rega, rcRegion& regb)
+{
+ unsigned short aid = rega.id;
+ unsigned short bid = regb.id;
+
+ // Duplicate current neighbourhood.
+ rcIntArray acon;
+ acon.resize(rega.connections.size());
+ for (int i = 0; i < rega.connections.size(); ++i)
+ acon[i] = rega.connections[i];
+ rcIntArray& bcon = regb.connections;
+
+ // Find insertion point on A.
+ int insa = -1;
+ for (int i = 0; i < acon.size(); ++i)
+ {
+ if (acon[i] == bid)
+ {
+ insa = i;
+ break;
+ }
+ }
+ if (insa == -1)
+ return false;
+
+ // Find insertion point on B.
+ int insb = -1;
+ for (int i = 0; i < bcon.size(); ++i)
+ {
+ if (bcon[i] == aid)
+ {
+ insb = i;
+ break;
+ }
+ }
+ if (insb == -1)
+ return false;
+
+ // Merge neighbours.
+ rega.connections.resize(0);
+ for (int i = 0, ni = acon.size(); i < ni-1; ++i)
+ rega.connections.push(acon[(insa+1+i) % ni]);
+
+ for (int i = 0, ni = bcon.size(); i < ni-1; ++i)
+ rega.connections.push(bcon[(insb+1+i) % ni]);
+
+ removeAdjacentNeighbours(rega);
+
+ for (int j = 0; j < regb.floors.size(); ++j)
+ addUniqueFloorRegion(rega, regb.floors[j]);
+ rega.count += regb.count;
+ regb.count = 0;
+ regb.connections.resize(0);
+
+ return true;
+}
+
+static bool isRegionConnectedToBorder(const rcRegion& reg)
+{
+ // Region is connected to border if
+ // one of the neighbours is null id.
+ for (int i = 0; i < reg.connections.size(); ++i)
+ {
+ if (reg.connections[i] == 0)
+ return true;
+ }
+ return false;
+}
+
+static bool isSolidEdge(rcCompactHeightfield& chf, unsigned short* src,
+ int x, int y, int i, int dir)
+{
+ const rcCompactSpan& s = chf.spans[i];
+ unsigned short r = 0;
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ r = src[ai*2];
+ }
+ if (r == src[i*2])
+ return false;
+ return true;
+}
+
+static void walkContour(int x, int y, int i, int dir,
+ rcCompactHeightfield& chf,
+ unsigned short* src,
+ rcIntArray& cont)
+{
+ int startDir = dir;
+ int starti = i;
+
+ const rcCompactSpan& ss = chf.spans[i];
+ unsigned short curReg = 0;
+ if (rcGetCon(ss, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(ss, dir);
+ curReg = src[ai*2];
+ }
+ cont.push(curReg);
+
+ int iter = 0;
+ while (++iter < 40000)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+
+ if (isSolidEdge(chf, src, x, y, i, dir))
+ {
+ // Choose the edge corner
+ unsigned short r = 0;
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ r = src[ai*2];
+ }
+ if (r != curReg)
+ {
+ curReg = r;
+ cont.push(curReg);
+ }
+
+ dir = (dir+1) & 0x3; // Rotate CW
+ }
+ else
+ {
+ int ni = -1;
+ const int nx = x + rcGetDirOffsetX(dir);
+ const int ny = y + rcGetDirOffsetY(dir);
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const rcCompactCell& nc = chf.cells[nx+ny*chf.width];
+ ni = (int)nc.index + rcGetCon(s, dir);
+ }
+ if (ni == -1)
+ {
+ // Should not happen.
+ return;
+ }
+ x = nx;
+ y = ny;
+ i = ni;
+ dir = (dir+3) & 0x3; // Rotate CCW
+ }
+
+ if (starti == i && startDir == dir)
+ {
+ break;
+ }
+ }
+
+ // Remove adjacent duplicates.
+ if (cont.size() > 1)
+ {
+ for (int i = 0; i < cont.size(); )
+ {
+ int ni = (i+1) % cont.size();
+ if (cont[i] == cont[ni])
+ {
+ for (int j = i; j < cont.size()-1; ++j)
+ cont[j] = cont[j+1];
+ cont.pop();
+ }
+ else
+ ++i;
+ }
+ }
+}
+
+static bool filterSmallRegions(int minRegionSize, int mergeRegionSize,
+ unsigned short& maxRegionId,
+ rcCompactHeightfield& chf,
+ unsigned short* src)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ int nreg = maxRegionId+1;
+ rcRegion* regions = new rcRegion[nreg];
+ if (!regions)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "filterSmallRegions: Out of memory 'regions' (%d).", nreg);
+ return false;
+ }
+
+ for (int i = 0; i < nreg; ++i)
+ regions[i].id = (unsigned short)i;
+
+ // Find edge of a region and find connections around the contour.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ unsigned short r = src[i*2];
+ if (r == 0 || r >= nreg)
+ continue;
+
+ rcRegion& reg = regions[r];
+ reg.count++;
+
+
+ // Update floors.
+ for (int j = (int)c.index; j < ni; ++j)
+ {
+ if (i == j) continue;
+ unsigned short floorId = src[j*2];
+ if (floorId == 0 || floorId >= nreg)
+ continue;
+ addUniqueFloorRegion(reg, floorId);
+ }
+
+ // Have found contour
+ if (reg.connections.size() > 0)
+ continue;
+
+ // Check if this cell is next to a border.
+ int ndir = -1;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (isSolidEdge(chf, src, x, y, i, dir))
+ {
+ ndir = dir;
+ break;
+ }
+ }
+
+ if (ndir != -1)
+ {
+ // The cell is at border.
+ // Walk around the contour to find all the neighbours.
+ walkContour(x, y, i, ndir, chf, src, reg.connections);
+ }
+ }
+ }
+ }
+
+ // Remove too small unconnected regions.
+ for (int i = 0; i < nreg; ++i)
+ {
+ rcRegion& reg = regions[i];
+ if (reg.id == 0 || (reg.id & RC_BORDER_REG))
+ continue;
+ if (reg.count == 0)
+ continue;
+
+ if (reg.connections.size() == 1 && reg.connections[0] == 0)
+ {
+ if (reg.count < minRegionSize)
+ {
+ // Non-connected small region, remove.
+ reg.count = 0;
+ reg.id = 0;
+ }
+ }
+ }
+
+
+ // Merge too small regions to neighbour regions.
+ int mergeCount = 0 ;
+ do
+ {
+ mergeCount = 0;
+ for (int i = 0; i < nreg; ++i)
+ {
+ rcRegion& reg = regions[i];
+ if (reg.id == 0 || (reg.id & RC_BORDER_REG))
+ continue;
+ if (reg.count == 0)
+ continue;
+
+ // Check to see if the region should be merged.
+ if (reg.count > mergeRegionSize && isRegionConnectedToBorder(reg))
+ continue;
+
+ // Small region with more than 1 connection.
+ // Or region which is not connected to a border at all.
+ // Find smallest neighbour region that connects to this one.
+ int smallest = 0xfffffff;
+ unsigned short mergeId = reg.id;
+ for (int j = 0; j < reg.connections.size(); ++j)
+ {
+ if (reg.connections[j] & RC_BORDER_REG) continue;
+ rcRegion& mreg = regions[reg.connections[j]];
+ if (mreg.id == 0 || (mreg.id & RC_BORDER_REG)) continue;
+ if (mreg.count < smallest &&
+ canMergeWithRegion(reg, mreg.id) &&
+ canMergeWithRegion(mreg, reg.id))
+ {
+ smallest = mreg.count;
+ mergeId = mreg.id;
+ }
+ }
+ // Found new id.
+ if (mergeId != reg.id)
+ {
+ unsigned short oldId = reg.id;
+ rcRegion& target = regions[mergeId];
+
+ // Merge neighbours.
+ if (mergeRegions(target, reg))
+ {
+ // Fixup regions pointing to current region.
+ for (int j = 0; j < nreg; ++j)
+ {
+ if (regions[j].id == 0 || (regions[j].id & RC_BORDER_REG)) continue;
+ // If another region was already merged into current region
+ // change the nid of the previous region too.
+ if (regions[j].id == oldId)
+ regions[j].id = mergeId;
+ // Replace the current region with the new one if the
+ // current regions is neighbour.
+ replaceNeighbour(regions[j], oldId, mergeId);
+ }
+ mergeCount++;
+ }
+ }
+ }
+ }
+ while (mergeCount > 0);
+
+ // Compress region Ids.
+ for (int i = 0; i < nreg; ++i)
+ {
+ regions[i].remap = false;
+ if (regions[i].id == 0) continue; // Skip nil regions.
+ if (regions[i].id & RC_BORDER_REG) continue; // Skip external regions.
+ regions[i].remap = true;
+ }
+
+ unsigned short regIdGen = 0;
+ for (int i = 0; i < nreg; ++i)
+ {
+ if (!regions[i].remap)
+ continue;
+ unsigned short oldId = regions[i].id;
+ unsigned short newId = ++regIdGen;
+ for (int j = i; j < nreg; ++j)
+ {
+ if (regions[j].id == oldId)
+ {
+ regions[j].id = newId;
+ regions[j].remap = false;
+ }
+ }
+ }
+ maxRegionId = regIdGen;
+
+ // Remap regions.
+ for (int i = 0; i < chf.spanCount; ++i)
+ {
+ if ((src[i*2] & RC_BORDER_REG) == 0)
+ src[i*2] = regions[src[i*2]].id;
+ }
+
+ delete [] regions;
+
+ return true;
+}
+
+bool rcBuildDistanceField(rcCompactHeightfield& chf)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ unsigned short* dist0 = new unsigned short[chf.spanCount];
+ if (!dist0)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'dist0' (%d).", chf.spanCount);
+ return false;
+ }
+ unsigned short* dist1 = new unsigned short[chf.spanCount];
+ if (!dist1)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'dist1' (%d).", chf.spanCount);
+ delete [] dist0;
+ return false;
+ }
+
+ unsigned short* src = dist0;
+ unsigned short* dst = dist1;
+
+ unsigned short maxDist = 0;
+
+ rcTimeVal distStartTime = rcGetPerformanceTimer();
+
+ if (calculateDistanceField(chf, src, dst, maxDist) != src)
+ rcSwap(src, dst);
+
+ chf.maxDistance = maxDist;
+
+ rcTimeVal distEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal blurStartTime = rcGetPerformanceTimer();
+
+ // Blur
+ if (boxBlur(chf, 1, src, dst) != src)
+ rcSwap(src, dst);
+
+ // Store distance.
+ for (int i = 0; i < chf.spanCount; ++i)
+ chf.spans[i].dist = src[i];
+
+ rcTimeVal blurEndTime = rcGetPerformanceTimer();
+
+ delete [] dist0;
+ delete [] dist1;
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+/* if (rcGetLog())
+ {
+ rcGetLog()->log(RC_LOG_PROGRESS, "Build distance field: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - dist: %.3f ms", rcGetDeltaTimeUsec(distStartTime, distEndTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.3f ms", rcGetDeltaTimeUsec(blurStartTime, blurEndTime)/1000.0f);
+ }*/
+ if (rcGetBuildTimes())
+ {
+ rcGetBuildTimes()->buildDistanceField += rcGetDeltaTimeUsec(startTime, endTime);
+ rcGetBuildTimes()->buildDistanceFieldDist += rcGetDeltaTimeUsec(distStartTime, distEndTime);
+ rcGetBuildTimes()->buildDistanceFieldBlur += rcGetDeltaTimeUsec(blurStartTime, blurEndTime);
+ }
+
+ return true;
+}
+
+static void paintRectRegion(int minx, int maxx, int miny, int maxy,
+ unsigned short regId, unsigned short minLevel,
+ rcCompactHeightfield& chf, unsigned short* src)
+{
+ const int w = chf.width;
+ for (int y = miny; y < maxy; ++y)
+ {
+ for (int x = minx; x < maxx; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (chf.spans[i].dist >= minLevel)
+ src[i*2] = regId;
+ }
+ }
+ }
+}
+
+bool rcBuildRegions(rcCompactHeightfield& chf,
+ int walkableRadius, int borderSize,
+ int minRegionSize, int mergeRegionSize)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = chf.width;
+ const int h = chf.height;
+
+ unsigned short* tmp1 = new unsigned short[chf.spanCount*2];
+ if (!tmp1)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'tmp1' (%d).", chf.spanCount*2);
+ return false;
+ }
+ unsigned short* tmp2 = new unsigned short[chf.spanCount*2];
+ if (!tmp2)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'tmp2' (%d).", chf.spanCount*2);
+ delete [] tmp1;
+ return false;
+ }
+
+ rcTimeVal regStartTime = rcGetPerformanceTimer();
+
+ rcIntArray stack(1024);
+ rcIntArray visited(1024);
+
+ unsigned short* src = tmp1;
+ unsigned short* dst = tmp2;
+
+ memset(src, 0, sizeof(unsigned short) * chf.spanCount*2);
+
+ unsigned short regionId = 1;
+ unsigned short level = (chf.maxDistance+1) & ~1;
+
+ unsigned short minLevel = (unsigned short)(walkableRadius*2);
+
+ const int expandIters = 4 + walkableRadius * 2;
+
+ // Mark border regions.
+ paintRectRegion(0, borderSize, 0, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+ paintRectRegion(w-borderSize, w, 0, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+ paintRectRegion(0, w, 0, borderSize, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+ paintRectRegion(0, w, h-borderSize, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+
+ rcTimeVal expTime = 0;
+ rcTimeVal floodTime = 0;
+
+ while (level > minLevel)
+ {
+ level = level >= 2 ? level-2 : 0;
+
+ rcTimeVal expStartTime = rcGetPerformanceTimer();
+
+ // Expand current regions until no empty connected cells found.
+ if (expandRegions(expandIters, level, chf, src, dst, stack) != src)
+ rcSwap(src, dst);
+
+ expTime += rcGetPerformanceTimer() - expStartTime;
+
+ rcTimeVal floodStartTime = rcGetPerformanceTimer();
+
+ // Mark new regions with IDs.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (chf.spans[i].dist < level || src[i*2] != 0)
+ continue;
+
+ if (floodRegion(x, y, i, minLevel, level, regionId, chf, src, stack))
+ regionId++;
+ }
+ }
+ }
+
+ floodTime += rcGetPerformanceTimer() - floodStartTime;
+
+ }
+
+ // Expand current regions until no empty connected cells found.
+ if (expandRegions(expandIters*8, minLevel, chf, src, dst, stack) != src)
+ rcSwap(src, dst);
+
+ rcTimeVal regEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal filterStartTime = rcGetPerformanceTimer();
+
+ // Filter out small regions.
+ chf.maxRegions = regionId;
+ if (!filterSmallRegions(minRegionSize, mergeRegionSize, chf.maxRegions, chf, src))
+ return false;
+
+ rcTimeVal filterEndTime = rcGetPerformanceTimer();
+
+ // Write the result out.
+ for (int i = 0; i < chf.spanCount; ++i)
+ chf.spans[i].reg = src[i*2];
+
+ delete [] tmp1;
+ delete [] tmp2;
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+/* if (rcGetLog())
+ {
+ rcGetLog()->log(RC_LOG_PROGRESS, "Build regions: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - reg: %.3f ms", rcGetDeltaTimeUsec(regStartTime, regEndTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - exp: %.3f ms", rcGetDeltaTimeUsec(0, expTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - flood: %.3f ms", rcGetDeltaTimeUsec(0, floodTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.3f ms", rcGetDeltaTimeUsec(filterStartTime, filterEndTime)/1000.0f);
+ }
+*/
+ if (rcGetBuildTimes())
+ {
+ rcGetBuildTimes()->buildRegions += rcGetDeltaTimeUsec(startTime, endTime);
+ rcGetBuildTimes()->buildRegionsReg += rcGetDeltaTimeUsec(regStartTime, regEndTime);
+ rcGetBuildTimes()->buildRegionsExp += rcGetDeltaTimeUsec(0, expTime);
+ rcGetBuildTimes()->buildRegionsFlood += rcGetDeltaTimeUsec(0, floodTime);
+ rcGetBuildTimes()->buildRegionsFilter += rcGetDeltaTimeUsec(filterStartTime, filterEndTime);
+ }
+
+ return true;
+}
+
+
diff --git a/extern/recastnavigation/Recast/Source/RecastTimer.cpp b/extern/recastnavigation/Recast/Source/RecastTimer.cpp
new file mode 100644
index 00000000000..51ffb7d3160
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastTimer.cpp
@@ -0,0 +1,58 @@
+#include "RecastTimer.h"
+
+#if defined(WIN32)
+
+// Win32
+#include <windows.h>
+
+rcTimeVal rcGetPerformanceTimer()
+{
+ __int64 count;
+ QueryPerformanceCounter((LARGE_INTEGER*)&count);
+ return count;
+}
+
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end)
+{
+ static __int64 freq = 0;
+ if (freq == 0)
+ QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
+ __int64 elapsed = end - start;
+ return (int)(elapsed*1000000 / freq);
+}
+
+#elif defined(__MACH__)
+
+// OSX
+#include <mach/mach_time.h>
+
+rcTimeVal rcGetPerformanceTimer()
+{
+ return mach_absolute_time();
+}
+
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end)
+{
+ static mach_timebase_info_data_t timebaseInfo;
+ if (timebaseInfo.denom == 0)
+ mach_timebase_info(&timebaseInfo);
+ uint64_t elapsed = end - start;
+ uint64_t nanosec = elapsed * timebaseInfo.numer / timebaseInfo.denom;
+ return (int)(nanosec / 1000);
+}
+
+#else
+
+// TODO: Linux, etc
+
+rcTimeVal rcGetPerformanceTimer()
+{
+ return 0;
+}
+
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end)
+{
+ return 0;
+}
+
+#endif \ No newline at end of file
diff --git a/extern/recastnavigation/SConscript b/extern/recastnavigation/SConscript
new file mode 100644
index 00000000000..be10c33c327
--- /dev/null
+++ b/extern/recastnavigation/SConscript
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+
+Import('env')
+
+sources = env.Glob('Recast/Source/*.cpp') + env.Glob('Detour/Source/*.cpp')
+
+incs = 'Recast/Include Detour/Include'
+
+env.BlenderLib ( 'extern_recastnavigation', sources, Split(incs), [],
+ libtype=['extern','player'],
+ priority=[10,185])
diff --git a/intern/ghost/intern/GHOST_NDOFManager.cpp b/intern/ghost/intern/GHOST_NDOFManager.cpp
index a24ccc3ff6c..c2e6f278c6b 100644
--- a/intern/ghost/intern/GHOST_NDOFManager.cpp
+++ b/intern/ghost/intern/GHOST_NDOFManager.cpp
@@ -366,11 +366,11 @@ void GHOST_NDOFManager::setDeadZone(float dz)
}
else if (dz > 0.5f) {
// warn the rogue user/programmer, but allow it
- printf("ndof: dead zone of %.2f is rather high...\n", dz);
+ GHOST_PRINTF("ndof: dead zone of %.2f is rather high...\n", dz);
}
m_deadZone = dz;
- printf("ndof: dead zone set to %.2f\n", dz);
+ GHOST_PRINTF("ndof: dead zone set to %.2f\n", dz);
}
static bool atHomePosition(GHOST_TEventNDOFMotionData* ndof)
diff --git a/intern/guardedalloc/MEM_sys_types.h b/intern/guardedalloc/MEM_sys_types.h
index 48230db23a3..4debb32b5c4 100644
--- a/intern/guardedalloc/MEM_sys_types.h
+++ b/intern/guardedalloc/MEM_sys_types.h
@@ -98,7 +98,8 @@ typedef unsigned long uintptr_t;
#include <inttypes.h>
#elif defined(FREE_WINDOWS)
-
+/* define htoln here, there must be a syntax error in winsock2.h in MinGW */
+unsigned long __attribute__((__stdcall__)) htonl(unsigned long);
#include <stdint.h>
#else
@@ -109,12 +110,14 @@ typedef unsigned long uintptr_t;
#endif /* ifdef platform for types */
#ifdef _WIN32
+#ifndef FREE_WINDOWS
#ifndef htonl
#define htonl(x) correctByteOrder(x)
#endif
#ifndef ntohl
#define ntohl(x) correctByteOrder(x)
#endif
+#endif
#elif defined (__FreeBSD__) || defined (__OpenBSD__)
#include <sys/param.h>
#elif defined (__APPLE__)
diff --git a/intern/opennl/CMakeLists.txt b/intern/opennl/CMakeLists.txt
index 55b0bc5855f..7d6a579819e 100644
--- a/intern/opennl/CMakeLists.txt
+++ b/intern/opennl/CMakeLists.txt
@@ -31,6 +31,13 @@ remove_strict_flags()
# and debug gives a lot of prints on UV unwrapping. developers can enable if they need to.
remove_flag("-DDEBUG")
+
+# quiet compiler warnings about undefined defines
+add_definitions(
+ -DDEBUGlevel=0
+ -DPRNTlevel=0
+)
+
set(INC
extern
superlu
diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt
index 094d398a83c..228ff6ec389 100644
--- a/intern/smoke/CMakeLists.txt
+++ b/intern/smoke/CMakeLists.txt
@@ -88,7 +88,7 @@ if(WITH_OPENMP)
endif()
if(WITH_FFTW3)
- add_definitions(-DFFTW3=1)
+ add_definitions(-DWITH_FFTW3)
list(APPEND INC
${FFTW3_INCLUDE_DIRS}
)
diff --git a/intern/smoke/SConscript b/intern/smoke/SConscript
index fa32c5f36c3..0511257d319 100644
--- a/intern/smoke/SConscript
+++ b/intern/smoke/SConscript
@@ -16,7 +16,7 @@ incs += ' ' + env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC']
incs += ' intern ../../extern/bullet2/src ../memutil ../guardealloc '
if env['WITH_BF_FFTW3']:
- defs += ' FFTW3=1'
+ defs += ' WITH_FFTW3'
incs += env['BF_FFTW3_INC']
env.BlenderLib ('bf_intern_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
diff --git a/intern/smoke/intern/FFT_NOISE.h b/intern/smoke/intern/FFT_NOISE.h
index b0597d7b20c..a087b4e1391 100644
--- a/intern/smoke/intern/FFT_NOISE.h
+++ b/intern/smoke/intern/FFT_NOISE.h
@@ -25,7 +25,7 @@
#ifndef FFT_NOISE_H_
#define FFT_NOISE_H_
-#if FFTW3==1
+#ifdef WITH_FFTW3
#include <iostream>
#include <fftw3.h>
#include <MERSENNETWISTER.h>
diff --git a/intern/smoke/intern/WTURBULENCE.cpp b/intern/smoke/intern/WTURBULENCE.cpp
index 9934e3017cf..cd18cf7b344 100644
--- a/intern/smoke/intern/WTURBULENCE.cpp
+++ b/intern/smoke/intern/WTURBULENCE.cpp
@@ -155,7 +155,7 @@ void WTURBULENCE::setNoise(int type)
if(type == (1<<1)) // FFT
{
// needs fft
- #if FFTW3==1
+ #ifdef WITH_FFTW3
std::string noiseTileFilename = std::string("noise.fft");
generatTile_FFT(_noiseTile, noiseTileFilename);
#endif
diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons
index 4c064182a8c..a68a1f8394c 100644
--- a/release/datafiles/blenderbuttons
+++ b/release/datafiles/blenderbuttons
Binary files differ
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index 101416f4943..b3127733c1e 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -356,7 +356,7 @@ class Mesh(bpy_types.ID):
@property
def edge_keys(self):
- return [edge_key for face in self.faces for edge_key in face.edge_keys]
+ return [ed.key for ed in self.edges]
class MeshEdge(StructRNA):
@@ -376,17 +376,31 @@ class MeshFace(StructRNA):
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
+ return (mesh_verts[face_verts[0]].co +
+ mesh_verts[face_verts[1]].co +
+ mesh_verts[face_verts[2]].co
+ ) / 3.0
else:
- return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co + mesh_verts[face_verts[3]].co) / 4.0
+ return (mesh_verts[face_verts[0]].co +
+ mesh_verts[face_verts[1]].co +
+ mesh_verts[face_verts[2]].co +
+ mesh_verts[face_verts[3]].co
+ ) / 4.0
@property
def edge_keys(self):
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])
+ return (ord_ind(verts[0], verts[1]),
+ ord_ind(verts[1], verts[2]),
+ ord_ind(verts[2], verts[0]),
+ )
+ else:
+ 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):
diff --git a/release/scripts/startup/bl_operators/animsys_update.py b/release/scripts/startup/bl_operators/animsys_update.py
index 3710c57ac16..23b9cf13f07 100644
--- a/release/scripts/startup/bl_operators/animsys_update.py
+++ b/release/scripts/startup/bl_operators/animsys_update.py
@@ -685,7 +685,6 @@ data_path_update = [
]
-import bpy
from bpy.types import Operator
diff --git a/release/scripts/startup/bl_operators/nla.py b/release/scripts/startup/bl_operators/nla.py
index c764f7d62f1..feb0016b1c7 100644
--- a/release/scripts/startup/bl_operators/nla.py
+++ b/release/scripts/startup/bl_operators/nla.py
@@ -271,7 +271,8 @@ class BakeAction(Operator):
class ClearUselessActions(Operator):
- '''Mark actions with no F-Curves for deletion after save+reload of file preserving "action libraries"'''
+ '''Mark actions with no F-Curves for deletion after save+reload of ''' \
+ '''file preserving "action libraries"'''
bl_idname = "anim.clear_useless_actions"
bl_label = "Clear Useless Actions"
bl_options = {'REGISTER', 'UNDO'}
@@ -292,12 +293,14 @@ class ClearUselessActions(Operator):
if ((self.only_unused is False) or
(action.use_fake_user and action.users == 1)):
- # if it has F-Curves, then it's a "action library" (i.e. walk, wave, jump, etc.)
+ # if it has F-Curves, then it's a "action library"
+ # (i.e. walk, wave, jump, etc.)
# and should be left alone as that's what fake users are for!
if not action.fcurves:
# mark action for deletion
action.user_clear()
removed += 1
- self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions" % (removed))
+ self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions"
+ % removed)
return {'FINISHED'}
diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py
index 463ba84470f..61093abe814 100644
--- a/release/scripts/startup/bl_ui/properties_data_armature.py
+++ b/release/scripts/startup/bl_ui/properties_data_armature.py
@@ -74,6 +74,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel):
if context.scene.render.engine == "BLENDER_GAME":
layout.row().prop(arm, "vert_deformer", expand=True)
+
class DATA_PT_display(ArmatureButtonsPanel, Panel):
bl_label = "Display"
@@ -185,11 +186,10 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
layout.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
if poselib:
-
- # list of poses in pose library
+ # list of poses in pose library
row = layout.row()
row.template_list(poselib, "pose_markers", poselib.pose_markers, "active_index", rows=5)
-
+
# column of operators for active pose
# - goes beside list
col = row.column(align=True)
@@ -206,9 +206,9 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
if pose_marker_active is not None:
col.operator("poselib.pose_remove", icon='ZOOMOUT', text="").pose = pose_marker_active.name
col.operator("poselib.apply_pose", icon='ZOOM_SELECTED', text="").pose_index = poselib.pose_markers.active_index
-
- col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu?
-
+
+ col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu?
+
# properties for active marker
if pose_marker_active is not None:
layout.prop(pose_marker_active, "name")
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 179921c3c85..8e90dc3216e 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -379,6 +379,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.label(text="Mirror Object:")
col.prop(md, "mirror_object", text="")
+ def NAVMESH(self, layout, ob, md):
+ layout.operator("object.assign_navpolygon")
+ layout.operator("object.assign_new_navpolygon")
+
def MULTIRES(self, layout, ob, md):
layout.row().prop(md, "subdivision_type", expand=True)
@@ -608,32 +612,31 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
layout.label(text="Settings can be found inside the Physics context")
def UV_PROJECT(self, layout, ob, md):
- if ob.type == 'MESH':
- split = layout.split()
+ split = layout.split()
- col = split.column()
- col.label(text="Image:")
- col.prop(md, "image", text="")
+ col = split.column()
+ col.label(text="Image:")
+ col.prop(md, "image", text="")
- col = split.column()
- col.label(text="UV Layer:")
- col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
+ col = split.column()
+ col.label(text="UV Layer:")
+ col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
- split = layout.split()
- col = split.column()
- col.prop(md, "use_image_override")
- col.prop(md, "projector_count", text="Projectors")
- for proj in md.projectors:
- col.prop(proj, "object", text="")
+ split = layout.split()
+ col = split.column()
+ col.prop(md, "use_image_override")
+ col.prop(md, "projector_count", text="Projectors")
+ for proj in md.projectors:
+ col.prop(proj, "object", text="")
- col = split.column()
- sub = col.column(align=True)
- sub.prop(md, "aspect_x", text="Aspect X")
- sub.prop(md, "aspect_y", text="Aspect Y")
+ col = split.column()
+ sub = col.column(align=True)
+ sub.prop(md, "aspect_x", text="Aspect X")
+ sub.prop(md, "aspect_y", text="Aspect Y")
- sub = col.column(align=True)
- sub.prop(md, "scale_x", text="Scale X")
- sub.prop(md, "scale_y", text="Scale Y")
+ sub = col.column(align=True)
+ sub.prop(md, "scale_x", text="Scale X")
+ sub.prop(md, "scale_y", text="Scale Y")
def WARP(self, layout, ob, md):
use_falloff = (md.falloff_type != 'NONE')
@@ -737,5 +740,119 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "width", slider=True)
col.prop(md, "narrowness", slider=True)
+ @staticmethod
+ def vertex_weight_mask(layout, ob, md):
+ layout.label(text="Influence/Mask Options:")
+
+ split = layout.split(percentage=0.4)
+ split.label(text="Global Influence:")
+ split.prop(md, "mask_constant", text="")
+
+ if not md.mask_texture:
+ split = layout.split(percentage=0.4)
+ split.label(text="Vertex Group Mask:")
+ split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
+
+ if not md.mask_vertex_group:
+ split = layout.split(percentage=0.4)
+ split.label(text="Texture Mask:")
+ split.template_ID(md, "mask_texture", new="texture.new")
+ if md.mask_texture:
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Texture Coordinates:")
+ col.prop(md, "mask_tex_mapping", text="")
+
+ col = split.column()
+ col.label(text="Use Channel:")
+ col.prop(md, "mask_tex_use_channel", text="")
+
+ if md.mask_tex_mapping == 'OBJECT':
+ layout.prop(md, "mask_tex_map_object", text="Object")
+ elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
+ layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
+
+ def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
+ split = layout.split()
+ col = split.column()
+ col.label(text="Vertex Group:")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+
+ col = split.column()
+ col.label(text="Default Weight:")
+ col.prop(md, "default_weight", text="")
+
+ layout.prop(md, "falloff_type")
+ if md.falloff_type == 'CURVE':
+ col = layout.column()
+ col.template_curve_mapping(md, "map_curve")
+
+ split = layout.split(percentage=0.4)
+ split.prop(md, "use_add")
+ row = split.row()
+ row.active = md.use_add
+ row.prop(md, "add_threshold")
+
+ split = layout.split(percentage=0.4)
+ split.prop(md, "use_remove")
+ row = split.row()
+ row.active = md.use_remove
+ row.prop(md, "remove_threshold")
+
+ # Common mask options
+ layout.separator()
+ self.vertex_weight_mask(layout, ob, md)
+
+ def VERTEX_WEIGHT_MIX(self, layout, ob, md):
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Vertex Group A:")
+ col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
+ col.label(text="Default Weight A:")
+ col.prop(md, "default_weight_a", text="")
+
+ col.label(text="Mix Mode:")
+ col.prop(md, "mix_mode", text="")
+
+ col = split.column()
+ col.label(text="Vertex Group B:")
+ col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
+ col.label(text="Default Weight B:")
+ col.prop(md, "default_weight_b", text="")
+
+ col.label(text="Mix Set:")
+ col.prop(md, "mix_set", text="")
+
+ # Common mask options
+ layout.separator()
+ self.vertex_weight_mask(layout, ob, md)
+
+ def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Vertex Group:")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+
+ col = split.column()
+ col.label(text="Target Object:")
+ col.prop(md, "target", text="")
+
+ layout.row().prop(md, "proximity_mode", expand=True)
+ if md.proximity_mode == 'GEOMETRY':
+ layout.row().prop(md, "proximity_geometry", expand=True)
+
+ row = layout.row()
+ row.prop(md, "min_dist")
+ row.prop(md, "max_dist")
+
+ layout.prop(md, "falloff_type")
+
+ # Common mask options
+ layout.separator()
+ self.vertex_weight_mask(layout, ob, md)
+
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py
index 657c0fe652a..a1b86b51f5f 100644
--- a/release/scripts/startup/bl_ui/properties_data_speaker.py
+++ b/release/scripts/startup/bl_ui/properties_data_speaker.py
@@ -81,7 +81,7 @@ class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel):
speaker = context.speaker
split = layout.split()
-
+
col = split.column()
col.label("Volume:")
col.prop(speaker, "volume_min", text="Minimum")
diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index 161e4b10cff..b06876637f7 100644
--- a/release/scripts/startup/bl_ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -195,6 +195,31 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel):
row.prop(game, "collision_margin", text="Margin", slider=True)
row.prop(game, "use_collision_compound", text="Compound")
+class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel, Panel):
+ bl_label = "Create Obstacle"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @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 in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ game = context.active_object.game
+
+ self.layout.prop(game, "create_obstacle", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ game = context.active_object.game
+
+ layout.active = game.create_obstacle
+
+ row = layout.row()
+ row.prop(game, "obstacle_radius", text="Radius")
+ row.label()
class RenderButtonsPanel():
bl_space_type = 'PROPERTIES'
@@ -344,7 +369,7 @@ class RENDER_PT_game_performance(RenderButtonsPanel, Panel):
row = col.row()
row.prop(gs, "use_frame_rate")
row.prop(gs, "use_display_lists")
-
+
col.prop(gs, "restrict_animation_updates")
@@ -362,6 +387,68 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel):
flow.prop(gs, "show_physics_visualization", text="Physics Visualization")
flow.prop(gs, "use_deprecation_warnings")
flow.prop(gs, "show_mouse", text="Mouse Cursor")
+
+class SceneButtonsPanel():
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = "scene"
+
+class SCENE_PT_game_navmesh(SceneButtonsPanel, bpy.types.Panel):
+ bl_label = "Navigation mesh"
+ bl_default_closed = True
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ return (scene and scene.render.engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ rd = context.scene.game_settings.recast_data
+
+ layout.operator("object.create_navmesh", text='Build navigation mesh')
+
+ col = layout.column()
+ col.label(text="Rasterization:")
+ row = col.row()
+ row.prop(rd, "cell_size")
+ row.prop(rd, "cell_height")
+
+ col = layout.column()
+ col.label(text="Agent:")
+ split = col.split()
+
+ col = split.column()
+ col.prop(rd, "agent_height", text="Height")
+ col.prop(rd, "agent_radius", text="Radius")
+
+ col = split.column()
+ col.prop(rd, "max_slope")
+ col.prop(rd, "max_climb")
+
+ col = layout.column()
+ col.label(text="Region:")
+ row = col.row()
+ row.prop(rd, "region_min_size")
+ row.prop(rd, "region_merge_size")
+
+ col = layout.column()
+ col.label(text="Polygonization:")
+ split = col.split()
+
+ col = split.column()
+ col.prop(rd, "edge_max_len")
+ col.prop(rd, "edge_max_error")
+
+ split.prop(rd, "verts_per_poly")
+
+ col = layout.column()
+ col.label(text="Detail Mesh:")
+ row = col.row()
+ row.prop(rd, "sample_dist")
+ row.prop(rd, "sample_max_error")
class WorldButtonsPanel():
@@ -487,5 +574,24 @@ class WORLD_PT_game_physics(WorldButtonsPanel, Panel):
col.label(text="Logic Steps:")
col.prop(gs, "logic_step_max", text="Max")
+class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, Panel):
+ bl_label = "Obstacle simulation"
+ 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_settings
+
+ layout.prop(gs, "obstacle_simulation", text = "Type")
+ if gs.obstacle_simulation != 'NONE':
+ layout.prop(gs, "level_height")
+ layout.prop(gs, "show_obstacle_simulation")
+
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index 46893af3582..55629e6c6b9 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -46,7 +46,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel):
row = layout.row()
if fluid is None:
- row.label("built without fluids")
+ row.label("Built without fluids")
return
row.prop(fluid, "type")
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index 13edc3471d2..67aca5eb4c1 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -773,7 +773,18 @@ class USERPREF_MT_ndof_settings(Menu):
layout.separator()
layout.label(text="orbit options")
- layout.prop(input_prefs, "ndof_orbit_invert_axes")
+ if input_prefs.view_rotate_method == 'TRACKBALL':
+ layout.prop(input_prefs, "ndof_roll_invert_axis")
+ layout.prop(input_prefs, "ndof_tilt_invert_axis")
+ layout.prop(input_prefs, "ndof_rotate_invert_axis")
+ else:
+ layout.prop(input_prefs, "ndof_orbit_invert_axes")
+
+ layout.separator()
+ layout.label(text="pan options")
+ layout.prop(input_prefs, "ndof_panx_invert_axis")
+ layout.prop(input_prefs, "ndof_pany_invert_axis")
+ layout.prop(input_prefs, "ndof_panz_invert_axis")
layout.separator()
layout.label(text="fly options")
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index b71593add96..4b2ee57df68 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -54,6 +54,9 @@ def draw_gpencil_tools(context, layout):
row = col.row()
row.operator("gpencil.draw", text="Draw").mode = 'DRAW'
row.operator("gpencil.draw", text="Line").mode = 'DRAW_STRAIGHT'
+
+ row = col.row()
+ row.operator("gpencil.draw", text="Poly").mode = 'DRAW_POLY'
row.operator("gpencil.draw", text="Erase").mode = 'ERASER'
row = col.row()
@@ -765,9 +768,9 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, Panel):
col = row.column()
if brush.use_texture_overlay:
- col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_OFF')
+ col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_OFF')
else:
- col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_ON')
+ col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_ON')
col.active = tex_slot.map_mode in {'FIXED', 'TILED'}
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 0f19cfbc481..742240d53b5 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -44,7 +44,7 @@ extern "C" {
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 259
-#define BLENDER_SUBVERSION 1
+#define BLENDER_SUBVERSION 2
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 17876c6ec9d..0e48673f1b1 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -111,7 +111,7 @@ typedef struct Global {
#define G_SCRIPT_OVERRIDE_PREF (1 << 14) /* when this flag is set ignore the userprefs */
/* #define G_NOFROZEN (1 << 17) also removed */
-#define G_GREASEPENCIL (1 << 17)
+/* #define G_GREASEPENCIL (1 << 17) also removed */
/* #define G_AUTOMATKEYS (1 << 30) also removed */
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index e44b5d96852..1de3c295f4d 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -37,6 +37,10 @@
* \ingroup bke
*/
+#include "DNA_listBase.h"
+
+#include "RNA_types.h"
+
/* not very important, but the stack solver likes to know a maximum */
#define MAX_SOCKET 64
@@ -46,63 +50,151 @@ struct bNodeLink;
struct bNodeSocket;
struct bNodeStack;
struct bNodeTree;
+struct bNodeTreeExec;
struct GPUMaterial;
struct GPUNode;
struct GPUNodeStack;
struct ID;
struct ListBase;
struct Main;
+struct uiBlock;
+struct uiLayout;
struct MTex;
struct PointerRNA;
struct rctf;
struct RenderData;
struct Scene;
struct Tex;
-struct uiLayout;
-
+struct SpaceNode;
+struct ARegion;
+struct Object;
/* ************** NODE TYPE DEFINITIONS ***** */
-typedef struct bNodeSocketType {
+/** Compact definition of a node socket.
+ * Can be used to quickly define a list of static sockets for a node,
+ * which are added to each new node of that type.
+ *
+ * \deprecated New nodes should add default sockets in the initialization
+ * function instead. This struct is mostly kept for old nodes and should
+ * be removed some time.
+ */
+typedef struct bNodeSocketTemplate {
int type, limit;
- const char *name;
- float val1, val2, val3, val4; /* default alloc value for inputs */
- float min, max; /* default range for inputs */
+ char name[32];
+ float val1, val2, val3, val4; /* default alloc value for inputs */
+ float min, max;
+ PropertySubType subtype;
/* after this line is used internal only */
- struct bNodeSocket *sock; /* used during verify_types */
+ struct bNodeSocket *sock; /* used to hold verified socket */
+} bNodeSocketTemplate;
+
+typedef void (*NodeSocketButtonFunction)(const struct bContext *C, struct uiBlock *block,
+ struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock,
+ const char *name, int x, int y, int width);
+
+/** Defines a socket type.
+ * Defines the appearance and behavior of a socket in the UI.
+ */
+typedef struct bNodeSocketType {
+ int type;
+ char ui_name[32];
+ char ui_description[128];
+ int ui_icon;
+ char ui_color[4];
+
+ const char *value_structname;
+ int value_structsize;
+
+ NodeSocketButtonFunction buttonfunc;
} bNodeSocketType;
+/** Template for creating a node.
+ * Stored required parameters to make a new node of a specific type.
+ */
+typedef struct bNodeTemplate {
+ int type;
+
+ /* group tree */
+ struct bNodeTree *ngroup;
+} bNodeTemplate;
+
+/** Defines a node type.
+ * Initial attributes and constants for a node as well as callback functions
+ * implementing the node behavior.
+ */
typedef struct bNodeType {
void *next,*prev;
+ short needs_free; /* set for allocated types that need to be freed */
+
int type;
- const char *name; /* can be allocated too */
+ char name[32];
float width, minwidth, maxwidth;
+ float height, minheight, maxheight;
short nclass, flag;
- bNodeSocketType *inputs, *outputs;
+ /* templates for static sockets */
+ bNodeSocketTemplate *inputs, *outputs;
char storagename[64]; /* struct name for DNA */
- void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
-
- /* this line is set on startup of blender */
+ /// Main draw function for the node.
+ void (*drawfunc)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node);
+ /// Updates the node geometry attributes according to internal state before actual drawing.
+ void (*drawupdatefunc)(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
+ /// Draw the option buttons on the node.
void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
+ /// Additional parameters in the side panel.
void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
+ /// Optional custom label function for the node header.
const char *(*labelfunc)(struct bNode *);
-
- void (*initfunc)(struct bNode *);
- void (*freestoragefunc)(struct bNode *);
- void (*copystoragefunc)(struct bNode *, struct bNode *);
+ /// Optional custom resize handle polling.
+ int (*resize_area_func)(struct bNode *node, int x, int y);
- /* for use with dynamic typedefs */
- ID *id;
- void *pynode; /* holds pointer to python script */
- void *pydict; /* holds pointer to python script dictionary (scope)*/
-
+ /// Called when the node is updated in the editor.
+ void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
+ /// Check and update if internal ID data has changed.
+ void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
+
+ /// Initialize a new node instance of this type after creation.
+ void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+ /// Free the custom storage data.
+ void (*freestoragefunc)(struct bNode *node);
+ /// Make a copy of the custom storage data.
+ void (*copystoragefunc)(struct bNode *node, struct bNode *target);
+
+ /// Create a template from an existing node.
+ struct bNodeTemplate (*templatefunc)(struct bNode *);
+ /** If a node can be made from the template in the given node tree.
+ * \example Node groups can not be created inside their own node tree.
+ */
+ int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
+
+ /// Initialize a node tree associated to this node type.
+ void (*inittreefunc)(struct bNodeTree *ntree);
+ /// Update a node tree associated to this node type.
+ void (*updatetreefunc)(struct bNodeTree *ntree);
+
+ /* group edit callbacks for operators */
+ /* XXX this is going to be changed as required by the UI */
+ struct bNodeTree *(*group_edit_get)(struct bNode *node);
+ struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit);
+ void (*group_edit_clear)(struct bNode *node);
+
+
+ /* **** execution callbacks **** */
+ void *(*initexecfunc)(struct bNode *node);
+ void (*freeexecfunc)(struct bNode *node, void *nodedata);
+ void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
+ /* XXX this alternative exec function has been added to avoid changing all node types.
+ * when a final generic version of execution code is defined, this will be changed anyway
+ */
+ void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
/* gpu */
int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
-
+ /* extended gpu function */
+ int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
} bNodeType;
/* node->exec, now in use for composites (#define for break is same as ready yes) */
@@ -113,72 +205,124 @@ typedef struct bNodeType {
#define NODE_FREEBUFS 8
#define NODE_SKIPPED 16
+/* sim_exec return value */
+#define NODE_EXEC_FINISHED 0
+#define NODE_EXEC_SUSPEND 1
+
/* nodetype->nclass, for add-menu and themes */
-#define NODE_CLASS_INPUT 0
-#define NODE_CLASS_OUTPUT 1
-#define NODE_CLASS_OP_COLOR 3
-#define NODE_CLASS_OP_VECTOR 4
-#define NODE_CLASS_OP_FILTER 5
-#define NODE_CLASS_GROUP 6
-#define NODE_CLASS_FILE 7
-#define NODE_CLASS_CONVERTOR 8
-#define NODE_CLASS_MATTE 9
-#define NODE_CLASS_DISTORT 10
-#define NODE_CLASS_OP_DYNAMIC 11
-#define NODE_CLASS_PATTERN 12
-#define NODE_CLASS_TEXTURE 13
+#define NODE_CLASS_INPUT 0
+#define NODE_CLASS_OUTPUT 1
+#define NODE_CLASS_OP_COLOR 3
+#define NODE_CLASS_OP_VECTOR 4
+#define NODE_CLASS_OP_FILTER 5
+#define NODE_CLASS_GROUP 6
+#define NODE_CLASS_FILE 7
+#define NODE_CLASS_CONVERTOR 8
+#define NODE_CLASS_MATTE 9
+#define NODE_CLASS_DISTORT 10
+#define NODE_CLASS_OP_DYNAMIC 11
+#define NODE_CLASS_PATTERN 12
+#define NODE_CLASS_TEXTURE 13
+#define NODE_CLASS_EXECUTION 14
+#define NODE_CLASS_GETDATA 15
+#define NODE_CLASS_SETDATA 16
+#define NODE_CLASS_MATH 17
+#define NODE_CLASS_MATH_VECTOR 18
+#define NODE_CLASS_MATH_ROTATION 19
+#define NODE_CLASS_PARTICLES 25
+#define NODE_CLASS_TRANSFORM 30
+#define NODE_CLASS_COMBINE 31
+#define NODE_CLASS_LAYOUT 100
/* enum values for input/output */
#define SOCK_IN 1
#define SOCK_OUT 2
+struct bNodeTreeExec;
+
+typedef void (*bNodeTreeCallback)(void *calldata, struct ID *owner_id, struct bNodeTree *ntree);
+typedef struct bNodeTreeType
+{
+ int type; /* type identifier */
+ char idname[64]; /* id name for RNA identification */
+
+ ListBase node_types; /* type definitions */
+
+ /* callbacks */
+ void (*free_cache)(struct bNodeTree *ntree);
+ void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node);
+ void (*foreach_nodetree)(struct Main *main, void *calldata, bNodeTreeCallback func); /* iteration over all node trees */
+
+ /* calls allowing threaded composite */
+ void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+ void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+ void (*local_merge)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+
+ /* Tree update. Overrides nodetype->updatetreefunc! */
+ void (*update)(struct bNodeTree *ntree);
+ /* Node update. Overrides nodetype->updatefunc! */
+ void (*update_node)(struct bNodeTree *ntree, struct bNode *node);
+
+ int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
+} bNodeTreeType;
+
/* ************** GENERIC API, TREES *************** */
-void ntreeVerifyTypes(struct bNodeTree *ntree);
+struct bNodeTreeType *ntreeGetType(int type);
+struct bNodeType *ntreeGetNodeType(struct bNodeTree *ntree);
+struct bNodeSocketType *ntreeGetSocketType(int type);
-struct bNodeTree *ntreeAddTree(const char *name, int type, const short is_group);
+struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype);
void ntreeInitTypes(struct bNodeTree *ntree);
-//void ntreeMakeGroupSockets(struct bNodeTree *ntree);
-void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
void ntreeFreeTree(struct bNodeTree *ntree);
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
void ntreeMakeLocal(struct bNodeTree *ntree);
+int ntreeHasType(struct bNodeTree *ntree, int type);
void ntreeSocketUseFlags(struct bNodeTree *ntree);
-void ntreeSolveOrder(struct bNodeTree *ntree);
+void ntreeUpdateTree(struct bNodeTree *ntree);
+/* XXX Currently each tree update call does call to ntreeVerifyNodes too.
+ * Some day this should be replaced by a decent depsgraph automatism!
+ */
+void ntreeVerifyNodes(struct Main *main, struct ID *id);
-void ntreeBeginExecTree(struct bNodeTree *ntree);
-void ntreeExecTree(struct bNodeTree *ntree, void *callerdata, int thread);
-void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
-void ntreeEndExecTree(struct bNodeTree *ntree);
+void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
+/* XXX old trees handle output flags automatically based on special output node types and last active selection.
+ * new tree types have a per-output socket flag to indicate the final output to use explicitly.
+ */
+void ntreeSetOutput(struct bNodeTree *ntree);
void ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
void ntreeClearPreview(struct bNodeTree *ntree);
void ntreeFreeCache(struct bNodeTree *ntree);
-
- /* calls allowing threaded composite */
+
+int ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
+int ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
void ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
/* ************** GENERIC API, NODES *************** */
-void nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
+struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type);
+struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
+void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
+void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
void nodeAddToPreview(struct bNode *, float *, int, int, int);
+struct bNode *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
-void nodeAddSockets(struct bNode *node, struct bNodeType *ntype);
-struct bNode *nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup, struct ID *id);
-void nodeRegisterType(struct ListBase *typelist, const struct bNodeType *ntype) ;
-void nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeType *ntype);
+
+void nodeRegisterType(struct ListBase *typelist, struct bNodeType *ntype) ;
void nodeMakeDynamicType(struct bNode *node);
int nodeDynamicUnlinkText(struct ID *txtid);
+
void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
@@ -186,6 +330,10 @@ struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, s
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
+void nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
+void nodeAttachNode(struct bNode *node, struct bNode *parent);
+void nodeDetachNode(struct bNode *node);
+
struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex, int *in_out);
@@ -202,41 +350,71 @@ void NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
int NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
void ntreeClearTags(struct bNodeTree *ntree);
-/* ************** Groups ****************** */
-
-struct bNode *nodeMakeGroupFromSelected(struct bNodeTree *ntree);
-int nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode);
-
-void nodeGroupVerify(struct bNodeTree *ngroup);
-void nodeGroupSocketUseFlags(struct bNodeTree *ngroup);
-
-void nodeGroupCopy(struct bNode *gnode);
+void nodeFreePreview(struct bNode *node);
-struct bNodeSocket *nodeGroupAddSocket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
-struct bNodeSocket *nodeGroupExposeSocket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out);
-void nodeGroupExposeAllSockets(struct bNodeTree *ngroup);
-void nodeGroupRemoveSocket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
+/* ************** NODE TYPE ACCESS *************** */
-/* ************** COMMON NODES *************** */
+struct bNodeTemplate nodeMakeTemplate(struct bNode *node);
+int nodeValid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
+const char* nodeLabel(struct bNode *node);
+struct bNodeTree *nodeGroupEditGet(struct bNode *node);
+struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit);
+void nodeGroupEditClear(struct bNode *node);
/* Init a new node type struct with default values and callbacks */
-void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag,
- struct bNodeSocketType *inputs, struct bNodeSocketType *outputs);
+void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
+void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
-void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNode *));
+void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp));
+void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp));
void node_type_storage(struct bNodeType *ntype,
const char *storagename,
void (*freestoragefunc)(struct bNode *),
void (*copystoragefunc)(struct bNode *, struct bNode *));
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
+void node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *));
+void node_type_update(struct bNodeType *ntype,
+ void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
+ void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id));
+void node_type_tree(struct bNodeType *ntype,
+ void (*inittreefunc)(struct bNodeTree *),
+ void (*updatetreefunc)(struct bNodeTree *));
+void node_type_group_edit(struct bNodeType *ntype,
+ struct bNodeTree *(*group_edit_get)(struct bNode *node),
+ struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
+ void (*group_edit_clear)(struct bNode *node));
+
void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
+void node_type_exec_new(struct bNodeType *ntype,
+ void *(*initexecfunc)(struct bNode *node),
+ void (*freeexecfunc)(struct bNode *node, void *nodedata),
+ void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **));
void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
-void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
+void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out));
+
+/* ************** COMMON NODES *************** */
#define NODE_GROUP 2
-#define NODE_GROUP_MENU 1000
-#define NODE_DYNAMIC_MENU 4000
+#define NODE_FORLOOP 3
+#define NODE_WHILELOOP 4
+#define NODE_FRAME 5
+#define NODE_GROUP_MENU 10000
+#define NODE_DYNAMIC_MENU 20000
+
+/* look up a socket on a group node by the internal group socket */
+struct bNodeSocket *node_group_find_input(struct bNode *gnode, struct bNodeSocket *gsock);
+struct bNodeSocket *node_group_find_output(struct bNode *gnode, struct bNodeSocket *gsock);
+
+struct bNodeSocket *node_group_add_socket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
+struct bNodeSocket *node_group_expose_socket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out);
+void node_group_expose_all_sockets(struct bNodeTree *ngroup);
+void node_group_remove_socket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
-void register_node_type_group(ListBase *lb);
+struct bNode *node_group_make_from_selected(struct bNodeTree *ntree);
+int node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode);
+
+/* in node_common.c */
+void register_node_type_frame(ListBase *lb);
/* ************** SHADER NODES *************** */
@@ -286,11 +464,10 @@ struct ShadeResult;
#define NODE_DYNAMIC_REPARSE 6 /* 64 */
#define NODE_DYNAMIC_SET 15 /* sign */
-/* the type definitions array */
-extern struct ListBase node_all_shaders;
-
/* API */
+struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeShaderEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
void ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
void ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
void nodeShaderSynchronizeID(struct bNode *node, int copyto);
@@ -415,11 +592,11 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
#define CMP_SCALE_RENDERPERCENT 3
-/* the type definitions array */
-extern struct ListBase node_all_composit;
-
/* API */
struct CompBuf;
+struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeCompositEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
+void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
void ntreeCompositTagRender(struct Scene *sce);
int ntreeCompositTagAnimated(struct bNodeTree *ntree);
void ntreeCompositTagGenerators(struct bNodeTree *ntree);
@@ -459,23 +636,22 @@ struct TexResult;
#define TEX_NODE_PROC 500
#define TEX_NODE_PROC_MAX 600
-extern struct ListBase node_all_textures;
-
/* API */
int ntreeTexTagAnimated(struct bNodeTree *ntree);
void ntreeTexSetPreviewFlag(int);
-int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
void ntreeTexCheckCyclics(struct bNodeTree *ntree);
char* ntreeTexOutputMenu(struct bNodeTree *ntree);
+struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
+int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
+
-/**/
+/*************************************************/
void init_nodesystem(void);
void free_nodesystem(void);
-/**/
-
void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce);
#endif
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index fac5bf1cfd2..3728dd41089 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -39,7 +39,6 @@
struct PackedFile;
struct bSound;
-struct bContext;
struct ListBase;
struct Main;
struct Sequence;
@@ -65,12 +64,12 @@ struct bSound* sound_new_file(struct Main *main, const char *filename);
// XXX unused currently
#if 0
-struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source);
+struct bSound* sound_new_buffer(struct Main *bmain, struct bSound *source);
-struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end);
+struct bSound* sound_new_limiter(struct Main *bmain, struct bSound *source, float start, float end);
#endif
-void sound_delete(struct bContext *C, struct bSound* sound);
+void sound_delete(struct Main *bmain, struct bSound* sound);
void sound_cache(struct bSound* sound);
@@ -124,7 +123,7 @@ void sound_play_scene(struct Scene *scene);
void sound_stop_scene(struct Scene *scene);
-void sound_seek_scene(struct bContext *C);
+void sound_seek_scene(struct Main *bmain, struct Scene *scene);
float sound_sync_scene(struct Scene *scene);
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 5f33059e117..2d4354bdd9f 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -324,17 +324,14 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath
MEM_freeN(bfd);
}
-static int handle_subversion_warning(Main *main)
+static int handle_subversion_warning(Main *main, ReportList *reports)
{
if(main->minversionfile > BLENDER_VERSION ||
(main->minversionfile == BLENDER_VERSION &&
main->minsubversionfile > BLENDER_SUBVERSION)) {
-
- char str[128];
-
- BLI_snprintf(str, sizeof(str), "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile);
-// XXX error(str);
+ BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile);
}
+
return 1;
}
@@ -392,7 +389,7 @@ int BKE_read_file(bContext *C, const char *filepath, ReportList *reports)
if (bfd) {
if(bfd->user) retval= BKE_READ_FILE_OK_USERPREFS;
- if(0==handle_subversion_warning(bfd->main)) {
+ if(0==handle_subversion_warning(bfd->main, reports)) {
free_main(bfd->main);
MEM_freeN(bfd);
bfd= NULL;
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index c342bbc917f..883f67c3061 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -867,7 +867,9 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
{sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
/* 23: CD_CLOTH_ORCO */
- {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}
+ {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 24: CD_RECAST */
+ {sizeof(MRecast), "MRecast", 1,"Recast",NULL,NULL,NULL,NULL}
};
static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
@@ -875,7 +877,7 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
/* 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"
+ /* 20-24 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco", "CDMRecast"
};
const CustomDataMask CD_MASK_BAREMESH =
@@ -883,14 +885,14 @@ const CustomDataMask CD_MASK_BAREMESH =
const CustomDataMask CD_MASK_MESH =
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
- CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
+ CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
const CustomDataMask CD_MASK_EDITMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
- CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
+ CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
const CustomDataMask CD_MASK_DERIVEDMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
- CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL;
+ CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL | CD_MASK_RECAST;
const CustomDataMask CD_MASK_BMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
const CustomDataMask CD_MASK_FACECORNERS =
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 715359aacb3..a56b764c12e 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -926,7 +926,8 @@ void init_render_material(Material *mat, int r_mode, float *amb)
if(mat->nodetree && mat->use_nodes) {
init_render_nodetree(mat->nodetree, mat, r_mode, amb);
- ntreeBeginExecTree(mat->nodetree); /* has internal flag to detect it only does it once */
+ if (!mat->nodetree->execdata)
+ mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree, 1);
}
}
@@ -958,8 +959,10 @@ void init_render_materials(Main *bmain, int r_mode, float *amb)
/* only needed for nodes now */
void end_render_material(Material *mat)
{
- if(mat && mat->nodetree && mat->use_nodes)
- ntreeEndExecTree(mat->nodetree); /* has internal flag to detect it only does it once */
+ if(mat && mat->nodetree && mat->use_nodes) {
+ if (mat->nodetree->execdata)
+ ntreeShaderEndExecTree(mat->nodetree->execdata, 1);
+ }
}
void end_render_materials(Main *bmain)
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 5f1a6c911bc..d40b030c470 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -46,84 +46,107 @@
#include <limits.h>
#include "DNA_anim_types.h"
-#include "DNA_action_types.h"
#include "DNA_node_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_action_types.h"
+#include "BLI_string.h"
+#include "BLI_math.h"
#include "BLI_listbase.h"
-
-#include "RNA_access.h"
+#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_utildefines.h"
+#include "BKE_utildefines.h"
-#include "PIL_time.h"
-
-#include "CMP_node.h"
-#include "intern/CMP_util.h" /* stupid include path... */
+#include "BLI_listbase.h"
-#include "SHD_node.h"
-#include "TEX_node.h"
-#include "intern/TEX_util.h"
+#include "RNA_access.h"
-#include "GPU_material.h"
+#include "NOD_socket.h"
+#include "NOD_composite.h"
+#include "NOD_shader.h"
+#include "NOD_texture.h"
-static ListBase empty_list = {NULL, NULL};
-ListBase node_all_composit = {NULL, NULL};
-ListBase node_all_shaders = {NULL, NULL};
-ListBase node_all_textures = {NULL, NULL};
-/* ************** Type stuff ********** */
+bNodeTreeType *ntreeGetType(int type)
+{
+ static bNodeTreeType *types[NUM_NTREE_TYPES];
+ static int types_init = 1;
+ if (types_init) {
+ types[NTREE_SHADER] = &ntreeType_Shader;
+ types[NTREE_COMPOSIT] = &ntreeType_Composite;
+ types[NTREE_TEXTURE] = &ntreeType_Texture;
+ types_init = 0;
+ }
+
+ if(type >= 0 && type < NUM_NTREE_TYPES) {
+ return types[type];
+ }
+ else {
+ return NULL;
+ }
+}
-static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id)
+static bNodeType *node_get_type(bNodeTree *ntree, int type)
{
- bNodeType *ntype = ntree->alltypes.first;
+ bNodeType *ntype = ntreeGetType(ntree->type)->node_types.first;
for(; ntype; ntype= ntype->next)
- if(ntype->type==type && id==ntype->id )
+ if(ntype->type==type)
return ntype;
return NULL;
}
-void ntreeInitTypes(bNodeTree *ntree)
+bNodeType *ntreeGetNodeType(bNodeTree *ntree)
{
- bNode *node, *next;
-
- if(ntree->type==NTREE_SHADER)
- ntree->alltypes= node_all_shaders;
- else if(ntree->type==NTREE_COMPOSIT)
- ntree->alltypes= node_all_composit;
- else if(ntree->type==NTREE_TEXTURE)
- ntree->alltypes= node_all_textures;
+ return node_get_type(ntree, ntree->nodetype);
+}
+
+bNodeSocketType *ntreeGetSocketType(int type)
+{
+ static bNodeSocketType *types[NUM_SOCKET_TYPES]= {NULL};
+ static int types_init = 1;
+
+ if (types_init) {
+ node_socket_type_init(types);
+ types_init= 0;
+ }
+
+ if(type < NUM_SOCKET_TYPES) {
+ return types[type];
+ }
else {
- ntree->alltypes= empty_list;
- printf("Error: no type definitions for nodes\n");
+ return NULL;
}
+}
+
+void ntreeInitTypes(bNodeTree *ntree)
+{
+ bNode *node, *next;
for(node= ntree->nodes.first; node; node= next) {
next= node->next;
+
+ node->typeinfo= node_get_type(ntree, node->type);
+
if(node->type==NODE_DYNAMIC) {
- bNodeType *stype= NULL;
- if(node->id==NULL) { /* empty script node */
- stype= node_get_type(ntree, node->type, NULL);
- } else { /* not an empty script node */
- stype= node_get_type(ntree, node->type, node->id);
- if(!stype) {
- stype= node_get_type(ntree, node->type, NULL);
- /* needed info if the pynode script fails now: */
- if (node->id) node->storage= ntree;
- } else {
- node->custom1= 0;
- node->custom1= BSET(node->custom1,NODE_DYNAMIC_ADDEXIST);
- }
+ /* needed info if the pynode script fails now: */
+ node->storage= ntree;
+ if(node->id!=NULL) { /* not an empty script node */
+ node->custom1= 0;
+ node->custom1= BSET(node->custom1,NODE_DYNAMIC_ADDEXIST);
}
- node->typeinfo= stype;
- if(node->typeinfo)
- node->typeinfo->initfunc(node);
- } else {
- node->typeinfo= node_get_type(ntree, node->type, NULL);
+// if(node->typeinfo)
+// node->typeinfo->initfunc(node);
}
if(node->typeinfo==NULL) {
@@ -135,66 +158,51 @@ void ntreeInitTypes(bNodeTree *ntree)
ntree->init |= NTREE_TYPE_INIT;
}
-/* updates node with (modified) bNodeType.. this should be done for all trees */
-void ntreeUpdateType(bNodeTree *ntree, bNodeType *ntype)
+static bNodeSocket *make_socket(bNodeTree *UNUSED(ntree), int in_out, const char *name, int type)
{
- bNode *node;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo== ntype) {
- nodeUpdateType(ntree, node, ntype);
- }
- }
+ bNodeSocketType *stype= ntreeGetSocketType(type);
+ bNodeSocket *sock;
+
+ sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+
+ BLI_strncpy(sock->name, name, NODE_MAXSTR);
+ sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
+ sock->type= type;
+ sock->storage = NULL;
+
+ if (stype->value_structsize > 0)
+ sock->default_value = MEM_callocN(stype->value_structsize, "default socket value");
+
+ return sock;
}
-/* only used internal... we depend on type definitions! */
-static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype)
+bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type)
{
- bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+ bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+ if (in_out==SOCK_IN)
+ BLI_addtail(&node->inputs, sock);
+ else if (in_out==SOCK_OUT)
+ BLI_addtail(&node->outputs, sock);
- BLI_strncpy(sock->name, stype->name, NODE_MAXSTR);
- if(stype->limit==0) sock->limit= 0xFFF;
- else sock->limit= stype->limit;
- sock->type= stype->type;
+ ntree->update |= NTREE_UPDATE_NODES;
- sock->ns.vec[0]= stype->val1;
- sock->ns.vec[1]= stype->val2;
- sock->ns.vec[2]= stype->val3;
- sock->ns.vec[3]= stype->val4;
- sock->ns.min= stype->min;
- sock->ns.max= stype->max;
-
- if(lb)
- BLI_addtail(lb, sock);
-
return sock;
}
-static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock)
+bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type)
{
- bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+ bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+ if (in_out==SOCK_IN)
+ BLI_insertlinkbefore(&node->inputs, next_sock, sock);
+ else if (in_out==SOCK_OUT)
+ BLI_insertlinkbefore(&node->outputs, next_sock, sock);
- /* make a copy of the group socket */
- *sock = *gsock;
- sock->link = NULL;
- sock->next = sock->prev = NULL;
- sock->new_sock = NULL;
- sock->ns.data = NULL;
+ ntree->update |= NTREE_UPDATE_NODES;
- sock->own_index = gsock->own_index;
- sock->groupsock = gsock;
- /* XXX hack: group socket input/output roles are inverted internally,
- * need to change the limit value when making actual node sockets from them.
- */
- sock->limit = (gsock->limit==1 ? 0xFFF : 1);
-
- if(lb)
- BLI_addtail(lb, sock);
-
return sock;
}
-static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
+void nodeRemoveSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
{
bNodeLink *link, *next;
@@ -205,428 +213,42 @@ static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
}
}
- BLI_remlink(lb, sock);
- MEM_freeN(sock);
-}
-
-static bNodeSocket *verify_socket(ListBase *lb, bNodeSocketType *stype)
-{
- bNodeSocket *sock;
-
- for(sock= lb->first; sock; sock= sock->next) {
- if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
- break;
- }
- if(sock) {
- sock->type= stype->type; /* in future, read this from tydefs! */
- if(stype->limit==0) sock->limit= 0xFFF;
- else sock->limit= stype->limit;
-
- sock->ns.min= stype->min;
- sock->ns.max= stype->max;
-
- BLI_remlink(lb, sock);
-
- return sock;
- }
- else {
- return node_add_socket_type(NULL, stype);
- }
-}
-
-static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock)
-{
- bNodeSocket *sock;
-
- for(sock= lb->first; sock; sock= sock->next) {
- if(sock->own_index==gsock->own_index)
- break;
- }
- if(sock) {
- sock->groupsock = gsock;
-
- strcpy(sock->name, gsock->name);
- sock->type= gsock->type;
-
- /* XXX hack: group socket input/output roles are inverted internally,
- * need to change the limit value when making actual node sockets from them.
- */
- sock->limit = (gsock->limit==1 ? 0xFFF : 1);
-
- sock->ns.min= gsock->ns.min;
- sock->ns.max= gsock->ns.max;
-
- BLI_remlink(lb, sock);
-
- return sock;
- }
- else {
- return node_add_group_socket(NULL, gsock);
- }
-}
-
-static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first)
-{
- bNodeSocketType *stype;
-
- /* no inputs anymore? */
- if(stype_first==NULL) {
- while(lb->first)
- node_rem_socket(ntree, lb, lb->first);
- }
- else {
- /* step by step compare */
- stype= stype_first;
- while(stype->type != -1) {
- stype->sock= verify_socket(lb, stype);
- stype++;
- }
- /* leftovers are removed */
- while(lb->first)
- node_rem_socket(ntree, lb, lb->first);
- /* and we put back the verified sockets */
- stype= stype_first;
- while(stype->type != -1) {
- BLI_addtail(lb, stype->sock);
- stype++;
- }
- }
-}
-
-static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb)
-{
- bNodeSocket *gsock;
-
- /* step by step compare */
- for (gsock= glb->first; gsock; gsock=gsock->next) {
- /* abusing new_sock pointer for verification here! only used inside this function */
- gsock->new_sock= verify_group_socket(lb, gsock);
- }
- /* leftovers are removed */
- while(lb->first)
- node_rem_socket(ntree, lb, lb->first);
- /* and we put back the verified sockets */
- for (gsock= glb->first; gsock; gsock=gsock->next) {
- BLI_addtail(lb, gsock->new_sock);
- gsock->new_sock = NULL;
- }
-}
-
-void nodeVerifyType(bNodeTree *ntree, bNode *node)
-{
- /* node groups don't have static sock lists, but use external sockets from the tree instead */
- if (node->type==NODE_GROUP) {
- bNodeTree *ngroup= (bNodeTree*)node->id;
- if (ngroup) {
- verify_group_socket_list(ntree, &node->inputs, &ngroup->inputs);
- verify_group_socket_list(ntree, &node->outputs, &ngroup->outputs);
- }
- }
- else {
- bNodeType *ntype= node->typeinfo;
- if(ntype) {
- verify_socket_list(ntree, &node->inputs, ntype->inputs);
- verify_socket_list(ntree, &node->outputs, ntype->outputs);
- }
- }
-}
-
-void ntreeVerifyTypes(bNodeTree *ntree)
-{
- bNode *node;
-
- /* if((ntree->init & NTREE_TYPE_INIT)==0) */
- ntreeInitTypes(ntree);
-
- /* check inputs and outputs, and remove or insert them */
- for(node= ntree->nodes.first; node; node= node->next)
- nodeVerifyType(ntree, node);
+ /* this is fast, this way we don't need an in_out argument */
+ BLI_remlink(&node->inputs, sock);
+ BLI_remlink(&node->outputs, sock);
-}
-
-/* ************** Group stuff ********** */
-
-/* XXX group typeinfo struct is used directly in ntreeMakeOwnType, needs cleanup */
-static bNodeType ntype_group;
-
-/* groups display their internal tree name as label */
-static const char *group_label(bNode *node)
-{
- return (node->id)? node->id->name+2: "Missing Datablock";
-}
-
-void register_node_type_group(ListBase *lb)
-{
- node_type_base(&ntype_group, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS, NULL, NULL);
- node_type_size(&ntype_group, 120, 60, 200);
- node_type_label(&ntype_group, group_label);
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ MEM_freeN(sock);
- nodeRegisterType(lb, &ntype_group);
-}
-
-static bNodeSocket *find_group_node_input(bNode *gnode, bNodeSocket *gsock)
-{
- bNodeSocket *sock;
- for (sock=gnode->inputs.first; sock; sock=sock->next)
- if (sock->groupsock == gsock)
- return sock;
- return NULL;
+ ntree->update |= NTREE_UPDATE_NODES;
}
-static bNodeSocket *find_group_node_output(bNode *gnode, bNodeSocket *gsock)
+void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
{
bNodeSocket *sock;
- for (sock=gnode->outputs.first; sock; sock=sock->next)
- if (sock->groupsock == gsock)
- return sock;
- return NULL;
-}
-
-bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
-{
- bNodeLink *link, *linkn;
- bNode *node, *gnode, *nextn;
- bNodeTree *ngroup;
- bNodeSocket *gsock;
- ListBase anim_basepaths = {NULL, NULL};
- float min[2], max[2];
- int totnode=0;
-
- INIT_MINMAX2(min, max);
-
- /* is there something to group? also do some clearing */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->flag & NODE_SELECT) {
- /* no groups in groups */
- if(node->type==NODE_GROUP)
- return NULL;
- DO_MINMAX2( (&node->locx), min, max);
- totnode++;
- }
- node->done= 0;
- }
- if(totnode==0) return NULL;
-
- /* check if all connections are OK, no unselected node has both
- inputs and outputs to a selection */
- for(link= ntree->links.first; link; link= link->next) {
- if(link->fromnode && link->tonode && link->fromnode->flag & NODE_SELECT)
- link->tonode->done |= 1;
- if(link->fromnode && link->tonode && link->tonode->flag & NODE_SELECT)
- link->fromnode->done |= 2;
- }
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if((node->flag & NODE_SELECT)==0)
- if(node->done==3)
- break;
- }
- if(node)
- return NULL;
+ bNodeLink *link, *next;
- /* OK! new nodetree */
- ngroup= ntreeAddTree("NodeGroup", ntree->type, TRUE);
-
- /* move nodes over */
- for(node= ntree->nodes.first; node; node= nextn) {
- nextn= node->next;
- if(node->flag & NODE_SELECT) {
- /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
- * if the old nodetree has animation data which potentially covers this node
- */
- if (ntree->adt) {
- PointerRNA ptr;
- char *path;
-
- RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
- path = RNA_path_from_ID_to_struct(&ptr);
-
- if (path)
- BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
- }
-
- /* change node-collection membership */
- BLI_remlink(&ntree->nodes, node);
- BLI_addtail(&ngroup->nodes, node);
-
- node->locx-= 0.5f*(min[0]+max[0]);
- node->locy-= 0.5f*(min[1]+max[1]);
- }
- }
-
- /* move animation data over */
- if (ntree->adt) {
- LinkData *ld, *ldn=NULL;
-
- BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths);
-
- /* paths + their wrappers need to be freed */
- for (ld = anim_basepaths.first; ld; ld = ldn) {
- ldn = ld->next;
-
- MEM_freeN(ld->data);
- BLI_freelinkN(&anim_basepaths, ld);
+ for(link= ntree->links.first; link; link= next) {
+ next= link->next;
+ if(link->fromnode==node || link->tonode==node) {
+ nodeRemLink(ntree, link);
}
}
- /* make group node */
- gnode= nodeAddNodeType(ntree, NODE_GROUP, ngroup, NULL);
- gnode->locx= 0.5f*(min[0]+max[0]);
- gnode->locy= 0.5f*(min[1]+max[1]);
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ BLI_freelistN(&node->inputs);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
- /* relink external sockets */
- for(link= ntree->links.first; link; link= linkn) {
- linkn= link->next;
-
- if(link->fromnode && link->tonode && (link->fromnode->flag & link->tonode->flag & NODE_SELECT)) {
- BLI_remlink(&ntree->links, link);
- BLI_addtail(&ngroup->links, link);
- }
- else if(link->tonode && (link->tonode->flag & NODE_SELECT)) {
- gsock = nodeGroupExposeSocket(ngroup, link->tosock, SOCK_IN);
- link->tosock->link = nodeAddLink(ngroup, NULL, gsock, link->tonode, link->tosock);
- link->tosock = node_add_group_socket(&gnode->inputs, gsock);
- link->tonode = gnode;
- }
- else if(link->fromnode && (link->fromnode->flag & NODE_SELECT)) {
- /* search for existing group node socket */
- for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next)
- if (gsock->link && gsock->link->fromsock==link->fromsock)
- break;
- if (!gsock) {
- gsock = nodeGroupExposeSocket(ngroup, link->fromsock, SOCK_OUT);
- gsock->link = nodeAddLink(ngroup, link->fromnode, link->fromsock, NULL, gsock);
- link->fromsock = node_add_group_socket(&gnode->outputs, gsock);
- }
- else
- link->fromsock = find_group_node_output(gnode, gsock);
- link->fromnode = gnode;
- }
- }
-
- /* update node levels */
- ntreeSolveOrder(ntree);
-
- return gnode;
-}
-
-/* here's a nasty little one, need to check users... */
-/* should become callbackable... */
-void nodeGroupVerify(bNodeTree *ngroup)
-{
- /* group changed, so we rebuild the type definition */
-// ntreeMakeGroupSockets(ngroup);
+ BLI_freelistN(&node->outputs);
- if(ngroup->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- bNode *node;
- for(node= ma->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(ma->nodetree, node);
- }
- }
- }
- else if(ngroup->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
- for(node= sce->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(sce->nodetree, node);
- }
- }
- }
- else if(ngroup->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- bNode *node;
- for(node= tx->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(tx->nodetree, node);
- }
- }
- }
+ ntree->update |= NTREE_UPDATE_NODES;
}
-/* also to check all users of groups. Now only used in editor for hide/unhide */
-/* should become callbackable? */
-void nodeGroupSocketUseFlags(bNodeTree *ngroup)
-{
- bNode *node;
- bNodeSocket *sock;
-
- /* clear flags */
- for(node= ngroup->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_IN_USE;
- }
-
- /* tag all thats in use */
- if(ngroup->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- for(node= ma->nodetree->nodes.first; node; node= node->next) {
- if(node->id==&ngroup->id) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link)
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(nodeCountSocketLinks(ma->nodetree, sock))
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- }
- }
- }
- }
- }
- else if(ngroup->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id==(ID *)ngroup) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link)
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(nodeCountSocketLinks(sce->nodetree, sock))
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- }
- }
- }
- }
- }
- else if(ngroup->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- for(node= tx->nodetree->nodes.first; node; node= node->next) {
- if(node->id==(ID *)ngroup) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link)
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(nodeCountSocketLinks(tx->nodetree, sock))
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- }
- }
- }
- }
- }
-
-}
/* finds a node based on its name */
bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name)
{
@@ -669,272 +291,26 @@ int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockin
return 0;
}
-/* returns 1 if its OK */
-int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
-{
- bNodeLink *link, *linkn;
- bNode *node, *nextn;
- bNodeTree *ngroup, *wgroup;
- ListBase anim_basepaths = {NULL, NULL};
-
- ngroup= (bNodeTree *)gnode->id;
- if(ngroup==NULL) return 0;
-
- /* clear new pointers, set in copytree */
- for(node= ntree->nodes.first; node; node= node->next)
- node->new_node= NULL;
-
- /* wgroup is a temporary copy of the NodeTree we're merging in
- * - all of wgroup's nodes are transferred across to their new home
- * - ngroup (i.e. the source NodeTree) is left unscathed
- */
- wgroup= ntreeCopyTree(ngroup);
-
- /* add the nodes into the ntree */
- for(node= wgroup->nodes.first; node; node= nextn) {
- nextn= node->next;
-
- /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
- * if the old nodetree has animation data which potentially covers this node
- */
- if (wgroup->adt) {
- PointerRNA ptr;
- char *path;
-
- RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr);
- path = RNA_path_from_ID_to_struct(&ptr);
-
- if (path)
- BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
- }
-
- /* migrate node */
- BLI_remlink(&wgroup->nodes, node);
- BLI_addtail(&ntree->nodes, node);
-
- node->locx+= gnode->locx;
- node->locy+= gnode->locy;
-
- node->flag |= NODE_SELECT;
- }
-
- /* restore external links to and from the gnode */
- for(link= ntree->links.first; link; link= link->next) {
- if (link->fromnode==gnode) {
- if (link->fromsock->groupsock) {
- bNodeSocket *gsock= link->fromsock->groupsock;
- if (gsock->link) {
- if (gsock->link->fromnode) {
- /* NB: using the new internal copies here! the groupsock pointer still maps to the old tree */
- link->fromnode = (gsock->link->fromnode ? gsock->link->fromnode->new_node : NULL);
- link->fromsock = gsock->link->fromsock->new_sock;
- }
- else {
- /* group output directly maps to group input */
- bNodeSocket *insock= find_group_node_input(gnode, gsock->link->fromsock);
- if (insock->link) {
- link->fromnode = insock->link->fromnode;
- link->fromsock = insock->link->fromsock;
- }
- }
- }
- else {
- /* constant group output: copy the stack value to the external socket.
- * the link is kept here until all possible external users have been fixed.
- */
- QUATCOPY(link->tosock->ns.vec, gsock->ns.vec);
- }
- }
- }
- }
- /* remove internal output links, these are not used anymore */
- for(link=wgroup->links.first; link; link= linkn) {
- linkn = link->next;
- if (!link->tonode)
- nodeRemLink(wgroup, link);
- }
- /* restore links from internal nodes */
- for(link= wgroup->links.first; link; link= link->next) {
- /* indicates link to group input */
- if (!link->fromnode) {
- /* NB: can't use find_group_node_input here,
- * because gnode sockets still point to the old tree!
- */
- bNodeSocket *insock;
- for (insock= gnode->inputs.first; insock; insock= insock->next)
- if (insock->groupsock->new_sock == link->fromsock)
- break;
- if (insock->link) {
- link->fromnode = insock->link->fromnode;
- link->fromsock = insock->link->fromsock;
- }
- else {
- /* uses group constant input. copy the input value and remove the dead link. */
- QUATCOPY(link->tosock->ns.vec, insock->ns.vec);
- nodeRemLink(wgroup, link);
- }
- }
- }
-
- /* add internal links to the ntree */
- for(link= wgroup->links.first; link; link= linkn) {
- linkn= link->next;
- BLI_remlink(&wgroup->links, link);
- BLI_addtail(&ntree->links, link);
- }
-
- /* and copy across the animation */
- if (wgroup->adt) {
- LinkData *ld, *ldn=NULL;
- bAction *waction;
-
- /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */
- waction = wgroup->adt->action = copy_action(wgroup->adt->action);
-
- /* now perform the moving */
- BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths);
-
- /* paths + their wrappers need to be freed */
- for (ld = anim_basepaths.first; ld; ld = ldn) {
- ldn = ld->next;
-
- MEM_freeN(ld->data);
- BLI_freelinkN(&anim_basepaths, ld);
- }
-
- /* free temp action too */
- free_libblock(&G.main->action, waction);
- }
-
- /* delete the group instance. this also removes old input links! */
- nodeFreeNode(ntree, gnode);
-
- /* free the group tree (takes care of user count) */
- free_libblock(&G.main->nodetree, wgroup);
-
- /* solve order goes fine, but the level tags not... doing it twice works for now. solve this once */
- /* XXX is this still necessary with new groups? it may have been caused by non-updated sock->link pointers. lukas */
- ntreeSolveOrder(ntree);
- ntreeSolveOrder(ntree);
-
- return 1;
-}
-
-void nodeGroupCopy(bNode *gnode)
+/* ************** Add stuff ********** */
+static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype)
{
+ bNodeSocketTemplate *sockdef;
bNodeSocket *sock;
- gnode->id->us--;
- gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id);
-
- /* new_sock was set in nodeCopyNode */
- for(sock=gnode->inputs.first; sock; sock=sock->next)
- if(sock->groupsock)
- sock->groupsock= sock->groupsock->new_sock;
-
- for(sock=gnode->outputs.first; sock; sock=sock->next)
- if(sock->groupsock)
- sock->groupsock= sock->groupsock->new_sock;
-}
-
-bNodeSocket *nodeGroupAddSocket(bNodeTree *ngroup, const char *name, int type, int in_out)
-{
- bNodeSocket *gsock = MEM_callocN(sizeof(bNodeSocket), "bNodeSocket");
-
- strncpy(gsock->name, name, sizeof(gsock->name));
- gsock->type = type;
- gsock->ns.sockettype = type;
- gsock->ns.min = INT_MIN;
- gsock->ns.max = INT_MAX;
- zero_v4(gsock->ns.vec);
- gsock->ns.data = NULL;
- gsock->flag = 0;
-
- gsock->next = gsock->prev = NULL;
- gsock->new_sock = NULL;
- gsock->link = NULL;
- gsock->ns.data = NULL;
- /* assign new unique index */
- gsock->own_index = ngroup->cur_index++;
- gsock->limit = (in_out==SOCK_IN ? 0xFFF : 1);
-
- BLI_addtail(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, gsock);
-
- return gsock;
-}
-
-bNodeSocket *nodeGroupExposeSocket(bNodeTree *ngroup, bNodeSocket *sock, int in_out)
-{
- bNodeSocket *gsock= nodeGroupAddSocket(ngroup, sock->name, sock->type, in_out);
- /* initialize the default socket value */
- QUATCOPY(gsock->ns.vec, sock->ns.vec);
- return gsock;
-}
-
-void nodeGroupExposeAllSockets(bNodeTree *ngroup)
-{
- bNode *node;
- bNodeSocket *sock, *gsock;
-
- for (node=ngroup->nodes.first; node; node=node->next) {
- for (sock=node->inputs.first; sock; sock=sock->next) {
- if (!sock->link && !(sock->flag & SOCK_HIDDEN)) {
- gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_IN);
- /* initialize the default socket value */
- QUATCOPY(gsock->ns.vec, sock->ns.vec);
- sock->link = nodeAddLink(ngroup, NULL, gsock, node, sock);
- }
- }
- for (sock=node->outputs.first; sock; sock=sock->next) {
- if (nodeCountSocketLinks(ngroup, sock)==0 && !(sock->flag & SOCK_HIDDEN)) {
- gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_OUT);
- /* initialize the default socket value */
- QUATCOPY(gsock->ns.vec, sock->ns.vec);
- gsock->link = nodeAddLink(ngroup, node, sock, NULL, gsock);
- }
- }
- }
-}
-
-void nodeGroupRemoveSocket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out)
-{
- nodeRemSocketLinks(ngroup, gsock);
- switch (in_out) {
- case SOCK_IN: BLI_remlink(&ngroup->inputs, gsock); break;
- case SOCK_OUT: BLI_remlink(&ngroup->outputs, gsock); break;
- }
- MEM_freeN(gsock);
-}
-
-/* ************** Add stuff ********** */
-void nodeAddSockets(bNode *node, bNodeType *ntype)
-{
- if (node->type==NODE_GROUP) {
- bNodeTree *ntree= (bNodeTree*)node->id;
- if (ntree) {
- bNodeSocket *gsock;
- for (gsock=ntree->inputs.first; gsock; gsock=gsock->next)
- node_add_group_socket(&node->inputs, gsock);
- for (gsock=ntree->outputs.first; gsock; gsock=gsock->next)
- node_add_group_socket(&node->outputs, gsock);
+ if(ntype->inputs) {
+ sockdef= ntype->inputs;
+ while(sockdef->type != -1) {
+ sock = node_add_input_from_template(ntree, node, sockdef);
+
+ sockdef++;
}
}
- else {
- bNodeSocketType *stype;
-
- if(ntype->inputs) {
- stype= ntype->inputs;
- while(stype->type != -1) {
- node_add_socket_type(&node->inputs, stype);
- stype++;
- }
- }
- if(ntype->outputs) {
- stype= ntype->outputs;
- while(stype->type != -1) {
- node_add_socket_type(&node->outputs, stype);
- stype++;
- }
+ if(ntype->outputs) {
+ sockdef= ntype->outputs;
+ while(sockdef->type != -1) {
+ sock = node_add_output_from_template(ntree, node, sockdef);
+
+ sockdef++;
}
}
}
@@ -945,65 +321,40 @@ void nodeUniqueName(bNodeTree *ntree, bNode *node)
BLI_uniquename(&ntree->nodes, node, "Node", '.', offsetof(bNode, name), sizeof(node->name));
}
-bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
+bNode *nodeAddNode(bNodeTree *ntree, struct bNodeTemplate *ntemp)
{
- bNode *node= NULL;
- bNodeType *ntype= NULL;
-
- if (ngroup && BLI_findindex(&G.main->nodetree, ngroup)==-1) {
- printf("nodeAddNodeType() error: '%s' not in main->nodetree\n", ngroup->id.name);
- return NULL;
- }
-
- if(type>=NODE_DYNAMIC_MENU) {
- int a=0, idx= type-NODE_DYNAMIC_MENU;
- ntype= ntree->alltypes.first;
- while(ntype) {
- if(ntype->type==NODE_DYNAMIC) {
- if(a==idx)
- break;
- a++;
- }
- ntype= ntype->next;
- }
- } else
- ntype= node_get_type(ntree, type, id);
-
+ bNode *node;
+ bNodeType *ntype;
+
+ ntype= node_get_type(ntree, ntemp->type);
if(ntype == NULL) {
- printf("nodeAddNodeType() error: '%d' type invalid\n", type);
+ printf("nodeAddNodeType() error: '%d' type invalid\n", ntemp->type);
return NULL;
}
-
- node= MEM_callocN(sizeof(bNode), "new node");
- BLI_addtail(&ntree->nodes, node);
- node->typeinfo= ntype;
- if(type>=NODE_DYNAMIC_MENU)
- node->custom2= type; /* for node_dynamic_init */
-
- if(ngroup)
- BLI_strncpy(node->name, ngroup->id.name+2, NODE_MAXSTR);
- else if(type>NODE_DYNAMIC_MENU) {
- BLI_strncpy(node->name, ntype->id->name+2, NODE_MAXSTR);
- }
- else
- BLI_strncpy(node->name, ntype->name, NODE_MAXSTR);
-
- nodeUniqueName(ntree, node);
+ /* validity check */
+ if (!nodeValid(ntree, ntemp))
+ return NULL;
+ node= MEM_callocN(sizeof(bNode), "new node");
node->type= ntype->type;
+ node->typeinfo= ntype;
node->flag= NODE_SELECT|ntype->flag;
node->width= ntype->width;
- node->miniwidth= 42.0f; /* small value only, allows print of first chars */
-
- if(type==NODE_GROUP)
- node->id= (ID *)ngroup;
-
- /* need init handler later? */
- /* got it-bob*/
+ node->miniwidth= 42.0f;
+ node->height= ntype->height;
+
+ node_add_sockets_from_type(ntree, node, ntype);
+
if(ntype->initfunc!=NULL)
- ntype->initfunc(node);
+ ntype->initfunc(ntree, node, ntemp);
+
+ /* initialize the node name with the node label */
+ BLI_strncpy(node->name, nodeLabel(node), NODE_MAXSTR);
+ nodeUniqueName(ntree, node);
+
+ BLI_addtail(&ntree->nodes, node);
- nodeAddSockets(node, ntype);
+ ntree->update |= NTREE_UPDATE_NODES;
return node;
}
@@ -1011,9 +362,9 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
void nodeMakeDynamicType(bNode *node)
{
/* find SH_DYNAMIC_NODE ntype */
- bNodeType *ntype= node_all_shaders.first;
+ bNodeType *ntype= ntreeGetType(NTREE_SHADER)->node_types.first;
while(ntype) {
- if(ntype->type==NODE_DYNAMIC && ntype->id==NULL)
+ if(ntype->type==NODE_DYNAMIC)
break;
ntype= ntype->next;
}
@@ -1023,17 +374,11 @@ void nodeMakeDynamicType(bNode *node)
/*node->typeinfo= MEM_dupallocN(ntype);*/
bNodeType *newtype= MEM_callocN(sizeof(bNodeType), "dynamic bNodeType");
*newtype= *ntype;
- newtype->name= BLI_strdup(ntype->name);
+ strcpy(newtype->name, ntype->name);
node->typeinfo= newtype;
}
}
-void nodeUpdateType(bNodeTree *ntree, bNode* node, bNodeType *ntype)
-{
- verify_socket_list(ntree, &node->inputs, ntype->inputs);
- verify_socket_list(ntree, &node->outputs, ntype->outputs);
-}
-
/* keep socket listorder identical, for copying links */
/* ntree is the target tree */
bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
@@ -1045,19 +390,33 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
nodeUniqueName(ntree, nnode);
BLI_addtail(&ntree->nodes, nnode);
-
+
BLI_duplicatelist(&nnode->inputs, &node->inputs);
oldsock= node->inputs.first;
for(sock= nnode->inputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
oldsock->new_sock= sock;
+ sock->stack_index= 0;
+
+ sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
+
+ /* XXX some compositor node (e.g. image, render layers) still store
+ * some persistent buffer data here, need to clear this to avoid dangling pointers.
+ */
+ sock->cache = NULL;
}
BLI_duplicatelist(&nnode->outputs, &node->outputs);
oldsock= node->outputs.first;
for(sock= nnode->outputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
- sock->stack_index= 0;
- sock->ns.data= NULL;
oldsock->new_sock= sock;
+ sock->stack_index= 0;
+
+ sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
+
+ /* XXX some compositor node (e.g. image, render layers) still store
+ * some persistent buffer data here, need to clear this to avoid dangling pointers.
+ */
+ sock->cache = NULL;
}
/* don't increase node->id users, freenode doesn't decrement either */
@@ -1069,10 +428,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
nnode->new_node= NULL;
nnode->preview= NULL;
+ ntree->update |= NTREE_UPDATE_NODES;
+
return nnode;
}
-/* fromsock and tosock can be NULL */
/* also used via rna api, so we check for proper input output direction */
bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
{
@@ -1095,6 +455,21 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock,
from= -1; /* OK but flip */
}
}
+ else {
+ /* check tree sockets */
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= 1; /* OK */
+ else {
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= -1; /* OK but flip */
+ }
+ }
if(tonode) {
for(sock= tonode->inputs.first; sock; sock= sock->next)
if(sock==tosock)
@@ -1109,8 +484,22 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock,
to= -1; /* OK but flip */
}
}
+ else {
+ /* check tree sockets */
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= 1; /* OK */
+ else {
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= -1; /* OK but flip */
+ }
+ }
- /* this allows NULL sockets to work */
if(from >= 0 && to >= 0) {
link= MEM_callocN(sizeof(bNodeLink), "link");
BLI_addtail(&ntree->links, link);
@@ -1128,6 +517,8 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock,
link->tosock= fromsock;
}
+ ntree->update |= NTREE_UPDATE_LINKS;
+
return link;
}
@@ -1137,6 +528,8 @@ void nodeRemLink(bNodeTree *ntree, bNodeLink *link)
if(link->tosock)
link->tosock->link= NULL;
MEM_freeN(link);
+
+ ntree->update |= NTREE_UPDATE_LINKS;
}
void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
@@ -1149,26 +542,73 @@ void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
nodeRemLink(ntree, link);
}
}
+
+ ntree->update |= NTREE_UPDATE_LINKS;
}
+/* transforms node location to area coords */
+void nodeSpaceCoords(bNode *node, float *locx, float *locy)
+{
+ if (node->parent) {
+ nodeSpaceCoords(node->parent, locx, locy);
+ *locx += node->locx;
+ *locy += node->locy;
+ }
+ else {
+ *locx = node->locx;
+ *locy = node->locy;
+ }
+}
-bNodeTree *ntreeAddTree(const char *name, int type, const short is_group)
+void nodeAttachNode(bNode *node, bNode *parent)
{
- bNodeTree *ntree;
+ float parentx, parenty;
+
+ node->parent = parent;
+ /* transform to parent space */
+ nodeSpaceCoords(parent, &parentx, &parenty);
+ node->locx -= parentx;
+ node->locy -= parenty;
+}
- if (is_group)
- ntree= alloc_libblock(&G.main->nodetree, ID_NT, name);
- else {
+void nodeDetachNode(struct bNode *node)
+{
+ float parentx, parenty;
+
+ if (node->parent) {
+ /* transform to "global" (area) space */
+ nodeSpaceCoords(node->parent, &parentx, &parenty);
+ node->locx += parentx;
+ node->locy += parenty;
+ node->parent = NULL;
+ }
+}
+
+bNodeTree *ntreeAddTree(const char *name, int type, int nodetype)
+{
+ bNodeTree *ntree;
+ bNodeType *ntype;
+
+ /* trees are created as local trees if they of compositor, material or texture type,
+ * node groups and other tree types are created as library data.
+ */
+ if (ELEM3(type, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE) && nodetype==0) {
ntree= MEM_callocN(sizeof(bNodeTree), "new node tree");
*( (short *)ntree->id.name )= ID_NT; /* not "type", as that is ntree->type */
BLI_strncpy(ntree->id.name+2, name, sizeof(ntree->id.name));
}
-
+ else
+ ntree= alloc_libblock(&G.main->nodetree, ID_NT, name);
+
ntree->type= type;
- ntree->alltypes.first = NULL;
- ntree->alltypes.last = NULL;
-
+ ntree->nodetype = nodetype;
+
ntreeInitTypes(ntree);
+
+ ntype = node_get_type(ntree, ntree->nodetype);
+ if (ntype && ntype->inittreefunc)
+ ntype->inittreefunc(ntree);
+
return ntree;
}
@@ -1199,9 +639,7 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
id_us_plus((ID *)newtree->gpd);
/* in case a running nodetree is copied */
- newtree->init &= ~(NTREE_EXEC_INIT);
- newtree->threadstack= NULL;
- newtree->stack= NULL;
+ newtree->execdata= NULL;
newtree->nodes.first= newtree->nodes.last= NULL;
newtree->links.first= newtree->links.last= NULL;
@@ -1210,7 +648,10 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
for(node= ntree->nodes.first; node; node= node->next) {
node->new_node= NULL;
nnode= nodeCopyNode(newtree, node); /* sets node->new */
- if(node==last) break;
+
+ /* make sure we don't copy new nodes again! */
+ if (node==last)
+ break;
}
/* socket definition for group usage */
@@ -1218,14 +659,15 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
for(gsock= newtree->inputs.first, oldgsock= ntree->inputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) {
oldgsock->new_sock= gsock;
gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
+ gsock->default_value = (oldgsock->default_value ? MEM_dupallocN(oldgsock->default_value) : NULL);
}
-
BLI_duplicatelist(&newtree->outputs, &ntree->outputs);
for(gsock= newtree->outputs.first, oldgsock= ntree->outputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) {
oldgsock->new_sock= gsock;
gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
+ gsock->default_value = (oldgsock->default_value ? MEM_dupallocN(oldgsock->default_value) : NULL);
}
-
+
/* copy links */
BLI_duplicatelist(&newtree->links, &ntree->links);
for(link= newtree->links.first; link; link= link->next) {
@@ -1237,7 +679,13 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
if (link->tosock)
link->tosock->link = link;
}
-
+
+ /* update node->parent pointers */
+ for (node=newtree->nodes.first; node; node=node->next) {
+ if (node->parent)
+ node->parent = node->parent->new_node;
+ }
+
return newtree;
}
@@ -1256,7 +704,7 @@ void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
/* *************** preview *********** */
/* if node->preview, then we assume the rect to exist */
-static void node_free_preview(bNode *node)
+void nodeFreePreview(bNode *node)
{
if(node->preview) {
if(node->preview->rect)
@@ -1360,7 +808,6 @@ void nodeAddToPreview(bNode *node, float *col, int x, int y, int do_manage)
}
}
-
/* ************** Free stuff ********** */
/* goes over entire tree */
@@ -1395,50 +842,84 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
}
}
-static void composit_free_node_cache(bNode *node)
+static void node_unlink_attached(bNodeTree *ntree, bNode *parent)
{
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(sock->ns.data) {
- free_compbuf(sock->ns.data);
- sock->ns.data= NULL;
- }
+ bNode *node;
+ for (node=ntree->nodes.first; node; node=node->next) {
+ if (node->parent == parent)
+ nodeDetachNode(node);
}
}
void nodeFreeNode(bNodeTree *ntree, bNode *node)
{
+ bNodeTreeType *treetype= ntreeGetType(ntree->type);
+ bNodeSocket *sock, *nextsock;
+
+ /* remove all references to this node */
nodeUnlinkNode(ntree, node);
+ node_unlink_attached(ntree, node);
+
BLI_remlink(&ntree->nodes, node);
/* since it is called while free database, node->id is undefined */
- if(ntree->type==NTREE_COMPOSIT)
- composit_free_node_cache(node);
- BLI_freelistN(&node->inputs);
- BLI_freelistN(&node->outputs);
+ if (treetype->free_node_cache)
+ treetype->free_node_cache(ntree, node);
- node_free_preview(node);
+ for (sock=node->inputs.first; sock; sock = nextsock) {
+ nextsock = sock->next;
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ MEM_freeN(sock);
+ }
+ for (sock=node->outputs.first; sock; sock = nextsock) {
+ nextsock = sock->next;
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ MEM_freeN(sock);
+ }
+
+ nodeFreePreview(node);
if(node->typeinfo && node->typeinfo->freestoragefunc) {
node->typeinfo->freestoragefunc(node);
}
MEM_freeN(node);
+
+ ntree->update |= NTREE_UPDATE_NODES;
}
/* do not free ntree itself here, free_libblock calls this function too */
void ntreeFreeTree(bNodeTree *ntree)
{
bNode *node, *next;
+ bNodeSocket *sock;
if(ntree==NULL) return;
- ntreeEndExecTree(ntree); /* checks for if it is still initialized */
+ /* XXX hack! node trees should not store execution graphs at all.
+ * This should be removed when old tree types no longer require it.
+ * Currently the execution data for texture nodes remains in the tree
+ * after execution, until the node tree is updated or freed.
+ */
+ if (ntree->execdata) {
+ switch (ntree->type) {
+ case NTREE_COMPOSIT:
+ ntreeCompositEndExecTree(ntree->execdata, 1);
+ break;
+ case NTREE_SHADER:
+ ntreeShaderEndExecTree(ntree->execdata, 1);
+ break;
+ case NTREE_TEXTURE:
+ ntreeTexEndExecTree(ntree->execdata, 1);
+ break;
+ }
+ }
BKE_free_animdata((ID *)ntree);
-
+
id_us_min((ID *)ntree->gpd);
BLI_freelistN(&ntree->links); /* do first, then unlink_node goes fast */
@@ -1448,25 +929,120 @@ void ntreeFreeTree(bNodeTree *ntree)
nodeFreeNode(ntree, node);
}
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
BLI_freelistN(&ntree->inputs);
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
BLI_freelistN(&ntree->outputs);
}
void ntreeFreeCache(bNodeTree *ntree)
{
- bNode *node;
+ bNodeTreeType *treetype;
if(ntree==NULL) return;
+
+ treetype= ntreeGetType(ntree->type);
+ if (treetype->free_cache)
+ treetype->free_cache(ntree);
+}
- if(ntree->type==NTREE_COMPOSIT)
- for(node= ntree->nodes.first; node; node= node->next)
- composit_free_node_cache(node);
+void ntreeSetOutput(bNodeTree *ntree)
+{
+ bNode *node;
+ /* find the active outputs, might become tree type dependant handler */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ bNode *tnode;
+ int output= 0;
+
+ /* we need a check for which output node should be tagged like this, below an exception */
+ if(node->type==CMP_NODE_OUTPUT_FILE)
+ continue;
+
+ /* there is more types having output class, each one is checked */
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
+ if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+
+ if(ntree->type==NTREE_COMPOSIT) {
+
+ /* same type, exception for viewer */
+ if(tnode->type==node->type ||
+ (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
+ ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ else {
+ /* same type */
+ if(tnode->type==node->type) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ }
+ }
+ if(output==0)
+ node->flag |= NODE_DO_OUTPUT;
+ }
+ }
+
+ /* here we could recursively set which nodes have to be done,
+ might be different for editor or for "real" use... */
+}
+
+typedef struct MakeLocalCallData {
+ ID *group_id;
+ ID *new_id;
+ int lib, local;
+} MakeLocalCallData;
+
+static void ntreeMakeLocal_CheckLocal(void *calldata, ID *owner_id, bNodeTree *ntree)
+{
+ MakeLocalCallData *cd= (MakeLocalCallData*)calldata;
+ bNode *node;
+
+ /* find if group is in tree */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id == cd->group_id) {
+ if(owner_id->lib) cd->lib= 1;
+ else cd->local= 1;
+ }
+ }
+}
+
+static void ntreeMakeLocal_LinkNew(void *calldata, ID *owner_id, bNodeTree *ntree)
+{
+ MakeLocalCallData *cd= (MakeLocalCallData*)calldata;
+ bNode *node;
+
+ /* find if group is in tree */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id == cd->group_id) {
+ if(owner_id->lib==NULL) {
+ node->id= cd->new_id;
+ cd->new_id->us++;
+ cd->group_id->us--;
+ }
+ }
+ }
}
void ntreeMakeLocal(bNodeTree *ntree)
{
- int local=0, lib=0;
+ bNodeTreeType *treetype= ntreeGetType(ntree->type);
+ MakeLocalCallData cd;
/* - only lib users: do nothing
* - only local users: set flag
@@ -1475,138 +1051,146 @@ void ntreeMakeLocal(bNodeTree *ntree)
if(ntree->id.lib==NULL) return;
if(ntree->id.us==1) {
- ntree->id.lib= NULL;
+ ntree->id.lib= 0;
ntree->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)ntree, NULL);
+ new_id(0, (ID *)ntree, 0);
return;
}
/* now check users of groups... again typedepending, callback... */
- if(ntree->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= ma->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(ma->id.lib) lib= 1;
- else local= 1;
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(sce->id.lib) lib= 1;
- else local= 1;
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= tx->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(tx->id.lib) lib= 1;
- else local= 1;
- }
- }
- }
- }
- }
+ cd.group_id = &ntree->id;
+ cd.new_id = NULL;
+ cd.local = 0;
+ cd.lib = 0;
+
+ treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_CheckLocal);
/* if all users are local, we simply make tree local */
- if(local && lib==0) {
+ if(cd.local && cd.lib==0) {
ntree->id.lib= NULL;
ntree->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)ntree, NULL);
+ new_id(0, (ID *)ntree, 0);
}
- else if(local && lib) {
+ else if(cd.local && cd.lib) {
/* this is the mixed case, we copy the tree and assign it to local users */
bNodeTree *newtree= ntreeCopyTree(ntree);
newtree->id.us= 0;
- if(ntree->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= ma->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(ma->id.lib==NULL) {
- node->id= &newtree->id;
- newtree->id.us++;
- ntree->id.us--;
- }
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(sce->id.lib==NULL) {
- node->id= &newtree->id;
- newtree->id.us++;
- ntree->id.us--;
- }
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= tx->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(tx->id.lib==NULL) {
- node->id= &newtree->id;
- newtree->id.us++;
- ntree->id.us--;
- }
- }
- }
- }
+
+ cd.new_id = &newtree->id;
+ treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_LinkNew);
+ }
+}
+
+int ntreeNodeExists(bNodeTree *ntree, bNode *testnode)
+{
+ bNode *node= ntree->nodes.first;
+ for(; node; node= node->next)
+ if(node==testnode)
+ return 1;
+ return 0;
+}
+
+int ntreeOutputExists(bNode *node, bNodeSocket *testsock)
+{
+ bNodeSocket *sock= node->outputs.first;
+ for(; sock; sock= sock->next)
+ if(sock==testsock)
+ return 1;
+ return 0;
+}
+
+/* returns localized tree for execution in threads */
+bNodeTree *ntreeLocalize(bNodeTree *ntree)
+{
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+
+ bNodeTree *ltree;
+ bNode *node;
+
+ bAction *action_backup= NULL, *tmpact_backup= NULL;
+
+ /* Workaround for copying an action on each render!
+ * set action to NULL so animdata actions dont get copied */
+ AnimData *adt= BKE_animdata_from_id(&ntree->id);
+
+ if(adt) {
+ action_backup= adt->action;
+ tmpact_backup= adt->tmpact;
+
+ adt->action= NULL;
+ adt->tmpact= NULL;
+ }
+
+ /* node copy func */
+ ltree= ntreeCopyTree(ntree);
+
+ if(adt) {
+ AnimData *ladt= BKE_animdata_from_id(&ltree->id);
+
+ adt->action= ladt->action= action_backup;
+ adt->tmpact= ladt->tmpact= tmpact_backup;
+
+ if(action_backup) action_backup->id.us++;
+ if(tmpact_backup) tmpact_backup->id.us++;
+
+ }
+ /* end animdata uglyness */
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ /* store new_node pointer to original */
+ node->new_node->new_node= node;
+ }
+
+ if (ntreetype->localize)
+ ntreetype->localize(ltree, ntree);
+
+ return ltree;
+}
+
+/* sync local composite with real tree */
+/* local tree is supposed to be running, be careful moving previews! */
+/* is called by jobs manager, outside threads, so it doesnt happen during draw */
+void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+
+ if (ntreetype->local_sync)
+ ntreetype->local_sync(localtree, ntree);
+}
+
+/* merge local tree results back, and free local tree */
+/* we have to assume the editor already changed completely */
+void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+ bNode *lnode;
+
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ if(lnode->preview && lnode->preview->rect) {
+ nodeFreePreview(lnode->new_node);
+ lnode->new_node->preview= lnode->preview;
+ lnode->preview= NULL;
}
}
}
-}
+ if (ntreetype->local_merge)
+ ntreetype->local_merge(localtree, ntree);
+
+ ntreeFreeTree(localtree);
+ MEM_freeN(localtree);
+}
/* ************ find stuff *************** */
-static int ntreeHasType(bNodeTree *ntree, int type)
+int ntreeHasType(bNodeTree *ntree, int type)
{
bNode *node;
@@ -1770,7 +1354,7 @@ void ntreeSocketUseFlags(bNodeTree *ntree)
/* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */
-static int node_recurs_check(bNode *node, bNode ***nsort)
+static int node_get_deplist_recurs(bNode *node, bNode ***nsort)
{
bNode *fromnode;
bNodeSocket *sock;
@@ -1778,646 +1362,146 @@ static int node_recurs_check(bNode *node, bNode ***nsort)
node->done= 1;
+ /* check linked nodes */
for(sock= node->inputs.first; sock; sock= sock->next) {
if(sock->link) {
fromnode= sock->link->fromnode;
if(fromnode) {
if (fromnode->done==0)
- fromnode->level= node_recurs_check(fromnode, nsort);
+ fromnode->level= node_get_deplist_recurs(fromnode, nsort);
if (fromnode->level <= level)
level = fromnode->level - 1;
}
}
}
- **nsort= node;
- (*nsort)++;
- return level;
-}
-
-
-static void ntreeSetOutput(bNodeTree *ntree)
-{
- bNode *node;
-
- /* find the active outputs, might become tree type dependant handler */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- bNode *tnode;
- int output= 0;
-
- /* we need a check for which output node should be tagged like this, below an exception */
- if(node->type==CMP_NODE_OUTPUT_FILE)
- continue;
-
- /* there is more types having output class, each one is checked */
- for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
- if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
-
- if(ntree->type==NTREE_COMPOSIT) {
-
- /* same type, exception for viewer */
- if(tnode->type==node->type ||
- (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
- ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
- if(tnode->flag & NODE_DO_OUTPUT) {
- output++;
- if(output>1)
- tnode->flag &= ~NODE_DO_OUTPUT;
- }
- }
- }
- else {
- /* same type */
- if(tnode->type==node->type) {
- if(tnode->flag & NODE_DO_OUTPUT) {
- output++;
- if(output>1)
- tnode->flag &= ~NODE_DO_OUTPUT;
- }
- }
- }
- }
- }
- if(output==0)
- node->flag |= NODE_DO_OUTPUT;
- }
+ /* check parent node */
+ if (node->parent) {
+ if (node->parent->done==0)
+ node->parent->level= node_get_deplist_recurs(node->parent, nsort);
+ if (node->parent->level <= level)
+ level = node->parent->level - 1;
}
- /* here we could recursively set which nodes have to be done,
- might be different for editor or for "real" use... */
+ if (nsort) {
+ **nsort= node;
+ (*nsort)++;
+ }
+
+ return level;
}
-void ntreeSolveOrder(bNodeTree *ntree)
+void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes)
{
- bNode *node, **nodesort, **nsort;
- bNodeSocket *sock;
- bNodeLink *link;
- int a, totnode=0;
+ bNode *node, **nsort;
+
+ *totnodes=0;
- /* the solve-order is called on each tree change, so we should be sure no exec can be running */
- ntreeEndExecTree(ntree);
-
- /* set links pointers the input sockets, to find dependencies */
/* first clear data */
for(node= ntree->nodes.first; node; node= node->next) {
node->done= 0;
- totnode++;
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->link= NULL;
+ (*totnodes)++;
}
- /* clear group socket links */
- for(sock= ntree->outputs.first; sock; sock= sock->next)
- sock->link= NULL;
- if(totnode==0)
+ if(*totnodes==0) {
+ *deplist = NULL;
return;
-
- for(link= ntree->links.first; link; link= link->next) {
- link->tosock->link= link;
}
- nsort= nodesort= MEM_callocN(totnode*sizeof(void *), "sorted node array");
+ nsort= *deplist= MEM_callocN((*totnodes)*sizeof(bNode*), "sorted node array");
/* recursive check */
for(node= ntree->nodes.first; node; node= node->next) {
if(node->done==0) {
- node->level= node_recurs_check(node, &nsort);
+ node->level= node_get_deplist_recurs(node, &nsort);
}
}
-
- /* re-insert nodes in order, first a paranoia check */
- for(a=0; a<totnode; a++) {
- if(nodesort[a]==NULL)
- break;
- }
- if(a<totnode)
- printf("sort error in node tree");
- else {
- ntree->nodes.first= ntree->nodes.last= NULL;
- for(a=0; a<totnode; a++)
- BLI_addtail(&ntree->nodes, nodesort[a]);
- }
-
- MEM_freeN(nodesort);
-
- ntreeSetOutput(ntree);
}
-
-/* Should be callback! */
-/* Do not call execs here */
-void NodeTagChanged(bNodeTree *ntree, bNode *node)
-{
- if(ntree->type==NTREE_COMPOSIT) {
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(sock->ns.data) {
- //free_compbuf(sock->ns.data);
- //sock->ns.data= NULL;
- }
- }
- node->need_exec= 1;
- }
-}
-
-int NodeTagIDChanged(bNodeTree *ntree, ID *id)
-{
- int change = FALSE;
-
- if(ELEM(NULL, id, ntree))
- return change;
-
- if(ntree->type==NTREE_COMPOSIT) {
- bNode *node;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->id==id) {
- change= TRUE;
- NodeTagChanged(ntree, node);
- }
- }
- }
-
- return change;
-}
-
-
-
-/* ******************* executing ************* */
-
-/* for a given socket, find the actual stack entry */
-static bNodeStack *get_socket_stack(bNodeStack *stack, bNodeSocket *sock, bNodeStack **gin)
-{
- switch (sock->stack_type) {
- case SOCK_STACK_LOCAL:
- return stack + sock->stack_index;
- case SOCK_STACK_EXTERN:
- return (gin ? gin[sock->stack_index] : NULL);
- case SOCK_STACK_CONST:
- return sock->stack_ptr;
- }
- return NULL;
-}
-
-/* see notes at ntreeBeginExecTree */
-static void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out, bNodeStack **gin)
-{
- bNodeSocket *sock;
-
- /* build pointer stack */
- if (in) {
- for(sock= node->inputs.first; sock; sock= sock->next) {
- *(in++) = get_socket_stack(stack, sock, gin);
- }
- }
-
- if (out) {
- for(sock= node->outputs.first; sock; sock= sock->next) {
- *(out++) = get_socket_stack(stack, sock, gin);
- }
- }
-}
-
-static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNodeStack **in)
+static void ntree_update_link_pointers(bNodeTree *ntree)
{
bNode *node;
- bNodeTree *ntree= (bNodeTree *)gnode->id;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
-
- if(ntree==NULL) return;
+ bNodeSocket *sock;
+ bNodeLink *link;
- stack+= gnode->stack_index;
-
+ /* first clear data */
for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->execfunc) {
- node_get_stack(node, stack, nsin, nsout, in);
-
- /* for groups, only execute outputs for edited group */
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- 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);
- }
- }
-
- /* free internal buffers */
- if (ntree->type==NTREE_COMPOSIT) {
- bNodeSocket *sock;
- bNodeStack *ns;
-
- /* clear hasoutput on all local stack data,
- * only the group output will be used from now on
- */
- for (node=ntree->nodes.first; node; node=node->next) {
- for (sock=node->outputs.first; sock; sock=sock->next) {
- if (sock->stack_type==SOCK_STACK_LOCAL) {
- ns= get_socket_stack(stack, sock, in);
- ns->hasoutput = 0;
- }
- }
- }
- /* use the hasoutput flag to tag external sockets */
- for (sock=ntree->outputs.first; sock; sock=sock->next) {
- if (sock->stack_type==SOCK_STACK_LOCAL) {
- ns= get_socket_stack(stack, sock, in);
- ns->hasoutput = 1;
- }
- }
- /* now free all stacks that are not used from outside */
- for (node=ntree->nodes.first; node; node=node->next) {
- for (sock=node->outputs.first; sock; sock=sock->next) {
- if (sock->stack_type==SOCK_STACK_LOCAL ) {
- ns= get_socket_stack(stack, sock, in);
- if (ns->hasoutput==0 && ns->data) {
- free_compbuf(ns->data);
- ns->data = NULL;
- }
- }
- }
- }
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ sock->link= NULL;
}
-}
+ /* clear socket links */
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ sock->link= NULL;
-static int set_stack_indexes_default(bNode *node, int index)
-{
- bNodeSocket *sock;
-
- for (sock=node->inputs.first; sock; sock=sock->next) {
- if (sock->link && sock->link->fromsock) {
- sock->stack_type = sock->link->fromsock->stack_type;
- sock->stack_index = sock->link->fromsock->stack_index;
- sock->stack_ptr = sock->link->fromsock->stack_ptr;
- }
- else {
- sock->stack_type = SOCK_STACK_CONST;
- sock->stack_index = -1;
- sock->stack_ptr = &sock->ns;
- }
- }
-
- for (sock=node->outputs.first; sock; sock=sock->next) {
- sock->stack_type = SOCK_STACK_LOCAL;
- sock->stack_index = index++;
- sock->stack_ptr = NULL;
+ for(link= ntree->links.first; link; link= link->next) {
+ if (link->tosock)
+ link->tosock->link= link;
}
-
- return index;
}
-static int ntree_begin_exec_tree(bNodeTree *ntree);
-static int set_stack_indexes_group(bNode *node, int index)
+void ntree_validate_links(bNodeTree *ntree)
{
- bNodeTree *ngroup= (bNodeTree*)node->id;
- bNodeSocket *sock;
-
- if(ngroup && (ngroup->init & NTREE_TYPE_INIT)==0)
- ntreeInitTypes(ngroup);
-
- node->stack_index = index;
- if(ngroup)
- index += ntree_begin_exec_tree(ngroup);
+ bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
+ bNodeLink *link;
- for (sock=node->inputs.first; sock; sock=sock->next) {
- if (sock->link && sock->link->fromsock) {
- sock->stack_type = sock->link->fromsock->stack_type;
- sock->stack_index = sock->link->fromsock->stack_index;
- sock->stack_ptr = sock->link->fromsock->stack_ptr;
- }
- else {
- sock->stack_type = SOCK_STACK_CONST;
- sock->stack_index = -1;
- sock->stack_ptr = &sock->ns;
+ for (link = ntree->links.first; link; link = link->next) {
+ link->flag |= NODE_LINK_VALID;
+ if (link->fromnode && link->tonode && link->fromnode->level <= link->tonode->level)
+ link->flag &= ~NODE_LINK_VALID;
+ else if (ntreetype->validate_link) {
+ if (!ntreetype->validate_link(ntree, link))
+ link->flag &= ~NODE_LINK_VALID;
}
}
-
- /* identify group node outputs from internal group sockets */
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if (sock->groupsock) {
- bNodeSocket *insock, *gsock = sock->groupsock;
- switch (gsock->stack_type) {
- case SOCK_STACK_EXTERN:
- /* extern stack is resolved for this group node instance */
- insock= find_group_node_input(node, gsock->link->fromsock);
- sock->stack_type = insock->stack_type;
- sock->stack_index = insock->stack_index;
- sock->stack_ptr = insock->stack_ptr;
- break;
- case SOCK_STACK_LOCAL:
- sock->stack_type = SOCK_STACK_LOCAL;
- /* local stack index must be offset by group node instance */
- sock->stack_index = gsock->stack_index + node->stack_index;
- sock->stack_ptr = NULL;
- break;
- case SOCK_STACK_CONST:
- sock->stack_type = SOCK_STACK_CONST;
- sock->stack_index = -1;
- sock->stack_ptr = gsock->stack_ptr;
- break;
- }
- }
- else {
- sock->stack_type = SOCK_STACK_LOCAL;
- sock->stack_index = index++;
- sock->stack_ptr = NULL;
- }
- }
-
- return index;
}
-/* recursively called for groups */
-/* we set all trees on own local indices, but put a total counter
- in the groups, so each instance of a group has own stack */
-static int ntree_begin_exec_tree(bNodeTree *ntree)
+static void ntree_verify_nodes_cb(void *calldata, struct ID *UNUSED(owner_id), struct bNodeTree *ntree)
{
+ ID *id= (ID*)calldata;
bNode *node;
- bNodeSocket *gsock;
- int index= 0, i;
-
- if((ntree->init & NTREE_TYPE_INIT)==0)
- ntreeInitTypes(ntree);
-
- /* group inputs are numbered 0..totinputs, so external stack can easily be addressed */
- i = 0;
- for(gsock=ntree->inputs.first; gsock; gsock = gsock->next) {
- gsock->stack_type = SOCK_STACK_EXTERN;
- gsock->stack_index = i++;
- gsock->stack_ptr = NULL;
- }
- /* create indices for stack, check preview */
- for(node= ntree->nodes.first; node; node= node->next) {
- /* XXX can this be done by a generic one-for-all function?
- * otherwise should use node-type callback.
- */
- if(node->type==NODE_GROUP)
- index = set_stack_indexes_group(node, index);
- else
- index = set_stack_indexes_default(node, index);
- }
-
- /* group outputs */
- for(gsock=ntree->outputs.first; gsock; gsock = gsock->next) {
- if (gsock->link && gsock->link->fromsock) {
- gsock->stack_type = gsock->link->fromsock->stack_type;
- gsock->stack_index = gsock->link->fromsock->stack_index;
- gsock->stack_ptr = gsock->link->fromsock->stack_ptr;
- }
- else {
- gsock->stack_type = SOCK_STACK_CONST;
- gsock->stack_index = -1;
- gsock->stack_ptr = &gsock->ns;
- }
- }
-
- return index;
+ for (node=ntree->nodes.first; node; node=node->next)
+ if (node->typeinfo->verifyfunc)
+ node->typeinfo->verifyfunc(ntree, node, id);
}
-/* copy socket compbufs to stack, initialize usage of curve nodes */
-static void composit_begin_exec(bNodeTree *ntree, bNodeStack *stack)
+void ntreeVerifyNodes(struct Main *main, struct ID *id)
{
- bNode *node;
- bNodeSocket *sock;
+ bNodeTreeType *ntreetype;
+ bNodeTree *ntree;
+ int n;
- for(node= ntree->nodes.first; node; node= node->next) {
-
- /* initialize needed for groups */
- node->exec= 0;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns= get_socket_stack(stack, sock, NULL);
- if(ns && sock->ns.data) {
- ns->data= sock->ns.data;
- sock->ns.data= NULL;
- }
- }
-
- /* cannot initialize them while using in threads */
- if(ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) {
- curvemapping_initialize(node->storage);
- if(node->type==CMP_NODE_CURVE_RGB)
- curvemapping_premultiply(node->storage, 0);
- }
- if(node->type==NODE_GROUP && node->id)
- composit_begin_exec((bNodeTree *)node->id, stack + node->stack_index);
-
- }
-}
-
-/* copy stack compbufs to sockets */
-static void composit_end_exec(bNodeTree *ntree, bNodeStack *stack)
-{
- bNode *node;
- bNodeStack *ns;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- ns = get_socket_stack(stack, sock, NULL);
- if(ns && ns->data) {
- sock->ns.data= ns->data;
- ns->data= NULL;
- }
- }
-
- if(node->type==CMP_NODE_CURVE_RGB)
- curvemapping_premultiply(node->storage, 1);
-
- if(node->type==NODE_GROUP && node->id)
- composit_end_exec((bNodeTree *)node->id, stack + node->stack_index);
-
- node->need_exec= 0;
+ for (n=0; n < NUM_NTREE_TYPES; ++n) {
+ ntreetype= ntreeGetType(n);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, id, ntree_verify_nodes_cb);
}
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+ ntree_verify_nodes_cb(id, NULL, ntree);
}
-static void group_tag_used_outputs(bNode *gnode, bNodeStack *stack, bNodeStack **gin)
+void ntreeUpdateTree(bNodeTree *ntree)
{
- bNodeTree *ntree= (bNodeTree *)gnode->id;
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
bNode *node;
- bNodeSocket *sock;
-
- stack+= gnode->stack_index;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->execfunc) {
- for(sock= node->inputs.first; sock; sock= sock->next) {
- bNodeStack *ns = get_socket_stack(stack, sock, gin);
- ns->hasoutput= 1;
- }
- }
-
- /* non-composite trees do all nodes by default */
- if (ntree->type!=NTREE_COMPOSIT)
- node->need_exec = 1;
-
- for(sock= node->inputs.first; sock; sock= sock->next) {
- bNodeStack *ns = get_socket_stack(stack, sock, gin);
- if (ns) {
- ns->hasoutput = 1;
-
- /* sock type is needed to detect rgba or value or vector types */
- if(sock->link && sock->link->fromsock)
- ns->sockettype= sock->link->fromsock->type;
- else
- sock->ns.sockettype= sock->type;
- }
-
- if(sock->link) {
- bNodeLink *link= sock->link;
- /* this is the test for a cyclic case */
- if(link->fromnode && link->tonode) {
- if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF);
- else {
- node->need_exec= 0;
- }
- }
- }
- }
-
- /* set stack types (for local stack entries) */
- for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns = get_socket_stack(stack, sock, gin);
- if (ns)
- ns->sockettype = sock->type;
- }
- }
-}
-
-/* notes below are ancient! (ton) */
-/* stack indices make sure all nodes only write in allocated data, for making it thread safe */
-/* only root tree gets the stack, to enable instances to have own stack entries */
-/* per tree (and per group) unique indices are created */
-/* the index_ext we need to be able to map from groups to the group-node own stack */
-
-typedef struct bNodeThreadStack {
- struct bNodeThreadStack *next, *prev;
- bNodeStack *stack;
- int used;
-} bNodeThreadStack;
-
-static bNodeThreadStack *ntreeGetThreadStack(bNodeTree *ntree, int thread)
-{
- ListBase *lb= &ntree->threadstack[thread];
- bNodeThreadStack *nts;
+ bNode **deplist;
+ int totnodes, n;
- for(nts=lb->first; nts; nts=nts->next) {
- if(!nts->used) {
- nts->used= 1;
- return nts;
- }
- }
- nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack");
- nts->stack= MEM_dupallocN(ntree->stack);
- nts->used= 1;
- BLI_addtail(lb, nts);
-
- return nts;
-}
-
-static void ntreeReleaseThreadStack(bNodeThreadStack *nts)
-{
- nts->used= 0;
-}
-
-/* free texture delegates */
-static void tex_end_exec(bNodeTree *ntree)
-{
- bNodeThreadStack *nts;
- bNodeStack *ns;
- int th, a;
+ ntree_update_link_pointers(ntree);
- if(ntree->threadstack) {
- for(th=0; th<BLENDER_MAX_THREADS; th++) {
- for(nts=ntree->threadstack[th].first; nts; nts=nts->next) {
- for(ns= nts->stack, a=0; a<ntree->stacksize; a++, ns++) {
- if(ns->data) {
- MEM_freeN(ns->data);
- ns->data= NULL;
- }
- }
- }
- }
- }
-}
-
-void ntreeBeginExecTree(bNodeTree *ntree)
-{
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
-
- /* let's make it sure */
- if(ntree->init & NTREE_EXEC_INIT)
- return;
+ /* also updates the node level! */
+ ntreeGetDependencyList(ntree, &deplist, &totnodes);
- /* allocate the thread stack listbase array */
- if(ntree->type!=NTREE_COMPOSIT)
- ntree->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
-
- /* goes recursive over all groups */
- ntree->stacksize= ntree_begin_exec_tree(ntree);
-
- if(ntree->stacksize) {
- bNode *node;
- bNodeStack *ns;
- int a;
-
- /* allocate the base stack */
- ns=ntree->stack= MEM_callocN(ntree->stacksize*sizeof(bNodeStack), "node stack");
-
- /* tag inputs, the get_stack() gives own socket stackdata if not in use */
- for(a=0; a<ntree->stacksize; a++, ns++) ns->hasinput= 1;
-
- /* tag used outputs, so we know when we can skip operations */
- for(node= ntree->nodes.first; node; node= node->next) {
- bNodeSocket *sock;
-
- /* non-composite trees do all nodes by default */
- if(ntree->type!=NTREE_COMPOSIT)
- node->need_exec= 1;
-
- for(sock= node->inputs.first; sock; sock= sock->next) {
- ns = get_socket_stack(ntree->stack, sock, NULL);
- if (ns) {
- ns->hasoutput = 1;
-
- /* sock type is needed to detect rgba or value or vector types */
- if(sock->link && sock->link->fromsock)
- ns->sockettype= sock->link->fromsock->type;
- else
- sock->ns.sockettype= sock->type;
- }
-
- if(sock->link) {
- bNodeLink *link= sock->link;
- /* this is the test for a cyclic case */
- if(link->fromnode && link->tonode) {
- if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF);
- else {
- node->need_exec= 0;
- }
- }
- }
- }
-
- /* set stack types (for local stack entries) */
- for(sock= node->outputs.first; sock; sock= sock->next) {
- ns = get_socket_stack(ntree->stack, sock, NULL);
- if (ns)
- ns->sockettype = sock->type;
- }
-
- if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, ntree->stack, nsin, NULL, NULL);
- group_tag_used_outputs(node, ntree->stack, nsin);
- }
+ if (deplist) {
+ /* update individual nodes */
+ for (n=0; n < totnodes; ++n) {
+ node = deplist[n];
+ if (ntreetype->update_node)
+ ntreetype->update_node(ntree, node);
+ else if (node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
}
- if(ntree->type==NTREE_COMPOSIT)
- composit_begin_exec(ntree, ntree->stack);
+ MEM_freeN(deplist);
/* ensures only a single output node is enabled, texnode allows multiple though */
if(ntree->type!=NTREE_TEXTURE)
@@ -2425,982 +1509,218 @@ void ntreeBeginExecTree(bNodeTree *ntree)
}
- ntree->init |= NTREE_EXEC_INIT;
-}
-
-void ntreeEndExecTree(bNodeTree *ntree)
-{
- bNodeStack *ns;
-
- if(ntree->init & NTREE_EXEC_INIT) {
- bNodeThreadStack *nts;
- int a;
-
- /* another callback candidate! */
- if(ntree->type==NTREE_COMPOSIT) {
- composit_end_exec(ntree, ntree->stack);
-
- for(ns= ntree->stack, a=0; a<ntree->stacksize; a++, ns++) {
- if(ns->data) {
- printf("freed leftover buffer from stack\n");
- free_compbuf(ns->data);
- ns->data= NULL;
- }
- }
- }
- else if(ntree->type==NTREE_TEXTURE)
- tex_end_exec(ntree);
-
- if(ntree->stack) {
- MEM_freeN(ntree->stack);
- ntree->stack= NULL;
- }
-
- if(ntree->threadstack) {
- for(a=0; a<BLENDER_MAX_THREADS; a++) {
- for(nts=ntree->threadstack[a].first; nts; nts=nts->next)
- if (nts->stack) MEM_freeN(nts->stack);
- BLI_freelistN(&ntree->threadstack[a]);
- }
-
- MEM_freeN(ntree->threadstack);
- ntree->threadstack= NULL;
- }
-
- ntree->init &= ~NTREE_EXEC_INIT;
+ /* general tree updates */
+ if (ntree->update & (NTREE_UPDATE_LINKS|NTREE_UPDATE_NODES)) {
+ ntree_validate_links(ntree);
}
-}
-
-/* nodes are presorted, so exec is in order of list */
-void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread)
-{
- bNode *node;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *stack;
- bNodeThreadStack *nts = NULL;
-
- /* only when initialized */
- if((ntree->init & NTREE_EXEC_INIT)==0)
- ntreeBeginExecTree(ntree);
- /* composite does 1 node per thread, so no multiple stacks needed */
- if(ntree->type==NTREE_COMPOSIT) {
- stack= ntree->stack;
- }
+ /* update tree */
+ if (ntreetype->update)
+ ntreetype->update(ntree);
else {
- nts= ntreeGetThreadStack(ntree, thread);
- stack= nts->stack;
- }
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->need_exec) {
- if(node->typeinfo->execfunc) {
- node_get_stack(node, stack, nsin, nsout, NULL);
- node->typeinfo->execfunc(callerdata, node, nsin, nsout);
- }
- else if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, stack, nsin, NULL, NULL);
- node_group_execute(stack, callerdata, node, nsin);
- }
- }
- }
-
- if(nts)
- ntreeReleaseThreadStack(nts);
-}
-
-
-/* ***************************** threaded version for execute composite nodes ************* */
-/* these are nodes without input, only giving values */
-/* or nodes with only value inputs */
-static int node_only_value(bNode *node)
-{
- bNodeSocket *sock;
-
- if(ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_VALUE, CMP_NODE_RGB))
- return 1;
-
- /* doing this for all node types goes wrong. memory free errors */
- if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) {
- int retval= 1;
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link && sock->link->fromnode)
- retval &= node_only_value(sock->link->fromnode);
- }
- return retval;
+ bNodeType *ntype= node_get_type(ntree, ntree->nodetype);
+ if (ntype && ntype->updatetreefunc)
+ ntype->updatetreefunc(ntree);
}
- return 0;
-}
-
-
-/* not changing info, for thread callback */
-typedef struct ThreadData {
- bNodeStack *stack;
- RenderData *rd;
-} ThreadData;
-
-static void *exec_composite_node(void *node_v)
-{
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- bNode *node= node_v;
- ThreadData *thd= (ThreadData *)node->threaddata;
- node_get_stack(node, thd->stack, nsin, nsout, NULL);
-
- if((node->flag & NODE_MUTED) && (!node_only_value(node))) {
- /* viewers we execute, for feedback to user */
- if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
- node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
- else
- node_compo_pass_on(node, nsin, nsout);
- }
- else if(node->typeinfo->execfunc) {
- node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
- }
- else if(node->type==NODE_GROUP && node->id) {
- node_group_execute(thd->stack, thd->rd, node, nsin);
- }
+ /* XXX hack, should be done by depsgraph!! */
+ ntreeVerifyNodes(G.main, &ntree->id);
- node->exec |= NODE_READY;
- return NULL;
+ /* clear the update flag */
+ ntree->update = 0;
}
-/* return total of executable nodes, for timecursor */
-/* only compositor uses it */
-static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd)
+void NodeTagChanged(bNodeTree *ntree, bNode *node)
{
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- bNode *node;
- bNodeSocket *sock;
- int totnode= 0, group_edit= 0;
-
- /* note; do not add a dependency sort here, the stack was created already */
-
- /* if we are in group edit, viewer nodes get skipped when group has viewer */
- for(node= ntree->nodes.first; node; node= node->next)
- if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
- if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER))
- group_edit= 1;
+ bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
- for(node= ntree->nodes.first; node; node= node->next) {
- int a;
-
- node_get_stack(node, thd->stack, nsin, nsout, NULL);
-
- /* test the outputs */
- /* skip value-only nodes (should be in type!) */
- if(!node_only_value(node)) {
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(nsout[a]->data==NULL && nsout[a]->hasoutput) {
- node->need_exec= 1;
- break;
- }
- }
- }
-
- /* test the inputs */
- for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
- /* skip viewer nodes in bg render or group edit */
- if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && (G.background || group_edit))
- node->need_exec= 0;
- /* is sock in use? */
- else if(sock->link) {
- bNodeLink *link= sock->link;
-
- /* this is the test for a cyclic case */
- if(link->fromnode==NULL || link->tonode==NULL);
- else if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
- if(link->fromnode->need_exec) {
- node->need_exec= 1;
- break;
- }
- }
- else {
- node->need_exec= 0;
- printf("Node %s skipped, cyclic dependency\n", node->name);
- }
- }
- }
-
- if(node->need_exec) {
-
- /* free output buffers */
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(nsout[a]->data) {
- free_compbuf(nsout[a]->data);
- nsout[a]->data= NULL;
- }
- }
- totnode++;
- /* printf("node needs exec %s\n", node->name); */
-
- /* tag for getExecutableNode() */
- node->exec= 0;
- }
- else {
- /* tag for getExecutableNode() */
- node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED;
-
- }
- }
-
- /* last step: set the stack values for only-value nodes */
- /* just does all now, compared to a full buffer exec this is nothing */
- if(totnode) {
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->need_exec==0 && node_only_value(node)) {
- if(node->typeinfo->execfunc) {
- node_get_stack(node, thd->stack, nsin, nsout, NULL);
- node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
- }
- }
- }
- }
-
- return totnode;
+ /* extra null pointer checks here because this is called when unlinking
+ unknown nodes on file load, so typeinfo pointers may not be set */
+ if (ntreetype && ntreetype->update_node)
+ ntreetype->update_node(ntree, node);
+ else if (node->typeinfo && node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
}
-/* while executing tree, free buffers from nodes that are not needed anymore */
-static void freeExecutableNode(bNodeTree *ntree)
+int NodeTagIDChanged(bNodeTree *ntree, ID *id)
{
- /* node outputs can be freed when:
- - not a render result or image node
- - when node outputs go to nodes all being set NODE_FINISHED
- */
+ bNodeTreeType *ntreetype;
bNode *node;
- bNodeSocket *sock;
-
- /* set exec flag for finished nodes that might need freed */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type!=CMP_NODE_R_LAYERS)
- if(node->exec & NODE_FINISHED)
- node->exec |= NODE_FREEBUFS;
- }
- /* clear this flag for input links that are not done yet */
- for(node= ntree->nodes.first; node; node= node->next) {
- if((node->exec & NODE_FINISHED)==0) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link && sock->link->fromnode)
- sock->link->fromnode->exec &= ~NODE_FREEBUFS;
- }
- }
- /* now we can free buffers */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->exec & NODE_FREEBUFS) {
- for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns= get_socket_stack(ntree->stack, sock, NULL);
- if(ns && ns->data) {
- free_compbuf(ns->data);
- ns->data= NULL;
- // printf("freed buf node %s \n", node->name);
- }
- }
- }
- }
-}
+ int change = FALSE;
-static bNode *getExecutableNode(bNodeTree *ntree)
-{
- bNode *node;
- bNodeSocket *sock;
+ if(ELEM(NULL, id, ntree))
+ return change;
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->exec==0) {
-
- /* input sockets should be ready */
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link && sock->link->fromnode)
- if((sock->link->fromnode->exec & NODE_READY)==0)
- break;
- }
- if(sock==NULL)
- return node;
- }
- }
- return NULL;
-}
-
-/* check if texture nodes need exec or end */
-static void ntree_composite_texnode(bNodeTree *ntree, int init)
-{
- bNode *node;
+ ntreetype = ntreeGetType(ntree->type);
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==CMP_NODE_TEXTURE && node->id) {
- Tex *tex= (Tex *)node->id;
- if(tex->nodetree && tex->use_nodes) {
- /* has internal flag to detect it only does it once */
- if(init)
- ntreeBeginExecTree(tex->nodetree);
- else
- ntreeEndExecTree(tex->nodetree);
+ if (ntreetype->update_node) {
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id==id) {
+ change = TRUE;
+ ntreetype->update_node(ntree, node);
}
}
}
-
-}
-
-/* optimized tree execute test for compositing */
-void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
-{
- bNode *node;
- ListBase threads;
- ThreadData thdata;
- int totnode, curnode, rendering= 1;
-
- if(ntree==NULL) return;
-
- if(do_preview)
- ntreeInitPreview(ntree, 0, 0);
-
- ntreeBeginExecTree(ntree);
- ntree_composite_texnode(ntree, 1);
-
- /* prevent unlucky accidents */
- if(G.background)
- rd->scemode &= ~R_COMP_CROP;
-
- /* setup callerdata for thread callback */
- thdata.rd= rd;
- thdata.stack= ntree->stack;
-
- /* fixed seed, for example noise texture */
- BLI_srandom(rd->cfra);
-
- /* sets need_exec tags in nodes */
- curnode = totnode= setExecutableNodes(ntree, &thdata);
-
- BLI_init_threads(&threads, exec_composite_node, rd->threads);
-
- while(rendering) {
-
- if(BLI_available_threads(&threads)) {
- node= getExecutableNode(ntree);
- if(node) {
- if(ntree->progress && totnode)
- ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode));
- if(ntree->stats_draw) {
- char str[64];
- sprintf(str, "Compositing %d %s", curnode, node->name);
- ntree->stats_draw(ntree->sdh, str);
- }
- curnode--;
-
- node->threaddata = &thdata;
- node->exec= NODE_PROCESSING;
- BLI_insert_thread(&threads, node);
- }
- else
- PIL_sleep_ms(50);
- }
- else
- PIL_sleep_ms(50);
-
- rendering= 0;
- /* test for ESC */
- if(ntree->test_break && ntree->test_break(ntree->tbh)) {
- for(node= ntree->nodes.first; node; node= node->next)
- node->exec |= NODE_READY;
- }
-
- /* check for ready ones, and if we need to continue */
+ else {
for(node= ntree->nodes.first; node; node= node->next) {
- if(node->exec & NODE_READY) {
- if((node->exec & NODE_FINISHED)==0) {
- BLI_remove_thread(&threads, node); /* this waits for running thread to finish btw */
- node->exec |= NODE_FINISHED;
-
- /* freeing unused buffers */
- if(rd->scemode & R_COMP_FREE)
- freeExecutableNode(ntree);
- }
+ if(node->id==id) {
+ change = TRUE;
+ if (node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
}
- else rendering= 1;
}
}
- BLI_end_threads(&threads);
-
- ntreeEndExecTree(ntree);
+ return change;
}
-/* ********** copy composite tree entirely, to allow threaded exec ******************* */
-/* ***************** do NOT execute this in a thread! ****************** */
-
-/* returns localized tree for execution in threads */
-/* local tree then owns all compbufs (for composite) */
-bNodeTree *ntreeLocalize(bNodeTree *ntree)
-{
- bNodeTree *ltree;
- bNode *node;
- bNodeSocket *sock;
-
- bAction *action_backup= NULL, *tmpact_backup= NULL;
-
- /* Workaround for copying an action on each render!
- * set action to NULL so animdata actions dont get copied */
- AnimData *adt= BKE_animdata_from_id(&ntree->id);
-
- if(adt) {
- action_backup= adt->action;
- tmpact_backup= adt->tmpact;
-
- adt->action= NULL;
- adt->tmpact= NULL;
- }
-
- /* node copy func */
- ltree= ntreeCopyTree(ntree);
-
- if(adt) {
- AnimData *ladt= BKE_animdata_from_id(&ltree->id);
-
- adt->action= ladt->action= action_backup;
- adt->tmpact= ladt->tmpact= tmpact_backup;
-
- if(action_backup) action_backup->id.us++;
- if(tmpact_backup) tmpact_backup->id.us++;
-
- }
- /* end animdata uglyness */
-
- /* ensures only a single output node is enabled */
- ntreeSetOutput(ltree);
-
- for(node= ntree->nodes.first; node; node= node->next) {
-
- /* store new_node pointer to original */
- node->new_node->new_node= node;
-
- if(ntree->type==NTREE_COMPOSIT) {
- /* ensure new user input gets handled ok, only composites (texture nodes will break, for painting since it uses no tags) */
- node->need_exec= 0;
-
- /* move over the compbufs */
- /* right after ntreeCopyTree() oldsock pointers are valid */
-
- if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
- if(node->id) {
- if(node->flag & NODE_DO_OUTPUT)
- node->new_node->id= (ID *)copy_image((Image *)node->id);
- else
- node->new_node->id= NULL;
- }
- }
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
-
- sock->new_sock->ns.data= sock->ns.data;
- compbuf_set_node(sock->new_sock->ns.data, node->new_node);
-
- sock->ns.data= NULL;
- sock->new_sock->new_sock= sock;
- }
- }
- }
-
- return ltree;
-}
-
-static int node_exists(bNodeTree *ntree, bNode *testnode)
-{
- bNode *node= ntree->nodes.first;
- for(; node; node= node->next)
- if(node==testnode)
- return 1;
- return 0;
-}
+/* ************* node type access ********** */
-static int outsocket_exists(bNode *node, bNodeSocket *testsock)
+int nodeValid(bNodeTree *ntree, bNodeTemplate *ntemp)
{
- bNodeSocket *sock= node->outputs.first;
- for(; sock; sock= sock->next)
- if(sock==testsock)
+ bNodeType *ntype= node_get_type(ntree, ntemp->type);
+ if (ntype) {
+ if (ntype->validfunc)
+ return ntype->validfunc(ntree, ntemp);
+ else
return 1;
- return 0;
-}
-
-
-/* sync local composite with real tree */
-/* local composite is supposed to be running, be careful moving previews! */
-/* is called by jobs manager, outside threads, so it doesnt happen during draw */
-void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
-{
- bNode *lnode;
-
- if(ntree->type==NTREE_COMPOSIT) {
- /* move over the compbufs and previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
- if(node_exists(ntree, lnode->new_node)) {
-
- if(lnode->preview && lnode->preview->rect) {
- node_free_preview(lnode->new_node);
- lnode->new_node->preview= lnode->preview;
- lnode->preview= NULL;
- }
- }
- }
- }
- }
- else if(ELEM(ntree->type, NTREE_SHADER, NTREE_TEXTURE)) {
- /* copy over contents of previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if(node_exists(ntree, lnode->new_node)) {
- bNode *node= lnode->new_node;
-
- if(node->preview && node->preview->rect) {
- if(lnode->preview && lnode->preview->rect) {
- int xsize= node->preview->xsize;
- int ysize= node->preview->ysize;
- memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
- }
- }
- }
- }
}
+ else
+ return 0;
}
-/* merge local tree results back, and free local tree */
-/* we have to assume the editor already changed completely */
-void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
+const char* nodeLabel(bNode *node)
{
- bNode *lnode;
- bNodeSocket *lsock;
-
- /* move over the compbufs and previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if(node_exists(ntree, lnode->new_node)) {
-
- if(lnode->preview && lnode->preview->rect) {
- node_free_preview(lnode->new_node);
- lnode->new_node->preview= lnode->preview;
- lnode->preview= NULL;
- }
-
- if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
- if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) {
- /* image_merge does sanity check for pointers */
- BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id);
- }
- }
-
- 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;
- }
- }
- }
- }
- ntreeFreeTree(localtree);
- MEM_freeN(localtree);
+ if (node->label[0]!='\0')
+ return node->label;
+ else if (node->typeinfo->labelfunc)
+ return node->typeinfo->labelfunc(node);
+ else
+ return node->typeinfo->name;
}
-/* *********************************************** */
-
-/* GPU material from shader nodes */
-
-static void gpu_from_node_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs)
+struct bNodeTree *nodeGroupEditGet(struct bNode *node)
{
- bNodeSocket *sock;
- int i;
-
- for (sock=sockets->first, i=0; sock; sock=sock->next, i++) {
- memset(&gs[i], 0, sizeof(gs[i]));
-
- QUATCOPY(gs[i].vec, ns[i]->vec);
- gs[i].link= ns[i]->data;
-
- if (sock->type == SOCK_VALUE)
- gs[i].type= GPU_FLOAT;
- else if (sock->type == SOCK_VECTOR)
- gs[i].type= GPU_VEC3;
- else if (sock->type == SOCK_RGBA)
- gs[i].type= GPU_VEC4;
- else
- gs[i].type= GPU_NONE;
-
- gs[i].name = "";
- gs[i].hasinput= ns[i]->hasinput && ns[i]->data;
- gs[i].hasoutput= ns[i]->hasoutput && ns[i]->data;
- gs[i].sockettype= ns[i]->sockettype;
- }
-
- gs[i].type= GPU_NONE;
+ if (node->typeinfo->group_edit_get)
+ return node->typeinfo->group_edit_get(node);
+ else
+ return NULL;
}
-static void data_from_gpu_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs)
+struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit)
{
- bNodeSocket *sock;
- int i;
-
- for (sock=sockets->first, i=0; sock; sock=sock->next, i++) {
- ns[i]->data= gs[i].link;
- ns[i]->sockettype= gs[i].sockettype;
- }
+ if (node->typeinfo->group_edit_set)
+ return node->typeinfo->group_edit_set(node, edit);
+ else if (node->typeinfo->group_edit_get)
+ return node->typeinfo->group_edit_get(node);
+ else
+ return NULL;
}
-static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *gnode, bNodeStack **in)
+void nodeGroupEditClear(struct bNode *node)
{
- bNode *node;
- bNodeTree *ntree= (bNodeTree *)gnode->id;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
- int doit = 0;
-
- if(ntree==NULL) return;
-
- stack+= gnode->stack_index;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->gpufunc) {
- node_get_stack(node, stack, nsin, nsout, in);
-
- doit = 0;
-
- /* 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)
- doit = 1;
- }
- else
- doit = 1;
-
- if(doit) {
- gpu_from_node_stack(&node->inputs, nsin, gpuin);
- gpu_from_node_stack(&node->outputs, nsout, gpuout);
- if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
- data_from_gpu_stack(&node->outputs, nsout, gpuout);
- }
- }
- }
+ if (node->typeinfo->group_edit_clear)
+ node->typeinfo->group_edit_clear(node);
}
-void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
+struct bNodeTemplate nodeMakeTemplate(struct bNode *node)
{
- bNode *node;
- bNodeStack *stack;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
-
- if((ntree->init & NTREE_EXEC_INIT)==0)
- ntreeBeginExecTree(ntree);
-
- stack= ntree->stack;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->gpufunc) {
- node_get_stack(node, stack, nsin, nsout, NULL);
- gpu_from_node_stack(&node->inputs, nsin, gpuin);
- gpu_from_node_stack(&node->outputs, nsout, gpuout);
- if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
- data_from_gpu_stack(&node->outputs, nsout, gpuout);
- }
- else if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, stack, nsin, nsout, NULL);
- gpu_node_group_execute(stack, mat, node, nsin);
- }
+ bNodeTemplate ntemp;
+ if (node->typeinfo->templatefunc)
+ return node->typeinfo->templatefunc(node);
+ else {
+ ntemp.type = node->type;
+ return ntemp;
}
-
- ntreeEndExecTree(ntree);
}
-/* **************** call to switch lamploop for material node ************ */
-
-void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
-
-void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult *))
-{
- node_shader_lamp_loop= lamp_loop_func;
-}
-
-/* clumsy checking... should do dynamic outputs once */
-static void force_hidden_passes(bNode *node, int passflag)
-{
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_UNAVAIL;
-
- sock= BLI_findlink(&node->outputs, RRES_OUT_Z);
- if(!(passflag & SCE_PASS_Z)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_NORMAL);
- if(!(passflag & SCE_PASS_NORMAL)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_VEC);
- if(!(passflag & SCE_PASS_VECTOR)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_UV);
- if(!(passflag & SCE_PASS_UV)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_RGBA);
- if(!(passflag & SCE_PASS_RGBA)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_DIFF);
- if(!(passflag & SCE_PASS_DIFFUSE)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_SPEC);
- if(!(passflag & SCE_PASS_SPEC)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_SHADOW);
- if(!(passflag & SCE_PASS_SHADOW)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_AO);
- if(!(passflag & SCE_PASS_AO)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_REFLECT);
- if(!(passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT);
- if(!(passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_INDIRECT);
- if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB);
- if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA);
- if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_MIST);
- if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT);
- if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_ENV);
- if(!(passflag & SCE_PASS_ENVIRONMENT)) sock->flag |= SOCK_UNAVAIL;
-
-}
-
-/* based on rules, force sockets hidden always */
-void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene)
+void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag)
{
- bNode *node;
+ memset(ntype, 0, sizeof(bNodeType));
- if(ntree==NULL) return;
+ ntype->type = type;
+ BLI_strncpy(ntype->name, name, sizeof(ntype->name));
+ ntype->nclass = nclass;
+ ntype->flag = flag;
- for(node= ntree->nodes.first; node; node= node->next) {
- if( node->type==CMP_NODE_R_LAYERS) {
- Scene *sce= node->id?(Scene *)node->id:curscene;
- SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
- if(srl)
- force_hidden_passes(node, srl->passflag);
- }
- else if( node->type==CMP_NODE_IMAGE) {
- Image *ima= (Image *)node->id;
- if(ima) {
- if(ima->rr) {
- ImageUser *iuser= node->storage;
- RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
- if(rl)
- force_hidden_passes(node, rl->passflag);
- else
- force_hidden_passes(node, 0);
- }
- else if(ima->type!=IMA_TYPE_MULTILAYER) { /* if ->rr not yet read we keep inputs */
- force_hidden_passes(node, RRES_OUT_Z);
- }
- else
- force_hidden_passes(node, 0);
- }
- else
- force_hidden_passes(node, 0);
- }
- }
-
+ /* default size values */
+ ntype->width = 140;
+ ntype->minwidth = 100;
+ ntype->maxwidth = 320;
+ ntype->height = 100;
+ ntype->minheight = 30;
+ ntype->maxheight = FLT_MAX;
}
-/* called from render pipeline, to tag render input and output */
-/* need to do all scenes, to prevent errors when you re-render 1 scene */
-void ntreeCompositTagRender(Scene *curscene)
+void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs)
{
- Scene *sce;
-
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
-
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE)
- NodeTagChanged(sce->nodetree, node);
- else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */
- NodeTagChanged(sce->nodetree, node);
- }
- }
- }
+ ntype->inputs = inputs;
+ ntype->outputs = outputs;
}
-static int node_animation_properties(bNodeTree *ntree, bNode *node)
+void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp))
{
- bNodeSocket *sock;
- const ListBase *lb;
- Link *link;
- PointerRNA ptr;
- PropertyRNA *prop;
-
- /* check to see if any of the node's properties have fcurves */
- RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
- lb = RNA_struct_type_properties(ptr.type);
-
- for (link=lb->first; link; link=link->next) {
- int driven, len=1, index;
- prop = (PropertyRNA *)link;
-
- if (RNA_property_array_check(prop))
- len = RNA_property_array_length(&ptr, prop);
-
- for (index=0; index<len; index++) {
- if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
- NodeTagChanged(ntree, node);
- return 1;
- }
- }
- }
-
- /* now check node sockets */
- for (sock = node->inputs.first; sock; sock=sock->next) {
- int driven, len=1, index;
-
- RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
- prop = RNA_struct_find_property(&ptr, "default_value");
-
- if (RNA_property_array_check(prop))
- len = RNA_property_array_length(&ptr, prop);
-
- for (index=0; index<len; index++) {
- if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
- NodeTagChanged(ntree, node);
- return 1;
- }
- }
- }
-
- return 0;
+ ntype->initfunc = initfunc;
}
-/* tags nodes that have animation capabilities */
-int ntreeCompositTagAnimated(bNodeTree *ntree)
+void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp))
{
- bNode *node;
- int tagged= 0;
-
- if(ntree==NULL) return 0;
-
- for(node= ntree->nodes.first; node; node= node->next) {
-
- tagged = node_animation_properties(ntree, node);
-
- /* otherwise always tag these node types */
- if(node->type==CMP_NODE_IMAGE) {
- Image *ima= (Image *)node->id;
- if(ima && ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
- NodeTagChanged(ntree, node);
- tagged= 1;
- }
- }
- else if(node->type==CMP_NODE_TIME) {
- NodeTagChanged(ntree, node);
- tagged= 1;
- }
- /* here was tag render layer, but this is called after a render, so re-composites fail */
- else if(node->type==NODE_GROUP) {
- if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) {
- NodeTagChanged(ntree, node);
- }
- }
- }
-
- return tagged;
+ ntype->validfunc = validfunc;
}
-
-/* called from image window preview */
-void ntreeCompositTagGenerators(bNodeTree *ntree)
+void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth)
{
- bNode *node;
-
- if(ntree==NULL) return;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if( ELEM(node->type, CMP_NODE_R_LAYERS, CMP_NODE_IMAGE))
- NodeTagChanged(ntree, node);
- }
+ ntype->width = width;
+ ntype->minwidth = minwidth;
+ if (maxwidth <= minwidth)
+ ntype->maxwidth = FLT_MAX;
+ else
+ ntype->maxwidth = maxwidth;
}
-/* XXX after render animation system gets a refresh, this call allows composite to end clean */
-void ntreeClearTags(bNodeTree *ntree)
+void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
{
- bNode *node;
-
- if(ntree==NULL) return;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- node->need_exec= 0;
- if(node->type==NODE_GROUP)
- ntreeClearTags((bNodeTree *)node->id);
- }
+ if (storagename)
+ strncpy(ntype->storagename, storagename, sizeof(ntype->storagename));
+ else
+ ntype->storagename[0] = '\0';
+ ntype->copystoragefunc = copystoragefunc;
+ ntype->freestoragefunc = freestoragefunc;
}
-
-int ntreeTexTagAnimated(bNodeTree *ntree)
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *))
{
- bNode *node;
-
- if(ntree==NULL) return 0;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==TEX_NODE_CURVE_TIME) {
- NodeTagChanged(ntree, node);
- return 1;
- }
- else if(node->type==NODE_GROUP) {
- if( ntreeTexTagAnimated((bNodeTree *)node->id) ) {
- return 1;
- }
- }
- }
-
- return 0;
+ ntype->labelfunc = labelfunc;
}
-/* ************* node definition init ********** */
-
-void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag,
- struct bNodeSocketType *inputs, struct bNodeSocketType *outputs)
+void node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *))
{
- memset(ntype, 0, sizeof(bNodeType));
-
- ntype->type = type;
- ntype->name = name;
- ntype->nclass = nclass;
- ntype->flag = flag;
-
- ntype->inputs = inputs;
- ntype->outputs = outputs;
-
- /* default size values */
- ntype->width = 140;
- ntype->minwidth = 100;
- ntype->maxwidth = 320;
+ ntype->templatefunc = templatefunc;
}
-void node_type_init(bNodeType *ntype, void (*initfunc)(struct bNode *))
+void node_type_update(struct bNodeType *ntype,
+ void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
+ void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id))
{
- ntype->initfunc = initfunc;
+ ntype->updatefunc = updatefunc;
+ ntype->verifyfunc = verifyfunc;
}
-void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth)
+void node_type_tree(struct bNodeType *ntype, void (*inittreefunc)(struct bNodeTree *), void (*updatetreefunc)(struct bNodeTree *))
{
- ntype->width = width;
- ntype->minwidth = minwidth;
- ntype->maxwidth = maxwidth;
+ ntype->inittreefunc = inittreefunc;
+ ntype->updatetreefunc = updatetreefunc;
}
-void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
+void node_type_group_edit(struct bNodeType *ntype,
+ struct bNodeTree *(*group_edit_get)(struct bNode *node),
+ struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
+ void (*group_edit_clear)(struct bNode *node))
{
- if (storagename)
- strncpy(ntype->storagename, storagename, sizeof(ntype->storagename));
- else
- ntype->storagename[0] = '\0';
- ntype->copystoragefunc = copystoragefunc;
- ntype->freestoragefunc = freestoragefunc;
+ ntype->group_edit_get = group_edit_get;
+ ntype->group_edit_set = group_edit_set;
+ ntype->group_edit_clear = group_edit_clear;
}
void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **))
@@ -3408,42 +1728,53 @@ void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct
ntype->execfunc = execfunc;
}
+void node_type_exec_new(struct bNodeType *ntype,
+ void *(*initexecfunc)(struct bNode *node),
+ void (*freeexecfunc)(struct bNode *node, void *nodedata),
+ void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **))
+{
+ ntype->initexecfunc = initexecfunc;
+ ntype->freeexecfunc = freeexecfunc;
+ ntype->newexecfunc = newexecfunc;
+}
+
void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))
{
ntype->gpufunc = gpufunc;
}
-void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *))
+void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out))
{
- ntype->labelfunc = labelfunc;
+ ntype->gpuextfunc = gpuextfunc;
}
-static bNodeType *is_nodetype_registered(ListBase *typelist, int type, ID *id)
+
+static bNodeType *is_nodetype_registered(ListBase *typelist, int type)
{
bNodeType *ntype= typelist->first;
for(;ntype; ntype= ntype->next )
- if(ntype->type==type && ntype->id==id)
+ if(ntype->type==type)
return ntype;
return NULL;
}
-/* type can be from a static array, we make copy for duplicate types (like group) */
-void nodeRegisterType(ListBase *typelist, const bNodeType *ntype)
+void nodeRegisterType(ListBase *typelist, bNodeType *ntype)
{
- bNodeType *found= is_nodetype_registered(typelist, ntype->type, ntype->id);
+ bNodeType *found= is_nodetype_registered(typelist, ntype->type);
- if(found==NULL) {
- bNodeType *ntypen= MEM_callocN(sizeof(bNodeType), "node type");
- *ntypen= *ntype;
- BLI_addtail(typelist, ntypen);
- }
+ if(found==NULL)
+ BLI_addtail(typelist, ntype);
}
static void registerCompositNodes(ListBase *ntypelist)
{
- register_node_type_group(ntypelist);
+ register_node_type_frame(ntypelist);
+
+ register_node_type_cmp_group(ntypelist);
+// register_node_type_cmp_forloop(ntypelist);
+// register_node_type_cmp_whileloop(ntypelist);
register_node_type_cmp_rlayers(ntypelist);
register_node_type_cmp_image(ntypelist);
@@ -3519,7 +1850,11 @@ static void registerCompositNodes(ListBase *ntypelist)
static void registerShaderNodes(ListBase *ntypelist)
{
- register_node_type_group(ntypelist);
+ register_node_type_frame(ntypelist);
+
+ register_node_type_sh_group(ntypelist);
+// register_node_type_sh_forloop(ntypelist);
+// register_node_type_sh_whileloop(ntypelist);
register_node_type_sh_output(ntypelist);
register_node_type_sh_mix_rgb(ntypelist);
@@ -3548,7 +1883,11 @@ static void registerShaderNodes(ListBase *ntypelist)
static void registerTextureNodes(ListBase *ntypelist)
{
- register_node_type_group(ntypelist);
+ register_node_type_frame(ntypelist);
+
+ register_node_type_tex_group(ntypelist);
+// register_node_type_tex_forloop(ntypelist);
+// register_node_type_tex_whileloop(ntypelist);
register_node_type_tex_math(ntypelist);
register_node_type_tex_mix_rgb(ntypelist);
@@ -3589,53 +1928,47 @@ static void registerTextureNodes(ListBase *ntypelist)
register_node_type_tex_proc_distnoise(ntypelist);
}
-static void remove_dynamic_typeinfos(ListBase *list)
+static void free_dynamic_typeinfo(bNodeType *ntype)
{
- bNodeType *ntype= list->first;
- bNodeType *next= NULL;
- while(ntype) {
- next= ntype->next;
- if(ntype->type==NODE_DYNAMIC && ntype->id!=NULL) {
- BLI_remlink(list, ntype);
- if(ntype->inputs) {
- bNodeSocketType *sock= ntype->inputs;
- while(sock->type!=-1) {
- MEM_freeN((void *)sock->name);
- sock++;
- }
- MEM_freeN(ntype->inputs);
- }
- if(ntype->outputs) {
- bNodeSocketType *sock= ntype->outputs;
- while(sock->type!=-1) {
- MEM_freeN((void *)sock->name);
- sock++;
- }
- MEM_freeN(ntype->outputs);
- }
- if(ntype->name) {
- MEM_freeN((void *)ntype->name);
- }
- MEM_freeN(ntype);
+ if(ntype->type==NODE_DYNAMIC) {
+ if(ntype->inputs) {
+ MEM_freeN(ntype->inputs);
}
- ntype= next;
+ if(ntype->outputs) {
+ MEM_freeN(ntype->outputs);
+ }
+ if(ntype->name) {
+ MEM_freeN((void *)ntype->name);
+ }
+ }
+}
+
+static void free_typeinfos(ListBase *list)
+{
+ bNodeType *ntype, *next;
+ for(ntype=list->first; ntype; ntype=next) {
+ next = ntype->next;
+
+ if(ntype->type==NODE_DYNAMIC)
+ free_dynamic_typeinfo(ntype);
+
+ if(ntype->needs_free)
+ MEM_freeN(ntype);
}
}
void init_nodesystem(void)
{
- registerCompositNodes(&node_all_composit);
- registerShaderNodes(&node_all_shaders);
- registerTextureNodes(&node_all_textures);
+ registerCompositNodes(&ntreeGetType(NTREE_COMPOSIT)->node_types);
+ registerShaderNodes(&ntreeGetType(NTREE_SHADER)->node_types);
+ registerTextureNodes(&ntreeGetType(NTREE_TEXTURE)->node_types);
}
void free_nodesystem(void)
{
- /*remove_dynamic_typeinfos(&node_all_composit);*/ /* unused for now */
- BLI_freelistN(&node_all_composit);
- remove_dynamic_typeinfos(&node_all_shaders);
- BLI_freelistN(&node_all_shaders);
- BLI_freelistN(&node_all_textures);
+ free_typeinfos(&ntreeGetType(NTREE_COMPOSIT)->node_types);
+ free_typeinfos(&ntreeGetType(NTREE_SHADER)->node_types);
+ free_typeinfos(&ntreeGetType(NTREE_TEXTURE)->node_types);
}
/* called from unlink_scene, when deleting a scene goes over all scenes
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 1ab1af6d733..2a6de0e25b8 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1092,6 +1092,7 @@ Object *add_only_object(int type, const char *name)
ob->state=1;
/* ob->pad3 == Contact Processing Threshold */
ob->m_contactProcessingThreshold = 1.;
+ ob->obstacleRad = 1.;
/* NT fluid sim defaults */
ob->fluidsimFlag = 0;
diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c
index 0d523599598..d529a6d94c9 100644
--- a/source/blender/blenkernel/intern/sca.c
+++ b/source/blender/blenkernel/intern/sca.c
@@ -396,6 +396,7 @@ void init_actuator(bActuator *act)
bObjectActuator *oa;
bRandomActuator *ra;
bSoundActuator *sa;
+ bSteeringActuator *sta;
if(act->data) MEM_freeN(act->data);
act->data= NULL;
@@ -470,6 +471,16 @@ void init_actuator(bActuator *act)
case ACT_ARMATURE:
act->data = MEM_callocN(sizeof( bArmatureActuator ), "armature act");
break;
+ case ACT_STEERING:
+ act->data = MEM_callocN(sizeof( bSteeringActuator), "steering act");
+ sta = act->data;
+ sta->acceleration = 3.f;
+ sta->turnspeed = 120.f;
+ sta->dist = 1.f;
+ sta->velocity= 3.f;
+ sta->flag = ACT_STEERING_AUTOMATICFACING;
+ sta->facingaxis = 1;
+ break;
default:
; /* this is very severe... I cannot make any memory for this */
/* logic brick... */
@@ -595,6 +606,11 @@ void set_sca_new_poins_ob(Object *ob)
bPropertyActuator *pa= act->data;
ID_NEW(pa->ob);
}
+ else if(act->type==ACT_STEERING) {
+ bSteeringActuator *sta = act->data;
+ ID_NEW(sta->navmesh);
+ ID_NEW(sta->target);
+ }
}
act= act->next;
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 227562384af..628cd3cfe6a 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -521,6 +521,23 @@ Scene *add_scene(const char *name)
sce->gm.flag = GAME_DISPLAY_LISTS;
sce->gm.matmode = GAME_MAT_MULTITEX;
+ sce->gm.obstacleSimulation= OBSTSIMULATION_NONE;
+ sce->gm.levelHeight = 2.f;
+
+ sce->gm.recastData.cellsize = 0.3f;
+ sce->gm.recastData.cellheight = 0.2f;
+ sce->gm.recastData.agentmaxslope = M_PI/2;
+ sce->gm.recastData.agentmaxclimb = 0.9f;
+ sce->gm.recastData.agentheight = 2.0f;
+ sce->gm.recastData.agentradius = 0.6f;
+ sce->gm.recastData.edgemaxlen = 12.0f;
+ sce->gm.recastData.edgemaxerror = 1.3f;
+ sce->gm.recastData.regionminsize = 50.f;
+ sce->gm.recastData.regionmergesize = 20.f;
+ sce->gm.recastData.vertsperpoly = 6;
+ sce->gm.recastData.detailsampledist = 6.0f;
+ sce->gm.recastData.detailsamplemaxerror = 1.0f;
+
sound_create_scene(sce);
return sce;
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 9ef30bdd49b..dbb2e7860c5 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -3603,6 +3603,7 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
#ifdef WITH_AUDASPACE
Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C); /* only for sound */
Editing *ed= seq_give_editing(scene, TRUE);
bSound *sound;
@@ -3624,7 +3625,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
info = AUD_getInfo(sound->playback_handle);
if (info.specs.channels == AUD_CHANNELS_INVALID) {
- sound_delete(C, sound);
+ sound_delete(bmain, sound);
//if(op)
// BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
return NULL;
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 74f4830b86c..ff518d69e21 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -203,7 +203,7 @@ void sound_exit(void)
// XXX unused currently
#if 0
-struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source)
+struct bSound* sound_new_buffer(struct Main *bmain, struct bSound *source)
{
bSound* sound = NULL;
@@ -211,23 +211,23 @@ struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source)
strcpy(name, "buf_");
strcpy(name + 4, source->id.name);
- sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name);
+ sound = alloc_libblock(&bmain->sound, ID_SO, name);
sound->child_sound = source;
sound->type = SOUND_TYPE_BUFFER;
- sound_load(CTX_data_main(C), sound);
+ sound_load(bmain, sound);
if(!sound->playback_handle)
{
- free_libblock(&CTX_data_main(C)->sound, sound);
+ free_libblock(&bmain->sound, sound);
sound = NULL;
}
return sound;
}
-struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end)
+struct bSound* sound_new_limiter(struct Main *bmain, struct bSound *source, float start, float end)
{
bSound* sound = NULL;
@@ -235,18 +235,18 @@ struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, floa
strcpy(name, "lim_");
strcpy(name + 4, source->id.name);
- sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name);
+ sound = alloc_libblock(&bmain->sound, ID_SO, name);
sound->child_sound = source;
sound->start = start;
sound->end = end;
sound->type = SOUND_TYPE_LIMITER;
- sound_load(CTX_data_main(C), sound);
+ sound_load(bmain, sound);
if(!sound->playback_handle)
{
- free_libblock(&CTX_data_main(C)->sound, sound);
+ free_libblock(&bmain->sound, sound);
sound = NULL;
}
@@ -254,13 +254,13 @@ struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, floa
}
#endif
-void sound_delete(struct bContext *C, struct bSound* sound)
+void sound_delete(struct Main *bmain, struct bSound* sound)
{
if(sound)
{
sound_free(sound);
- free_libblock(&CTX_data_main(C)->sound, sound);
+ free_libblock(&bmain->sound, sound);
}
}
@@ -538,10 +538,11 @@ void sound_stop_scene(struct Scene *scene)
}
}
-void sound_seek_scene(struct bContext *C)
+void sound_seek_scene(struct Main *bmain, struct Scene *scene)
{
- struct Scene *scene = CTX_data_scene(C);
AUD_Status status;
+ bScreen *screen;
+ int animation_playing;
AUD_lock();
@@ -560,7 +561,12 @@ void sound_seek_scene(struct bContext *C)
AUD_pause(scene->sound_scene_handle);
}
- if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer)
+ animation_playing = 0;
+ for(screen=bmain->screen.first; screen; screen=screen->id.next)
+ if(screen->animtimer)
+ animation_playing = 1;
+
+ if(scene->audio.flag & AUDIO_SCRUB && !animation_playing)
{
if(scene->audio.flag & AUDIO_SYNC)
{
@@ -758,7 +764,7 @@ void sound_move_scene_sound(struct Scene *UNUSED(scene), void* UNUSED(handle), i
static void sound_start_play_scene(struct Scene *UNUSED(scene)) {}
void sound_play_scene(struct Scene *UNUSED(scene)) {}
void sound_stop_scene(struct Scene *UNUSED(scene)) {}
-void sound_seek_scene(struct bContext *UNUSED(C)) {}
+void sound_seek_scene(struct Main *UNUSED(bmain), struct Scene *UNUSED(scene)) {}
float sound_sync_scene(struct Scene *UNUSED(scene)) { return 0.0f; }
int sound_scene_playing(struct Scene *UNUSED(scene)) { return -1; }
int sound_read_sound_buffer(struct bSound* UNUSED(sound), float* UNUSED(buffer), int UNUSED(length), float UNUSED(start), float UNUSED(end)) { return 0; }
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 493baebd197..38165182d83 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -766,7 +766,9 @@ Tex *copy_texture(Tex *tex)
if(tex->preview) texn->preview = BKE_previewimg_copy(tex->preview);
if(tex->nodetree) {
- ntreeEndExecTree(tex->nodetree);
+ if (tex->nodetree->execdata) {
+ ntreeTexEndExecTree(tex->nodetree->execdata, 1);
+ }
texn->nodetree= ntreeCopyTree(tex->nodetree);
}
diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h
index 0f8493e25a6..4309e6122df 100644
--- a/source/blender/blenlib/BLI_math_inline.h
+++ b/source/blender/blenlib/BLI_math_inline.h
@@ -45,7 +45,12 @@ extern "C" {
#define MALWAYS_INLINE MINLINE
#else
#define MINLINE static inline
+#if (defined(__APPLE__) && defined(__ppc__))
+/* static inline __attribute__ here breaks osx ppc gcc42 build */
#define MALWAYS_INLINE static __attribute__((always_inline))
+#else
+#define MALWAYS_INLINE static inline __attribute__((always_inline))
+#endif
#endif
#else
#define MINLINE
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index d8719f399ae..18955c158c6 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -66,6 +66,9 @@ void swap_m4m4(float A[4][4], float B[4][4]);
void add_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
void add_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
+void sub_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
+void sub_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
+
void mul_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
void mul_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
void mul_m4_m3m4(float R[4][4], float A[3][3], float B[4][4]);
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index c8b598a1e85..d30168c8657 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -124,6 +124,7 @@ void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const fl
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 interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4]);
void mid_v3_v3v3(float r[3], const float a[3], const float b[3]);
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index 1a1f7be2471..9a3b81e5776 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -176,6 +176,12 @@
/* useful for debugging */
#define AT __FILE__ ":" STRINGIFY(__LINE__)
+/* so we can use __func__ everywhere */
+#if defined(_MSC_VER)
+# define __func__ __FUNCTION__
+#endif
+
+
/* UNUSED macro, for function argument */
#ifdef __GNUC__
# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 3c79a77707a..e2f594376cb 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -451,6 +451,24 @@ void add_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
m1[i][j]= m2[i][j] + m3[i][j];
}
+void sub_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
+{
+ int i, j;
+
+ for(i=0;i<3;i++)
+ for(j=0;j<3;j++)
+ m1[i][j]= m2[i][j] - m3[i][j];
+}
+
+void sub_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
+{
+ int i, j;
+
+ for(i=0;i<4;i++)
+ for(j=0;j<4;j++)
+ m1[i][j]= m2[i][j] - m3[i][j];
+}
+
int invert_m3(float m[3][3])
{
float tmp[3][3];
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index 15d671e38d7..7dbceff46e4 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -96,6 +96,14 @@ void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const fl
p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2];
}
+void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4])
+{
+ p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2] + v4[0]*w[3];
+ p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2] + v4[1]*w[3];
+ p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2] + v4[2]*w[3];
+ p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2] + v4[3]*w[3];
+}
+
void mid_v3_v3v3(float v[3], const float v1[3], const float v2[3])
{
v[0]= 0.5f*(v1[0] + v2[0]);
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 9bc666dc971..9efe8dc9739 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -263,13 +263,21 @@ static float newPerlinU(float x, float y, float z)
static float orgBlenderNoise(float x, float y, float z)
{
register float cn1, cn2, cn3, cn4, cn5, cn6, i, *h;
- float ox, oy, oz, jx, jy, jz;
+ float fx, fy, fz, ox, oy, oz, jx, jy, jz;
float n= 0.5;
int ix, iy, iz, b00, b01, b10, b11, b20, b21;
- ox= (x- (ix= (int)floor(x)) );
- oy= (y- (iy= (int)floor(y)) );
- oz= (z- (iz= (int)floor(z)) );
+ fx= floor(x);
+ fy= floor(y);
+ fz= floor(z);
+
+ ox= x- fx;
+ oy= y- fy;
+ oz= z- fz;
+
+ ix= (int)fx;
+ iy= (int)fy;
+ iz= (int)fz;
jx= ox-1;
jy= oy-1;
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index c4ed44f0cdb..ae5fa40f3b9 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -129,7 +129,7 @@ size_t BLI_strescape(char *dst, const char *src, const size_t maxlen)
while(len < maxlen) {
switch(*src) {
case '\0':
- break;
+ goto escape_finish;
case '\\':
case '"':
@@ -154,6 +154,8 @@ size_t BLI_strescape(char *dst, const char *src, const size_t maxlen)
len++;
}
+escape_finish:
+
*dst= '\0';
return len;
diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h
index 2114fc34bf1..4b3902dca43 100644
--- a/source/blender/blenloader/BLO_sys_types.h
+++ b/source/blender/blenloader/BLO_sys_types.h
@@ -93,7 +93,8 @@ typedef unsigned long uintptr_t;
#include <inttypes.h>
#elif defined(FREE_WINDOWS)
-
+/* define htoln here, there must be a syntax error in winsock2.h in MinGW */
+unsigned long __attribute__((__stdcall__)) htonl(unsigned long);
#include <stdint.h>
#else
@@ -105,8 +106,14 @@ typedef unsigned long uintptr_t;
#ifdef _WIN32
+#ifndef FREE_WINDOWS
+#ifndef htonl
#define htonl(x) correctByteOrder(x)
+#endif
+#ifndef ntohl
#define ntohl(x) correctByteOrder(x)
+#endif
+#endif
#elif defined (__FreeBSD__) || defined (__OpenBSD__)
#include <sys/param.h>
#elif defined (__APPLE__)
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index 4088481c844..ab00a8e90dd 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
../blenlib
../makesdna
../makesrna
+ ../nodes
../render/extern/include
../../../intern/guardedalloc
)
diff --git a/source/blender/blenloader/SConscript b/source/blender/blenloader/SConscript
index be9908d84e6..d5d2df3ea35 100644
--- a/source/blender/blenloader/SConscript
+++ b/source/blender/blenloader/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
incs = '. #/intern/guardedalloc ../blenlib ../blenkernel'
incs += ' ../makesdna ../editors/include'
-incs += ' ../render/extern/include ../makesrna'
+incs += ' ../render/extern/include ../makesrna ../nodes'
incs += ' ' + env['BF_ZLIB_INC']
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 0e533a52493..a22a2cb8d9d 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -135,6 +135,8 @@
#include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND
#include "BKE_sound.h"
+#include "NOD_socket.h"
+
//XXX #include "BIF_butspace.h" // badlevel, for do_versions, patching event codes
//XXX #include "BIF_filelist.h" // badlevel too, where to move this? - elubie
//XXX #include "BIF_previewrender.h" // bedlelvel, for struct RenderInfo
@@ -2053,10 +2055,21 @@ static void lib_link_nodetree(FileData *fd, Main *main)
}
}
+static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+ bNode *node;
+
+ ntreeInitTypes(ntree);
+
+ /* XXX could be replaced by do_versions for new nodes */
+ for (node=ntree->nodes.first; node; node=node->next)
+ node_verify_socket_templates(ntree, node);
+}
+
/* updates group node socket own_index so that
* external links to/from the group node are preserved.
*/
-static void lib_node_do_versions_group(bNode *gnode)
+static void lib_node_do_versions_group_indices(bNode *gnode)
{
bNodeTree *ngroup= (bNodeTree*)gnode->id;
bNode *intnode;
@@ -2089,92 +2102,101 @@ static void lib_node_do_versions_group(bNode *gnode)
}
/* updates external links for all group nodes in a tree */
-static void lib_nodetree_do_versions_group(bNodeTree *ntree)
+static void lib_nodetree_do_versions_group_indices_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
{
bNode *node;
for (node=ntree->nodes.first; node; node=node->next) {
if (node->type==NODE_GROUP) {
bNodeTree *ngroup= (bNodeTree*)node->id;
- if (ngroup && (ngroup->flag & NTREE_DO_VERSIONS))
- lib_node_do_versions_group(node);
+ if (ngroup && (ngroup->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE))
+ lib_node_do_versions_group_indices(node);
}
}
}
+/* make an update call for the tree */
+static void lib_nodetree_do_versions_update_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+ if (ntree->update)
+ ntreeUpdateTree(ntree);
+}
+
/* verify types for nodes and groups, all data has to be read */
/* open = 0: appending/linking, open = 1: open new file (need to clean out dynamic
* typedefs*/
static void lib_verify_nodetree(Main *main, int UNUSED(open))
{
- Scene *sce;
- Material *ma;
- Tex *tx;
bNodeTree *ntree;
-
+ int i;
+ bNodeTreeType *ntreetype;
+
/* this crashes blender on undo/redo
if(open==1) {
reinit_nodesystem();
}*/
- /* now create the own typeinfo structs an verify nodes */
- /* here we still assume no groups in groups */
- for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
- ntreeVerifyTypes(ntree); /* internal nodes, no groups! */
+ /* set node->typeinfo pointers */
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ ntreetype= ntreeGetType(i);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, NULL, lib_nodetree_init_types_cb);
}
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
+ ntreeInitTypes(ntree);
{
- /*int has_old_groups=0;*/ /*UNUSED*/
+ int has_old_groups=0;
/* XXX this should actually be part of do_versions, but since we need
* finished library linking, it is not possible there. Instead in do_versions
* we have set the NTREE_DO_VERSIONS flag, so at this point we can do the
* actual group node updates.
*/
for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
- if (ntree->flag & NTREE_DO_VERSIONS) {
+ if (ntree->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE) {
/* this adds copies and links from all unlinked internal sockets to group inputs/outputs. */
- nodeGroupExposeAllSockets(ntree);
- /*has_old_groups = 1;*/ /*UNUSED*/
+ node_group_expose_all_sockets(ntree);
+ has_old_groups = 1;
}
}
- /* now verify all types in material trees, groups are set OK now */
- for(ma= main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree)
- lib_nodetree_do_versions_group(ma->nodetree);
- }
- /* and scene trees */
- for(sce= main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree)
- lib_nodetree_do_versions_group(sce->nodetree);
- }
- /* and texture trees */
- for(tx= main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree)
- lib_nodetree_do_versions_group(tx->nodetree);
+
+ if (has_old_groups) {
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ ntreetype= ntreeGetType(i);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_group_indices_cb);
+ }
}
for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
- ntree->flag &= ~NTREE_DO_VERSIONS;
- }
-
- /* now verify all types in material trees, groups are set OK now */
- for(ma= main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree)
- ntreeVerifyTypes(ma->nodetree);
+ ntree->flag &= ~NTREE_DO_VERSIONS_GROUP_EXPOSE;
}
- /* and scene trees */
- for(sce= main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree)
- ntreeVerifyTypes(sce->nodetree);
+
+ /* verify all group user nodes */
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
+ ntreeVerifyNodes(main, &ntree->id);
}
- /* and texture trees */
- for(tx= main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree)
- ntreeVerifyTypes(tx->nodetree);
+
+ /* make update calls where necessary */
+ {
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
+ if (ntree->update)
+ ntreeUpdateTree(ntree);
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ ntreetype= ntreeGetType(i);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_update_cb);
+ }
}
}
-
+static void direct_link_node_socket(FileData *fd, bNodeSocket *sock)
+{
+ sock->link= newdataadr(fd, sock->link);
+ sock->storage= newdataadr(fd, sock->storage);
+ sock->default_value= newdataadr(fd, sock->default_value);
+ sock->cache= NULL;
+}
/* ntree itself has been read! */
static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
@@ -2186,6 +2208,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
ntree->init= 0; /* to set callbacks and force setting types */
ntree->progress= NULL;
+ ntree->execdata= NULL;
ntree->adt= newdataadr(fd, ntree->adt);
direct_link_animdata(fd, ntree->adt);
@@ -2195,12 +2218,15 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
if(node->type == NODE_DYNAMIC) {
node->custom1= 0;
node->custom1= BSET(node->custom1, NODE_DYNAMIC_LOADED);
- node->typeinfo= NULL;
}
+
+ node->typeinfo= NULL;
+
+ link_list(fd, &node->inputs);
+ link_list(fd, &node->outputs);
node->storage= newdataadr(fd, node->storage);
if(node->storage) {
-
/* could be handlerized at some point */
if(ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
direct_link_curvemapping(fd, node->storage);
@@ -2217,8 +2243,6 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
((ImageUser *)node->storage)->ok= 1;
}
}
- link_list(fd, &node->inputs);
- link_list(fd, &node->outputs);
}
link_list(fd, &ntree->links);
@@ -2228,15 +2252,19 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
/* and we connect the rest */
for(node= ntree->nodes.first; node; node= node->next) {
+ node->parent = newdataadr(fd, node->parent);
node->preview= newimaadr(fd, node->preview);
node->lasty= 0;
+
for(sock= node->inputs.first; sock; sock= sock->next)
- sock->link= newdataadr(fd, sock->link);
+ direct_link_node_socket(fd, sock);
for(sock= node->outputs.first; sock; sock= sock->next)
- sock->ns.data= NULL;
+ direct_link_node_socket(fd, sock);
}
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ direct_link_node_socket(fd, sock);
for(sock= ntree->outputs.first; sock; sock= sock->next)
- sock->link= newdataadr(fd, sock->link);
+ direct_link_node_socket(fd, sock);
for(link= ntree->links.first; link; link= link->next) {
link->fromnode= newdataadr(fd, link->fromnode);
@@ -3869,6 +3897,11 @@ static void lib_link_object(FileData *fd, Main *main)
arma->target= newlibadr(fd, ob->id.lib, arma->target);
arma->subtarget= newlibadr(fd, ob->id.lib, arma->subtarget);
}
+ else if(act->type==ACT_STEERING) {
+ bSteeringActuator *steeringa = act->data;
+ steeringa->target = newlibadr(fd, ob->id.lib, steeringa->target);
+ steeringa->navmesh = newlibadr(fd, ob->id.lib, steeringa->navmesh);
+ }
act= act->next;
}
@@ -4159,6 +4192,13 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
if(tmd->curfalloff)
direct_link_curvemapping(fd, tmd->curfalloff);
}
+ else if (md->type==eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ wmd->cmap_curve = newdataadr(fd, wmd->cmap_curve);
+ if(wmd->cmap_curve)
+ direct_link_curvemapping(fd, wmd->cmap_curve);
+ }
}
}
@@ -4971,15 +5011,22 @@ static void lib_link_screen(FileData *fd, Main *main)
SpaceNode *snode= (SpaceNode *)sl;
snode->id= newlibadr(fd, sc->id.lib, snode->id);
+ snode->edittree= NULL;
- /* internal data, a bit patchy */
- if(snode->id) {
- if(GS(snode->id->name)==ID_MA)
- snode->nodetree= ((Material *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_SCE)
- snode->nodetree= ((Scene *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_TE)
- snode->nodetree= ((Tex *)snode->id)->nodetree;
+ if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) {
+ /* internal data, a bit patchy */
+ snode->nodetree= NULL;
+ if(snode->id) {
+ if(GS(snode->id->name)==ID_MA)
+ snode->nodetree= ((Material *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_SCE)
+ snode->nodetree= ((Scene *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_TE)
+ snode->nodetree= ((Tex *)snode->id)->nodetree;
+ }
+ }
+ else {
+ snode->nodetree= newlibadr_us(fd, sc->id.lib, snode->nodetree);
}
snode->linkdrag.first = snode->linkdrag.last = NULL;
@@ -5199,15 +5246,19 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
snode->id= restore_pointer_by_name(newmain, snode->id, 1);
snode->edittree= NULL;
- if(snode->id==NULL)
+ if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) {
snode->nodetree= NULL;
+ if(snode->id) {
+ if(GS(snode->id->name)==ID_MA)
+ snode->nodetree= ((Material *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_SCE)
+ snode->nodetree= ((Scene *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_TE)
+ snode->nodetree= ((Tex *)snode->id)->nodetree;
+ }
+ }
else {
- if(GS(snode->id->name)==ID_MA)
- snode->nodetree= ((Material *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_SCE)
- snode->nodetree= ((Scene *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_TE)
- snode->nodetree= ((Tex *)snode->id)->nodetree;
+ snode->nodetree= restore_pointer_by_name(newmain, &snode->nodetree->id, 1);
}
}
}
@@ -5436,7 +5487,6 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
snode->gpd= newdataadr(fd, snode->gpd);
direct_link_gpencil(fd, snode->gpd);
}
- snode->nodetree= snode->edittree= NULL;
}
else if(sl->spacetype==SPACE_TIME) {
SpaceTime *stime= (SpaceTime *)sl;
@@ -7120,6 +7170,62 @@ static void do_version_bone_roll_256(Bone *bone)
do_version_bone_roll_256(child);
}
+static void do_versions_socket_default_value(bNodeSocket *sock)
+{
+ bNodeSocketValueFloat *valfloat;
+ bNodeSocketValueVector *valvector;
+ bNodeSocketValueRGBA *valrgba;
+
+ if (sock->default_value)
+ return;
+
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
+ valfloat->value = sock->ns.vec[0];
+ valfloat->min = sock->ns.min;
+ valfloat->max = sock->ns.max;
+ valfloat->subtype = PROP_NONE;
+ break;
+ case SOCK_VECTOR:
+ valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
+ copy_v3_v3(valvector->value, sock->ns.vec);
+ valvector->min = sock->ns.min;
+ valvector->max = sock->ns.max;
+ valvector->subtype = PROP_NONE;
+ break;
+ case SOCK_RGBA:
+ valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
+ copy_v4_v4(valrgba->value, sock->ns.vec);
+ break;
+ }
+}
+
+static void do_versions_nodetree_default_value(bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+ for (node=ntree->nodes.first; node; node=node->next) {
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ }
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+}
+
+static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree)
+{
+ bNodeSocket *sock;
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ sock->flag |= SOCK_DYNAMIC;
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ sock->flag |= SOCK_DYNAMIC;
+}
+
static void do_versions(FileData *fd, Library *lib, Main *main)
{
/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -11703,6 +11809,23 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
+ // init facing axis property of steering actuators
+ {
+ Object *ob;
+ for(ob = main->object.first; ob; ob = ob->id.next) {
+ bActuator *act;
+ for(act= ob->actuators.first; act; act= act->next) {
+ if(act->type==ACT_STEERING) {
+ bSteeringActuator* stact = act->data;
+ if (stact->facingaxis==0)
+ {
+ stact->facingaxis=1;
+ }
+ }
+ }
+ }
+ }
+
if (main->versionfile < 256) {
bScreen *sc;
ScrArea *sa;
@@ -11771,7 +11894,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
* is done in lib_verify_nodetree, because at this point the internal
* nodes may not be up-to-date! (missing lib-link)
*/
- ntree->flag |= NTREE_DO_VERSIONS;
+ ntree->flag |= NTREE_DO_VERSIONS_GROUP_EXPOSE;
}
}
@@ -11896,10 +12019,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(tex->pd) {
if (tex->pd->falloff_speed_scale == 0.0f)
tex->pd->falloff_speed_scale = 100.0f;
-
+
if (!tex->pd->falloff_curve) {
tex->pd->falloff_curve = curvemapping_add(1, 0, 0, 1, 1);
-
+
tex->pd->falloff_curve->preset = CURVE_PRESET_LINE;
tex->pd->falloff_curve->cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
curvemap_reset(tex->pd->falloff_curve->cm, &tex->pd->falloff_curve->clipr, tex->pd->falloff_curve->preset, CURVEMAP_SLOPE_POSITIVE);
@@ -12050,12 +12173,99 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
+ if (main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 2)){
+ {
+ /* Convert default socket values from bNodeStack */
+ Scene *sce;
+ Material *mat;
+ Tex *tex;
+ bNodeTree *ntree;
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
+ do_versions_nodetree_default_value(ntree);
+ ntree->update |= NTREE_UPDATE;
+ }
+ for (sce=main->scene.first; sce; sce=sce->id.next)
+ if (sce->nodetree) {
+ do_versions_nodetree_default_value(sce->nodetree);
+ sce->nodetree->update |= NTREE_UPDATE;
+ }
+ for (mat=main->mat.first; mat; mat=mat->id.next)
+ if (mat->nodetree) {
+ do_versions_nodetree_default_value(mat->nodetree);
+ mat->nodetree->update |= NTREE_UPDATE;
+ }
+ for (tex=main->tex.first; tex; tex=tex->id.next)
+ if (tex->nodetree) {
+ do_versions_nodetree_default_value(tex->nodetree);
+ tex->nodetree->update |= NTREE_UPDATE;
+ }
+ }
+
+ /* add SOCK_DYNAMIC flag to existing group sockets */
+ {
+ bNodeTree *ntree;
+ /* only need to do this for trees in main, local trees are not used as groups */
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
+ do_versions_nodetree_dynamic_sockets(ntree);
+ ntree->update |= NTREE_UPDATE;
+ }
+ }
+
+ {
+ /* Initialize group tree nodetypes.
+ * These are used to distinguish tree types and
+ * associate them with specific node types for polling.
+ */
+ bNodeTree *ntree;
+ /* all node trees in main->nodetree are considered groups */
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+ ntree->nodetype = NODE_GROUP;
+ }
+ }
+
/* put compatibility code here until next subversion bump */
{
}
+ //set defaults for obstacle avoidance, recast data
+ {
+ Scene *sce;
+ for(sce = main->scene.first; sce; sce = sce->id.next)
+ {
+ if (sce->gm.levelHeight == 0.f)
+ sce->gm.levelHeight = 2.f;
+
+ if(sce->gm.recastData.cellsize == 0.0f)
+ sce->gm.recastData.cellsize = 0.3f;
+ if(sce->gm.recastData.cellheight == 0.0f)
+ sce->gm.recastData.cellheight = 0.2f;
+ if(sce->gm.recastData.agentmaxslope == 0.0f)
+ sce->gm.recastData.agentmaxslope = M_PI/4;
+ if(sce->gm.recastData.agentmaxclimb == 0.0f)
+ sce->gm.recastData.agentmaxclimb = 0.9f;
+ if(sce->gm.recastData.agentheight == 0.0f)
+ sce->gm.recastData.agentheight = 2.0f;
+ if(sce->gm.recastData.agentradius == 0.0f)
+ sce->gm.recastData.agentradius = 0.6f;
+ if(sce->gm.recastData.edgemaxlen == 0.0f)
+ sce->gm.recastData.edgemaxlen = 12.0f;
+ if(sce->gm.recastData.edgemaxerror == 0.0f)
+ sce->gm.recastData.edgemaxerror = 1.3f;
+ if(sce->gm.recastData.regionminsize == 0.0f)
+ sce->gm.recastData.regionminsize = 50.f;
+ if(sce->gm.recastData.regionmergesize == 0.0f)
+ sce->gm.recastData.regionmergesize = 20.f;
+ if(sce->gm.recastData.vertsperpoly<3)
+ sce->gm.recastData.vertsperpoly = 6;
+ if(sce->gm.recastData.detailsampledist == 0.0f)
+ sce->gm.recastData.detailsampledist = 6.0f;
+ if(sce->gm.recastData.detailsamplemaxerror == 0.0f)
+ sce->gm.recastData.detailsamplemaxerror = 1.0f;
+ }
+ }
+
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
@@ -12961,6 +13171,11 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
bArmatureActuator *arma= act->data;
expand_doit(fd, mainvar, arma->target);
}
+ else if(act->type==ACT_STEERING) {
+ bSteeringActuator *sta= act->data;
+ expand_doit(fd, mainvar, sta->target);
+ expand_doit(fd, mainvar, sta->navmesh);
+ }
act= act->next;
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 9cbd1ede027..f87492d39a2 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -136,6 +136,7 @@ Any case: direct data is ALWAYS after the lib block
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
#include "BLI_bpath.h"
+#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BKE_action.h"
@@ -643,6 +644,46 @@ static void write_curvemapping(WriteData *wd, CurveMapping *cumap)
writestruct(wd, DATA, "CurveMapPoint", cumap->cm[a].totpoint, cumap->cm[a].curve);
}
+static void write_node_socket(WriteData *wd, bNodeSocket *sock)
+{
+ bNodeSocketType *stype= ntreeGetSocketType(sock->type);
+
+ /* forward compatibility code, so older blenders still open */
+ sock->stack_type = 1;
+
+ if(sock->default_value) {
+ bNodeSocketValueFloat *valfloat;
+ bNodeSocketValueVector *valvector;
+ bNodeSocketValueRGBA *valrgba;
+
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ valfloat = sock->default_value;
+ sock->ns.vec[0] = valfloat->value;
+ sock->ns.min = valfloat->min;
+ sock->ns.max = valfloat->max;
+ break;
+ case SOCK_VECTOR:
+ valvector = sock->default_value;
+ copy_v3_v3(sock->ns.vec, valvector->value);
+ sock->ns.min = valvector->min;
+ sock->ns.max = valvector->max;
+ break;
+ case SOCK_RGBA:
+ valrgba = sock->default_value;
+ copy_v4_v4(sock->ns.vec, valrgba->value);
+ sock->ns.min = 0.0f;
+ sock->ns.max = 1.0f;
+ break;
+ }
+ }
+
+ /* actual socket writing */
+ writestruct(wd, DATA, "bNodeSocket", 1, sock);
+ if (sock->default_value)
+ writestruct(wd, DATA, stype->value_structname, 1, sock->default_value);
+}
+
/* this is only direct data, tree itself should have been written */
static void write_nodetree(WriteData *wd, bNodeTree *ntree)
{
@@ -658,6 +699,12 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
writestruct(wd, DATA, "bNode", 1, node);
for(node= ntree->nodes.first; node; node= node->next) {
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ write_node_socket(wd, sock);
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ write_node_socket(wd, sock);
+
+
if(node->storage && node->type!=NODE_DYNAMIC) {
/* could be handlerized at some point, now only 1 exception still */
if(ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
@@ -666,13 +713,9 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
write_curvemapping(wd, node->storage);
else if(ntree->type==NTREE_TEXTURE && (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) )
write_curvemapping(wd, node->storage);
- else
+ else
writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
}
- for(sock= node->inputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
- for(sock= node->outputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
}
for(link= ntree->links.first; link; link= link->next)
@@ -680,9 +723,9 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
/* external sockets */
for(sock= ntree->inputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
+ write_node_socket(wd, sock);
for(sock= ntree->outputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
+ write_node_socket(wd, sock);
}
static void current_screen_compat(Main *mainvar, bScreen **screen)
@@ -934,7 +977,7 @@ static void write_particlesystems(WriteData *wd, ListBase *particles)
writestruct(wd, DATA, "ClothSimSettings", 1, psys->clmd->sim_parms);
writestruct(wd, DATA, "ClothCollSettings", 1, psys->clmd->coll_parms);
}
-
+
write_pointcaches(wd, &psys->ptcaches);
}
}
@@ -1104,6 +1147,9 @@ static void write_actuators(WriteData *wd, ListBase *lb)
case ACT_ARMATURE:
writestruct(wd, DATA, "bArmatureActuator", 1, act->data);
break;
+ case ACT_STEERING:
+ writestruct(wd, DATA, "bSteeringActuator", 1, act->data);
+ break;
default:
; /* error: don't know how to write this file */
}
@@ -1310,6 +1356,12 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
write_curvemapping(wd, tmd->curfalloff);
}
}
+ else if (md->type==eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ if (wmd->cmap_curve)
+ write_curvemapping(wd, wmd->cmap_curve);
+ }
}
}
diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp
index 8a0a39da558..2ea10111bb9 100644
--- a/source/blender/collada/AnimationExporter.cpp
+++ b/source/blender/collada/AnimationExporter.cpp
@@ -1,26 +1,26 @@
/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
#include "GeometryExporter.h"
#include "AnimationExporter.h"
@@ -30,10 +30,10 @@ template<class Functor>
void forEachObjectInScene(Scene *sce, Functor &f)
{
Base *base= (Base*) sce->base.first;
-
+
while(base) {
Object *ob = base->object;
-
+
f(ob);
base= base->next;
@@ -58,10 +58,10 @@ void AnimationExporter::operator() (Object *ob)
{
FCurve *fcu;
char * transformName ;
- bool isMatAnim = false;
+ /* bool isMatAnim = false; */ /* UNUSED */
//Export transform animations
- if(ob->adt && ob->adt->action)
+ if(ob->adt && ob->adt->action)
{
fcu = (FCurve*)ob->adt->action->curves.first;
@@ -72,21 +72,21 @@ void AnimationExporter::operator() (Object *ob)
for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next)
write_bone_animation_matrix(ob, bone);
}
-
+
while (fcu) {
//for armature animations as objects
if ( ob->type == OB_ARMATURE )
transformName = fcu->rna_path;
else
transformName = extract_transform_name( fcu->rna_path );
-
+
if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
(!strcmp(transformName, "rotation_euler") && ob->rotmode == ROT_MODE_EUL)||
(!strcmp(transformName, "rotation_quaternion")))
dae_animation(ob ,fcu, transformName, false);
fcu = fcu->next;
}
-
+
}
//Export Lamp parameter animations
@@ -94,8 +94,8 @@ void AnimationExporter::operator() (Object *ob)
{
fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first);
while (fcu) {
- transformName = extract_transform_name( fcu->rna_path );
-
+ transformName = extract_transform_name( fcu->rna_path );
+
if ((!strcmp(transformName, "color")) || (!strcmp(transformName, "spot_size"))|| (!strcmp(transformName, "spot_blend"))||
(!strcmp(transformName, "distance")) )
dae_animation(ob , fcu, transformName, true );
@@ -108,8 +108,8 @@ void AnimationExporter::operator() (Object *ob)
{
fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first);
while (fcu) {
- transformName = extract_transform_name( fcu->rna_path );
-
+ transformName = extract_transform_name( fcu->rna_path );
+
if ((!strcmp(transformName, "lens"))||
(!strcmp(transformName, "ortho_scale"))||
(!strcmp(transformName, "clip_end"))||(!strcmp(transformName, "clip_start")))
@@ -125,11 +125,11 @@ void AnimationExporter::operator() (Object *ob)
if (!ma) continue;
if(ma->adt && ma->adt->action)
{
- isMatAnim = true;
+ /* isMatAnim = true; */
fcu = (FCurve*)ma->adt->action->curves.first;
while (fcu) {
transformName = extract_transform_name( fcu->rna_path );
-
+
if ((!strcmp(transformName, "specular_hardness"))||(!strcmp(transformName, "specular_color"))
||(!strcmp(transformName, "diffuse_color"))||(!strcmp(transformName, "alpha"))||
(!strcmp(transformName, "ior")))
@@ -137,384 +137,384 @@ void AnimationExporter::operator() (Object *ob)
fcu = fcu->next;
}
}
-
+
}
}
- //euler sources from quternion sources
- float * AnimationExporter::get_eul_source_for_quat(Object *ob )
+//euler sources from quternion sources
+float * AnimationExporter::get_eul_source_for_quat(Object *ob )
+{
+ FCurve *fcu = (FCurve*)ob->adt->action->curves.first;
+ const int keys = fcu->totvert;
+ float *quat = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 4, "quat output source values");
+ float *eul = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 3, "quat output source values");
+ float temp_quat[4];
+ float temp_eul[3];
+ while(fcu)
{
- FCurve *fcu = (FCurve*)ob->adt->action->curves.first;
- const int keys = fcu->totvert;
- float *quat = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 4, "quat output source values");
- float *eul = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 3, "quat output source values");
- float temp_quat[4];
- float temp_eul[3];
- while(fcu)
- {
- char * transformName = extract_transform_name( fcu->rna_path );
-
- if( !strcmp(transformName, "rotation_quaternion") ) {
- for ( int i = 0 ; i < fcu->totvert ; i++){
- *(quat + ( i * 4 ) + fcu->array_index) = fcu->bezt[i].vec[1][1];
- }
- }
- fcu = fcu->next;
+ char * transformName = extract_transform_name( fcu->rna_path );
+
+ if( !strcmp(transformName, "rotation_quaternion") ) {
+ for ( int i = 0 ; i < fcu->totvert ; i++){
+ *(quat + ( i * 4 ) + fcu->array_index) = fcu->bezt[i].vec[1][1];
}
+ }
+ fcu = fcu->next;
+ }
- for ( int i = 0 ; i < keys ; i++){
- for ( int j = 0;j<4;j++)
- temp_quat[j] = quat[(i*4)+j];
+ for ( int i = 0 ; i < keys ; i++){
+ for ( int j = 0;j<4;j++)
+ temp_quat[j] = quat[(i*4)+j];
- quat_to_eul(temp_eul,temp_quat);
+ quat_to_eul(temp_eul,temp_quat);
- for (int k = 0;k<3;k++)
- eul[i*3 + k] = temp_eul[k];
-
- }
- MEM_freeN(quat);
- return eul;
+ for (int k = 0;k<3;k++)
+ eul[i*3 + k] = temp_eul[k];
}
+ MEM_freeN(quat);
+ return eul;
+
+}
+
+//Get proper name for bones
+std::string AnimationExporter::getObjectBoneName( Object* ob,const FCurve* fcu )
+{
+ //hard-way to derive the bone name from rna_path. Must find more compact method
+ std::string rna_path = std::string(fcu->rna_path);
- //Get proper name for bones
- std::string AnimationExporter::getObjectBoneName( Object* ob,const FCurve* fcu )
+ char* boneName = strtok((char *)rna_path.c_str(), "\"");
+ boneName = strtok(NULL,"\"");
+
+ if( boneName != NULL )
+ return /*id_name(ob) + "_" +*/ std::string(boneName);
+ else
+ return id_name(ob);
+}
+
+//convert f-curves to animation curves and write
+void AnimationExporter::dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material * ma )
+{
+ const char *axis_name = NULL;
+ char anim_id[200];
+
+ bool has_tangents = false;
+ bool quatRotation = false;
+
+ if ( !strcmp(transformName, "rotation_quaternion") )
{
- //hard-way to derive the bone name from rna_path. Must find more compact method
- std::string rna_path = std::string(fcu->rna_path);
-
- char* boneName = strtok((char *)rna_path.c_str(), "\"");
- boneName = strtok(NULL,"\"");
-
- if( boneName != NULL )
- return /*id_name(ob) + "_" +*/ std::string(boneName);
- else
- return id_name(ob);
+ fprintf(stderr, "quaternion rotation curves are not supported. rotation curve will not be exported\n");
+ quatRotation = true;
+ return;
}
- //convert f-curves to animation curves and write
- void AnimationExporter::dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material * ma )
+ //axis names for colors
+ else if ( !strcmp(transformName, "color")||!strcmp(transformName, "specular_color")||!strcmp(transformName, "diffuse_color")||
+ (!strcmp(transformName, "alpha")))
{
- const char *axis_name = NULL;
- char anim_id[200];
-
- bool has_tangents = false;
- bool quatRotation = false;
-
- if ( !strcmp(transformName, "rotation_quaternion") )
- {
- fprintf(stderr, "quaternion rotation curves are not supported. rotation curve will not be exported\n");
- quatRotation = true;
- return;
- }
-
- //axis names for colors
- else if ( !strcmp(transformName, "color")||!strcmp(transformName, "specular_color")||!strcmp(transformName, "diffuse_color")||
- (!strcmp(transformName, "alpha")))
- {
- const char *axis_names[] = {"R", "G", "B"};
- if (fcu->array_index < 3)
+ const char *axis_names[] = {"R", "G", "B"};
+ if (fcu->array_index < 3)
axis_name = axis_names[fcu->array_index];
- }
+ }
- //axis names for transforms
- else if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
- (!strcmp(transformName, "rotation_euler"))||(!strcmp(transformName, "rotation_quaternion")))
- {
- const char *axis_names[] = {"X", "Y", "Z"};
- if (fcu->array_index < 3)
+ //axis names for transforms
+ else if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
+ (!strcmp(transformName, "rotation_euler"))||(!strcmp(transformName, "rotation_quaternion")))
+ {
+ const char *axis_names[] = {"X", "Y", "Z"};
+ if (fcu->array_index < 3)
axis_name = axis_names[fcu->array_index];
- }
+ }
- //no axis name. single parameter.
- else{
- axis_name = "";
- }
-
- std::string ob_name = std::string("null");
-
- //Create anim Id
- if (ob->type == OB_ARMATURE)
- {
- ob_name = getObjectBoneName( ob , fcu);
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s.%s", (char*)translate_id(ob_name).c_str(),
- transformName, axis_name);
- }
- else
- {
- if (ma)
- ob_name = id_name(ob) + "_material";
- else
- ob_name = id_name(ob);
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
- fcu->rna_path, axis_name);
- }
-
- openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
+ //no axis name. single parameter.
+ else{
+ axis_name = "";
+ }
- // create input source
- std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name);
+ std::string ob_name = std::string("null");
- // create output source
- std::string output_id ;
-
- //quat rotations are skipped for now, because of complications with determining axis.
- if(quatRotation)
- {
- float * eul = get_eul_source_for_quat(ob);
- float * eul_axis = (float*)MEM_callocN(sizeof(float) * fcu->totvert, "quat output source values");
- for ( int i = 0 ; i< fcu->totvert ; i++)
- eul_axis[i] = eul[i*3 + fcu->array_index];
- output_id= create_source_from_array(COLLADASW::InputSemantic::OUTPUT, eul_axis , fcu->totvert, quatRotation, anim_id, axis_name);
- MEM_freeN(eul);
- MEM_freeN(eul_axis);
- }
- else
- {
- output_id= create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name);
- }
- // create interpolations source
- std::string interpolation_id = create_interpolation_source(fcu, anim_id, axis_name, &has_tangents);
-
- // handle tangents (if required)
- std::string intangent_id;
- std::string outtangent_id;
-
- if (has_tangents) {
- // create in_tangent source
- intangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::IN_TANGENT, fcu, anim_id, axis_name);
-
- // create out_tangent source
- outtangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUT_TANGENT, fcu, anim_id, axis_name);
- }
+ //Create anim Id
+ if (ob->type == OB_ARMATURE)
+ {
+ ob_name = getObjectBoneName( ob , fcu);
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s.%s", (char*)translate_id(ob_name).c_str(),
+ transformName, axis_name);
+ }
+ else
+ {
+ if (ma)
+ ob_name = id_name(ob) + "_material";
+ else
+ ob_name = id_name(ob);
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
+ fcu->rna_path, axis_name);
+ }
- std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
- std::string empty;
- sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+ openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
- // this input is required
- sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ // create input source
+ std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name);
- if (has_tangents) {
- sampler.addInput(COLLADASW::InputSemantic::IN_TANGENT, COLLADABU::URI(empty, intangent_id));
- sampler.addInput(COLLADASW::InputSemantic::OUT_TANGENT, COLLADABU::URI(empty, outtangent_id));
- }
+ // create output source
+ std::string output_id ;
- addSampler(sampler);
+ //quat rotations are skipped for now, because of complications with determining axis.
+ if(quatRotation)
+ {
+ float * eul = get_eul_source_for_quat(ob);
+ float * eul_axis = (float*)MEM_callocN(sizeof(float) * fcu->totvert, "quat output source values");
+ for ( int i = 0 ; i< fcu->totvert ; i++)
+ eul_axis[i] = eul[i*3 + fcu->array_index];
+ output_id= create_source_from_array(COLLADASW::InputSemantic::OUTPUT, eul_axis , fcu->totvert, quatRotation, anim_id, axis_name);
+ MEM_freeN(eul);
+ MEM_freeN(eul_axis);
+ }
+ else
+ {
+ output_id= create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name);
+ }
+ // create interpolations source
+ std::string interpolation_id = create_interpolation_source(fcu, anim_id, axis_name, &has_tangents);
- std::string target ;
+ // handle tangents (if required)
+ std::string intangent_id;
+ std::string outtangent_id;
- if ( !is_param )
- target = translate_id(ob_name)
- + "/" + get_transform_sid(fcu->rna_path, -1, axis_name, true);
- else
- {
- if ( ob->type == OB_LAMP )
- target = get_light_id(ob)
- + "/" + get_light_param_sid(fcu->rna_path, -1, axis_name, true);
+ if (has_tangents) {
+ // create in_tangent source
+ intangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::IN_TANGENT, fcu, anim_id, axis_name);
- if ( ob->type == OB_CAMERA )
- target = get_camera_id(ob)
- + "/" + get_camera_param_sid(fcu->rna_path, -1, axis_name, true);
+ // create out_tangent source
+ outtangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUT_TANGENT, fcu, anim_id, axis_name);
+ }
- if( ma )
- target = translate_id(id_name(ma)) + "-effect"
- +"/common/" /*profile common is only supported */ + get_transform_sid(fcu->rna_path, -1, axis_name, true);
- }
- addChannel(COLLADABU::URI(empty, sampler_id), target);
+ std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
+ std::string empty;
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+
+ // this input is required
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
- closeAnimation();
+ if (has_tangents) {
+ sampler.addInput(COLLADASW::InputSemantic::IN_TANGENT, COLLADABU::URI(empty, intangent_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUT_TANGENT, COLLADABU::URI(empty, outtangent_id));
}
+ addSampler(sampler);
-
- //write bone animations in transform matrix sources
- void AnimationExporter::write_bone_animation_matrix(Object *ob_arm, Bone *bone)
+ std::string target ;
+
+ if ( !is_param )
+ target = translate_id(ob_name)
+ + "/" + get_transform_sid(fcu->rna_path, -1, axis_name, true);
+ else
{
- if (!ob_arm->adt)
- return;
-
- //This will only export animations of bones in deform group.
- /*if(!is_bone_deform_group(bone))
- return;*/
-
- sample_and_write_bone_animation_matrix(ob_arm, bone);
-
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
- write_bone_animation_matrix(ob_arm, child);
+ if ( ob->type == OB_LAMP )
+ target = get_light_id(ob)
+ + "/" + get_light_param_sid(fcu->rna_path, -1, axis_name, true);
+
+ if ( ob->type == OB_CAMERA )
+ target = get_camera_id(ob)
+ + "/" + get_camera_param_sid(fcu->rna_path, -1, axis_name, true);
+
+ if( ma )
+ target = translate_id(id_name(ma)) + "-effect"
+ +"/common/" /*profile common is only supported */ + get_transform_sid(fcu->rna_path, -1, axis_name, true);
}
+ addChannel(COLLADABU::URI(empty, sampler_id), target);
+
+ closeAnimation();
+}
+
+
- bool AnimationExporter::is_bone_deform_group(Bone * bone)
+//write bone animations in transform matrix sources
+void AnimationExporter::write_bone_animation_matrix(Object *ob_arm, Bone *bone)
+{
+ if (!ob_arm->adt)
+ return;
+
+ //This will only export animations of bones in deform group.
+ /*if(!is_bone_deform_group(bone))
+ return;*/
+
+ sample_and_write_bone_animation_matrix(ob_arm, bone);
+
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
+ write_bone_animation_matrix(ob_arm, child);
+}
+
+bool AnimationExporter::is_bone_deform_group(Bone * bone)
+{
+ bool is_def;
+ //Check if current bone is deform
+ if((bone->flag & BONE_NO_DEFORM) == 0 ) return true;
+ //Check child bones
+ else
{
- bool is_def;
- //Check if current bone is deform
- if((bone->flag & BONE_NO_DEFORM) == 0 ) return true;
- //Check child bones
- else
- {
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next){
- //loop through all the children until deform bone is found, and then return
- is_def = is_bone_deform_group(child);
- if (is_def) return true;
- }
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next){
+ //loop through all the children until deform bone is found, and then return
+ is_def = is_bone_deform_group(child);
+ if (is_def) return true;
}
- //no deform bone found in children also
- return false;
}
+ //no deform bone found in children also
+ return false;
+}
- void AnimationExporter::sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone)
- {
- bArmature *arm = (bArmature*)ob_arm->data;
- int flag = arm->flag;
- std::vector<float> fra;
- //char prefix[256];
-
- FCurve* fcu = (FCurve*)ob_arm->adt->action->curves.first;
- while(fcu)
- {
- std::string bone_name = getObjectBoneName(ob_arm,fcu);
- int val = BLI_strcasecmp((char*)bone_name.c_str(),bone->name);
- if(val==0) break;
- fcu = fcu->next;
- }
+void AnimationExporter::sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone)
+{
+ bArmature *arm = (bArmature*)ob_arm->data;
+ int flag = arm->flag;
+ std::vector<float> fra;
+ //char prefix[256];
- if(!(fcu)) return;
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
- if (!pchan)
- return;
-
- find_frames(ob_arm, fra);
+ FCurve* fcu = (FCurve*)ob_arm->adt->action->curves.first;
+ while(fcu)
+ {
+ std::string bone_name = getObjectBoneName(ob_arm,fcu);
+ int val = BLI_strcasecmp((char*)bone_name.c_str(),bone->name);
+ if(val==0) break;
+ fcu = fcu->next;
+ }
- if (flag & ARM_RESTPOS) {
- arm->flag &= ~ARM_RESTPOS;
- where_is_pose(scene, ob_arm);
- }
+ if(!(fcu)) return;
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
+ if (!pchan)
+ return;
- if (fra.size()) {
- dae_baked_animation(fra ,ob_arm, bone );
- }
+ find_frames(ob_arm, fra);
- if (flag & ARM_RESTPOS)
- arm->flag = flag;
+ if (flag & ARM_RESTPOS) {
+ arm->flag &= ~ARM_RESTPOS;
where_is_pose(scene, ob_arm);
}
- void AnimationExporter::dae_baked_animation(std::vector<float> &fra, Object *ob_arm , Bone *bone)
- {
- std::string ob_name = id_name(ob_arm);
- std::string bone_name = bone->name;
- char anim_id[200];
-
- if (!fra.size())
- return;
+ if (fra.size()) {
+ dae_baked_animation(fra ,ob_arm, bone );
+ }
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
- (char*)translate_id(bone_name).c_str(), "pose_matrix");
+ if (flag & ARM_RESTPOS)
+ arm->flag = flag;
+ where_is_pose(scene, ob_arm);
+}
- openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
+void AnimationExporter::dae_baked_animation(std::vector<float> &fra, Object *ob_arm , Bone *bone)
+{
+ std::string ob_name = id_name(ob_arm);
+ std::string bone_name = bone->name;
+ char anim_id[200];
- // create input source
- std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, false, anim_id, "");
+ if (!fra.size())
+ return;
- // create output source
- std::string output_id;
- output_id = create_4x4_source( fra, ob_arm , bone , anim_id);
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
+ (char*)translate_id(bone_name).c_str(), "pose_matrix");
- // create interpolations source
- std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, "");
+ openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
- std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
- std::string empty;
- sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+ // create input source
+ std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, false, anim_id, "");
- // TODO create in/out tangents source
+ // create output source
+ std::string output_id;
+ output_id = create_4x4_source( fra, ob_arm , bone , anim_id);
- // this input is required
- sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ // create interpolations source
+ std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, "");
- addSampler(sampler);
+ std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
+ std::string empty;
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
- std::string target = translate_id(bone_name) + "/transform";
- addChannel(COLLADABU::URI(empty, sampler_id), target);
+ // TODO create in/out tangents source
- closeAnimation();
- }
+ // this input is required
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
- // dae_bone_animation -> add_bone_animation
- // (blend this into dae_bone_animation)
- void AnimationExporter::dae_bone_animation(std::vector<float> &fra, float *values, int tm_type, int axis, std::string ob_name, std::string bone_name)
- {
- const char *axis_names[] = {"X", "Y", "Z"};
- const char *axis_name = NULL;
- char anim_id[200];
- bool is_rot = tm_type == 0;
-
- if (!fra.size())
- return;
+ addSampler(sampler);
- char rna_path[200];
- BLI_snprintf(rna_path, sizeof(rna_path), "pose.bones[\"%s\"].%s", bone_name.c_str(),
- tm_type == 0 ? "rotation_quaternion" : (tm_type == 1 ? "scale" : "location"));
+ std::string target = translate_id(bone_name) + "/transform";
+ addChannel(COLLADABU::URI(empty, sampler_id), target);
- if (axis > -1)
- axis_name = axis_names[axis];
-
- std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name, false);
-
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
- (char*)translate_id(bone_name).c_str(), (char*)transform_sid.c_str());
+ closeAnimation();
+}
- openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
+// dae_bone_animation -> add_bone_animation
+// (blend this into dae_bone_animation)
+void AnimationExporter::dae_bone_animation(std::vector<float> &fra, float *values, int tm_type, int axis, std::string ob_name, std::string bone_name)
+{
+ const char *axis_names[] = {"X", "Y", "Z"};
+ const char *axis_name = NULL;
+ char anim_id[200];
+ bool is_rot = tm_type == 0;
- // create input source
- std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name);
+ if (!fra.size())
+ return;
- // create output source
- std::string output_id;
- if (axis == -1)
- output_id = create_xyz_source(values, fra.size(), anim_id);
- else
- output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, values, fra.size(), is_rot, anim_id, axis_name);
+ char rna_path[200];
+ BLI_snprintf(rna_path, sizeof(rna_path), "pose.bones[\"%s\"].%s", bone_name.c_str(),
+ tm_type == 0 ? "rotation_quaternion" : (tm_type == 1 ? "scale" : "location"));
- // create interpolations source
- std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, axis_name);
+ if (axis > -1)
+ axis_name = axis_names[axis];
- std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
- std::string empty;
- sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+ std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name, false);
- // TODO create in/out tangents source
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
+ (char*)translate_id(bone_name).c_str(), (char*)transform_sid.c_str());
- // this input is required
- sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
- addSampler(sampler);
+ // create input source
+ std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name);
- std::string target = translate_id(ob_name + "_" + bone_name) + "/" + transform_sid;
- addChannel(COLLADABU::URI(empty, sampler_id), target);
+ // create output source
+ std::string output_id;
+ if (axis == -1)
+ output_id = create_xyz_source(values, fra.size(), anim_id);
+ else
+ output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, values, fra.size(), is_rot, anim_id, axis_name);
- closeAnimation();
- }
+ // create interpolations source
+ std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, axis_name);
- float AnimationExporter::convert_time(float frame)
- {
- return FRA2TIME(frame);
- }
+ std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
+ std::string empty;
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
- float AnimationExporter::convert_angle(float angle)
- {
- return COLLADABU::Math::Utils::radToDegF(angle);
- }
+ // TODO create in/out tangents source
- std::string AnimationExporter::get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic)
- {
- switch(semantic) {
+ // this input is required
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+
+ addSampler(sampler);
+
+ std::string target = translate_id(ob_name + "_" + bone_name) + "/" + transform_sid;
+ addChannel(COLLADABU::URI(empty, sampler_id), target);
+
+ closeAnimation();
+}
+
+float AnimationExporter::convert_time(float frame)
+{
+ return FRA2TIME(frame);
+}
+
+float AnimationExporter::convert_angle(float angle)
+{
+ return COLLADABU::Math::Utils::radToDegF(angle);
+}
+
+std::string AnimationExporter::get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic)
+{
+ switch(semantic) {
case COLLADASW::InputSemantic::INPUT:
return INPUT_SOURCE_ID_SUFFIX;
case COLLADASW::InputSemantic::OUTPUT:
@@ -527,14 +527,14 @@ void AnimationExporter::operator() (Object *ob)
return OUTTANGENT_SOURCE_ID_SUFFIX;
default:
break;
- }
- return "";
}
+ return "";
+}
- void AnimationExporter::add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param,
- COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis, bool transform)
- {
- switch(semantic) {
+void AnimationExporter::add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param,
+ COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis, bool transform)
+{
+ switch(semantic) {
case COLLADASW::InputSemantic::INPUT:
param.push_back("TIME");
break;
@@ -547,14 +547,14 @@ void AnimationExporter::operator() (Object *ob)
param.push_back(axis);
}
else
- if ( transform )
- {
- param.push_back("TRANSFORM");
- }else{ //assumes if axis isn't specified all axises are added
- param.push_back("X");
- param.push_back("Y");
- param.push_back("Z");
- }
+ if ( transform )
+ {
+ param.push_back("TRANSFORM");
+ }else{ //assumes if axis isn't specified all axises are added
+ param.push_back("X");
+ param.push_back("Y");
+ param.push_back("Z");
+ }
}
break;
case COLLADASW::InputSemantic::IN_TANGENT:
@@ -564,12 +564,12 @@ void AnimationExporter::operator() (Object *ob)
break;
default:
break;
- }
}
+}
- void AnimationExporter::get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length)
- {
- switch (semantic) {
+void AnimationExporter::get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length)
+{
+ switch (semantic) {
case COLLADASW::InputSemantic::INPUT:
*length = 1;
values[0] = convert_time(bezt->vec[1][0]);
@@ -583,9 +583,9 @@ void AnimationExporter::operator() (Object *ob)
values[0] = bezt->vec[1][1];
}
break;
-
+
case COLLADASW::InputSemantic::IN_TANGENT:
- *length = 2;
+ *length = 2;
values[0] = convert_time(bezt->vec[0][0]);
if (bezt->ipo != BEZT_IPO_BEZ) {
// We're in a mixed interpolation scenario, set zero as it's irrelevant but value might contain unused data
@@ -598,7 +598,7 @@ void AnimationExporter::operator() (Object *ob)
values[1] = bezt->vec[0][1];
}
break;
-
+
case COLLADASW::InputSemantic::OUT_TANGENT:
*length = 2;
values[0] = convert_time(bezt->vec[2][0]);
@@ -617,283 +617,285 @@ void AnimationExporter::operator() (Object *ob)
default:
*length = 0;
break;
- }
}
+}
- std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- //bool is_rotation = !strcmp(fcu->rna_path, "rotation");
- bool is_angle = false;
-
- if (strstr(fcu->rna_path, "rotation")) is_angle = true;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(fcu->totvert);
-
- switch (semantic) {
+std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
+
+ //bool is_rotation = !strcmp(fcu->rna_path, "rotation");
+ bool is_angle = false;
+
+ if (strstr(fcu->rna_path, "rotation")) is_angle = true;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(fcu->totvert);
+
+ switch (semantic) {
case COLLADASW::InputSemantic::INPUT:
case COLLADASW::InputSemantic::OUTPUT:
- source.setAccessorStride(1);
+ source.setAccessorStride(1);
break;
case COLLADASW::InputSemantic::IN_TANGENT:
case COLLADASW::InputSemantic::OUT_TANGENT:
- source.setAccessorStride(2);
+ source.setAccessorStride(2);
break;
- }
-
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, is_angle, axis_name, false);
+ default:
+ break;
+ }
- source.prepareToAppendValues();
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- float values[3]; // be careful!
- int length = 0;
- get_source_values(&fcu->bezt[i], semantic, is_angle, values, &length);
- for (int j = 0; j < length; j++)
- source.appendValues(values[j]);
- }
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, is_angle, axis_name, false);
- source.finish();
+ source.prepareToAppendValues();
- return source_id;
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ float values[3]; // be careful!
+ int length = 0;
+ get_source_values(&fcu->bezt[i], semantic, is_angle, values, &length);
+ for (int j = 0; j < length; j++)
+ source.appendValues(values[j]);
}
- //Currently called only to get OUTPUT source values ( if rotation and hence the axis is also specified )
- std::string AnimationExporter::create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(tot);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, is_rot, axis_name, false);
-
- source.prepareToAppendValues();
-
- for (int i = 0; i < tot; i++) {
- float val = v[i];
- ////if (semantic == COLLADASW::InputSemantic::INPUT)
- // val = convert_time(val);
- //else
- if (is_rot)
- val *= 180.0f / M_PI;
- source.appendValues(val);
- }
+ source.finish();
- source.finish();
+ return source_id;
+}
- return source_id;
+//Currently called only to get OUTPUT source values ( if rotation and hence the axis is also specified )
+std::string AnimationExporter::create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(tot);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, is_rot, axis_name, false);
+
+ source.prepareToAppendValues();
+
+ for (int i = 0; i < tot; i++) {
+ float val = v[i];
+ ////if (semantic == COLLADASW::InputSemantic::INPUT)
+ // val = convert_time(val);
+ //else
+ if (is_rot)
+ val *= 180.0f / M_PI;
+ source.appendValues(val);
}
-// only used for sources with INPUT semantic
- std::string AnimationExporter::create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(fra.size());
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, is_rot, axis_name, false);
-
- source.prepareToAppendValues();
-
- std::vector<float>::iterator it;
- for (it = fra.begin(); it != fra.end(); it++) {
- float val = *it;
- //if (semantic == COLLADASW::InputSemantic::INPUT)
- val = convert_time(val);
- /*else if (is_rot)
- val = convert_angle(val);*/
- source.appendValues(val);
- }
- source.finish();
+ source.finish();
- return source_id;
+ return source_id;
+}
+// only used for sources with INPUT semantic
+std::string AnimationExporter::create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(fra.size());
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, is_rot, axis_name, false);
+
+ source.prepareToAppendValues();
+
+ std::vector<float>::iterator it;
+ for (it = fra.begin(); it != fra.end(); it++) {
+ float val = *it;
+ //if (semantic == COLLADASW::InputSemantic::INPUT)
+ val = convert_time(val);
+ /*else if (is_rot)
+ val = convert_angle(val);*/
+ source.appendValues(val);
}
- std::string AnimationExporter::create_4x4_source(std::vector<float> &frames , Object * ob_arm, Bone *bone , const std::string& anim_id)
- {
- COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
- std::string source_id = anim_id + get_semantic_suffix(semantic);
+ source.finish();
- COLLADASW::Float4x4Source source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(frames.size());
- source.setAccessorStride(16);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, false, NULL, true);
+ return source_id;
+}
- source.prepareToAppendValues();
-
- bPoseChannel *parchan = NULL;
- bPoseChannel *pchan = NULL;
- bPose *pose = ob_arm->pose;
+std::string AnimationExporter::create_4x4_source(std::vector<float> &frames , Object * ob_arm, Bone *bone , const std::string& anim_id)
+{
+ COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
- pchan = get_pose_channel(pose, bone->name);
+ COLLADASW::Float4x4Source source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(frames.size());
+ source.setAccessorStride(16);
- if (!pchan)
- return "";
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, false, NULL, true);
- parchan = pchan->parent;
+ source.prepareToAppendValues();
- enable_fcurves(ob_arm->adt->action, bone->name);
+ bPoseChannel *parchan = NULL;
+ bPoseChannel *pchan = NULL;
+ bPose *pose = ob_arm->pose;
- std::vector<float>::iterator it;
- int j = 0;
- for (it = frames.begin(); it != frames.end(); it++) {
- float mat[4][4], ipar[4][4];
+ pchan = get_pose_channel(pose, bone->name);
- float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
+ if (!pchan)
+ return "";
- BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
- where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
+ parchan = pchan->parent;
- // compute bone local mat
- if (bone->parent) {
- invert_m4_m4(ipar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, ipar);
- }
- else
- copy_m4_m4(mat, pchan->pose_mat);
- UnitConverter converter;
+ enable_fcurves(ob_arm->adt->action, bone->name);
- float outmat[4][4];
- converter.mat4_to_dae(outmat,mat);
+ std::vector<float>::iterator it;
+ int j = 0;
+ for (it = frames.begin(); it != frames.end(); it++) {
+ float mat[4][4], ipar[4][4];
+ float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
- source.appendValues(outmat);
-
+ BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
+ where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
- j++;
+ // compute bone local mat
+ if (bone->parent) {
+ invert_m4_m4(ipar, parchan->pose_mat);
+ mul_m4_m4m4(mat, pchan->pose_mat, ipar);
}
+ else
+ copy_m4_m4(mat, pchan->pose_mat);
+ UnitConverter converter;
- enable_fcurves(ob_arm->adt->action, NULL);
+ float outmat[4][4];
+ converter.mat4_to_dae(outmat,mat);
- source.finish();
- return source_id;
- }
- // only used for sources with OUTPUT semantic ( locations and scale)
- std::string AnimationExporter::create_xyz_source(float *v, int tot, const std::string& anim_id)
- {
- COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(tot);
- source.setAccessorStride(3);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, false, NULL, false);
-
- source.prepareToAppendValues();
-
- for (int i = 0; i < tot; i++) {
- source.appendValues(*v, *(v + 1), *(v + 2));
- v += 3;
- }
+ source.appendValues(outmat);
- source.finish();
- return source_id;
+ j++;
}
- std::string AnimationExporter::create_interpolation_source(FCurve *fcu, const std::string& anim_id, const char *axis_name, bool *has_tangents)
- {
- std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
+ enable_fcurves(ob_arm->adt->action, NULL);
- COLLADASW::NameSource source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(fcu->totvert);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("INTERPOLATION");
+ source.finish();
- source.prepareToAppendValues();
+ return source_id;
+}
+// only used for sources with OUTPUT semantic ( locations and scale)
+std::string AnimationExporter::create_xyz_source(float *v, int tot, const std::string& anim_id)
+{
+ COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
- *has_tangents = false;
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(tot);
+ source.setAccessorStride(3);
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- if (fcu->bezt[i].ipo==BEZT_IPO_BEZ) {
- source.appendValues(BEZIER_NAME);
- *has_tangents = true;
- } else if (fcu->bezt[i].ipo==BEZT_IPO_CONST) {
- source.appendValues(STEP_NAME);
- } else { // BEZT_IPO_LIN
- source.appendValues(LINEAR_NAME);
- }
- }
- // unsupported? -- HERMITE, CARDINAL, BSPLINE, NURBS
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, false, NULL, false);
- source.finish();
+ source.prepareToAppendValues();
- return source_id;
+ for (int i = 0; i < tot; i++) {
+ source.appendValues(*v, *(v + 1), *(v + 2));
+ v += 3;
}
- std::string AnimationExporter::fake_interpolation_source(int tot, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
+ source.finish();
- COLLADASW::NameSource source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(tot);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("INTERPOLATION");
+ return source_id;
+}
+
+std::string AnimationExporter::create_interpolation_source(FCurve *fcu, const std::string& anim_id, const char *axis_name, bool *has_tangents)
+{
+ std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
+
+ COLLADASW::NameSource source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(fcu->totvert);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("INTERPOLATION");
+
+ source.prepareToAppendValues();
- source.prepareToAppendValues();
+ *has_tangents = false;
- for (int i = 0; i < tot; i++) {
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ if (fcu->bezt[i].ipo==BEZT_IPO_BEZ) {
+ source.appendValues(BEZIER_NAME);
+ *has_tangents = true;
+ } else if (fcu->bezt[i].ipo==BEZT_IPO_CONST) {
+ source.appendValues(STEP_NAME);
+ } else { // BEZT_IPO_LIN
source.appendValues(LINEAR_NAME);
}
+ }
+ // unsupported? -- HERMITE, CARDINAL, BSPLINE, NURBS
+
+ source.finish();
- source.finish();
+ return source_id;
+}
+
+std::string AnimationExporter::fake_interpolation_source(int tot, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
- return source_id;
+ COLLADASW::NameSource source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(tot);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("INTERPOLATION");
+
+ source.prepareToAppendValues();
+
+ for (int i = 0; i < tot; i++) {
+ source.appendValues(LINEAR_NAME);
}
- std::string AnimationExporter::get_light_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
- {
- std::string tm_name;
- // when given rna_path, determine tm_type from it
- if (rna_path) {
- char *name = extract_transform_name(rna_path);
-
- if (!strcmp(name, "color"))
- tm_type = 1;
- else if (!strcmp(name, "spot_size"))
- tm_type = 2;
- else if (!strcmp(name, "spot_blend"))
- tm_type = 3;
- else if (!strcmp(name, "distance"))
- tm_type = 4;
- else
- tm_type = -1;
- }
+ source.finish();
- switch (tm_type) {
+ return source_id;
+}
+
+std::string AnimationExporter::get_light_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
+{
+ std::string tm_name;
+ // when given rna_path, determine tm_type from it
+ if (rna_path) {
+ char *name = extract_transform_name(rna_path);
+
+ if (!strcmp(name, "color"))
+ tm_type = 1;
+ else if (!strcmp(name, "spot_size"))
+ tm_type = 2;
+ else if (!strcmp(name, "spot_blend"))
+ tm_type = 3;
+ else if (!strcmp(name, "distance"))
+ tm_type = 4;
+ else
+ tm_type = -1;
+ }
+
+ switch (tm_type) {
case 1:
tm_name = "color";
break;
@@ -906,43 +908,43 @@ void AnimationExporter::operator() (Object *ob)
case 4:
tm_name = "blender/blender_dist";
break;
-
+
default:
tm_name = "";
break;
- }
-
- if (tm_name.size()) {
- if (axis_name != "")
- return tm_name + "." + std::string(axis_name);
- else
- return tm_name;
- }
+ }
- return std::string("");
+ if (tm_name.size()) {
+ if (axis_name[0])
+ return tm_name + "." + std::string(axis_name);
+ else
+ return tm_name;
}
-
- std::string AnimationExporter::get_camera_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
- {
- std::string tm_name;
- // when given rna_path, determine tm_type from it
- if (rna_path) {
- char *name = extract_transform_name(rna_path);
-
- if (!strcmp(name, "lens"))
- tm_type = 0;
- else if (!strcmp(name, "ortho_scale"))
- tm_type = 1;
- else if (!strcmp(name, "clip_end"))
- tm_type = 2;
- else if (!strcmp(name, "clip_start"))
- tm_type = 3;
-
- else
- tm_type = -1;
- }
- switch (tm_type) {
+ return std::string("");
+}
+
+std::string AnimationExporter::get_camera_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
+{
+ std::string tm_name;
+ // when given rna_path, determine tm_type from it
+ if (rna_path) {
+ char *name = extract_transform_name(rna_path);
+
+ if (!strcmp(name, "lens"))
+ tm_type = 0;
+ else if (!strcmp(name, "ortho_scale"))
+ tm_type = 1;
+ else if (!strcmp(name, "clip_end"))
+ tm_type = 2;
+ else if (!strcmp(name, "clip_start"))
+ tm_type = 3;
+
+ else
+ tm_type = -1;
+ }
+
+ switch (tm_type) {
case 0:
tm_name = "xfov";
break;
@@ -955,56 +957,56 @@ void AnimationExporter::operator() (Object *ob)
case 3:
tm_name = "znear";
break;
-
+
default:
tm_name = "";
break;
- }
-
- if (tm_name.size()) {
- if (axis_name != "")
- return tm_name + "." + std::string(axis_name);
- else
- return tm_name;
- }
+ }
- return std::string("");
+ if (tm_name.size()) {
+ if (axis_name[0])
+ return tm_name + "." + std::string(axis_name);
+ else
+ return tm_name;
}
- // Assign sid of the animated parameter or transform
- // for rotation, axis name is always appended and the value of append_axis is ignored
- std::string AnimationExporter::get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
- {
- std::string tm_name;
- bool is_rotation =false;
- // when given rna_path, determine tm_type from it
- if (rna_path) {
- char *name = extract_transform_name(rna_path);
-
- if (!strcmp(name, "rotation_euler"))
- tm_type = 0;
- else if (!strcmp(name, "rotation_quaternion"))
- tm_type = 1;
- else if (!strcmp(name, "scale"))
- tm_type = 2;
- else if (!strcmp(name, "location"))
- tm_type = 3;
- else if (!strcmp(name, "specular_hardness"))
- tm_type = 4;
- else if (!strcmp(name, "specular_color"))
- tm_type = 5;
- else if (!strcmp(name, "diffuse_color"))
- tm_type = 6;
- else if (!strcmp(name, "alpha"))
- tm_type = 7;
- else if (!strcmp(name, "ior"))
- tm_type = 8;
-
- else
- tm_type = -1;
- }
+ return std::string("");
+}
- switch (tm_type) {
+// Assign sid of the animated parameter or transform
+// for rotation, axis name is always appended and the value of append_axis is ignored
+std::string AnimationExporter::get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
+{
+ std::string tm_name;
+ bool is_rotation =false;
+ // when given rna_path, determine tm_type from it
+ if (rna_path) {
+ char *name = extract_transform_name(rna_path);
+
+ if (!strcmp(name, "rotation_euler"))
+ tm_type = 0;
+ else if (!strcmp(name, "rotation_quaternion"))
+ tm_type = 1;
+ else if (!strcmp(name, "scale"))
+ tm_type = 2;
+ else if (!strcmp(name, "location"))
+ tm_type = 3;
+ else if (!strcmp(name, "specular_hardness"))
+ tm_type = 4;
+ else if (!strcmp(name, "specular_color"))
+ tm_type = 5;
+ else if (!strcmp(name, "diffuse_color"))
+ tm_type = 6;
+ else if (!strcmp(name, "alpha"))
+ tm_type = 7;
+ else if (!strcmp(name, "ior"))
+ tm_type = 8;
+
+ else
+ tm_type = -1;
+ }
+
+ switch (tm_type) {
case 0:
case 1:
tm_name = "rotation";
@@ -1031,173 +1033,173 @@ void AnimationExporter::operator() (Object *ob)
case 8:
tm_name = "index_of_refraction";
break;
-
+
default:
tm_name = "";
break;
- }
-
- if (tm_name.size()) {
- if (is_rotation)
- return tm_name + std::string(axis_name) + ".ANGLE";
- else
- if (axis_name != "")
- return tm_name + "." + std::string(axis_name);
- else
- return tm_name;
- }
-
- return std::string("");
}
- char* AnimationExporter::extract_transform_name(char *rna_path)
- {
- char *dot = strrchr(rna_path, '.');
- return dot ? (dot + 1) : rna_path;
+ if (tm_name.size()) {
+ if (is_rotation)
+ return tm_name + std::string(axis_name) + ".ANGLE";
+ else
+ if (axis_name[0])
+ return tm_name + "." + std::string(axis_name);
+ else
+ return tm_name;
}
- //find keyframes of all the objects animations
- void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra)
- {
- FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
+ return std::string("");
+}
- for (; fcu; fcu = fcu->next) {
-
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- float f = fcu->bezt[i].vec[1][0]; //
- if (std::find(fra.begin(), fra.end(), f) == fra.end())
- fra.push_back(f);
- }
- }
+char* AnimationExporter::extract_transform_name(char *rna_path)
+{
+ char *dot = strrchr(rna_path, '.');
+ return dot ? (dot + 1) : rna_path;
+}
- // keep the keys in ascending order
- std::sort(fra.begin(), fra.end());
- }
+//find keyframes of all the objects animations
+void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra)
+{
+ FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
-
+ for (; fcu; fcu = fcu->next) {
- // enable fcurves driving a specific bone, disable all the rest
- // if bone_name = NULL enable all fcurves
- void AnimationExporter::enable_fcurves(bAction *act, char *bone_name)
- {
- FCurve *fcu;
- char prefix[200];
-
- if (bone_name)
- BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone_name);
-
- for (fcu = (FCurve*)act->curves.first; fcu; fcu = fcu->next) {
- if (bone_name) {
- if (!strncmp(fcu->rna_path, prefix, strlen(prefix)))
- fcu->flag &= ~FCURVE_DISABLED;
- else
- fcu->flag |= FCURVE_DISABLED;
- }
- else {
- fcu->flag &= ~FCURVE_DISABLED;
- }
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ float f = fcu->bezt[i].vec[1][0];
+ if (std::find(fra.begin(), fra.end(), f) == fra.end())
+ fra.push_back(f);
}
}
-
- bool AnimationExporter::hasAnimations(Scene *sce)
- {
- Base *base= (Base*) sce->base.first;
-
- while(base) {
- Object *ob = base->object;
-
- FCurve *fcu = 0;
- //Check for object transform animations
- if(ob->adt && ob->adt->action)
- fcu = (FCurve*)ob->adt->action->curves.first;
- //Check for Lamp parameter animations
- else if( (ob->type == OB_LAMP ) && ((Lamp*)ob ->data)->adt && ((Lamp*)ob ->data)->adt->action )
- fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first);
- //Check for Camera parameter animations
- else if( (ob->type == OB_CAMERA ) && ((Camera*)ob ->data)->adt && ((Camera*)ob ->data)->adt->action )
- fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first);
-
- //Check Material Effect parameter animations.
- for(int a = 0; a < ob->totcol; a++)
- {
- Material *ma = give_current_material(ob, a+1);
- if (!ma) continue;
- if(ma->adt && ma->adt->action)
- {
- fcu = (FCurve*)ma->adt->action->curves.first;
- }
- }
- if ( fcu)
- return true;
- base= base->next;
+ // keep the keys in ascending order
+ std::sort(fra.begin(), fra.end());
+}
+
+
+
+// enable fcurves driving a specific bone, disable all the rest
+// if bone_name = NULL enable all fcurves
+void AnimationExporter::enable_fcurves(bAction *act, char *bone_name)
+{
+ FCurve *fcu;
+ char prefix[200];
+
+ if (bone_name)
+ BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone_name);
+
+ for (fcu = (FCurve*)act->curves.first; fcu; fcu = fcu->next) {
+ if (bone_name) {
+ if (!strncmp(fcu->rna_path, prefix, strlen(prefix)))
+ fcu->flag &= ~FCURVE_DISABLED;
+ else
+ fcu->flag |= FCURVE_DISABLED;
+ }
+ else {
+ fcu->flag &= ~FCURVE_DISABLED;
}
- return false;
}
+}
- //------------------------------- Not used in the new system.--------------------------------------------------------
- void AnimationExporter::find_rotation_frames(Object *ob, std::vector<float> &fra, const char *prefix, int rotmode)
- {
- if (rotmode > 0)
- find_frames(ob, fra, prefix, "rotation_euler");
- else if (rotmode == ROT_MODE_QUAT)
- find_frames(ob, fra, prefix, "rotation_quaternion");
- /*else if (rotmode == ROT_MODE_AXISANGLE)
- ;*/
- }
+bool AnimationExporter::hasAnimations(Scene *sce)
+{
+ Base *base= (Base*) sce->base.first;
- void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra, const char *prefix, const char *tm_name)
- {
- FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
-
- for (; fcu; fcu = fcu->next) {
- if (prefix && strncmp(prefix, fcu->rna_path, strlen(prefix)))
- continue;
-
- char *name = extract_transform_name(fcu->rna_path);
- if (!strcmp(name, tm_name)) {
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- float f = fcu->bezt[i].vec[1][0]; //
- if (std::find(fra.begin(), fra.end(), f) == fra.end())
- fra.push_back(f);
- }
+ while(base) {
+ Object *ob = base->object;
+
+ FCurve *fcu = 0;
+ //Check for object transform animations
+ if(ob->adt && ob->adt->action)
+ fcu = (FCurve*)ob->adt->action->curves.first;
+ //Check for Lamp parameter animations
+ else if( (ob->type == OB_LAMP ) && ((Lamp*)ob ->data)->adt && ((Lamp*)ob ->data)->adt->action )
+ fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first);
+ //Check for Camera parameter animations
+ else if( (ob->type == OB_CAMERA ) && ((Camera*)ob ->data)->adt && ((Camera*)ob ->data)->adt->action )
+ fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first);
+
+ //Check Material Effect parameter animations.
+ for(int a = 0; a < ob->totcol; a++)
+ {
+ Material *ma = give_current_material(ob, a+1);
+ if (!ma) continue;
+ if(ma->adt && ma->adt->action)
+ {
+ fcu = (FCurve*)ma->adt->action->curves.first;
}
}
- // keep the keys in ascending order
- std::sort(fra.begin(), fra.end());
+ if ( fcu)
+ return true;
+ base= base->next;
}
+ return false;
+}
- void AnimationExporter::write_bone_animation(Object *ob_arm, Bone *bone)
- {
- if (!ob_arm->adt)
- return;
-
- //write bone animations for 3 transform types
- //i=0 --> rotations
- //i=1 --> scale
- //i=2 --> location
- for (int i = 0; i < 3; i++)
- sample_and_write_bone_animation(ob_arm, bone, i);
-
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
- write_bone_animation(ob_arm, child);
+//------------------------------- Not used in the new system.--------------------------------------------------------
+void AnimationExporter::find_rotation_frames(Object *ob, std::vector<float> &fra, const char *prefix, int rotmode)
+{
+ if (rotmode > 0)
+ find_frames(ob, fra, prefix, "rotation_euler");
+ else if (rotmode == ROT_MODE_QUAT)
+ find_frames(ob, fra, prefix, "rotation_quaternion");
+ /*else if (rotmode == ROT_MODE_AXISANGLE)
+ ;*/
+}
+
+void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra, const char *prefix, const char *tm_name)
+{
+ FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
+
+ for (; fcu; fcu = fcu->next) {
+ if (prefix && strncmp(prefix, fcu->rna_path, strlen(prefix)))
+ continue;
+
+ char *name = extract_transform_name(fcu->rna_path);
+ if (!strcmp(name, tm_name)) {
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ float f = fcu->bezt[i].vec[1][0];
+ if (std::find(fra.begin(), fra.end(), f) == fra.end())
+ fra.push_back(f);
+ }
+ }
}
- void AnimationExporter::sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type)
- {
- bArmature *arm = (bArmature*)ob_arm->data;
- int flag = arm->flag;
- std::vector<float> fra;
- char prefix[256];
+ // keep the keys in ascending order
+ std::sort(fra.begin(), fra.end());
+}
- BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone->name);
+void AnimationExporter::write_bone_animation(Object *ob_arm, Bone *bone)
+{
+ if (!ob_arm->adt)
+ return;
+
+ //write bone animations for 3 transform types
+ //i=0 --> rotations
+ //i=1 --> scale
+ //i=2 --> location
+ for (int i = 0; i < 3; i++)
+ sample_and_write_bone_animation(ob_arm, bone, i);
+
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
+ write_bone_animation(ob_arm, child);
+}
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
- if (!pchan)
- return;
- //Fill frame array with key frame values framed at @param:transform_type
- switch (transform_type) {
+void AnimationExporter::sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type)
+{
+ bArmature *arm = (bArmature*)ob_arm->data;
+ int flag = arm->flag;
+ std::vector<float> fra;
+ char prefix[256];
+
+ BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone->name);
+
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
+ if (!pchan)
+ return;
+ //Fill frame array with key frame values framed at @param:transform_type
+ switch (transform_type) {
case 0:
find_rotation_frames(ob_arm, fra, prefix, pchan->rotmode);
break;
@@ -1209,77 +1211,77 @@ void AnimationExporter::operator() (Object *ob)
break;
default:
return;
- }
+ }
- // exit rest position
- if (flag & ARM_RESTPOS) {
- arm->flag &= ~ARM_RESTPOS;
- where_is_pose(scene, ob_arm);
- }
- //v array will hold all values which will be exported.
- if (fra.size()) {
- float *values = (float*)MEM_callocN(sizeof(float) * 3 * fra.size(), "temp. anim frames");
- sample_animation(values, fra, transform_type, bone, ob_arm, pchan);
-
- if (transform_type == 0) {
- // write x, y, z curves separately if it is rotation
- float *axisValues = (float*)MEM_callocN(sizeof(float) * fra.size(), "temp. anim frames");
-
- for (int i = 0; i < 3; i++) {
- for (unsigned int j = 0; j < fra.size(); j++)
- axisValues[j] = values[j * 3 + i];
-
- dae_bone_animation(fra, axisValues, transform_type, i, id_name(ob_arm), bone->name);
- }
- MEM_freeN(axisValues);
- }
- else {
- // write xyz at once if it is location or scale
- dae_bone_animation(fra, values, transform_type, -1, id_name(ob_arm), bone->name);
- }
+ // exit rest position
+ if (flag & ARM_RESTPOS) {
+ arm->flag &= ~ARM_RESTPOS;
+ where_is_pose(scene, ob_arm);
+ }
+ //v array will hold all values which will be exported.
+ if (fra.size()) {
+ float *values = (float*)MEM_callocN(sizeof(float) * 3 * fra.size(), "temp. anim frames");
+ sample_animation(values, fra, transform_type, bone, ob_arm, pchan);
- MEM_freeN(values);
+ if (transform_type == 0) {
+ // write x, y, z curves separately if it is rotation
+ float *axisValues = (float*)MEM_callocN(sizeof(float) * fra.size(), "temp. anim frames");
+
+ for (int i = 0; i < 3; i++) {
+ for (unsigned int j = 0; j < fra.size(); j++)
+ axisValues[j] = values[j * 3 + i];
+
+ dae_bone_animation(fra, axisValues, transform_type, i, id_name(ob_arm), bone->name);
+ }
+ MEM_freeN(axisValues);
+ }
+ else {
+ // write xyz at once if it is location or scale
+ dae_bone_animation(fra, values, transform_type, -1, id_name(ob_arm), bone->name);
}
- // restore restpos
- if (flag & ARM_RESTPOS)
- arm->flag = flag;
- where_is_pose(scene, ob_arm);
+ MEM_freeN(values);
}
- void AnimationExporter::sample_animation(float *v, std::vector<float> &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan)
- {
- bPoseChannel *parchan = NULL;
- bPose *pose = ob_arm->pose;
+ // restore restpos
+ if (flag & ARM_RESTPOS)
+ arm->flag = flag;
+ where_is_pose(scene, ob_arm);
+}
- pchan = get_pose_channel(pose, bone->name);
+void AnimationExporter::sample_animation(float *v, std::vector<float> &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan)
+{
+ bPoseChannel *parchan = NULL;
+ bPose *pose = ob_arm->pose;
- if (!pchan)
- return;
+ pchan = get_pose_channel(pose, bone->name);
- parchan = pchan->parent;
+ if (!pchan)
+ return;
- enable_fcurves(ob_arm->adt->action, bone->name);
+ parchan = pchan->parent;
- std::vector<float>::iterator it;
- for (it = frames.begin(); it != frames.end(); it++) {
- float mat[4][4], ipar[4][4];
+ enable_fcurves(ob_arm->adt->action, bone->name);
- float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
+ std::vector<float>::iterator it;
+ for (it = frames.begin(); it != frames.end(); it++) {
+ float mat[4][4], ipar[4][4];
+ float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
- BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
- where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
- // compute bone local mat
- if (bone->parent) {
- invert_m4_m4(ipar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, ipar);
- }
- else
- copy_m4_m4(mat, pchan->pose_mat);
+ BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
+ where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
+
+ // compute bone local mat
+ if (bone->parent) {
+ invert_m4_m4(ipar, parchan->pose_mat);
+ mul_m4_m4m4(mat, pchan->pose_mat, ipar);
+ }
+ else
+ copy_m4_m4(mat, pchan->pose_mat);
- switch (type) {
+ switch (type) {
case 0:
mat4_to_eul(v, mat);
break;
@@ -1289,12 +1291,10 @@ void AnimationExporter::operator() (Object *ob)
case 2:
copy_v3_v3(v, mat[3]);
break;
- }
-
- v += 3;
}
- enable_fcurves(ob_arm->adt->action, NULL);
+ v += 3;
}
-
+ enable_fcurves(ob_arm->adt->action, NULL);
+}
diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp
index 4a3cd5eeb06..43428f57d4f 100644
--- a/source/blender/collada/AnimationImporter.cpp
+++ b/source/blender/collada/AnimationImporter.cpp
@@ -89,17 +89,11 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
{
COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues();
COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues();
-
- if( curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER ||
- curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP ) {
- COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
- COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
- }
float fps = (float)FPS;
size_t dim = curve->getOutDimension();
unsigned int i;
-
+
std::vector<FCurve*>& fcurves = curve_map[curve->getUniqueId()];
switch (dim) {
@@ -110,18 +104,18 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
{
for (i = 0; i < dim; i++ ) {
FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
-
+
fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
// fcu->rna_path = BLI_strdupn(path, strlen(path));
fcu->array_index = 0;
fcu->totvert = curve->getKeyCount();
-
+
// create beztriple for each key
for (unsigned int j = 0; j < curve->getKeyCount(); j++) {
BezTriple bez;
memset(&bez, 0, sizeof(BezTriple));
-
+
// input, output
bez.vec[1][0] = bc_get_float_value(input, j) * fps;
bez.vec[1][1] = bc_get_float_value(output, j * dim + i);
@@ -131,20 +125,20 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP)
{
COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
- COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
+ COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
// intangent
- bez.vec[0][0] = bc_get_float_value(intan, (j * 2 * dim ) + (2 * i)) * fps;
- bez.vec[0][1] = bc_get_float_value(intan, (j * 2 * dim )+ (2 * i) + 1);
+ bez.vec[0][0] = bc_get_float_value(intan, (j * 2 * dim ) + (2 * i)) * fps;
+ bez.vec[0][1] = bc_get_float_value(intan, (j * 2 * dim )+ (2 * i) + 1);
- // outtangent
- bez.vec[2][0] = bc_get_float_value(outtan, (j * 2 * dim ) + (2 * i)) * fps;
- bez.vec[2][1] = bc_get_float_value(outtan, (j * 2 * dim )+ (2 * i) + 1);
- if(curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER)
+ // outtangent
+ bez.vec[2][0] = bc_get_float_value(outtan, (j * 2 * dim ) + (2 * i)) * fps;
+ bez.vec[2][1] = bc_get_float_value(outtan, (j * 2 * dim )+ (2 * i) + 1);
+ if(curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER)
bez.ipo = BEZT_IPO_BEZ;
- else
- bez.ipo = BEZT_IPO_CONST;
- //bez.h1 = bez.h2 = HD_AUTO;
+ else
+ bez.ipo = BEZT_IPO_CONST;
+ //bez.h1 = bez.h2 = HD_AUTO;
}
else
{
@@ -153,7 +147,7 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
}
// bez.ipo = U.ipo_new; /* use default interpolation mode here... */
bez.f1 = bez.f2 = bez.f3 = SELECT;
-
+
insert_bezt_fcurve(fcu, &bez, 0);
}
@@ -306,9 +300,9 @@ bool AnimationImporter::write_animation(const COLLADAFW::Animation* anim)
bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* animlist)
{
const COLLADAFW::UniqueId& animlist_id = animlist->getUniqueId();
-
+
animlist_map[animlist_id] = animlist;
-
+
#if 0
// should not happen
@@ -317,10 +311,10 @@ bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* ani
}
// for bones rna_path is like: pose.bones["bone-name"].rotation
-
+
#endif
-
+
return true;
}
@@ -433,7 +427,7 @@ virtual void AnimationImporter::change_eul_to_quat(Object *ob, bAction *act)
//sets the rna_path and array index to curve
void AnimationImporter::modify_fcurve(std::vector<FCurve*>* curves , char* rna_path , int array_index )
-{
+{
std::vector<FCurve*>::iterator it;
int i;
for (it = curves->begin(), i = 0; it != curves->end(); it++, i++) {
@@ -450,18 +444,18 @@ void AnimationImporter::modify_fcurve(std::vector<FCurve*>* curves , char* rna_p
void AnimationImporter::find_frames( std::vector<float>* frames , std::vector<FCurve*>* curves)
{
std::vector<FCurve*>::iterator iter;
- for (iter = curves->begin(); iter != curves->end(); iter++) {
- FCurve *fcu = *iter;
-
- for (unsigned int k = 0; k < fcu->totvert; k++) {
- //get frame value from bezTriple
- float fra = fcu->bezt[k].vec[1][0];
- //if frame already not added add frame to frames
- if (std::find(frames->begin(), frames->end(), fra) == frames->end())
- frames->push_back(fra);
-
- }
+ for (iter = curves->begin(); iter != curves->end(); iter++) {
+ FCurve *fcu = *iter;
+
+ for (unsigned int k = 0; k < fcu->totvert; k++) {
+ //get frame value from bezTriple
+ float fra = fcu->bezt[k].vec[1][0];
+ //if frame already not added add frame to frames
+ if (std::find(frames->begin(), frames->end(), fra) == frames->end())
+ frames->push_back(fra);
+
}
+ }
}
//creates the rna_paths and array indices of fcurves from animations using transformation and bound animation class of each animation.
@@ -472,18 +466,18 @@ void AnimationImporter:: Assign_transform_animations(COLLADAFW::Transformation *
COLLADAFW::Transformation::TransformationType tm_type = transform->getTransformationType();
bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
-
+
//to check if the no of curves are valid
bool xyz = ((tm_type == COLLADAFW::Transformation::TRANSLATE ||tm_type == COLLADAFW::Transformation::SCALE) && binding->animationClass == COLLADAFW::AnimationList::POSITION_XYZ);
-
-
+
+
if (!((!xyz && curves->size() == 1) || (xyz && curves->size() == 3) || is_matrix)) {
fprintf(stderr, "expected %d curves, got %d\n", xyz ? 3 : 1, (int)curves->size());
return;
}
-
+
char rna_path[100];
-
+
switch (tm_type) {
case COLLADAFW::Transformation::TRANSLATE:
case COLLADAFW::Transformation::SCALE:
@@ -495,96 +489,96 @@ void AnimationImporter:: Assign_transform_animations(COLLADAFW::Transformation *
BLI_strncpy(rna_path, loc ? "location" : "scale", sizeof(rna_path));
switch (binding->animationClass) {
- case COLLADAFW::AnimationList::POSITION_X:
- modify_fcurve(curves, rna_path, 0 );
- break;
- case COLLADAFW::AnimationList::POSITION_Y:
- modify_fcurve(curves, rna_path, 1 );
- break;
- case COLLADAFW::AnimationList::POSITION_Z:
- modify_fcurve(curves, rna_path, 2 );
- break;
- case COLLADAFW::AnimationList::POSITION_XYZ:
- modify_fcurve(curves, rna_path, -1 );
- break;
- default:
- fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
- binding->animationClass, loc ? "TRANSLATE" : "SCALE");
- }
- break;
+ case COLLADAFW::AnimationList::POSITION_X:
+ modify_fcurve(curves, rna_path, 0 );
+ break;
+ case COLLADAFW::AnimationList::POSITION_Y:
+ modify_fcurve(curves, rna_path, 1 );
+ break;
+ case COLLADAFW::AnimationList::POSITION_Z:
+ modify_fcurve(curves, rna_path, 2 );
+ break;
+ case COLLADAFW::AnimationList::POSITION_XYZ:
+ modify_fcurve(curves, rna_path, -1 );
+ break;
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
+ binding->animationClass, loc ? "TRANSLATE" : "SCALE");
+ }
+ break;
}
-
-
+
+
case COLLADAFW::Transformation::ROTATE:
{
if (is_joint)
BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_euler", joint_path);
else
BLI_strncpy(rna_path, "rotation_euler", sizeof(rna_path));
- std::vector<FCurve*>::iterator iter;
+ std::vector<FCurve*>::iterator iter;
for (iter = curves->begin(); iter != curves->end(); iter++) {
FCurve* fcu = *iter;
-
+
//if transform is rotation the fcurves values must be turned in to radian.
if (is_rotation)
fcurve_deg_to_rad(fcu);
}
COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)transform;
COLLADABU::Math::Vector3& axis = rot->getRotationAxis();
-
+
switch (binding->animationClass) {
- case COLLADAFW::AnimationList::ANGLE:
- if (COLLADABU::Math::Vector3::UNIT_X == axis) {
- modify_fcurve(curves, rna_path, 0 );
- }
- else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
- modify_fcurve(curves, rna_path, 1 );
- }
- else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
- modify_fcurve(curves, rna_path, 2 );
- }
- break;
- case COLLADAFW::AnimationList::AXISANGLE:
- // TODO convert axis-angle to quat? or XYZ?
- default:
- fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
- binding->animationClass);
- }
+ case COLLADAFW::AnimationList::ANGLE:
+ if (COLLADABU::Math::Vector3::UNIT_X == axis) {
+ modify_fcurve(curves, rna_path, 0 );
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
+ modify_fcurve(curves, rna_path, 1 );
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
+ modify_fcurve(curves, rna_path, 2 );
+ }
break;
+ case COLLADAFW::AnimationList::AXISANGLE:
+ // TODO convert axis-angle to quat? or XYZ?
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
+ binding->animationClass);
+ }
+ break;
}
-
+
case COLLADAFW::Transformation::MATRIX:
/*{
- COLLADAFW::Matrix* mat = (COLLADAFW::Matrix*)transform;
- COLLADABU::Math::Matrix4 mat4 = mat->getMatrix();
- switch (binding->animationClass) {
- case COLLADAFW::AnimationList::TRANSFORM:
-
- }
+ COLLADAFW::Matrix* mat = (COLLADAFW::Matrix*)transform;
+ COLLADABU::Math::Matrix4 mat4 = mat->getMatrix();
+ switch (binding->animationClass) {
+ case COLLADAFW::AnimationList::TRANSFORM:
+
+ }
}*/
break;
case COLLADAFW::Transformation::SKEW:
case COLLADAFW::Transformation::LOOKAT:
fprintf(stderr, "Animation of SKEW and LOOKAT transformations is not supported yet.\n");
break;
- }
-
+ }
+
}
//creates the rna_paths and array indices of fcurves from animations using color and bound animation class of each animation.
-void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type)
+void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,const char * anim_type)
{
char rna_path[100];
BLI_strncpy(rna_path,anim_type, sizeof(rna_path));
-
+
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
- //all the curves belonging to the current binding
- std::vector<FCurve*> animcurves;
+ //all the curves belonging to the current binding
+ std::vector<FCurve*> animcurves;
for (unsigned int j = 0; j < bindings.getCount(); j++) {
- animcurves = curve_map[bindings[j].animation];
-
- switch (bindings[j].animationClass) {
+ animcurves = curve_map[bindings[j].animation];
+
+ switch (bindings[j].animationClass) {
case COLLADAFW::AnimationList::COLOR_R:
modify_fcurve(&animcurves, rna_path, 0 );
break;
@@ -598,13 +592,13 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list
case COLLADAFW::AnimationList::COLOR_RGBA: // to do-> set intensity
modify_fcurve(&animcurves, rna_path, -1 );
break;
-
+
default:
fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
- bindings[j].animationClass, "COLOR" );
+ bindings[j].animationClass, "COLOR" );
}
- std::vector<FCurve*>::iterator iter;
+ std::vector<FCurve*>::iterator iter;
//Add the curves of the current animation to the object
for (iter = animcurves.begin(); iter != animcurves.end(); iter++) {
FCurve * fcu = *iter;
@@ -612,10 +606,10 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list
}
}
-
+
}
-void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type)
+void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type)
{
char rna_path[100];
if (animlist_map.find(listid) == animlist_map.end()) return ;
@@ -625,7 +619,7 @@ void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& list
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
//all the curves belonging to the current binding
- std::vector<FCurve*> animcurves;
+ std::vector<FCurve*> animcurves;
for (unsigned int j = 0; j < bindings.getCount(); j++) {
animcurves = curve_map[bindings[j].animation];
@@ -671,28 +665,28 @@ void AnimationImporter::apply_matrix_curves( Object * ob, std::vector<FCurve*>&
copy_m4_m4(rest, bone->arm_mat);
invert_m4_m4(irest, rest);
}
- // new curves to assign matrix transform animation
+ // new curves to assign matrix transform animation
FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale
unsigned int totcu = 10 ;
- const char *tm_str = NULL;
+ const char *tm_str = NULL;
char rna_path[200];
for (int i = 0; i < totcu; i++) {
int axis = i;
- if (i < 4) {
- tm_str = "rotation_quaternion";
- axis = i;
- }
- else if (i < 7) {
- tm_str = "location";
- axis = i - 4;
- }
- else {
- tm_str = "scale";
- axis = i - 7;
- }
-
+ if (i < 4) {
+ tm_str = "rotation_quaternion";
+ axis = i;
+ }
+ else if (i < 7) {
+ tm_str = "location";
+ axis = i - 4;
+ }
+ else {
+ tm_str = "scale";
+ axis = i - 7;
+ }
+
if (is_joint)
BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str);
@@ -702,11 +696,11 @@ void AnimationImporter::apply_matrix_curves( Object * ob, std::vector<FCurve*>&
newcu[i]->totvert = frames.size();
}
- if (frames.size() == 0)
+ if (frames.size() == 0)
return;
-std::sort(frames.begin(), frames.end());
-
+ std::sort(frames.begin(), frames.end());
+
std::vector<float>::iterator it;
// sample values at each frame
@@ -717,7 +711,7 @@ std::sort(frames.begin(), frames.end());
float matfra[4][4];
unit_m4(matfra);
-
+
// calc object-space mat
evaluate_transform_at_frame(matfra, node, fra);
@@ -743,23 +737,23 @@ std::sort(frames.begin(), frames.end());
}
float rot[4], loc[3], scale[3];
-
- mat4_to_quat(rot, mat);
- /*for ( int i = 0 ; i < 4 ; i ++ )
- {
- rot[i] = rot[i] * (180 / M_PI);
- }*/
- copy_v3_v3(loc, mat[3]);
- mat4_to_size(scale, mat);
-
+
+ mat4_to_quat(rot, mat);
+ /*for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ rot[i] = rot[i] * (180 / M_PI);
+ }*/
+ copy_v3_v3(loc, mat[3]);
+ mat4_to_size(scale, mat);
+
// add keys
for (int i = 0; i < totcu; i++) {
- if (i < 4)
- add_bezt(newcu[i], fra, rot[i]);
- else if (i < 7)
- add_bezt(newcu[i], fra, loc[i - 4]);
- else
- add_bezt(newcu[i], fra, scale[i - 7]);
+ if (i < 4)
+ add_bezt(newcu[i], fra, rot[i]);
+ else if (i < 7)
+ add_bezt(newcu[i], fra, loc[i - 4]);
+ else
+ add_bezt(newcu[i], fra, scale[i - 7]);
}
}
verify_adt_action((ID*)&ob->id, 1);
@@ -774,13 +768,13 @@ std::sort(frames.begin(), frames.end());
BLI_addtail(curves, newcu[i]);
}
- if (is_joint) {
- bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
- chan->rotmode = ROT_MODE_QUAT;
- }
- else {
- ob->rotmode = ROT_MODE_QUAT;
- }
+ if (is_joint) {
+ bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
+ chan->rotmode = ROT_MODE_QUAT;
+ }
+ else {
+ ob->rotmode = ROT_MODE_QUAT;
+ }
return;
@@ -803,25 +797,24 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
}
bAction * act;
- bActionGroup *grp = NULL;
-
+
if ( (animType->transform) != 0 )
{
- const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL;
- char joint_path[200];
+ const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL;
+ char joint_path[200];
if ( is_joint )
- armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
-
-
+ armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
+
+
if (!ob->adt || !ob->adt->action) act = verify_adt_action((ID*)&ob->id, 1);
else act = ob->adt->action;
-
- //Get the list of animation curves of the object
- ListBase *AnimCurves = &(act->curves);
+
+ //Get the list of animation curves of the object
+ ListBase *AnimCurves = &(act->curves);
const COLLADAFW::TransformationPointerArray& nodeTransforms = node->getTransformations();
-
+
//for each transformation in node
for (unsigned int i = 0; i < nodeTransforms.getCount(); i++) {
COLLADAFW::Transformation *transform = nodeTransforms[i];
@@ -829,10 +822,10 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
-
+
const COLLADAFW::UniqueId& listid = transform->getAnimationList();
-
- //check if transformation has animations
+
+ //check if transformation has animations
if (animlist_map.find(listid) == animlist_map.end()) continue ;
else
{
@@ -840,25 +833,25 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
//all the curves belonging to the current binding
- std::vector<FCurve*> animcurves;
+ std::vector<FCurve*> animcurves;
for (unsigned int j = 0; j < bindings.getCount(); j++) {
- animcurves = curve_map[bindings[j].animation];
- if ( is_matrix )
- apply_matrix_curves(ob, animcurves, root , node, transform );
- else {
+ animcurves = curve_map[bindings[j].animation];
+ if ( is_matrix )
+ apply_matrix_curves(ob, animcurves, root , node, transform );
+ else {
//calculate rnapaths and array index of fcurves according to transformation and animation class
- Assign_transform_animations(transform, &bindings[j], &animcurves, is_joint, joint_path );
-
- std::vector<FCurve*>::iterator iter;
- //Add the curves of the current animation to the object
- for (iter = animcurves.begin(); iter != animcurves.end(); iter++) {
- FCurve * fcu = *iter;
- if ((ob->type == OB_ARMATURE))
- add_bone_fcurve( ob, node , fcu );
- else
- BLI_addtail(AnimCurves, fcu);
- }
+ Assign_transform_animations(transform, &bindings[j], &animcurves, is_joint, joint_path );
+
+ std::vector<FCurve*>::iterator iter;
+ //Add the curves of the current animation to the object
+ for (iter = animcurves.begin(); iter != animcurves.end(); iter++) {
+ FCurve * fcu = *iter;
+ if ((ob->type == OB_ARMATURE))
+ add_bone_fcurve( ob, node , fcu );
+ else
+ BLI_addtail(AnimCurves, fcu);
}
+ }
}
}
if (is_rotation) {
@@ -880,7 +873,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
Lamp * lamp = (Lamp*) ob->data;
if (!lamp->adt || !lamp->adt->action) act = verify_adt_action((ID*)&lamp->id, 1);
- else act = lamp->adt->action;
+ else act = lamp->adt->action;
ListBase *AnimCurves = &(act->curves);
const COLLADAFW::InstanceLightPointerArray& nodeLights = node->getInstanceLights();
@@ -892,23 +885,23 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
{
const COLLADAFW::Color *col = &(light->getColor());
const COLLADAFW::UniqueId& listid = col->getAnimationList();
-
+
Assign_color_animations(listid, AnimCurves, "color");
}
if ((animType->light & LIGHT_FOA) != 0 )
{
const COLLADAFW::AnimatableFloat *foa = &(light->getFallOffAngle());
const COLLADAFW::UniqueId& listid = foa->getAnimationList();
-
+
Assign_float_animations( listid ,AnimCurves, "spot_size");
}
if ( (animType->light & LIGHT_FOE) != 0 )
{
const COLLADAFW::AnimatableFloat *foe = &(light->getFallOffExponent());
const COLLADAFW::UniqueId& listid = foe->getAnimationList();
-
+
Assign_float_animations( listid ,AnimCurves, "spot_blend");
-
+
}
}
}
@@ -918,7 +911,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
Camera * camera = (Camera*) ob->data;
if (!camera->adt || !camera->adt->action) act = verify_adt_action((ID*)&camera->id, 1);
- else act = camera->adt->action;
+ else act = camera->adt->action;
ListBase *AnimCurves = &(act->curves);
const COLLADAFW::InstanceCameraPointerArray& nodeCameras= node->getInstanceCameras();
@@ -957,12 +950,12 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
}
}
if ( animType->material != 0){
- Material *ma = give_current_material(ob, 1);
- if (!ma->adt || !ma->adt->action) act = verify_adt_action((ID*)&ma->id, 1);
- else act = ma->adt->action;
+ Material *ma = give_current_material(ob, 1);
+ if (!ma->adt || !ma->adt->action) act = verify_adt_action((ID*)&ma->id, 1);
+ else act = ma->adt->action;
ListBase *AnimCurves = &(act->curves);
-
+
const COLLADAFW::InstanceGeometryPointerArray& nodeGeoms = node->getInstanceGeometries();
for (unsigned int i = 0; i < nodeGeoms.getCount(); i++) {
const COLLADAFW::MaterialBindingArray& matBinds = nodeGeoms[i]->getMaterialBindings();
@@ -988,7 +981,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
const COLLADAFW::UniqueId& listid = cot->getColor().getAnimationList();
Assign_color_animations( listid, AnimCurves , "specular_color" );
}
-
+
if((animType->material & MATERIAL_DIFF_COLOR) != 0){
const COLLADAFW::ColorOrTexture *cot = &(efc->getDiffuse());
const COLLADAFW::UniqueId& listid = cot->getColor().getAnimationList();
@@ -1005,15 +998,15 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object*> FW_object_map)
{
AnimMix *types = new AnimMix();
-
+
const COLLADAFW::TransformationPointerArray& nodeTransforms = node->getTransformations();
-
+
//for each transformation in node
for (unsigned int i = 0; i < nodeTransforms.getCount(); i++) {
COLLADAFW::Transformation *transform = nodeTransforms[i];
const COLLADAFW::UniqueId& listid = transform->getAnimationList();
-
- //check if transformation has animations
+
+ //check if transformation has animations
if (animlist_map.find(listid) == animlist_map.end()) continue ;
else
{
@@ -1028,9 +1021,9 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
types->light = setAnimType(&(light->getColor()),(types->light), LIGHT_COLOR);
types->light = setAnimType(&(light->getFallOffAngle()),(types->light), LIGHT_FOA);
types->light = setAnimType(&(light->getFallOffExponent()),(types->light), LIGHT_FOE);
-
+
if ( types->light != 0) break;
-
+
}
const COLLADAFW::InstanceCameraPointerArray& nodeCameras = node->getInstanceCameras();
@@ -1039,9 +1032,9 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
if ( camera->getCameraType() == COLLADAFW::Camera::PERSPECTIVE )
{
- types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XFOV);
+ types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XFOV);
}
- else
+ else
{
types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XMAG);
}
@@ -1059,12 +1052,14 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
const COLLADAFW::UniqueId & matuid = matBinds[j].getReferencedMaterial();
const COLLADAFW::Effect *ef = (COLLADAFW::Effect *) (FW_object_map[matuid]);
const COLLADAFW::CommonEffectPointerArray& commonEffects = ef->getCommonEffects();
- COLLADAFW::EffectCommon *efc = commonEffects[0];
- types->material = setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS);
- types->material = setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR);
- types->material = setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR);
- // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY);
- types->material = setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR);
+ if(!commonEffects.empty()) {
+ COLLADAFW::EffectCommon *efc = commonEffects[0];
+ types->material = setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS);
+ types->material = setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR);
+ types->material = setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR);
+ // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY);
+ types->material = setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR);
+ }
}
}
return types;
@@ -1101,7 +1096,7 @@ void AnimationImporter::find_frames_old(std::vector<float> * frames, COLLADAFW::
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
+
if (bindings.getCount()) {
//for each AnimationBinding get the fcurves which animate the transform
for (unsigned int j = 0; j < bindings.getCount(); j++) {
@@ -1113,7 +1108,7 @@ void AnimationImporter::find_frames_old(std::vector<float> * frames, COLLADAFW::
for (iter = curves.begin(); iter != curves.end(); iter++) {
FCurve *fcu = *iter;
-
+
//if transform is rotation the fcurves values must be turned in to radian.
if (is_rotation)
fcurve_deg_to_rad(fcu);
@@ -1448,9 +1443,9 @@ bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float
COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
if (type != COLLADAFW::Transformation::ROTATE &&
- type != COLLADAFW::Transformation::SCALE &&
- type != COLLADAFW::Transformation::TRANSLATE &&
- type != COLLADAFW::Transformation::MATRIX) {
+ type != COLLADAFW::Transformation::SCALE &&
+ type != COLLADAFW::Transformation::TRANSLATE &&
+ type != COLLADAFW::Transformation::MATRIX) {
fprintf(stderr, "animation of transformation %d is not supported yet\n", type);
return false;
}
@@ -1572,7 +1567,7 @@ bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float
COLLADAFW::Matrix tm(matrix);
dae_matrix_to_mat4(&tm, mat);
-
+
std::vector<FCurve*>::iterator it;
return true;
diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h
index 18303eb2f0b..9e8f7b42069 100644
--- a/source/blender/collada/AnimationImporter.h
+++ b/source/blender/collada/AnimationImporter.h
@@ -88,7 +88,7 @@ private:
void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated);
int typeFlag;
-
+
enum lightAnim
{
// INANIMATE = 0,
@@ -144,7 +144,7 @@ public:
#if 0
virtual void change_eul_to_quat(Object *ob, bAction *act);
#endif
-
+
void translate_Animations( COLLADAFW::Node * Node ,
std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
std::map<COLLADAFW::UniqueId, Object*>& object_map ,
@@ -159,9 +159,9 @@ public:
const COLLADAFW::AnimationList::AnimationBinding * binding,
std::vector<FCurve*>* curves, bool is_joint, char * joint_path);
- void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type);
- void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type);
-
+ void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type);
+ void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type);
+
int setAnimType ( const COLLADAFW::Animatable * prop , int type, int addition);
void modify_fcurve(std::vector<FCurve*>* curves , char* rna_path , int array_index );
@@ -206,5 +206,5 @@ public:
void extra_data_importer(std::string elementName);
};
-
- #endif
+
+#endif
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index 92d06bb639f..431c67833f1 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -49,7 +49,7 @@
// XXX exporter writes wrong data for shared armatures. A separate
// controller should be written for each armature-mesh binding how do
// we make controller ids then?
-ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryControllers(sw) {}
+ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryControllers(sw), export_settings(export_settings) {}
// write bone nodes
void ArmatureExporter::add_armature_bones(Object *ob_arm, Scene *sce)
@@ -90,14 +90,14 @@ void ArmatureExporter::add_instance_controller(Object *ob)
ins.add();
}
-void ArmatureExporter::export_controllers(Scene *sce, bool export_selected)
+void ArmatureExporter::export_controllers(Scene *sce)
{
scene = sce;
openLibrary();
GeometryFunctor gf;
- gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this, export_selected);
+ gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
@@ -188,7 +188,7 @@ void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm)
for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) {
add_bone_node(child, ob_arm);
}
- node.end();
+ node.end();
//}
}
diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h
index b3441c797e8..554a8a7cfe6 100644
--- a/source/blender/collada/ArmatureExporter.h
+++ b/source/blender/collada/ArmatureExporter.h
@@ -47,16 +47,15 @@
#include "TransformWriter.h"
#include "InstanceWriter.h"
+#include "ExportSettings.h"
+
// XXX exporter writes wrong data for shared armatures. A separate
// controller should be written for each armature-mesh binding how do
// we make controller ids then?
class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter
{
-private:
- Scene *scene;
-
public:
- ArmatureExporter(COLLADASW::StreamWriter *sw);
+ ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
// write bone nodes
void add_armature_bones(Object *ob_arm, Scene *sce);
@@ -65,13 +64,14 @@ public:
void add_instance_controller(Object *ob);
- void export_controllers(Scene *sce, bool export_selected);
+ void export_controllers(Scene *sce);
void operator()(Object *ob);
private:
-
+ Scene *scene;
UnitConverter converter;
+ const ExportSettings *export_settings;
#if 0
std::vector<Object*> written_armatures;
@@ -119,25 +119,4 @@ private:
Object *ob_arm, ListBase *defbase);
};
-/*
-struct GeometryFunctor {
- // f should have
- // void operator()(Object* ob)
- template<class Functor>
- void forEachMeshObjectInScene(Scene *sce, Functor &f)
- {
-
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_MESH && ob->data) {
- f(ob);
- }
- base= base->next;
-
- }
- }
-};*/
-
#endif
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index 2ec8ae540d2..ae25d343d36 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -87,7 +87,7 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
if ( it != finished_joints.end()) return;
float mat[4][4];
- float obmat[4][4];
+ float obmat[4][4];
// object-space
get_node_mat(obmat, node, NULL, NULL);
@@ -95,8 +95,6 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
EditBone *bone = ED_armature_edit_bone_add((bArmature*)ob_arm->data, (char*)bc_get_joint_name(node));
totbone++;
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, (char*)bc_get_joint_name(node));
-
if (parent) bone->parent = parent;
float angle = 0;
@@ -280,8 +278,6 @@ void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW:
copy_m4_m4(leaf.mat, mat);
BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name));
- float vec[3];
-
TagsMap::iterator etit;
ExtraTags *et = 0;
etit = uid_tags_map.find(node->getUniqueId().toAscii());
@@ -296,7 +292,7 @@ void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW:
et->setData("tip_z",&z);
float vec[3] = {x,y,z};
copy_v3_v3(leaf.bone->tail, leaf.bone->head);
- add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
+ add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
}else
leaf_bones.push_back(leaf);
}
@@ -579,9 +575,8 @@ void ArmatureImporter::set_pose ( Object * ob_arm , COLLADAFW::Node * root_node
float mat[4][4];
float obmat[4][4];
- bArmature * arm = (bArmature * ) ob_arm-> data ;
float ax[3];
- float angle = NULL;
+ float angle = 0.0f;
// object-space
get_node_mat(obmat, root_node, NULL, NULL);
diff --git a/source/blender/collada/ArmatureImporter.h b/source/blender/collada/ArmatureImporter.h
index 4f4aed210f2..a197e612a87 100644
--- a/source/blender/collada/ArmatureImporter.h
+++ b/source/blender/collada/ArmatureImporter.h
@@ -115,7 +115,7 @@ private:
void fix_leaf_bones();
- void set_pose ( Object * ob_arm , COLLADAFW::Node * root_node ,char * parentname, float parent_mat[][4]);
+ void set_pose ( Object * ob_arm , COLLADAFW::Node * root_node ,char * parentname, float parent_mat[][4]);
#if 0
@@ -171,7 +171,7 @@ public:
// gives a world-space mat
bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint);
-
+
void set_tags_map( TagsMap& tags_map);
};
diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt
index ffe3d5f4f85..2ee34091fc9 100644
--- a/source/blender/collada/CMakeLists.txt
+++ b/source/blender/collada/CMakeLists.txt
@@ -51,6 +51,8 @@ set(SRC
DocumentExporter.cpp
DocumentImporter.cpp
EffectExporter.cpp
+ ErrorHandler.cpp
+ ExportSettings.cpp
ExtraHandler.cpp
ExtraTags.cpp
GeometryExporter.cpp
@@ -60,6 +62,7 @@ set(SRC
MaterialExporter.cpp
MeshImporter.cpp
SkinInfo.cpp
+ SceneExporter.cpp
TransformReader.cpp
TransformWriter.cpp
collada.cpp
@@ -74,6 +77,8 @@ set(SRC
DocumentExporter.h
DocumentImporter.h
EffectExporter.h
+ ErrorHandler.h
+ ExportSettings.h
ExtraHandler.h
ExtraTags.h
GeometryExporter.h
@@ -83,6 +88,7 @@ set(SRC
MaterialExporter.h
MeshImporter.h
SkinInfo.h
+ SceneExporter.h
TransformReader.h
TransformWriter.h
collada.h
diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp
index a935f45c403..542409072f1 100644
--- a/source/blender/collada/CameraExporter.cpp
+++ b/source/blender/collada/CameraExporter.cpp
@@ -39,7 +39,7 @@
#include "collada_internal.h"
-CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){}
+CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryCameras(sw), export_settings(export_settings) {}
template<class Functor>
void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected)
@@ -56,11 +56,11 @@ void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected)
}
}
-void CamerasExporter::exportCameras(Scene *sce, bool export_selected)
+void CamerasExporter::exportCameras(Scene *sce)
{
openLibrary();
- forEachCameraObjectInScene(sce, *this, export_selected);
+ forEachCameraObjectInScene(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/CameraExporter.h b/source/blender/collada/CameraExporter.h
index 999a6ddd3e5..8d08fe23f80 100644
--- a/source/blender/collada/CameraExporter.h
+++ b/source/blender/collada/CameraExporter.h
@@ -36,12 +36,16 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class CamerasExporter: COLLADASW::LibraryCameras
{
public:
- CamerasExporter(COLLADASW::StreamWriter *sw);
- void exportCameras(Scene *sce, bool export_selected);
+ CamerasExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportCameras(Scene *sce);
void operator()(Object *ob, Scene *sce);
+private:
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp
index 6e780889d16..d562e51b922 100644
--- a/source/blender/collada/DocumentExporter.cpp
+++ b/source/blender/collada/DocumentExporter.cpp
@@ -34,6 +34,7 @@ extern "C"
{
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "DNA_group_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_mesh_types.h"
#include "DNA_image_types.h"
@@ -104,15 +105,18 @@ extern char build_rev[];
#include "COLLADASWConstants.h"
#include "COLLADASWLibraryControllers.h"
#include "COLLADASWInstanceController.h"
+#include "COLLADASWInstanceNode.h"
#include "COLLADASWBaseInputElement.h"
#include "collada_internal.h"
#include "DocumentExporter.h"
+#include "ExportSettings.h"
// can probably go after refactor is complete
#include "InstanceWriter.h"
#include "TransformWriter.h"
+#include "SceneExporter.h"
#include "ArmatureExporter.h"
#include "AnimationExporter.h"
#include "CameraExporter.h"
@@ -142,170 +146,13 @@ char *bc_CustomData_get_active_layer_name(const CustomData *data, int type)
return data->layers[layer_index].name;
}
-
-/*
- Utilities to avoid code duplication.
- Definition can take some time to understand, but they should be useful.
-*/
-
-
-template<class Functor>
-void forEachObjectInScene(Scene *sce, Functor &f)
-{
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- f(ob);
-
- base= base->next;
- }
-}
-
-
-
-class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter
-{
- ArmatureExporter *arm_exporter;
-public:
- SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) : COLLADASW::LibraryVisualScenes(sw),
- arm_exporter(arm) {}
-
- void exportScene(Scene *sce, bool export_selected) {
- // <library_visual_scenes> <visual_scene>
- std::string id_naming = id_name(sce);
- openVisualScene(translate_id(id_naming), id_naming);
-
- // write <node>s
- //forEachMeshObjectInScene(sce, *this);
- //forEachCameraObjectInScene(sce, *this);
- //forEachLampObjectInScene(sce, *this);
- exportHierarchy(sce, export_selected);
-
- // </visual_scene> </library_visual_scenes>
- closeVisualScene();
-
- closeLibrary();
- }
-
- void exportHierarchy(Scene *sce, bool export_selected)
- {
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (!ob->parent) {
- if(sce->lay & ob->lay) {
- switch(ob->type) {
- case OB_MESH:
- case OB_CAMERA:
- case OB_LAMP:
- case OB_ARMATURE:
- case OB_EMPTY:
- if (export_selected && !(ob->flag & SELECT)) {
- break;
- }
- // write nodes....
- writeNodes(ob, sce);
- break;
- }
- }
- }
-
- base= base->next;
- }
- }
-
-
- // called for each object
- //void operator()(Object *ob) {
- void writeNodes(Object *ob, Scene *sce)
- {
- COLLADASW::Node node(mSW);
- node.setNodeId(translate_id(id_name(ob)));
- node.setType(COLLADASW::Node::NODE);
-
- node.start();
-
- bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob);
-
- if (ob->type == OB_MESH && is_skinned_mesh)
- // for skinned mesh we write obmat in <bind_shape_matrix>
- TransformWriter::add_node_transform_identity(node);
- else
- TransformWriter::add_node_transform_ob(node, ob);
-
- // <instance_geometry>
- if (ob->type == OB_MESH) {
- if (is_skinned_mesh) {
- arm_exporter->add_instance_controller(ob);
- }
- else {
- COLLADASW::InstanceGeometry instGeom(mSW);
- instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
-
- InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob);
-
- instGeom.add();
- }
- }
-
- // <instance_controller>
- else if (ob->type == OB_ARMATURE) {
- arm_exporter->add_armature_bones(ob, sce);
-
- // XXX this looks unstable...
- node.end();
- }
-
- // <instance_camera>
- else if (ob->type == OB_CAMERA) {
- COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
- instCam.add();
- }
-
- // <instance_light>
- else if (ob->type == OB_LAMP) {
- COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
- instLa.add();
- }
-
- // empty object
- else if (ob->type == OB_EMPTY) {
- }
-
- // write nodes for child objects
- Base *b = (Base*) sce->base.first;
- while(b) {
- // cob - child object
- Object *cob = b->object;
-
- if (cob->parent == ob) {
- switch(cob->type) {
- case OB_MESH:
- case OB_CAMERA:
- case OB_LAMP:
- case OB_EMPTY:
- case OB_ARMATURE:
- // write node...
- writeNodes(cob, sce);
- break;
- }
- }
-
- b = b->next;
- }
-
- if (ob->type != OB_ARMATURE)
- node.end();
- }
-};
+DocumentExporter::DocumentExporter(const ExportSettings *export_settings) : export_settings(export_settings) {}
// TODO: it would be better to instantiate animations rather than create a new one per object
// COLLADA allows this through multiple <channel>s in <animation>.
// For this to work, we need to know objects that use a certain action.
-void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool selected)
+void DocumentExporter::exportCurrentScene(Scene *sce)
{
PointerRNA sceneptr, unit_settings;
PropertyRNA *system; /* unused , *scale; */
@@ -313,7 +160,7 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
clear_global_id_map();
COLLADABU::NativeString native_filename =
- COLLADABU::NativeString(std::string(filename));
+ COLLADABU::NativeString(std::string(this->export_settings->filepath));
COLLADASW::StreamWriter sw(native_filename);
// open <collada>
@@ -383,32 +230,32 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
// <library_cameras>
if(has_object_type(sce, OB_CAMERA)) {
- CamerasExporter ce(&sw);
- ce.exportCameras(sce, selected);
+ CamerasExporter ce(&sw, this->export_settings);
+ ce.exportCameras(sce);
}
// <library_lights>
if(has_object_type(sce, OB_LAMP)) {
- LightsExporter le(&sw);
- le.exportLights(sce, selected);
+ LightsExporter le(&sw, this->export_settings);
+ le.exportLights(sce);
}
// <library_images>
- ImagesExporter ie(&sw, filename);
- ie.exportImages(sce, selected);
+ ImagesExporter ie(&sw, this->export_settings);
+ ie.exportImages(sce);
// <library_effects>
- EffectsExporter ee(&sw);
- ee.exportEffects(sce, selected);
+ EffectsExporter ee(&sw, this->export_settings);
+ ee.exportEffects(sce);
// <library_materials>
- MaterialsExporter me(&sw);
- me.exportMaterials(sce, selected);
+ MaterialsExporter me(&sw, this->export_settings);
+ me.exportMaterials(sce);
// <library_geometries>
if(has_object_type(sce, OB_MESH)) {
- GeometryExporter ge(&sw);
- ge.exportGeom(sce, selected);
+ GeometryExporter ge(&sw, this->export_settings);
+ ge.exportGeom(sce);
}
// <library_animations>
@@ -416,14 +263,14 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
ae.exportAnimations(sce);
// <library_controllers>
- ArmatureExporter arm_exporter(&sw);
+ ArmatureExporter arm_exporter(&sw, this->export_settings);
if(has_object_type(sce, OB_ARMATURE)) {
- arm_exporter.export_controllers(sce, selected);
+ arm_exporter.export_controllers(sce);
}
// <library_visual_scenes>
- SceneExporter se(&sw, &arm_exporter);
- se.exportScene(sce, selected);
+ SceneExporter se(&sw, &arm_exporter, this->export_settings);
+ se.exportScene(sce);
// <scene>
std::string scene_name(translate_id(id_name(sce)));
diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h
index 923313c4ed9..83724505efa 100644
--- a/source/blender/collada/DocumentExporter.h
+++ b/source/blender/collada/DocumentExporter.h
@@ -29,13 +29,18 @@
#ifndef __DOCUMENTEXPORTER_H__
#define __DOCUMENTEXPORTER_H__
+#include "ExportSettings.h"
+
struct Scene;
class DocumentExporter
{
public:
- void exportCurrentScene(Scene *sce, const char* filename, bool selected);
+ DocumentExporter(const ExportSettings *export_settings);
+ void exportCurrentScene(Scene *sce);
void exportScenes(const char* filename);
+private:
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index 3a92c95e7ee..366837421e3 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -76,6 +76,7 @@
#include "MEM_guardedalloc.h"
#include "ExtraHandler.h"
+#include "ErrorHandler.h"
#include "DocumentImporter.h"
#include "TransformReader.h"
@@ -113,17 +114,19 @@ DocumentImporter::~DocumentImporter()
bool DocumentImporter::import()
{
- /** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */
- COLLADASaxFWL::Loader loader;
+ ErrorHandler errorHandler;
+ COLLADASaxFWL::Loader loader(&errorHandler);
COLLADAFW::Root root(&loader, this);
ExtraHandler *ehandler = new ExtraHandler(this, &(this->anim_importer));
loader.registerExtraDataCallbackHandler(ehandler);
-
if (!root.loadDocument(mFilename))
return false;
+ if(errorHandler.hasError())
+ return false;
+
/** TODO set up scene graph and such here */
mImportStage = Controller;
@@ -240,15 +243,15 @@ void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW
root_map[node->getUniqueId()] = root_map[par->getUniqueId()];
}
- COLLADAFW::Transformation::TransformationType types[] = {
+ /*COLLADAFW::Transformation::TransformationType types[] = {
COLLADAFW::Transformation::ROTATE,
COLLADAFW::Transformation::SCALE,
COLLADAFW::Transformation::TRANSLATE,
COLLADAFW::Transformation::MATRIX
};
+ Object *ob;*/
unsigned int i;
- Object *ob;
//for (i = 0; i < 4; i++)
//ob =
@@ -410,18 +413,15 @@ void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *paren
while (geom_done < geom.getCount()) {
ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map,
material_texture_mapping_map);
- if ( ob != NULL )
- ++geom_done;
+ ++geom_done;
}
while (camera_done < camera.getCount()) {
ob = create_camera_object(camera[camera_done], sce);
- if ( ob != NULL )
- ++camera_done;
+ ++camera_done;
}
while (lamp_done < lamp.getCount()) {
ob = create_lamp_object(lamp[lamp_done], sce);
- if ( ob != NULL )
- ++lamp_done;
+ ++lamp_done;
}
while (controller_done < controller.getCount()) {
COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[controller_done];
diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp
index 355e384d000..ed37dada195 100644
--- a/source/blender/collada/EffectExporter.cpp
+++ b/source/blender/collada/EffectExporter.cpp
@@ -55,7 +55,7 @@ static std::string getActiveUVLayerName(Object *ob)
return "";
}
-EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){}
+EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryEffects(sw), export_settings(export_settings) {}
bool EffectsExporter::hasEffects(Scene *sce)
{
@@ -78,12 +78,12 @@ bool EffectsExporter::hasEffects(Scene *sce)
return false;
}
-void EffectsExporter::exportEffects(Scene *sce, bool export_selected)
+void EffectsExporter::exportEffects(Scene *sce)
{
if(hasEffects(sce)) {
openLibrary();
MaterialFunctor mf;
- mf.forEachMaterialInScene<EffectsExporter>(sce, *this, export_selected);
+ mf.forEachMaterialInScene<EffectsExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h
index 86143ae4d07..dc1f4c4474b 100644
--- a/source/blender/collada/EffectExporter.h
+++ b/source/blender/collada/EffectExporter.h
@@ -43,11 +43,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class EffectsExporter: COLLADASW::LibraryEffects
{
public:
- EffectsExporter(COLLADASW::StreamWriter *sw);
- void exportEffects(Scene *sce, bool export_selected);
+ EffectsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportEffects(Scene *sce);
void operator()(Material *ma, Object *ob);
@@ -66,6 +68,8 @@ private:
void writePhong(COLLADASW::EffectProfile &ep, Material *ma);
bool hasEffects(Scene *sce);
+
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/ErrorHandler.cpp b/source/blender/collada/ErrorHandler.cpp
new file mode 100644
index 00000000000..7108dbad18a
--- /dev/null
+++ b/source/blender/collada/ErrorHandler.cpp
@@ -0,0 +1,90 @@
+/*
+ * $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): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ErrorHandler.cpp
+ * \ingroup collada
+ */
+#include "ErrorHandler.h"
+#include <iostream>
+
+#include "COLLADASaxFWLIError.h"
+#include "COLLADASaxFWLSaxParserError.h"
+#include "COLLADASaxFWLSaxFWLError.h"
+
+#include "GeneratedSaxParserParserError.h"
+
+#include <string.h>
+
+//--------------------------------------------------------------------
+ErrorHandler::ErrorHandler() : mError(false)
+{
+}
+
+//--------------------------------------------------------------------
+ErrorHandler::~ErrorHandler()
+{
+}
+
+//--------------------------------------------------------------------
+bool ErrorHandler::handleError( const COLLADASaxFWL::IError* error )
+{
+ if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXPARSER )
+ {
+ COLLADASaxFWL::SaxParserError* saxParserError = (COLLADASaxFWL::SaxParserError*) error;
+ const GeneratedSaxParser::ParserError& parserError = saxParserError->getError();
+
+ // Workaround to avoid wrong error
+ if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_MIN_OCCURS_UNMATCHED)
+ {
+ if ( strcmp(parserError.getElement(), "effect") == 0 )
+ {
+ return false;
+ }
+ }
+ if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_SEQUENCE_PREVIOUS_SIBLING_NOT_PRESENT)
+ {
+ if ( (strcmp(parserError.getElement(), "extra") == 0)
+ && (strcmp(parserError.getAdditionalText().c_str(), "sibling: fx_profile_abstract") == 0))
+ {
+ return false;
+ }
+ }
+
+ if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_COULD_NOT_OPEN_FILE)
+ {
+ std::cout << "Couldn't open file" << std::endl;
+ mError = true;
+ }
+
+ std::cout << "Schema validation error: " << parserError.getErrorMessage() << std::endl;
+ mError = true;
+ }
+ else if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXFWL )
+ {
+ COLLADASaxFWL::SaxFWLError* saxFWLError = (COLLADASaxFWL::SaxFWLError*) error;
+ std::cout << "Sax FWL Error: " << saxFWLError->getErrorMessage() << std::endl;
+ mError = true;
+ }
+ return false;
+}
diff --git a/source/blender/collada/ErrorHandler.h b/source/blender/collada/ErrorHandler.h
new file mode 100644
index 00000000000..4064abb89f6
--- /dev/null
+++ b/source/blender/collada/ErrorHandler.h
@@ -0,0 +1,58 @@
+/*
+ * $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): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ErrorHandler.h
+ * \ingroup collada
+ */
+
+#include <string>
+#include <map>
+#include <vector>
+#include <algorithm> // sort()
+
+#include "COLLADASaxFWLIErrorHandler.h"
+
+/** \brief Handler class for parser errors
+ */
+class ErrorHandler : public COLLADASaxFWL::IErrorHandler
+{
+public:
+ /** Constructor. */
+ ErrorHandler();
+
+ /** Destructor. */
+ virtual ~ErrorHandler();
+ /** handle any error thrown by the parser. */
+ bool virtual handleError(const COLLADASaxFWL::IError* error);
+ /** True if there was an error during parsing. */
+ bool hasError() { return mError; }
+private:
+ /** Disable default copy ctor. */
+ ErrorHandler( const ErrorHandler& pre );
+ /** Disable default assignment operator. */
+ const ErrorHandler& operator= ( const ErrorHandler& pre );
+ /** Hold error status. */
+ bool mError;
+};
+
diff --git a/source/blender/collada/ExportSettings.cpp b/source/blender/collada/ExportSettings.cpp
new file mode 100644
index 00000000000..19f1c05ddcf
--- /dev/null
+++ b/source/blender/collada/ExportSettings.cpp
@@ -0,0 +1,29 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExportSettings.cpp
+ * \ingroup collada
+ */
+
+#include "ExportSettings.h"
diff --git a/source/blender/collada/ExportSettings.h b/source/blender/collada/ExportSettings.h
new file mode 100644
index 00000000000..2636ca88a23
--- /dev/null
+++ b/source/blender/collada/ExportSettings.h
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ExportSettings.h
+ * \ingroup collada
+ */
+
+#ifndef __EXPORTSETTINGS_H__
+#define __EXPORTSETTINGS_H__
+
+struct ExportSettings
+{
+ public:
+ bool selected;
+ char *filepath;
+};
+
+#endif
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index b724844b1ec..4da0a4c6e1f 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -44,16 +44,16 @@
#include "collada_internal.h"
// TODO: optimize UV sets by making indexed list with duplicates removed
-GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
+GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryGeometries(sw), export_settings(export_settings) {}
-void GeometryExporter::exportGeom(Scene *sce, bool export_selected)
+void GeometryExporter::exportGeom(Scene *sce)
{
openLibrary();
mScene = sce;
GeometryFunctor gf;
- gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this, export_selected);
+ gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
index d9d265a66fc..64c51b6324e 100644
--- a/source/blender/collada/GeometryExporter.h
+++ b/source/blender/collada/GeometryExporter.h
@@ -42,6 +42,8 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
// TODO: optimize UV sets by making indexed list with duplicates removed
class GeometryExporter : COLLADASW::LibraryGeometries
{
@@ -58,9 +60,9 @@ class GeometryExporter : COLLADASW::LibraryGeometries
Scene *mScene;
public:
- GeometryExporter(COLLADASW::StreamWriter *sw);
+ GeometryExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
- void exportGeom(Scene *sce, bool export_selected);
+ void exportGeom(Scene *sce);
void operator()(Object *ob);
@@ -96,6 +98,8 @@ public:
/* int getTriCount(MFace *faces, int totface);*/
private:
std::set<std::string> exportedGeometry;
+
+ const ExportSettings *export_settings;
};
struct GeometryFunctor {
diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp
index 8e426e9dba8..747f3c783d7 100644
--- a/source/blender/collada/ImageExporter.cpp
+++ b/source/blender/collada/ImageExporter.cpp
@@ -43,7 +43,7 @@
#include "BLI_path_util.h"
#include "BLI_string.h"
-ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename)
+ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryImages(sw), export_settings(export_settings)
{}
bool ImagesExporter::hasImages(Scene *sce)
@@ -71,12 +71,12 @@ bool ImagesExporter::hasImages(Scene *sce)
return false;
}
-void ImagesExporter::exportImages(Scene *sce, bool export_selected)
+void ImagesExporter::exportImages(Scene *sce)
{
if(hasImages(sce)) {
openLibrary();
MaterialFunctor mf;
- mf.forEachMaterialInScene<ImagesExporter>(sce, *this, export_selected);
+ mf.forEachMaterialInScene<ImagesExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
@@ -97,7 +97,7 @@ void ImagesExporter::operator()(Material *ma, Object *ob)
char src[FILE_MAX];
char dir[FILE_MAX];
- BLI_split_dirfile(mfilename, dir, NULL);
+ BLI_split_dirfile(this->export_settings->filepath, dir, NULL);
BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.main->name, image->name, dir);
diff --git a/source/blender/collada/ImageExporter.h b/source/blender/collada/ImageExporter.h
index 6b81c099259..9e5767fd9d3 100644
--- a/source/blender/collada/ImageExporter.h
+++ b/source/blender/collada/ImageExporter.h
@@ -40,17 +40,19 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class ImagesExporter: COLLADASW::LibraryImages
{
- const char *mfilename;
- std::vector<std::string> mImages; // contains list of written images, to avoid duplicates
public:
- ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename);
+ ImagesExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
- void exportImages(Scene *sce, bool export_selected);
+ void exportImages(Scene *sce);
void operator()(Material *ma, Object *ob);
private:
+ std::vector<std::string> mImages; // contains list of written images, to avoid duplicates
bool hasImages(Scene *sce);
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp
index 31ade5604a7..3d5814cb6db 100644
--- a/source/blender/collada/LightExporter.cpp
+++ b/source/blender/collada/LightExporter.cpp
@@ -52,13 +52,13 @@ void forEachLampObjectInScene(Scene *sce, Functor &f, bool export_selected)
}
}
-LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){}
+LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryLights(sw), export_settings(export_settings) {}
-void LightsExporter::exportLights(Scene *sce, bool export_selected)
+void LightsExporter::exportLights(Scene *sce)
{
openLibrary();
- forEachLampObjectInScene(sce, *this, export_selected);
+ forEachLampObjectInScene(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/LightExporter.h b/source/blender/collada/LightExporter.h
index 2ae1a19fdb1..6c52ed2b76d 100644
--- a/source/blender/collada/LightExporter.h
+++ b/source/blender/collada/LightExporter.h
@@ -37,14 +37,17 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class LightsExporter: COLLADASW::LibraryLights
{
public:
- LightsExporter(COLLADASW::StreamWriter *sw);
- void exportLights(Scene *sce, bool export_selected);
+ LightsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportLights(Scene *sce);
void operator()(Object *ob);
private:
bool exportBlenderProfile(COLLADASW::Light &cla, Lamp *la);
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp
index 9d29177578d..37c1a6f6b68 100644
--- a/source/blender/collada/MaterialExporter.cpp
+++ b/source/blender/collada/MaterialExporter.cpp
@@ -33,15 +33,15 @@
#include "COLLADABUUtils.h"
#include "collada_internal.h"
-MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
+MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryMaterials(sw), export_settings(export_settings) {}
-void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected)
+void MaterialsExporter::exportMaterials(Scene *sce)
{
if(hasMaterials(sce)) {
openLibrary();
MaterialFunctor mf;
- mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, export_selected);
+ mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h
index c080e4b0596..97a1e27358f 100644
--- a/source/blender/collada/MaterialExporter.h
+++ b/source/blender/collada/MaterialExporter.h
@@ -44,16 +44,18 @@
#include "GeometryExporter.h"
#include "collada_internal.h"
+#include "ExportSettings.h"
class MaterialsExporter: COLLADASW::LibraryMaterials
{
public:
- MaterialsExporter(COLLADASW::StreamWriter *sw);
- void exportMaterials(Scene *sce, bool export_selected);
+ MaterialsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportMaterials(Scene *sce);
void operator()(Material *ma, Object *ob);
private:
bool hasMaterials(Scene *sce);
+ const ExportSettings *export_settings;
};
// used in forEachMaterialInScene
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
index 760fb2359a4..15bd9c48f12 100644
--- a/source/blender/collada/MeshImporter.cpp
+++ b/source/blender/collada/MeshImporter.cpp
@@ -221,7 +221,7 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]);
#ifdef COLLADA_DEBUG
- /*if (quad) {
+ if (quad) {
fprintf(stderr, "face uv:\n"
"((%d, %d, %d, %d))\n"
"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
@@ -248,7 +248,7 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
mtface->uv[0][0], mtface->uv[0][1],
mtface->uv[1][0], mtface->uv[1][1],
mtface->uv[2][0], mtface->uv[2][1]);
- }*/
+ }
#endif
}
@@ -411,7 +411,7 @@ int MeshImporter::count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me)
}
// TODO: import uv set names
-void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //TODO:: Refactor. Possibly replace by iterators
+void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //TODO:: Refactor. Possibly replace by iterators
{
unsigned int i;
@@ -587,7 +587,7 @@ void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
for (k = 0; k < index_list_array.getCount(); k++) {
// get mtface by face index and uv set index
MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, vcount == 4);
}
#endif
@@ -796,7 +796,7 @@ MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmateri
std::multimap<COLLADAFW::UniqueId, COLLADAFW::UniqueId>::iterator it;
it=materials_mapped_to_geom.find(*geom_uid);
while(it!=materials_mapped_to_geom.end()) {
- if(it->second == ma_uid) return NULL; // do nothing if already found
+ if(it->second == ma_uid && it->first == *geom_uid) return NULL; // do nothing if already found
it++;
}
// first time we get geom_uid, ma_uid pair. Save for later check.
diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp
new file mode 100644
index 00000000000..a561d18c6e3
--- /dev/null
+++ b/source/blender/collada/SceneExporter.cpp
@@ -0,0 +1,161 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/SceneExporter.cpp
+ * \ingroup collada
+ */
+
+#include "SceneExporter.h"
+
+SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings)
+ : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm), export_settings(export_settings)
+{}
+
+void SceneExporter::exportScene(Scene *sce)
+{
+ // <library_visual_scenes> <visual_scene>
+ std::string id_naming = id_name(sce);
+ openVisualScene(translate_id(id_naming), id_naming);
+ exportHierarchy(sce);
+ closeVisualScene();
+ closeLibrary();
+}
+
+void SceneExporter::exportHierarchy(Scene *sce)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (!ob->parent) {
+ if(sce->lay & ob->lay) {
+ switch(ob->type) {
+ case OB_MESH:
+ case OB_CAMERA:
+ case OB_LAMP:
+ case OB_ARMATURE:
+ case OB_EMPTY:
+ if (this->export_settings->selected && !(ob->flag & SELECT)) {
+ break;
+ }
+ // write nodes....
+ writeNodes(ob, sce);
+ break;
+ }
+ }
+ }
+
+ base= base->next;
+ }
+}
+
+void SceneExporter::writeNodes(Object *ob, Scene *sce)
+{
+ COLLADASW::Node node(mSW);
+ node.setNodeId(translate_id(id_name(ob)));
+ node.setType(COLLADASW::Node::NODE);
+
+ node.start();
+
+ bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob);
+
+ if (ob->type == OB_MESH && is_skinned_mesh)
+ // for skinned mesh we write obmat in <bind_shape_matrix>
+ TransformWriter::add_node_transform_identity(node);
+ else
+ TransformWriter::add_node_transform_ob(node, ob);
+
+ // <instance_geometry>
+ if (ob->type == OB_MESH) {
+ if (is_skinned_mesh) {
+ arm_exporter->add_instance_controller(ob);
+ }
+ else {
+ COLLADASW::InstanceGeometry instGeom(mSW);
+ instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
+
+ InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob);
+
+ instGeom.add();
+ }
+ }
+
+ // <instance_controller>
+ else if (ob->type == OB_ARMATURE) {
+ arm_exporter->add_armature_bones(ob, sce);
+
+ // XXX this looks unstable...
+ node.end();
+ }
+
+ // <instance_camera>
+ else if (ob->type == OB_CAMERA) {
+ COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
+ instCam.add();
+ }
+
+ // <instance_light>
+ else if (ob->type == OB_LAMP) {
+ COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
+ instLa.add();
+ }
+
+ // empty object
+ else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLIGROUP
+ if((ob->transflag & OB_DUPLIGROUP) == OB_DUPLIGROUP && ob->dup_group) {
+ GroupObject *go = NULL;
+ Group *gr = ob->dup_group;
+ /* printf("group detected '%s'\n", gr->id.name+2); */
+ for(go = (GroupObject*)(gr->gobject.first); go; go=go->next) {
+ printf("\t%s\n", go->ob->id.name);
+ }
+ }
+ }
+
+ // write nodes for child objects
+ Base *b = (Base*) sce->base.first;
+ while(b) {
+ // cob - child object
+ Object *cob = b->object;
+
+ if (cob->parent == ob) {
+ switch(cob->type) {
+ case OB_MESH:
+ case OB_CAMERA:
+ case OB_LAMP:
+ case OB_EMPTY:
+ case OB_ARMATURE:
+ // write node...
+ writeNodes(cob, sce);
+ break;
+ }
+ }
+
+ b = b->next;
+ }
+
+ if (ob->type != OB_ARMATURE)
+ node.end();
+}
+
diff --git a/source/blender/collada/SceneExporter.h b/source/blender/collada/SceneExporter.h
new file mode 100644
index 00000000000..919cba61ec0
--- /dev/null
+++ b/source/blender/collada/SceneExporter.h
@@ -0,0 +1,109 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file SceneExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __SCENEEXPORTER_H__
+#define __SCENEEXPORTER_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+extern "C" {
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_group_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_image_types.h"
+#include "DNA_material_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_fcurve.h"
+#include "BKE_animsys.h"
+#include "BLI_path_util.h"
+#include "BLI_fileops.h"
+#include "ED_keyframing.h"
+}
+
+#include "COLLADASWAsset.h"
+#include "COLLADASWLibraryVisualScenes.h"
+#include "COLLADASWNode.h"
+#include "COLLADASWSource.h"
+#include "COLLADASWInstanceGeometry.h"
+#include "COLLADASWInputList.h"
+#include "COLLADASWPrimitves.h"
+#include "COLLADASWVertices.h"
+#include "COLLADASWLibraryAnimations.h"
+#include "COLLADASWLibraryImages.h"
+#include "COLLADASWLibraryEffects.h"
+#include "COLLADASWImage.h"
+#include "COLLADASWEffectProfile.h"
+#include "COLLADASWColorOrTexture.h"
+#include "COLLADASWParamTemplate.h"
+#include "COLLADASWParamBase.h"
+#include "COLLADASWSurfaceInitOption.h"
+#include "COLLADASWSampler.h"
+#include "COLLADASWScene.h"
+#include "COLLADASWTechnique.h"
+#include "COLLADASWTexture.h"
+#include "COLLADASWLibraryMaterials.h"
+#include "COLLADASWBindMaterial.h"
+#include "COLLADASWInstanceCamera.h"
+#include "COLLADASWInstanceLight.h"
+#include "COLLADASWConstants.h"
+#include "COLLADASWLibraryControllers.h"
+#include "COLLADASWInstanceController.h"
+#include "COLLADASWInstanceNode.h"
+#include "COLLADASWBaseInputElement.h"
+
+#include "ArmatureExporter.h"
+
+#include "ExportSettings.h"
+
+class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter
+{
+public:
+ SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings);
+ void exportScene(Scene *sce);
+
+private:
+ void exportHierarchy(Scene *sce);
+ void writeNodes(Object *ob, Scene *sce);
+
+ ArmatureExporter *arm_exporter;
+ const ExportSettings *export_settings;
+};
+
+#endif
diff --git a/source/blender/collada/SkinInfo.cpp b/source/blender/collada/SkinInfo.cpp
index ce0d561c524..1d890415ebe 100644
--- a/source/blender/collada/SkinInfo.cpp
+++ b/source/blender/collada/SkinInfo.cpp
@@ -266,9 +266,9 @@ void SkinInfo::link_armature(bContext *C, Object *ob, std::map<COLLADAFW::Unique
// ^ bone index can be -1 meaning weight toward bind shape, how to express this in Blender?
// for each vertex in weight indices
- // for each bone index in vertex
- // add vertex to group at group index
- // treat group index -1 specially
+ // for each bone index in vertex
+ // add vertex to group at group index
+ // treat group index -1 specially
// get def group by index with BLI_findlink
diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp
index 0fd0c85aa09..625a0220830 100644
--- a/source/blender/collada/TransformReader.cpp
+++ b/source/blender/collada/TransformReader.cpp
@@ -37,7 +37,6 @@ void TransformReader::get_node_mat(float mat[][4], COLLADAFW::Node *node, std::m
{
float cur[4][4];
float copy[4][4];
- float eul[3];
unit_m4(mat);
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
index 7bad9bdeba7..88ed112c3fe 100644
--- a/source/blender/collada/TransformWriter.cpp
+++ b/source/blender/collada/TransformWriter.cpp
@@ -50,7 +50,7 @@ void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[][4],
double dmat[4][4];
UnitConverter* converter = new UnitConverter();
- converter->mat4_to_dae_double(dmat,local);
+ converter->mat4_to_dae_double(dmat,local);
TransformBase::decompose(local, loc, rot, NULL, scale);
if ( node.getType() == COLLADASW::Node::JOINT)
diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp
index c15e608c360..8059b1cf3ff 100644
--- a/source/blender/collada/collada.cpp
+++ b/source/blender/collada/collada.cpp
@@ -30,6 +30,7 @@
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
+#include "ExportSettings.h"
#include "DocumentExporter.h"
#include "DocumentImporter.h"
@@ -46,14 +47,17 @@ extern "C"
int collada_import(bContext *C, const char *filepath)
{
DocumentImporter imp (C, filepath);
- imp.import();
+ if(imp.import()) return 1;
- return 1;
+ return 0;
}
int collada_export(Scene *sce, const char *filepath, int selected)
{
- DocumentExporter exp;
+ ExportSettings export_settings;
+
+ export_settings.selected = selected != 0;
+ export_settings.filepath = (char *)filepath;
/* annoying, collada crashes if file cant be created! [#27162] */
if(!BLI_exist(filepath)) {
@@ -64,7 +68,8 @@ extern "C"
}
/* end! */
- exp.exportCurrentScene(sce, filepath, selected);
+ DocumentExporter exporter(&export_settings);
+ exporter.exportCurrentScene(sce);
return 1;
}
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index eaba8343f4d..aa61afbac78 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -41,6 +41,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_sound.h"
#include "UI_view2d.h"
@@ -76,6 +77,7 @@ static int change_frame_poll(bContext *C)
/* Set the new frame number */
static void change_frame_apply(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
/* set the new frame number */
@@ -84,7 +86,7 @@ static void change_frame_apply(bContext *C, wmOperator *op)
SUBFRA = 0.f;
/* do updates */
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
}
diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c
index b2b2612cd4a..243e9838e9e 100644
--- a/source/blender/editors/datafiles/blenderbuttons.c
+++ b/source/blender/editors/datafiles/blenderbuttons.c
@@ -1,6736 +1,6723 @@
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 215334;
+int datatoc_blenderbuttons_size= 214916;
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, 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, 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, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0,
- 7,116, 73, 77, 69, 7,219, 8, 3, 13, 27, 3,174, 15,171, 16, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,213,
-226, 61, 51, 59, 91,178, 37,155, 70,122, 32,133, 18,192, 0,134,162, 4,169,130,160, 24, 21, 21,172, 8, 79,159,207,138, 13, 11,
-168,136,136, 64,108,128,224, 79,228,161, 79, 1, 65, 1, 11,188,192,163, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201,102,123,
-155,251,251, 35, 59,235,102,179, 45,144,160,194, 61,223, 55,223,238,206,206,156,185,247,206,189,119,206,156,219, 24, 66, 8, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 90, 30, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,191, 8,178,179,179,155, 99,129, 13, 11,148,
-211,177, 13,250,171,115,182, 98,220, 73, 11,114, 14,114,112,190,255, 55, 9,231,160,191, 42,167, 16,223,102,240, 14,107, 78, 62,
-106,169,244,116, 9, 39,105,233,112,182, 22,103, 75,149, 35, 15,225, 36,173,112,223,223,255,155,132,115,208, 95,141,211, 61,255,
- 4,200,219, 44,206, 0,243, 84,115,195, 73, 90, 58,156,173,197,121,181,229,200, 71, 56,201,213,230, 37, 47,247,254,125,220, 32,
- 32,132,128,107, 69,145, 21, 48, 50, 51, 51, 25, 23,126,230,175,202,233,154, 14, 2,127, 75,134,181, 5,177,181,165, 57,221,210,
-179,165,240,126,102,102, 38,147,157,157,189, 13,192,160,150,140,123, 75,220,119,183,184,182, 8,239, 21,136,172,102,113,182, 84,
-190,111,109,206,150, 42, 75,238,156, 45,145,239, 61,221,247, 86,188, 71, 45, 21,206, 22, 41, 75,173,145,231, 61,228,159,171,230,
-117,231,108,137,178,228,206,217, 18,249,254, 90,112,182, 68, 89,242,196,217, 18,249,222,219,189,191,209, 12, 42,246, 74, 18,173,
- 21,157,178,193,127,101, 65,212, 90, 98,179, 25, 14,204,159,206,217,194,247,232,125, 7,103, 75,190,221, 12,110,169,123,212, 26,
-249,221,149,179,165,248,221,121, 90,226, 62,121,226,188,218,240,122, 9,103,139,199,253,106,243,253,181,226,108,225,123,212, 34,
-101,201,141,115,112, 11,191, 12, 12,118,249,253,126, 75,114,182, 84, 89,242, 16,206,171,190, 79,158, 56,175, 54,188, 94,194,217,
-226,113,111,137,103, 72,107,241, 94,215,104,173,230,179,150,230,108, 38,247,117,197,217,204,230,153, 97,173,112,239,255,212,112,
-182, 36,167,123, 24, 91,178,185,167, 53,195,217,146,156,205, 8,235,117,199,249,119,187,239,127,197,244,244,198,119, 53,205, 82,
-222,220,209,214, 8,103, 75,114, 6,200,125, 93,112, 94,197,189,191,174,208,236,166,195,107, 33,224, 90,248,205, 4, 45,236,192,
-180,166,112,109,201,112, 14,110, 13,135,176, 21,208,226,225,116,188, 41, 79,109,133,184,255, 93,210,148,150, 37, 90,150,254,114,
-101,201, 45, 79, 14,110, 65,167,168, 69,157,103,119,206,150,184,134, 43, 71, 75,229,209,214,142,123, 75,150,165,214,184,247, 20,
- 87,225, 66, 80, 78,202, 73, 57, 41, 39,229,164,156,148,243,134,229,188,238, 64, 8,161,211, 59, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80,252,141,224,179,143, 86, 92, 92, 92,182, 66,161,232,224,237,127,157, 78,119,233,210,165, 75,
- 67,104, 50,254,121,160,247,136,226,111, 4, 22,127,140,114,230, 1, 16,199, 70, 65, 65, 65,113, 93,195,171,208,146,201,100, 41,
-167, 78,157,234,196,243, 60,236,118, 59,108, 54,155,243,211,108, 54, 99,224,192,129,205,238, 72, 31, 29, 29,157, 43, 18,137,146,
-154,115,142,221,110,191, 80, 94, 94,222,223,199, 33,187, 0,164, 48,204, 31,125, 2,133,239,222, 62, 1,148, 90,173,214,158,190,
- 56, 25,134, 73,113,231,243,194, 37,124,247,201, 25, 18, 18,114,128,227,184, 4, 79, 92,222,190,243, 60, 95, 80, 89, 89,217,239,
- 90,222,163, 27, 25,209,209,209,185, 28,199, 53, 59,127,150,149,149,121,205,159,177,177,177,135, 89,150,141,107, 6,165,136,231,
-249,188, 75,151, 46,245,247, 33, 68,118, 1, 72,241, 69,226,158,159, 24,134, 41,177,219,237,189,253,149, 35, 95, 92, 30,242,168,
- 63, 78,167,200,226, 56, 46, 43, 42, 42,234, 57,189, 94,111, 4, 64, 68, 34, 17,113, 9, 27, 0,192,102,179, 85,214,214,214,118,
-163, 57,145,130,130,226,134, 16, 90, 60,207,179, 38,147, 9,249,249,249,240,178, 30,162,253, 10,174,215,233,224,111,155,162,130,
-163,162, 97,179, 88,160,108, 19,233,228, 46, 63,121, 28, 54,171, 5, 54,179, 25,237,250,244, 21,194,128,174, 93,187,138,252,112,
- 38,124,244,209, 71, 81,193,193,193, 48, 26,141, 48, 26,141, 48,153, 76, 48, 26,141, 48,155,205, 48,155,205,176, 88, 44,176, 88,
- 44,176,217,108, 48,153, 76,200,201,201,177, 91,173, 86,159,156, 51,102,204,136, 82,171,213, 78, 62, 97, 19, 56, 5, 94,171,213,
- 10,163,209,136,205,155, 55,251,228,228, 56, 46,161,180,180, 52, 74, 34,145,128, 16, 2,158,231, 65, 8,105,180,185,163,125,251,
-246, 22, 95,129,108,165,123,116, 35,163,211,140,229,107,163, 66,228, 50,216,120, 30,153, 61,218, 59,255, 40,248,122, 37,136,205,
- 14,222,102, 67,199, 23,199, 58,247,119,233,210,197,103,254, 36,132, 36,206, 88,190, 54, 52, 80,206,234,234,106, 67,231,206,157,
- 75,209, 48,185,159, 55,161,149, 96, 48, 24,162, 28,252, 77, 4, 17,203,178,141,182, 13, 27, 54, 32, 51, 51,211, 95,220, 19, 94,
-125,245,213, 40,171,213, 10,179,217, 12,147,201, 4,171,213, 10,155,205,230,220,236,118,187,115, 51,155,205,216,187,119,111,160,
- 78,214, 71,119,220,113,199,147,107,215,174, 85,254,250,235,175,202,164,164, 36, 72, 36, 18,136, 68, 34,136, 68, 34,176, 44, 11,
-142,227,112,235,173,183, 50, 52, 11, 82, 80, 80,220, 48, 66,203,100, 50, 21,166,167,167, 19,199,247,120,153, 76, 38,113,123,203,
-141,235,216,177, 99,158,251,121,254,154,171,130,163,162, 49,185,109, 56, 0,224,189,243,213,206, 7,196,199,253,110,118, 30,243,
-193,197, 58, 0,128, 92, 46, 7,227,250, 26,237, 5, 74,165, 18,119,220,113, 7,164, 82, 41,122,247,238, 13,177, 88,236,113,147,
- 72, 36, 16,139,197,126, 19,133, 97, 24,168, 84, 42, 76,155, 54, 77, 16, 73, 80, 6,201, 48,161, 95,111, 4,129,224,223,199,207,
-192,204, 19,112, 28,231,220, 2,225,148, 72, 36, 56,118,236, 24, 56,142,131, 72, 36,114,126, 10,223,215,172, 89,131,209,163, 71,
-131,227, 56,200,229,114,192,207,204,193,174,247,200,108, 54,199, 74,165, 82, 11, 0, 65,156, 73, 24,134,137,185,146,123,116, 35,
- 35, 68, 46,195,184, 5,191, 0, 0,138,231,188,232,188,119,123,159,127,207,121, 76,226,191, 30, 2,195, 48, 16,139,197, 96, 89,
-182,197, 56,107,106,106, 12,143, 60,242,200,142,224,224,224, 13, 26,141, 6,126, 4, 28,138,139,139,193,113,156,215,252,206,178,
- 44,102,207,158,141,179,103,207, 6, 20,119,163,209,136, 69,139, 22,193,110,183, 55,226, 21,190,187,239, 11, 80,100,125, 56,124,
-248,240,177,107,215,174, 13, 99, 24, 6, 95,124,241, 5, 36, 18, 9, 70,142, 28,137,136,136, 8,108,220,184, 17, 18,137, 4,111,
-190,249, 38,205,124, 20, 20, 20,190,234, 60, 49,128,155, 1, 68, 58, 76,132,122, 0,161, 46,135, 84, 58, 62, 35,133,223, 12,195,
-236,247,192,211,199,113, 76, 37,195, 48,251, 93,126,155, 1, 72, 61,236,175, 6, 32,119,108, 38, 52,184,255,105, 46,215, 17,206,
-131,183,235,114, 64,195,250, 67, 0,182, 2, 24,156,153,153,185, 13, 0,202,202,202,238, 42, 43, 43, 3, 0,164,164,164,156,202,
-203,203,235, 44,104, 30, 71,243,148,196,102,179,117, 18,154,170, 4,183,104,216,176, 97, 62,223,240,109, 22, 75, 19, 1,226, 73,
- 75,121,106,174,240, 38, 96, 44, 22, 11, 30,122,232, 33, 0,240,250,208,113,221, 2,208,110, 48,155,205,224, 56, 14,169,109, 35,
- 49,101, 68, 58,110, 33, 86,232,180, 12,108,117, 58,220,167,178,226, 84,215,158, 88,120,161, 18,231, 53, 90,112, 28, 23, 16, 39,
-207,243, 94, 69,150, 72, 36,194,130, 5, 11,240,200, 35,143, 64, 36, 18, 5,196,231,122,143,146,147,147,215,230,229,229, 69, 48,
- 12, 99,114,220, 35,153,205,102, 83,219,108,182, 8,187,221, 30,209,156,123,116, 35,195,198,243, 30,243,161,183, 60, 27,200,125,
- 10,132,179,166,166,198,144,153,153,185, 71, 38,147, 45,142,142,142, 46, 45, 41, 41,241, 43,180,220,197,143,251, 75,197,103,159,
-125,134,121,243,230, 97,200,144, 33, 1,133,211,100, 50,129, 97, 24, 44, 92,184,176,201,127,211,167, 79,111,114, 61, 63,156, 12,
- 0, 54, 46, 46,238,249,245,235,215,171,133, 99,219,180,105, 3,177, 88,140,110,221,186, 33, 56, 56, 24, 59,118,236,128,221,110,
- 15,184, 92, 82, 80, 80, 92,191,240,164, 69, 92, 48,112,242,228,201,189,179,178,178,102,102,100,100,252,176,107,215,174,229, 12,
-195,100,187,212,137,153,142,250, 53, 91,248, 77, 8,233,227, 42,122, 28, 98, 45,146, 97,152,108,225,120,215,223,194, 39, 33,100,
- 24, 0,169,240,123,242,228,201,105, 89, 89, 89, 51, 39, 77,154,244,246,172, 89,179, 36,147, 39, 79,238,158,149,149, 53, 83,184,
-142,167,112,120,114,180,124,174, 61, 37, 52, 81,157, 62,125,218, 91, 19,149,235, 3,192,103,109,169,108, 19,233,116,178, 62, 72,
-140,112,238,159, 86, 82,235,124,128,205,239,213, 1, 74,165, 18, 35, 62,248, 36, 32,167,200,108, 54,163,162,162,194,233, 50,248,
-219, 2,229, 84,200,131,144,243,106, 55, 20, 87, 75,241,254,238, 26,172, 61,114, 22, 98,177, 24,119,118,237,134,187, 36,193,120,
- 55, 81,138, 87,207, 20,193, 74, 2,235,211, 75, 8,241, 40,176,132,239, 66, 19, 74,160, 66,203,237, 30, 21, 27,141,198,234,252,
-252,124, 3,223,240, 96,151, 19, 66,194, 24,134,169,119,184, 92,177,129,222,163, 27, 25,153, 61,218, 59, 93,167,189,193, 67,157,
-251, 71,235,142, 57,239,201,196, 5, 31, 3, 0,134,244,188,213,111,121, 8,132,179,186,186,218,208,127,232,224,109,118,131,249,
-187,177, 99,199, 22,110,217,178, 69, 30, 72, 88, 61, 9, 45,193,181, 21, 68, 22,199,113, 48,155,205, 1,197,221,108, 54,123, 45,
- 31, 18,137,228, 74, 28, 45,232,116, 58,243,234,213,171, 49,127,254,124, 68, 68, 68, 96,248,240,225,136,141,141,197,202,149, 43,
- 65, 8,193,139, 47,190, 8,185, 92, 46,184,215, 52, 3, 82, 80,220,216,240,165, 69,100, 89, 89, 89, 51,221,133,140,235,111, 87,
- 1,229, 38,166, 92,197, 90,154,159,231,127,182,187,120, 18,174,203, 48, 76,246,172, 89,179, 50,253,132,163,210,155,208,242, 57,
- 37,190,201,100, 42,236,209,163, 71, 64,106, 66,175,215,151,249, 19, 27,158,222,234, 93, 93, 2,149, 74, 5,165, 90, 5, 54,192,
-122,215,106,181, 58,133,202,166, 77,155, 32,151,203, 49,114,228,200,171,114,180, 44, 22, 11,164, 18, 49,216, 54,209, 24, 55,103,
- 11,170,235, 13,206, 7,204,214,130, 66, 28, 42,175,192,171, 25, 67,161,148, 87, 64,107, 54, 7,228,188,241, 60,223, 68,100,113,
- 28,135,135, 30,122,200,233, 38,184,246, 91,129,143,166,195,136,136,136, 3, 28,199, 37,184,220,163,160,148,148, 20,224,143,126,
- 61, 12,207,243,218,208,208,208,159, 1,196, 17, 66, 18, 0, 4, 7,114,143, 40, 60,231, 79,247,253,188,155, 83,117, 37,156,213,
-213,213,134,204,204,204, 61,118,131,249,187,139, 23, 47,238, 1, 16,116,203, 45,183, 52, 91,104, 9, 2, 75, 44, 22, 99,246,236,
-217,152, 55,111,158,243,255, 64,133,150,205,102,107, 36,160,206,156, 57,211,232, 90,238,194,206, 79,179, 41, 65,195,232, 66, 62,
- 37, 37,197,121, 78, 76, 76, 12, 66, 67, 67,193,243, 60,120,158, 71, 80, 80, 16,228,114, 57, 36, 18, 9,205,116, 20, 20, 20,190,
-180,136, 97,210,164, 73,111, 51, 12,147,237,112,150,142,251, 16, 84,158,180, 71, 31, 55,177, 86,233,229,184, 76, 79, 98,203,245,
-187,128,201,147, 39,167,185,135,195, 83,115,165,179, 86,117,155,118,191, 17, 92,155,168, 90,234, 33,230,235, 65,166, 10, 85, 67,
-174, 84, 66, 36, 98,193, 48, 12,241,199,101,177, 88,156, 21,255,115,207, 61,231,179,223, 74,160,253,169, 44, 22, 11, 88, 78,132,
- 75, 49,201,176,179,219,157,231, 10, 27,203,137,113, 62,166, 51, 68,167, 15, 67, 28,224, 3,215,221,209,122,241,197, 23,177,104,
-209, 34,176, 44,235, 76, 19,142,227,208,177, 99, 71, 20, 22, 22,250,228,226, 56, 46,225,252,249,243, 81,174,233, 40,136, 88, 66,
- 8,236,118, 59,218,183,111,111,204,207,207,127,153, 22,221,171, 19, 89,222,246,219,237,124,192, 46,140,167,227,170,171,171, 13,
- 99,198,140,217, 86, 87, 87,247,221, 77, 55,221,116, 6,141,167, 64,240,203,199,113, 92, 35,129, 37,136,172,207, 63,255,188,145,
- 40,178, 90,173, 1,189, 8, 88,173,214, 38,130,231,211, 79, 63,109,244, 9, 0,253,250,245, 11,200, 25, 6, 64, 88,150, 37, 18,
-137, 4,119,220,113, 7,186,119,239,142, 95,127,253, 21, 60,207,227,133, 23, 94,128, 92, 46,199,220,185,115, 97,179,217,240,209,
- 71, 31, 81, 71,139,130,130,194,151, 22, 49,205,154, 53,235,248,172, 89,179,156,206,146,187,163,229,229,185,123,183, 67, 84, 69,
- 10, 34, 13,128,201,147, 32,242,228,146,185, 11, 48,215,125, 89, 89, 89, 51,221,195,225,222, 92,217, 72,104, 93, 43,148,157, 56,
-134, 79,110, 75, 7,208,184,185,112,193,173,157,161, 84, 41,161, 12, 86, 97,204,154,237, 0,224,168,244, 39, 5,228,104, 9, 66,
-171,186,186,218,167,200,106,142,163,197, 74, 57,172, 74,184, 12, 34, 21,131, 51, 91, 27, 9, 45, 17, 39, 70,113, 68, 50, 88,177,
- 4,156,221, 22, 16, 39, 33,164, 73, 83,225,248,241,227,193, 48,140,115,132, 88,143, 30, 61, 92,185, 24,127, 15,199, 55,194, 27,
-250,224,185, 55,199,126, 84,101,164, 37,246, 74,242,231,129,175,113,234,167,231, 1, 0,253,117, 58,231,189,152,209,227,143,177,
- 3,115,142,109,115,186,143, 31,224,245, 43,226,172,174,174, 54,220,210, 37,109,143, 36, 60,228,187, 11, 23, 46,236, 1,192, 62,
-252,240,195,161, 61,122,244, 8,168, 76, 10,131, 43,220, 69,150,171,147, 37,124,250, 25, 97,235, 34, 28,237, 1, 9, 40,161, 25,
- 49,128, 60, 79,132,188,173, 86,171,161, 82,169,156, 35,110,131,130,130,160, 80, 40,156,253, 59, 3, 20,110, 20, 20, 20, 55, 46,
-194, 4,161,227, 16, 75,141,156, 38, 71,223,170, 76,215,223,158, 28, 47,135, 3,149,235,167,126, 93,235, 16,104, 30, 33, 56,107,
-110,231,100,123, 19,105,156,160, 32, 93, 63, 99, 98, 98,254,167, 82,169,146, 3,141,125,115, 70,177,217,173,150, 38,206, 22,195,
- 48, 80, 5,171, 32, 87, 41, 33, 15, 86,121,117,189,124, 9, 45,193, 41, 18, 30, 58,139, 23, 47,134, 74,165,194, 63,254,241,143,
-102,247,209,114, 10, 45, 9,139,141,178,205, 16, 73,185, 70, 34,139,227, 56,136,196, 98,148,169, 98,193,138,197,224,108,129,185,
-100,117,117,117,224, 56, 14, 83,166, 76,113,190,193,187,138,172,230,196,217, 23, 88,134, 17,220, 45, 89,135, 14, 29, 94,103, 24,
- 38, 17, 64,146, 78,167,147, 93,186,116,233,118, 90, 94,125, 40, 3,187,181,137, 11,229,205,125,189, 82, 78,193,201,146,132,135,
-124,215,185,115,103,167,147,165, 80, 40,132,209,166,254,239, 49,203,122, 20, 89,238, 35, 4, 57,142,107,200,203,126, 70, 71,186,
- 58, 90,179,102,205,114,242,186, 58, 89, 2,154, 83,142,132,176,110,219,182, 13,135, 14, 29,194,115,207, 61, 7,185, 92,142,121,
-243,230,193,102,179, 97,250,244,233,144,203,229,144, 74,165, 52,243, 81, 80, 80, 55,171,145, 22,113, 67,165, 91, 63, 40,198, 77,
-212, 84,122, 18, 88,174,205,132,194,119,134, 97,172, 30,120,205,110, 77,138,238,251,133,207,234, 89,179,102,109, 17,156, 44,151,
-253,141,194,225,215,209,146,201,100,201,249,249,249,206,137, 48,125,125,154,205,102, 12, 25, 50, 36, 96,103, 76, 24,117,200,113,
-162, 70,194, 66, 17,172,130, 66, 29, 12,185, 74,229, 46, 56, 24,127,149,184,240, 70,236, 42,180,166, 78,157, 10,142,227,176,104,
-209, 34, 0,192,235,175,191, 30,112, 31, 45,129, 19,118, 6, 37,228, 28,210,231,140,134,249,123, 43,202,119,254, 14,142,227, 16,
-213,247, 46,240,183,140,134, 94,174, 2,103,183, 5, 60,234,176,166,166, 6,133,133,133, 16,137, 68,120,237,181,215, 26,205,117,
-228, 62,146,109,211,166, 77,126,227,238,201,201,154,122,161,198,201, 35,151,203,217,223,127,255, 61,153,231,249, 20,131,193,208,
-161, 95,191,126, 60, 45,202,126, 68, 17,111, 11, 72, 84, 5,154, 63,221, 57,133, 62, 89,117,117,117,223, 93,184,112, 97, 47, 0,
-118,236,216,177,161, 10,133, 2,223,124,243,141, 30,128,116,229,202,149,114,127,162, 72,200, 55,254, 68,150, 88, 44,110,200,203,
-129,196,157, 52,158,178,196, 95,199,248, 64,242,188, 16, 86,134, 97, 96,183,219, 33,151,203, 27, 57, 89, 65, 65, 65,144,201,100,
- 52,227, 81, 80, 80,248,171, 75,246, 7, 92,143, 19,210,199, 69, 84,237,191, 18,222,230, 92,207, 31, 56,111, 66,195,100, 50,225,
-228,201,147,129,242, 4, 60, 49,102,219,222,183,226,131,139,117, 96, 24, 6,255,238,119, 19,148,106, 21, 20, 74, 37, 30,252,117,
-155,179,226, 62, 54,243,117,200,148, 42,196, 13, 24, 30, 80, 69, 46, 52, 29,186, 10,173,218,218, 90,136,197, 98,124,248,225,135,
- 96, 89, 22, 31,125,244, 17,226,227,227,113,233,210, 37,172, 92,185, 50, 32, 71, 75,100, 23, 33,246,137, 46, 80,140, 15,129,250,
-137,129, 8,187, 99, 42, 46,154, 57,236, 50, 42, 48,208,120, 2,210,141,159,195,204,219, 3, 30,129,101,179,217,176,109,219, 54,
-247, 14,239,206, 62, 85, 54,155, 13, 86,171, 21, 22,139, 5, 31,125,244, 81, 32, 35, 60,155,220, 55, 33, 13, 29,147,160,138,242,
-242,242, 34, 9, 33,225, 0, 66, 0, 84,209,226,234, 27,177,125, 95, 68,100,239,103, 1, 0,107,102, 61,229,220, 63,229,216, 31,
-249,115,246,247, 13, 11, 0,116, 78, 26,222, 44,206,234,234,106,195,157, 67,250,229, 26,121,241,183,221,186,117,107,228,100, 5,
- 5, 5, 49,142,223, 1,217,101, 44,203, 66, 36, 18, 53,105, 46,244, 38,182, 2,233,163,101,179,217,156, 19,137,250,234,207,120,
- 37,142,214, 83, 79, 61,133,216,216, 88,167,147,245,193, 7, 31, 64, 46,151, 99,242,228,201,176, 90,173,248,252,243,207,105,230,
-163,160,160,184,230,162,236, 90,192, 99, 77,106, 52, 26,139,186,119,239, 14, 47,255,197, 7, 5, 5,137,221, 34, 21,215,177, 99,
-199, 60, 15, 77,136,195, 0,228,120,170,212, 25,134, 65,176, 58, 24, 65, 42, 37, 20,110, 46, 86, 80,176, 26, 50,149, 10,172,196,
- 99,101,222,132, 83,232, 91,226, 42,180,132,173,174,174, 14, 98,177, 24,243,231,207,135, 90,173,134,201,100,242,203, 41, 60,116,
- 68, 34, 17,244,197,245, 56, 53, 51, 7,210,160, 93,232, 48,252, 17,196,138,229,144,236,248, 25, 6,187,213,223,132,165, 77, 56,
- 59,117,234,132,247,222,123,175,201,180, 14,222, 16, 31, 31,239, 55,238,238, 78,214,236,155,218, 65, 34,149, 96,226,137, 98,152,
- 76, 38,230,145, 71, 30,225, 1, 24, 0, 84, 26, 12,134, 11,129,164,103, 11,224,111,207,233,107, 84,172, 0,158,216, 61, 9, 24,
-143,156,130,147,101,228,197,223, 22, 22, 22, 10, 78, 86,136, 66,161,192, 87, 95,125,165, 7,192, 78,159, 62, 93,145,152,152, 40,
- 10, 36, 47,137, 68, 34,204,153, 51,199, 99,159, 44, 79,162,171, 57,229,200,245,220, 65,131, 6,121,156,176,212,139,120,107,194,
- 41,132, 53, 34, 34,194,233,100,217,237,118,231,104, 67, 97,246,121, 31, 47, 21, 52,127, 82, 78,202,121,227,112, 94,151,240, 88,
- 3, 95,186,116,233, 78,111, 39,180,111,223, 62, 63, 63, 63,191,163,176, 20,135,163,226,148, 24,141,198, 78,253,250,245,243,107,
-237,240, 60, 15,153, 76, 6, 66, 8,110,127, 47, 11, 12, 11,176,104,252, 16,139,186,109, 40, 68, 34, 14,124,195, 82, 31,126, 71,
- 29, 26, 12,134, 70, 15, 7, 79,155, 86,171,133,201,100, 10,120, 54,111,163,209,216,104, 10, 6,134,240, 56,255,219,138, 38,163,
- 15,133, 45,208,126, 59, 65, 65, 65,141,154,126,252, 56, 86, 76, 32,142,150,107,211,163, 68, 42, 1, 39, 17, 11,142, 86,253,153,
- 51,103,198,208,108, 30, 56,132, 1, 11, 0,144,218,111, 36,120,222, 14, 98,183, 55, 90, 38,169, 75,242,157,224,137, 29, 22,171,
- 30, 38,147,201,223,180, 39, 76, 85, 85,149, 97,204,152, 49,219, 0,252,231,190,251,238,203, 67,195,236,194, 68,165, 82,201,196,
- 98, 49, 15,160, 6, 0,185,124,249,114,200,197,139, 23,121,163,209,216,206, 95, 56,215,174, 93,139,147, 39, 79, 98,192,128, 1,
-141,150,131, 18, 92, 81,215,217,221, 3,201,159, 66,115,185,167, 25,225,189, 9,185, 64, 33, 18,137, 16, 18, 18, 2,137, 68,130,
- 15, 63,252, 16, 18,137, 4, 10,133, 2, 0,240,249,231,159, 59, 39, 95,165,160,160,160,184, 97,132,150,191,122,211, 71,179,162,
-207, 38, 68,155,205, 86,146,152,152,216,172,139,217,237,246,114, 63,194,173,100,229,202,149, 18, 87, 23,194,223, 39, 33,164,220,
-207,195,182,100,205,154, 53, 18, 79,238,134,183, 5,166,253,113,218,237,246,146,164,164, 36,175,142,137, 39, 88,173,214,139,254,
- 68,107, 86,165,161,145, 72,152,120,162,216,235,218,137, 20,126,243,154,143,252,249,206,149,230,207, 51,169,169,169, 23, 67, 67,
- 67,215, 69, 71, 71, 87,239,220,185, 51,162, 79,159, 62, 17,174,199,244,233,211, 39,214,237, 52, 51,188,175,115, 8,134, 97, 74,
-238,187,239, 62,143,121, 94, 16, 77, 30,242,103,137,191, 60,191,111,223, 62,137,235,249,222,248, 93,202, 81, 73, 0,194,245,124,
-122,122, 58,235,202,227, 45,239, 91,173,214, 74,154, 11, 41, 40, 40,110,120,161,101, 48, 24,138,187,119,239,110,243,242,223, 5,
- 95,231, 86, 87, 87,247,110,233, 8, 88,173,214,126,127, 7,206,170,170,170, 22,141,187,205,102, 43,113, 76, 80,234,243, 24,154,
-197,255,188,123, 4, 0, 21, 21, 21,183, 0,128, 78,167,131,191,101,117,154, 33, 8, 91, 60,127,218,108,182,126,173,145,166, 53,
- 53, 53, 25, 52,103, 81, 80, 80, 80,161,213, 12,208,197,136,255, 26,104, 13,209, 74, 65, 65, 65, 65, 65, 65,209,178, 96,105, 18,
- 80, 80, 80, 80, 80, 80, 80, 80,180, 14, 24, 52,140, 28,240,132,230,140, 38, 24,118, 5,215,206,161,156,148,147,114, 82, 78,202,
- 73, 57, 41,231, 13,199,233,143,251,186, 25,205,120, 45,250, 75, 15,163,156,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188, 17,
- 65, 8,161, 77,135, 20, 20, 20, 20, 20, 20, 20, 20,173, 5,142, 38,193,159, 6, 17,154, 49,163,126, 0,170, 57, 12,128,183, 5,
-227,204, 12,195, 92,190, 2, 78, 6,128,196,177, 9, 19, 29, 89, 1, 88, 0, 88, 24,134, 33,254, 57,222,103, 75, 75,195,210,136,
- 93,220,135, 48,140,152,231,113,164, 93,187,182,135, 25,230, 46, 51, 0, 40,163,187,116, 85, 41,229,195, 76, 22,115,178, 76, 44,
- 61, 89,171,211,110, 50, 85,228, 23,209,236, 65, 65,241,167,224, 30, 0,211,208,208,173,100, 22,128, 21, 52, 73, 40, 40, 90, 73,
-104,169, 84,170, 3, 44,203, 38,248,155,159, 71,128, 99, 45,179,146,203,151, 47,247,110,198,181,199,168, 84,170, 33, 98,177,248,
- 54, 0,176, 90,173, 59,181, 90,237, 22, 0, 43, 1,216,174, 48, 78,106, 0, 15, 1,120,204,241,123,153,163,178,208, 92, 33, 95,
-247,144,144,144,159,196, 98, 49,169,170,170,234, 11, 0, 17, 17, 17,123,172, 86, 43,163,209,104, 30, 4,112,180,153,124,172, 88,
- 44,158,221,183,111,223,129,219,183,111,255, 15,128,249, 45,116, 47,101, 44,203,122, 20, 40, 60,207, 39, 93,129,200,146, 0, 8,
-153, 63,127,126,196,210,165, 75,211, 75, 74, 74,186, 1, 64, 66, 66,194,177,177, 99,199, 30,158, 48, 97, 66, 53, 33,164,142, 97,
- 24,139, 47,158,210,210,176,180,138,178,130,231,202, 43, 78, 62, 4, 0, 49,177,221, 86,136, 68,172,132,144,131,187, 21,109, 30,
-107,211,177, 67,210,179, 63,124, 51, 95,146,148,220, 22,155,119, 29,186,121,194,203,111,167, 93, 4, 62,163, 98,235,218, 33, 56,
- 56,248, 0,203,178, 9,190,202,184,167, 50,111,183,219, 75,106,106,106,122,123,227,228, 56, 46,193, 87,125,225,105, 31,207,243,
- 5, 85, 85, 85, 30,167,154, 80,171,213,187, 57,142, 75, 14,148, 75,248,180,217,108, 37,222, 70,233,170,213,234, 3, 34,145, 40,
-193, 87, 60, 61,253,199,243,124, 65,101,101,165,183,112, 54,137,123, 75,132,243, 74, 56,125,133, 83,168,143, 0,124, 30, 17, 17,
-113,107,117,117,245,227, 0,222,214,104, 52, 61, 68, 34, 17,194,195,195,223, 54,155,205,103, 67, 66, 66,190,174,171,171,219, 5,
-224,101, 0,116,189, 84, 10,138,150,130, 90,173, 46,215,106,181, 68, 0,207,243,196,106,181, 18,147,201, 68, 12, 6, 3,209,233,
-116, 68,171,213, 18,141, 70, 67,234,234,234, 72,117,117, 53,137,140,140,116,159,188,209, 91, 27,110, 55,181, 90,157,159,149,149,
-101, 42, 44, 44, 36, 22,139,133, 88, 44, 22, 82, 84, 84, 68, 62,249,228, 19,147, 90,173,206, 7,208,205,203,185,195,188, 84, 22,
-119, 0, 88,158,158,158,110, 94,187,118, 45, 49, 26,141, 68,167,211,145, 21, 43, 86,144,155,110,186,201, 12, 96,185,227, 24, 54,
- 64, 78, 0,232, 31, 19, 19, 83,114,238,220, 57,251,166, 77,155, 44, 33, 33, 33, 57, 33, 33, 33, 57, 69, 69, 69,246,115,231,206,
-241,109,218,180, 41, 1,208,191, 25,225, 4,128,209, 19, 39, 78, 44, 47, 42, 42, 34,131, 6, 13, 58,226,178,159,129,255,117,238,
-134,121,114,178, 8, 33, 49,132,144, 88, 52, 76,114,217,100, 35,132,196, 58,142, 9, 11,144, 83, 89, 80, 80,208, 54, 58, 58, 58,
-139, 97, 24,179, 59, 31,195, 48,230,232,232,232,172,130,130,130,182,132, 16,165, 47,206,146, 11, 11,158, 94,183,118,104,173,238,
-242,105,162,187,124,154,252,231,219,193,154,103, 38, 60,190, 60,182,125,207, 69,161, 9,105,243, 79,158, 62,179,144, 16,178,112,
-203,254,252,133, 83,191,252,223,194,251, 39,204,253, 42, 34, 49,253,153,102,164,231,213,128,114, 2, 8, 13, 13, 45,211,233,116,
-132, 16, 66,236,118, 59,177, 88, 44,196,100, 50, 17,189, 94, 79,180, 90, 45,169,175,175,119,150,243,186,186, 58,231,247,168,168,
- 40,175,229, 61, 44, 44,172,220, 96, 48, 52,170, 59,204,102,179,179,254,208,235,245, 68,175,215, 19,157, 78,231,220,180, 90, 45,
-137,139,139, 43,246, 17,206, 75, 66, 56,121,158, 39, 54,155,141, 88, 44, 22, 39,175,209,104,108,180,153, 76, 38, 98, 50,153, 72,
- 98, 98, 98,192,225, 12,132,211,104, 52,146,132,132,132, 82,111,156,225,225,225,229, 70,163,177, 17,167,107,252,221,121,133,223,
- 49, 49, 49,101,205,225, 12, 36,156,190,210,211,129,249,121,121,121,196, 96, 48,144,248,248,248,234, 7, 31,124,208,106,183,219,
-201,218,181,107, 73,122,122, 58, 63,120,240, 96, 75, 85, 85, 21,249,199, 63,254, 65,124,188, 20,210,114, 68, 57, 41,188,155, 22,
-222, 29, 45,134, 97,160, 84, 42,241,227,143, 63,122, 93,142,195,245,123,187,118,237, 2,189,110,239,228,228,228,109, 59,118,236,
-144,199,198,254, 49, 33,182,217,108, 70, 88, 88, 24, 94,120,225, 5,233, 61,247,220,211,113,248,240,225,123,206,159, 63, 63, 8,
-192, 1, 63,124, 15, 68, 70, 70,126, 49,101,202,148,232,135, 31,126, 24, 17, 17,141, 38,221,198,152, 49, 99,240,224,131, 15, 74,
-242,242,242, 30, 89,188,120,241, 35, 11, 22, 44, 40,211,106,181, 19, 0,252,236,139, 84, 46,151,223, 23, 23, 23,247,213,142, 29,
- 59,162,162,162,162,144,146,146,194,190,249,230,155, 29, 59,117,234, 36, 79, 72, 72, 96, 47, 93,186,132, 95,127,253, 53,254,209,
- 71, 31, 93, 85, 94, 94,254,172,197, 98, 89, 29, 64,220,165, 17, 17, 17,111, 63,251,236,179,109, 52, 26,141,237,224,193,131,249,
-194,126,169, 84, 58, 61, 35, 35,163,207,214,173, 91,191, 7,240,245,149, 56, 89,132, 16, 13,254,104,226, 19, 96, 21,254, 15,196,
-217, 34,132, 72,143, 28, 57, 18,158,145,145,241,179,201,100,234,249,220,115,207, 93,152, 57,115,166, 92,173, 86,171, 1, 48, 26,
-141,230,242,180,105,211,204,115,231,206,125,171,107,215,174, 67,119,239,222,253, 0, 33,196,234, 16,100, 77,249, 24,198, 25,158,
-226,139,149,216,182,139,151,190, 55,249,245,132,143,103, 36,159,223,127,162,152,231,228,106,252, 55,247, 56,202,171,181,248,223,
-238, 19,136,137, 8,102, 36, 50,113, 90, 72,252, 77,131,234, 46,158,200,133,143, 25,210, 41, 90, 6, 12,195, 64,161, 80,224,191,
-255,253,111,147,165,171, 60, 45,107,197,113, 28, 66, 67, 67,253,174,110, 16, 20, 20,132, 77,155, 54,121, 92,123,209,211,146, 62,
- 33, 33, 33,240,245,178,193, 48, 12,130,130,130,176,115,231, 78,176, 44,235,113,105, 32,247,125, 74,165, 18,172,143,181,174, 4,
-206,220,220, 92,191, 92,194,167, 74,165, 2, 26,154,254,189, 23, 74,153, 12, 59,118,236,240, 26,103,247,239, 42,199,122,175,254,
- 56,119,238,220,217,104,233, 47,247, 37,193, 92,127, 43,149, 74, 48,126, 72,195,194,194,250, 38, 36, 36, 96,223,190,125, 88,185,
-114,101,120, 90, 90, 26,206,156, 57, 3,134, 97, 48,115,230, 76,230,166,155,110, 18,151,149,149, 97,192,128, 1,248,229,151, 95,
-250,105, 52, 26, 90, 96, 40,254, 44,193, 34, 6,112, 51,128, 72, 52,116,187,169, 7, 16,138,134,149, 52,164, 0,170, 1,200, 29,
-155, 9,128, 22, 64, 27,199,233, 85,142,186,197, 85, 32, 84,186, 46, 62, 77, 8,233,227,224, 22, 86,168,136,116, 57, 86,184,134,
-251,111,247, 79,143,220, 28, 0,100,103,103, 11, 15,179,193,153,153,153,219, 92, 35, 23,136,200, 18,214, 41,243, 80,166,221,135,
-104,202,148, 74,229, 79,123,246,236,145, 71, 70,254, 17, 7,147,201,132,250,250,122,104,181, 90,212,215,215, 35, 56, 56, 24, 43,
- 87,174,148, 15, 29, 58,244,167,250,250,250, 78,142, 68,243,198, 57,231,210,165, 75,209, 54,155, 13, 82,169,231, 46, 74, 44,203,
-162, 75,151, 46,120,251,237,183, 49, 98,196,136,152, 33, 67,134,204,113, 19, 90, 77,134,146, 42, 20,138,175, 14, 30, 60, 24,165,
- 80, 40,144,159,159,143,146,146, 18, 76,156, 56,177, 45,207,243, 40, 46, 46,198,153, 51,103,112,241,226, 69, 44, 94,188, 56,106,
-212,168, 81, 95,121, 16, 90,158,134,167, 62,247,234,171,175,118, 14, 11, 11, 99, 63,249,228,147, 90,157, 78,247,127,142,253,239,
-205,155, 55,239,137,129, 3, 7, 70,253,243,159,255, 36, 59,119,238, 92,234,184,113, 94,211,211,181, 79,150,163,153, 15,142,204,
-119,202,237,156, 46, 46,255,131, 16, 18, 3,192,196, 48, 76,173, 7, 78, 6, 64,200,240,225,195, 95, 51,153, 76, 61,119,236,216,
-113,246,182,219,110, 75, 4,112, 73,200,124, 33, 33, 33,202, 57,115,230, 68,103,102,102,230,221,126,251,237, 61,135, 15, 31,254,
- 90,101,101,229, 76, 66, 72,165, 75,159, 45, 39, 39,207,227, 72, 76,108,183, 21,185,187, 39, 60,180,117,167, 89,242,250,203, 83,
- 47,180,107,155, 84,119, 36,191,198,126,162,160, 18,245, 6, 27,238,191,189, 97, 1,243,190,221,218,225,139, 31,119,224,133, 87,
-222, 17,255,188, 98,201,131,103, 9,148,218,210, 19,107,125,164,231,213,130,114,194,217,196, 4,177, 88,140,187,238,186, 11, 12,
-195, 52, 89,203, 83, 44, 22, 99,247,238,221,184,253,246,219, 33, 22,139,241,212, 83, 79, 5,196,201,113, 28,134, 15, 31,238, 92,
- 71,209,149,207, 93, 52,120,209, 4, 57, 77,222, 14, 57, 14, 44,203,122, 93, 72,219,157,211, 95,189, 36,132,211, 23,151,235,127,
-254,194,233, 88,242, 40, 96,145, 21, 40,167, 16, 78,142,227,208,175, 95, 63, 28, 62,124,216,167,232,242,162, 47, 27,197,253,242,
-229,203,227, 58,117,234,148, 59,127,254,252,112, 0,168,174,174,118, 46,120, 47, 18,137,112,250,244,105,152,205,102,188,255,254,
-251, 22,141, 70,243, 79, 90,142, 40,103,107,114,250,210, 34, 0, 6, 78,158, 60,185,119, 86, 86,214,204,140,140,140, 31,118,237,
-218,181,156, 97,152,108, 66, 72,166,240, 57,121,242,228,180,172,172,172,153,147, 38, 77,122,123,214,172, 89,199, 25,134,201, 6,
- 0,247,223,142,186, 36,211, 77,196, 69, 10, 60,142, 50,215,232, 88, 79,191,221, 63, 61,113, 59,133, 22, 0,100,102,102, 50,142,
- 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,123,113,230,204,153,209,190, 68,150, 86,171, 69,105,105, 41, 18, 19, 19,241,
-212, 83, 79, 69,207,159, 63,255, 69,155,205,246,169, 15, 90,137, 72, 36,194,190,125,251, 80, 81, 81,129,238,221,187, 35, 57, 57,
-185,209, 1,231,206,157,195,186,117,235, 80, 91, 91,139, 94,189,122, 1, 13,157,187, 61,162, 71,143, 30,239,119,233,210,101, 56,
-203,178, 54,185, 92,142, 35, 71,142,160,103,207,158,248,241,199, 31,209,174, 93, 59, 40, 20, 10,228,229,229,161,123,247,238,216,
-182,109, 27, 34, 35, 35,145,158,158,110,211,104, 52,219,107,106,106,182,156, 63,127,254,125,111,225,140,143,143,159,250,204, 51,
-207, 72, 75, 75, 75,249,239,190,251,110, 7,128, 29, 0, 94,124,231,157,119,158, 28, 49, 98, 68,212,161, 67,135,234,246,239,223,
-191,215,139,200, 10,196,201,178,185, 63,148,236,118,187,201, 96, 48,152, 77, 38,147,149,101,217, 34,134, 97,204,118,187,189,147,
- 55, 19, 98,252,248,241,237,171,170,170, 94,120,229,149, 87, 10, 29, 34,235, 52, 26, 58,192, 3, 0,108, 54,155, 73,171,213,106,
- 50, 50, 50, 18, 31,125,244,209,179,203,151, 47,127, 97,252,248,241, 43,191,251,238, 59, 45, 0,131, 59, 97,187,118,109, 15,139,
- 68,172, 68, 87, 31, 94,176,106,229,215,175,174, 91,243, 98,219,226,226,139, 29, 35,218, 68,234, 36,170,200,210,149,203,190, 61,
- 0,192, 92, 90,169,193,209,115,101, 16,139, 69, 56, 89, 92,135,129,119,142, 17,159,205,159,209, 31,192, 90,250, 46,215,250, 47,
-139,194, 34,212, 91,183,110,245,233,104,237,222,189, 27, 98,177, 24,114,185, 28,115,231,206,245, 73, 42, 8, 3,193, 45,242, 39,
-102,132,197,209,125,185, 79, 60,207, 59, 23,122,119,223,254,239,255,254, 15,175,188,242, 74,163,107, 56,196, 6,227,143,211, 91,
-248, 18,147,146, 80, 81, 94,222,104, 95, 32,139,210,219,237,118,136,197, 98, 44, 90,180, 8,153,153,153,200,206,206,246,249,121,
-215, 93,119,129,101, 89, 18, 72,122,246,235,215, 15, 22,139,197, 25,230,211,167, 79,123,228, 93,176, 96,129,191, 96,222, 3, 96,
- 90,207,158, 61,213, 67,134, 12, 65,110,110, 46, 30,124,240, 65,147,197, 98,201, 7,128,187,239,190, 59,117,254,252,249,210,131,
- 7, 15, 34, 34, 34, 66,124,225,194,133,255,128,118,144,167,104,101,120,210, 34,194, 51, 47, 43, 43,107,166,187,136,113,133,240,
- 63,195, 48,217,179,102,205,202,116, 21, 69,174,191, 5,215,201, 77,196,165,185, 58, 82,174, 34,202,155,128,114,123,222,186, 30,
- 95,233, 81,104, 57, 34, 54,216,213, 5, 18, 42, 95,127, 34,203,199,155, 99, 35,132,132,132,140,188,255,254,251,157, 34,199,104,
- 52, 58, 5,150, 32,178,132,223,121,121,121,232,221,187,183, 36, 36, 36,100,100,117,117,245,167, 1,136, 56,196,197,197,161,170,
-170, 10,199,142, 29, 67, 98, 98, 34,172, 86, 43, 54,108,216,128,186,186, 58,136,197, 98, 72, 36, 18, 88, 44, 62,251,110,163, 75,
-151, 46,119, 45, 93,186,180,247,146, 37, 75, 46, 11,111,116,203,150, 45, 3, 33, 4,145,145,145,208,235,245, 40, 47, 47,199,150,
- 45, 91, 96,179,217,160, 82,169,144,146,146, 34,189,239,190,251,250, 79,155, 54, 77,236, 67,104,245,123,240,193, 7, 67,212,106,
- 53, 94,126,249,101, 98,177, 88,102, 57,246, 77,157, 48, 97, 66, 68, 81, 81,145,249,233,167,159,222,103,177, 88, 62, 17,204, 68,
- 87,129,227,229,198,122,117,178,172, 86,171,144,166,133, 90,173, 22,109,218,180, 73,116,117,182,188,137,193,157, 59,119,246, 3,
- 32,154, 62,125,122, 16,128,114,215, 48,152,205,102,104,181, 90,232,116, 58,107, 93, 93, 93,197, 27,111,188, 97, 91,190,124,185,
-200,113,206, 73, 79, 66,139, 97,238, 50,171,213, 10, 41, 33,162,119, 22, 46, 92,168, 26, 49, 98, 4,171, 82,169, 80, 95, 95,175,
-254,223,250,245,170,161, 67,250,167,204,204,250,120,163, 58,161,123,249,206, 35, 5,184, 88, 86, 7,179,213,138,148,216,144, 6,
- 63,140,162,213,225, 24,200,226,116,180, 92, 69, 69,110,110, 46,238,188,243, 78,103, 89,151, 72, 36,141,156, 47,127,156, 28,199,
-225,206, 59,239,108,226,240,108,221,186,213,163,251,228, 15,174,162,200, 93, 28,121, 18, 96, 44,203,250,157, 48, 80,112,243, 60,
-137, 45, 87, 87,223, 77,188,249,107,230, 0,199,113,152, 48, 97, 2,196, 98, 49,222,124,243, 77,112, 28,135,244,244,116,112, 28,
-135,140,140, 12,136,197, 98,220,126,251,237,205,142,251,158, 61,123,208,179,103, 79,103,152,210,211,211,209,167, 79, 31,112, 28,
-135, 1, 3, 6, 64, 44, 22, 99,248,240,225,129,112,190, 93, 95, 95,223, 67,165, 82, 33, 47, 47, 11, 97,163,210, 0, 0, 32, 0,
- 73, 68, 65, 84, 15, 34,145, 8, 12,195,156, 1,208, 3, 0, 98, 99, 99,207,234,245,250,246, 70,163, 17,207, 60,243, 12, 99, 54,
-155,187,191,249,230,155,239, 24,141, 70, 42,180, 40, 90, 13,238, 90,196, 5,134, 73,147, 38,189,205, 48, 76,182,224, 80,185, 59,
- 79,158,126,123,168,155, 4, 7,106,191,163,172,246,113, 19,113,149, 12,195,236, 39,132,220,237,237, 92, 0,102, 55, 97,213,168,
-233,208,181,217,208,175,163, 37, 84,190,129, 10, 45,127, 48, 26,141, 55, 71, 69, 69,121, 21, 89,174,159,102,179, 25,201,201,201,
- 48, 26,141, 55, 55,247,161, 17, 27, 27, 11,139,197,130,175,191,254, 26, 18,137, 4, 18,201, 31,250,194,108,246,109, 22,157, 56,
-113,162,112,207,158, 61, 61,123,245,234, 21,246,203, 47,191, 84, 14, 26, 52, 40,114,196,136, 17,144,203,229, 48, 24, 12,176, 90,
-173,232,219,183, 47,186,116,233,130,146,146, 18,252,239,127,255,171,234,212,169, 83,155,189,123,247,242,101,101,101,231,125, 80,
-223, 49,116,232, 80, 48, 12,131,245,235,215, 87, 1,216, 47,147,201,214,205,152, 49, 35,204,108, 54,243, 99,199,142,189, 80, 83,
- 83,243, 10, 0,139, 84, 42,157, 55,104,208,160,140,156,156,156,239,121,158,159,219,220,140,234,158,182, 58,157, 14, 65, 65, 65,
-129, 76, 37, 33,174,169,169,233, 6, 0, 74,165, 50, 28,192, 89,103, 14, 55, 24, 26,137, 97,179,217,108, 12, 15, 15, 87, 2,128,
-227, 28,177, 23,206, 72,155, 13,171,206,159, 47, 8,118,237, 63, 23, 26, 26,138,199, 30,125,148,189,173, 95, 63,105,143,155,111,
- 30,254,238,103, 75,126,140,139, 80,155, 83,226, 34, 96,181, 91,145,179,113, 3, 79,120,235, 70, 90,237, 92, 27,161, 37,136, 13,
-119, 71, 75, 44, 22, 99,219,182,109, 77,246, 73, 36, 18,252,251,223,255, 14, 72, 24, 8,162,202, 91,211,153, 91, 83, 23,227, 79,
-192,136,197, 98,136, 68, 34, 44, 90,180, 8, 60,207,227,213, 87, 95,109,212,156,232,202, 31,144,157,231, 34, 2,187, 76,229, 1,
-152, 81, 50, 91,230, 60,223, 61,188,142,115, 2,114,201,230,207,159, 31,144,163,117,247,221,119,251, 21,174,174, 45, 12,174,225,
- 58,124,248,176, 71,222,133, 11, 23,250, 77, 79,187,221,142,181,107,215, 58, 69,170,128,119,223,125,247, 25,169, 84, 26,189,125,
-251,118,148,149,149, 65,167,211, 65,171,213,162,111,223,190, 41, 44,203, 30, 41, 43, 43, 43, 58,121,242,228,253,180,244, 80, 92,
- 67, 71,203, 52,107,214,172,227,179,102,205,242,232, 88,185, 59, 75,190,156, 39, 65, 96, 57, 4, 81,164, 32,222,208,208,173,102,
-191,191,115, 1, 72,221,155, 14,125, 26, 65,110, 42,114,154,167,202, 55,144,230,195, 0,237,116,142, 97, 24, 24,141, 70,143, 2,
-203, 85, 28, 88, 44, 22,212,212,212,192,110,183, 95,241, 92, 95,158,222,100,253, 9,173, 99,199,142,253,227,201, 39,159, 44, 13,
- 9, 9,233, 81, 89, 89, 89,193,243,252,237,187,119,239,142,228, 56, 14,106,181, 26,106,181, 26,235,214,173,131, 66,161,192,132,
- 9, 19, 42,236,118,123,110,112,112,112,132,193, 96,248,189,172,172,236, 93,175, 10, 70, 44, 30, 62, 96,192, 0, 28, 60,120, 16,
-151, 47, 95,222, 4, 32,253,241,199, 31,191,179,109,219,182,204,140, 25, 51,140,231,206,157,155, 11,160, 66,169, 84, 46, 93,186,
-116,233,144, 94,189,122, 5,143, 29, 59, 22,219,182,109, 91, 8,192, 24,104,156,117, 58, 93, 35,129,165,209,104, 80, 95, 95, 15,
-165, 82,105, 11, 48,205,196,248, 99,132, 33, 8, 33,206,123,227,112,179,132,251, 67, 56,142, 19, 70, 53,122, 19, 89, 80, 42,149,
-211,151, 44, 89, 34,119, 31,164, 96,183,219, 81, 94, 94, 14,181, 90,141, 41,239,190, 43,249, 96,226, 63,123,138, 84,209,187, 89,
-150,129,217, 66,106, 9,111,222,160, 43,127,120, 59,240, 62,173,121,174, 1, 4, 97,112,239,189,247, 54,105, 46,148, 72, 36,216,
-180,105, 19, 70,141, 26,229,124,113,233,213,171,151,223,151, 43, 65, 24,220,115,207, 61, 78,103,104,195,134, 13, 30,155,253, 4,
- 71, 42, 16, 65, 40, 28,251,210, 75, 47,129,227, 56,124,241,197, 23,120,237,181,215,192,178, 44,102,207,158, 13,150,101,241,222,
-123,239, 5, 44, 50, 93, 5, 76,209,199, 13,159, 9,175,105, 80,189, 32, 26, 0, 16,172, 86, 11, 17,106, 86,221,195,113,156,211,
-201,186,249,230,155, 33, 22,139,145,145,145, 1,142,227,156, 78,214,200,145, 35, 93,211,145, 4,194,201,113, 28,242,243,243,157,
- 97,206,200,200,104,228,100,113, 28,135,187,239,190, 59,144, 96,206, 12, 13, 13,157,214,165, 75,151,174,115,230,204, 17,139, 68,
- 34, 12, 29, 58, 52, 53, 38, 38,230,188,205,102,139,152, 62,125,186,194,195, 57,114, 0, 61,186,118,237,170,164,165,134,162, 21,
- 29,173,105, 30,254, 10,115,237,115,213,140, 23,201,108,215,227, 5, 14,119,113,228,112,200,114,253,113,121, 58,215, 31, 56, 65,
- 65,250,178,212, 3, 17, 90, 14,219,217,231,197, 20, 10,197,209,138,138,138, 12,185, 92,222, 72,100,121, 18, 92, 34,145, 8,101,
-101,101, 80, 40, 20, 71, 77, 38, 83,139,221, 68,127, 77,135, 0,140,103,206,156,153,232,242,123,216,200,145, 35,191,219,180,105,
- 83,108, 78, 78, 14,246,238,221,139,200,200, 72,204,159, 63,255, 82,121,121,249, 63, 0,108,170,170,170,242,123,221,246,237,219,
-119, 83,169, 84,216,185,115, 39, 0,108, 3,240,207, 23, 94,120,129,177, 90,173, 88,176, 96,129, 14,192,250,208,208,208,181, 43,
- 87,174,236,217,163, 71, 15,105, 78, 78,142,102,239,222,189,191, 5, 40,178,236, 60,207, 55, 17, 88,174,105, 26, 28, 28, 28,136,
-163,101, 13, 9, 9, 57,166,209,104,198, 24, 12, 6,141, 76, 38, 11,214,104, 52, 38, 87,129, 37,240,115, 28, 39,206,207,207, 47,
- 5,144, 18, 18, 18,114, 12, 94,154, 57, 57,142, 27, 58,116,232, 80,206,253, 30,148,151,151,163,172,172, 12, 22,139, 5,189,122,
-245, 98, 68,140, 85,116,185,248,168,219,180, 14, 84,100, 93, 35, 71,139, 8,101, 93, 24, 37,232,105,164,225,134, 13, 27,156,191,
- 89,150,197,183,223,126, 27,144, 40,218,180,105,147,207, 14,235,110, 77,135,126,173,113,225,248, 47,191,252,178, 97,121, 11,135,
-147,197,178, 44, 38, 77,154, 4,153, 76,134, 25, 51,102, 96,210,164, 73,224, 56,206,111,211,161,171,128, 73,122, 83,239,250,114,
-212, 80, 40, 28,253,161, 24,134,113, 21, 91, 76,160,226,205,151,155, 23, 72, 75,128, 43,167,112, 94, 80, 80,144,215,142,240,110,
-156,190, 46,240, 95, 0, 5,177,177,177, 59, 51, 50, 50, 66, 14, 28, 56,128,217,179,103, 75, 76, 38, 83,187,156,156, 28,231,117,
- 61,165,151, 78,167,147,211,146, 67,209, 26,110,150,143,191, 43,221,250, 87, 49,174,205,120, 62, 62,221,143,135,203, 62, 87,222,
- 74,134, 97,172, 30,174, 87,233, 65, 92,185, 95,195,245,152, 74,175,142,150,191,202,194,159,224, 10,196,209,210,235,245,191,173,
- 95,191,190,207,163,143, 62,202,249,106, 54,212,233,116,136,142,142,198,241,227,199,109,122,189,254,183, 0,156,178,150, 20, 90,
-238,200,169,168,168, 16, 89,173, 86,116,236,216, 17,241,241,241, 48, 26,141,168,173,173, 21, 1,216, 20, 32,135, 68,169, 84,138,
- 0,160,182,182, 22,104, 24,106,154,218,169, 83, 39, 28, 60,120, 16, 53, 53, 53, 63, 3, 24, 49,109,218,180, 94,125,251,246,149,
-252,248,227,143,250,231,158,123,238,103,171,213, 26,144,210,224,121,222,108,179,217,146, 89,150,181,212,214,214, 94,116, 77,207,
-232,232,232,112,165, 82,201,148,151,151, 91, 3, 17, 90, 61,122,244,216,119,225,194, 5, 76,159, 62,189,114,230,204,153,157,234,
-235,235, 47,215,213,213,217, 92,197,150,209,104,100,219,180,105, 35, 91,176, 96,129, 28, 0,122,244,232,177,207,155,208,210,233,
-116,109, 21,138, 63, 94,140, 77, 38, 19,202,202,202, 80, 86, 86,134,242,242,114,212,215,215, 35, 37, 37, 5,122,189, 62,145, 86,
- 51,127,154,208,106,212,124,230, 90,190, 93, 31,228,205, 41,235,174, 2,230,222,123,239,117,246,237, 18, 28, 50, 97, 91,181,106,
-149,123, 7,243,128,132,214,151, 95,126,137,151, 94,122, 9, 65, 65, 65,152, 51,103, 78,163,166, 67,119,113,192,243, 60, 19, 72,
-220,147,223, 50,160,108, 94, 56,196, 98, 49, 34,158, 43,111,212, 68,231, 65,112, 4, 20,206,153, 51,103,182, 72,211,161, 43,103,
- 98, 98, 67, 81, 89,180,104, 17,198,140, 25,131,237,219,183, 95,113,211, 97, 90, 90,218,178,236,236,236,144, 19, 39, 78, 64,163,
-209,160,178,178, 18, 38,147, 9, 37, 37, 37, 94, 91, 5, 28,117,121, 16, 45, 57, 20,215,184,158,218,127, 45,121, 91,242,122,156,
-159, 7,120,192, 66, 43, 16, 71,203,100, 50,205,121,249,229,151, 95, 24, 54,108, 88,120,112,112, 48, 74, 75, 75,155,136, 44,173,
- 86, 11,149, 74, 5,131,193,128, 53,107,214,104, 76, 38,211, 28,127,226,192,106,181, 34, 42, 42, 10, 85, 85, 85,224,189,244,159,
-102, 89, 22,114,185, 28, 90,173, 22,240,211,201,220,211, 3,195, 98,177,192,106,181,194,106,181,194, 98,177, 52,119, 69,110,133,
- 82,169, 20,132, 7, 0,232,226,226,226, 58, 6, 5, 5,161,176,176, 16,104, 24,217, 55,236,206, 59,239, 20, 87, 87, 87,147,167,
-159,126,122, 7, 33,228, 25,248,158, 29,223,156,155,155,155, 12, 0,114,185, 60, 15, 0, 74, 74, 74,172,181,181,181,141,156, 66,
-133, 66, 65, 70,141, 26, 21, 75, 8, 65,110,110,110,178, 68, 34, 33,240, 62,170,209,184,122,245,234, 19, 33, 33, 33,203,179,178,
-178, 30,205,204,204, 60,222,173, 91,183,100,157, 78, 87, 97, 48, 24, 12, 70,163,145,136, 68, 34, 73, 88, 88, 88,208,198,141, 27,
-207,238,222,189,123,152, 90,173, 94,190,122,245,234, 19,222,156, 55,165, 82, 89,162,215,235,147,132,123,234, 42,178,202,202,202,
- 64, 8, 65, 65, 65, 1, 20, 10,197, 5,127,205,186, 20,173, 7,225,165,202,221,121,113,223, 23,168,200,114, 21, 6, 27, 55,110,
-244, 57,135, 86,160,156,174,162,232,181,215, 94,195,188,121,243,154, 56, 90, 51,102,204, 0, 0,188,251,238,187, 1,247,209, 18,
-220,171,178,121,225,136,121,169,166, 81,216, 1,128, 17,194,215,188, 50, 15,142,227, 48,125,250,244, 38,157,212, 93,155,246, 2,
-108,226,107, 20,206,138,138, 10,112, 28,135,240,240,112, 60,246,216, 99, 24, 62,124,184,179, 9,178,185,188,167, 78,157,218,249,
-214, 91,111,117, 79, 75, 75,195,135, 31,126, 88, 19, 26, 26, 26,252,175,127,253,139,171,173,173,101,124, 57, 90, 84,104, 81, 80,
-180,128,208, 18, 10, 88,160,163, 14,189, 84,150,195,208,120,174,141, 58,189, 94,255,216, 29,119,220,241,203,138, 21, 43,228,237,
-219,183,199,169, 83,167, 80, 83, 83, 3,179,217, 12,137, 68,130,216,216, 88,212,214,214,226,219,111,191, 53,232,245,250,199, 0,
-212,249,225,124,167,119,239,222, 95,125,250,233,167, 65,233,233,233,168,169,169,129, 86,171,117, 10, 33,134, 97,160, 86,171, 33,
-151,203,177,111,223, 62,108,216,176,193, 0,224, 29, 63,156,158,212, 28, 44, 22,139, 83,112, 5, 32,180, 92, 57,149,130,171,163,
-215,235, 1,192,218,182,109,219, 24, 0, 40, 40, 40, 0,128,162,148,148,148,105,237,219,183,103,150, 46, 93, 74, 8, 33, 27,188,
-136, 44, 39, 39,195, 48, 53,132,144,203, 0, 98,204,102,179, 4, 0,234,234,234, 44,109,218,180,137,146,201,100,188, 92, 46,231,
-131,130,130,248,210,210, 82,155,205,102,147, 0,192,128, 1, 3,204, 0,202,220,214, 40,116,229,228, 9, 33,154,133, 11, 23, 78,
- 27, 59,118,108, 70,191,126,253,210,158,127,254,249, 99, 79, 63,253, 52, 27, 31, 31, 31, 86, 95, 95,111, 60,115,230,204,229,207,
- 62,251,172,126,207,158, 61,195,196, 98,241,249,133, 11, 23, 78, 3,160, 97, 24,134,247,196,105,179,217,126,203,201,201,249, 71,
-102,102, 38,119,241,226, 69,148,151,151, 59, 69, 86,121,121, 57,186,116,233,130,221,187,119,219, 45, 22, 75, 78, 51,210,179,165,
- 64, 57, 27, 94, 66,136, 80,214,189, 9, 44,225,101, 42, 80, 78, 87, 81, 52,102,204,152, 70, 46,150, 68, 34,193, 79, 63,253,228,
-177,222,240, 80,174, 26,197,221,117,142,175,183,222,122,171,145,104,155, 50,101,138,215,234,204, 95,122, 10, 60,117,139,226, 27,
-143, 58,244, 82,206,125,133, 83,168, 59,197, 98, 49,166, 76,153, 18,176,163,133,166,125,180,154,112, 10,113, 31, 52,104, 16,244,
-122,189, 83,200,122,115,180,252,165,167,221,110,127,105,222,188,121, 68,173, 86,223,170,209,104, 30,191,112,225,194, 98,189, 94,
-127, 75, 93, 93,157, 79, 71,203,100, 50,201,104, 57,162,156,104,157,249,185,110, 28,161,229,120, 72,162,109,219,182,141,214,206,
- 98, 89,182,209,214,156,126, 6, 14,108,204,207,207,127,224,182,219,110,251,254,165,151, 94, 10, 78, 79, 79, 23, 39, 37, 37, 65,
-167,211,161,176,176, 16,199,143, 31,183,173, 94,189, 90,163,215,235, 31, 7, 16,200,168,179, 37, 39, 78,156,216, 48, 98,196,136,
-247,250,246,237,251,236,212,169, 83, 69,169,169,169,168,171,171, 67, 88, 88, 24,162,162,162,112,250,244,105,172, 89,179,198, 94,
- 85, 85,245, 21,128, 15,224,161, 13,213,223, 11,191,197, 98,193, 35,143, 60, 2,158,231, 49,119,238, 92, 4,178,160,178, 11, 44,
- 22,139,133, 0, 96, 28,253,185,244,142,217,165,113,230,204, 25, 0, 56,159,156,156, 28, 12, 0, 57, 57, 57, 12, 26,230,215, 10,
-228, 13,159, 16, 66,156,206, 86,151, 46, 93, 10,221, 43, 71,193,201, 18, 92, 48,127,225,102, 24,198, 72, 8,169,208,235,245, 35,
- 94,123,237,181,247,190,252,242,203, 71,191,252,242,203, 38,199,169,213,234,229,179,103,207,254,224,161,135, 30,170, 96, 24,198,
-107, 63, 50,157, 78,247,238,184,113,227, 30, 58,122,244,104,112, 80, 80, 16,116, 58, 29,170,171,171, 97,177, 88,144,146,146,130,
-138,138, 10, 44, 89,178,164,222, 96, 48,188, 79,139,227,159, 3, 87, 97,224,205,213, 10, 64,100,121,117,117,254,251,223,255,122,
-156,163,170,185,156,238, 98, 35,208,185,173,124,189, 20, 9,211,210,120,154, 50,162,153,245, 90, 19, 94,142,227,240,201, 39,159,
- 56, 39,109,245,228,100, 53,199,209, 18, 56,195,195,195, 27,108,114,133, 2, 60,207,227,238,187,239,190, 26, 94, 30,192, 4,151,
- 25,223,103,190,241,198, 27,211,186,116,233,146, 10, 64,230,154, 6,205,116,241, 41, 40, 40,252, 9, 45,187,221, 94,210,185,115,
-231, 70, 21,156,191,197, 76,173, 86,107, 73,128,215,221,160,211,233, 82,102,207,158,253,178, 82,169, 28,166,215,235,187, 59, 42,
-142,163, 58,157, 46,199,100, 50,125,142,230, 45, 2, 93, 9,224,197, 61,123,246,204, 29, 49, 98,196,140,219,111,191,125,244,196,
-137, 19, 25, 66, 8, 22, 44, 88, 64,206,157, 59,183,202,225, 98,157,187,146, 68, 10, 15, 15, 63,241,237,183,223, 70,255,242,203,
- 47,176, 90,173,248,252,243,207, 17, 28, 28,124,162,166,166, 38, 80,138,138,205,155, 55,127,215,175, 95,191, 39,118,239,222,189,
- 4,192,239,219,182,109, 91,220,191,127,255,113,187,119,239, 94, 6,224,248,150, 45, 91, 22,247,237,219,119,220,254,253,251, 87,
- 2, 56,220,140,202,215,233,108,217,108,158, 91, 26,189, 56, 89,190, 56, 53,132, 16,203,147, 79, 62, 57,241,161,135, 30,250,122,
-255,254,253,183,212,214,214,118, 7,128,208,208,208,163,125,250,244,217,183, 98,197,138,211, 14, 39,203, 95,103,253, 74,157, 78,
- 55,170,123,247,238, 63,127,248,225,135,202,180,180, 52,174, 99,199,142, 40, 42, 42,194,177, 99,199,108,255,249,207,127,180, 6,
-131,225, 94, 0,151,105,113,252,243,132, 22, 33, 4,161,161,161,141, 94,162,132, 33,255,205,109, 46,116,125, 48, 11, 75,245,184,
-243,122,227,244, 53,109,130, 0,149, 74,229,156,220, 52,144, 46, 11, 60,239,123, 62, 54, 66,136,147, 83,216, 2, 16, 89,126, 71,
- 8, 58,150,192, 9,152, 51,144,233, 29,148, 74, 37,172, 86,171,147, 55,128,145,159,205, 85,139,255, 5,240, 95,171,213,122, 6,
- 64, 7, 42,174, 40, 40, 90, 81,104, 93,190,124,185,119, 43, 95, 91, 99, 50,153, 62, 48,153, 76, 31, 8, 59,140, 70,227,213,114,
-158, 3,240,208,230,205,155, 63,221,188,121,179,208,142, 48, 29,254,215, 75,244,137, 83,167, 78,101,138,197,226,127, 47, 95,190,
-188, 47, 33, 4, 33, 33, 33,123,138,138,138,254,213, 28, 14,187,221,254,228,238,221,187, 95,128,163, 47,147,197, 98,121,114,231,
-206,157, 47,163, 97, 61, 38,216,237,246, 39,247,238,221,235,252,221,204, 7, 37, 33,132,152, 8, 33,113, 94, 14, 49, 53,211,129,
- 19,156, 45,243,138, 21, 43,180, 0,142,224,143,121,178,172,142,205,232,214, 92,232, 11, 91,116, 58, 93,199, 41, 83,166,204, 20,
-137, 68, 67,117, 58, 93,188, 82,169, 44,182,217,108,191,233,245,250,119,208,176, 70, 21,197,159, 4,179,217,124,177,115,231,206,
-156,167, 23, 40, 95, 15,114, 95, 47, 86,118,187,189,164, 83,167, 78,126, 95,206, 60,112, 94,244, 33, 26,206,167,164,164,176,129,
-114, 9,176, 88, 44, 21,190,194,153,146,146,130,230,114,250,139,123,114,114,178,199,184,251, 17,132, 94,227,110,179,217,174,136,
-211, 87,122,250,130,193, 96,184, 28, 25, 25,169, 53, 26,141, 98,147,201, 36,182,217,108,141,236, 71,185, 92, 94,105, 48, 24,104,
-225,161,160,184, 26,161,245, 55,199, 1, 52, 44, 47,209, 82, 48, 29, 61,122,244, 9,167, 61, 85, 81,113,165, 60,238, 74, 82,235,
-231,119,115,132, 81,139, 59, 66, 14, 33,165,111, 33,186, 42,173, 86,251,180,240, 67,232, 3, 66,241,231,163,186,186,250,214,150,
-230,172,169,169,105,241, 23,181,170,170,170,140, 86,136,123,239, 27,149,211, 23, 74, 75, 75,111,245, 35,196,104,193,161,160, 8,
- 16, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,214, 1,131,134,145, 3,158,208,156,209, 4,195,174,224,218, 57,148,147,114, 82,
- 78,202, 73, 57, 41, 39,229,188,225, 56,253,113, 95, 55,163, 25,175, 69, 63,199, 97,148,147,114, 82, 78,202, 73, 57, 41, 39,229,
-164,156, 55, 34, 8, 33,180,233,144,130,130,130,130,130,130,130,162,181, 64,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20,
- 20, 20,127, 83,164,182,109,219,246,100,106,106,234, 69, 0,227, 91,249, 90,143,245,237,219,183, 90, 38,147,109, 4,144, 74,147,
-158,130,130,130, 10, 45, 10, 10,138,235, 90,100,117,239,222,125,199,169, 83,167,186,228,228,228,196,197,199,199,127,220,154, 23,
-235,221,187,247, 71,219,183,111, 15, 95,191,126,253, 29, 49, 49, 49,185, 87, 40,182, 82,219,181,107,119, 50, 53, 53,181, 4,192,
- 99, 45, 28,196,241, 25, 25, 25, 53, 82,169,116, 3, 21,130, 20, 55, 0,186, 1,232, 78,133, 22, 5, 5, 5, 69, 43,138,172, 93,
-187,118, 69, 24,141, 70,156, 58,117, 10,149,149,149,135, 91,243,130,121,121,121,151,119,237,218,133,132,132, 4, 44, 91,182, 44,
- 50, 57, 57,121,123, 51, 5, 77,106,247,238,221,119,156, 60,121,178, 75, 78, 78, 78,124, 84, 84,212,103, 45, 25,190, 91,110,185,
-101,198,246,237,219,195, 54,110,220, 56, 60, 50, 50,242, 74,133, 32, 5,197, 95, 25, 50, 0, 79, 48, 12,179,175, 91,183,110, 71,
-211,210,210,126,103, 24,102, 55,128, 49,184,126,231,238, 12, 12,217,217,217,219,178,179,179,183,209, 60, 66, 65, 65,209, 2, 72,
- 75, 75, 75,211,233,116, 58, 82, 89, 89, 73,190,248,226, 11, 18, 30, 30,110, 1,240, 27,128,213, 30,182,183, 1,168, 3,228, 86,
- 59,142,247,196,243, 91,120,120,184,229,139, 47,190, 32, 5, 5, 5,228,196,137, 19, 36, 53, 53,213, 16,160,160, 73,237,222,189,
-123,149, 16,230,117,235,214, 17,142,227, 54,180,100,162,168,213,234,227,185,185,185,228,220,185,115,100,227,198,141, 36, 58, 58,
-186,130,138, 45,138,235, 4, 73, 0, 62, 82,169, 84, 53,247,220,115, 15,249,230,155,111,200,154, 53,107,200,207, 63,255, 76,230,
-204,153, 67,134, 12, 25, 66,164, 82,233, 69, 0,111, 2, 8,189, 81,180, 8, 33,164, 97, 85,251,236,236,108, 2, 96, 48, 0,100,
-102,102, 82,177, 69, 65, 65,113,181,216,165,215,235, 51,244,122, 61,234,235,235,209,182,109, 91,136,197, 98,143, 7, 86, 84, 84,
- 96,231,206,157,152, 48, 97,194,137,178,178,178,129,240,189,238,101, 88,207,158, 61,119,109,217,178, 37, 53, 56, 56,216,185,147,
-231,121, 88, 44, 22, 88,173, 86, 88, 44, 22,152, 76, 38,152, 76, 38, 72,165, 82,200,229,114,132,135,135, 31,131,239, 38, 12,167,
-251,102, 48, 24,112,232,208, 33,140, 29, 59,182,178,186,186,122, 32,128,188, 22, 76,151,212,168,168,168,220, 37, 75,150, 68,166,
-164,164,224,194,133, 11,120,234,169,167,170,206,159, 63, 63,160,133,175, 67, 65,113, 45, 49,233,129, 7, 30,152, 17, 29, 29,205,
-118,235,214, 13,177,177,177, 48,153, 76, 48, 24, 12, 32,132,128,227, 56, 16, 66, 80, 87, 87,135,220,220, 92,108,217,178,197,116,
-249,242,229,111, 1,124, 14, 32,223, 69,100, 93,119, 90,164,145,208,202,204,204,100,104, 94,161,160,160,104, 33, 28,173,171,171,
-235,102, 50,153,160,211,233, 2, 58,161,160,160, 0,227,199,143, 63, 81, 86, 86,118, 27, 60, 47, 42,175,238,217,179,231,222,220,
-220,220, 84,163,209, 8,141,198,255,186,243, 82,169, 20, 65, 65, 65,136,136,136,216, 13,160,159,183, 55,241,110,221,186, 29,216,
-189,123,119,184,193, 96,192,225,195,135,241,216, 99,143, 89,106,106,106,118, 0,240, 22,248, 26, 52,172,163,122,222,195,127,137,
- 0, 94,118,188,225,123,130, 50, 50, 50,178,255,210,165, 75, 37,237,219,183,135, 94,175,199,152, 49, 99,106,242,242,242,250, 0,
- 40,164, 89,135,226,111,136,188, 83,167, 78,117,178,219,237,168,170,170,130,201,100,130, 94,175,119, 10, 45,145, 72, 4, 66, 8,
-108, 54,155,243,197,232,224,193,131,200,201,201, 33, 5, 5, 5, 83, 29,101,233,186,212, 34, 84,104, 81, 80, 80,180, 22, 82, 59,
-117,234,116,248,127,255,251, 95,144, 68, 34,193,154, 53,107, 48,117,234, 84,107, 77, 77,205,118,119,241, 18, 29, 29,157,182,120,
-241,226,228,148,148, 20,252,254,251,239,120,240,193, 7,223, 1, 48,211, 3,231,219, 26,141,102,134,197, 98,193,225,195,135, 49,
-110,220,184,194,242,242,242,227,238, 34, 38, 57, 57,121,192,103,159,125, 38,238,213,171, 23, 52, 26, 13, 70,143, 30,173, 63,125,
-250,116, 95, 0,199,189,132,245,179,154,154,154,215,236,118, 59,234,235,235,145,144,144, 0,137, 68,226, 51,114, 6,131, 1, 73,
- 73, 73,187, 43, 43, 43,155,136,183,136,136,136,205, 23, 46, 92, 24, 34,151,203,125,114, 88, 44, 22,148,148,148, 64, 42,149,194,
-100, 50,161, 67,135, 14,223, 2,120,146,102, 29,138,191,163,208, 58,114,228, 72,167, 31,126,248, 1, 61,123,246, 68,215,174, 93,
-161,213,106,157,162,203,108, 54,195,106,181, 54, 57, 73,163,209,224,213, 87, 95,205,135,163,249,252,122, 21, 90, 66,199,180,105,
- 66,155,104,102,102,230, 32,154,103, 40, 40, 40,174,182,226,205,207,207, 79, 31, 54,108,216,246, 85,171, 86,181, 25, 57,114, 36,
- 58,116,232, 32,190,255,254,251, 35,245,122,253, 80,215, 3,203,203,203,195,198,141, 27,119,160,184,184, 56,217,177,171,143, 23,
-206, 62,193,193,193, 40, 40, 40, 16, 68, 86,111,184, 53, 51, 74,165,210, 13, 71,142, 28, 17, 75,165, 82,236,223,191, 31,227,199,
-143,175, 42, 44, 44,244,215, 44, 23,106, 54,155, 33, 18,137, 0, 0, 37, 37, 37,126, 35,119,225,194, 5,240, 60,111,242,244, 31,
-203,178,178,131, 7, 15, 34, 46, 46,206, 39, 7,203,178,238,130,174,150,102, 27,138,191, 41,172,102,179, 25,189,123,247, 70, 97,
- 97, 33, 14, 30, 60,232, 20, 92, 85, 85, 85, 40, 45, 45,109,116,240,190,125,251,112,232,208, 33, 12, 28, 56,208,157,231,186,212,
- 34, 78,229,152,157,157, 61,200, 17,185,109, 52,207, 80, 80, 80,180, 16, 82,227,226,226,114,151, 44, 89, 18, 25, 27, 27,139, 33,
- 67,134, 20,151,149,149,181,243,112,220,106, 66,200,189, 5, 5, 5,104,223,190,253, 26, 0,247, 93,201, 49,137,137,137,149,251,
-247,239,111,115,226,196, 9, 60,246,216, 99,149,142, 62, 95,254,250, 62, 37,119,233,210,101,255,198,141, 27,195, 89,150,197,241,
-227,199, 3,105, 58, 44, 66, 67,255,146,243, 30,254, 75, 4, 48, 5, 64,184,151,115,149,157, 58,117,234,127,224,192, 1, 9,195,
- 48, 40, 42, 42, 18,154, 14,123, 59,120, 41, 40,254,110, 24, 21, 23, 23,247,159, 23, 94,120, 33,164,111,223,190, 40, 41, 41,193,
-197,139, 23,113,249,242,101,164,167,167, 35, 45, 45, 13,231,206,157,195,134, 13, 27,112,232,208, 33,200,100, 50, 36, 36, 36, 64,
-181,252, 7,252,155,193, 9, 0,105,215,171, 22,185, 22,107, 29, 82, 80, 80, 80,164, 74, 36,146, 13,241,241,241, 21,240, 60, 47,
- 85,216,232,209,163, 75,237,118, 59, 57,119,238, 28, 65,195,232, 65,120, 17, 90,228,220,185,115, 36, 58, 58,186, 0, 64,152,135,
- 99,198,199,196,196, 20, 43, 20,138, 99,104,230,180, 14, 29, 59,118,172, 60,125,250, 52, 41, 46, 46, 38,235,215,175, 39, 17, 17,
- 17,173, 49, 34, 48,181,115,231,206, 85,245,245,245,196,104, 52,146,220,220, 92,146,152,152, 88, 9, 58,242,144,226,239,143, 96,
- 0,211, 83, 82, 82,140,159,126,250, 41,217,176, 97, 3, 89,180,104, 17,153, 49, 99, 6,153, 56,113, 34,201,200,200, 32, 25, 25,
- 25,100,204,152, 49,228,181,215, 94, 35,119,222,121, 39, 81,169, 84,117, 0,238,191,158, 19,133, 10, 45, 10, 10,138, 63, 3,137,
- 0,230, 56, 4,213,234,209,163, 71,151,154, 76, 38,114,241,226, 69,242,211, 79, 63, 17, 52, 76,221,224, 9,111,151,149,149,145,
-178,178, 50, 97,106,132, 2,252, 49,173,195, 55, 14,222,171, 18, 65, 73, 73, 73,149, 7, 14, 28, 32, 69, 69, 69,100,221,186,117,
-196, 33,216, 90, 12,114,185,124,163, 70,163, 33, 70,163,145,108,222,188,153, 78,239, 64,113, 61, 34, 10,192,252,155,110,186,201,
- 58,119,238, 92,178,122,245,106,242,197, 23, 95,144, 81,163, 70,145, 55,223,124,147, 60,252,240,195, 36, 50, 50,210, 4, 32, 11,
- 64,200,245,158, 24,215, 66,104,209,149,205, 41, 39,229,164,156,238,216,112,226,196, 9, 34,192,110,183,147,139, 23, 47,146,141,
- 27, 55,146,152,152,152,227,104, 60,159,150, 43,167,186,107,215,174,167, 78,159, 62, 77, 46, 92,184, 64, 44, 22,139,147,227,212,
-169, 83, 4,192,182, 22, 8,103,106,124,124,124,197,214,173, 91,201,233,211,167, 73, 76, 76, 76,113, 75,198, 61, 41, 41,169,162,
-178,178,146,108,222,188,153, 68, 70, 70,250, 19, 89, 52, 47, 81,206,191, 51,103, 18,128,165,189,122,245,178,207,155, 55,143, 60,
-251,236,179, 36, 49, 49,209,238,120, 41,138,191, 81, 84,167,107,103,120, 10, 10, 10,138,107, 5,217,158, 61,123, 32,147,201,156,
- 59,126,255,253,119,215,121,180,188,205,219,160, 57,121,242,228,109, 35, 71,142,220, 62,111,222,188,174,174,163,152,182,110,221,
- 10, 0,166, 22, 8, 91,222,197,139, 23, 7,142, 24, 49,226,243,136,136,136,155,203,202,202,222,107,201,136, 23, 21, 21,189,214,
-189,123,247,153,245,245,245, 26,189, 94, 63, 6,116,238, 44,138,235, 23, 69, 0,198, 30, 60,120,240,227,131, 7, 15,190, 3,128,
- 0,248, 16,192,201, 27, 45, 33,168,208,162,160,160,184,214, 24,255,244,211, 79,187,119, 22,223, 15,224,255,124,136, 44, 1,151,
- 11, 11, 11,251,221,125,247,221, 47,160,241,232, 68,161,115,122, 75, 32,207,108, 54, 15,119, 31, 41,213, 66, 88, 86, 86, 86,182,
-140,102, 1,138, 27, 8,199, 1, 60,124, 35, 39, 0, 21, 90, 20, 20, 20,215, 26,231, 1, 60,117, 21,231,107,224,121,158, 45, 10,
- 10, 10,138,191, 28,232,162,210, 20, 20, 20, 20, 20, 20, 20, 20, 84,104, 81, 80, 80, 80, 80, 80, 80, 80,252,189,192,192,251,200,
-129,156,102,240, 92,201,136,134, 28,202, 73, 57, 41, 39,229,164,156,148,147,114,222,112,156,254,184,115,112,157,128, 78,239, 64,
- 57, 41, 39,229,164,156,148,179, 53, 56, 25,199,198, 58, 54,225,247, 95, 57,238,204, 95, 56,238, 55, 10,231,117,135, 63,115,122,
- 7,225, 70,240,104, 24,242, 73,241,215,131,107, 1, 33,244, 62, 81, 80, 80, 52,179,238, 16,185, 60,108,237,142, 13,127,193,186,
-196, 85, 20,240, 87,249, 92,106,141,184,223,200,156,215, 5,124, 9,173,155,149, 74,229, 84,169, 84,154,194, 48,140, 93,167,211,
- 29, 53,153, 76, 11, 1,236,190,202,107,126, 19, 29, 29, 61,190,186,186,154,103, 89, 22, 44,203,130, 97, 24,176, 44, 11,177, 88,
-108,168,171,171, 83, 95, 9,105,100,183, 81,175,115, 12,243,146,157,216, 23, 86, 28, 91, 51,195,223,126, 10,223, 5, 70, 34,145,
- 60, 16, 30, 30, 30, 90, 89, 89, 73, 88,182,161, 43,159, 72, 36, 18, 22,194,181,213,213,213,125, 23, 40, 89, 88, 88,216,190,240,
-240,240, 80,225,124,134, 97, 80, 93, 93, 93, 91, 81, 81,113, 11, 0, 4, 5, 5,237, 84, 42,149, 17, 28,199, 65, 36, 18, 65, 36,
- 18, 65,175,215, 87, 87, 87, 87,223, 70,111,197,223, 19, 43, 87,174, 20,141,136,127,170, 3, 71, 12, 61, 88,150,132,240, 60, 83,
-103, 99,228,191,111,184,248,205,217, 64,206, 31, 51,102,140,157,166,226,181,131, 84, 42,157, 27, 29, 29,253, 79,173, 86,171,103,
- 24,134, 48, 12, 3,134,105,120,207,114,255,180,219,237, 37,213,213,213,189,253, 60,108,197, 82,169,116,118, 76, 76,204, 56,189,
- 94,175,119,240,121,228, 5, 0,171,213, 90, 82, 85, 85,213, 59,160,186, 62, 50,114,161, 92, 46,127, 92,175,215,235, 24,134,225,
-221,220, 3,215,135,249,185,170,170,170, 1,254,132,129, 84, 42,253, 60, 58, 58,250, 31,142,184, 59,195,121,181,113,143,142,142,
- 30,167,211,233, 2,226,244, 17,247, 38,156,173, 17,206,191, 40,231,245, 47,180,210,211,211,127,216,187,119,111, 39,177, 88, 12,
- 0, 48, 26,141,221,231,207,159,255,196, 91,111,189,149, 5, 96,242, 21, 94,111,241,128, 1, 3, 30,201,205,205,101, 87,175, 94,
-205,246,233,211, 7, 12,195,192,110,183,195,110,183,163, 91,183,110,242, 43,141, 72,136, 82, 49,233,208,166,127, 7,221, 60,236,
-233,151, 42,128, 25,254,246,251, 18,152, 0,222, 5,144,210,204, 32, 84, 58,210,229,144, 23,177,177,139,101,217,102,113,242, 60,
- 95,112,249,242,229,126, 62, 4, 76,139,115, 58, 68,214,131, 3, 6, 12, 8,201,201,201, 97,138,139,139, 25,185, 92, 14,158,231,
- 97,183,219, 97,181, 90,113,211, 77, 55, 53,203, 9, 13, 13, 13, 85, 79,154, 52,169,195, 93,119,221,133,159,126,250, 9, 79, 60,
-241, 4,250,247,239,159, 95, 81, 81, 1, 0, 80, 42,149, 17, 39, 78,156,232, 20, 30, 30, 14,189, 94,143,186,186, 58,220,113,199,
- 29,168,174,174,254, 91, 23,174, 91,211, 19, 62,100, 88,198, 57, 87, 20,177,217,107,246,254, 94,250,238,213,242,134,135,135, 31,
-146,201,100,209,126,213,178,203,131,204,104, 52,150,215,212,212,244,244,115, 74, 18,128,123, 68, 34, 81, 71,142,227, 58, 3, 72,
-178,217,108,209, 0, 32,145, 72,202, 69, 34, 81,145,213,106, 61,109, 54,155,207, 0,248, 47,124, 44,128, 60, 34,254,169, 14,140,
- 77, 63,186,222,196,143, 84,180,207, 74,213,159,155,148,167,144,233,215,141,136,127,106, 85,160, 98,235, 79, 68, 42,128, 21,104,
- 88, 80,250, 89, 52,204, 3,116, 53,136, 7,112, 47, 26,214,124, 76,182, 88, 44, 85, 0, 14,162,161, 31, 74, 62,128,196,200,200,
-200,101, 60,207,155,170,171,171,159,130,135,133,170,251,246,106,123,128,101,217, 4,193, 19,224,137,189,100,207,193,146, 22,121,
- 64,177, 44,251,121,102,102,230, 63, 86,173, 90,165, 56,120,240,160,162,107,215,174,206, 23, 34,158,231,155,244, 49, 73, 78, 78,
-246,231,106,112, 44,203,206, 29, 61,122,244,163, 75,151, 46, 85,156, 63,127, 94, 17, 23, 23,231,228,116, 21, 91, 2,226,226,226,
- 2,205,251,223, 12, 31, 62,124,236,146, 37, 75,196,107,214,172,145,183,105,211, 6, 17, 17, 17,144, 72, 36, 77,142,189,237,182,
-219,120,255, 81,103, 63,191,239,190,251,198,254,248,227,143,138,189,123,247, 42,186,117,235, 6,145, 72,116,213,113, 31, 53,106,
-212,163, 63,252,240,131,226,232,209,163,138,142, 29, 59, 66, 48, 21,220,249, 88,150, 69,219,182,109, 3,226,188,247,222,123, 31,
- 93,177, 98,133,226,208,161, 67,138,206,157, 59, 59,211,147, 16,114,197,225,252,139,115,222, 16,142,150,212, 98,177, 96,219,182,
-109, 96, 89, 22,225,225,225, 24, 63,126, 60, 54,109,218, 52,105,243,230,205,217, 87,224,108,125,227, 16, 89, 98, 0,248,249,241,
- 81, 40, 16, 3, 19, 42,204,144, 72, 36, 56,119,238, 28, 68, 34, 81,179,173, 69,153, 76, 54,142, 16, 50, 69,127,113,191,204, 96,
-176,194, 88,122, 64, 33,151,203,157, 15, 0,125,169, 99,255,165, 3, 10,185, 92,126, 78, 36, 18, 77,215,106,181,139,189,241,117,
-236,216,241,251,227,199,143,119,241, 84,112,125, 65,175,215,163, 93,187,118,137, 53, 53, 53, 29, 61,253, 47, 22,139, 19,206,159,
- 63, 31, 37,149, 74, 65, 8,113, 22, 98,247, 79,225,187,197, 98,193, 77, 55,221,100,241,117, 77, 95,156, 54,155, 13, 65, 65, 65,
- 16,220, 40,179,217, 12,173, 86,235,143,147,145, 72, 36, 15, 8, 34, 11, 0,150, 47, 95,142,152,152, 24, 68, 69, 69, 65,169, 84,
- 66, 46,151, 59, 57, 3,133, 72, 36,194,136, 17, 35,240,254,251,239, 35, 43, 43, 11,111,188,241, 70,163,138, 86, 44, 22, 35, 60,
- 60, 28,235,215,175,135, 90,173, 70, 98, 98, 34, 4,129,255,183,182, 5, 89, 38,124,247,129, 11, 78,135,246,206,219,187,112,183,
-246,228,190,116, 60, 42,193,178, 0,207, 55, 60, 58, 25, 6,196,102,229, 47, 31, 56, 90,250, 94, 0,233, 25, 87, 84, 84, 20, 21,
-104, 26,217,108, 54,196,197,197,137,252, 28, 54, 50, 45, 45,237,231,231,159,127, 94,210,177, 99, 71, 70, 34,145,128,227, 56,112,
- 28, 39, 8,244, 68, 66, 72, 34,207,243,131,203,203,203,201,252,249,243, 63,222,186,117,235,253, 0,214,121,172, 88,136,161, 71,
-189,137, 31,185,253, 48,110, 25, 61,236, 45,172, 95, 57,233,150, 1,233, 60,130, 21,134,179, 0,254,202, 66, 43, 53, 45, 45,237,
-240,222,189,123,131, 44, 22, 11,250,246,237,187, 39, 47, 47,175, 23,174,108, 6,247, 48, 0,159, 77,158, 60,121,236,243,207, 63,
- 47, 10, 13, 13,133, 84, 42, 69,125,125, 61,206,158, 61, 59,238,187,239,190, 35, 95,125,245,213,255, 1, 8, 46, 42, 42,202,216,
-183,111, 31,134, 12, 25,242, 50,128, 87,155, 42, 2, 81,194,206,125,133, 81,194,239,123, 71,116,151,100,244,102,203, 27, 92, 28,
-247,163, 9,120, 59, 95,178,239,200,197, 64,132,216,199,163, 70,141,122,108,213,170, 85, 42, 0, 88,176, 96, 1, 30,120,224, 1,
-132,135,135, 67,161, 80, 64, 34,145, 64, 44, 22, 55,250,244,243,176, 21, 1,248,248,225,135, 31, 30,189,116,233,210, 96, 0, 88,
-186,116, 41, 70,141, 26,133,136,136, 8, 4, 7, 7, 67, 42,149, 66, 36, 18, 53, 59, 49,195,195,195,191,233,127,203, 45, 79, 46,
- 89,178, 4, 0,240,206, 43,175,224,174, 91,111,133, 74, 33,135, 66, 46,133,144, 22, 82,145, 24,119, 78,120,201,175,190, 4,240,
-233, 3, 15, 60,240,208,143, 63,254, 24, 12, 0, 7, 15, 30, 68, 69, 69, 5,162,163,163, 33,151,203, 33,149, 74,157,113,102, 24,
- 6,114,185, 60,160,184, 63,240,192, 3,163,127,248,225,135, 96, 0, 88,188,120, 49, 70,140, 24,225,140,187, 76, 38,131, 68, 34,
-105,180,185,139, 78, 79,156,247,223,127,255,232, 21, 43, 86, 4, 3,192,119,223,125,135, 97,195,134, 33, 44, 44,204,153,158, 2,
- 87,115,238,209, 95,156,243,198, 16, 90,135, 15, 31,126, 80,169, 84,206, 2, 16, 41,149, 74, 67, 31,125,244,209,182, 79, 62,249,
- 36, 30,126,248, 97,108,222,188,249,153,102, 10, 45, 38, 58, 58,122,124,110,110,174,243, 9,109, 38, 77, 4, 83,179, 31,224, 14,
- 76, 57,240,204, 51, 49, 89,103,181,216,179,239, 52,130,192, 50,251, 62,253, 52,210,120,230, 12,236,102, 51, 62, 56, 87,223,176,
-223, 70,152,109,175, 77,136,185,121,238,255, 77, 1,176,216,135, 11, 32, 51,153, 76,200,207,207,111, 86, 32,138,139,139,193,243,
-188,201,151,187, 32,145, 72,112,236,216,177,128, 70, 33, 36, 38, 38,250, 42,128,126, 57, 55,108,216,128,137, 19, 39,226,244,233,
-211, 16,150, 42, 9,128,147, 9, 15, 15, 15, 21, 68,150, 32,130,228,114, 57,196, 98, 49,195,113, 28, 35, 52,237, 57, 10, 87, 64,
-194,152,101, 89,124,255,253,247,248,232,163,143,240,230,155,111, 98,225,194,133,232,209,163,199, 31,153,144,227,160,209,104, 16,
- 22, 22,134,176,176,176, 70, 2,241,239, 12,247,219, 60,123,206, 60, 5,120,210,208, 9,132,240, 0, 15, 16, 16,240,132, 71,249,
-197,179,152,250,254, 39, 1, 63,125,196, 98, 49,206,156, 57,227,204, 7,130, 51, 44, 8, 35, 87,215, 32, 41, 41,201,111, 94,146,
- 72, 36,211,126, 42,220,225,142, 0, 0, 32, 0, 73, 68, 65, 84,253,245, 87,233,247,223,127,143, 31,127,252, 17, 12,195, 64, 38,
-147, 65,169, 84, 34, 52, 52, 20, 17, 17, 17,206, 45, 33, 33,129,249,207,127,254, 35,233,209,163,199, 52,141, 70,179,206,243, 61,
- 39, 33,138,246, 89,169,163,135,189, 5, 0, 24,253, 22,193,229,252, 25, 55,179,181,239,253,149, 23,145, 77,237,222,189,251,142,
- 93,187,118, 5,233,245,122,240, 60,143,117,235,214, 41,134, 13, 27,182,189,176,176,112, 64,115,197, 86, 82, 82,210,154, 93,187,
-118,221, 22, 25, 25,137,186,186, 58,104, 52, 26, 88,173, 86,136, 68, 34, 36, 38, 38,226,227,143, 63,102,238,187,239,190, 23,199,
-141, 27,103,148,203,229,130,179,145,228, 57, 47, 53,206, 76,243,191,248, 50,148,144,134,252, 67,120,210,232,179,166,162, 8,175,
-188, 54, 53,160, 48,182,109,219,246,217,159,126,250, 73,229,234, 44,185,138, 0, 87,145, 37,108,126,132, 1,219,174, 93,187, 39,
-151, 45, 91,230,228,108,211,166, 13, 56,142,131, 88, 44, 6,199,113, 96, 89, 22,219,183,111,199,172,105,147, 17, 22, 25,135,121,
- 95, 44,240, 27,206,200,200,200,133, 35, 70,140,120,124,241,226, 63,170,238,238,237,219,227,238,219,110, 69, 84, 27, 53,218,132,
- 5, 55,164, 19,207,224,247,211,133,126,159, 71, 0,216,182,109,219, 62,181,114,229, 74,149,235, 11,161, 16, 87,225,229, 89,112,
-241,205,102, 51,122,247,238, 29, 80,220, 93, 57, 5,183, 77, 16,109, 66,122, 10,215, 17,202,171,159,112, 62, 41, 8, 97,135,224,
-108,196, 33, 22,139,177,114,253, 18,175,110,246,149,114, 54,247,190,187,115, 22, 21, 21, 97,230,204,153, 16, 94,218, 92,187, 10,
-197,199,199, 99,222,188,121,126,235, 37,183, 50,208, 7, 64,164,203, 46, 51, 0,169,203,103, 37,195, 48,251, 61, 28, 39,236, 23,
- 59, 90,172, 34,209,208,111,172, 30, 64,168, 7, 62,111, 60, 85,142,103, 94,164,219,241,141,174,227, 85,104,101,103,103, 11,165,
-120,112,102,102,230, 54,199,247, 90,153, 76, 86,172, 80, 40, 98, 0,212,175, 91,183, 14,255,250,215,191,224,176, 86,239, 13, 9,
- 9, 57,238,193,213, 57,108, 50,153,222, 2, 80,238,216, 37, 12,209,100,107,106,106,248, 77,155, 54,177, 75,239, 31, 14, 51, 1,
-210,167,204,194,136,204, 76,108,136,151, 66, 4,224,150, 83, 85, 80, 40, 20,156, 70,163,177,186,246,219,242,208,119, 43,199, 45,
- 67,137,130, 56, 14,125,119,172,197,196, 29,107,113,139, 82,138,234, 85, 43, 80,191, 51, 23, 44,203, 96,160,178, 13,222,120,108,
- 19,250,169,101,144,154,116, 96, 89,214, 83,206,118,114,230,231,231,143, 81,171,213,179,220, 18, 56, 16, 20,160, 97, 29, 39,120,
- 9, 39, 8, 33,232,209,163, 7, 24,134,113,186, 5,194, 38, 20, 58, 97, 59,116,200, 99, 11,164, 87, 78, 71, 19, 28,148, 74, 37,
-126,251,237, 55,231, 49, 67,135, 14,133,209,104, 68,120,120,120, 64,156,149,149,149,164,180,180,148, 89,186,116, 41,196, 98, 49,
- 34, 34, 34,160, 80, 40,152, 37, 75,150, 76,150, 72, 36, 9, 70,163,145, 55,155,205,144, 74,165,243,132,251,195,113,156, 78,163,
-209, 68,120,227, 20,137, 68,120,254,249,231,241,250,235,175, 99,225,194,133,120,230,153,103,154, 56, 94, 70,163, 17,109,218,180,
-113,138, 45, 15, 5,176, 53,134,251,182, 46, 39, 79,112,252,208, 6,156, 56,154, 3,222,206,195,206, 19, 16, 98, 7,111, 3, 14,
-110,218,211,233, 82, 65,105, 60, 1,105,232,122, 11, 64, 86,167,181, 13,138,144,118, 6,176,122, 91,181,121,174,191,112,114, 28,
- 7,163,209,136, 95,127,253, 21,167, 78,157,194,186,117,235, 96, 48, 24,208,166, 77, 27,132,134,134,226,214, 91,111,197,184,113,
-227,144,148,148,228, 55,238,132,144,197,197,197,197,233,253,251,247,103,106,107,107, 81, 91, 91, 11,131,193, 0,187,221, 14,155,
-205, 6,142,227, 16, 20, 20, 4,185, 92,142,232,232,104, 24,141, 70, 98, 50,153, 22,123,227,228,121,166, 78,127,110, 82,222,250,
-149,147,110, 25,253, 22,193,170,143, 24,116,104, 39,211,255,118, 32,248,201,213, 59,222,184, 3, 0,225,137,211, 90, 32, 86, 59,
- 95,245,250,228,207, 94,188,230,247,168,169,200,138, 48, 24, 12,168,175,175,111,176,245,165, 82,172, 90,181,170,205, 61,247,220,
-147, 91, 90, 90, 58,208,135,216,106,194, 25, 28, 28,156, 40, 18,137,112,236,216, 49,124,245,213, 87,248,237,183,223, 80, 94, 94,
-126, 57, 46, 46, 46,100,240,224,193,236, 43,175,188,130,244,244,116,124,251,237,183, 65,254, 56, 9, 33, 40,202,223,142,162, 51,
- 59,192,243, 13,174,117,195,230,249, 59, 9, 48,238, 58,157,206,120,248,240, 97,213,215, 95,127,141,168,168, 40, 36, 39, 39, 67,
-161, 80, 32, 40, 40,168,209, 67,214,245,193,235,175,108, 26, 12, 6, 99, 81, 81,145,234,135, 31,126, 64, 68, 68, 4,146,146,146,
-160, 80, 40, 32,149, 74,193,113, 28, 24,134,193,210,165, 75,177,252,253,199, 80,116,250, 40, 70,221,125,135,223,112, 42, 20,138,
-199, 23, 47, 94,220,200, 2,137, 14, 11, 3, 39,102, 33, 18, 51, 8, 27,122, 63, 0,224,242,230, 95,124,205, 14,233,202,201,212,
-215,215, 27,247,238,221,171, 58,112,224, 0,120,158, 71, 82, 82, 18,244,122, 61,212,106,181, 51,254,155, 54,109,194,125,247,221,
-135,239,191,255, 30, 25, 25, 25,126,227,174,213,106,141, 71,143, 30, 85, 45, 91,182, 12,225,225,225,104,219,182,173, 51,238,194,
- 38, 22,139, 33, 18,137,144,146,146,130,186,186, 58,168, 84, 42,191,247,232,224,193,131,170,101,203,150, 33, 44, 44, 12, 9, 9,
- 9, 78,199, 77, 16, 71, 31,125,249,126, 35,130, 32, 38,246,170, 57,155,123,223,221, 57, 71,141, 26,133, 14, 29, 58, 64,173, 86,
- 67,169, 84, 58,185,125,113,122,209, 34, 78,189,205, 48, 76,182, 75,153,200,100, 24, 38,219,245,211,219,113,142,175, 3, 39, 79,
-158,220, 59, 43, 43,107,102, 70, 70,198, 15,187,118,237, 90,238,141,207, 27,207,228,201,147,211,178,178,178,102,186, 30,239,225,
- 58,222, 29,173,204,204, 76,198, 17, 73, 6, 64,114,175, 94,189,246,111,222,188, 57, 60, 56, 56,216,121,240,133, 11, 23, 80, 91,
- 91,139,224,224, 96,245,236,217,179,213,131, 7, 15, 70,116,116,180,243, 13, 32, 63, 63,255,166,212,212, 84, 13, 0,119,223,150,
-103, 89, 22,253,250,245,195,113, 71,107,199,136,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,197, 23, 95,100, 38, 78,156,200,
- 9,110, 6, 33, 4, 6,131, 1,177,177,177,114, 95,174, 14, 0,164, 25,170,240,203,224,129, 96, 25, 64,127,104, 31, 36, 82, 6,
-172,136, 65, 79, 82,141,255, 13, 25, 8, 6,128,249,200,110, 4,224,194, 28, 2,112, 71,235, 56, 28, 4,103,207,158, 13,200,209,
-114,196,139,185, 82, 78,193,209,216,181,107, 23,236,118,123,160,156,132,101, 89, 40,149, 74,196,196,196, 64, 46,151, 67,161, 80,
- 48, 63,252,240,195,187,201,201,201,177, 19, 39, 78,100, 53, 26, 13,219,175, 95, 63, 60,240,192, 3,156,208,196,153,150,150,230,
- 55, 46,219,182,109,195, 87, 95,125,133,103,158,121,198,163,163,197, 48, 12, 34, 35, 35,161, 86,171,113,189,128, 7, 96,177, 89,
-161,215, 26,156, 77,186,118,187, 29, 71,183, 30,233, 84,112, 36, 63, 45,251,135,239,197, 0, 96,220,250,139,235,105,177, 15,124,
-185, 34,117, 80,152,120,239,182,203,214,189,190,242, 60,199,113, 24, 63,126, 60,178,178,178,240,248,227,143, 99,221,186,117,120,
-239,189,247,240,207,127,254,179,137,171,229,239,205,209,106,181,254,251,137, 39,158,120,102,213,170, 85,157,223,122,235, 45, 86,
-112,180, 20, 10, 5, 24,134,129,209,104,132,201,100,130,193, 96,192,233,211,167,249,167,159,126, 58,207,108, 54,255,219,107,115,
- 37, 35,255, 93, 33,211,175,107,159,192,118,208, 21,126, 18,220,255,214, 36, 3, 35,239, 85,119,127,234, 48, 50,114,124, 82, 24,
- 8, 1,225, 1,158, 0, 38,147, 14, 47,190,248,178,232, 79,188, 85, 78,145,101, 52, 26,113,248,240, 97, 12, 25, 50, 4,197,197,
-197, 56,121,242, 36, 58,117,234,132, 37, 75,150, 68, 62,250,232,163,185, 21, 21, 21, 3, 3,117,182,142, 30, 61, 58,249,230,155,
-111,254, 92,171,213,214,104,181,218,207, 1, 44, 7, 80,123,246,236,217,174,103,207,158,157,191, 97,195,134, 1, 83,167, 78, 21,
-185,245,209, 17,121,179, 71,173, 86, 27, 12, 6,147, 79,129, 37,252, 38,132, 15, 40,226, 12,195,144,206,157, 59,227,158,123,238,
-129, 88, 44,134, 66,161,128, 74,165,106,212,108,230, 46,184,124,213, 31, 0,120,134, 97, 16, 23, 23,135,145, 35, 71, 66, 34,145,
- 52,226, 20,242,225,200,145, 35,241,210, 7, 83,240,239,151,110,199, 87, 79,116,194,176, 15,203,125,134, 83,175,215,107,183,108,
-217, 34,127,253,153,103,112,115,199,142,104,163, 86,163, 93,116, 36,228, 50, 41, 36,174, 97, 98, 2, 50,217, 9, 0, 94, 36, 18,
-161, 91,183,110, 40, 47, 47, 71, 97, 97, 33, 10, 11, 11,193,178, 44,250,247,239,239,116, 97,206,156, 57,131, 15, 62,248, 0, 38,
-147, 41,224,184,119,236,216, 17,183,223,126, 59,164, 82, 41, 20, 10, 69,163, 38, 67, 33, 77,235,235,235,209,161, 67, 7,172, 94,
-189, 26,169,169,169,126, 57,187,116,233,130, 65,131, 6, 53, 74, 79,185, 92,238, 20, 69, 0, 80,188, 87,235,188, 70,124,124,124,
-179, 56, 55,238,187,128,175, 55,109,129,201,204, 67,163,183, 54, 58, 33,182,141, 26, 59,150,189, 21, 80,220, 5,206, 69,139, 22,
-161,182,182,214,105, 28, 8, 47,229,130,137,210,182,109, 91, 44, 88,224,217,201,116,211, 34,158,158,121,153, 1, 62,111,133,227,
-132,204, 37,203,202,202,154,233,126,190, 63, 62,215,255,221,206, 55,187,137,179,242,102, 53, 29,202,100,178,183,183,108,217, 18,
- 94, 87, 87,135, 51,103,206,128,101, 89,103,155, 58,199,113,176, 88, 44, 56,119,238, 28,194,195,195, 81, 81, 81, 1,153, 76, 6,
-145, 72, 4,179,217, 12, 0, 61,189, 61,192, 9, 33,120,169,178,161,139,208,250, 56, 9,138, 0,220, 93,217, 80, 48,132, 14,241,
- 63,253,244, 19, 84, 42, 21,130,131,131,157,159,254,154,145,142, 22,158, 69,185,152, 1,187,123, 59, 24, 22, 96, 25,128, 17, 1,
- 44, 75,192, 50, 12,216,221,185, 96, 24, 64, 25, 17,214,220, 10,216, 95,199,120,159, 29,224,189,185, 79,158, 92, 44,247,239, 91,
-183,110, 69,160,156, 29, 58,116,128, 74,165,114,110, 27, 54,108,104,228,104,217,237,118, 68, 68, 68, 4,194, 73, 26,220, 8, 30,
- 81, 81, 81,255,207,222,117,135, 71, 81,181,223, 51,179,125, 55,201,102,211, 19, 18, 66, 9, 32, 37,210, 20, 62,144, 94, 2, 8,
-161,137, 20,249, 32,136,136, 82, 68, 5,137, 8,252, 80, 1, 9, 77,154, 84, 65, 62, 2,130,116,233, 82, 68, 58, 88, 64, 65, 18,
- 8,132, 18, 72,223,212,237,101,218,239,143,236,198,205,102,147,108,138, 32, 56,231,121,230,217,157,118,230,222,185,119,238,156,
-251,222,247,190, 3,145, 72, 68,108,221,186,245,147,250,245,235,135, 76,157, 58,149, 20, 8, 4,184,118,237, 26, 18, 18, 18, 80,
-183,110, 93,183,125,182, 10, 10, 10, 50, 62,249,228, 19,230,147, 79,138,230, 80, 68, 70, 70,162,160,160, 32,219,190, 95,163,209,
-228,246,234,213,171,132,223, 70, 78, 78,206,179,237, 9,111,187,143,180,149,134,193,100,130, 78,107, 40,182, 14,101,167,103,169,
- 62,158,246,161,104,233,228, 55, 1, 0,211, 86,172,134,118,195, 95, 13,217,254,105, 35, 2, 7,127,185,115, 6,128,129,229,241,
-235,116, 58,152, 76, 38, 68, 68, 68,224,210,165, 75,208,106,181,232,211,167, 15, 8,130, 40,158, 33, 90, 9, 88,210,210,210, 58,
- 68, 71, 71,255,186,124,249,242,136,166, 77,155, 18,122,189, 30, 6,131, 1,142,191, 55,110,220,224,118,236,216,113,223, 96, 48,
-188, 98, 51,157,187,196,241,180,111,146,123,135,190,181,231,199,107,130,232,192, 6, 73,202,180,252, 8, 58, 55, 77,170,215, 24,
-111,155, 24, 46, 1, 28, 3, 48, 96,193,209, 44, 24,219,176,215,211,130, 92, 46,255,234,194,133, 11,126, 38,147, 9, 87,175, 94,
-197,168, 81,163, 44, 57, 57, 57, 18, 0,248,239,127,255,107,217,182,109,155,164, 65,131, 6,216,186,117,107,192,107,175,189,182,
- 91,175,215,191,232, 38,245,183, 25, 25, 25,223, 58,111,244,243,243, 91,245,232,209,163,174,142, 62, 63, 52, 77, 23, 39,199,229,
-131,201, 2, 20, 69,193,104, 52,163,176, 80, 11,139,149,178,181,153, 44, 24,134,182,253,178,160,109,237,168, 68, 44,244,106,253,
- 98,176,142,227, 56,144, 4, 81,112,245,207,204,218,229,137,118, 87, 67, 92,110, 90,179,156,193,216,103,153,249,249,249, 65, 36,
- 18,225,219,111,191,197,245,139,199, 33, 17,112, 96,104, 10, 52,101, 5, 67, 89, 32, 18, 8,240,227,181, 7,136,106,226,229,150,
- 32,244,247,247, 71,191,246,237, 17,221,190,125,209,244, 54,161, 16,158, 82, 41, 20, 98, 89,145, 37, 11, 0,199,144,238, 6, 17,
- 96,237,233, 12, 10, 10,194,111,191,253,134, 41, 83,166, 96,209,162, 69,144,203,229,197,179,159,111,221,186,133, 93,187,118, 33,
- 42, 42,170,210,121,183, 91,240,102,204,152,129,244,244,116,172, 88,177, 2, 47,189,244, 18, 68, 34, 17, 10, 10, 10,240,202, 43,
-175, 32, 43, 43,203, 45, 78,199,225, 61,137, 68, 82,194,250,100, 23,128,149, 45, 35, 71,206, 55, 7,133,224,224,197, 29, 32, 64,
-224,202,246, 15, 75,136,194,117, 59,207, 87,154,115,206,156, 57, 37,210,233,142, 53,203, 93, 56, 89,157, 42, 60,142, 32,136,171,
-118, 99,235,140, 25, 51,102, 18, 4,113,120,198,140, 25, 51,227,226,226,110,186,195,231,106, 63, 65, 16, 71,108, 34,172,159,195,
-182,171,149, 18, 90, 10,133,162,173,167,167, 39,238,222,189,139, 62,125,250, 88,114,115,115,147, 68, 34, 81,163,156,156, 28,105,
-118,118, 54, 12, 6,131,110,222,188,121, 15, 0,200,219,181,107,215,224,199, 31,127,196,227,199,143,177,109,219, 54, 0,216,239,
-218,103,131, 4,203,178,197,149,194,185,219, 38, 16, 8,112,249,242,101, 92,190, 92,210,245,107,211,166, 77, 21,190, 48, 94,251,
-254, 16,174, 93,187, 6,199,240, 0,246,255,142,219,100, 50, 25, 80,254, 12,143, 18,168,200, 49,190, 34, 7,120, 87,112,215,247,
-203,213,204,156,178,144,150,150, 86,230,249,151, 47, 95, 46, 97,209,170,136, 83, 32, 16,128, 97, 24,200,229,114, 66, 44, 22, 19,
- 98,177, 56,204, 46,178, 4, 2, 65,241, 3, 35,149, 74, 33,149, 74, 75,244, 82,203, 66,122,122,122,183,244,244,244, 50,247,171,
-213,234, 14,106,181, 26,207, 35,172, 20, 5,163,193, 2,173,206,136,207,227,254, 87,180,241,115,252, 12,224,231, 14,239, 78,193,
-196,222, 81,221, 43, 59, 76,109,191,223,129,129,129, 56,123,246, 44, 8,130,192,238,221,187,225,237,237,141,222,189,123, 67,169,
- 84, 98,198,140, 25, 24, 58,116,104,101, 27,179,194,220,220,220, 14, 31,124,240,193,175, 75,150, 44, 9,175, 93,187, 54, 44, 22,
- 11,172, 86, 43, 44, 22, 11,146,147,147,177, 99,199,142,199, 6,131,161, 3,128,194,138,200,142,167,125,147,188,239,220,180,244,
-158,195, 95, 51,222,202,250, 1,153,153,185,160,233, 52,176, 12, 13, 43,205, 20, 89,248,104, 26, 52,205, 64, 44, 22, 40,151,124,
-241,225, 73, 22, 28, 72,146,176, 0,120,245, 73,149,145, 74,165,138, 84,171,213,184,115,231, 14, 98, 98, 98, 50,115,115,115, 19,
- 1,244, 0,128,220,220,220, 11,163, 70,141,106, 26, 31, 31, 31, 92,175, 94, 61,120,122,122, 42,245,122,125, 69,148,158, 0, 38,
- 2,232,133, 34, 63, 16, 59,242, 0,204, 35, 73, 82,122,245,234,213, 82, 51,237,206,157, 59, 7, 0, 63,187,238, 1,217, 44, 90,
- 38, 19,212,185,249, 24,247,238,236,191,122, 70,224, 74,136, 11, 14, 28, 38,188, 7, 25, 0,228,100, 37,227,205,113, 83,164, 21,
-117, 8, 92,189, 8, 43,225,163, 83,162,163,102,175,163,158,158,158, 69,195,111, 7,118,224,200,151,239, 2,140, 21, 28,101, 4,
-172, 6,192,170, 3,107, 49,128, 16,203, 1,202,232,150,208,242,244,244,132,167, 92,142, 64,149,170, 40, 8,164, 64, 0,145, 72,
- 8,150, 2, 8,134, 40, 22,164,172,123,129, 65,138, 59,149,114,185, 28, 15, 31, 62,196,196,137, 19, 97,181, 90, 49,104,208, 32,
- 88, 44, 22,152, 76, 38, 24,141, 70,212,175, 95, 31, 6,131,193, 45, 62,251,108, 69, 79, 79, 79,136,197, 98,124,248,225,135,120,
-249,229,151, 49,119,238, 92,196,198,198,162,126,253,250,152, 48, 97, 2,118,236,216,129,200,200,200,138,120, 57,199, 50,178,223,
- 79,187,216,114, 28,226, 3, 80,233, 50,114,230, 36, 8,178,132, 96,179, 47,239,143,238, 81,105,206,133, 11, 23, 66,173, 86,151,
-178,100,217,255,135,134,134, 98,237,218,181, 85, 29, 25,178, 91,143,130, 92,236,235,231,108,137,226, 56,174,141,205,119,202, 28,
- 23, 23,119, 51, 46, 46, 46,154, 32,136,195,113,113,113,209,101, 89,180, 92,241,184,216,239,246, 75, 75,232, 52, 54,218,213,113,
-167,253, 70,251,250,250, 10,194,195,195, 73,165, 82,137,130,130, 2, 4, 4, 4,112,106,181,122,184, 66,161,248,236,187,239,190,
-107,160,211,233,112,235,214, 45,172, 90,181,234,103, 0, 43,203, 19, 90, 71, 3,108,166, 99,155, 37,203,113,189,127,255,254,168,
- 87,175, 94, 9,107,150, 92, 46, 47,183,242,216,247,217, 45, 66, 2,129, 0, 47,188,240,130,252,254,253,251, 70,177, 88,140,176,
-176, 48,121,102,102,166, 81, 44, 22, 87,122,166, 75, 69,142,241, 21, 57,192,187, 18, 62,109,218,180, 41, 97,193,114,252,117,252,
-127,240,224,193, 10,135, 14,237,156, 77,155, 54, 45,190, 95, 94, 94, 94,246,115, 1, 0,125,250,244, 1,203,178,240,247,247,119,
-139,211, 46,106,109, 14,240, 48,153, 76,172, 86,171, 37,175, 94,189, 10,137, 68, 2, 47, 47,175, 98, 95, 29,153, 76, 86,108,205,
-228,225,170, 65, 96, 97,161, 40, 24,141, 70,232,116, 58, 0, 64,242,159,123, 75, 10, 49,179,166,202,252,246, 6, 54, 47, 47, 15,
-199,143, 31,199, 15, 63,252,128,151, 95,126,217,165,168,174,132,224, 82,231,229,229,117,156, 62,125,250,149,249,243,231,215,242,
-245,245,133,213,106,197,163, 71,143,176,121,243,230,116,131,193,208,177, 50, 13, 12, 56,128,162,104,152, 12,102, 20,106,180,248,
-236,139, 45,101, 86, 61, 0,200,203,190,141,254, 3,134, 74,158,100, 57,165,167,167, 79,237,216,177,227, 23, 90,173,182,192, 96,
- 48, 12, 5,176,212,177, 63,149,155,155,219,105,192,128, 1,203,125,125,125, 95,202,206,206,158,233, 6,229,140,135, 15, 31,206,
-172, 83,167, 78,137,141,102,179, 25,117,234,212,121, 33, 59, 59,123,100,231,206,157,255, 15,128,175,195,110, 47, 0, 39, 0,172,
- 45,171, 46,217,135, 14,117, 58, 35,148,170, 16,164, 61, 56, 91, 97, 66,196, 2, 19, 56,150, 45,183, 13,177,119,128,203, 90, 42,
-152, 25, 87, 42,169,246, 99,237, 47,236, 87,135,140,198,171, 19, 23, 66, 33, 2, 22,188,217, 1,245, 85, 0,228,190, 16,119,254,
- 24,132,202,118,143, 38, 30,114,139, 60,118,253,122, 92,179,181,199, 97, 1, 1,152, 62,124, 56, 56, 10,184,148,144,128,157, 63,
-253,132,225,221,186, 65, 33,147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,116,233, 18,154, 52,105,130,187,119,239,150,
- 8, 67,193,113,156,187,249, 47,206,187, 84, 42,133, 72, 36, 66,102,102, 38,162,163,163, 33, 22,139,177,101,203, 22,156, 61,123,
- 22,211,167, 79,199,216,177, 99,209,181,107, 87, 36, 38, 38,186,197,201,113, 92,169,217,138,206,195,185,149, 45, 35,103, 78,231,
-247,126, 85,202,221,206, 57,127,254,124,151, 19, 42,220,225,116,165, 69, 92,148,221, 85, 71, 49,100,183, 60, 57, 10, 35,231,117,
- 0, 62,246,109, 51,102,204,152,233,238,121,142,235,118,139, 88,101,134, 48,139,133, 86,116,116,116,137,156,231,229,229, 93,185,
-114,229, 74, 51, 15, 15, 15,220,190,125, 91,162, 84, 42,155,217, 27,116,146, 36,177,123,247,110,175,190,125,251,158, 92,186,116,
-105, 24,203,178,200,202,202,194, 71, 31,125,164,163,105,122, 4, 0,186,172, 23,120, 69,150,169, 67,135, 74, 63,108, 7, 14, 28,
-112,107, 8,196, 46,164,132, 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251, 88, 49,
-137,191,102, 42, 84,100,125,170,200, 49,222,217, 1,190, 66, 36, 36, 36,184,117,156,109,168,213,173, 90,254,240,225,195, 50, 27,
-146,179,103,207,130,181, 53,180,238,114,218,122,121,156, 93,248, 41, 20, 10,248,250,250, 66, 42,149, 66, 46,151,151, 16, 89, 82,
-169,180,194, 7,167,162,128,164, 50,153,236, 23, 15, 15, 15,149,125,191, 72, 36,130, 86,171, 45,200,203,203,107,251, 76, 15, 29,
-130, 3,109,165, 97, 52,154,160,211, 26,107,156,223, 98,177, 64, 42,149, 98,199,142, 29,232,208,161, 3,218,181,107, 87, 74,100,
- 85,209, 60,159,154,151,151,215,117,229,202,149, 63, 47, 91,182,204, 71,167,211,225,127,255,251, 95,161, 78,167,235, 10, 32,181,
- 82, 98,147,229, 64, 89,173, 48,152,204,208,235,138,238,193,189,155,123,255,105, 69,181, 35, 51, 51,115, 71, 57,251,239,209, 52,
- 29,109,143,251,230, 6,254, 83,167, 78, 29,100,102,102,150,216,152,146,146, 2,134, 97,204, 40,138,147,245,150,163, 33, 25,127,
- 69,207, 46,171, 23, 95,100, 29, 53,154,161,211, 21, 89, 65, 76,250,156,154,169,167, 54,177, 81,150, 79, 86, 85,234, 16, 65, 16,
-197, 78,223,147, 39, 79,198,141,235,215,209,163,150, 6,245,131,189,192,105,210, 32,238,254, 41,254, 80,203,177,116,249,209, 74,
-115,239,114,112,129, 88,186,107,151,203,125,247, 6, 14,172, 84,222,147,146,146, 32,151,203,193, 48, 76,169,247, 77,101,243,239,
- 40, 96,150, 47, 95,142,233,211,167, 99,203,150, 45,184,113,227, 6, 90,182,108,137,158, 61,123, 34, 59, 59, 27,215,175, 95,135,
-217,108,118, 59,157,142,126,115, 73,247, 19,112,234,210, 49,164,164, 62, 64,122,230,227, 42,151,187, 35,167,179,208,218,119,234,
-119, 12,137,106, 93, 37,206,207, 62,251, 12,217,217,217, 37, 44, 89,142,237, 82, 89, 22, 45,103, 45,226,132, 28, 39, 95, 40,251,
-186,197, 73,244, 56,175, 59, 31, 15, 0,217, 0, 4, 21,156,231,188,158, 19, 23, 23,119,198,110, 9,179,241, 10, 42,242,207, 42,
- 97,209,114,194,194,129, 3, 7, 14, 88,181,106, 85,128, 76, 38, 43,158,129, 52, 99,198, 12, 76,159, 62, 29, 17, 17, 17,240,247,
-247, 15, 85,169, 84,200,205,205,197,162, 69,139,240,240,225,195,241,112, 17,104,207, 89,104,117,186,175,133, 68,242, 87,135,213,
-110,217, 2,128,177, 99,199,150,178,104,217, 11,168, 60, 80, 20, 5, 63, 63, 63, 24, 12, 6, 8, 4, 2, 12, 26, 52, 72,240,231,
-159,127, 50,189,123,247,198,224,193,131, 5,215,175, 95,103,250,245,235, 7,129, 64,128,238,221,187,107,246,237,219, 55, 13,192,
-151,110,136,173, 26,115,140,183, 87, 50,119, 99, 31,185, 35, 46,203,227, 36, 8, 2, 6,131, 1, 66,161,176,216, 81,222, 29, 78,
-251,208,161,227, 3, 72,146, 36, 84, 42, 85,113,227, 97,183,104,217,133, 86, 69,188, 21, 5, 36, 85, 40, 20,202,219,183,111, 55,
-176, 79,188,200,201,201, 65,247,238,221,239,228,229,229, 61,219, 38, 45, 22,176,210, 12,116, 70, 19,116, 70, 67,141,209,218,159,
-135, 13, 27, 54, 32, 49, 49, 17, 38,147, 9, 95,125,245, 85,241,164, 2, 71,145, 85, 13,193,149, 44,151,203,217, 62,125,250,224,
-202,149, 43,144, 74,165, 20,170, 16,255,138,229, 88, 88,105, 26, 38,163, 17,186,138,135,220,158, 23, 20,171,234,196,196, 68, 88,
- 44, 22,204,157, 59,151,249,245,215, 95,207,160, 40, 0,170,221,130, 55,178, 75,151, 46,243, 60, 60, 60, 84, 71,142, 28,121, 31,
-192,150,242, 94,222, 20,109, 19,237, 53,120, 31, 29, 71, 4, 92,249,100, 85, 37,204,138,227,139,149,101, 89,140,127,251,109,244,
-172,165,193,224,151, 2,160,207,184, 3,133,119, 0, 8, 85, 93, 44, 93,126, 20, 55,239,187,237,138,201, 1, 64,159, 46, 3,209,
-162, 73,233,240, 96, 29,123, 20,245,201, 46,252,248, 11,178,114,210, 43,157,119,189, 94, 95,166,229,170, 18, 22,173,226,103,206,
-126,255, 90,181,106,133, 70,141, 26,225,204,153, 51,104,221,186, 53,238,222,189,139,187,119,239,226,225,195,135,184,113,227, 6,
-242,243,243, 43, 93, 70,223,159,216,137,124,109, 30, 36, 98, 9,242, 10,114,144,146,246, 0, 65,126,193,213, 46,119, 59, 26,247,
-251, 12, 0, 80, 43,192,187, 82, 66,203,145,115,241,226,197,165,196,123,117, 67,246, 16, 4,241, 75,121,235,149, 61,255, 73,162,
- 44,161,245, 64,173, 86,183, 27, 62,124,248, 12, 0,109,108,219, 10, 1,236, 58,121,242,228,192,192,192,192,110,237,219,183, 23,
- 74, 36, 18, 92,186,116, 9,251,246,237,219, 2, 96,103,121, 23,146, 72, 36,198,186,117,235,202,237, 21,209,254, 32, 42,149, 74,
-193,162, 69,139,136, 77,155, 54,149,105,229,170,168,128, 10, 11, 11,161,215,235,225,237,237, 13,171,213,138, 62,125,250, 48,137,
-137,137, 16,139,197, 24, 48, 96, 0,147,144,144, 80, 92,208, 27, 55,110, 12, 51, 26,141,175,252,240,195, 15,189, 0,116,174,196,
-189,178, 59,198,123,194, 77, 7,248,178,122,121,238,192,221,225,184,178, 56,167, 76,153, 82, 37, 78,177, 88, 76,219, 35,191,147,
- 36, 9,171,213,138,214,173, 91, 35, 59, 59,187,248,161,241,240,240, 40, 22, 89,238, 8,173,138, 2,146, 10,133, 66, 88, 44, 22,
-116,238,220, 25, 4, 65, 96,245,234,213,207,199,112, 36,203, 18,158,158,126,168, 85,235, 5, 4, 4,154,192,178, 53,251, 85,153,
-216,216,216, 18, 98,202, 85,228,101,251,253,175, 10,236, 92,213,249,250, 60, 7, 20, 15,121,233,245,166,103,174, 8, 3, 3, 3,
-219,101,103,103, 31,112,218,156, 7, 96, 94, 57, 29,203,226,130,126,252,248, 49,122,247,238,141, 99,199,142, 9,246,239,223,223,
-227,224,193,131, 9,119,238,220,121,220,186,117,235,218,239,188,243,142,180,115,231,206,200,201,201,193, 75, 47,189,244,121, 90,
- 90, 90, 57, 66,203,118, 31, 77,102,232,245, 53,111, 29,117,101,205,170,206,139,209, 94, 39,231,204,249, 63,244, 12, 41,192,160,
-150,222,136, 63,124, 17, 35, 91,201, 1,139,180,210,124,246,180,248,214,170,135,186,145,237, 74,237,151, 42,139, 98,185,214,141,
-108, 7,242,241,221, 74,231,221, 49,205,206,162,170, 42, 22, 61,199,251, 57,110,220, 56,124,252,241,199,232,213,171, 23,238,222,
-189,139,115,231,206,225,238,221,187,152, 50,101, 10, 34, 35, 35,209,178,101,203, 74,113, 30, 60,181, 7, 26, 93, 33, 72,130, 68,
- 94, 97, 46, 76,102, 35, 98, 39,204,169,118,185, 23,191,252, 79,197, 1, 0,246,158,188, 86,101,206, 89,179,102, 33, 51, 51,179,
-132, 37,171, 58,126, 89,207, 58,202,139,150,246, 0,192,120,231,141, 22,139,197,107,238,220,185, 81,254,254,254, 32, 8, 2,203,
-151, 47,135,175,175,111, 7, 0, 55, 45, 22, 75,142, 94,175,159,238, 32, 66,122,194, 22,107, 35, 43, 43,203,229,188,125,189, 94,
-111,141,138,138, 18,133,132,132,148,152,109,232,225,225, 81,150,117,167,152,211,190,143,166,105,196,198,198, 98,193,130, 5, 8,
- 15, 15, 71,191,126,253, 16, 29, 29, 13,130, 32,208,167, 79, 31,244,235,247,215, 80,174, 74,165, 18, 31, 59,118,172, 11, 73,146,
- 9, 14, 47,144, 18,156,174, 96,119,140,167, 40,202, 93, 7,248, 18,156,246,202, 54,101,202, 20, 44, 88,176, 0, 51,103,150,239,
-234,177,126,253,122,160,180, 63,213,223,206,153,151,151, 87,162,177, 87, 40, 20,171, 7, 15, 30, 44,124,252,248,113, 9,113,229,
-184,184,104,136, 74,112, 86, 20,144, 84, 32, 16, 32, 40, 40, 8,243,231,207,135,159,159, 31,130,131,131, 93, 5,242,171,176,140,
-170,128,191,149,147,225,216,171, 75, 22,254, 95,199,255,109, 59, 40,146, 74,128,203,231,246, 66,147, 95,114, 56,201,108,253,107,
- 42,181,164,117, 15, 88,174,253,232, 86, 93,178,139,233,207, 62,251, 12,159,125,246, 89,185, 9,218,176, 97, 67,181,243,238,166,
-216, 42,205,201,114,132,194,195, 7, 50,143, 90,104, 22,233, 3,150,163,255, 81,101, 84, 6,126,253,229,151, 95, 6,248,249,249,
- 33, 53, 53, 53, 64, 36, 18, 13, 40, 97,174, 50, 26, 81,183,110,221, 23,212,106,245, 43, 21,113, 78,153, 50,197, 60,123,246,108,
-233,136, 17, 35, 48,120,240, 96,140, 24, 49, 66, 42, 22,139, 27,114, 28, 7,171,213,138,212,212, 84,252,248,227,143, 80,171,213,
-183,202, 75, 39,203,113,132, 92,161,130,204, 35, 4,205, 94, 84,129,101,233, 26,201,187,163, 85,220,209,154, 85, 73,145,229,178,
-126, 2,192,175, 63, 30,192,156, 15, 95,196,150, 35, 63, 99,213, 47, 64, 11, 85, 54,154, 5,168,193,170,111,225,163,145, 47, 99,
-233,246,223, 0, 0,231,206, 86, 88, 70, 92,121,117,208,100,180, 86, 43,239,142,150, 43,199,235,184,225,163, 85,138,211,222, 73,
-212,106,181, 40, 40, 40, 64,124,124, 60,222,124,243, 77,100,103,103,227,225,195,135,184,115,231, 14,190,251,238, 59, 40, 20,138,
- 42,149,209,180,183,103, 97,246,210,169,224,192,161,113,131,102,152, 49,241, 51,180,105,209,190,218,229,238, 12, 55,172, 89,101,
-114,174, 88,177,162,170,117,233, 95, 39,180, 92,194,223,223,127, 68,151, 46, 93, 96, 50,153, 16, 16, 16,128,135, 15, 31,130, 36,
-201, 8,160,104, 8, 47, 52, 52,116,151, 90,173,142,112,151, 79, 32, 16,128,166,233, 98,223, 31,251, 2, 0,253,251,247,199,161,
- 67,135, 42,236, 81, 4, 7, 7,163,118,237,218,248,224,131, 15, 74,205,114,112,156,233, 32,151,203,113,228,200,145,204,188,188,
-188, 60,142,227, 42, 53,205,205,238, 24,127,225,194, 5,183, 29,224, 29, 97,181, 90, 31,223,185,115, 39,100,195,134, 13,130,114,
- 94,126,197, 56,119,238, 28,141, 10,134,106,254, 14, 78, 87, 61, 83,142,227,202, 20, 89,238,132, 17,168, 40, 32,169, 80, 40, 68,
- 82, 82, 18,230,204,153, 3,130, 32,176,119,239,222,231,226,225,250,243,118,238, 38,146, 36,125,250,191,218,177, 57, 8, 2, 86,
- 75,233,145,106,207,124, 93,177,200, 26,252,229, 78,236,159, 54,220, 29,209,147,124,254,252,121,223, 13, 27, 54, 8,221, 41,247,
-243,231,207,211, 28,199, 85,122,216,207,254,194,177, 90,173, 48, 26,171,102, 69,225, 56,238, 82,220, 23,179,163,182,126,123, 84,
- 68, 16, 22, 92, 62,187, 23,133, 5,174,221, 25, 36, 34, 33, 54,197,239,163,197, 34,193,227,167, 92,116,107, 6, 13, 26, 52,226,
-171,175,190,106,230,106,167, 27,147, 96, 30,154, 76, 38,164,165,165,193, 96, 48,236,249,228,147, 79,172, 71,143, 30,125,235,181,
-215, 94, 67,203,150, 45, 17, 18, 18,130,140,140, 12, 36, 39, 39, 35, 62, 62,158,187,120,241,226, 30, 0,147, 42,184,143, 7, 22,
-126, 49, 59, 38,126,251, 81, 9, 73, 88,113,249,220, 94, 20, 58,137,246,210,214,105, 17,190,217,178,207, 42, 22,139,110, 87,100,
- 45,114,180,102,213,228,139,113,192,168,137, 24,188,114, 21, 34,218,244,198,194, 69, 61,241,205, 23, 67,177,172,143, 24,214,221,
- 35,209,226,245,173,216, 49,183, 47, 0,160,214, 55,110, 90, 75,132, 98, 60,114, 97,177, 42, 40,148,217,196, 77,229,172,166,246,
-188,151,103,185,170,172, 69,139, 36, 73,212,171, 87, 15, 17, 17, 17,232,208,161, 3, 90,183,110,141,110,221,186,225,250,245,235,
-184,126,253, 58,166, 76,153, 82,158,200,170,176,140,186,190, 18,133,159, 59,221,174,118,217, 56,151,123, 77,192,157,186, 52,113,
-226, 68, 0,248, 87, 89,183, 42, 45,180, 52, 26,205,117,150,101,155,123,123,123,219, 45, 82,197,251, 82, 82, 82,192,178,172,161,
-178, 5, 99,177, 88,236,193, 49, 75,196,101,178, 59,199,151,247,224,115, 28,199,228,229,229,161, 75,151, 46,232,212,169, 83,241,
-240,137,227,226, 32, 76,176,127,255,126,112, 28, 87,105, 39,107, 7,199,120, 29, 42,233, 0, 15, 0,217,217,217,189, 59,119,238,
-124, 82, 40, 20,186,245, 21, 77,150,101, 31,102,101,101,189,250,164, 57, 93,149, 15,203,178,101,138, 44,119, 26,162,138, 2,146,
- 10,133, 66,120,120,120,224,251,239,191,135,191,191,255,115,245,128, 93, 79, 84, 47, 46,111,127, 23, 63,201, 89, 0, 1,131,191,
-220,249,232,108,174,181,206,224, 47,119,166,236,159, 54, 60,188,188,115, 50, 51, 51,123, 13, 31, 62,252,152,187,229, 78,211,244,
-131,204,204,204, 74,135, 75,224, 56, 14,183,111,223,102,199,141, 27,151,163, 86,171,135, 86, 37,255, 51,230,172, 90,182,224,243,
-201,126,125,162,218,181, 1, 9, 88,202,118,254,229, 8,128, 19,138, 4,143,167,207, 92,241,246,208,161, 67,159,102,177,105, 50,
- 51, 51, 59, 12, 25, 50,100, 18,254,114,157, 40, 33,164, 80,198,236,106, 27, 86,214,174, 93,251, 69,129, 64, 32, 5, 48, 7, 64,
-202,197,139, 23,215, 92,188,120,177, 23,128,255, 8, 4,130, 16,134, 97,210,108,157,158,157, 0,254,168,184, 30,101,191, 3,142,
- 13,235,211,243, 63,189, 65, 16,156,197, 98,174,160,131, 4, 14, 28,199,137,197,162,219,191, 94,207,104, 81, 94, 71,202,225, 11,
- 28, 53, 62,100, 63,105,210, 36, 76,154, 52,169,184, 62,173, 94,221, 9,123,254,188,128,215, 91,164,194,252,117, 71, 16,202,112,
-183, 59,124, 0, 48,235,255,198,213, 88,218, 28,243,238,104,209,114,245, 28, 84,198, 71, 75, 32, 16, 32, 39, 39, 7, 73, 73, 73,
-200,202,202,130,193, 96, 64, 98, 98, 34,172, 86, 43,242,243,243,241,226,139, 47, 86, 57,157, 53, 85, 70, 79,147,243,223, 56,124,
- 88,105,161,101,181, 90, 63,173, 87,175,158, 72, 38,147, 53, 99, 24, 6, 28,199,129, 97, 24,206, 38,106, 42, 61, 11, 79, 36, 18,
-153, 26, 53,106, 68,184,154,157, 96,255,239,225,225, 97, 44,199, 90, 18, 87,183,110,221, 79, 8,130, 16,148,213, 11,177,255,103,
- 89,150, 17, 10,133,113, 85,188, 87,213,117,140,215,171,213,234,246, 53, 92,126,127, 7,167,115,249,232,155, 52,105, 82,252, 69,
-123,231,152, 40,182,143,173,234, 43, 16,231,229, 6, 36,213,235,245, 25,189,123,247,102, 28,247, 59, 6, 52,125,174, 65,112, 41,
-125, 71,188, 85,231,108,174,181, 14, 0,216,197, 22, 56, 46,165,156,179,140,153,153,153, 93,254,238,164,221,191,127,223,242,159,
-255,252,231, 91,173, 86, 59, 17, 64,149,189,249,103,126,186,122,230, 51, 88, 50, 26, 0, 11,170,120,110, 74,110,110,110,119,167,
-109,127,216, 5,149, 61,174, 93,165, 69,251,173,156, 26,143, 45, 70,211,116,106, 68, 68, 68,165, 44, 55, 20, 69,165, 86,180,223,
- 57, 70,152, 35,110,194, 27, 51,175, 0, 69,147,191,115,221,226, 52,153, 76,121,237,219,183, 23, 85, 50,111,217,238,230, 61, 36,
- 36, 4,181,106,213, 42,254,181,195,121,123, 69,233,164,105, 58, 53, 44, 44, 12,254,254,254,101, 70,124,119,246,201,114,135,179,
-166,203,168, 60,206, 90,181,182,214, 56,103, 85,211,201,195, 61,244,228, 57,121, 78,158,243,153,229, 20,240,247,147,231,228, 57,
-121,206, 39,200,249,220,129,227, 56,240, 94,106, 60,120,240, 40, 11, 12,127, 11,120,240,224,193,163,122, 32,202, 81,165,149,153,
-233, 83, 21,101,123,138,231,228, 57,121, 78,158,147,231,228, 57,121,206,127, 29,103, 69,220, 53, 61,211,248,169,161, 58,225,113,
-254, 78, 1,198,115,242,156, 60, 39,207,201,115,242,156, 60,231,191,143,243,185, 3, 63,116,200,131, 7, 15, 30, 60,120,240,224,
-241, 55,130, 23, 90, 60,120,240,224,193,131, 7, 15, 30,188,208,226,193,131, 7, 15, 30, 60,120,240,224,133, 22, 15, 30, 60,120,
-240,224,193,131, 7, 15, 94,104,241,224,193,131, 7, 15, 30, 60,120,240,224,193,131, 7, 15, 30, 60,120,240,120,166,192,113, 92,
-209, 39,120, 14, 31, 62, 92, 28,232, 33, 58, 58,154,224,111, 13, 15, 30, 60,120,240,224,193,227, 73,226,121,213, 34, 66, 94, 96,
-241,224,193,131, 7, 15, 30, 60,254, 9,120, 30,181, 8,233, 74, 73,242,224,193,131, 7, 15, 30, 60,120, 60,105, 60,143, 90,132,
-124,158, 85, 36, 15, 30, 60,120,240,224,193,227,217,193,115,111,209,226,173, 90, 60,120,240,224,193,131, 7,143,167,133,103, 88,
-139,112,182,197,113,157, 7, 15, 30, 60,120,240,224,193,131, 71, 53, 5, 86,153,191,252,183, 14,121,240,224,193,131, 7, 15, 30,
- 60,170, 14,194,197,250, 19,181,102,241, 95, 54,231, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 95,137,226, 56, 90, 60,120,
-240,224,193,131, 7, 15, 30, 60,170,167,171, 28,254, 23, 91,186,120,161,197,131, 7, 15, 30, 60,120,240,224, 81,125,145, 69,184,
- 90,231,125,180,120,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,240,224,193,131, 7,143,234,193,217, 9,158,
- 31, 58,228,193,131, 7, 15, 30, 60,120,240,168, 97,177,229,114, 99, 89, 51, 7, 78, 85,130,188, 42,179, 15, 78,241,156, 60, 39,
-207,201,115,242,156, 60, 39,207,249,175,227,172,136,251, 20,158, 13,137,148,178, 0, 0, 32, 0, 73, 68, 65, 84, 61,116, 1,112,
- 6, 64, 87,219, 47, 0, 16, 28,247,247, 71,122,224,167,190,242,156, 60, 39,207,201,115,242,156, 60, 39,207,249,188,195, 57, 96,
-105,209, 10, 31,176,148,135, 27, 16,162,252, 33,230,138,246,243,224,193,131, 7, 15, 30,255, 54,177,197, 57,190, 36, 93,161, 33,
-128,153, 0,188, 29,182,253, 2, 32,206,233,184,237, 0, 20, 14,235,122, 0,115, 1,220,173, 48, 53, 28, 39,182,241, 75,109, 11,
- 11,192, 4,192, 12, 64, 75, 16, 4,197,151,217, 83, 71,123, 0,209,182,255,135, 1, 92,174,228,254,231, 10, 33, 33, 33,114, 31,
- 31,159, 94,215,174, 93,147, 36, 38, 38,226,252,249,243,220,166, 77,155,172,249,249,249, 39, 50, 50, 50,140,124,117,121, 46,208,
- 27,192, 12,219,255,133, 0,142, 87,147,143, 80, 40, 20, 83, 60, 60, 60,250, 74,165,210, 90, 52, 77, 19, 6,131, 33, 93,175,215,
-159,164,105,250, 75, 91,187, 87, 89, 12,244,245,245,125,171,113,227,198, 13, 31, 62,124,152,150,158,158,190, 29,192,110, 0, 67,
-107,213,170, 53,178,110,221,186,161,183,111,223,190,155,151,151,247, 13,128, 3, 79, 49,157, 60,120,252,155, 64,148,103,141,112,
-133, 57, 28,199,141, 44,193, 64,148,230,232,222,189,251,128, 19, 39, 78, 40, 88,150,133,125,145,203,229, 52,128, 49, 21,136, 44,
-191, 75,151, 46,213,153, 56,113,226,224,244,244,244,151,181, 90,109, 91, 0, 80, 40, 20, 63, 7, 6, 6,254,186,114,229,202,239,
- 56,142, 75, 37, 8, 66, 91,201,140, 10, 69, 34,209,155, 62, 62, 62,125,105,154,110,205,113, 28, 68, 34,209,181,252,252,252,227,
- 20, 69,125, 3,160, 42,226, 77, 34, 20, 10, 39, 73,165,210,222, 52, 77, 55, 7, 0,161, 80,120,195,108, 54, 31,167,105,122, 13,
- 0, 75, 21, 56,101, 18,137,100,146, 82,169,140,178, 88, 44,205, 1, 64, 34,145,220,208,104, 52, 39, 45, 22,203, 26,155,224,124,
-218, 16, 2,136,230, 56, 78, 4, 0, 2,129, 96, 96,219,182,109,235, 16, 4,193, 18, 4,193,113, 28, 71,252,252,243,207,173, 24,
-134, 33,109,245, 35, 26,192,175, 0,232,103,241, 9,241,247,247, 95,192,178,108,173,114, 11, 77, 38,123,249,218,181,107,141,119,
-237,218,197,124,253,245,215, 5, 99,199,142,245,156, 56,113,162,112,245,234,213,107, 50, 50, 50,222,119, 62,222,207,207,111, 25,
- 73,146,254,238, 92,159,101,217,156,220,220,220,169, 79, 43,255, 49, 49,166, 18,230,238,248,120, 89, 3, 0,169, 85,172,223,127,
- 31,167, 41,134, 3,128,120, 89,124,131, 24, 83, 76,178,253,127,117,121, 29, 48, 99,237, 41,109,103,142, 3, 38, 69,121,145,213,
- 21, 90,161,161,161,241, 49, 49, 49, 35,154, 55,111, 46,228, 56, 14, 20, 69,193,108, 54, 55,190,124,249,114,215,189,123,247,190,
-172,213,106,135, 86,146,242,237,143, 63,254,120,254,188,121,243,252, 69, 34, 17, 65, 81, 84,131, 93,187,118,181,126,231,157,119,
- 62,216,176, 97, 67,237, 97,195,134,121,217,183,207,153, 51,167,205,194,133, 11,235, 3,248,242, 41,164,147, 7,143,127, 27,186,
-160,164,143,214,231, 0, 62, 43, 79,104,121,216, 94,158, 89, 54, 75, 22, 28,126,139,113,250,244,233,131, 66,161,208,110,209,106,
-171,215,235,131,156,172, 96,174, 68, 86,221, 81,163, 70,181,223,179,103,207,130, 97,195,134,101, 42, 20,138, 70,175,189,246,154,
-150, 32, 8,193,174, 93,187, 90, 69, 68, 68,200,251,247,239, 63,170,123,247,238,211, 56,142, 59, 79, 16,132,218,205, 76, 54,243,
-245,245,221,183,120,241,226, 58,189,123,247, 22,251,251,251,131,227, 56,164,167,167,135, 30, 57,114,164,207,231,159,127, 62, 45,
- 47, 47,111, 16,128,132, 74,220,184, 54,114,185,124,207,231,159,127, 30,210,167, 79, 31, 97,112,112, 48, 76, 38, 19, 18, 19, 19,
-123, 30, 63,126,188,243,134, 13, 27,222, 55, 26,141,175,219, 4,134,187,104,235,237,237,189,247,127, 31,127, 28,212,238,205, 55,
-133,190,190,190,224, 56, 14,106,181,186,231,133,173, 91,187, 78, 88,188,248,253,194,194,194, 33,174,238,247,211,132, 68, 34, 33,
-183,109,219,214, 82, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,166, 43, 66, 16, 97,233,233,233,222, 98,177,216,229,126,134,
- 97,208,185,115,231,122, 98,177, 24, 95,126,249, 37,149,147,147,211,234,171,175,190,186,182, 99,199, 14,255, 53,107,214,188, 14,
-160,148,208, 34, 73,210, 63, 53, 53,213, 37, 39,195, 48,176, 90,173,160,105, 26, 22,139, 5, 77,155, 54,125,170,249,143,143,151,
-133, 1,152, 26, 19, 99,250,208,182,233, 75, 0,211, 0,220, 71, 21,191,219,245, 55,112, 58,214,183,101, 14,255,171,157, 86, 7,
-212, 1,128,163,215, 77, 0,224, 91,221,251,234,225,225,209,228,141, 55,222, 16,170,213,106,136, 68, 34, 88,173, 86,100,102,102,
- 34, 50, 50, 82,240,237,183,223,190, 80, 89,190, 6, 13, 26,140, 93,184,112, 97,192,209,163, 71,173,219,182,109,179, 68, 69, 69,
-137,198,142, 29,171,236,220,185,115,211,176,176, 48,114,243,230,205,230,147, 39, 79, 82,163, 70,141,146,196,197,197, 5, 28, 57,
-114,164,127, 66, 66,194,151, 79, 58,157, 60,120,252, 11,113, 6,127,133,120,176,255,150, 43,180,224, 32,174, 6, 2,128, 72, 36,
-106, 21, 20, 20, 20, 79,211,116,176,205,170,147,153,149,149,245, 37, 69, 81,191,219,142, 61,192,178,236,128,138, 44, 89,163, 70,
-141,106,127,236,216,177,165,151, 47, 95, 46,204,205,205, 13, 62,120,240,160,105,218,180,105, 15, 1,224,254,253,251,245,251,247,
-239, 31, 58,121,242,228,212, 94,189,122,173,236,214,173,219,123, 28,199,157, 36, 8, 66, 95,145,200,138,140,140,188,116,238,220,
- 57, 47,149, 74, 85, 98, 71,221,186,117,241,222,123,239,137, 7, 12, 24, 16,209,163, 71,143,139,201,201,201,157, 0,252,233,142,
- 32,106,216,176,225,169,211,167, 79,123,250,248,248,160,160,160, 0,153,153,153, 48, 24, 12, 80, 42,149, 24, 54,108,152,184, 75,
-199, 14,181, 39, 79,121,255, 84,106, 90, 90, 79, 55,197, 86,219, 14,205,154,157,218, 17, 23,231, 73, 61,122, 4,185, 92, 14,157,
- 78, 7, 0,240,242,242,194,203,245,234, 9,127,219,186, 53,116,100,108,236,169, 95,147,146,122, 62, 37,177, 37,181,253,154, 1,
- 28, 22, 8, 4, 3, 37, 18, 9, 57,112,224, 64,156, 58,117,138, 48,153, 76, 66,155,117,135, 30, 56,112, 32,228,114, 57, 44, 22,
- 11,139,162,161, 67,250, 89,126, 74, 36, 18, 9,146,147,147, 75,108,211,106,181, 80,171,213,200,205,205,133,217,108, 70, 65, 65,
- 1, 88,150, 37,228,114,185,154,101, 89,144, 36,233, 44, 0, 74, 64, 44, 22, 35, 41, 41,169,196, 54,154,166,161,215,235, 97, 54,
-155, 97,181, 90,161,213,106,229, 94, 94, 94, 13,253,253,253, 83, 1, 28,200,203,203,251, 50, 43, 43, 43,229, 9,103, 63,199, 46,
-136,226,227,101,247, 0, 72,254,137,156, 14,150,172, 80,219,250, 31, 53,148, 86, 59, 30, 29,254,221, 20,110,179,142, 61,168, 1,
- 62, 22, 0,206,159, 63,143,172,172, 44,228,228,228, 64,173, 86, 35, 44, 44, 12, 28,199, 85,122, 56, 46, 57, 57,121,237,139, 47,
-190, 72,220,188,121,243, 56,128,213,187,118,237, 26,147,151,151, 55, 99,250,244,233,190, 75,150, 44,201,139,141,141, 93, 8, 96,
-203,174, 93,187,222,109,210,164, 73,223, 91,183,110,109,120, 26,233,228,193,163,166,193,113, 92, 27, 0, 1,246,182,197,214,238,
-250, 57,172, 95, 39, 8,194,226,112,156,197,214, 54, 56,255,218, 97, 95, 87, 19, 4,241,171,195,121,106,130, 32,126,173,106, 50,
-157,126,139, 58,221, 0,112,248,240, 97,206,190,184, 58, 51, 48, 48,112, 74,247,238,221,151, 94,189,122,181,105, 70, 70,134, 79,
- 70, 70,134,207,213,171, 87,155,118,239,222,125,105, 96, 96,224, 20,135, 27,225,124,234, 41,135,125,226, 75,151, 46,213,217,183,
-111,223,194, 83,167, 78, 21,182,106,213,202,114,250,244,105,186, 87,175, 94,217,182, 23, 52,221,171, 87,175,236,159,126,250,137,
-105,215,174,157,252,216,177, 99,143, 47, 94,188,184,108,207,158, 61, 65, 28,199, 9, 92,113,218, 32, 82,169, 84,223,159, 61,123,
-182,148,200,114, 68,237,218,181,113,248,240, 97,165, 74,165, 58, 0, 64, 92, 86, 58,109,144,201,100,178,189, 63,253,244,147,167,
-151,151, 23,178,179,179, 33, 18,137, 16, 24, 24,136,194,194, 66,100,102,100, 32,229,206, 29,144, 22, 11,150,127, 49,207, 75, 46,
-151,239,113,209,216,151,226,244,246,246,222,187, 99,193, 2,207,220, 83,167,240,199,252,249,176, 90,173,197, 67,174, 86,171, 21,
- 23, 39, 78,132,250,199, 31,177,121,206, 28, 79,111,111,239,189, 0,100, 21,112,214, 4, 28, 57, 39, 2,200,179, 45, 19, 1, 92,
-142,140,140,188,154,152,152,136, 78,157, 58, 97,247,238,221, 45,166, 79,159, 62,113,250,244,233, 19,119,239,222,221,162, 83,167,
- 78, 72, 76, 76, 68,100,100,228, 85,148,244,207,250,187,211,249,183,113, 50, 12, 83, 98, 97,217,191,222, 49,181,106,213,202,222,
-183,111, 31,134, 13, 27, 70, 74, 36,146,140,225,195,135, 75, 47, 92,184,192,217, 68,166,219,233, 52,153, 76, 48, 26,141,208,235,
-245,184,127,255,190,124,241,226,197, 29, 63,251,236,179, 6,167, 78,157, 10,157, 57,115,230,132,128,128,128,107, 65, 65, 65,117,
-158,112,222,173, 78,255,151, 3, 72,171,164,133,232,239,230,228,108,231, 35,198, 20,211,210,161,129,173, 44,111,121,247, 51,211,
-150, 86, 61,128,148,234,212,165,238,221,187,191,216,160, 65,131,160, 93, 55,125,144, 47,110, 12, 86,172, 2, 43, 86,129,241,107,
-131,100,201,171, 8, 15, 15, 15,242,244,244,108, 95,201,116,110,187,121,243,230,127,108, 61,229, 92, 0, 75, 99, 99, 99, 63, 39,
- 8,226,124,108,108,236, 60, 0, 75,109,219,231,223,186,117,171, 29,128, 29, 79, 41,157,207,196,243,206,115,254,179, 56, 43,208,
- 34, 1, 4, 65, 28, 38, 8,226,240, 39,159,124,210, 13,128,159,211,250, 43,142,199, 1,144,184,250,181, 47, 14,219, 3, 56,142,
-235,231,112, 94, 64, 21,147, 79,184, 88,254, 18, 90, 0, 16, 29, 29, 77, 68, 71, 71,219,119,252, 66, 16,196, 65, 0,191,136, 68,
-162, 86, 45, 91,182, 28,248,195, 15, 63,120, 5, 4,252,117,253,128,128, 0,236,217,179,199,171, 89,179,102, 3, 69, 34, 81, 43,
- 0,191, 40,149,202,131,229, 88, 97, 84, 19, 39, 78, 28, 60,122,244,104, 77,171, 86,173, 0,160, 32, 33, 33, 65,209,174, 93, 59,
- 61, 77,211, 4, 77,211, 68,187,118,237,244, 9, 9, 9, 10,138,162,180,109,218,180,241,232,209,163,199,195,169, 83,167,142,114,
- 33, 56, 28,241,198,162, 69,139,194,124,124,124,202, 83,194,208,106,181, 8, 10, 10,194,196,137, 19,131, 69, 34,209, 91,229,221,
- 45,161, 80, 56,105,209,162, 69,129, 42,149, 10,249,249,249, 8, 11, 11,131,197, 98, 65, 82, 82, 18, 76,122, 29, 40,173, 6,148,
-166, 0,234,123,119,161, 18, 9, 49,106, 64,116,144, 80, 40,156, 84,129,181,100,210, 55,177,177, 65,150,135, 15,113,127,247,110,
- 48,116,105,227, 15,109,181,226,198,198,141, 48,165,166, 98,225,184,113, 65, 18,137,100,210, 19,182,100, 45,225, 56, 78,206,113,
-156,156, 32,136,149,237,219,183,255, 86, 46,151, 79,140,139,139,235,125,226,196,137, 62,231,206,157,235, 74,211,180,136,166,105,
-209,249,243,231, 59,153, 76, 38,161, 84, 42,133, 80, 40,228,240,156, 66, 36, 18, 65, 44, 22, 67, 46,151,163, 99,199,142,247, 54,
-109,218, 68,133,133,133,137,246,238,221,235, 83,171, 86, 45,143,213,171, 87, 23,104,181,218, 69,238,242, 89,173, 86,152,205,102,
- 24,141, 70,152, 76, 38,156, 62,125,186,222,228,201,147,133, 38,147,137,233,223,191,127, 30, 69, 81,230,216,216, 88,165,175,175,
-239,180, 39,153,207,152, 24, 19,107,179, 60,221,178,137,150, 7,168,166,207,211,223,193, 9,192, 98,243,201,178,195,223,198,109,
-169,161, 91, 65, 3,208,217,132,150,217,233,249,104,238, 96,241,173, 16, 5, 5, 5, 27,190,249,230,155, 48, 82,170,194, 5, 75,
- 95,124,199,126,142, 19,222,171,145, 93,231, 35, 4,134, 53,192,136, 17, 35, 2, 57,142, 91, 93, 3,105,254, 10, 64,103, 0, 43,
-171,114,242, 19, 72,103, 29, 15, 15,143,221, 94, 94, 94, 23, 60, 60, 60,118,195, 54, 60, 91, 29, 68, 53, 64,207, 1, 77,200,212,
-168, 8,112, 3,154,144,169, 81, 13,248, 80, 3,207, 11,156,180,136, 35,212, 28,199, 69,115, 28, 23,189,112,225,194, 5, 14,239,
-119,251,186,220, 77,203, 88, 52,199,113,209, 37, 20, 82,145,192,170,182,209,205,197, 82,164, 41, 28,149,164, 67,230,138,103, 23,
- 6, 5, 5,197,199,199,199,123, 57, 51,102,100,100, 64,163,209, 96,246,236,217, 94,163, 71,143,126, 63, 53, 53, 53,166,130, 68,
- 72, 50, 51, 51, 91,143, 28, 57, 82,102,181, 90,243, 89,150, 37, 53, 26,141,208,219,219,155,177, 31,224,237,237,205, 20, 22, 22,
-138,244,122,189,128, 97, 24,243,232,209,163, 37,227,198,141,123, 25,128,160, 44,210,128,128,128,168,190,125,251,150, 57,116, 64,
- 81, 20,244,122, 61,244,122, 61,172, 86, 43, 58,118,236, 40,221,180,105, 83,175,236,236,236,117,101, 42, 14,169, 52, 42, 42, 42,
- 74,148,151,151, 7,111,111,111,164,164,164,224,193,131, 7, 48,235,116,176,234, 52,176,234,180,160,181, 26,112,154, 66,228,222,
-189,141,118, 77, 26,139,183, 75,165,189,245,122,253,178,178, 56,149, 74,101, 84,187, 49, 99,132, 30, 30, 30,232, 58,178,104,158,
-193,177, 38, 77,192, 49, 12, 88,134, 1, 67,211,232,157,148, 4,138,162, 64,146, 36,218,228,229, 9,149, 91,183, 70,169,213,234,
-165, 79,163,178, 75,165, 82,225,182,109,219,222,144, 72, 36,224, 56,142,176, 88, 44, 56,113,226,196,191,238,161,151, 72, 36,144,
-201,100,176, 90,173,168, 91,183,174,113,228,200,145,151,190,248,226,139,112,146, 36, 61,196, 98,241, 15,185,185,185, 11, 50, 50,
- 50,238,187,203, 71, 81, 20, 44, 22, 11, 44, 22, 11,140, 70, 35,238,221,187, 23, 92,175, 94, 61, 98,226,196,137,140,193, 96,168,
-191,106,213,170,228, 19, 39, 78, 40, 22, 45, 90,244, 26,128,247,158,116,126, 99, 98, 76, 77, 0, 52,137,143,151,137,109,150, 95,
-203, 63,140,147, 67,145,227, 59,226,101,241,137, 0,212, 53, 40,178, 36, 0,188,195,253,132,122,145, 0, 58, 0, 94, 54, 81,240,
- 26, 65, 16,237,154, 54,109,234,147,152,152,152,207,113,220, 21, 0,223, 1,200, 40,143,140,101, 89,130,101, 89,188,211,182, 0,
- 19,219, 11, 64, 81,133, 40, 44, 44, 68, 74, 74, 10, 18, 18, 18,240,243,207, 9, 85,125, 54,223,242,244,244,236, 37,147,201,234,
-210, 52, 77,234,116,186, 20,131,193,112,138,101,217, 13,168,130,143,218,223,149, 78, 59, 60, 60, 60, 22,207,156, 57,179,131,183,
-183, 55,126,255,253,247,250, 59,119,238, 92,172,215,235,171,229, 92, 47, 19,145,155,151,173, 88, 29, 26, 26,168,194,245,115,135,
- 66, 23,172,223,181, 25, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142,235, 71, 16,196, 97,103,161, 84, 41,179, 83,
- 53,207,175,192,162,229,252, 97,233,146, 66,171, 12, 5, 9,154,166,131, 29, 45, 89, 28,199, 33, 35, 35, 3,105,105,105, 80,171,
-213,240,241,241,129,213,106, 13,118,167,125,208,106,181,109,253,252,252, 12, 34,145,200,108, 52, 26,161, 80, 40, 88,145, 72,196,
-217,174, 67,216,102, 45, 50,102,179,153, 16, 10,133,148,151,151,151,167,217,108,110,140,114,124,201, 56,142,107,235,231,231,231,
-114,159,217,108,134, 78,167,131, 94,175,135, 78,167,131,217,108, 70, 80, 80, 16,104,154,110, 93,110,151,150,166,155, 7, 4, 4,
- 32, 61, 61, 29,114,185, 28,169,169,169,176,232,180,176,106,181,160,245, 26, 48,133,133, 96, 53, 26,176,122, 13, 40,139, 1,161,
-141,154,192, 62, 35,177,204,110,184,197,210,220,207,207, 15,122,253, 95,238,102,156, 77, 96,209, 52, 13,218,230, 28,109, 31, 78,
-244,247,247,135,125, 70,226, 19,130, 25,192,116,146, 36, 87, 74,165, 82,225,132, 9, 19,144,145,145, 81,162, 78, 76,152, 48,161,
-216, 39,171,115,231,206,231,101, 50, 25,173, 86,171, 97, 54,155, 69,207,235, 67, 79, 16, 4, 8,130, 40, 42, 35,154,134,191,191,
-191, 62, 39, 39,231,231,130,130,130, 55,170,194, 71, 81,148,125, 70, 23,140, 70, 35, 56,142,195,239,191,255, 14,153, 76, 38, 98,
- 24,230, 38, 77,211, 10,145, 72, 4,210,230,252,245,164, 96,155, 17,248, 37,128, 48,155,133,232, 45, 20, 57,156,167,185,104, 72,
-220,186,117,110,114, 86, 94,184,153, 98,236,150,166, 52, 84,109, 56,210, 21,186, 54, 86, 73,150,197,181, 11, 84,181,236,239,161,
- 87, 72, 4,122, 54,165,101,221,255, 45, 73,216, 57,122,212, 91, 94,115,231,206,173,227,239,239, 47, 75, 78, 78, 54,205,155, 55,
-175,222,182,109,219, 8, 20, 13,211,149,137, 71,143, 30,237,159, 57,115,166,111,223,190,125,235, 75,165, 82,162,176,176, 16,106,
-181, 26, 89, 89, 89,120,240,224, 1,119,253,250,245,123,102,179,121,119,101, 18, 25, 18, 18,178,233,141, 55,222, 24,253,210, 75,
- 47,137,236, 22, 82,189, 94,223,234,236,217,179, 3,142, 29, 59,214, 73,175,215, 87,186, 94, 62,126,252,120,247,172, 89,179, 60,
- 94,125,245,213,198, 82,169,148,172,137,116, 58,130, 36,201, 32, 79, 79, 79,156, 58,117, 10, 42,149, 10, 36, 73, 6, 85,183,190,
-154,172,108,104,173, 96, 63,152, 46, 46, 67,227,128, 58, 48, 89,217, 80, 94,162, 60, 63, 22,173, 50,222,245,109,236, 22,169, 10,
-196,146,113,198,140, 25, 51, 9,130, 56, 60, 99,198,140,153,174, 44, 90,182,191,140,227,113, 14,199,155,107, 90,108, 85, 42,208,
- 36,203,178, 72, 75, 75, 67,122,122, 58,210,210,210,144,155,155, 11,146, 36,193,113,156, 59,179,207, 56,130, 32,216,147, 39, 79,
-250, 92,186,116, 73,223,166, 77,155, 2,187,255, 11, 77,211, 4, 69, 81,132,205, 47,134, 72, 73, 73, 17, 95,184,112, 65,117,235,
-214,173, 32, 91,111,149,173,192, 20, 88,106,155, 93, 96, 57, 46, 38,147, 9, 50,153,204, 61,213, 97,123, 17,254,126,245,106,145,
-200,210,105,109, 67,134,133, 96, 52,133,224,244, 90, 72, 24, 10, 18,112, 32, 76, 6,183,239,159, 35,236, 34,203,106, 19, 90, 22,
-139, 5, 20, 69,129,101, 89,208,244, 83,241, 43, 95,219,162, 69,139,214,251,247,239, 31,155,150, 86,250, 93, 56,104,208, 32,188,
-247,222,123,152, 60,121,242,173,126,253,250, 93, 63,116,232, 16, 38, 77,154, 4,150,101, 91, 2, 40, 4,112,236,121,123,232,205,
-102,115,177, 5,202,100, 50,193,106,181, 2,229, 56,191, 87, 84, 55,237,101, 75,211,180,157,155,216,191,127, 31,206,159, 63, 79,
- 38, 36,220, 12,155, 48, 97,162,221,225,254, 73,103, 53, 21, 69, 51,247, 36,182,134,194,130, 34,255,167,178, 66, 42, 68,160,252,
- 33, 59,174, 60,206,234,160,197,250, 22,195, 62,252,240,195, 40, 20,205,112,190, 95, 77,139,214,171, 18,146,248,122, 74,115, 95,
-217,180, 22,126,122,137,144,208, 37,125, 61, 83,247, 32, 92,169, 15,170,173,176,132,213, 83,213, 90,176,224,139,144, 91,183,110,
-155,103,207,158,157, 56,124,248,240,192,105,211,166, 53,221,187,119,111, 39,147,201,244, 13,128,130,178,140, 46, 3, 6, 12,184,
- 18, 24, 24, 88,111,253,250,245,217,143, 31, 63,246,161, 40,202,195,106,181,178,122,189,254,129,209,104, 60,101,181, 90, 79, 1,
-184, 90,153,196,122,121,121,181, 24, 51,102,140,168,160,160, 0, 66,161, 16, 86,171, 21,217,217,217,232,208,161,131,224,224,193,
-131,205,170,114, 3,242,243,243,151,125,243,205, 55,103,118,236,216,209, 75,169, 84,190, 36,149, 74,131, 1, 48, 90,173, 54, 75,
-175,215,255, 81,149,116,150,104,231, 24, 38,235,234,213,171, 17, 74,165, 18,143, 30, 61, 2,195, 48, 89,213,173, 3, 50, 49,249,
-248,198,185,131,181,155,248,215,195,133, 75, 87, 32, 19,147,143,249, 80, 95,207, 61,236, 62, 84,112, 20, 80, 46, 4,210,165,184,
-184, 56,249,194,133, 11, 17, 23, 23,119,211,149, 69,203, 46,184,226,226,226,110,218,143,115, 56,254, 92, 53,210, 88,182, 69,171,
- 44, 5, 9, 20,205, 46, 84,171,213, 62, 42,149,170, 88, 96,165,167,167, 35, 61, 61, 29, 18,137, 4, 41, 41, 41,144, 72, 36, 25,
-238,116, 66,228,114,249,111,173, 90,181,122,225,254,253,251,226,121,243,230,213,190,122,245,170,178, 67,135, 14, 47,202,229,114,
-134,227, 56,152, 76, 38, 50, 49, 49,209,115,233,210,165,161,109,219,182,181,180,109,219,246,218,174, 93,187,140, 40, 39,254, 21,
- 65, 16,191,100,100,100,212,175, 91,183,174, 93,180,149, 16, 87,142,130, 11, 40, 26,242, 20, 10,133,215,202, 75,168, 80, 40,188,
-145,148,148,212, 83, 33,147,194,162,213,192,170,211,128,214,106,193,104, 11,193, 20, 22, 2,122, 13, 36, 52, 13, 17, 67, 65, 46,
-147, 33, 45, 53, 21, 66,161,240, 70,121,156, 18,137,228, 70, 86, 86, 86, 79,149, 74, 85,252, 18,165,104,186,104, 97, 24, 88,104,
-186,216,162, 37, 18,137,240,248,241, 99, 72, 36,146, 27, 79,186, 38,147, 36,201,216, 67, 56,148,145, 15, 4, 5, 5,177,237,218,
-181,195,164, 73,147,192, 48,140,173, 24,136,174, 0, 46,160,200,191,229,153,132, 43,113,107,119, 90, 55, 26,141,208,233,116,200,
-207,207, 23,202,229,242, 23, 66, 67, 67,175, 88, 44,150,221, 52, 77,111,126,240,224,129,166, 44, 78,155, 48, 43, 22, 93, 44,203,
-130,227, 56, 48, 12, 3,138,162, 32, 22,139,217,179,103,207, 97,233,242,197,136,223,188,141, 27, 48, 96, 0,113,240,224, 65,176,
- 44,155,250,132,179,111,177,137,150,242, 26, 13,231,144, 10, 31,161,252,144, 10,101,113, 58,246,254, 28,183, 17, 46,142, 41,133,
- 15, 63,252,240, 56,138,134, 12,115,108, 98,174, 58,156, 95, 22,124,247,133, 12, 52,163, 55,159,221,161,251,246,142, 70, 63,247,
-219, 21,191, 89, 36, 2,205,203, 93,130,154,215,175,247,130, 64,165,242, 33,215,109, 88,153,187,125,219,158,228, 71,143, 30,105,
-214,172, 89,211,254,133, 23, 94,240,254,227,143, 63, 66,203, 18, 90, 10,133,162,225, 91,111,189, 53, 38, 63, 63, 95, 28, 31, 31,
-191, 43, 35, 35,227, 55, 20,133,150,113,156, 65,221, 15,192, 22,155, 16, 13,178,181,115, 23, 0,204, 43,175,191, 70, 16, 4,126,
-250,233,167, 82,179, 3,217,234,169,115, 85,131, 6, 13,134,221,191,127,255,124, 86, 86,214, 16,231,157, 98,177,120,110,163, 70,
-141,122,223,188,121,243,115, 0, 71, 43, 67,108, 48, 24, 98,247,236,217,179, 68, 32, 16,212, 98, 24, 38,221,104, 52,198, 86,219,
-162, 69,177,227,226,214,237,220,104,180, 48,225,114,137,224,145,137, 98,223,230,117,200,243,107,205,178, 65,237, 96,141, 82,163,
-232, 59,130,142,235,127,216, 94, 70, 22,142,227,236,199,170, 29,172, 88, 22, 39, 43,152,171,125,234,106, 4, 75,231,202,106,227,
-202,178,104,125, 2,160, 45,128, 95,178,178,178, 86,142, 30, 61,122,233,246,237,219,189, 52, 26, 13,178,178,178,144,157,157, 13,
-161, 80, 8,165, 82,137,181,107,215, 26,179,178,178, 86, 58,158,131,210, 17,228, 1,192,228,239,239,255,219,182,109,219,130,191,
-254,250,107, 97, 76, 76, 76, 74,191,126,253, 26,175, 93,187,246,190, 88, 44,230, 24,134, 33,204,102, 51,241,206, 59,239, 68, 44,
- 95,190,252,161, 64, 32, 80, 12, 27, 54,140,240,240,240,248, 5,229,132, 13, 80,171,213, 39,191,255,254,251,193, 83,167, 78,149,
- 90, 44, 22,151,150, 44,251, 54,149, 74,133,139, 23, 47, 90,242,243,243, 79, 84, 96,197, 56,249,195,209, 35,157,255, 59,124,184,
-152,210,106, 64,105, 53,160, 53, 26, 48,218, 2, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19, 71,126,253,131, 50,
-155,205,229, 6, 54,212,104, 52, 39, 47,196,199,119,109, 91,167,142,240,226,148, 41,176, 82, 20, 94, 77, 74, 42, 22, 87, 86,171,
- 21, 7,154, 55, 7, 67, 16,104, 57,126, 60,238,210, 52,173,209,104, 78,254, 19, 31,134,235,215,175,103,143, 28, 57,242, 42,203,
-178,173, 43, 99,221,249,167,131,162,168, 82,214, 40,134, 97,138,172,142, 69,150, 3,201,145, 35, 71, 58, 39, 38, 38,138,255,252,
-243, 79,156, 63,127,190,229,246,237,219, 63, 9, 15, 15,111,254,232,209,163,204,138,196,155,171,160,191,176,249, 31,238,218,177,
- 27,239,190,251, 46,145,153,153,137,239,190,251, 14, 21, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,181,225,228,247,228, 34,164,
-194,239,112, 51,164, 66, 89,156,166,152, 34, 43,153, 44,190, 40,216,168, 41,166,104, 56, 80, 22, 95,161,165, 12, 49,166, 24,141,
-205, 33, 62,163, 6, 56,245,160, 25,185,229,236, 14, 93,191,163,143,180,151, 51,140,243, 0, 28,135,137,225,238, 94,227,174,191,
-244,146,143, 63, 0,152, 77, 76,112,195,134, 13,187, 8,133, 66, 9, 0,120,122,122,190,228,231,231,183, 54, 55, 55,183,163,171,
- 50,141,142,142,110, 23, 24, 24,216,234,216,177, 99,127,100,100,100,220, 4,240,179,243, 65, 17, 17, 17,179,111,221,186,213, 70,
- 36, 18, 17, 21,212, 17, 0, 64,151, 46, 93, 94,144, 74,165,126, 71,239,120, 67, 35,110, 0, 78, 80, 8, 8,101, 96, 84, 45,144,
- 34,110,138,176,176, 43,126,249,249,249, 45, 11, 11, 11,255,168,100,209,119, 27, 60,120,240,230,248,248,248,176, 46, 93,186,112,
-215,174, 93, 35,157, 71, 17, 34, 34, 34,122, 93,190,124,185,245,219,111,191,189,126,231,206,157, 19, 81,114,166,109, 69, 72,177,
-197, 27,172, 49,156, 76,198, 41,128,169, 99,179,153,241, 10,229, 95,128,202,132, 92,168, 70,120,134,106, 37,177, 76, 3, 70, 25,
-219,219,218, 98, 98,181,165, 40,234,247,235,215,175, 31, 24, 54,108,152, 46, 55, 55, 23,126,126,126,168, 91,183, 46, 8,130,192,
-218,181,107,141, 15, 30, 60,216,107,139,165,213, 54, 61, 61,125,128, 77,108,185,130,118,213,170, 85, 59,183,110,221,170,186,122,
-245,170,128,166,105,101,227,198,141, 13,151, 46, 93,242, 20,137, 68,156, 88, 44,102,175, 94,189,170,136,136,136, 48, 17, 4, 33,
-253,241,199, 31,115,175, 92,185, 18, 62,125,250,244,111, 80,114,154,184, 51,118,204,159, 63, 63,237,254,253,251, 48,155,205,208,
-104, 52, 40, 44, 44, 44, 94, 10, 10, 10, 80, 88, 88, 8,145, 72,132,204,204, 76,236,219,183, 47,195, 22, 37,190, 60,203,198,154,
-213,107,215,169, 51, 30,165, 64,169,144,131,214, 20,128, 41,204, 5,180,133,144, 80, 86,120,136, 24,212,110, 32,135, 76,161, 68,
-150, 70,135,248, 75,191,102,218,162,196,151,109, 46,176, 88,214,188,183,124,121, 22, 45, 22,163,206,208,161,176,218,134, 10, 29,
-133, 22, 67, 16, 8,239,209, 3,164,183, 55, 22,236,221,155,101,139, 18,255, 68,193,178,172,192, 98,177,148,151, 15,176, 44,155,
-154,152,152,184, 19,192, 25,130, 32, 56,130, 32, 56, 20, 5,107,211, 61,203, 15, 50, 69, 81,152, 51,103, 14,196, 98, 49,230,204,
-153,131, 79, 63,253, 20, 75,151, 46,197,186,117,235,240,237,183,223,226,200,145, 35,245, 46, 92,184, 32, 62,119,238, 28, 23, 23,
- 23,151, 19, 17, 17, 33, 24, 63,126,188, 74, 46,151,127, 88, 30,103,108,108, 44,188,188,188, 16, 27, 27,139,197,139, 23, 99,211,
-166, 77, 56,112,224, 0, 46, 94,188, 8,129, 64,192,166,166, 62,134,201,100,226, 86,173, 90,149,118,224,192, 1,227,202,149, 43,
- 33, 20, 10,137,167,212, 72,124,104, 19, 84,142,150, 32,231,144, 10,185, 0, 86,160, 98,223,168,178, 56, 33,139,143,175,109, 19,
- 71,201, 14,130,232, 16,128,169, 40,127,122,181,157, 99, 34,128,224, 26,224,156, 37, 31,249,127,137,170,141,183,239, 93,206, 48,
-206, 2,240,131, 61, 79, 74,165, 82,190,127,255,247, 66, 0,216,187,103,159, 40, 41, 41,201,251,251,239,191,151, 5, 6, 6,226,
-219,111,191,149,201,229,242,192, 50, 56,153, 3, 7, 14,152, 37, 18,137,223,184,113,227,250,180,105,211,230, 3, 91, 71,180, 7,
-128,102, 40,154,189, 24,117,239,222,189, 4,127,127,255, 59, 39, 78,156,208,187, 83, 64, 90,173,246,155, 45, 91,182,212,205, 99,
-124,113, 84, 63, 24,241,236, 18, 28, 81,109, 70, 74,157, 79,161,168,245, 50,222,120,227,141, 90, 12,195,108,172,100,185,191, 49,
-104,208,160, 45,241,241,241, 97,227,198,141,203,188,118,237, 90, 22,128,120, 0,219, 28,151, 91,183,110,229,140, 30, 61, 58, 99,
-227,198,141, 33,195,134, 13, 91, 7, 96, 8,255,234,231,193,163,100, 95, 8, 21,205, 58,116,241,194, 45,254,159,157,157,189, 42,
- 63, 63,255,226,221,187,119,223,183, 88, 44, 33, 4, 65,112, 98,177, 56, 51, 43, 43,107,165, 67,192, 82, 87,126, 37, 61, 97,139,
-181, 65, 16, 4,197,113, 92,106,183,110,221, 62,236,209,163,199, 87,135, 15, 31, 54,117,237,218, 21,123,246,236,241,239,214,173,
-155,129,101, 89,238,232,209,163,254,189,123,247, 54,156, 57,115, 70,255,206, 59,239, 52,110,212,168,209,248,216,216, 88, 53, 65,
- 16,172, 43, 78,251,187,172,160,160, 96, 80,159, 62,125, 46,238,221,187, 87,169, 82,169, 64,211, 52, 12, 6, 3, 12, 6, 3, 56,
-142,131,183,183, 55,212,106, 53,230,205,155,167, 41, 44, 44, 28,232, 66,184, 57,115,154, 76, 38,211,144,137, 31, 76, 61,185,242,
-243, 57, 94,225,245,234, 33,247,182, 9,180,201, 0, 17, 71,162,246, 11,222, 16, 75,228,184,155,164,197, 71, 59,247,107,141, 38,
-211,235, 46,122,203,165, 56, 11, 11, 11,135,196,124,250,233,169,245,211,167,123,182, 10, 10,130, 64, 32,128,217,108, 6,195, 48,
- 16,137, 68,136,140,137,129, 56, 32, 0,179,119,238,212,107, 52,154, 33, 40,253, 41, 30,103,206,154,128, 35,231,196,235,215,175,
-143,110,210,164, 9, 38, 76,152,128, 65,131, 6,149, 56,240,251,239,191,199,186,117,235, 96, 54,155, 71, 3,184, 6, 96, 45,138,
-134, 58,224, 36,178,254,238,116,214, 56, 39,195, 48,249, 73, 73, 73,202, 37, 75,150, 16, 86,171, 21,159,127,254, 57,236,130,211,
- 94,175, 39, 77,154, 84,203,203,203, 11,159,125,246,153, 37, 39, 39,167,251,226,197,139, 79,111,219,182,205,255,155,111,190,121,
- 3, 64,172, 51, 39,203,178,217, 55,110,220,240, 90,191,126, 61, 73,211, 52,150, 45, 91, 86,106,120,114,236,216,177,176, 90, 41,
- 8, 4, 66,139,201,100,110, 38,151,203,147,253,252,252,228, 92, 73,231,174, 39,121, 63, 67, 81, 20,194,192,209,241,221,226,232,
-159,133,178, 67, 42, 84,134, 83, 45,139,143,239,106,138,137, 57, 99, 19, 68,137,182, 99,246,216, 77,250,149,224,180, 11,194,170,
-112,158,180, 45, 21,194,100, 50, 65,173, 86, 35, 39, 39, 7, 42,149, 10, 2,129,128, 40, 43,157,102,179,249,207,143, 62,250,232,
-250,198,141, 27,123, 94,190,124,185,255,185,115,231,186,157, 58,117,202,148,146,146, 66, 83, 20,197,133,132,132, 8, 59,118,236,
- 40,235,219,183,175,135, 84, 42, 37,103,205,154,149,243,197, 23, 95,248,163,164, 15,155,115,222, 5, 4, 65, 96, 90,103, 45, 98,
-187, 9, 96,177, 88, 81, 80, 80,128,180,180, 84, 36, 36, 36,224,242,229,219,224, 56,142,172, 68,185,251, 1,152,245,221,119,223,
-133, 74, 36, 18, 98,231,206,157,181,118,238,220, 89,161, 37,117,251,246,237,181,118,237,218, 53,215, 54,122,145,250, 44, 62,239,
- 60,231, 63,150,243, 89,134,115,100,120, 84, 40,180,108,237,124, 91,216, 62, 74, 74, 81,212, 47, 46, 66, 56,124, 2, 96,142,131,
- 21,172, 34,115,158,134,227,184,243, 61,123,246,156,212,163, 71,143,229,189,122,245,202,200,200,200,168,191,108,217,178, 48,154,
-166,173, 9, 9, 9,100,114,114,114,202,111,191,253,214,160, 81,163, 70,227,111,221,186,117,150, 32, 8,171, 27, 25, 76, 72, 78,
- 78,238,208,173, 91,183,125,227,199,143, 15,111,215,174,157, 68,165, 82, 65, 40, 20,226,254,253,251,248,227,143, 63, 44,187,118,
-237, 74, 45, 40, 40,168,204, 39,120,126,121,152,150, 22, 53,108,242,251,123,199, 15,234,239,255,159,198, 47, 72, 66, 66, 66, 0,
-163, 17,183, 31,101,226,202,237, 63,172,155,206, 95, 81,155,205,230, 33,112,255, 19, 60,191,252,118,247,110,207,238,211,167,239,
-157,251,223,255, 6, 33, 35, 67, 24, 18, 18, 2,137, 68,130, 7, 15, 30, 32,153,101,233, 69, 27, 54,100,217, 68,214,147,142, 10,
- 47, 5,176,132,101, 89, 33, 0,200,229,114,188,247,222,123,112,252,228,206,186,117,235, 96, 52, 26, 1, 64, 72, 16,196, 18, 0,
-155,159,117, 43,150, 29,121,121,121,179, 95,125,245,213, 56,161, 80, 88,102,212, 91, 31, 31, 31,104,181, 90,208, 52,205,164,165,
-165,221,246,241,241,129, 72, 36, 2,199,113, 46,159,163,220,220,220,217, 67,134, 12,153, 79,146,100, 89,150, 15, 40,149,202,148,
-211,167, 79, 55,124,251,237,183,201,255,253,239,127,247,199,141, 27, 39, 61,125,250, 52,195,113,220,190, 39,125, 15, 58,117,218,
- 1,172,143,121, 29,192,235, 64, 41,135,247, 52,219,182, 74,133, 84,232,212,105, 7,214,227, 47, 78,199, 97, 60,187, 32,178, 89,
-161,154,202,226,227,151,163,200,207,162, 92,238, 78, 59, 58, 97,125, 12,106,148,211, 29, 56,106, 95,189, 94, 15,134, 97,202,179,
-230,253,190,103,207,158,229,191,253,246, 91,192,164, 73,147,234,255,247,191,255, 85,118,235,214,205,211,241, 0,163,209,200, 30,
- 58,116, 72,191,110,221,186,194,243,231,207, 63, 28, 59,118,108,187,242,210,249,232,209,163, 35, 11, 22, 44,240,238,219,183,111,
- 35, 0,197,254, 89,106,181, 26, 41, 41, 41,248,243,207, 63, 83,172, 86,235,193, 74,100, 41, 23,192,220, 17, 35, 70, 44,217,186,
-117,107,173,113,227,198,101,238,218,181,235, 79, 20, 5, 44,118,134,106,208,160, 65,205,183,110,221, 26, 50,110,220,184, 76, 20,
-249,145,165,130, 7, 15, 30,118,116, 69,105, 63,173,114, 71, 38,182, 88, 44, 22,206,100, 50,113, 6,131,129,211,233,116, 28, 92,
-127, 5,254, 64,122,122, 58,151,154,154,202, 61,122,244,136,123,248,240, 33, 7,224, 91, 39,197,235,170,193,242,216,190,125,123,
-131,208,208,208,207, 21, 10,197,113,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 22, 45, 10,229, 56, 78, 92,
-142,138, 46, 11, 66,145, 72,244,118, 96, 96,224, 1, 95, 95,223, 84, 31, 31,159,212,192,192,192, 3, 34,145,232, 93, 0,162, 10,
-148,121, 89,144, 9,133,194,143, 60, 60, 60, 78, 74,165,210,108,169, 84,154,237,225,225,113, 82, 40, 20,126,132,242, 3,169,150,
-203, 41,145, 72, 62, 10, 8, 8, 56,169, 84, 42,179,149, 74,101,118, 64, 64,192, 73,137, 68, 82, 29,206,234,244, 74,236, 66,203,
-192,217, 64, 16, 4,213,178,101,203,245,173, 91,183, 94,219,186,117,235,181, 45, 90,180,248,218,102,149,228,108,214, 22, 3,202,
- 14,222,248,119,166,243,169,113, 70, 70, 70,110,219,186,117, 43, 59,123,246,108, 77,163, 70,141,242,102,207,158,173,217,186,117,
- 43, 27, 25, 25,185,173,170,156, 65, 65, 65,117, 34, 35, 35,243, 54,110,220, 72, 39, 37, 37,113, 27, 55,110,164, 35, 35, 35,243,
-156, 34,195, 63,137,188, 19, 0, 34,108,214,159,131, 0,118,163,200,249, 61, 20, 0, 17, 99,138,225,108,179, 15,143, 3,232, 85,
- 70,217,187,203, 25,102,138,137,225,108, 62, 85, 39, 0, 36, 58,172,119, 65, 73,255,175, 39,193,233, 18,205,154, 53,187,203, 57,
-192, 98,177,112,106,181,154, 75, 74, 74,226,206,159, 63,207,133,133,133,221,117,131,211, 15,192, 59, 0, 14, 5, 7, 7,223,106,
-223,190,253,163, 14, 29, 58, 60,170, 83,167,206,125,145, 72,116, 25, 69, 17,222, 35,109,203, 18, 0,141, 42,224,108,175, 82,169,
- 22,132,133,133, 29,108,216,176,225,197,186,117,235, 94,246,245,245, 61, 44,147,201, 22,226,175,200,216,149,173,243,221, 6, 15,
- 30,156,162,211,233,152,151, 94,122,233,150,171,147,154, 52,105,114, 65,167,211, 49,195,135, 15, 79, 5, 16,253,111,120,222,121,
-206,167,194,249,220,193, 85, 84, 4, 59, 26,218, 4,211, 1,135,229, 19, 23,199,125,226,116,204, 22,219,185, 21, 22, 4,199,113,
- 2,142,227, 60, 56,142,243,230, 56,206,151,227, 56, 21,199,113,158, 28,199, 73, 43, 48,127,243, 21,251,239,227,156,104, 19, 80,
- 6,219,127,103, 84,180,255,185,190,159,161,161,161, 62,109,218,180,153,188,127,255,254,143,238,221,187,247,209,254,253,251, 63,
-106,211,166,205,228,208,208, 80,159,234,164, 51, 40, 40,168, 78,211,166, 77,191,106,210,164, 73,106,211,166, 77,191,114, 18, 89,
- 79, 50,239, 18,155,136,105, 98, 91,234,219,182, 17, 40,138,133,181,198, 38,108, 34,202,232,169, 85,134,211,206,119, 16, 64,111,
-219,114,208,182, 45,236, 41,112,150, 66,189,122,245,142, 53,111,222,252,110,139, 22, 45,146, 91,180,104,113,183, 89,179,102,119,
- 27, 55,110,124, 55, 34, 34,226,110,237,218,181,239,250,251,251, 31,171, 66, 25,249, 2, 8, 65,233,207,128, 61,237, 58,223, 53,
- 50, 50,242,138, 76, 38,115, 25, 27, 76, 40, 20,206,109,209,162,197, 13, 20,205,148,228,219, 79,158,147, 23, 90,162, 32,200, 0,
- 0, 0, 32, 0, 73, 68, 65, 84, 53, 32,180,248, 10,243,239,229,148,162,252,207,140, 84,180,159,191,159,207, 54,167,203,111,117,
-217,132, 76,125,155,192,145,212, 0,167, 35,159,189, 78, 69, 56,136,166,167,193,201,215, 37,158,147,231,228,133, 86,141, 11, 45,
- 33,127, 27,120, 56,193, 92,205,253, 60,158,241,118,161,140,237,174, 98, 98, 85,135,211, 21,223,189,167,204,201,131, 7, 15, 30,
- 53,213,118,118, 5,112,214,222, 43, 44, 75,149, 86,102, 54, 65, 85,148,237, 41,158,147,231,228, 57,121, 78,158,147,231,228, 57,
-255,117,156,118, 44, 47, 99,251,109,167,245,175,159, 81,225, 69,240, 67,135, 60, 39,207,201,115,242,156, 60, 39,207,201,115,254,
- 83, 56, 93, 97,252, 51, 42,178,186, 0,252,208, 33, 15, 30, 60,120,240,224,193,131, 71, 77,163,226, 56, 90,187,119,239, 22,216,
-255,143, 24, 49, 98, 44,195, 48,147,237,235, 2,129, 96,245,119,223,125,183,185,188, 43, 12, 29, 58,148, 41,143,211, 21, 42,186,
-142, 43,206,102,141,148, 19,252,188, 21,239, 23, 20, 26, 86,220, 79,103,206,155, 76,166,166,246,125, 50,153, 44,113,243,230,205,
-119,106, 58,157, 99,199,142,109,228,124,157,186, 97,162,174,190, 94,178,247,242, 10,116,203,110,222,213,125,205,215,177,167, 2,
-127, 0,209, 94, 50,241,128,102, 42,113,251, 63,115, 77,151,244, 86,230, 16,138,102,195,230, 63,143, 25, 14, 14, 14,110,172, 84,
- 42, 71, 1,104,102, 48, 24, 2, 21, 10, 69, 54,128, 4,141, 70,179, 45, 51, 51,243,182,187, 60, 93,234, 34, 5, 64,184,109,245,
-209,217,135,168,227,206,190,138,208, 43, 2, 38, 14,144, 18, 4,172, 39,146,255,114, 70,239,221, 0, 38,150, 43,189,189, 87, 3,
- 88, 56, 14, 98, 2, 48,159,184, 7,217,115, 84, 84, 74, 0, 81, 40, 10,225,112, 29, 69,225, 39, 12,252, 35,203,131,199,115, 5,
-231, 64,165,197,235,194, 50,196, 68,103,177,144,248,138, 3,167, 2, 56, 63,179,217, 44,146, 72, 36,176, 88, 44, 80, 40,228,107,
-222, 25, 55,246,115,144, 40,160,104,188,183,121,243,230, 42,127,233,186, 50,215, 1,240,147,243,249, 62, 74,249,252, 51,135, 62,
-246,233,220,111,209, 66,203,131,156, 88,173, 86, 75, 74,165, 82,152,205,102,120,123,123,119,152, 48,126,252, 75,164,136,179,136,
-197, 30,151,150, 47, 95,158, 89,213,116,126,248,225,135,193, 86,171,233, 21,150,101, 37, 22,139, 69,234,124, 29,111,133,199,162,
- 51,135, 62, 86,116,137, 94,248, 57,192, 11,173,167, 0, 73, 29, 31,143,179, 43, 70,116,109,210,190, 89, 67,176, 9,231, 96,178,
- 88, 7,156, 73,213, 13,248,244,114,250,212, 84,157,181, 53,106, 32, 96,229, 63, 8,130,250,245,235, 79, 10, 8, 8, 24,190, 97,
-195, 6,113,253,250,245, 33,147,201, 96, 52, 26, 67,238,221,187, 23, 50, 97,194,132, 46,114,185,124,231,253,251,247,215,192,189,
- 15,193,133,159,217,242,127, 0,128, 14,163,230,133,163,232, 99,209, 6,231,125, 93,199,204, 11, 7, 48, 29, 37, 63,140,156,129,
-162, 16, 10,174, 90, 29,201,225,173, 75, 49, 96,244, 71, 66, 0, 19,138, 19, 79, 2, 63,124,187, 18,125, 70,188, 95, 98, 59,193,
- 65,120,104,235, 82, 68,143,254,168,204,239, 40,246,110, 72, 80, 44,203,149,105,137, 39, 73,130, 62,126,151,115,245,129,225, 44,
- 20,197, 0, 43, 69,137,162, 15, 58,187, 60,190, 95, 99, 65,150,149, 98, 92, 6,156, 21,139, 4,217, 71,110, 51,165,206,141,105,
- 5,138, 98,138,218, 86,177, 16,204,129,251,222,103,102,205,154, 37,140,142,142,198,166, 77,155, 58,126,253,245,215,227,181, 90,
-237,143,182,251,150,204, 63,190, 60,120, 60,215,130,203,181,208, 18, 10,176,254,224,222,205, 13,178,178,115, 16,243,246, 52,236,
-216,177, 3,249,249,249,240,241,241,129, 68, 44, 22,173, 88,242,127,193, 74,165, 71,112,204,248,216,245, 0, 26, 87, 53, 53,149,
-188, 78, 67,231,243, 9,219,167,116,132, 2, 82, 36,145, 72,200,157, 59,119,162,160,160, 0, 42,149, 10, 18,137,136, 92,190,240,
- 19,185, 82,233, 41,127,107,226,140,142, 40,138,255, 83, 37, 88, 44,186,142,251,119,108, 86,170,213,106,140,121, 55, 22,206,215,
- 17,139,197,140,253,197,194,215,177,167,130, 89, 27,222, 27,221,228, 69, 47,192,122,243, 34, 68, 2, 1, 20,222, 62,136, 18, 10,
- 32, 32,208, 52,230,248,195,153, 0, 62,125, 94, 50, 91,191,126,253, 73, 67,135, 14, 29, 62,127,254,124, 49, 73, 22,133,156,211,
-235,245, 48, 26,141, 8, 13, 13,197,153, 51,103,196,179,103,207, 30,254,253,247,223,227,254,253,251,171, 42,203,127,243,230,205,
-186,225,225,225, 38, 0,232,223,220,203,121, 95, 29,251, 62, 0,240,242,242,170,144,207, 79,229, 97,190,121,243, 74, 51,251,121,
-147,122,132, 50,101,108, 55, 1, 80,148,199,197,178,156,240,196, 87, 19,202,220,255,246,252,237,244,245,221,231, 27,215,175, 95,
-223,232,184,221,211,211,179,172, 83,130,116, 58, 93,184,243, 70,251,241, 86,138, 9, 44,235,122,189,222, 91,231, 82,128, 81, 12,
-132,219,183,111, 7, 0,124,249,209, 72,193,198,159,115,132, 66, 97, 81, 83,187,100,201, 18,204,157, 59, 87,114,252,248,241,190,
- 91,183,110,237,123,224,192,129, 21,101, 9, 85, 30, 60,120, 60,147, 34,203,241,183,108,161, 69, 18,132,151,210,203, 19,175,191,
-241, 14,142, 29,251, 1,157, 59,119, 46,222, 87,175, 94, 61, 12, 29, 50, 16,223,109, 89, 14, 0, 94,213, 73, 81,117,175,147, 95,
-168,255,180,207,240,175,230, 61,202,212, 93, 62,124,248, 48, 58,117,234, 84,226,252, 55,134,189,142,111,191, 89,130,114,162,204,
-187, 5,130, 35,197, 94, 74, 15,140,136,121, 23,174,174, 51,126,204,160,195,189,135,174,236,153,149,171, 95,206,215,179, 39,143,
- 6,193,126,189,154, 55,105,140,252,125,107,240, 71,129, 9,199,210, 77,120, 43,234, 63,136,244,149,163, 19,205, 32,216, 67,212,
- 61, 83, 79, 61, 23, 66, 43, 56, 56,184,113, 64, 64, 64, 9,145,165,213,106,161,211,233,160,209,104,160,213,106, 65,146, 36, 98,
- 99, 99,197,103,207,158, 29, 30, 28, 28,124,202,141, 97,196, 71, 54, 75, 22, 32, 16,233,230,204,153, 99, 14, 12, 12, 52, 43, 20,
- 10, 78, 40,150,106,187,142,153,231, 5, 0,164, 80,172, 93,177, 98,133, 37, 52, 52,212, 36, 20, 10, 37,239,191,255, 62,233, 78,
-154,205,102, 51,231,200,105,177,152,139,183, 47, 90,180,200, 18, 20, 20,100, 86, 40, 20,156,213,234,190,209,241,198,131, 60, 72,
-197, 2, 72,197, 2,200, 36, 34,120,213,109, 3,105,254,159,160,105, 26,139, 23, 47,182, 6, 7, 7, 91, 20, 10, 5, 39,145, 72,
-196, 83,166, 76,169, 48,157, 99,199,142,229, 84, 42,149, 85,161, 80,136,231,206,157, 91, 42, 24,235,233,235,105,144, 75, 68, 80,
- 72,133,104, 88, 47, 12, 82,206,232,118, 90, 5,130,146,222, 8, 82,169, 20, 29, 59,118, 68,179,102,205,112,224,192,129,174,188,
-208,226,193,227,185, 64,153,159,219, 17, 2,192,225,195,135,187,160,232,131,136,136,142,142, 38,138,206,224, 48,125,210, 16,188,
- 53,102, 4, 24,134, 45,142,110, 74,144, 4, 38,190,217, 23, 44,235,206,136, 68,197, 83, 60,171,112,157, 98, 78,142, 32, 5, 0,
-208,160, 78, 8, 55,254,173,255,130, 97,217,191, 6, 74, 4,192, 59, 99,250, 20,109,171,129,116, 10,192, 96,218,132,215,224,234,
- 58,141, 27,212, 34,105,171, 9, 68,201,143, 61,254, 29, 31,219,228, 57, 93,160, 89,237,144, 8,202,104,132,201, 68, 33,254,118,
-158,241,100,154, 62,144, 84, 61, 84,175,124,189,157, 76,160, 78, 71, 29, 47, 73,195, 76, 61,245, 92,228, 93,169, 84,142,218,176,
- 97, 67, 41,145,149,149,149, 69,234,116, 58, 88,173, 86, 86,171,213,130, 97, 24,204,152, 49, 67, 52,123,246,236, 81,153,153,153,
-115,237,154,199, 21,167,205,239,106,250,205,155, 55,235,204,154, 53,203,218,189,123,247, 71,245,234,213,211, 11, 4, 2,132,132,
-132,172,140,138,138,242,157, 63,127,190,181,111,223,190, 15, 5, 2, 1, 26, 54,108,168,255,243,207, 63,235, 0,144,187,155,119,
- 71,206,205,167, 87,115, 0, 64, 16, 4,162,162,162, 82, 26, 54,108,168, 23, 8, 4,184,115,104, 17,231,238,253, 20, 9, 73, 52,
- 10,245,182, 53, 34, 4, 32,247, 44,246,196,139,138,138, 74,109,220,184,177,142, 36, 73,220,184,113, 35, 12,165, 63,107, 85,138,
- 83, 46,151, 83,111,188,241,198,163,219,183,111,187, 58, 30, 66, 1,137,118,141,109, 6,172,208,214, 64,234,133, 50,211, 41, 18,
-128,158, 61,105,164, 80, 37, 3,164, 94,254,102,141, 70, 3,165, 82, 89,100, 33,179, 90,241,251,239,191,163,125,251,246, 93,118,
-239,222,125,150,127,222,121, 78,158,243, 47,184,210, 34,207,160, 53,203,241, 67,247, 37,124,180,206, 56,103,138, 97,104,212, 11,
- 15,194,162,255, 27, 11,134, 97,193, 48, 12,104,219, 47,195, 48,160,172,214, 26, 73, 89,117,174,227,163,148,207,255, 97,231,123,
- 62,221, 7, 45,233, 17, 55,107,204, 73,134, 1, 88,150, 2, 69, 1, 12, 75,129,101, 24, 80, 84,205,184,230, 80, 44,139, 58, 97,
-193,136,155, 53, 6,206,215,217,246,221,238,254,167, 15,198, 42, 58, 71, 47,156,118, 39,197,176,152, 23,246, 79, 22, 50,177, 84,
-200, 9,101,176, 88,104,104, 45,172, 5,128,222, 68,177, 86,206,195, 95, 6, 0, 66,146,120,158,102,215, 54,171, 95,191,126, 9,
-145,181,116,233, 82,255,181,107,215,134, 2,192,144, 33, 67,210,122,244,232,145,147,148,148,132,144,144, 16, 34, 39, 39,167, 31,
-128,247,109,231, 78, 7,176,182, 12, 94,125,120,120,184, 41, 32, 32,192,108, 23, 68, 36, 73, 66, 40, 20, 34, 60, 60,220, 20, 24,
- 24,104,110,216,176,161, 94, 44, 22,131, 36, 73,216,133,158, 91,221, 60,130,128, 64, 32,128,157,211,217,218, 99,231,172, 12, 68,
- 66,178,116,243,230,192, 73,146,164,203,235,149, 89,135,100, 50, 14, 64,153,199, 11, 72,135,230, 81, 88,190,135, 64,252,239, 16,
- 1, 56,195,113, 28,174, 93,187,134,251,247,239, 67, 44, 22, 35, 56, 56, 24,115,231,206,133,217, 92,164,119,135, 14, 29,218, 5,
-192, 13,254, 9,230,193,163, 24,103,158, 65,129,229,108,213, 42,223, 71,235,240,225,195, 93,162,163,163,207,218, 5, 80,145,216,
-113, 33,126, 40, 26, 20,101, 5,106, 32, 16, 87,121,215, 97, 24,182,220,235,216,125,180, 88,150, 19,186, 20, 89, 44, 11,154,162,
-106,228,238,177, 12, 5,150,165,224,234, 58, 4, 65, 50,182, 6, 95,204, 63, 39, 79, 30,193,225,117, 72, 42,188, 30,206,211, 38,
-132,250, 73, 37,200, 49,162,254, 11, 77, 4,191, 27, 40, 92,188,158, 8,127, 79,229,115, 83, 46, 6,131, 33, 80, 38,147, 65,175,
-215, 23, 91,178,214,174, 93, 27,106,177, 88, 72, 0, 16, 10, 69, 97,106, 54, 84,198,176,128,183, 50, 3,249,249,133,126, 28,199,
- 17, 54,193,179, 4,192,102,148, 19,221, 95, 44, 22, 23, 11, 20, 71, 1, 36,149, 74,171, 36, 96,236,176,139, 51,177, 88,236,114,
-187,243,240, 90, 69, 16, 59, 10, 45,112, 69, 86, 45, 39,177, 37, 16, 8, 96,247,141,170, 8, 18,137,164, 56,239,174, 32, 20, 56,
- 92, 79, 80,121, 87, 76,171,213, 10,157, 78,135,130,130, 2,200,100, 69, 6, 51,142,227, 64, 16,196,251, 0, 62,224,159, 98, 30,
- 60, 92,107,145,103, 88,108,185, 22, 90, 40, 50,217, 17, 0, 64, 83, 86,151,226,103,247,161,139,120,148,169, 71,176,255, 47,224,
-202, 25,147,116,133,225,195,135,111, 9, 9, 9,105,103, 95,151,202, 61,253,198,191,247, 25,104,218, 10, 47, 57,137,183, 71,245,
- 41, 33,178,138, 44, 90,150, 50,191, 9,146, 95,168,255,180,207,208, 85,243,188,149,126,151,157,197, 79, 92,252,213,215,243, 53,
-230, 48,146,252, 21,249, 68, 8, 51,244,157,207,198, 58, 52,238,215,119,174,155, 51,213,109,123, 32, 65,138, 94,159,176,114, 60,
- 39,244,108,170, 32,181,231, 62, 30,243,159,253,142, 98,206,215,215,247,112,175,215, 87,244,204,202,227,125,180,158, 6,188,188,
- 85,100,216,203, 93,241,242,251, 95,225,244, 39, 31,115, 64, 62,252, 66, 66,201,110,147,190,128,231,203,253,113,229,237, 81, 44,
-144,247, 92,228, 85,161, 80,100, 27, 12,134, 16,163,209, 8,141, 70, 3,141, 70, 83, 82, 16,136, 68,196,248,119, 39,251,139,196,
- 18, 80, 86, 11,142,109,251,162, 66, 78,123, 8,135,254,205,189, 32, 16, 73,180, 9,245,235,175, 20, 10,133, 32, 73, 18,135,214,
-124,252,254,190,101,239,121, 1,192,245,195,107, 52, 35, 98, 87,175, 34, 73, 18,102,179, 89, 90,153,116, 63,126,252, 56,204,108,
- 54,155,108, 2,205, 46,252,240,224,193,131,218,102,179,217,232,184,221, 29,200, 21, 94,128,170, 30,160, 8, 44,101, 61,123,248,
-240, 97, 45,138,162, 12, 66,161, 16, 22,139,197, 45, 85, 68,146,164,248,198,141, 27, 97, 44,203,186, 60,190, 89, 68, 45, 32,184,
- 57, 32,241,118, 59,207,238, 68,132,182,137, 45, 14,149,108, 75,121,240,120,222, 45, 91,207,224, 51, 65,148,241,191, 88,104,117,
- 61,124,248, 48,231,216, 67,164, 41,202, 38,178,254, 18, 61, 12,195, 34, 93,109, 66, 82,210, 29,172, 88,177, 2, 23,175,124,228,
- 61,127,254,124,233,236,217,179,205,195,135, 15, 95,198,178,108, 11,146, 36,175,227,175,161,138,146, 86, 33,150,173,125,245,234,
-213,250,246,117,138,162,224,229,229, 5, 47, 47, 47, 52,110, 24, 86, 74,100, 49, 12, 3,107, 57, 67,135,118, 31, 45,130, 99, 57,
-138, 98,192,176,108,177,248,201,215,152,195, 14,158,186,214,192,225,240, 23,236,127, 58,182,105, 90,182, 24,156, 48,183, 56, 31,
- 59,215,205,153, 58,127,211, 38,105, 62, 19, 48,101,196,235,111, 69, 14, 29, 49, 10,111,188,246,106, 23,179,197,114, 64, 64,114,
- 44, 85,124, 61,144,224,224,236,163,197,227, 9, 33,185, 64, 79,137,164,114,120, 6,215,197, 29, 29, 35, 22, 8, 4,191,220, 43,
- 48,136, 73,129, 16,164, 80,140,132,124, 19,245, 28,101, 55, 33, 57, 57, 57,164,118,237,218,208,104, 52,160,105,154, 29, 50,100,
- 72,154, 80, 40, 10, 19,138, 68, 68,244,136,201,108,102,102, 58, 69,146, 2,112, 28,131, 87,135, 78, 32,164, 50,185,216,106,177,
-208, 40, 26, 58,116,101,205,114, 12,225,224, 21, 21, 21,229,107,159, 9,184,111,217,123, 94, 14,251,148, 47,189,244,146,175,227,
-172, 67, 55,173, 69,196,240,225,195,229,225,225,225, 4, 0,252,186,109,150,221,122, 70,244,239,223, 95, 22, 30, 94,228,135,255,
-227,154,247,220,230,244, 87,112, 64,225, 3,160,240, 97, 41, 75, 86,255,254,253,165,245,235,215,175,212,179,104,115,128, 47, 51,
-118,151,135,144, 6, 50,175,185,197, 21,211, 10, 84,168, 39,132,203, 94, 37, 33,241,244, 51,183,251,248,248,207,188,216,226,193,
-195, 45, 56,105,145,103, 10, 93,108, 2,177,171,237,183, 88,112, 9, 1,192,102,162, 35, 28,116, 22, 40,218, 90, 74,100, 49, 12,
- 3, 17, 97,198,138, 21, 43,240,193, 7, 31, 0,128,120,234,212,169,251,231,207,159, 63,152,101,217, 22, 28,199,117, 34, 8,162,
-188, 94,227,153,144,144,144, 44,142,227, 68, 36, 73,118, 90,179,102,141,111,223,190,125,225,229,229, 5,142,229, 74,137, 44,134,
- 97, 97,181, 90,202,252,204,173,143, 82, 62,255,135,221, 83,124,186, 15, 92,210,131, 97,217,147,118,145,197, 50, 12,192, 22,157,
-148,155,157,134, 19,199, 14, 96,253,186,245,249, 32,184, 91,224,192,218,196, 32,202, 16,131, 45, 46,252,154,216,169, 99,155,166,
-152,191,105,147,244,230,213,140,253,147, 63,156, 25, 57,116,196, 40,236,254,110, 27, 72,186,224,154,163,200, 98, 40, 22,133,249,
- 57,253,127,226,125,180,158, 22,124, 79,156, 60, 73,140, 26, 53,138,213,106,181, 16, 75, 36, 44, 69, 81,130, 87, 94,121,133,249,
-224,131, 15,200,204,204, 76,104,180, 58, 33, 0, 95, 60, 7,102, 45,141, 70,179,109,194,132, 9, 93,206,157, 59, 39, 38, 73, 18,
- 26,141, 6,221,186,117,203, 81,179,161,178,241,239, 78,246, 79, 79, 79,163,149,114,161, 89, 44, 22, 33, 59, 59,155,237,210,119,
-164,113,196,216, 15,106,125, 48, 43,110, 67,198,165,117,107,221,185,134,227, 76, 64,231,125, 27, 55,110,180,132,134,134,154,164,
- 82,169,100,204,152, 49,110,141, 31, 90, 44, 22,110,209,162, 69,102,231,217,133, 22,139,133, 91,177, 98,133, 37, 44, 44,204, 44,
-151,203, 57,138,170,216,239,147, 36, 9,250,237,249,219,105,154,166, 75, 88,177,236, 34,139, 98, 9,221, 87, 95,125,101, 13, 11,
- 11,179, 40, 20, 10, 78, 42,149,138,221, 73,231,228,201,147, 57, 31, 31, 31,171,135,135,135, 56, 54, 54,182, 90,179, 14, 41, 6,
-194,249,107,138,195, 59, 72,189,188,188,160,213,106,139,211, 26, 18, 18,194,139, 45, 30, 60, 92,160,148, 22,121, 54,173,112,238,
-197,209, 98, 1, 93, 86,118, 78,160,127, 80, 93,208, 52,109, 91, 40,208, 20,133, 41,239,140,192,178,117, 95, 1,128, 93,108, 69,
- 77,157, 58,117, 63,128, 10, 27,179,157, 59,119,206,155, 58,117,170, 50, 43, 43,235,248,150, 45, 91,124, 71,142, 28,137,233,211,
-167, 99,201,146, 37, 16, 73,100,240, 13,168, 93,124, 29,251,117,115,212,121,224,192,233,202,176,211, 89,139, 26, 41, 8,253, 2,
-234,128, 98, 40,176, 20, 5,138,162, 64, 8,138,178,118,226,216, 1,140,124,115, 50, 68, 82,165,207,234, 21,139,141,145, 47,135,
- 12,158, 61,110,156,217, 13, 35, 32,121,243,106,198,254,201, 31,196, 70,217, 69,214,222,109,235,110,125, 57, 99,224, 14,169, 68,
- 88,124, 29,138,101, 65,146, 2,222, 71,235, 41,137, 44,169, 84,186,231,232,209,163,119, 91,183,110, 77,232,245,122, 80, 20,133,
-156,156, 28,236,223,191, 63,129,227, 56,248,248,248,224,232,209,163,236,200,145, 35,247,152,205,230,215,159,117,177,149,153,153,
-121, 91, 46,151,239,156, 57,115,230,136, 25, 51,102,136, 88,150, 69, 82, 82, 18, 64, 16,156, 72, 44, 1, 73,146, 16,137,132, 40,
- 44,212,176, 10, 79, 85,134,149, 19, 40, 68, 98, 9, 72,129,184,188,105,194,143,108,193, 72, 65, 10,197, 90,251, 76, 64,177, 88,
-140, 43,187,151,106,186,142,153,167, 4, 0,177, 84,158,223,171, 87,175,148,166, 77,155,234,127,251,237,183, 58, 40, 61,235,208,
-249,249,164, 7,141,137, 21, 40,228, 50,125, 84, 84,212, 35, 59,231,195,147,171, 53,163, 38,206, 34, 8,129, 68, 31, 29, 29,157,
- 18, 25, 25,169, 23, 8, 4, 72, 60,176, 88, 51,104, 76,172,140, 40, 39,200,234,241,187,220,219,215,119,159,111,252,197, 23, 95,
- 80,255,207,222,117,199, 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20,112,139, 11,197, 58,235,108, 21, 23,110,235,174,
-179,117,214,129, 91,169, 27,181,206, 90,139,155,106, 85,212, 58,234, 66,197, 5,226, 96,168, 40, 32, 35,108, 8, 16,178,115,247,
-251,131,132, 6,100, 36,104,107,237, 47,207,231,147, 79,146,187,247,158,123,111, 63,247,125,191,163,111,223,190, 41, 26,127,177,
-164,164, 36,167,126,253,250,113,183,110,221,170,232,215,175, 95,170,151,151, 87, 49, 73,146,136,140,140,116,174,206, 82,165,129,
-145,145,145, 98,226,196,137,239,158, 63,127, 94,219,168,195,106,225,226,226, 2,138,162,208,173, 91, 55, 72, 36, 18,131,101,203,
- 0, 3,254,155,168,152, 71,171,234,204,240, 10,165,226,219, 41,179, 87,238, 4, 8, 83,173,187,192, 95,134, 37, 26,196,247,223,
-127,103, 2,192, 72, 35,182,230,206,157, 91, 99,153, 19, 45,145,213, 38, 32, 32, 0,139, 23, 47,198,230,205,155, 85, 63,254,248,
- 35, 35,254, 85,162,124,220,244, 21, 5, 21,214, 3, 26,116, 49,165,160,190,173,140, 47, 95, 40, 90,225,219,111,195,202,180,204,
-146, 59,227,166, 45, 45,187,123,169, 0, 20, 18,124, 21, 0,236,249,233, 39, 17,139,107,110, 50,116,196,104, 0,232,185,115, 91,
-208,153, 53, 56, 80,179,216,162, 9,143,111,231, 46,176,210,136,172, 93, 91,215, 62,183, 32, 50,131,103,126, 23,163,208, 94, 15,
- 0, 88,155,225,140,111,191, 13,189,179,242, 68,219, 13,231,217, 63, 7, 14,135,179,250,250,245,235, 38,222,222,222, 68,110,110,
- 46, 84,170,210, 35, 34,151,203, 33, 20, 10, 81, 84, 84, 4,169, 84,138,214,173, 91,147, 59,118,236, 48,153, 57,115,230,106,153,
- 76, 54,253,115,223,238,183,111,223,238, 58,119,238, 28,110,221,186, 53,124,209,162, 69, 44, 71, 71, 71,194,194, 34,147, 80,200,
-101, 0,104, 58, 59, 59,155, 50, 54,181, 20,216, 58, 56,191, 75,207,200,242, 80,200,101,160, 84,242, 42,189,205,213,233, 29,190,
-127,241,226, 69,189, 77,155, 54,201,180, 35, 1, 71, 44,216,185,163,117,235,214,214,193,193,193,178,254,253,251, 39,107,156,215,
-117,113,134,191,242, 6,179, 95,188,120,214,172, 34,167,223,228, 77, 7, 53,156,218,209,136, 3,190,219,123,176, 81,163, 70,214,
-158,158,158,201,213,241, 54,104,208, 64,204,231,243,101, 77,154, 52, 41,102,177, 88,165,150, 44,133,162,164, 65,131, 6,148,131,
-131,131,172,105,211,166,197,250, 58,237, 27, 25, 25,209, 26,171, 88,101,208, 39,234,144,197,128, 50, 32, 32,160, 44, 51,252,247,
-141, 26, 9, 70,143, 30,205,159, 55,111, 30, 14, 30, 60,136,187,119,239,190, 39,246,187,118,237,138,219,183,111,175,196,127, 40,
-177,174, 1, 6,252,159,161,250, 60, 90, 21,113,232, 80,200,159,208,242,105,170, 12,107,214,172,225,170, 45, 89, 61,231,204,153,
- 3,177, 88,108, 85, 73,179, 30, 80,231,218,168, 76,100, 5, 5, 5, 29,163,105,218, 25, 64,103,149,138,122,176,255,192,161,110,
- 85,173,111,232,208,161,239,113,210, 4,201, 32, 73,162,152,195,162,159,252,180,239,224,145,114,237, 75,157,223, 27,131,192,211,
-157,219,130,196, 0,122, 86, 20, 91,248,171,204, 72, 25,167, 6, 83,167, 77, 45, 19, 89, 59,183, 5, 93,245,108, 83,247,235,165,
-223,172,174, 84,156,173, 94, 49,197,132, 36,137,142, 21,124,180,222,227,252, 8, 48,112,254,133,110, 1, 1, 1,205,125,124,124,
- 72,109,145, 37,147,201,202, 18,119,106,156,197,211,210,210,208,181,107, 87,178,121,243,230, 94, 15, 31, 62,236,134,191,202, 57,
-125,174,219,174,122,251,246,237, 14, 71, 71,199,107,203,151, 47, 31,157,147,147,211, 47, 63,191,192, 38,236,208,106,244, 25, 58,
-141,232,218,119,164, 72, 70, 51,121,169,130,204, 38, 55, 47, 30,181,190,116, 98, 23,228, 50,217, 20, 0,113,248, 43,189, 67, 69,
-206, 18, 77, 26,135, 38, 77,154,136,180,133, 74,221,186,117, 37, 78, 78, 78, 82, 79, 79,207,178,233, 85, 68,243,189,183,237,250,
-114,170,253,191, 68, 53,237, 79,141,104,171,152, 54,194,216,216, 24, 26,241,165, 79, 63,181,163, 45, 43,189, 81,214, 28,117, 88,
-198,169, 78,239, 80, 78,167,133,132,132,244, 8, 9, 9,105, 3,224, 9, 74,107, 29, 42,128,210,161, 68, 45,167,249, 64,245,199,
-112,189, 27, 56,255, 95, 57, 63,103,116,197, 95,190, 89, 64,169,175,214,173, 42,133, 86, 77,208, 56,190, 3, 32,231,206,157,155,
- 47, 22,139,173, 70,143, 30, 93,237, 50, 25, 25, 25, 7, 15, 31, 62, 92, 78,100, 13, 30, 60,120,124,104,104,232,181,172,172,172,
- 90,109,149,149,185,209,154, 91,231, 23, 90,117,237,191, 97, 14,128, 31,171, 48,228, 81,158,109,248, 95,239,220, 22,116,166,130,
-216,250, 21,192,224,170, 84,105,175, 47, 7,225,232,161,157, 26,223, 46,163,231,143,211, 46, 13,143, 90, 85,105,180,162,165, 41,
-119,149,186, 31,243, 12, 62, 90,255, 12,216,108,182,223,162, 69,139,216, 34,145,232, 61,145, 85, 81,104, 21, 22, 22,226,233,211,
-167, 24, 55,110, 28, 55, 58, 58,218, 79, 46,151,223,248, 47,236,131,140,140,140,120,117, 50,210,217,154, 20, 14, 92,158, 17,123,
-228,132, 57,206,101, 81,135, 39,118, 65, 42, 17, 3, 0, 83,151,244, 14, 76, 38,147, 29, 29, 29,237,170,177, 90,201,229,114,174,
-102,250,227,199,143, 93, 53,185,181, 36, 18,137,206, 81,135,127, 23,231,179,103,207,156, 53,209,145,154,232, 66, 38,147,201,142,
-140,140,116,214,112, 74,165, 82,157,162, 14, 57, 28, 14, 59, 58, 58,218, 89,165, 82,125,180,168, 67,109, 97,140,210, 58,139,229,
-106, 45,170,125,203, 8,130, 32,104,195,176,161, 1, 6,124,246,168, 24, 41, 89,125, 81,233,154,160,113,124,215, 99, 17,166,139,
-139, 75,175, 17, 35, 70,148, 19, 89,254,254,254,170,211,167, 79,223,228,243,249,153, 36, 73,198,235,219,143, 50, 31, 45,188,247,
- 6, 9,146, 36,159,118,110,219, 20, 36, 73, 62, 93,250,205, 55,210, 53, 56, 80, 78,108,157, 61,115,178,119,106,126, 76,229,210,
- 12,128,141,125, 29, 4,140,255, 22, 1,227,191,181, 2,208, 9,168, 58, 90,177,186,126, 24,240,247,128, 32, 8,142,147,147,211,
-115,137, 68, 2,130, 32, 32,149, 74,203, 4, 86, 81, 81, 17,132, 66, 97,217,127,185, 92,142,236,236,108,212,173, 91, 23, 4, 65,
-252,167,253,232,228,114,185,114,209,202, 77,135, 25, 76,182,146,162,228,132, 92, 46,159,160,207,117,190,104,209, 34, 18,149,248,
- 94,205,156, 57,179,210,233,159,138,115,201,146, 37,149, 70, 9,206,156, 57,179,218,232,193,170,240,221,119,223,125,180,168, 67,
-221,111, 95, 6, 24, 96,192,127, 12,149,134,238,213, 74,104,145, 36,249,180,146,232, 66, 2, 0, 77,146,228,211, 74,178, 28, 40,
-223,189,123,183,210,210,210,114,138, 72, 36,250, 99,240,224,193,115,253,253,253, 85, 64,169,131,124,109,183, 40, 95, 40, 90,225,
- 55, 96,227,188,130, 98,105,112,197,121, 21, 45, 79, 26,177,181,107,123,208,238, 51,161,199,253, 51,210, 83,119, 87,181,109, 85,
- 9,170,170,162, 21,133,133,226,149,126, 3, 54,206,201, 47, 20, 27,124,180,254, 33,168, 84,170, 43, 70, 70, 70,132,166,152,178,
-182,245,170,176,176, 16, 37, 37, 37, 80,151,164, 1, 0, 20, 23, 23,195,194,194, 2, 42,149,138,254,143,237, 10, 41,128,249,106,
-107, 21, 0,204, 79,188,185, 67,251,220,126,166, 61,175, 26,107,150, 64,151, 2,209,149, 45, 87,221,188,191,129, 51,179,154, 2,
-209,213, 33, 83, 79,190, 76, 0, 96,179, 24, 89, 85, 21,143,102,179, 24, 89,213,248,237,235,249,222, 64,208, 0, 86, 26,174,108,
- 3, 12,248,124,223,255, 63,213,138,123, 24, 56, 13,156, 6,206,127,132,147,171,254,232, 58,207,176, 63, 13,156, 6, 78, 3,231,
-191,141,179, 50, 76,254, 76,132, 22, 93,201, 7, 52, 77,227,191, 84, 3,206, 0, 3,254,159, 33,173,229, 60, 3, 12, 48,192, 0,
- 3, 62, 28,239, 21,147,214,158, 81,149, 42,213, 39,154,160, 54,202,246,154,129,211,192,105,224, 52,112, 26, 56, 13,156, 6,206,
-255, 59,206,154,184,181,151,159, 12, 96,223,103, 34,182,222, 19, 89, 52,253,247,123,171, 24,204,170, 6, 78, 3,167,129,211,192,
-105,224, 52,112, 26, 56,107, 11,195,208,161, 1, 6, 24, 96,128, 1, 6, 24, 96,192,255, 57,244, 75, 88,106, 64, 37,168, 59,104,
- 41, 40, 44, 81,239,206, 32,164,156, 13,252,175,109,162,191,191, 63, 67,159,246,137,137,150,100, 20,248,155,205, 77,216, 3,138,
- 69,138,205, 84,212,138,224,154, 78, 68,219, 6,173,198, 24,243,140,167,203,100,178,250,166,102,102, 89,121,185,217,123,242,222,
- 61,219,165,213,198,252,193,131, 7,124, 31, 31,159,116, 0, 69, 90,111, 10, 6, 24, 96,192,199,132,101, 83, 23, 16,196, 4,128,
-254, 43,236,146,162, 99, 32,140, 59, 84,174,157,133,199,120,144, 68, 51,173, 41, 98,208,216,143,130,216,148, 26, 30, 56,150, 9,
- 9, 9,174, 13, 27, 54, 76, 6, 80, 80,113,237,149,204, 51, 92,231, 6,124,206,232,138,242, 9, 75,203,174,133, 15, 23, 90,141,
- 6,215,135,146, 28, 11, 26,163, 64, 32, 26,137,161, 67,106,197,227,246,117, 29, 80,204,118, 0, 90, 1,116, 43, 19, 35, 94, 75,
-177, 76,158, 69,209,244, 24,188, 57,249, 68,111,190,250,254,211, 80,117, 57,139,149, 72, 12,253, 73, 47, 62,138,254,225,209,237,
-211, 92, 75, 99, 2, 13, 91, 15, 94,128,242, 25,156,107, 11, 14, 0, 95,146, 36,155, 25, 27, 27,243, 75, 74, 74,178, 41,138, 74,
- 65,233,248,116,126, 45, 57, 73, 0, 19, 77, 77, 76,250,184,154,113, 90,189,203, 17,166, 21, 41, 84,225, 40, 77,232,154,255,177,
-206,168, 82,145,229,184,111,206, 72,159,113, 65,179,122,192,210,111,227,130, 18,160, 58,161, 69, 56, 55,238,120,118,248,136,161,
-126, 51, 38,143, 51,173, 99,103, 10, 65,142,200,230,167,131, 33,155, 66, 66,142,246,255,102,120,207, 62, 0,176,122,245,234,175,
- 92, 92, 92,234, 49, 24,140,196,101,203,150,253,186, 98,197, 10,154,168,186, 82, 57, 95,125, 14,107,110,248, 38, 0, 60, 1, 52,
- 0,240, 22,192, 11,148,207, 50, 94, 27,124, 22,156,117,234,212,113,162, 40,234, 27, 7, 7,135,126,153,153,153, 23, 72,146, 60,
-144,150,150,150,254, 41,239, 58, 52, 77,239, 37, 8, 98, 50, 77,211,251,244,248,158,162,207, 58,120, 60, 94,166, 68, 34,177, 87,
-255,206,146, 72, 36, 14,127,215,246,252,147,235,250,135,222,191, 39, 93,185,243,162,143,246,164, 94,157,155, 85,114, 71, 33,154,
- 93,185, 19,211,165,124, 59, 79, 85, 21,247, 64,130,166,105,172, 92,185,146, 88,181,106,213,120, 55, 55,183, 70, 36, 73,190, 92,
-190,124,121,185,212, 55, 21,231,105, 93,231, 6,177,101,192,231, 10,253,138, 74,215,136,166,254, 38,144,208,254, 0, 49,174,107,
-219,150,157,167,140, 25, 64,208, 12, 30, 70, 78, 90,168,212,155,203,117, 28, 23, 12,241, 26,239,102,141,231, 14, 29,208,131,108,
-227, 89, 15,124, 59, 11,128,100, 97,239,197, 36,155,224,160,101,187, 1,248,212,162,151, 43,222, 68, 28,179, 23, 20,168, 64, 16,
- 0, 65, 0, 36, 1, 20, 75, 40,244,250,106,236, 10, 0, 63,233,121, 87, 34, 45,141, 9,204, 61, 38, 1, 0,198, 71, 56, 40,245,
-236,236,236,198,207,158, 61,219,196,211,211,211,146,199,227,113, 36, 18,137, 67, 66, 66,130,221,178,101,203, 60,197, 98,241,121,
- 0,143,244,228,172,219,208,217,233,100,240,220,137,237,154, 55,112, 5, 75, 86, 12, 74, 42,114,121,149,240,186,195,212,221,167,
- 38,197,228, 73, 70,160, 22, 37, 19,114,114,114, 8, 0,176,181,181,165,203,139,172,246,227,182,206,235,133,185, 91,174,160, 68,
- 34, 59, 82, 29,135,117,189, 22,163,191,254,122,144,223,218, 31,102,154,166,229,202, 17,157, 40,134,181, 41, 27, 43,230, 79,227,
- 72,165,138, 14,187,127, 13,153,188,115,195,194,253, 42,149,234, 11, 0,109, 84, 42,213, 99, 0,191,174, 92,185,178,170,155,239,
- 42, 0, 75,212, 39,244, 81, 6,131,113,181, 91,183,110,245,191,249,230, 27,162,117,235,214,136,140,140,108,112,236,216,177, 30,
- 23, 46, 92, 72, 84,169, 84,207, 0,188,132,186,236,137, 14, 96, 1,104,204, 96, 48,188,255,205,156,124, 62,223, 72, 38,147,141,
-117,118,118,158,220,177, 99, 71,239, 1, 3, 6, 16,141, 27, 55, 70,124,124,124,235, 75,151, 46,173, 8, 15, 15,127,150,154,154,
-186,143,195,225, 28, 22, 8, 4,226,127,252, 57, 78, 16,147, 1, 56,169,117,242, 74, 29,190,211, 81,154, 75, 74,160,235, 58, 36,
- 18,137,189,198,217,148, 32, 8,251,191,115,123,244, 92, 87, 44, 65, 16,214,234,182,168,238,155, 36, 73, 40,149, 74,145, 74,165,
-114,171,129,179,177,250, 69, 74,103,173, 11,160,186, 68,208, 70, 0,208,171, 83,179, 60, 16,136, 41,179,104,189,255,146, 25, 83,
- 38,192,104, 52,187,114, 55,198,186,156, 21,172,226, 91,236,202,149,196,138, 21, 43, 16, 24, 24, 56, 0,128, 47, 69, 81,225, 30,
- 30, 30, 59,202, 81, 82, 84,217,188, 21, 43, 86,108,175,230, 58, 55,192,128,207, 5,126,208,167,168,116,149,239, 63,110, 67,186,
- 64,133,113,174, 54,246,254,179,190, 25,102,228,233,209, 16, 18,152, 34, 41, 71,133,139, 97,151, 0,224,132,126, 86,167, 97,109,
-152, 76,201,225,160,192,249, 77,124,219,121,226,121,154, 2,143,211, 84, 40, 73, 84,128, 65, 42,160,162,104,128,134,164,182, 91,
-157,154,175,196,157,151, 50,144, 4,192, 32, 1,146, 36,192, 32,107, 73, 70,201, 94,173, 62, 20,229,153,147, 73, 1,148,236,213,
- 7, 30,144,102,238,238,238,163, 87,173, 90,101,153,145,145, 97, 18, 25, 25, 9, 46,151, 11, 43, 43, 43, 6,159,207,119,218,178,
-101,139,120,214,172, 89,253,228,114,121, 18,128, 28, 29, 57, 61,250,182,241,190,183, 47,104,181,133,226,193, 37, 20, 28,255, 13,
- 12,146, 6,219,196, 20,245,141,140,112,233,235,134,214,254, 97,137,167, 31,102,138, 60, 0,164,213, 68, 22, 23, 23,199,144, 74,
-165, 35,204,205,205,219,179, 88, 44, 7,158, 85, 61, 42,157,217, 38, 55,155,104,240, 54,203,190,164,203,188, 30, 14,125, 54,207,
-233,134,185, 91,174, 96,219,177,251,191,180, 66,198,242,234,242,102, 27, 27,155, 78,153, 53,253, 27,211,212, 28, 57,214,156,206,
-193,161,219,133, 24,235,107,134,185, 95, 90, 32, 96,228,112,147, 83,191,133, 78, 1,176, 95,107,145,120, 15, 15, 15, 34, 46, 46,
-174,178,155,175, 21,128,133, 50,153,140,100,179,217, 4,143,199, 27,189,118,237, 90,249,200,145, 35, 83, 53, 13,124,125,125,225,
-235,235, 75, 20, 21, 21, 53,184,113,227, 70,131,144,144, 16,101, 68, 68, 68, 44,128,179, 85, 91, 44,140,222, 73, 36, 98, 23,158,
-145, 81,201, 79,187,119,111,238,210,165, 11,197,229,254,149,126,170, 54,156, 0, 96, 97, 97,177,223,222,222,158, 88,188,120,113,
-250,199,226,172, 87,175,222,149,118,237,218,117,235,213,171, 23,179, 83,167, 78,112,114,114, 42,155,103,107,107, 11, 95, 95, 95,
- 34, 37, 37,165,121,120,120,248,238, 43, 87,174,236,120,242,228,201,141,164,164,164, 94,255,176, 69,107,159, 90, 76, 8,244,108,
-255,217,131, 32, 8,211,189,123,247,218,107,106, 50, 42, 20, 10,168, 84,170,178,111,205,135,162, 40,168, 84, 42,172, 93,187, 86,
- 37, 18,137,116,217, 71, 34,173,183,102,205,135,170,236,155,195,225,216,106, 18,246,214,112,103,143,225,115, 11,154,154,152,152,
-184, 2,232, 11,187, 70, 11,203, 55, 40,125,127, 22,137, 68,201, 2,169,101, 12,128, 46,213,176, 89,174, 90,181,106,108, 96, 96,
-224, 32, 45, 43,173,247,208,161, 67, 43,150,189,242, 86,127,139, 8,130,184, 73,146,228,121, 0,135,240, 17,173,238, 6,252,183,
- 64,211,116, 91, 0,118, 90,147,100, 40, 29, 21,130,250, 57, 73, 0,176,169, 48, 93,187,157,230, 59, 91, 61,221, 78,189, 28,173,
-197,155, 77, 16,196,163, 90,118,241, 22,170,240,211, 98, 2, 64, 88, 88, 24,221,191,127,127, 66,243, 93,185, 40,242,191, 56,113,
-228,192, 62,253,186,119, 4,201,179,194,171, 44, 32,226, 29, 13, 38,169, 0, 9, 26, 15,238,222,160,193,164, 14, 87, 88,170,106,
-235, 73,189, 33,223,121,123,122,108, 60, 16, 52,155, 17,155,197,196,161,240, 18,200, 37,197,200,206,120,135,172,244,100, 8, 82,
-223, 34,237,221,219,103, 0,177, 66,103,206,247, 14, 12,160,162,212,239,128, 20, 42,179,232,233,206, 41, 23,197, 53,104,236,233,
-153,207, 81, 1,114, 81,156, 14,171,175,138,211,171, 81,163, 70, 35,127,248,225, 7,235, 23, 47, 94, 24,149,148,148, 72, 47, 93,
-186, 20,159,148,148,100,206,231,243,243,166, 77,155,214,200,201,201,201,124,240,224,193,156,227,199,143,127,133,242, 97,173, 85,
-113,122, 14,108,223, 50,226,224,142,173, 38,185,167,130, 33, 75,120,138,139, 2, 17,238,102,150,208, 13, 44,184,196,183,205,237,
- 96,202,101, 98,117, 39, 39,211,190,103, 18, 54, 42, 40, 42,160, 58,206,123,247,238,241,141,141,141,183,140, 26, 53,138, 63,115,
-230, 76,174,138,105,201, 12,141,200,181, 88,184, 59,194,169, 68, 42,103,140,236, 86, 15,243, 70,121, 99,222,182,235, 26,145, 53,
-185,126,253, 2, 42, 42,170,106, 78,133, 92, 94,223,217,222, 28,209, 73, 98, 28,186, 93,136, 63,127,112, 66,247,181,233, 24,220,
-138, 9,143,186,166, 80,202, 21,141,135, 14, 29,122, 88,253,214,254, 8,192, 87, 67,135, 14,109,194, 96, 48,174, 3,248,189,166,
- 99,196,227, 85, 94, 61,197,202,202, 10, 93,187,118,133,135,135, 7,179, 75,151, 46,222, 21, 4, 76, 57, 78,185, 92,198,167, 40,
- 26,102,102,102, 70, 54, 54, 54, 86,102,102,102,185,149, 61,168,244,225, 4, 0,107,107,235, 33, 93,187,118,101, 30, 59,118, 44,
- 39, 49, 49,241,193,200,145, 35,223,154,155,155,151,179,254,154,152,152,160, 81,163, 70, 88,182,108, 25,179, 79,159, 62, 53,114,
- 58, 56, 56,244, 12, 9, 9, 1, 65, 16,101, 15,237,247,140,197,174,174,112,116,116, 68,223,190,125,153, 67,134, 12,233,153,148,
-148, 84,171,235, 72, 15, 92,171,196,162,181,178,194,113,170,114,248,173,178,246, 58, 28,247, 44,141,117, 73,205,135, 15,184, 54,
-171, 29,238,228,241,120,101, 86,168, 74,214,245, 30, 39, 73,146, 88,186,116, 41, 8,130, 0,139,197, 2,155,205,174,244,219,207,
-207, 79,223,126,166, 16, 4, 65,178,217,236,133, 76, 38,243, 27,169, 84,234,204,227,241,210, 85, 42,213, 47, 82,169,116, 45, 0,
- 5, 77,211,150, 85,136,172, 74,105,239,132, 46, 0, 0, 32, 0, 73, 68, 65, 84, 57, 77, 76, 76, 92, 95,189,122,229, 94, 85, 71,
-164, 82, 41,188,189,189, 1, 41, 98,171,227, 76, 72, 72,112,117,115,115,107, 12, 64, 83,162,237, 54, 77,211, 93,180,254,107,227,
- 54, 77,211, 95,170,127,191,124,243,230,141,107,195,134, 13,243,255,169,243,211,192,249,239,227,172, 65,139,216, 17, 4, 17,166,
-117,173,246,215,252, 95,180,104,209,146,245,235,215,191, 32, 8, 34, 76,123,186,118, 59,237,111,245,253, 38,140,166,233,254,139,
- 23, 47,246,220,176, 97,195, 58, 77,219,191, 67, 36,234, 99,209, 50,207,150,152, 32,252,157, 57,152, 12, 21,152, 36, 1, 38, 3,
- 0, 77, 32, 57, 41, 1, 69,133, 5,119,144,120, 58, 81, 55, 75,150,127,167, 22, 45,188,130,142,110, 91, 64,254, 28, 94,130, 2,
-145, 4,113, 79,110,226,209,205,223, 51, 84, 74,213,239, 32,232,199, 0, 25,137,183, 84, 60, 16, 90,187, 26, 23, 4,205, 44, 21,
- 90,106,113, 85, 78,108,125, 50, 52,111,210,164,201,240,101,203,150,217, 70, 69, 69,241,132, 66, 97,209,209,163, 71,211,165, 82,
-105, 18,128,203,201,201,201, 77,182,111,223,206, 9, 10, 10,242,242,242,242,226,159, 60,121, 82, 86, 73, 57,163,247, 56,231,143,
- 11,136,248,102,214, 28, 94,236,201, 93,224,196, 70, 98,233,211, 28,213,159,130,146, 31, 0,108, 67, 74,113,167,108,137,242,234,
-214,174, 46,100, 61, 51, 54, 26, 90,114,252,226,242, 36,213, 90,178,140,141,141,183,132,132,132,184,182,109,219,150, 4,128,240,
-151, 74,238,194,221, 17, 78,151,215,119, 34, 58, 53,179, 65, 86,129, 20,179,119, 69,227, 82, 68,214, 31, 26,145, 85, 83, 39,205,
-204,204,178, 83,179, 10, 29,108, 76,121, 24,211,217, 20,221,215,166,195,191, 13, 23, 92, 54,129,248,196, 12, 52,116,171, 71, 68,
-223, 57,219, 70, 45,178,218, 10, 4, 2, 0,104, 3, 32, 49, 37, 37,133,239,227,227, 35,212,162,203, 7,176,145,195,225, 44, 37,
- 8,130,110,219,182,109,180,151,151, 87,177,149,149, 21,196, 98, 49,164, 82, 41,216,108, 54,196, 98, 49,146,147,147,241,224,193,
- 3, 88, 89, 89,233,117,160,138,139,139, 97,102,102, 6,138,162, 62,152, 83,165, 82, 17,123,246,236, 49,121,241,226,133, 73,104,
-104,168,195,220,185,115,115,155, 54,109,250,120,248,240,225,175,237,237,237,165, 79,159, 62,197,189,123,247,144,159,159,143,246,
-237,219,235,196, 41,147,201,192,100, 50, 33, 22,139,193,229,114,193,100, 50,161, 84, 42, 65, 81, 84,153,248, 42, 46, 46, 70, 94,
- 94, 30,216,108, 54,100, 50,217,167,120, 3,125,207, 66, 85,221,240, 91,109, 44, 90,218, 66, 77, 71,145, 85,147, 37,170,202,225,
-206,130,130, 2, 35, 75, 75,203,133, 0, 4, 53,173,139, 32, 8, 48, 24, 12,176,217,108, 16, 4,129, 46, 93,186, 96,226,196,137,
-104,213,170, 21, 18, 18, 18,112,252,248,113, 60,122,244, 8, 44, 22,171,172,189,206,227, 19,126,126, 12, 30,143,119,111,224,192,
-129,158, 63,252,240, 3,175, 94,189,122,136,141,141,173,187, 97,195,134,133,215,174, 93, 27, 36, 18,137,218,104,238,118,213, 91,
-233,213, 67,130,165,195,133,125,165, 82, 41, 98, 99, 99,245, 89,230, 61, 52,108,216, 48,153, 36,201,215, 20, 69,133, 3,240,166,
-105,186, 11, 65, 16,151, 80,234,151,168, 13, 17, 77,211, 95, 18, 4, 81, 8,224, 25, 73,146, 47, 41,138, 74, 54,216,109, 12,208,
-225,190,210,191,226,127,130, 32,194,214,175, 95,223,191, 50,113, 85,201,181, 89,110,250,134, 13, 27,214,105,253,255, 16,139,106,
- 87,148,119,134,247, 83, 91,185,254, 18, 90, 97, 97, 97,213, 43, 16, 10,131,195, 78, 31,187,223, 93, 14, 87,207,214,190, 90,214,
- 33, 26,145, 15,238, 1,160,127,209,169, 43,252,254, 70, 36,131,249,203,158,117, 51,201,189, 55, 75,144,146,158,133,123, 23,127,
- 65,182, 32,233, 16, 64,207, 69, 98,104,225, 7, 31,137,122,131,189,236,109,108, 45, 37,114, 26, 20, 13,224, 61,177,245, 73,208,
-170,113,227,198, 67, 34, 34, 34,108, 37, 18, 9,239,206,157, 59, 37, 33, 33, 33, 25,114,185,252, 38,128,187,234, 54, 81,217,217,
-217, 67,213,194,132,193,100, 50, 57,114,185,188, 58,223,133, 86,243,191, 25,123,103,227,158,131,188,215,207,163,177, 61,244, 34,
- 10, 74, 74, 84, 55,179,196, 95, 1,208, 40,250,235, 81, 57,226, 52, 26,180, 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229,
- 67,178, 82,169,116,228,168, 81,163,248, 26,145, 5, 0, 57, 69, 10,102,137, 84,193,232,212,204, 6,173,187, 13, 69,228,141, 83,
- 56,121, 59, 13,110,118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, 6,239,221,186,113,229,124,206,188,190, 22,240,111,
-195, 2,143, 77,192,220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243,195, 0,124, 37, 16, 8,192,231,243,139, 1,188,100,
- 48, 24,137, 42,149,170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22,
- 22,136,139,139,195,159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232,117,176,114,115,115,241,244,233, 83,244,237,219,111,
-110,118,118,150,185,149,181,141,232, 78,248,237, 77,181,225,164, 40,138, 0, 0, 79, 79, 79,120,122,122,242,210,210,210,156,195,
-194,194,236,215,172, 89,243,206,213,213,245,168, 88, 44, 46,103, 57,208, 85,104,105,196,133, 70, 4,242,120, 60,176,217,108, 20,
- 22, 22, 34, 51, 51, 19, 69, 69,165, 65,155,150,150,150,159, 68,104, 85, 97,161,250,104,237,255,102,113,248,222,112,167,165,165,
-229, 40, 0, 11,117,220, 22, 40,149, 74,176,217,108,248,248,248, 32, 56, 56, 24,143, 30, 61,194,239,191,255,142,186,117,235, 98,
-220,184,113, 32, 73, 18, 47, 94,188,208,183,139, 84, 68, 68,196,194,175,190,250,202,243,240,225,195,188,228,228,100,196,199,199,
-195,210,210, 18,193,193,193,220,201,147, 39, 55,188,113,227,198,114,148, 6,191, 84, 15,173,232, 66,145, 17,127,152,183,183,247,
-123, 77, 28, 29, 29, 45, 46, 95,190,108, 95, 38,192, 42, 70, 36,190,143,130,229,203,151,111,245,240,240,216,166, 30, 46,244, 5,
- 96, 66,211,180, 95,104,104, 40, 1, 0,254,254,254, 52, 65, 16,154, 7,210,179, 83,167, 78,117,139,139,139,163, 3, 3, 3, 13,
- 62, 90, 6, 84,165, 69, 38,107,174,201,170, 4,148, 62, 66, 77,219,226,165,193,226,197,139, 61,215,175, 95,255,240, 3, 69,150,
-246, 27, 19,173, 17, 91,101, 15,211, 42,135, 12,203,108, 95, 36,223,209,222,198,122,209,184, 78,160, 40, 64,169, 2,148, 42, 26,
-162, 18, 49, 98,159, 63, 42, 1,143, 8,213,169, 59, 92, 78,208,154, 31,230, 52,136, 78, 37,145,158, 47,199,173,179,123,233,108,
- 65,210, 16, 36,158,154,240,113, 68,214, 48,111, 71, 7,251, 91,199,246,174, 38, 31,189,149, 65, 69,149,234, 44,138,162,203,126,
-127, 2, 56,218,217,217, 5,220,191,127,223,142,203,229,242, 94,189,122, 69,157, 58,117, 42, 95, 46,151, 95,211, 18, 89, 0,208,
-169, 77,155, 54, 74, 83, 83, 83,136, 68, 34,185, 92, 46,151, 84, 35,178,156,253, 90, 53,191,189,113,207, 65,158, 68, 38,131, 80,
- 44, 5,195,198,190,162,200, 2,128,142,221,220,235,212, 33,120,102,160, 1, 36, 21,202,211,171, 18, 89, 0,192,229,114,123,204,
-156, 57,179, 92, 93, 60, 91, 51,150,210,152,203, 82,221,141,201,161, 34,111,156, 66,248,139, 28,138,199,102,168,236,232,183, 13,
-116,221, 1, 5,169, 49,123,126, 63, 23,118,245,187,101, 65,197, 37,162, 34,184, 57, 25,161,184, 72,136,181,235, 55, 42, 34, 34,
-194,111, 46,156, 59,181,195,169, 83,167, 54,160,212, 25, 28, 0, 94,158, 58,117,106,236,178,101,203,126,197, 95,105, 30, 42, 34,
- 61, 32, 32, 32,181, 89,179,102, 66, 15, 15, 15, 97,110,110, 46, 98, 98, 98,144,159,159,143,237,219,183, 35, 54, 54, 22, 26,139,
-160, 78,190, 42,239, 11, 36,228,231,231,153,210, 52,141,252,188, 92,147, 31,126,248,193,162, 54,156, 42,149,170,220,181, 85,167,
- 78, 29, 76,155, 54,141, 93, 82, 82, 98,249,238,221, 59,115,237,121,186,114,202,100,178,178,140,195, 52, 77, 67, 38,147, 65, 40,
- 20, 66, 38,147,225,245,235,215,101, 34, 75,189,254, 79,102,209,210,252,230,241,120,153,154,115, 89, 51, 4,199,227,241,178,170,
-106,255, 33,208, 90, 23,173,254,173,175, 56,172,113,123,116, 60,238, 96,179,217,152, 56,113, 34, 30, 62,124,136,132,132, 4, 48,
- 24, 12,136, 68, 34,148,148,148,160,103,207,158,224,112, 56,250, 90,180,104, 54,155, 61,106,201,146, 37,188,196,196, 68,228,228,
-228,104,156,233,161, 82,169, 48,119,238, 92, 35, 46,151, 59, 74, 95,211,189, 64, 32,232,253,250,245,235,198, 21, 63, 25, 25, 25,
- 66,109,159,194,218, 34, 52, 52,148,240,247,247,167,253,253,253,105,141,224, 50,192,128,202, 80,133, 22,217, 87,149, 69,235, 99,
- 88,197, 52,150, 45,168, 3, 68,106, 1,141,200,234,170, 37,188, 8,141,133, 75,183,161, 67,183, 97, 45, 29,108,172,111, 28,222,
-181,202, 52,236, 57,129,212,148, 36,100, 11,146,209,166,131, 31, 98,159, 71,131, 82,168, 78,227,117,104,205,158,156,245,252,221,
- 61, 60,154, 78,239,218,193, 11, 65, 97,197,120, 21,121, 25, 5,217,130,157, 72, 58,117,250,163, 28, 33, 87,255,230, 14,246,214,
- 55,126,221,181,202,242, 82, 12,137,148,148, 36,156,253,117, 43,173,144, 75, 11, 80, 62,146, 75,239,183,102, 35, 74,198, 41, 46,
-200,132,172, 72, 5, 30, 89,194,211,115,144, 34, 3, 64,248,214,173, 91,187,183,111,223,158, 19, 16, 16,144,145,159,159,127, 22,
-192,125,173, 54,205,220,221,221,251, 6, 7, 7, 59,164,164,164,224,218,181,107, 25, 40, 13,253,175, 10,169,183,163,159,239,254,
-243,215,253,243,141, 26, 52,193,246, 37,223, 41, 67, 31,197, 12, 4,112, 73,171,141, 71, 15,111,247,176, 53,223,207, 32,169,168,
- 63,240, 52, 57, 19,111,133,210, 63,171, 34,204,201,201, 33, 74, 74, 74, 92, 45, 45, 45,181, 79, 72,240, 77, 68,210, 5,195,220,
-211,123, 46,188,227, 36,145,171,192,101,145,244,236, 65,174,233, 15,207,134,218,228, 72,114, 8, 77, 52, 98, 77,152, 52,188,199,
-160, 93, 33,103,198,132,133, 93,152, 46,151, 74,188,154, 52,105, 76, 63,142,184,241,116,225,220,169,125,106,121,196, 77, 31, 62,
-124, 72, 50, 24,140,114, 2, 93,219, 66,164,175,165, 72, 31,232,202, 89, 81,104,105,160, 84, 42,137,218,114, 74,165,210, 74, 75,
- 59, 84,230,171, 69, 81,212,223,178,253,250, 88,168,180,135, 12, 53,254,116, 18,137,196, 94,237,179,229,240, 49, 45, 90, 31, 18,
-137, 88,221,240,165, 62,253, 35, 73, 18, 20, 69,129,205,102,163, 69,139, 22, 8, 11, 11,131,181,181, 53,204,205,205, 97,110,110,
- 14, 35, 35, 35,216,216,216,148, 9, 45,146,212, 57, 74,135,150, 74,165,117,235,214,173,139,215,175, 95,131,199,227,149,125,184,
- 92, 46, 60, 61, 61, 33, 18,137,234,224, 83,218,238, 13, 48,224,239,189,175,132,105,139, 37,130, 32,194, 22, 45, 90,180,164,182,
-124,139, 22, 45, 90, 82,153,133,235, 3, 5, 87, 57,235, 22, 83, 91, 65, 86,170, 36,213, 34,235,208,206,149,230,103,158, 0,169,
-169,137,184,122,114, 71,145, 66, 46,203,167, 40,133,235,219,248,104,128,196, 47, 58,117,129,164,219, 13,234,219,141,184,250, 66,
-134,194,130,108,188,124,124, 57, 9, 98,206,226,143, 38,178, 28,108,111, 28,222,181,210,242,252,115, 2, 41, 41, 73,184,116,108,
-123,161, 66, 46,239,129,196,208,199, 31, 66, 61,138,205, 30,196,118,121,215,255, 27,223,116,168, 8, 21, 70,197,198,125,153,149,
-129, 65,130, 59,213, 71,134,105, 35, 59, 59,251,236,214,173, 91,137, 31,127,252,177,171, 68, 34,249, 13,128,182,137,210,203,205,
-205,109,196,190,125,251,172, 83, 82, 82, 88,119,238,220, 17,221,184,113,131, 6,112,190, 6,139,203,130,158, 19,166, 49, 90,213,
-171, 51, 51, 42, 41,109, 32,128, 63,180,102,123,246,111,221,236,238,193,245,203,205, 20,119, 67, 81, 44, 72,193,226,187,169,133,
- 0,116,222,223, 10,133, 2, 66,161, 16,138,226, 92,101, 27,190, 72, 24, 56,212, 94,154,153, 47, 97,178,168, 18,165,135,121,150,
-244, 70,238, 91,134,177,177,177, 94,251,114,215,250,249, 33, 0, 66,134, 14, 29,122,248, 89,196,133, 54,124, 62,255,130,135,135,
- 7, 1, 0, 85, 68, 24, 86,133, 85, 0,230,118,236,216,145,240,241,241,121,176,109,219,182, 43,213,137,149,218, 88,180,106,130,
-174,156, 20, 69,145, 85,236, 95,162,182,156,218, 22,173,154,132,214,167,180,104, 85, 38, 90,180, 69,162,182, 16,250, 55, 68, 29,
- 86, 39,166,244,233,159,198, 79,142,205,102, 35, 58, 58, 26, 46, 46, 46,144,203,229, 48, 51, 51,131,153,153, 25, 76, 77, 77, 81,
- 84, 84, 4, 22,139, 5, 61,183,153,226,241,120,239, 98, 98, 98, 26,219,217,217, 65,165, 82,149, 19, 91,175, 94,189,130,137,137,
- 73,154,190, 22, 45, 62,159,127, 89, 29,117, 88, 14,142,142,142, 22, 31, 99,191,106, 91,178,252,253,253, 13, 67,132, 6, 84,107,
-205,170,194,170,149, 93,193, 18, 37,211,250,159,141,210, 28,110,253,213,191, 81,201,111, 89, 37,211,114,215,175, 95,127, 67,203,
-191, 43,251, 3, 55, 65,147,226,161, 92,132, 11,179, 38, 75,150,189,181,213,141, 3,219, 3,205, 79, 70, 2,105, 41,137,184,117,
- 58, 88,168, 84,201,191, 0, 69, 11, 34,174,157, 14, 5,129, 18,188, 13,189,165,219, 45, 2,173, 90, 53,117,197,239, 47, 20,200,
- 78,125, 5,154,166, 14, 33, 43,164,228,131,143,142,219,224, 22,246,214,182, 55, 14, 5, 7, 90,156,137, 38,144,154,146,136,171,
- 39,131, 11,149,138,146,238, 72, 60, 29, 89, 91,218,137,128, 21,195,132,183,123,136, 95,171, 97,174,110,206,160,104, 5, 40, 54,
-141,193, 11,108,153, 47,163, 74,126, 15,231, 9, 79, 82,197,212,244,180,251,186, 57,208, 21, 23, 23,255, 14,224, 49,202,167, 87,
-104,222,168, 81,163, 97,187,119,239,182, 75, 77, 77,229, 69, 69, 69,137,247,238,221,155, 69, 81,212, 25, 0,186, 12,165,126, 23,
-149,148,118, 0,229,243,229, 52,159, 63, 33, 32, 34, 96,252, 55,188,196,107, 33,176, 74,140,197,247,119,211, 85, 47,243,101, 35,
-213,214,181, 74, 97,107,107, 75,231,228,228, 36, 23, 20, 20, 52, 54, 49, 49, 65,110,110, 46,242,242,242, 32, 20, 10, 33, 45,204,
- 83,218,168, 10, 68,132, 50, 15, 44, 22, 11, 89, 41, 10,168, 84,170, 12, 93,173, 89, 0,172, 86,173, 90, 53,137,162, 40, 77, 70,
-196,114,209,133, 90,237, 52,231, 67,227,161, 67,135, 30,214,138, 58,212,118,134,215,164,119, 32,212,233, 29,218,255,241,199, 31,
-113,125,250,244, 73,173, 76,172,112,185, 92,189, 29,165,171,138, 98,172, 13,103, 85, 22,173,138,211,245,225,212, 12, 95,106,156,
-224, 43, 78,215,128,193, 96,128,162, 40,232, 16, 84,241,183,138, 22,237,232,192,218,136,156, 10,199,166,218,196,161,181,140, 68,
-252,168, 22, 45,205,177, 96,179,217, 56,119,238, 28,198,143, 31, 15,149, 74, 5, 99, 99, 99,152,154,154,194,196,196, 4,167, 79,
-159,134, 38,253,131, 62,250, 85,161, 80, 28, 89,191,126,253,146, 61,123,246, 24,209, 52, 13, 14,135, 83, 38,180, 2, 3, 3,197,
-114,185,252,136, 78, 66, 75,147,241,157,162, 99, 76, 76,148,213, 70, 29, 86,182, 76, 21,254, 90,150,171, 86,173, 26, 75, 81,212,
- 32, 84, 72,225, 80,161, 93,185,212, 15,134,244, 14, 6,232,112, 63,121,244, 47,238,158, 70, 96, 17, 90,150,172, 50,193, 69, 86,
- 39, 94,236,172, 44,111,236,223, 30,104,126,244, 17,129,196,183,111,113,243,183, 29,165, 34,235,205,201, 39, 72, 14,205, 68, 98,
-104,103,188, 13,237,173,243,219, 19, 65,180,114,178,183, 68,158,136, 66, 97,206, 59,128, 70,212,199, 16, 89,118, 86,118, 55,126,
- 14, 14,180, 56,245,132, 68, 98, 98, 34,174,158,220, 33, 84, 42, 37, 95,124,136,200, 26,197,102, 15,106,228,238,156,176,116,210,
-160, 97, 62, 13, 29, 97,243, 46, 14,231,199, 13,195,234,227, 95,195,204,142,129,118,125,205, 48,113,173,227, 48,190, 39,247, 53,
-191, 51, 6,233, 65,173, 45,178, 90,213,175, 95,127,216,253,251,247,109,189,189,189,121,241,241,241,146,189,123,247,102,137,197,
-226, 43, 0,162,245,224,212, 22, 89,173, 22, 77, 30, 23,177,113,255, 97, 30,201,230, 32,232,200,121,204,186,157,170,186,144, 92,
- 56, 20,229,135, 21, 43,133, 84, 42,189, 22, 28, 28, 44, 37, 73, 18,121,121,121,200,201,201, 65, 86, 86, 86,217,119, 65, 65, 1,
- 24, 12, 6,174, 95,191, 46, 43, 44, 44,188,175,107, 7,239,221,187, 87, 63, 45, 45,205, 67, 32, 16,180, 81,127,226, 81, 26, 93,
-104,170, 53,173,141, 64, 32,232, 10,224,145,102,122,106,106,106,189, 7, 15, 30,240,107,226, 55, 51, 51, 3,155,205, 46,103,209,
-226,114,185,112,112,112,128, 82,169,196,137, 19, 39, 0, 32,175, 58, 14, 54,155, 35, 32, 73, 2, 20, 77, 73,121, 60, 30,197,231,
-243, 43, 21, 88,250,112,170,145,250,229,151, 95, 74, 34, 35, 35, 43,181,104,213,134,147,166,233,146, 94,189,122, 33, 61, 61, 29,
- 60, 30,175,236, 97,173, 17, 84, 36, 73,130,203,229, 34, 35, 35, 3, 83,166, 76, 1, 77,211, 37,255,244,157, 71,219,167, 73, 45,
-134, 8, 0,132, 90, 8,189,231,167,165,171, 15,148,102,104,144,166,105,104, 4, 87,133,249,101,235,210, 37,123,123, 5,159,174,
-201, 5, 5, 5, 27, 75,187, 67,239,173,240,189, 79,143,135, 66,153,208,138,141,141,197,225,195,135, 81, 80, 80, 0, 14,135,131,
-252,252,124, 28, 60,120, 16, 49, 49, 49,224,112, 56,208,236, 11, 93,245,155,143,143,207,198,240,240,240,152,145, 35, 71,138,163,
-163,163, 33, 22,139, 17, 29, 29,141,222,189,123, 75,238,222,189,155, 32, 22,139, 87, 65,151,161, 67, 77,198,119,117,121, 29,169,
- 84,138,168,168,168, 74, 63, 85, 45, 83, 17, 9, 9, 9,174, 42,149,170, 49, 77,211,190, 52, 77,155, 67,157,194, 65,253, 95,251,
-243,165,122,158, 57, 77,211,190, 42,149,170, 81, 66, 66,130,171, 65, 78, 24,240,153,226,150,150,216,162,181, 68,214,173,234, 45,
- 90, 20, 25,124, 96,199, 74,243, 35, 15, 73,164, 36, 39,224,241,197,221, 66, 21,165,248, 66,207,114, 56, 61,160,149,107,131,103,
-100,226, 69, 17,165,225,204,133, 57, 41, 0,205,168,141,208, 42,199, 9,138, 12, 62,184, 35,208,226,216, 99, 2,233, 41,111,112,
-247,236, 46,161, 82, 41,237,142,183,161, 81,181,225, 28,197,102, 47, 99, 49,136,165,189, 58,181,100,119,110,233, 14,147,172, 36,
-100,164,166,227, 68,108,118, 94, 66,190,244,155,187,132, 28,201,111,164, 7,250, 78,178,182,182,114,100,161,255, 84, 27,235,251,
-231, 11,127, 39, 88, 34, 57, 45,167,215, 11,238,150,149,165, 40,223,207,247,225,104,102,102, 54,242,241,227,199,230, 60, 30,207,
-232,241,227,199,212,222,189,123,115,197, 98,241, 69, 0, 17, 58,109,251,251,112,110,235,238,118,107,221,174,253,188, 98, 81, 9,
- 68, 50, 57,184, 14,124,213,153,136,231, 67, 80,117, 2,204,114,156, 92, 46,247,216,177, 99,199,250,118,233,210,197,213,203,203,
-139,204,203,203, 67,113,113,113,153,115,181,157,157, 29, 98, 99, 99,169,196,196,196,116, 46,151,123, 92,215,126,118,236,216, 49,
-145, 36,201,120,245, 48, 90, 60, 42, 68, 23,106, 53,109, 44, 16, 8,218,242,249,252, 91, 0,140,181,162, 14,181, 57, 53,233, 29,
-150, 0, 32, 9,130,120, 20, 29, 29, 93,220,167, 79, 31, 24, 25, 25, 65, 36, 18,161,110,221,186, 80, 42,149,184,120,241, 34, 34,
- 35, 35, 69, 20, 69,221,170, 68,188,150,235,167, 68, 34,174, 11,128, 20,151,148,180, 24, 59,118,108,215,121,243,230,149, 11, 73,
-183,183,183,135,181,181,181, 94,156, 0,144,151,151,215,244,143, 63,254,152, 19, 29, 29,253, 93,223,190,125, 45,150, 44, 89,194,
-173, 95,191, 62, 84, 42, 21, 89, 91,206,252,252,124,139,168,168,168, 77,157, 59,119,158,209,167, 79, 31,230,186,117,235, 96, 97,
- 97, 1,149, 74, 5, 35, 35, 35, 20, 22, 22, 98,213,170, 85,184,115,231,142,146,166,233, 93, 66,161,240,123, 61,207, 37,124,232,
-181, 89,149, 5,168,170,148, 12, 85,180,255,219,251, 89,193,167, 11,234, 20, 14, 11,171,200, 96, 15, 93,207,121,141,208, 98, 48,
- 24, 72, 74, 74,194,222,189,123,223,203,163,165, 73,255, 80, 5,119,101,219, 78,223,188,121, 83, 69, 16, 68,135,199,143, 31, 47,
- 28, 51,102,204, 55, 34,145,200,217,196,196, 36, 93,161, 80,252, 34, 22,139,215,162,212, 31,149,173,207, 61, 68, 36, 18, 37, 87,
- 22,117, 88,177, 13, 96, 89, 45,103,133,244, 14,229, 82, 56, 84, 88,166, 92,234,135, 74,210, 59,252,237,199,221,192,249,175,228,
-252,220,197, 86,213, 9, 75,223, 67,171,201, 44,150, 88,225, 29,158, 64,124,136,200,122,223, 90, 34, 41, 73, 88,126,236, 93, 75,
-153, 84, 2,145, 48,243, 37,146, 78,100,125,208,102,169,251,121, 59,129, 64, 82,226, 27, 60, 12,219, 85,218,207,183,161,181,238,
- 39, 1, 44,254,233, 82, 40,155,176,176,198,211, 57,227,145, 94, 32,194,165,183,249, 39,233, 18,233,244, 35, 64, 62,238, 0,164,
- 82, 26,126,240,135,140,221,190,131, 45,134,217,214, 97, 97,203,252, 95,192, 91,100,195,110,215,189,139, 62, 53, 16, 51,120, 60,
- 94,248,246,237,219,123,248,250,250,114,135, 14, 29, 90,153,131,188,190, 72,125,244,234,205, 79, 23,246,108,158,111,227,221, 30,
- 59,151, 45, 80, 29,139,120, 94, 49, 10,177, 90,120,120,120,168,238,221,187, 55,111,202,148, 41, 91,122,244,232,225, 52,112,224,
- 64, 78,221,186,117,193,229,114,241,230,205, 27,132,135,135,203,222,190,125,155, 94, 82, 82, 50,175,121,243,230,250,228, 56,203,
- 95,190,124,249, 70,245, 58, 8,245,112, 97, 27,168,163, 11, 53,141,212, 73, 75,219, 0, 48, 14, 12, 12, 28, 3, 0, 85,132,125,
- 47, 7,176, 7, 0,147,166,233,140,144,144,144, 14,103,207,158,237, 48,119,238, 92,118,223,190,125,113,255,254,125, 92,189,122,
- 85, 46,151,203, 35,212,194, 85,215, 82, 57, 20,128, 40,165, 82,249, 60, 40, 40,168, 3,131,193, 88,174,153, 17, 19, 19,131, 67,
-135, 14,213,134, 83, 9, 96, 83,102,102,230, 79, 33, 33, 33,203,175, 93,187, 54, 97,236,216,177,230, 10,133, 2,177,177,177,248,
-249,231,159,107,197, 41, 20, 10,231,216,218,218, 46,189,120,241,226, 47, 87,174, 92,249,106,244,232,209,228,172, 89,179, 16, 28,
- 28,140,223,126,251,141, 82,169, 84,103, 89, 44,214,216,156,156, 28,209,167,184,235,168,135,225,210,245,172,117, 88, 35,239,135,
- 12, 13,234, 8,193,135, 18,104,182,195,207,207,175,204,202,168,177,194,105,183, 33, 8, 66,239,161, 67, 0,150, 52, 77, 83, 0,
-118,161,180,190,168,118, 86,120, 6,254,202, 28,175, 43, 99, 51,129,212, 50, 6, 82,196, 86, 95, 84,218, 18,160,209,172, 6,182,
-130,229,203,151,111, 93,177, 98,197,214,138, 41, 28,180, 27, 85, 76,253,176,114,229, 74, 24,210, 59, 24,240, 95, 69,229, 66, 43,
-106,159, 66,209, 96,200,146,237,235, 22,172, 80, 42,100, 66, 26,114,127,188, 57, 29,253,161, 43,163, 41,122,209,245,163,129,193,
-160,145, 79,171,148, 11, 63,184,247,127, 83, 63, 9, 11,107, 20,173,154,134,223, 94,164,211, 25, 34,197,215, 71,228,242,114,214,
-160, 82,159, 44,106,248, 13, 73,254, 9, 43, 39,214,153, 57, 95,216, 16, 23,242,198,232,189,158,172,172,172,115, 91,183,110, 37,
- 55,111,222,220,181,164,164,164,162,131,124,109,177, 96,192,204, 69,140,118,141, 92,103, 62,124,157, 60, 8, 58, 12, 23, 86, 68,
-199,142, 29, 5,113,113,113, 1, 87,174, 92, 25,121,251,246,237, 30, 34,145,200,149, 32, 8, 24, 27, 27, 39, 75,165,210,107, 92,
- 46,247,152,158, 34, 11, 0,176, 98,197, 10,122,229,202,149, 68, 92, 92, 28,205, 96, 48,254, 4,144,200, 96, 48,146,180,157,224,
-181,167,107,150, 9, 12, 12,212,229,129,120,187,184,184, 56,114,213,170, 85, 93, 86,173, 90,213, 66,109, 21,186,141,191,124,190,
-244,133, 2,192,109, 54,155,147, 78, 16,132, 51,155,195, 21,221,187,119,239,218, 7,114,150,200,229,242,133, 41, 41, 41, 91,182,
-108,217,178,214,196,196,164,109, 76, 76,204,159, 31,194,169, 22, 81, 67,172,173,173,157, 14, 31, 62,124,234,224,193,131,237,153,
- 76,230,125,130, 32,134, 10,133,194, 79, 90, 84, 90, 93, 32,122,165, 30,181, 14,117,226,253,216, 73, 74,255, 14,225,166, 82,169,
-138,151, 46, 93,154, 85, 81,120, 85,180, 94,105,254,171, 83,185,232,178, 79,245,137,162,172, 65,184, 16,197, 0, 80, 90,187,176,
-180,172,142,174, 69,165, 1,136,107,186,206, 73,146, 60, 11,224, 37, 73,146,175, 43, 6,186,104,207, 91,185,114,101, 77,215,185,
- 1, 6,124,214,208,225,206, 22, 72, 2,129,181,245,164,253, 7,205,149, 31,167,159, 1,108,246, 74, 18,152, 15,128,160,129, 45,
- 71,228,242, 31,170, 91,208,177, 35,214,210, 4,230,170,119,230,186,140,187, 88, 83,139,109,175, 3, 29,234, 15,234,201,217, 4,
-213, 23,148,125,143,211,223,223,159, 81,197,195,188, 92, 81,233,170, 16, 26, 90,150,197,191,170,126,106,159,111,102, 15, 30, 60,
-112,242,241,241, 17,160,188,211,127,101,211,105, 61,183,157, 1, 64,245,145,247,231,103,193,233,230,230,198,121,243,230,141,236,
-223,117,109, 26, 56,255,149,156,150, 77, 93, 64, 96, 18,180,115, 7, 85,107,209,210, 18,104, 52,253, 51, 10, 98, 83,170,232,167,
-230, 58,183, 76, 72, 72,112,109,216,176, 97, 50,128,130, 10,253,168,108, 30,109, 56, 70,255,247,156,149, 97, 50,202,151,162,251,
-172, 80, 89,116, 56,254,134, 3, 97,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,211,192, 89, 91,161,245,217,130,166,105,144,
- 48,192, 0, 3, 12, 48,192, 0, 3, 12, 48,224,111, 1, 81,141, 42,213,199, 36, 88, 27,101,123,205,192,105,224, 52,112, 26, 56,
- 13,156, 6, 78, 3,231,255, 29,103, 77,220,218,203,127,174, 67,135,147, 1,236, 51, 12, 29, 26, 56, 13,156, 6, 78, 3,167,129,
-211,192,105,224,252,183,112, 86, 37, 88, 62, 91,208, 52,173, 99,173, 67, 3, 12, 48,192, 0, 3, 12, 48,224, 95,129, 30,238,224,
- 51, 85, 32,255,120,163, 83, 16, 85,141,232,227,134, 58, 0,240,177,248,254, 79,193, 7,208, 79,235,255, 5,168, 35,227, 13, 66,
-235,243, 69, 35, 0, 75, 0,104,215, 34,123, 8, 96,125,133,118, 71, 1,104, 23, 36, 20,161,180, 78,224,107,125, 86, 70,146,228,
-250, 46, 93,186, 76,191,115,231,206,102,165, 82,185,170, 22,253,117,229,243,249, 27, 9,130,104, 13,128, 69, 16,196,155,204,204,
-204,245, 74,165,242, 67,162, 86, 26, 56, 58, 58,110, 0,208,146, 36, 73, 22, 65, 16, 9,153,153,153,107,148, 74,229,205, 15,224,
- 52,115,112,112,232, 68,211,180, 35, 0, 6,139,197,202, 77, 75, 75,123,128, 90,230, 86,242, 15,140,101, 23,138,148, 44, 0, 48,
- 55, 97, 42, 66, 3,155,202,117,157,102, 56,197, 13, 48,224,255, 27,116,105,100,114, 57,244,118,195, 90, 90,137,239, 85, 0,209,
-171, 62,118, 92, 78,196,247, 85, 45, 79, 84, 18,213, 92,145,179,183, 27,214,170,232, 82,142, 94,110,216,116,249, 13,170,141,180,
-215,133, 83,131,125, 0, 57, 89,135, 42, 5,132,110,209,215,255,118,244, 67,249, 33,206,178, 33,207,106,133,214,112,119,240, 85,
- 76, 48, 67, 99,161, 9,227, 53, 3,208, 66,253,144,127,141,210, 92, 69, 69, 31,216,185,207,133,243,223,134,229, 52, 77, 7,148,
- 59, 89, 43,201, 67,244,197, 23, 95, 12,188,114,229,138,177,166,222, 29, 69, 81, 48, 50, 50, 82, 2, 24,167,199,186,236,135, 15,
- 31,190,232,192,129, 3, 24, 54,108,216,210,176,176,176,173, 0,138,117, 93,216,202,202,202,223,210,210, 50,120,255,254,253,118,
-237,219,119, 32, 56, 28, 14,222,188, 73,112,158, 50,101,138, 87, 92, 92,220,217,172,172,172,111,244,221,120,107,107,235, 81,150,
-150,150, 91,246,238,221,107,219,185,115,103, 16, 4,129,200,200, 72,231, 57,115,230,180,120,247,238,221,241,204,204,204, 25,250,
-114,218,216,216,184, 91, 88, 88,116,219,185,115,167, 81,167, 78,157,192,227,241, 16, 29, 29,109, 58,117,234, 84,199,180,180,180,
-216,204,204,204, 91,250,138,172,103,145,231,191, 82,202,165, 65, 0,192,100,115, 23,180,223, 18,113,254,217,141,243, 3,106,154,
-230, 31, 24,251,187, 65,108, 25, 96,128, 1,218, 24,229, 4, 71,154,198,252, 43, 63, 47, 35, 1,160,215,132,213,179, 70, 57, 97,
-243,145,244,170,107,216,234,201,247,253,216, 58, 8, 62,156,134,204, 15,233,231, 62,128,156,195,100,206,106,231,227, 99,251,237,
-221,187, 9,114,224,151,255,147, 67, 84,233, 48,103,149, 66,107, 72, 83,172, 82,150, 90, 76,136, 62, 13,113,252,106, 34, 35,252,
-139, 47,190,104, 56,113,226, 68,162, 85,171, 86,136,140,140,116, 63,126,252,120,191, 11, 23, 46, 36,168, 84,170, 72, 0, 47,160,
-123, 86,107, 22, 0, 79, 6,131,209,250, 95,206,249,111,134,137, 90, 92,101,226,175, 68,167,239, 37, 60,189,126,253,250, 57, 38,
-147,169,177,104,181, 19,137, 68, 14, 21,172, 96,186,160,158, 66,161, 64,124,124, 60, 72,146,100, 1,168,143,247, 75,106, 84, 5,
-103, 99, 99,227,221, 17, 15, 35,109, 8,166, 17,242, 37, 0, 36,114,112, 76, 29,112,224, 80,136,245,188,217, 51,134,220,188,121,
- 51,188,168,168,232, 87, 61,250, 83,223,196,196,100,235,211,167, 79,109,140,141,141, 65, 81, 20,138,138,138,224,232,232,136,253,
-251,247, 91,206,155, 55, 47,160,176,176,240,166, 68, 34,249, 77, 31,113,110, 97, 97,209,237,249,243,231, 70,154,130,210, 50,153,
- 12,206,206,206, 56,122,244, 40,119,214,172, 89, 77, 11, 10, 10, 82,101, 50,217, 91, 93, 9, 11, 69, 74,150, 82, 46, 13, 58,188,
- 43,208, 5, 0,198,206, 8, 12,226, 20,153, 95,212,101, 90,161, 72,121, 1,128, 65,104, 25,240, 79,163,181,173,173,109,104, 78,
- 78,206, 45, 0,223,224,227, 88, 26,220,121, 60, 94,115,138,162, 28, 73,146, 4,131,193,200, 16,137, 68, 79, 1,188,170, 45,161,
-141,155,223, 0,112,141,199,131,166, 90,144, 0, 8,146,140, 86,201, 75, 14,229,190,186,121,254,131, 56, 57, 70, 19, 0,186, 5,
- 9, 80, 4, 73, 62,165,148, 37,251,115,226,111, 94,250,183, 28,156,251, 66, 52,118,115,212,189, 48,230,199,224, 27,209, 0,124,
-146, 2,121, 52, 73,247, 97,197,153, 64,223,217,179,103, 59,206,152, 62,157, 24, 63,110, 92,163, 91,119,238, 16, 93,245,169, 86,
-240,121,162, 74,135,253, 74,133,150,127, 83, 88,209,192,194,227,193, 75, 72, 38,131, 65,140,156,189, 62,224,224,174, 77,100,207,
- 1, 67,203,134, 79,124,125,125,225,235,235, 75, 4, 5, 5, 53,250,243,207, 63, 27, 29, 61,122, 84, 25, 17, 17,241, 20,192,137,
-170, 86,214,219, 13, 98, 10,224,177, 89, 76,209,200,101,191,238,245,241,241, 1,151,203,197,135,112, 2, 64,207,134,228, 91,150,
-117,131,167, 35,103, 46, 79,110,223,190, 35,253, 49, 56, 63, 35, 60, 4,202,138, 90, 91,185,184,184,116, 82, 42,149, 60, 0, 96,
- 50,153,146,148,148,148,153, 40,173, 13, 8, 0,103, 41,138, 26,168, 7, 55, 9, 96,197,192,129, 3,151,126,251,237,183,168, 91,
-183, 46,102,205,154, 5,133, 66, 17,121,233,210,165,229, 0, 54,160,134,139,199,222,222,126,249,238,221,187,173,153, 28, 19,180,
- 90,152, 8, 65,129, 18, 0, 96,202, 5,206, 77,163, 49,107,214, 44,243,199,143, 31,175,209, 71,104,217,219,219,175,218,191,127,
-191,181,177,177, 49,104,154, 46,171,197, 88, 92, 92,140,226,226, 98,204,152, 49,195, 60, 54, 54,118,163, 62, 66,203,193,193,161,
-211,206,157, 59,141,120, 60, 30,138,139,139,217,114,185,156, 40, 42, 42, 66, 73, 73, 9, 45,147,201,228, 51,103,206,228,190,120,
-241,194, 79, 32, 16,188,133, 1,255, 22, 48, 0,124,205, 98,177, 6, 55,108,216,176,205,235,215,175,159, 40,149,202,211, 0, 78,
-127,132,151,169,238, 78, 78, 78,107,211,211,211,119, 2, 8,249,127,217,161, 14, 14, 14,167,239,221,187,231,178,123,247,238,113,
-155, 55,111,190, 8,224,183, 15,160, 99,179,217,236, 33, 93,187,118,117, 25, 59,118, 44,199,193,193, 1, 82,169, 20,137,137,137,
-230, 39, 79,158,116,141,142,142, 78, 85, 87,196,208,249,133,194,198,189,163, 41,152,230,199, 59,116,236,212,121,216,144,175,205,
- 28,108, 44, 32,150,169,240, 58, 89, 80,247,143,139,231,186,198,177,141,238,201,229,194, 17,185,175,238, 21,235,203,217,173, 91,
-247,206, 61,186,119, 55,179,176,180,128, 80, 36,199,155,164, 52,215, 27, 87,207,251, 50,153, 70,183, 41, 66, 49, 58,235,249,213,
-146, 79,121,108,102, 1, 76, 17,207,166,121,139,142,173, 30,247,154,184,166, 13, 77,211, 32,105,236,168,104,205,154, 5, 48,119,
-148,150,253,210,139, 15, 52, 77, 19, 4, 54,105, 91,179,122,187, 97, 45, 77,227,123,144, 32,122,215, 48, 76,169, 65, 47,128,107,
-105,109,237, 51,117,242,100,162,168,176, 16,209,209,209, 37, 21, 69,214,214, 58, 96,223, 38, 81,239,108, 74,237,197,246,191,212,
-154, 85,233,208,161,206,121,180,140,141,141, 43,157,110, 97, 97,129,110,221,186, 97,253,250,245, 76, 0,173, 43,204, 46, 95,100,
- 21,224,134,237, 89, 12, 11, 19, 46, 89,183,110, 93, 51,115,115,243, 15,230, 4, 0,208, 84,253,142,117,233, 47, 31,253,186,100,
-220,181,163, 91, 60, 69, 69, 5,172,138, 77, 76, 77, 77,209,184,113, 99, 44, 93,186, 84, 55,206, 15,199, 63,202,233,232,232,216,
-196,215,215,183,245,245, 91,183, 44,211,211,211,185,233,233,233,220, 43,215,175, 91,118,232,208,161,181,163,163, 99,147,178, 93,
-245,126,168,105,117,253, 92,189,107,215,174,229,103,207,158, 37,125,125,125, 97,101,101,133,110,221,186,225,226,197,139,204,205,
-155, 55,175, 3,176,180,166,126,146, 36,217,217,215,215,151, 0, 77, 35, 67,168,196,131,245, 77, 16,189,201, 3, 69, 18, 26,121,
-194, 66,136,197, 18, 24, 27, 27,243, 80, 58,220,171,235,182,119,236,208,161, 3, 1,160, 76, 92, 21, 21,149,126,138,139, 69,144,
-201,228,224,114,185,102, 0,120,186,114,210, 52,237,216,169, 83, 39, 0,128, 92, 46, 47,123,195, 43, 40, 40, 32,132, 66, 33,100,
- 50, 25, 88, 44, 22, 27, 53,251, 53,150,113,154,155, 48, 21, 76, 54,119,193,216, 25,129, 41, 99,103, 4,166, 48,217,220, 5, 50,
-179, 66,149, 46,211,204, 77,152,138, 79,124,126,218,145, 36,249,179,155,155, 91, 44, 73,146,135, 1, 56,126, 32,103, 91, 0,235,
-140,140,140,174,121,120,120,164, 24, 27, 27, 95, 87, 11,245, 14,181,228,228, 24, 27, 27, 95, 95,183,110,221,169, 39, 79,158, 12,
-251,243,207, 63,235, 63,123,246,108, 72, 80, 80,208,113, 83, 83,211,112,148,247, 75,212,251,218,172, 95,191,254,193, 7, 15, 30,
-180,237,216,177,227, 1, 0,220,143,116,189, 51, 0,180,132, 78, 21, 57, 62,201,113,119,106,213,170,149, 11,143,199, 67,143, 30,
- 61, 0,192,239, 67, 56,217,108,246,144,165, 75,151,186, 45, 91,182,140, 35, 16, 8,112,253,250,117, 60,124,248, 16, 74,165, 18,
-211,166, 77,227,142, 29, 59,182,129,153,153,217, 16,189,250,201, 52, 63, 62,123,206,220, 62,243,103, 77, 50,123,250, 78,142, 67,
-215,222,225,247, 8, 1,178, 74, 56, 24, 48,100,172, 69,239, 65,195,123,115,184, 22,199,245,229, 92,180,112, 97,159,201, 19, 2,
-204, 98, 4, 20,206,221,207,192,253,120, 33,148, 44, 75,244, 29,242,141, 85,139, 78,125,250, 49,193,250,229, 83, 31,163,253, 64,
-251,217,179,103,219, 45,216,116,228,174, 83,219,175,119,100,231,195, 87, 91,248,184, 3,150,214, 38, 38, 95,199,119,237, 58,201,
-168,180, 94,108,181,156,229,248, 90, 15, 10,206,202, 71, 23,109,255,172, 46,214,104,164, 30, 86,100, 92,249,121, 25, 73, 19,152,
- 53,202,169,220,125,160,210,126,222, 4,134,205,158, 59,151,101, 97,101,133, 93,187,118, 65, 42, 18,149,243,153,237,238,130, 62,
-215,140,153,169, 13, 60,156, 99,187,185, 18,225,255,193,247,149,201, 85, 90,180,194,194,194,232,254,253,251, 19, 0, 16, 26,139,
-252, 33, 77,177,113,248,183,235,150, 18, 36, 65,215,243,236, 24, 83,199,173,153,200,198,198, 6, 37, 37, 37,144, 74,165, 96,179,
-217,144, 72, 36,120,247,238, 29,238,223,191, 15, 43, 43, 43,189,122, 82, 88, 88, 8, 83, 83, 83,152,154,154,126, 20,206,197,227,
-122,112,223,164,100,115, 47,223,191,217,117,251,244,223,218,187,181,244,123,214,125,248,172,231,230,118, 78,146,103,207,158,225,
-222,189,123,200,207,207,135,143,143,207,127,229, 96, 62, 84,251,100, 61, 4, 96,213,176, 97, 67,231,203,215,110, 91, 21, 75, 40,
-243,164, 76, 5,139,162, 40, 24, 27,243,149, 39, 66,207, 9,135, 13, 25, 64,100,100,100,100, 1,120,168, 22,183, 53,213, 84,228,
- 1,104,226,239,239,191,104,250,244,233, 72, 72, 72,192,164, 73,147,196, 15, 31,100,113,178,147, 0, 0, 32, 0, 73, 68, 65, 84,
- 62,204,237,216,177,163,205,254,253,251,141,230,205,155,135, 91,183,110,173, 8, 11, 11, 59, 3, 32, 17, 64,165,181,218,104,154,
-102,179,217,108, 40,213,178, 65,174,162,202,244,125, 97, 97, 33,104,113, 62,216,108, 54, 3,128, 29,116,244,163,163, 40,138,205,
- 98,177,202, 68,214,187,204, 66,188,203, 42, 65, 97,177, 12, 98,177, 18, 50, 49, 13,134,177, 13, 19, 72,114, 0,144,164,171,117,
-132,199,227, 65,169, 84,162,168,168,180, 27, 26, 75,153, 76, 38,131, 80, 40, 4,131,193, 48, 5, 96, 14, 32, 79, 23, 66,181,147,
-251,239,234, 97, 64, 60, 58, 50,208,246,245,133,197,229,166,153,155, 48, 21,161,243,154, 50,108,156, 91,220,105, 57,236, 23,143,
-178,105,159,214, 63,139,107,103,103,119,227,212,169, 83, 77, 27, 53,106,132,196,196, 68,143,161, 67,135,250, 8, 4,130,150,208,
-191, 38,163, 49, 73,146, 27,199,142, 29, 59,125,228,200,145,132,187,187, 59,152, 76, 38,148, 74,165,115, 66, 66, 66,183,147, 39,
- 79, 46, 60,120,240,224,126,149, 74,245, 29,116,247,251, 35, 57, 28,206,137,189,123,247,118,241,241,241,193,225,195,135,241,240,
-225, 67,170,109,219,182,228,152, 49, 99,224,234,234,234, 51,102,204,152,223,165, 82,105,223, 90, 90,182, 92, 59,116,232,224,194,
- 96, 48,208,177, 99, 71,246,189,123,247, 90, 1,184,247,129,251,212,212,217,217,249,150,159,159, 95,203,107,215,174, 69,101,100,
-100,248,233,177,189, 0, 48,200,201,201, 41,200,194,194,194, 74,143,123,108, 73, 90, 90,218,247, 0, 66,117, 92,164,125,235,214,
-173,145,156,156,140, 38, 77,154,128,205,102,119,144,203,229, 83, 0,244, 1,240, 3,128, 88, 61,250,235,222,189,123,119, 23, 63,
- 63, 63, 34, 52, 52,180,204, 63,148, 36, 73, 40,149, 74,176,217,108,180,111,223,158,140,140,140,172,243,232,209, 35,119,232, 48,
-140,104,227,230, 55,160, 99,231,174,157,187,248, 52, 39, 55,135,190,134,138, 82,129, 65, 40,193, 36, 40, 80, 10, 46,184,108, 6,
-220, 61,219, 48,226, 95, 60,245,145, 73,229, 3,114, 95, 93, 59,175, 11,103,159, 94, 61,125,155, 54,113, 39,183,255,254, 6, 5,
-105,177,170,180,184,219, 57, 36,131, 68,211,214, 95,216,186, 55,107,201,104,233,227,199, 74, 79,124,209, 77, 34,233,210, 35, 63,
-225,246,181, 79,113, 65,174, 4, 24,206,117,108,191,238,223,211,143, 45, 72, 79, 23,157, 12, 61,255,188, 68,129,251, 0,112, 11,
- 32,250, 2,205,189,219,181,235,186,127,195, 6, 27, 62,159,207, 26, 61,114,164,114, 95, 84, 84, 20,170, 24,250, 93, 9, 48,108,
- 29, 29,123, 76,157, 58,149, 33, 72, 79,167, 79,158,190,240, 76,195,135,210,183, 20,239,230,206, 30,253, 33,138,215,107,152,114,
- 0,192,113,112,116,108, 58,101,202, 20,100,164,167,227,112, 72, 72,177, 4,136,208, 88,177,206, 49,176,179,153,155,227,248, 5,
-223, 12, 36, 92,248,182,152,186, 98, 95,135,110,242, 44, 55, 8,254, 58,254,218, 90,228, 51, 22, 89,147, 43, 21, 90, 21,241, 91,
- 44,150,155,177, 81,255,228,201, 99,100,118,145, 92,148,144,144, 0, 91, 91, 91,240,249,124, 88, 88, 88, 32, 38, 38, 6,215,175,
- 95,199,203,151, 47, 65, 81, 20, 90,180,104,161, 87,111,114,114,114,240,244,233, 83, 88, 89, 89,125, 52, 78, 55, 23, 59,124,235,
- 98,199,206,204, 45,100, 95,123,248,210,103,223,226, 33,205, 72,143, 33, 7,181,139,196,202,100, 50,252, 71, 80, 22, 93,232,226,
-226,210,233,208,161, 67,108,169, 18,102,238, 83, 34,126, 20, 73, 84, 38, 0, 96,194, 99,136, 34,131, 26,127,183,122,245,106,209,
-132, 9, 19, 60, 82, 82, 82,214,235, 96,235, 95,219,189,123,247,249, 52, 77,179,102,207,158, 13, 0, 24, 59,118,108,225,253,251,
-247,221, 1,100, 93,191,126,221,105,226,196,137,175,110,220,184, 97, 60,119,238, 92,134, 82,169,140, 97, 50,153,116, 88, 88,216,
- 42, 0,129,239, 61, 17, 73,242,113, 84, 84, 84, 61, 39,215,198,112,181, 33,225,187,244,101,233, 13,206,152, 66,106,210, 27,196,
- 61,123, 8, 71, 71, 71, 11, 62,159, 31,155,154,154, 42, 79, 75, 75, 91, 40, 18,137,118,215,208,199,232,200,200, 72,190,171,171,
- 43,138,139,139,145,154, 93,130, 89,167,141, 81, 40, 46, 53, 98,176, 32, 70, 75,151,198,102, 70,164,236, 97, 86, 86,150, 92, 38,
-147, 45, 19, 10,133,135,170,227,100,177, 88,185,207,158, 61, 51,173, 91,183, 46, 36, 18, 9,157,151,151, 71,136, 68, 34, 20, 21,
- 21, 17, 23, 46, 92,248, 74, 32, 16,180,173, 95,191, 62,225,236,236,188, 74, 32, 16,136,211,210,210, 38,233, 50, 52,169, 22, 76,
- 42, 38,147,185,121,242,228,201,195,206,156, 57,243, 56, 52,176,233, 32,173,225, 18, 11, 79, 79,207,203,205,155, 55,115, 10,217,
-228,189, 3,192,143,255,130,115,107,252,146, 37, 75,154, 90, 91, 91, 99,234,212,169, 88,185,114, 37,150, 47, 95,222,104,234,212,
-169,147, 1,108,213,131,199,200,209,209,241,209,246,237,219, 61, 58,117,234,132,139, 23, 47,226,216,177, 99,120,251,246,173,178,
-126,253,250, 76, 31, 31, 31,172, 88,177, 2,189,123,247,158, 52,115,230,204,174,233,233,233,173,116, 20, 31, 19, 86,172, 88, 49,
-168,115,231,206, 24, 55,110,156,244,230,205,155,195, 0, 92,185,122,245,234, 23,183,110,221, 10, 61,114,228,136,209,186,117,235,
-122,204,155, 55,111, 42,128,224, 90,108,255, 87, 93,186,148,214, 80,238,220,185, 51,130,130,130,122,127,160,208,226,216,216,216,
- 92, 56,124,248,112,203,198,141, 27, 99,244,232,209,173,134, 13, 27,118, 33, 63, 63,191, 39, 0,157,110, 72,117,234,212,217,120,
-246,236,217,134, 85,141, 44, 84, 6,169, 84,106,253,245,215, 95,111, 72, 74, 74,210, 75,104, 29, 61,122, 20,223,127,255, 61, 90,
-180,104,209,188,125,251,246,123,166, 76,153, 2,127,127,255,238, 49, 49, 49, 14, 40,141, 90,174, 17, 60, 30,175,249,136, 17, 35,
- 56, 15, 30, 60, 0, 0,120,122,122,162,101,203,150, 72, 78, 78,198,227,199,143, 33,149, 74,225,224,224,128,193,131, 7,243,146,
-146,146,154,231,228,228,212, 40,180, 72,174,241,248, 65,253,251,154,157,187, 47,128,138, 82,162, 77, 67,115,248,120,216, 35, 62,
-181, 16,145,177,169, 80,201,216, 48,183,182, 65,135,174,189,172, 51,210,222,142,207, 5,106,246,215,226, 26,143, 31, 60,168,159,
-233,185,136,116, 20,164,199,209,175, 31,158,185,174,144,136, 38, 1,192,227, 63,143,239,113,180, 49,234,233,222,186, 13,195,175,
-231, 64,171,211,199, 50,198,231,255, 51,181,253,222,195, 45, 23,236,117,101,229,140, 93, 16,224, 75,179,172,156, 31,154, 41, 20,
- 59, 53,243,122, 3,189, 22, 46, 89,210,254,155,201,147,121, 20, 69,225,200,175,191, 22, 62,141,138,138,159, 12, 80, 83,170,224,
-219, 9,184, 14, 27, 52,136,107,102,110,142, 57,179,102,193, 76,161,184, 81,182, 75,128,238,115,230,207,239, 52, 99,198, 12,163,
- 61,171,166, 63,238, 61,113, 77,107,138,166, 9,205, 48,229,209,234, 77,113,109, 39, 14, 26, 4, 51,115,115,204,158, 61, 27,132,
- 92,126,185, 76, 64, 49,113, 99,194, 87,190, 62, 1, 3, 58,131, 0,129, 99, 97,119,240, 58, 57,251,217, 13, 1,222,124,174,170,
-170, 2,170,244,209,170,118,232,176, 72,142,204,238,253,134, 8,220,221,221,139, 26, 53,106, 84,148,155,155,139,231,207,159, 35,
- 63, 63, 31,193,193,193,136,139,139, 3, 69, 81,181, 22, 48, 20, 69,225, 99,115, 2,128,131,141, 57, 70,247,109,199,148, 74, 68,
-188,236,236,236,114,195, 71,255, 33,161, 85, 6,165, 82,201,171, 95,191, 62, 72,128, 16,150, 40, 76, 51,142,118, 33, 50,142,118,
- 33,132, 37, 10, 83,153, 76, 70,154,154,154, 66, 42,149,242,116,160, 98,125,249,229,151,243,207,156, 57,195, 90,187,118, 45,188,
-188,188, 32,151,203,113,255,254,253, 84, 0, 89,234, 54,233,183,111,223, 78,215, 8,225,245,235,215,227,244,233,211, 68,143, 30,
- 61, 22, 86,118, 62, 9, 4,130,141, 83,166, 76,201, 43, 41,202,195,222,225, 98,132,142,206,198,207,131,222, 98,164,205, 41,228,
-101,190,195,190,125,251,112,245,234, 53,226,202,149,171,236,155, 55,111,154,244,235,215,111, 71,157, 58,117,194,170,235,100,122,
-122,250,218, 25, 51,102, 20, 20, 21, 21,161,168,168, 8, 98,177, 4,121, 34,224,217,150,166,120,182,165, 41, 36,148, 17,118,237,
-220, 77, 62,123,246,204,246,237,219,183, 78, 3, 6, 12,216,194,231,243, 15, 86,199,153,150,150,246,224,219,111,191,149, 20, 22,
- 22, 66, 38,147,201, 85, 42,149, 76, 44, 22, 43,142, 31, 63, 62,215,198,198,166,195,197,139, 23, 89, 87,175, 94, 99,222,188,121,
-139,125,253,250,117,139,110,221,186,157,112,112,112,248, 69, 23, 75, 25,131,193,216, 22, 18, 18, 50,126,215,174, 93, 14, 62, 62,
- 62,205, 42, 12, 69,241,123,246,236, 89,239,215, 95,127,173, 19, 20, 20,180, 16,165, 1, 40,159, 20,182,182,182, 51, 7, 13, 26,
-132, 93,187,118,225,252,249,243,243,118,236,216,129, 47,191,252, 18, 78, 78, 78,223, 66,247, 97, 47, 0,248,113,235,214,173, 30,
- 30, 30, 30, 24, 59,118,172,108,210,164, 73,223, 29, 58,116,168,126,120,120, 56,251,151, 95,126,169, 55,117,234,212,217, 1, 1,
- 1,146, 6, 13, 26, 32, 56, 56,184, 33, 73,146,219,116,186,190, 29, 28,230,142, 28, 57, 18,155, 54,109,194,205,155, 55,135,160,
-244,129, 42, 3,112,233,238,221,187, 3,214,173, 91,135, 33, 67,134,192,217,217,121,118,109, 44, 79, 77,155, 54, 93,214,167, 79,
- 31,132,135,135,163, 85,171, 86,232,208,161,195, 60, 0,182,181,220,157,164,169,169,233,137, 67,135, 14,249,214,171, 87, 15,107,
-214,172,129,155,155, 27, 14, 30, 60,232,107, 98, 98,114, 2, 58,186,111, 88, 88, 88,152, 26, 27, 27, 99,225,194,133,244,144, 33,
- 67,242,106,250,204,155, 55,143,230,114,185,176,178,178,210, 53,240,197,136,199,227,117,244,242,242,194,253,251,247,113,245,234,
- 85, 44, 93,186, 20,115,231,206, 69,118,118, 54, 70,140, 24, 97, 12,192, 95,143,237,182,183,179,179, 67, 97, 97,105, 93,120, 47,
- 47, 47, 60,121,242, 4,217,217,217,112,118,118, 70, 70, 70, 6,108,108,108,208,184,113, 99, 80, 20,101,175, 27, 37,237,101,107,
-109,129,172,124, 41,152, 80,162,181,187, 45,110, 60,207,197,187,108, 25,236,109, 44,145,145,149,141, 58, 54, 60,184,184,212, 5,
- 77, 83, 94, 58, 41, 96, 6,217,154,203, 51, 66, 94,145, 28,105,177, 55,115,229, 42,233,148,130,196,187, 41, 5,137,119, 83,228,
- 82,201,148,199,119,174,230,214,115, 48,130,139,139, 11, 8,154,106,247, 41,174,199,161,117,225, 98, 98,196, 28,123,245,231,101,
- 68,216,254,197,132, 52,247, 93,219, 62, 14,165,150,101, 59,160,254,208, 17, 35, 58,126,247,221,119,188,204,204, 76, 42, 96,248,
-240,188,181,129,129,215,254,168,225,197,160, 24,104,212,179,103, 79,144, 0,254,184,114, 69,148, 1,164, 2,128, 3,224, 50,240,
-235,175,187, 44, 89,180,200, 40, 39, 55,151,186,159, 80,124, 46, 46,139, 30,108,173, 66,125, 93,252,179, 84,128,183,134,247,242,
-229,203,180, 24,120, 12, 0,126, 46,248,182, 87, 39, 79,159, 49,131,186, 64,144,149,143,217,107,127,198,158,147,183, 46, 91, 40,
-232, 47,254, 67,143,226,201,181, 18, 90,234,161,159,247,166,149,148,188, 63,122,240,161, 2,230,239,224,172, 12,255, 69,161,165,
-129, 66, 81, 58, 74, 34, 83, 80,144, 41, 40,205, 91, 45,196, 98,177,206, 20,151, 47, 95, 62, 60,107,214, 44,108,217,178, 5,175,
- 94,189, 2,155,205,134,151,151, 23, 31,128,169,230,158,223,186,117,107,123,146, 36, 17, 31, 31,143,205,155, 55, 99,194,132, 9,
-244,189,123,247, 14,162,242,124, 41, 79,242,242,242,118, 78,153, 52,161, 32, 63,243, 29, 20,226,124,100,165,189,129, 84, 84,128,
- 53,235, 55,162, 68,193, 68,134, 80,142, 12,161, 28, 36,215, 26,123,246, 31, 98, 52,109,218,180, 15,131,193,232, 95, 77, 63,239,
-103,102,102,238,159, 54,109, 90, 65, 70, 70, 70,217,246,201, 20, 52,100,138,242,231,171,177,177, 49,182,109,219,102,225,238,238,
- 62,136,201,100,118,171,134, 83,144,146,146, 18, 55,109,218, 52, 89,102,102, 38,132, 66, 33,206,157, 59, 55,160, 94,189,122, 86,
- 27,126,220, 66,136,228, 76,100, 20,200,145, 81, 32, 7,199,212, 30, 39, 66,207, 48, 26, 55,110, 28,192,100, 50, 59,212, 36,178,
-142, 28, 57, 50,102,248,240,225,102, 63,254,248, 99,222,217,179,103,119, 1,208, 62, 32,241,219,182,109, 59,121,226,196,137,162,
-249,243,231, 91, 7, 5, 5,205,251,196, 98,171,219,240,225,195,155, 80, 20,133, 83,167, 78, 61, 3,176,245,204,153, 51,143,164,
- 82, 41, 70,140, 24, 81, 95, 61,140,164, 11,218, 6, 4, 4, 76,247,245,245,197,156, 57,115,228,215,174, 93,107, 13, 96, 11, 74,
-135,114,105, 0,201, 0,118,220,186,117,171,197,204,153, 51,165,237,218,181,195,184,113,227, 38, 0,240,173,129,183,227,200,145,
- 35, 61, 40,138,194,241,227,199,159, 2,184, 88, 97,254,245,208,208,208,251, 50,153, 12,163, 70,141,106, 0, 64,159, 27, 57,155,
-203,229,158, 90,189,122,181,101, 90, 90, 26,198,140, 25, 35,141,143,143, 71, 96, 96,160,145,133,133,197, 69,173,107, 64,103,112,
-185,220,125, 63,253,244,211, 32,111,111,111, 76,155, 54, 77,182,123,247,238, 89,211,167, 79,151,181,110,221, 26,187,118,237, 26,
-196,225,112,244, 42, 45,146,158,158, 94, 16, 27, 27,107, 83,211, 39, 53, 53, 85,215,240,124, 99, 83, 83,211, 8, 79, 79,207, 66,
- 47, 47,175, 54, 74,165, 18, 49, 49, 49,111, 14, 31, 62, 76,121,121,121, 97,231,206,157, 8, 10, 10, 66,255,254,253,193, 96, 48,
-116, 22, 90, 12, 6, 3,114,185, 28,198,198,198, 96, 50,153,120,243,230,141, 38,181, 12,216,108, 54, 0,192,196,196, 4, 70, 70,
- 70, 32, 73, 82,167,104, 52,130, 0, 93, 88,162, 0,139, 69,130, 73, 82,136, 75, 22, 66,174,160,192, 99, 51,192, 98, 18, 0, 77,
-193,210,132, 5, 30,135, 1,146, 32, 40, 29, 57, 33, 20,201,193, 97,147, 96,177, 57, 4,169, 84, 25,149, 61, 28,153, 42, 35, 35,
- 35, 14, 97,107,206, 5,143,253, 47, 42, 11, 76,148, 58,150,143, 7, 88, 38,117,235, 14,219,180,121, 51,167,176,184, 24, 67,134,
- 12,201, 75,122,244, 40, 68, 12, 60,234, 90, 67,144, 18,201,100,186,251,117,237,138,200,168, 40, 20,229,231,191, 6, 74,157,227,
- 57, 78, 78,195,183,109,219,198, 17, 75, 36, 24, 50,120,112,193,171, 59,119,142,164, 20, 35,236,120,114,169, 16,171,241,184,179,
-217,142, 26, 94, 97,126,126, 62, 80,154, 66,194,193,206,116,195,140,128,222, 40, 42,145, 96,193,198, 16, 42, 42, 78,240,109,120,
- 42,250,157, 73,135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116, 1,244,161,156,149,
-137,196, 15,229,252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245, 38,220,177, 0, 0,107, 83,166, 80,
-174, 82, 80,233,233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161, 67, 68, 72, 72,136,
-213,200,145, 35, 19, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209, 27,165, 41, 51,170,
-204,227,146,153,153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,200,105,180, 93,146,
- 92, 22,137,104,110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5, 5, 5,225,175, 94,
-189,218, 98,225,220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,236,108, 76,159, 62,
-221, 42, 33, 33, 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38, 38, 38,109, 35, 34,
- 34, 8,137,140, 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,122,163, 64, 32,232,
- 92,233,205,140, 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17,163, 70,141,122, 14,192,107,254,252,
-249,214, 52, 77,207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,242,243,243,183, 1,
- 64, 97, 97,225,214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47, 71,140, 24,129, 75,
-151, 46,225,207, 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,200,145, 35,241,243,207, 63,247, 1, 80,
-157,131,108,207,222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,187,119,111,172, 95,
-191,190, 39,128,235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,247,153, 63,127,254,
-249, 99,199,142,153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222, 60,209,207,207, 15,
-243,230,205, 83, 94,190,124,121, 32,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,166,137,179,103,207,
-206,166, 40,234, 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255, 53, 34, 34,226,118,
-163, 70,141, 86,203,100,178,243, 38, 38, 38, 99,205,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,159, 94,102, 98, 98,
-162,165,133,133, 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,205, 70,102,102, 38,
-180,172,229, 53,136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,200,200, 16,160,101,
- 19,103, 16, 4,129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251, 94, 54, 17,127,100,
-135,152, 55,232, 52,153,201, 32, 24, 28,174,233,222,137,227,198,217, 82, 20,141,130,220, 76, 48, 73,242,225,167, 56, 64,167,222,
- 33,165,171, 27,239, 73,175,137,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,218,216,218, 34, 32,
- 32,128,202, 77, 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226, 32,224, 17,180, 96,
-129,141,189,163, 35, 38, 76,156, 72,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230, 21, 48, 48,107,254,
- 64, 95,174,137, 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114, 62, 43,117,170, 54,
-174, 86,172,240,120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56, 37, 37, 37,110,226,
-196,137,114,165, 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,209,142, 29, 59, 20,
- 41, 41, 41,113,218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,123,145, 72,212,234,
-249,243,231,214, 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,200,104,156,156,156,
-220,208,210,210, 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,226,252, 98, 70, 70,
-134, 59,101,213,164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,236,236,108,100,103,
-103,131, 32, 8, 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160, 1,100, 20, 40, 16,
-189,201, 3,209,155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,244, 29, 62,124,184,
- 25, 0,168, 5, 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,231, 19, 3,192,140,
- 73,147, 38,181,225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60, 1,204, 67, 21,153,
-160,203, 76, 67,108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,224,241,120,109,107,
-104, 91,223,197,197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,168, 87,175, 94,207,
-110,220,184,209,182, 99,199,142,152, 56,113,162,236,193,131, 7,125, 1,220,126,242,228, 73,183, 81,163, 70,137,220,221,221,113,
-235,214, 45,143, 81,163, 70,221, 35, 73,114,141, 14,156, 19, 86,173, 90,181,248,171,175,190,194,170, 85,171,232,147, 39, 79, 6,
- 0,184,162,158,119,249,248,241,227, 99,214,174, 93, 75, 15, 30, 60, 24, 43, 87,174, 92, 12, 96, 90,117,100, 34,145, 72,168, 82,
-169, 32, 18,137,116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159, 63, 79, 3, 8, 3,
- 16, 46,147,201,186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,122,244,168,212,194,
-194, 2,174,174,174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7, 14, 28,144, 20, 21,
- 21,233,148,147, 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,103,164,163,117,211,
-186,232,218,186, 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,173,204,216,104,220,
-196, 19,163, 38,206,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,184, 20,118, 38, 95,
- 88, 88,120,232, 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,128,130,193,240,232,
-251,229,151, 72, 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,238,148, 64,147,126,
-253,250, 33, 59, 39, 7, 71,143, 28,201,190, 4, 68,233,211,207, 1, 0,199,216,168,212, 32, 40, 20, 10, 65, 0,133, 0, 64, 48,
-209,183,157, 87, 35,100,231, 21,226,198,195,184,226,122, 98, 76,175,142,231, 51,118,132,175,157,143, 22,128,156,121,243,230,129,
-203,229,130,207,231,151,137, 35,141, 88,225,112, 56,224,243,249, 80, 42,149, 56,126,252, 56, 0,228, 84,251,134, 7, 72, 7, 78,
- 91, 79, 73, 21,116, 9,139,197,250, 40,156,234, 55, 71,233,144, 5, 63, 83,127,220,171, 60, 40,166, 54,156,159, 1,218,169,115,
- 98,181, 3,144,159,148,148,148, 58,108,200, 64, 97,114,194,139, 12, 81, 65,186,160, 48, 55, 69,144,242,246,121,198,146,133,243,
-132,169,169,169, 41, 40,205,165,213, 46, 61, 61, 93,179,140, 46,152, 55,108,216,176,159, 38, 77,154, 68, 71, 71, 71, 3, 0, 34,
- 35, 35, 49,110,220, 56,122,204,152, 49,219, 0, 44,170, 69,191, 69, 98,177,184,156, 53, 68,174,162,202,134,252, 10, 11, 11,145,
-158,158, 14,153, 76,166,179, 34,126,117,121,211,203,188,164,199, 10, 79, 87, 19,120,186,154,192,195,197, 24,132,178,184, 76,100,
-101,103,103,107,222,156, 37,122,244,179, 80, 42,149,150,235,167,246,208,100, 97, 97, 33, 50, 50, 50,160, 82,169,170,122,144, 81,
-105,105,105,151, 79,156, 56, 81, 4, 0, 63,254,248, 99, 30, 65, 16,127, 18, 4,241, 83, 37,159, 61, 76, 38,243,174,166,237,166,
- 77,155,242,240,254,144,216,223,137,175,188,189,189,243, 23, 47, 94,188,115,246,236,217,216,179,103, 15, 4, 2,193, 34,252,149,
-139,135,202,201,201, 89,176,107,215, 46,140, 31, 63, 30,203,151, 47,223,212,170, 85,171, 66, 0,163,170, 34,180,179,179,115,102,
- 50,153,136,138,138, 42, 4,240,166,134,245,103, 68, 69, 69,101, 18, 4, 1, 62,159,239, 86, 93, 67,107,107,235,134,102,102,102,
- 72, 75, 75, 3,212,111,204,149, 32, 41, 61, 61,157,230,112, 56,112,114,114,106, 84,211,198, 91, 89, 89, 45, 56,112,224, 0,243,
-197,139, 23,232,222,189,123,234,173, 91,183,122, 2,208,132,164, 71, 69, 70, 70,250,118,235,214,237,229,213,171, 87,177,113,227,
- 70,162, 69,139, 22,211,106,226,116,117,117,157, 58, 97,194, 4, 4, 7, 7, 99,239,222,189,211, 0,156,170,208,228,216,174, 93,
-187,102,237,221,187, 23, 19, 39, 78, 68,253,250,245, 71, 85,199,151,156,156,188,208,207,207, 47,242,213,171, 87, 58, 85, 60,208,
-177,125, 55, 31, 31,159,134, 98,177, 24,135, 14, 29,122,211,176, 97,195, 71,167, 78,157,154,135,247, 31,216,191,159, 62,125, 26,
-163, 71,143, 70,139, 22, 45, 14, 1, 24,169,203,101, 25, 27, 27,155,114,253,250,117,138,205,102,227,127,236,157,119,120, 20, 85,
-219,198,239,217,222,119,211, 59, 9,161,165,210, 2,132, 94, 2, 33, 8,132, 80, 68, 17, 65, 84, 20,145, 34, 10, 40, 22,192, 6,
-130,116, 65,164,136,133, 23, 1, 65,145, 22,154,128,130,116, 18, 32, 36,144, 4, 72,175,155, 94, 54,219,119,230,124,127,144, 96,
-136, 41,187, 9,126,130,206,239,186,230,218,228,204,206,189,103,218,217,123,159,115,206, 51, 62, 62, 62,136,140,140,196,243,207,
- 63,143,206,157, 59,195,100, 50, 97,223,190,125, 76,124,124,124,182,209,104,180, 42,151, 82,241,157,223, 15,165,165, 37,159,191,
-118,249,172,153,199,229,192,219,221, 1, 99,195,187,226,149,241,125,209, 45,192, 19, 25, 5, 58,156, 62,253,171, 57, 45, 45,229,
-162, 53, 51, 14,107, 52, 19,111,197, 93, 72,184,118,206,194,231, 81, 8,240,239,128,133,239,191, 99,191,244,195, 5,118, 29,218,
-122, 35, 46,181, 28,191,158, 56,106,206,205,206,250,237,159,154,113,120, 6, 16,200, 69,148,140,203,225,128,230,136,170,184,213,
- 19,105, 58, 6, 5,249,185,186,185, 33, 58, 58, 26, 28, 27,102,132,158, 1, 4,114,249,253, 94,112,141, 70,131, 26,189,118,254,
-254,254,222, 62, 62, 56, 18, 29, 13, 46,195,220, 30,104, 99,130,209,164,251,221,208, 15,116, 41, 64, 63,163, 21, 20,237, 90,185,
-248,219,171,100,184, 28,119, 23, 6, 51,185,242, 67, 41,254,209,124,100,127, 35,211,208,204,174,195,149,155, 55,111, 14,221,182,
-109,219,208,185,115,231,202,167, 76,153, 2,177, 88, 12,173, 86, 11, 47, 47, 47,208, 52,141, 99,199,142, 33, 38, 38, 70,195, 48,
-204,175,248,107,218,128,112,212,154,165,113, 60, 5,146,251,126, 75, 27,122,224,153,103, 30,137, 38, 0,200,239, 50,202,226,214,
-198, 29,235,247,158, 27,183,243,248, 53,234,205,137, 3, 57,221,252, 91, 1, 0, 92, 93, 93,161, 84, 42,109,214,124, 4,252,237,
-154,181,187,117,243,243,243,147,242,243,243, 11, 94,125,245,213,128,154,129,239, 34,145, 72, 95, 29,201, 42,173,111, 27, 43,234,
-105, 2, 48, 99,219,182,109, 7,203,203,203,143,191,253,246,219, 88,186,116, 41, 14, 29, 58,212, 31,192,249,102,238, 59, 93, 90,
- 90, 90,118,229,202, 21,215,246,129, 33,104,227,194,199,128, 69,119, 64, 8,129,163,148,160,178,172, 4,215,175, 95, 67,101,101,
-229,101, 91,234,105, 50,153,202, 10, 10, 10,156, 92, 92, 92, 80, 82, 82,130,162,162,162, 7, 38,171,180,180, 20, 37, 37, 37,132,
-162,254,146,179,165, 49,205,170,130,130, 2,109, 98, 98,162,208,181, 85,123,180,117, 17,160,231,251, 73, 0, 33,240,118,224,160,
-178,162, 12, 23, 47, 94, 68,121,121,249,239, 13,105, 50, 12, 51,111,210,164, 73, 92, 0, 47,188,253,246,219, 14, 0,186,188,243,
-206, 59,191,162,206,204, 66, 30,143,183,118,199,142, 29, 29,107,186, 24, 23, 44, 88,176, 6,192,182,255,175,107,201,209,209,113,
- 94,116,116,180,194,100, 50, 97,253,250,245, 88,179,102,205, 55,248,107,162,202,232, 47,191,252,114, 35,135,195,153, 57,107,214,
- 44,188,246,218,107,210,238,221,187,207,205,203,203,251,161, 62,205,156,156,156,133,221,186,117, 91, 92, 80, 80,240,153, 85,102,
-249,206,157,105,221,186,117, 91, 88, 80, 80,176,162,177,115, 36,147,201,100, 52, 77, 35, 45, 45,173, 20,104,112,124,135, 62, 45,
- 45, 45,135,166,105, 47,169, 84,234,208,212,245, 89, 90, 90,250, 89,247,238,221, 63, 82,171,213, 39, 0, 44,169,199,144,223,200,
-203,203, 11,158, 51,103,206,236,229,203,151,143,203,207,207,223,221,148,102, 70, 70,198,103, 97, 97, 97,139,146,147,147,191, 71,
-195, 93,192, 95,126,252,241,199,166, 29, 59,118,188,158,150,150,182,172, 9,205,195, 69, 69, 69,135,109, 56,191, 13,189,255,129,
- 38,151,203,125,103,249,242,229,156,205,155, 55,131, 16,178,138,166,233,134,234, 25,183,127,255,254,237,125,251,246,157,178,119,
-239, 94,113,112,112,240,107, 6,131, 97, 87, 83,215,167, 86,171,221,183,119,239,222,113,113,113,113, 94, 83,166, 76, 17,251,249,
-249,193,100, 50, 33, 47, 47, 15,155, 55,111,214,199,199,199,103,151,149,149,237,179,165, 13,177, 24, 43, 38, 94, 56,125, 96, 87,
-250,157,248,222,131,158, 26,109,111, 52,121, 65, 84,204, 69, 89,113, 62,142, 29,222, 87,154,150,150,114, 81,171, 45,155,104,139,
-166,201, 80,254,220,197,223, 14,238,206, 78, 75,236, 53, 32,108,132,189,222,232, 3,145,128,131, 98,117, 14,142, 69, 31, 40, 73,
- 75, 75,253, 67,111, 54,188,248, 79,181,243, 92, 95, 44,225,230,199,188, 58,125, 84, 87, 72,236,189,174,243,129,245,125, 1,137,
-147,171,171,160,250,222,129,252,254,152, 71,171, 52,213,128,176,125,117, 47,149, 86,171, 5, 31, 48,190, 4,240,157,157,157, 37,
- 0,144,156,156, 12,233,253, 94, 13,155,234,169, 1,100,210, 90,186, 28, 64, 91,204,131,103, 59,165,140, 2,128,236,252, 98, 24,
-205,141,126,111, 60,233,108,173,101,184,182, 54, 71, 64, 0, 32, 92, 46,151, 47, 93,188,120,241,170,203,151, 47,175,138,140,140,
- 92, 37, 18,137,150, 86, 31,108, 65, 35, 39,226,255, 77,179,135, 7, 28,194,218, 82,103, 35,218, 81,204,244,254,246,244,139, 61,
-101,198,193,131, 7,111,108, 97, 61, 91,114,179,252,157,154, 7,204,102, 51,193,253,110,187, 3,104,184, 75,240,189, 90,235,243,
- 51, 51, 51, 73,245,223,182,212,211,105,194,132, 9, 76,101,101, 37,121,246,217,103, 9,154,126,132, 79,163,154, 34,145, 40,108,
-192,128, 1,102,117, 97, 9, 73, 74,205, 33,151, 98,111,145,227,167, 47,144,221,251,162,201,134,141, 91, 72,231,206,157,141, 0,
-124,108,209,228,241,120,131,195,194,194,138,213,106, 53, 73, 76, 76, 36,103,207,158, 37, 63,253,244, 19,217,178,101, 11,217,180,
-105, 19,105,213,170,149, 26,128,171, 45,154, 18,137,100,244,240,225,195,205,101, 21, 90,146,150, 83, 76,110, 38,166,145,243, 87,
-110,146, 99,167,207,147, 31,118,237, 37, 65, 65, 65,122, 43, 52,185, 92, 46,119,195,238,221,187, 43, 8, 33,100,244,232,209,217,
-120, 56,145,106,155,121,243,230, 21, 16, 66,200,138, 21, 43,138, 81,255, 64,248,191,251, 90,122,202,211,211, 51, 73, 32, 16, 68,
- 3,120,161,137,237,158,227,241,120,135,220,220,220,174, 2, 24,251, 15,220, 71,145, 46, 46, 46,151, 0, 52,245,132,131,154,247,
-141,249,151,220,239,127,135,230, 96, 30,143,119, 22,104,252, 33,194,181,218,235, 79,185, 92,238, 17, 0, 67,108,172,103, 7, 39,
- 39,167,103,237,237,237,223,180,183,183,127,211,197,197,229, 89,161, 80,216,161, 37,251,238,216, 33,124,148,119, 72,212,254, 86,
- 93, 70,102,120,119,141,204,240,237, 54,122,191, 99,135,240, 81, 45,213,244,233, 54,250,128,119,215,200, 76,239,174,163,210,219,
-244, 24,189,223,201, 63,124,248, 63,121,142, 94,240,132,199,208, 54,176,144,179,139, 8, 57,187,136,132,183, 1,211,219, 14, 65,
-161,128, 98, 88,120,248,106, 66,211,171,199,141, 25,179,186, 61,224, 72, 0,110,221,165, 62,205, 16, 64,249, 96,219,209,163, 87,
-183, 5,156,134, 2,210,129,253,251,175, 34, 52,189,122,210,115,207,173,246, 6,220,234,211,107, 72,147, 0, 92, 79,192,163,182,
-174, 19,208,110,188, 47,130,223, 27,229, 75,200,217, 69,228,227,103,252, 72, 55, 87,188,208,132,102, 67,145,162, 39, 54,162, 85,
-223, 88,241,166,144, 85, 55,174,203,170, 95,101,143,224, 34,124,228,154,189,220,225, 23,222,142, 74, 28,225,207, 43,193,253, 41,
-201,178,127, 97, 35,249,189,209,104, 36,122,189,158,104,181, 90,162,209,104,234, 26,168, 7,134, 44, 55, 55,151,100,103,103,147,
-204,204, 76,146,158,158, 78,240,231,216, 27,171,235,169, 84, 42,183, 61,243,204, 51, 52,159,207,223,240, 40,246,221,193,193, 97,
- 89,207,158, 61, 77, 95,124,241, 5,217,191,127, 63,249,250,235,175,201,172, 89,179, 72,199,142, 29, 13,118,118,118, 19,155,163,
-233,230,230,182,208,223,223,191,248,155,111,190, 33, 63,252,240, 3, 89,183,110, 29,249,224,131, 15,104, 47, 47,175,124,133, 66,
- 49,172, 57,154, 46, 46, 46, 91,251,245,235,103,218,186,117, 43,249,245,215, 95,201,206,157, 59,201,188,121,243, 72, 64, 64,128,
- 65, 38,147, 61,109,165, 38,151,199,227,173,158, 62,125,122,190,135,135, 71,116,157,117,210,160,160,160,171,147, 38, 77,202, 5,
-176,224, 95,116,125,178,154,172, 38,171,249, 55, 24,173,231, 61,224, 73, 0,174, 84, 32,120,110, 96,255,254,171, 4,192,115,182,
-154, 34, 49,151, 59,190,111,207,158,171, 4,192,196,154,247,138,185,220,241, 3,251,247, 95,197,231,114, 39, 55,164,215,152, 38,
- 1,184, 2, 30,111, 65,223,222,189, 87,243,128,247,107,202, 6,183,161,110,207,123,170, 21,233,239, 67,221,157,236, 2,233,191,
-216,104,213, 75,115,140,214,131, 0,194,223,112, 17, 62, 41,154,143,203, 77,221,190,218, 48, 29,176, 33,162,117, 0,247,159,162,
-222,190,153,245,148, 60,226,125,239,228,228,228,116,180,125,251,246,133,173, 91,183,206,181,183,183,223, 5,192,171,133,154,193,
-110,110,110,255,115,117,117,189,227,238,238, 30,231,228,228,180, 22,247,179,206, 55, 91,147,207,231,247,116,117,117,253,221,215,
-215,183,204,199,199, 71,237,228,228,180,187,158, 72,150, 53,154,238,168,191, 81, 17, 84,175, 99,191,116, 88, 77, 86,147,213,124,
-200,192, 68,180,197,242,161,109, 96, 25,218, 6,116,132, 47,214,214, 54, 40,145,128,164,185,166,232, 69, 64, 84,247,253, 77,233,
- 53,165, 73, 0,110, 31, 64, 94,119,155, 17, 94, 8,178, 82,243, 73,143,104,213,180,243, 15, 69,180,120,205, 20,180,252, 13,149,
-124, 82, 52, 31, 23,238,162,145,193,200,181, 88,246, 8, 63, 83,247,136,247,225,102, 81, 81,209,240,162,162, 71, 58, 55, 33, 33,
- 63, 63,255,133, 71, 41,104, 54,155, 47,171,213,234, 65,143, 64,170,161,169,215, 38, 88, 57, 45,155,133,133,229,191, 3, 5,208,
- 72,193,187,225, 29,176,158, 71,131,115, 44, 21, 57,117,166,228,233,168,230,104,222,135,254,190,158, 54,158,106,110, 61,255, 68,
-243, 23,141,108,220,162,254, 59,167, 45, 15,247,199,104, 89,159, 71,139,133,133,133,133,133,133,229,159,227,228, 29,246,135,216,
- 19, 64, 52, 30,142,190, 69,215, 50,162, 13,134, 62,109,153, 73,209,156,240,233, 73, 86,147,213,100, 53, 89, 77, 86,147,213,100,
- 53,255,115,154, 53, 52,244,236,212,164, 58,255, 55,107, 22,223,227, 64, 75,198,104,253,157, 6,140,213,100, 53, 89, 77, 86,147,
-213,100, 53, 89,205,255,158,230,147, 76,131,179, 14,217,174, 67, 22, 22, 22, 22, 22, 22, 22,150,150,209, 96,212,141, 53, 90, 44,
- 44, 44, 44, 44, 44, 44, 44, 45,195, 29,247, 31, 81, 21,141, 63, 31, 85,181, 21,104,250, 17, 60, 15,177,124,249,114, 78,251,246,
-237,229, 66,161,176, 99, 74, 74, 10,103,198,140, 25, 45,158, 72,176,106,237, 6,142,143,143,143, 28, 64,199,226,210, 74,206,203,
-175,188, 77,177,231,139,133,133,133,133,133,133,229, 9, 98,100,181,177,170,121,125, 16,225,178, 41,162,181,100,201, 18,152,205,
-102, 25,128, 9,193,193,193,159,234,245,122,253,158, 61,123,168,234,108,225,205,226,253, 5,243, 96, 50,153,100, 0, 38,184, 56,
-217,125, 74,211,180,126,239,161,115,212, 51,163,250, 17,246,188,177,176,176,176,176,176,176, 60, 33, 76,171,243,186,213,102,163,
-197,227,241,184, 28, 14,167,173,217,108, 30, 46, 22,139, 79,232,245,250,179, 45, 49, 89, 53,154, 20,135,211,214, 98, 54, 15, 23,
-137,196, 39,180,218,170,179,172,201, 98, 97, 97, 97, 97, 97, 97,121,130,176,110,102,228,225,195,135, 27, 52, 56, 66,161,144, 19,
- 28, 28,220,207,199,199,231,124, 96, 96,160,209,203,203,235, 39,169, 84, 42,107, 97,197, 56,237,253, 2,250,121,184,187,158,239,
-218,214,221,232,226,226,242, 19,159,207,151,177,231,139,133,133,133,133,133,229,191, 73, 99, 94,228, 49,166,102,166,225, 67, 79,
-249, 32,132,216, 52, 70,171,139, 90,173,222, 56,102,204,152, 94,115,230,204, 17,112,185,220, 86, 50,153,172,163,147,147,211, 67,
- 81,177,151, 94,122,137,178, 73, 51, 63,111,227,210,241, 93,122,157,127,191,135,128,207, 69, 43,153, 76,214, 81,169, 84, 62,164,
-233, 61, 87, 77, 0, 0, 32, 0, 73, 68, 65, 84, 57,233,229,215,216,113, 91, 44, 44, 44, 44, 44, 44, 44,143, 43, 53,227,178, 70,
-214, 50, 93, 0,154,232, 58,236,209,163,135, 40, 43, 43,171,171, 78,167,115, 17, 8, 4, 11,162,162,162,130,199,141, 27,135,235,
-215,175,211,193,193,193, 30,197,197,197,179, 75, 75, 75, 79, 86, 85, 85, 93,103, 24, 38, 88, 36, 18,157,222,181,107,151, 28,192,
-157,134, 52, 59,117,233, 46,202,202, 72,125,160, 57,125,252,224,224, 23,230, 14, 7,115,116, 61, 61,184,179,183, 71, 70,145,118,
-118, 65,113,249, 73,109,149,230, 58,205,144, 96,145, 72,116,250,135,111,183, 52,170,201,194,194,194,194,194,194,194,242, 15, 82,
- 99,172,162, 81,231,145,106, 60,224,126,152, 46, 50, 50,242,161,168,145, 80, 40,252, 42, 57, 57,185,175,131,131, 67, 91, 62,159,
- 79, 63,247,220,115,162, 73,147, 38,161,176,176,144,209,104, 52,220,144,144, 16,215,171, 87,175, 14,183, 88, 44,253,237,236,236,
-180,101,101,101, 78, 6,131,225, 46,128,217,141, 84,228,171, 59, 73,241,125, 29,237, 29,218, 10,249, 92,122,214,212, 73,162,247,
- 23, 60, 5,202, 16,203,208, 5,197,220, 79,187,217,185,174,189, 80, 53, 60,217, 68,247,175, 82,137,181,249,229, 6,107, 52, 89,
- 88, 88, 88, 88, 88, 88,158,112,234,243, 34, 79, 16, 77,230,209, 26, 84,221, 39, 90,251,193,185,219,157,157,157,221,228,114,121,
-224,180,105,211, 56, 78, 78, 78,136,137,137, 97,170,170,170, 56,124, 62, 31,124, 62,159, 59,120,240, 96,185,197, 98,145, 30, 57,
-114,132,186,119,239, 94,161,217,108,254,180,184,184,248,106, 35, 21,217,222,206, 78,228, 38,177, 19, 6, 30,122,123, 0,199,185,
-125, 49,112,252, 99,134,104, 10, 56, 60,134,192, 73,198,112, 87,247,167,228,249, 42, 95,233,172,221,133,212, 31,247,202, 10,205,
-102,243,167,149,149,149, 87,217, 75,144,133,133,133,133,133,229, 95, 77,125, 94,228, 73,161,118, 30,173,135, 34, 90, 13, 58, 71,
- 87, 87, 87, 74,175,215,187,249,250,250, 78,115,118,118,158, 44,149, 74, 93, 7, 12, 24, 32,161,105, 26,132, 16,168, 84, 42,166,
-117,235,214,204,174, 93,187, 44,231,206,157,203,126,227,141, 55,198,204,156, 57,243,246,136, 17, 35, 56, 71,142, 28, 97,234,211,
-180,179,119,160, 44,218, 10, 55,239,182,129,211, 58, 57,147,201,190, 42,147,235,162, 40,169,132,151, 86, 4,226,196, 3, 92,124,
- 25, 78,199, 8,102,217,234, 19,150,175, 79,166,102,191,179,104,217,152,215,167, 78,184, 29, 30, 49,130,115,242, 68,253,154, 44,
- 44, 44, 44, 44, 44, 44, 44,255, 48,211,112, 63,170, 85,243, 10,224,254, 96,248, 6,141, 86,223,190,125,169,132,132, 4,202,199,
-199, 71, 90, 92, 92, 28, 4, 96,237,252,249,243, 67, 9, 33,180, 68, 34,225, 74, 36, 18,250,183,223,126,211,254,252,243,207,231,
-204,102,243, 11, 70,163,177,212,215,215,151, 74, 75, 75,107,112,182, 64,143, 94,189,169, 91,113,215, 41,111,159,182,210,226, 34,
-117, 16, 5,178, 54,231,125,143, 80,190,166,148,134,135, 51, 23, 10, 23,122,213,190, 82,237,251,191,220, 56,103, 54,155, 94, 0,
- 80,234,229,225, 78,101,231,230,177,233, 30, 88, 88, 88, 88, 88, 88, 88, 30,103,163, 85,151,173,141, 62,235,240,252,249,243, 4,
- 0,201,201,201,161,205,102,179,114,224,192,129,246, 92, 46, 23,142,142,142, 92,173, 86,203, 84, 85, 85,113,157,156,156,114,249,
-124,254, 15, 85, 85, 85,165, 99,198,140,161,246,239,223,223,168, 33,186,122,233, 34, 1, 64,178,179,179,104,198,172, 87,206,232,
-215,218,158,103, 49,129, 9,233,203,213, 84, 82,140, 92,151,198, 13,112, 23,229, 10, 4,252, 31,204,102, 83,233,216,200,145,212,
- 47,135,163, 89,147,197,194,194,194,194,194,194,242, 56,211,224, 24,173, 38,211, 59,104,181, 90,123,129, 64, 16, 30, 26, 26,218,
-186,170,170,138, 89,178,100, 73,214, 23, 95,124,177,227,238,221,187,102, 59, 59,187,182, 18,137,228,205, 9, 19, 38, 56,237,223,
-191,159,244,239,223,191,110,132,172,222,167,123,235,116, 26,123,145,128, 31,254,102, 79, 69,235, 44,147, 61, 19,248,230,149,172,
-129,139, 47,236,248, 37,129,103,238,228,160,107,235, 32,164,222,156, 48,225, 89,167, 95, 14, 71,147,222,189,123, 89,165,217, 66,
- 88, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,103, 53,159,116,166,161, 78,106, 7,192,138,204,240, 34,145,104,128,183,183,
-119,191,132,132, 4,250,226,197,139,229, 28, 14,103,211,136, 17, 35,126,218,183,111, 95, 79, 7, 7, 7,151, 86,173, 90,185,158,
- 58,117, 42, 12,192,158, 63,254,248,195,170,232,147, 68, 36, 24,208,213, 75,213,111,235, 13, 66,127, 27,115,167,156,230,138, 54,
- 13,126,250,233,159,222,216,177,179,167,135,147,194,165,171,187,210,245,200,145, 99, 97, 0,246, 92,188,120,137,141,104,177,176,
-176,176,176,176,176, 60,238, 38,107,107,125,255, 55, 26,209, 18, 10,133,158, 92, 46, 55, 40, 59, 59, 59,227,200,145, 35, 9, 61,
-122,244, 24,158,145,145,177,156, 16,146, 46,149, 74,167,101,101,101,221,201,202,202, 50,234,116,186,233, 54, 84,198, 19, 28, 65,
- 80, 76,174, 46,227,243, 83,183, 18, 58,245, 30, 54, 60, 63, 63,119, 57, 77, 72,186, 80,170,156,150,156, 89,120,231, 82,129,193,
-168,215,219,164,201,194,194,194,194,194,194,194,242,216,209, 84, 68,203, 68,211,244, 74,131,193, 96,255,203, 47,191,228, 68, 68,
- 68, 24, 0,224,171,175,190, 98,166, 78,157,122, 46, 37, 37,101,200,237,219,183,135,187,185,185,157, 6, 64,165,166,166, 90, 19,
-125, 50, 49, 12,189,210,104, 52,216,159,250, 45, 54,103, 64,191, 78, 6, 0,216,252,229,122,230,185,105,115,206,165, 36, 38, 12,
- 73,142,191, 54,220,205,205,237, 52,109,225, 81,121,249,233,108, 68,139,133,133,133,133,133,133,229,113,166,102,198, 97,237,255,
-155, 54, 90, 70,163,177,208,104, 52, 2, 64,105, 68, 68,196, 67,235,190,249,230, 27, 2,160, 10,192,222,226,226, 98, 91, 42, 83,
-168,211,233, 0,160,116, 64,191, 78, 15,173,216,189,245,139, 7,154,154,202, 10,246,180,177,176,176,176,176,176,176, 60, 73,102,
-235, 47,112,216,227,194,194,194,194,194,194,194,194,210, 34,166, 53,244, 63,133,134,103, 14,156,180,225, 3,154, 51,251,224, 36,
-171,201,106,178,154,172, 38,171,201,106,178,154,255, 57,205,166,180, 79,226,201,163,222,193,240,132,252,253,163,159,216,169,175,
-172, 38,171,201,106,178,154,172, 38,171,201,106,254,219,113,199,195,233, 29,220,129,251,153,225,121,236,177, 97, 97,121,178, 33,
-123,193, 69,169,191, 47, 8,241, 0, 87,152,135,188,155, 41,212, 71, 96, 90,172,169, 14,242,129,196,236, 10,139,184, 16,234,184,
-212,150,106,178,176,176,252,251,112,235, 51, 99, 44,197,225,110,162, 8, 3,157, 58, 81, 36,208,165, 75, 11,242, 50,254,139,222,
- 34, 15, 13,140,209, 98,141, 22, 11,203,147, 78, 97,128, 31,120, 88, 6, 14,220, 65, 76,247,224, 28,180, 12,184, 21,223, 98, 77,
- 1,179, 4, 52,199, 11,196,148, 12, 23,255,229, 64,210, 45,246, 96,255,251,152, 61,235,117,114, 59,254, 50, 50, 51,115,209,182,
-157, 59,252, 2,250,224,139,245, 27, 41,246,200,176, 88,247,171,140,218, 26, 62,106,146,131, 68,170, 0, 0, 48, 22, 51,190,153,
-219,245, 87,139,197,178, 29,192,126, 0,186,255,250, 33,250,127, 31, 12,207,231,243,213, 0, 24,177, 88,188, 15,213,161, 53, 22,
-150,191, 9,247,234,235,140,169,190,238,108, 65,206,227,241, 22, 75,165,210,223, 68, 34, 81,129, 72, 36, 42,144,201,100,191,241,
-120,188,197, 0,228,143, 77, 27,247,191,142, 82,112,232,225, 70, 51,227,121,236,102,153,139,214, 64,251,129, 99, 25, 65,190,233,
- 32,111,145, 38,143,138,208,155, 24,239, 31,174,104, 93,171,140,150, 64, 16,180, 72,179, 22,118, 2,129,224, 24, 0, 39,246,242,
-124, 60,200, 72,141,199,145,195,171,177,228,147, 41,248,110,235,116, 36,221,190,212, 34,189, 64,160,123,119, 30,111,126, 0, 48,
- 24, 0,107,216,254,237, 80,100,218,201, 67, 63, 20, 30,218,245,101,225,143,171,167,147, 3,203, 34,177,126,253,250,240, 41, 83,
-166,252,224,237,237, 93, 8,224, 25,214,104,253, 63, 99, 54,155, 93,138,138,138,168,237,219,183, 71,169, 84,170,123, 60, 30,239,
- 61, 0,130,255,202, 1,151,203,229, 23,148, 74,165, 90,165, 82,169,149, 74,229,181,166,202,255,165,248, 57, 59, 59,103, 56, 56,
- 56, 36,215, 46,116,238, 60,182, 79,251,190, 47,124,232, 24, 52,122, 96, 11,245, 5, 60, 30,239, 61,149, 74,117,111,251,246,237,
- 81, 57, 57, 57,148,217,108,118,177, 97,251, 1,246,246,246,183, 47, 95,190,188,168,168,168,104, 96,214,165,111,156,243, 47,111,
-113,206,248,125,245,160,152, 35, 27, 22,217,217,169,110, 1, 24,240, 88, 28, 73, 61,227, 10, 14, 55, 44, 33, 79, 43,205,171, 48,
-187,198,166,107, 21, 0,119, 16,140, 45,248, 17, 83,206,184, 2,100,240,141,108,157,236, 66,137,179,235, 31, 41, 6, 37, 56,156,
- 48,232, 41,183, 22, 55, 56, 28,206,235, 12,195, 12, 21, 8, 4,111,178,223, 80,143, 7, 34,145, 0, 32, 4,114,153, 24, 0, 1,
-167,133,214, 72,200,225,244,189, 16, 21,181,100, 65,231,206,179, 3,128, 81, 13,152, 45, 10,192, 27, 1, 1, 1, 71, 1, 60,247,
- 8,119,231,115,127,127,255, 28, 0,115, 30, 85,187,212,173, 91,183, 62, 97, 97, 97, 31,118,237,218,117,224,163,210,252, 55,145,
-127,225,171, 95,242,206,109,112,201, 61,191,209,165, 44,245,236, 27,238,174,246, 76,106,106, 42, 70,142, 28,137, 47,191,252, 82,
- 26, 28, 28,188, 3,128,199,127,224, 86, 10,169,249,129,143, 90, 99,180,108, 50, 90,227,125,209,119, 98, 27,156,121,214, 23,149,
- 19,218, 64, 51,185, 13,206, 61,237,139,193,205,169,141,163,163, 35, 6, 12, 24,192,205,201,201,145,204,155, 55,239, 67,177, 88,
-156, 6, 96, 88,115,180, 36, 18, 73,140, 84, 42,205,226,241,120, 15,213, 69, 42,149,198,200,100,178, 44, 30,143, 55,164,118,185,
- 66,161,184,160, 84, 42,213, 10,133,226, 90, 3, 70, 40, 70,169, 84,170,229,114,121, 76,237,114, 30,143, 55, 68, 46,151,103, 43,
- 20,138,186,229,131, 21, 10, 69, 86,221,242,134,224,243,249, 94, 89, 89, 89, 46,217,217,217, 46, 66,161,208,181,118,121,102,102,
-166, 75, 86, 86,214, 67,229,182,192,227,241, 6,203,100,178, 44,169, 84, 26, 83, 95,121,221,125,106,136, 90,199,110,176, 53,229,
-182, 54, 60, 17, 17, 17,231,242,242,242,188,237,236,236,236,106,175,112, 80,217, 13,251,223, 55, 27,231,142, 30, 17,241,186,115,
-224,152, 78,205,212, 31, 38, 22,139,211,230,205,155,247, 97, 78, 78,142,164,119,239,222, 92, 14,199,166,223, 19,225,163, 71,143,
- 62,160, 86,171, 61,187,116,233,194,181, 88, 44, 72, 56,184, 24,210,184, 55, 33, 78,219,140, 86,146, 66,222,189, 95,151,123, 69,
- 12,234,126, 0,255,240, 96, 80,178, 55, 80, 0,138, 25,192, 16,226,124, 59, 71,239, 60, 50,234, 25,222,245, 44,157,179,153,166,
- 29, 0,238, 32,242,157,143,168, 89,154, 60,115,127,134, 16,215, 83,233,124,231,176,103,103,115, 79,167,243,156,205, 52,237, 8,
- 14, 6, 54, 71,179,246,229,207,229,114,231,174, 94,189,154, 3, 96, 22, 0,225,127,201,208,132,122,192,115,112, 59,238,149, 16,
-119,244,125,132,178,193,213,247,187, 95, 75,133,182,125,119, 20, 83, 95,219,138, 14, 1,189, 90,164, 99,100,152,164,221,169,169,
-199, 39,183,107, 23,185,160,115,231,151,234, 49, 91, 20,128, 5,203,151, 47,127, 33, 33, 33,193,185, 77,155, 54,175, 61,162, 31,
-253,235,150, 47, 95,254, 78, 66, 66,130,135,175,175,239,199, 54,106, 54,216, 46,217,219,219, 15,219,182,109,219,220,145, 35, 71,
-190,222,173, 91,183, 78,143, 66,243, 95,204,151, 55,110,220,240, 94,189,122,245,187, 83,167, 78,173, 0,128, 33, 67,134, 8, 0,
-244,110,113,123, 71,136,144, 16, 18, 70, 8, 25, 73, 8, 25, 66, 8, 9,173,254,187, 71,245, 50,146, 16, 18, 94,231,181, 71,245,
-182, 53,235,123, 54,160, 49,178,238,118,181,182,169,251,255, 67,127,215, 99,180, 70,226,254, 88,173,145, 15,237,192,225,195,135,
- 73,237,215,186, 76,240,197, 71,179,251,120,106,111, 31,218, 73, 52, 89,169,164, 52,241, 58,185,190,245, 51, 50,187,135,179,246,
-249, 54,248,220,246,227, 69,200,249,243,231, 73, 66, 66, 2,209,104, 52,228,206,157, 59,164,103,207,158, 58,169, 84,122, 10,128,
-175, 45, 98, 10,133, 66,125,234,212, 41, 18, 17, 17, 81, 46,151,203, 87,213,220, 92, 74,165, 82,125,254,252,121, 18, 17, 17, 81,
-174, 80, 40,214, 1,224, 2,192,211, 79, 63, 93, 64, 8, 33,206,206,206,185,245,233,141, 30, 61,186,148, 16, 66, 84, 42, 85, 77,
- 87, 19, 87,161, 80,172,155, 57,115,166,230,234,213,171,196,222,222,190,166,156,163, 84, 42, 87,205,154, 53, 75, 19, 27, 27, 91,
-187,188, 81, 28, 28, 28,178,104,154, 38,135, 14, 29, 34, 46, 46, 46,185,181,110,230, 44,154,166,201,129, 3, 7, 26,172, 91, 99,
-129, 2,185, 92,190,114,242,228,201,149,233,233,233,196,209,209, 81, 93,171,124,213,148, 41, 83, 42, 51, 51, 51,137,147,147,147,
- 85,117,116,116,116, 84, 95,184,112,129,140, 27, 55,174,162,246, 49,117,116,116, 84, 95,188,120,177,166,124,165, 53, 13,153,135,
-135,199,107, 46, 46, 46,185, 46, 46, 46,185,118,118,118, 75,221,221,221,243, 11, 11, 11, 9, 33,132,180,109,219,182,160,118, 36,
-203, 37, 56,234,173,205,123, 47, 94, 62, 27, 95, 92,216,121,232,235, 43, 85,157, 71,171,108, 56, 6,190, 82,169,244,212,192,129,
- 3,117, 89, 89, 89,164,170,170,138,196,197,197,145,243,231,207,147,187,119,239, 18, 0,214,204,177, 85,200,229,242, 28,131,193,
-192, 24, 12, 6,166,176,176,144, 46, 40, 40,160, 19, 87,185, 19,242, 45,255,193, 82,118, 96, 20,201, 63,187,140, 81,202,165,217,
- 0, 20,255,152,209,218, 24,228, 69,182,248,239,190,181,216, 59,241,236,242,167,204, 36,253, 52,217,249,146,179,249,204, 91,158,
-247,200,166,128,159,201,150,192, 86,205,210,220, 20,184, 51,238, 3,239,164, 13, 31,191, 97,206,200,200, 32,243,167, 60,101, 57,
- 49,219, 51,133,108, 14,216,219, 28,205, 90, 76, 28, 59,118,172, 38, 51, 51,147, 4, 5, 5, 85,113,185,220,169,255, 37,147, 21,
-238, 39,204,137,251, 97, 62, 51, 42, 88, 90,252,136,204, 86,176,139,139, 75,209,247,223,127, 79, 20, 10, 69, 65,115,205,214,248,
- 49,131,136,174,252, 20, 25, 19, 25,218,232, 61,242,236,179,207,146,176,176, 48, 50,123,246,236,166,238, 37, 42, 0,136,218,222,
-185,243, 1,102,252,120,122,123,231,206, 7, 2,128,168,106,131, 69, 1,120,119,197,138, 21,177,102,179, 57,246,187,239,190,139,
-141,138,138,138, 5, 48,191,133,199,226,139,207, 63,255,156,152,205,102,242,221,119,223,145,168,168, 40, 2, 96,125, 75,218,165,
-154, 72, 86, 72, 72,200, 91,251,247,239,191,156,148,148, 84, 24, 25, 25,185,178,115,231,206,170,230,106, 62,142,200,229,242,246,
-157, 58,117,218, 17, 20, 20,148,217,165, 75, 23, 99, 96, 96,160,222,207,207, 47, 61, 56, 56,248,123,145, 72,228,219, 76,217, 94,
-125,251,246,165,207,156, 57, 67,198,142, 29, 75,106,153,144, 70,105,204,139, 16, 66, 66,223,125,247,221,247, 0,144,119,223,125,
-247, 61, 66,200,200,106, 63, 49,178,246,223,117, 95,107,204, 83,205,255,245,105,212, 44,245,105,214,247, 25,117, 62, 7, 13, 68,
-178,166, 85,215,251,207,157, 59,124,248,240,192,195,135, 15,159,169,187,115,207,180, 65,159,217,125, 60,117,186,194, 60, 18,255,
-217,155,228,183, 48, 47,114,126,144, 27, 73,158, 59,150,228,253,176,142,204,232,106,175, 29,223, 6, 97,182, 26,173,216,216, 88,
- 18, 27, 27, 75,174, 93,187, 70,210,210,210, 72,121,121, 57,249,241,199, 31,105, 71, 71, 71,157, 72, 36, 90, 14, 64, 98,141,152,
- 82,169, 84, 19, 66,136,193, 96, 32, 75,151, 46,213, 87, 71,170, 92, 85, 42,149,154, 16, 66,202,202,202,200,242,229,203,245, 42,
-149, 42, 14,128,135,147,147, 83, 86,106,106, 42,113,117,117,173,215,204,216,219,219,171,147,146,146,106,140,147,167,189,189,125,
-252,193,131, 7, 77,132, 16,146,157,157, 77, 28, 28, 28,212, 0, 92, 29, 29, 29,175, 31, 62,124,216, 68, 8, 33,185,185,185, 53,
-229, 86, 25, 45,157, 78, 71, 78,156, 56,241, 80, 29,106,202,143, 30, 61,250,144, 1,179, 2, 87,149, 74, 21,251,227,143, 63, 26,
-105,154, 38,241,241,241, 53, 38,209,213,206,206,238,218,222,189,123,141, 52, 77,147,196,196, 68,171,205, 96,235,214,173, 11, 8,
- 33,196, 98,177,144,205,155, 55, 27,106,142,105, 77,185,209,104, 36, 95,125,245,149, 65,169, 84,198, 2,104, 52,250,230,228,228,
-148,107, 52, 26, 73, 89, 89, 25,233,217,179,167,230,252,249,243,164,162,162,130, 16, 66, 72,235,214,173, 11, 0,192,127,224,212,
- 79, 47,223,209, 84,188,252,206,198, 61,190,161,207,127,118,252, 74, 78,246,182,253, 49,177, 78,193,163,159,178, 38,168, 41, 18,
-137,150,187,187,187,235,255,248,227, 15,218,100, 50,145,204,204, 76,114,237,218,181, 7,215,216,205,155, 55,173, 50, 90, 60, 30,
-111,241,229,203,151, 77, 52, 77, 51, 69, 69, 69,116, 65, 65, 1, 93, 80, 80, 96,169,107,180,200,183,124, 82,116,244, 85, 18,189,
-117,142, 81, 32, 16, 44,254,103,162, 89,224,146, 45,254,163,201, 22,255,216,239, 39, 59, 21, 85, 94,219, 69,200,175,115, 72,202,
-167,109,200,226,167, 20,149,204, 22,255, 88,178, 37, 96, 60,249,104, 32,207, 38,205,173,129,163,200, 22,255,216,207,159,241, 41,
-190, 30,123,149,156, 57,115,134,124,181,110, 5,153, 29,238, 89,197,108,241,143, 37,155, 2,199,217,162, 89, 27,145, 72,116,231,
-220,185,115,228,236,217,179,228,227,143, 63, 38, 82,169, 52,243, 81, 68,245,200, 38, 63, 31,242,181,223, 64,242, 77, 7,119,242,
-251,192,199,110,130, 79,168, 7, 60,135,250, 9,179,139,174,239, 39,164,228, 46,201, 95, 21, 68,158,242,231,183,212,108, 5,187,
-184,184, 20,166,167,167,147,252,252,124,178,102,205, 26,162, 84, 42,155,101,182,198,143, 25, 68,116,101, 39, 27, 53, 90,163, 71,
-143, 38,107,215,174, 37,102,179,153,244,234,213,203,154, 31, 45,127, 49, 91,254,192,104, 0,239,173, 92,185,242,129,201,218,184,
-113, 99,236,205,155, 55, 99,189,189,189,143,180,224, 88,172, 95,185,114,229, 3,147,181,113,227, 70,114,243,230, 77,226,227,227,
-147,213,146,118,105,232,208,161,159,166,165,165, 85, 44, 92,184,112,207,128, 1, 3, 62,187,126,253,122,118,116,116,116,108, 72,
- 72,200, 83,205,213,124, 4, 81, 29, 94,117,100, 71, 72, 8,225, 19, 66,106,204, 43, 15, 0,191, 38,160, 96, 13,147, 39, 79,150,
-246,233,211, 39,118,210,164, 73,218,239,191,255,158,164,167,167,147,184,184, 56,178,114,229, 74,242,225,135, 31,146,111,191,253,
-150,140, 27, 55,174,170,103,207,158,151,199,143, 31, 47,182,161,154, 65,190,190,190,229, 7, 14, 28, 32, 59,119,238, 36, 2,129,
- 32,218,218, 13, 27,243, 34, 13,153,169,134, 12, 86,221,117,141, 24,177, 70, 13,155, 21,159,247,192, 84, 53,112,206, 30,138, 72,
-252, 30, 25, 25, 57,240, 47, 95, 62, 4,159, 76,155,247,169, 56,237,251, 53, 80,255,248, 37,184,101,106,240, 43,139, 97, 56, 23,
- 13,243,185,131,120,161,119,111,137,132,162,150,216,122,193, 8,133, 66, 8,133, 66, 8, 4, 2,104,181, 90,228,230,230,162, 95,
-191,126,156,107,215,174,137, 95,123,237,181, 57, 18,137, 36, 19,192,152, 38,239,102,234,126, 68,250,194,133, 11,120,245,213, 87,
- 69, 59,118,236,232,226,236,236,124,131,166,105, 33, 0, 36, 38, 38, 98,194,132, 9,162, 93,187,118,117,244,240,240,184,102, 50,
-153,164, 34,145, 8, 92, 46,183, 65, 61,161, 80, 8,179,217, 44,234,208,161, 67,220,141, 27, 55,130, 35, 35, 35,249, 25, 25, 25,
- 72, 77, 77,133,217,108, 22,250,249,249,221,188,118,237, 90,151,145, 35, 71,242,179,178,178,144,145,145,241,160, 30,214,212,215,
-104, 52, 66, 36, 18,161,118,151, 22, 69, 81, 48, 24, 12, 16, 10,133, 86,107,241,120,188,193, 1, 1, 1, 55,111,220,184, 17, 50,
-122,244,104,193,213,171, 87,145,157,157, 13,154,166,133,129,129,129, 55,111,220,184,209, 53, 42, 42, 74, 16, 23, 23, 7,181, 90,
- 13,107,187,208,106,222,119,227,198, 13, 76,154, 52, 73,120,236,216,177,174,238,238,238,113, 22,139, 69, 8, 0, 55,111,222,196,
-132, 9, 19,132,199,143, 31, 15,105,213,170, 85, 92, 19, 93,137, 92, 0, 48,155,205,120,237,181,215,100, 74,165, 18, 89, 89, 89,
- 96, 24, 6, 52, 77, 3, 0,138, 75,139,111,222,184, 25,159,248,194,196,103, 6,234, 76, 6,195,197, 43, 49,183,219,182,246,241,
-162, 40,210,186,137,170,142,145,201,100,153,171, 86,173,122, 43, 61, 61, 93, 20, 16, 16,192, 73, 73, 73, 65,101,101, 37, 4, 2,
-193,131,107,204,218,253, 22, 10,133,131,130,130,130,120,122,189, 30, 12,195, 0, 0,225,112,234, 31,177, 34, 46, 59,135, 64, 87,
- 11, 95, 34,145, 12,250, 71,190,189, 43,130, 28,193, 96,104, 70,161, 81, 36,178,243, 82,200,221,253,128,204,179,104,227, 44, 2,
-151,195, 21, 95, 77,213,202, 0, 50, 20,222, 69,142,182,105, 50, 67, 83, 11,140, 34,179, 67, 71,185,135,151, 55,138,139,139,209,
-170,109, 0,244, 66,103,225,133,187, 85,114, 80, 54,106,254, 73,255, 14, 29, 58,184,181,111,223, 30, 69, 69, 69, 8, 9, 9,129,
-189,189,189, 61,128,161,205,254,210,249,206, 71,132, 10,244, 5, 56,171, 64, 83, 31,195,204, 91,134,187,133, 33,100, 75, 8,255,
-113, 50, 89, 74,185,240,210,174,221, 63,122, 58,122, 7, 2,209, 47,195,213, 78,132,111, 94, 15,113,112, 86,137, 14, 52,211,108,
- 5,187,186,186,158,190,124,249,178,147, 88, 44,198,181,107,215, 16, 20, 20,132, 53,107,214, 56,219,219,219,159,109, 94,100,139,
-128, 80, 13,155,172, 1, 3, 6, 96,214,172, 89,216,177, 99, 7, 28, 28, 28, 48,105,210,164,166,204, 22, 73, 4, 14,125, 30, 23,
-247,221,142,123,247, 14, 79,110,215, 46,114,146,159,223,210,233,207, 61, 55,245,141, 55,222,192,138, 21, 43,112,224,192, 1,244,
-237,219, 23,211,166, 77, 51,103,102,102,110,111,110, 87,213,170, 85,171,102,207,153, 51,167,174,166, 41, 35, 35,227,243, 22,181,
- 75,197,197, 55,227,226,226, 18, 39, 78,156, 56, 80,175,215, 27,174, 92,185,114,219,215,215,215, 11, 64,235,230,106,182,192, 96,
- 81,132, 16, 49, 0,105,245, 34, 3, 32,221,181,107,151,106,244,232,209,202,234, 50, 73,245,210,100,247,126, 80, 80,144,215,157,
- 59,119,114,230,206,157, 27,178, 99,199, 14,137, 84, 42, 69, 89, 89, 25,190,254,250,107,188,247,222,123,160, 40, 10,132, 16,124,
-251,237,183,210,151, 94,122, 41,244,222,189,123, 57, 62, 62, 62,214, 12,105, 17,201,229,242,189, 75,151, 46, 85, 50, 12,131, 5,
- 11, 22, 20,153, 76,166, 89,213,235, 22,218,217,217, 93,194,125,195,221, 24,245,122,145, 90,223,149,135,235, 28,155,200,186,101,
-117,215, 17, 66, 34, 27,211,176,241, 92,212,247,121,209,141,153,173,218,223, 64,131,234,117,145, 64,103, 55, 95,127,148,255,186,
- 23, 18, 30, 5, 9,183,122,225, 81,224,164,220, 68, 43, 49, 31,102, 66,130,155,107,180,106, 22, 62,159, 15,173, 86, 11,154,166,
-241,222,123,239,137, 78,156, 56,225,200,225,112,126,110, 74,167,182, 97, 74, 78, 78, 70, 96, 96, 32,117,232,208, 33,215, 89,179,
-102, 73,106, 62,167,188,188, 28,237,219,183,167,142, 30, 61,234,242,193, 7, 31,200, 27, 51, 51, 20, 69, 65, 32, 16, 96,206,156,
- 57,146, 43, 87,174, 56,120,120,120, 32, 37, 37, 5, 37, 37, 37,144,203,229,152, 51,103,142,228,242,229,203,206, 30, 30, 30, 72,
- 79, 79, 71,121,121, 57,228,114,185,205, 70, 75, 32, 16, 60,180, 13, 69, 81, 48,153, 76, 54, 25, 3,149, 74,181, 51, 54, 54,214,
- 89,165, 82, 33, 46, 46, 14, 22,139, 5, 42,149, 10,179,103,207,150,196,198,198, 58,219,217,217, 33, 49, 49, 17,132, 16, 40,149,
- 74,155,234, 8, 0, 12,195, 32, 49, 49, 17,173, 91,183,198,217,179,103, 93,166, 79,159, 46,174, 41,191,123,247, 46,188,188,188,
-112,246,236, 89, 23,153, 76,182,179, 33, 45,134, 97,144,151,151,135,132,132, 4,164,164,164,160,176,176, 16, 69, 69, 69,168,172,
-172,132,197, 98, 1, 0, 72, 43, 43,162,119,237, 57,116, 67, 34,145, 72,131,252, 58,120,223,140,191, 85, 32,145, 72,164, 62,222,
-222,126,192, 71,156, 70, 12,225,207, 25, 25, 25,142, 47,189,244,146, 32, 63, 63, 31,165,165,165,224,241,120,127,185,182,132, 66,
-235,134, 2, 89, 44,150, 64,177, 88, 76,153, 76,166, 7, 17, 48,161, 80,136,183,118,106, 17,180, 24, 15, 45,207,173, 43, 0,161,
-205, 48, 26,141,129,255,239,209, 44,128, 2,101,236, 0,138, 10,185,148, 82,229,208, 63,114,162, 0,169,199, 0,198, 12,112,120,
- 24,212,217,139,119,224,102,149, 43, 8, 58,195,128, 0, 66,154,158,249, 69, 0, 10, 48,181, 7,168,238, 39,238, 88, 28,251,142,
-125, 93,144,147,147, 3,129, 64, 0,145, 72,132,144,193, 79,243,118,221, 48,187,129, 66, 23,152,224,111,141,230, 67, 97, 71,137,
-100,209,135, 31,126, 40,171,173, 57,117,234, 84,153, 74,165,250,176,217, 38,171, 74,218, 27, 22, 50, 39, 33, 71,219,122,105,116,
-126,224,189, 2,157, 63, 8,153, 11,152,187, 62, 2,179, 53, 72, 36, 18,165, 2,232,215, 34,147,165, 16, 94,220,189,251, 71, 79,
-135, 86,247, 77, 22, 44,122,128, 47,129,155,179, 29,190,121, 43,204,193,217, 78, 98,171,217, 10,118,117,117, 61,117,233,210, 37,
- 39,177, 88,140,216,216, 88, 8, 4, 2,136,197, 98,116,234,212, 9, 91,182,108,113,118,112,112,176,217,108, 17,144,122, 99,190,
- 99,198,140, 33, 3, 6, 12,192,204,153, 51,177,125,251,118, 24,141, 70, 44, 93,186, 20, 25, 25, 25, 86,201, 38, 2,135,150,199,
-197,125,191, 44, 33, 33,249,221,224,224,128, 49, 50,153,195,204, 73,147, 84, 31,124,240,193,225,131, 7, 15,126, 55,114,228,200,
-162, 43, 87,174,172, 5,176,215,198,195, 75, 1,216,184,122,245,234,153, 53,198,237,131, 15, 62,248,246,224,193,131,203, 70,142,
- 28,153,119,229,202,149,185, 0, 54,182,164, 93, 98, 24, 38,250,231,159,127,190, 33,145, 72,164,254,254,254,222,241,241,241, 5,
- 18,137, 68,234,237,237,237, 55,112,224, 64, 78,115, 52,155,131,139,139,203,144, 75,151, 46, 5,225,254,164, 49, 81,141,209,138,
-143,143,183,171,168,168,176,147,203,229,118,238,238,238,138, 26,179, 53,118,236, 88, 59, 30,143,215,232,117,171,209,104, 14, 46,
- 92,184, 80, 53,118,236,216,154,255,113,238,220, 57,108,223,190, 29, 50,153,236,161,247, 70, 69, 69,225,213, 87, 95,181, 55, 26,
-141, 63, 91, 81,221, 41,175,189,246,154,191,171,171, 43, 22, 45, 90,100,200,201,201, 25, 2, 32, 3,128, 42, 60, 60,252,211,248,
-248,248,158,161,161,161,123, 0,116,107,236,222,171,207,139,212, 54, 58,214,148, 53,247,253,214,154,173, 58, 69, 13,230,208,122,
-200,104, 69, 70, 70,158, 65, 3, 51,169, 76, 37,106,136, 64, 67,194,165, 32,229,214, 50, 91, 96,192, 43, 47, 0,213,140, 89, 42,
-245,125, 25, 10,133, 66,112,185, 92, 24,141, 70, 88,251,160,234, 26, 83,160, 84, 42, 33,151,203,161,211,233, 96,177, 88, 32, 22,
-139,107,204, 8,148, 74, 37,248,124, 62,248,124, 62,196, 98,241, 95,162, 73,117,163, 57, 2,129, 0, 50,153, 12,121,121,121,200,
-200,200, 0,195, 48,144,203,229,144,201,100, 16, 10,133,200,205,205, 69,110,110, 46, 8, 33,144,201,100,144,201,100,176,101,192,
- 53, 77,211,245,126,249,155,205,102,155, 34, 90, 22,139, 5,183,111,223, 70,102,102, 38,196, 98,241,131,125, 21,137, 68,184,123,
-247, 46,242,243,243, 33,149, 74,161, 84, 42,161, 82,169,172,214,173,217, 23,133, 66, 1,137, 68,130,210,210, 82,104,181,218, 7,
-199, 84,169, 84, 66, 38,147,161,188,188, 28, 5, 5, 5,141,238, 59, 77,211,200,205,205, 69, 97, 97, 33,178,178,178, 80, 84, 84,
-244,160, 1,170,142, 26,181, 44,176, 83, 81,129,226,226,226, 7,145,200,134, 22,107, 96, 24, 6,149,149,149,184,116,233, 18,197,
- 48, 12,202,202,202,152,194,252,124,122, 70,174, 16, 7, 62,218, 68,126, 60,118, 93,191,235, 72,172,110,223,169, 4,221,198,125,
- 55,117,226,158, 31, 91,240, 79,240, 85,176, 10,102,126, 68,145,198, 44, 42, 52, 9, 84,174,193,225, 64,234, 81,128,195, 3,196,
-246,232,213,177, 13, 50, 74,105, 89,146,218, 40, 6,133, 97,216,232,103,111,149, 38,205, 31, 90, 88,105, 22,165,155,156,149,129,
-157,187, 65,173, 86, 67, 36, 18, 65, 36, 18,161,123,223,112,164, 22,211,210, 91, 57, 58, 41, 8, 34,172,210,252,147,182,114,185,
-188,119,191,126,253,168,218,154, 35, 70,140, 0, 69, 81,157, 0, 4,216,212,200,173,111, 43,132, 73,218, 11, 60, 50,231, 86,158,
-214,227, 64,188,222,111,212,152,167, 29,190, 56, 89, 16,120, 59,223,224, 11, 98,158, 7, 98,234,214, 2,179, 53, 80,161, 80, 28,
-222,176, 97,131,175, 88, 44, 62, 10,160,127,115, 68,228, 18,238,230, 69, 51, 39,122,218,215,152, 44,179, 22,224, 73, 0,190, 4,
-224, 73,224,230,226,132, 37,175, 14,117,144,138,249,251,108, 48,172,187, 54,110,220,232, 92,215,100,213, 44, 33, 33, 33, 88,188,
-120,177,179,131,131,195, 78,107,244, 86,173, 92, 65,202,202,203, 1, 2, 84, 84,104,176,106,229,138,210,154,117, 99,199,142, 37,
-253,251,247,199,204,153, 51,177,108,217, 50, 28, 57,114, 4,189,122,245,194,180,105,211, 16, 26, 26,218,148,116,132, 74,165,218,
- 17, 30, 30,126, 41, 87,161,120, 53,175, 91, 55,225, 41,149,170,124, 72,121,185,202, 39, 62,222,228, 15,220, 4,240, 85,118,118,
-246, 83, 54,152,172,231,148, 74,101,236,144, 33, 67, 76, 10,133, 34,115,205,154, 53, 51,102,205,154,133, 21, 43, 86, 96,225,194,
-133, 95, 3,120, 5,192,251,217,217,217, 30,141,153,172,191,171, 93,250,187,218, 58,154,166,179,246,238,221, 27,106, 50,153,188,
-170,187, 7, 69,101,101,101,202,146,146, 18,133,201,100,146, 49, 12, 35,179,179,179,147, 3,144,190,240,194, 11,188, 91,183,110,
- 5, 90, 44,150,156,198, 52,243,243,243,159, 95,176, 96, 65, 81, 81, 81, 17, 0,160, 83,167, 78, 40, 43, 43,195,252,249,243,241,
-230,155,247, 39, 4,119,237,218, 21,132, 16,168,213,106,172, 90,181, 74,157,159,159,255,162, 21,213,109,215,161, 67, 7,196,199,
-199,227,246,237,219, 39, 1, 48,184, 63,142,181,252,250,245,235, 55, 10, 11, 11,177,115,231, 78,129,167,167,231, 65, 52,144,226,
-165, 49, 47,210, 28, 40,138,138,110,206,118, 53,145,171,250, 34, 98, 13,208,120, 68, 43, 50, 50,146,170,253,250, 80,196,136, 66,
- 92,102,204, 89, 56, 4,119,123, 40,154, 37,229, 82,144, 40, 85, 72,205,202,128, 0, 84,194,163, 50, 90,165,165,165,152, 49, 99,
-134,238,249,231,159, 47,102, 24,230,105,107, 77,129, 74,165,130, 74,165,194,173, 91,183,200,184,113,227,212,107,214,172,209,213,
- 54, 90,201,201,201, 36, 34, 34,162,224,195, 15, 63,212, 52,102,180,106, 34, 90,203,151, 47,215, 13, 26, 52,168, 48, 33, 33,129,
-212,152, 41,185, 92,142, 85,171, 86,233,194,194,194,212, 87,175, 94, 37, 53,101,182, 68,180, 56, 28,206, 3,163, 85,123, 27, 14,
-135, 3,134, 97,108, 50, 90, 85, 85, 85,207,143, 28, 57, 82,157,152,152, 72,106,246, 83,165, 82, 97,205,154, 53,186,161, 67,135,
-170, 19, 18, 18, 72, 77,153, 82,169,180,218, 12,214,124,190, 66,161,128, 82,169,196,173, 91,183, 72, 68, 68,132,122,253,250,245,
-250,218,229,183,111,223, 38, 81, 81, 81,234,202,202,202,231, 27, 51, 47, 53,221,121, 22,139, 5,122,189, 30, 69, 69, 69,200,202,
-202,122, 16, 78,215,201,148, 79, 77,124,118, 84, 23,157, 78,167,189,149,124, 39,179, 83,199, 32, 23,157, 78,167,205,200,204, 76,
- 6, 62, 98, 26,209,126, 58, 56, 56,184,120,198,140, 25,186,210,210,210, 22, 27, 45,161, 80,152,200,227,241, 72,255,254,253,137,
-209,104, 36, 89, 89, 89,230,162,210, 82, 75,192,103,159,145,132,183,222,162, 36, 49, 49, 34,185, 92, 78, 85,107,114, 82, 82, 82,
- 24,137, 68,146,248,255,110,180, 56,140, 27, 40,210,239,143, 59, 26,187,161,163, 38, 8,169,252, 43,128, 73, 3,136,236, 1,145,
- 61,120, 50, 71, 12,239,223,149,251,253,165, 10, 55, 16,166, 15, 4, 34,175, 38, 53,249,196, 21, 96,250,255,154,172,183,239, 55,
-126,182,176,164,164, 4, 92, 46,247,129, 41,146,202,100, 24, 50,230, 5,206,183, 87, 12,110, 0,233, 11,138,235,101,195,189,254,
-206,162, 69,139, 4,165,165,165,224,112, 56,127,106, 74,165,152, 62,125,186, 72,169, 84, 46,180,186,241,219, 27, 40, 0, 95,212,
- 11, 32,111, 38,229,235, 61, 14,222,212,249,207, 91,254,141, 36,184,107, 40, 94, 27,228, 34, 89, 30, 93, 16,124, 35, 75,215, 6,
-160,223,130,197,216,189, 25,102,171,191, 66,161,136,142,137,137,145,142, 24, 49, 2,171, 86,173,146, 73, 36,146,163,205,105,248,
-171, 52,244,172, 79,214,255, 79, 29,183,118, 24, 96,170,186,111,176,106, 45, 5, 26, 6,139,191, 57, 93,110, 54,147,137,214,106,
-234,116,186, 41,175,188,242, 74,241,190,125,251,254, 98,178,196, 98, 49,210,210,210,176,116,233,210,146,146,146,146, 38,191, 20,
-215,172, 94, 21, 27,127,227, 55,124,251,245, 39, 0, 8, 54,172,121, 29, 23,255,216,109, 55,104,224, 0,210,186,117,107, 18, 26,
- 26,138, 25, 51,102, 96,201,146, 37, 72, 74, 74,130,147,147, 19, 94,127,253,117, 12, 28, 56, 16,171, 87,175,110,172,145,138,152,
- 53,107,214,210,236,236,108,255, 95,127,253,149, 87, 88, 88,232,178,122,219,182,242,159,202,203, 75,150,197,199, 39,189,223,177,
- 99,135,119, 59,119,126,177,145,212, 15,245,154,172,153, 51,103,238,202,206,206, 14, 57,121,242, 36,191,176,176,208,107,230,204,
-153, 88,185,114, 37, 22, 46, 92,184, 5,192,107,176,110,194,139,213,237, 18,151,203,125,234,233,167,159,238,162,211,233,180, 73,
- 73, 73,153, 29, 59,118,116,209,233,116,218,204,204,204,228, 51,103,206, 48,205,209,108, 14,197,197,197,247,118,238,220,153, 60,
-123,246,236,144,236,236,236, 64, 0,142,149,149,149,178,202,202, 74,145,209,104,148,216,219,219,219,119,237,218,213,105,218,180,
-105,242,235,215,175, 7,102,103,103,107,170,163, 72, 13, 98, 50,153,146, 74, 75, 75, 35,135, 13, 27, 86, 86, 90, 90,138,206,157,
- 59, 99,212,168, 81,112,115,115,131,135,135, 7, 70,143, 30, 13, 63, 63, 63, 20, 23, 23, 99,226,196,137, 37,133,133,133,195, 0,
-164, 88, 81,221,123,249,249,249,232,211,167, 15, 62,249,228,147,200,103,158,121, 38,161,127,255,254, 21, 29, 59,118,212,122,121,
-121, 5,124,241,197, 23,240,244,244,196,222,189,123,221, 69, 34,209,206,122, 76, 86,131, 94, 4, 64, 97,181,225, 49,214,121, 45,
-108, 98,157,181,219,214,251,183, 21,239,171,107,182,106, 47,127,233, 58,172,255,132, 0,139,183,239,253, 94, 47,244,110, 15,149,
-127, 23, 72,197, 98, 72,132, 66, 72,236, 29, 97, 96, 24,108, 75,203,215, 86, 17,178,208,214,139,167,238, 23, 33, 69, 81,248,242,
-203, 47, 45,189,123,247,214,159, 62,125,122,131, 78,167,243,198,253,172,178, 86,155,130,245,235,215,107,231,204,153,115,163,160,
-160,160,139, 88, 44, 54,214,148,111,216,176, 65,251,194, 11, 47,196,103,103,103,135, 72,165, 82,109, 67,227,179,106, 27, 45,145,
- 72,100, 40, 40, 40, 8,157, 58,117,106,226, 87, 95,125, 85, 37,149, 74, 33,147,201, 32, 18,137,140, 5, 5, 5, 93,102,204,152,
-113, 99,229,202,149, 90,137, 68, 2,153, 76,102, 83,183, 28, 33,228, 47,134,170,118,185,181, 88, 44,150,211, 5, 5, 5, 93,230,
-204,153,115,253,139, 47,190,168,170, 49, 64,181,235,184,122,245,106,173, 92, 46,183, 41,162, 85,243, 62,153, 76,134,117,235,214,
-105,103,207,158,125,163,160,160,160,139, 72, 36, 50,214, 42,175,154, 53,107,214,245,130,130,130, 46, 22,139,229,116, 35,191,198,
-232,138,138, 10,240,120, 60,196,199,199, 27, 4, 2, 1, 56, 28, 14,238,222,189,251,160,241,113,112,112, 8,234,210,169, 99,192,
-255,118,237, 61, 35, 17,136, 68,189, 67,187, 7,166,164,103,100, 19, 66,165, 55, 81,213,253, 58,157,206,251,244,233,211, 27,122,
-247,238,173,255,242,203, 47, 45, 13, 69,182,172,193, 96, 48,156,185,118,237,154, 89, 44, 22, 83,121,121,121, 22, 46,151, 11,154,
-166,137, 33, 52,212,208,233,139, 47,200,173,119,223,165,148, 50, 25, 79, 32, 16, 64, 42,149, 82,199,142, 29, 51,106,181,218, 51,
-255,255, 70, 11, 82, 80,144,220, 41, 48, 40,196,127, 29,166,161, 0, 0, 32, 0, 73, 68, 65, 84, 28, 11,133,228,253,247, 77,150,
-216, 14, 16,219, 3, 98,123,120,122,122,225, 74,154, 86, 1, 14,132,160,173,200, 33, 70,136, 12, 20,164,241,106, 40,248, 66, 9,
-149,159,159,255,192, 16,213, 44,190,237, 3,113, 45, 67, 35, 7, 69, 68,224,194,150, 20, 36,145,142,142,142,188,188,188,188,191,
-104, 6, 5, 5,113,205,102,179,245,169, 93,114,105,119,128,153,153,156,175,119,255,229, 70,149,255, 91,203,190,149, 72,232, 50,
- 32,102, 61,130,219,122,224,173,241, 93,133, 31, 28, 44, 12,190,154,174,109, 11, 46,121, 13,140,198,217,134,122,246, 83, 40, 20,
- 71,175, 94,189, 42, 85, 40, 20, 72, 73, 73, 65,104,104, 40,182,110,221, 42,149, 74,165, 71, 0,216, 52, 30,239,178, 26, 25,154,
- 74,186,247, 59,123, 51,243,227,242, 44, 15,153,172,194, 42,130, 87, 62, 63, 88, 86, 90,161,127,250, 82, 86,195,247, 79, 61, 92,
- 47, 43, 43,139, 88,184,112, 97,113, 97, 97,225, 67, 38, 43, 35, 35,163,230, 75,113, 16,128, 38,127,252,254,254,219,241,144,207,
-150,204,193,213,152, 4, 12,143,124, 19,215,226,238,225,253, 5, 99, 96,167,148,224,244,233,211, 24, 59,118, 44, 62,249,228, 19,
-220,189,123, 23, 63,254,248, 35,181,117,235, 86,234,210,165, 75,212,231,159,127, 78, 53, 49,164, 97,210,178,101,203,112,245,234,
- 85,140, 24, 49, 2,103,207,158, 69, 73, 73, 9,118, 31, 61,122,103,231,157, 59,239,215,140,217,106, 32,245, 67,189, 40,149,202,
-121,203,150, 45, 67, 76, 76,204, 3,205,226,226, 98, 44, 91,182, 44, 27,192,235,182,152, 44, 91,218,165,206,157, 59, 7,236,218,
-181,235,140, 88, 44, 22,133,134,134, 6,166,165,165,101, 3, 72,111,134,102, 69, 75,122,170,138,138,138, 46,108,221,186,245,210,
-224,193,131,165, 83,166, 76,113, 62,112,224,128,163, 86,171,245, 16,137, 68, 46, 70,163, 81,120,251,246,109,238, 79, 63,253,228,
-118,235,214,173, 52,189, 94,127,197,154,227, 81, 80, 80,112, 37, 41, 41,105, 88,231,206,157,111,111,216,176, 33,219,221,221,157,
-153, 54,109, 26, 94,121,229, 21, 56, 59, 59,211,235,214,173,203,236,223,191,127,252,189,123,247,194,181, 90,237, 77, 43,235,250,
-221,103,159,125,118,126,215,174, 93, 24, 53,106, 20, 62,255,252,115,236,222,189, 27,191,253,246,155,228,143, 63,254, 16,110,221,
-186, 21, 2,129, 0,189,122,245, 66, 68, 68,196,144,234,238, 78,107,191,151,174, 82, 20, 21, 77, 81,212,201, 58,175, 87, 27, 91,
-103,195,182, 13,253,221,232,251,234, 84,115,107,157,197,122, 38,181,197, 71,211, 59, 42,180, 23, 38,247, 34,249,211,250, 17,245,
-132, 64,114,110,160, 3,153,218,142,170,154,210,204,244, 14, 58,157,238,193,178,111,223, 62,226,230,230, 86,165, 80, 40,108, 78,
-239,224,230,230,166,174,168,168, 32, 61,122,244, 40,113,118,118,126,144,138,192,221,221, 93, 93, 85, 85, 69,122,245,234, 85,226,
-226,226,242, 32,189,131,151,151, 87, 22, 33,132,248,248,248,228, 54,164,103,177, 88,136,155,155, 91,205, 12, 61,190,131,131,195,
-166,158, 61,123,150,168,213,106,226,238,238,254, 32,117,130,179,179,243,170,208,208,208,186,229, 77,213, 55, 43, 59, 59,155,100,
-103,103,147, 86,173, 90,229,214, 46,207,200,200, 32, 25, 25, 25,196,203,203,203,230,244, 14,206,206,206, 43,235,169, 75,179,234,
-232,237,237,173,214,233,116,164, 79,159, 62, 15, 29, 83,111,111,111,181, 94,175,175, 41,183, 42,189,131, 68, 34,121, 77, 44, 22,
-231,138,197,226, 92,145, 72,180,180,117,235,214, 5,123,246,236, 33,235,214,173,171,153,146, 14,231,160,168,222,237,251,188,248,
-190,115,208,232,121, 45, 73,239,160, 80, 40, 78,185,185,185, 85,237,219,183,239,161,235, 75,167,211, 89,157,222, 65, 34,145,100,
-107, 52, 26, 70,173, 86,155,207,159, 63,175,141,137,137,209,198,199,199,107,211,210,210,116,197, 5, 5, 38,181, 90,173, 43, 47,
- 47, 55,220,184,113,195, 32,149,254, 51,233, 29,200, 86,191,246,100, 83,192,193,123,159,248,222,154, 51, 64,170,191,185,164, 11,
- 33, 63,143, 37,228,200, 43,132,156,126,135, 92,217, 50,141,244,241, 21,209,231,231,183, 74, 38,155,253,127,177, 38, 37, 3,217,
-218,169, 61,217, 20,112,228,206,199,190,183,166,244,247,208,111,251,106, 29,185,124,249, 50,137,143,143, 39, 41, 41, 41,228,200,
-254, 61,164, 79, 91,233,125,205, 77, 1, 7,109, 76,243,208, 87, 36, 18,105,214,172, 89, 67, 46, 93,186,244, 64,243,224,193,131,
- 68, 42,149,106, 1,235,102, 45, 19,128, 34,155,130,198, 88,190,242,255,227,131,161,242,202,226,195,239, 16,114,243,123, 66,182,
- 6, 19,242, 93, 79, 66,246,140, 36,228,208,139,228,210,186,241,164,175,175,192, 76, 54,251,159, 37, 91,130,172, 30,108,207,231,
-243, 43,246,237,219, 71,114,115,115,201,217,179,103, 73, 76, 76, 12, 73, 76, 76, 36,153,153,153, 36, 58, 58,154,240,249,124, 61,
-154,241,216,178,158,174,240, 9,239, 32,200,187,177,188, 47, 33, 7, 38,146,194,157,147, 72,100, 71, 69, 73,175, 86, 45,202, 71,
-215,213,209,209,177, 40, 58, 58,154,164,165,165,145, 51,103,206, 16, 23, 23,151, 34, 0, 86,143,151,141, 28,222,159, 16,227, 13,
- 18, 54,160, 35,233,220,185, 35, 25,216,183, 3,201,185,183,158,132,118,107, 77, 54,109,218, 68,212,106, 53,105,221,186, 53,177,
-181, 98,225,225,225,151, 9, 33,177, 35, 70,140,136, 5,112, 44, 60, 60, 60, 54, 53, 53, 53, 54, 52, 52,244, 18, 26, 79,253,208,
- 32, 67,134, 12, 49, 17, 66,200,136, 17, 35, 8,128,220,240,240,112,146,154,154, 74, 66, 67, 67,141,205, 57,120,214,180, 75, 33,
- 33, 33,189, 7, 15, 30,252,126, 72, 72,200, 60,107,210, 59, 52,161,249,168,146, 80,115,113, 63,249,103, 16,128,238,213, 75, 96,
-117, 25,183, 5,154, 47,242,249,252,109, 14, 14, 14,191,217,219,219,159,230,114,185, 91, 1, 76, 70,243,242,155,113,170, 35,140,
- 39,156,157,157,239,118,238,220, 89, 55,108,216, 48, 50,124,248,112, 50,115,230, 76,194, 48, 12,217,179,103, 15,249,228,147, 79,
- 72, 59, 71, 71,203, 58,160,104, 51,240, 18,254,165, 60, 72,239, 96, 13,227,125,209,247,165,182,212,153,231,219,160,114, 98, 27,
-104, 94,110, 71, 89,147,176, 52,188, 33,163,197, 48, 12, 73, 78, 78, 38, 97, 97, 97, 85, 50,153, 44, 7,214, 39, 44,125, 72,211,
-201,201, 41,198,197,197,229, 47, 73, 52,107,149, 63,148,176,212,197,197,229,130,187,187,187,218,217,217,249, 90,125,154, 78, 78,
- 78, 49,238,238,238,106, 39, 39,167,135,146,123,114,185,220, 17, 78, 78, 78, 57,117,203,121, 60,222, 96, 23, 23,151,172,186,229,
- 13,236, 59,220,220,220,178,114,115,115, 73, 97, 97, 33,241,246,246,206,173,107,192,242,243,243, 31, 50, 96,214,104, 54, 85,151,
- 70,234, 88,175,166, 21,199,180, 57,231,189, 6, 63, 79, 79,207,130,213,171, 87, 19,185, 92,254,208,148,103,255, 1, 47, 47,186,
-124, 71, 83,241,202,130, 77,123,234, 73, 88,106,109,114,208, 97, 50,153, 44, 39, 44, 44,172, 42, 57, 57,153, 48, 12, 67, 24,134,
-105,200,104,213,167,249, 84,247,238,221,139,139,138,138,232,202,202, 74, 75, 86, 86,150, 33, 53, 53, 85,183,100,201, 18, 83, 97,
- 97,161, 94,163,209, 24,227,226,226, 12,238,238,238,133, 0,158,178,245, 28, 53,147,240,186,221,103,100, 75, 96, 95,178, 57, 48,
- 58,241, 67,159,219, 47,246,148, 25, 98, 87,143, 32,228,244, 59,228,210,166, 87, 72,111, 95,225,125, 67,180, 37,224, 40,249,214,
-111, 0, 89,223, 86,104,149,230,182,118,253,201,150,128,163,183, 22,251,220, 30,219,205,217,184,235,251, 45,228,238,221,187,228,
-224, 79, 59, 73,175, 54,213, 38,107,115,224, 9,178, 41, 48,204, 26,205,250,204,214, 55,223,124, 67,238,222,189, 75,126,249,229,
- 23,107, 77, 86,120,125, 70,235,189,112,121,217, 43, 61,197,134,137, 93,133,198,209,193, 2, 83, 68,123,129,165,143, 15,143,238,
-226,206, 97, 2,157, 65, 34,252, 37, 6,178,217,255, 44,217, 28, 56,204,218,122, 10,133,194, 76,212,202,169, 83,119, 17,137, 68,
-133,141, 24,173,240, 38,205,150,159, 40,239,212, 39,131,201,168,206,138, 98, 43, 77, 86, 83,215, 82, 87, 39, 39,167,162,239,190,
-251,142,184,186,186, 22, 90,105,178, 30,104, 70, 69, 70,144,140,123, 71,200, 47,123,150,145,176, 1,129,100,199, 55,115,200,229,
-179, 31,146,145,195,195, 72,120,120, 56, 41, 42, 42, 34,131, 7, 15, 38,182,214, 83,165, 82,237,208,104, 52,177,199,143, 31,143,
- 13, 15, 15,143,221,177, 99, 71,236,185,115,231, 98,165, 82,233,142,154,224, 68, 93,179, 21,248,215,246, 63,188, 78, 68, 43,182,
-178,178,146, 28, 63,126,156,132,135,135,147, 29, 59,118,144,115,231,206, 17,169, 84, 26,219,220,251,200,218,118,105,232,208,161,
-139,210,210,210, 42, 22, 47, 94,188,167,158,132,165,214,106,222,125, 68,245,124, 36,109,200, 63,160,169,144, 72, 36,177, 55,110,
-220, 32,165,165,165,164,163,171, 43,249,140,203, 37,217, 2, 1,201, 21, 8,200, 38,160,228, 95,224,169,166,213,215,117,104,147,
-209,122,132, 39,130,232,245,122, 50,127,254,124,163, 88, 44,214, 10, 4, 2, 91, 31,193,243, 68, 95,132, 78, 78, 78, 23, 92, 93,
- 93,213,174,174,174, 15,153,189,218,229, 78, 78, 78,215,254,229, 55,160,159, 64, 32,200,224,243,249, 15, 63,130, 39, 40,170,119,
-187,190, 83, 22,186, 6, 71, 13,111, 97, 61, 5, 2,129,224, 61,177, 88,172,157, 63,127,190, 81,163,209,216, 98,180, 0, 96,168,
- 84, 42,205,217,190,125,187,238,206,157, 59,230,146,146, 18,203,229,203,151,205, 49, 49, 49,198,143, 62,250,168, 82, 42,149,230,
-160,225,180, 4,255, 47,199,147,172,111, 43,172, 49, 91, 55, 23,250, 36,142,234, 40, 53,109,157, 27, 65,122,183,174, 99,178, 26,
-206,228, 94,191,102,181,217,186,254,129,119, 98,152,159,220,178,108,225, 91,164, 87, 27,201,195, 38,203, 6,205,186,102, 75, 42,
-149, 86,126,248,225,135,182, 68,178, 30, 54,132,219,252,189,201,150,128, 29,247, 77, 84, 19,203, 38,255,175,201,151,254,222,143,
-203,125,212,211, 21, 62, 67,252, 68, 9, 54, 68,178,172,169,103, 87,123,123,251,219, 54, 68,178, 30,104,126,249,229, 6, 50,105,
-194, 80,114,239,246, 62,162, 41, 62, 66,174, 93, 92, 67,198, 69,133,144, 94,189, 66,201,150, 45, 91, 72, 82, 82, 18,233,209,163,
- 7,105, 70, 61, 35,166, 79,159, 30,155,154,154, 26,155,146,146, 18,123,238,220,185,216, 49, 99,198,196, 2,136,168,221, 19, 84,
- 99,182, 76,227,198, 25,186,114, 56,111, 53,161,249,220,244,233,211, 73,106,106, 42, 73, 73, 73, 33,231,206,157, 35, 99,198,140,
- 33,176,237,241, 61,205,106,151, 66, 66, 66,122,135,133,133, 45,236,214,173,219,240, 71,165,249, 31, 52, 90,178,177, 99,199, 50,
- 52, 77,147,225,195,135,211, 95, 0,101, 91, 41, 74,189,149,162,212, 91,128,194,127,123, 68,235,239,126,224,103, 56,128,147,181,
- 11,196, 98,177, 90,175,215, 59,203,229,242,253, 26,141,102, 54,238, 79,139,108,145,230,223, 81, 79, 86,243, 95,161,233, 46,151,
-203, 55,104, 52,154, 49, 98,177,184, 80,175,215,187,218,160,105, 39, 18,137,222, 18,139,197, 97, 90,173,214, 15, 0,100, 50, 89,
-178,193, 96,248, 77,167,211,173, 5, 80,246, 79,239, 59, 89,223, 86, 8,161,176, 59, 8,222,141,205,172,106,179,236,120,137,207,
-220,193,246,153,125,218,201,210,192,103, 62, 7,101,184, 66,189,148, 97,176, 89, 83, 66,133,130,230,191,123, 37, 93,219,250,243,
- 95, 43,125,230,133,201, 51,251,180,149,103,130,224,115,136,180, 23,109,213,172,107,182,100, 50,217,246,170,170,170, 87, 1,252,
-102,235,190,147,189,129, 2, 84,153, 61, 97,230,118, 4,105,228, 17, 62,132,104,193,225,198, 35, 31,106,234,163,219, 38,246, 62,
-170, 95,243,171,175, 54,146,147,191, 30,129, 65, 91,130,188,130, 10, 76,154,252, 50,186,118, 13,129,147,147, 19, 62,251,236, 51,
-180,111,223, 30,159,124,242, 9,213,140,122, 70,200,229,242, 73, 1, 1, 1,109,111,221,186,149,162,213,106,127, 0,112,162,206,
-123,168, 0, 32, 76,202,227,117,209, 89, 44,103,111, 3, 49, 77,104, 62, 39,151,203,231, 5, 4, 4, 4,223,186,117, 43, 65,171,
-213,174, 6,176,155,109,235,158, 12, 77, 14,135,179,214,199,199,103, 92, 90, 90,218,187, 0,118,225, 63,194, 63, 98,180, 88, 77,
- 86,243, 9,212,172,185, 79,200,227, 86,207, 63,205, 22, 51, 27, 20,218,128, 80,217, 16, 48,235,154, 48, 89, 77,107, 74,168, 80,
- 88,120,111,130, 66, 43, 16,228,131,112,214, 54, 97,178,254,127, 77, 38, 64,225,163, 70,218,175,143, 64,168,134,207, 23,123,205,
-215,195,162, 69,139,200,177, 99,199, 32,149, 74,161,211,233, 48,108,216, 48,124,250,233,167, 20,219,134,176,154,255,143,154,255,
- 74,163,197, 99, 15, 3, 11, 75,211,247,202,227, 90, 49,234,141, 20, 35,217, 27,120, 21, 69,220,249,224,160, 13, 96,201, 64,149,
- 37,159,122, 35,195,216, 66,205,203, 40,162,230,128, 11, 63, 8, 45,247,160, 49,230, 83,175, 55, 95,243,145,239, 55, 64,240,209,
-227,123, 94,158, 68,234,154,170,152,152, 24,246,160,176,176, 88,207, 52, 60, 60,211,240,193,255,172,209, 98, 97,121,194,161,158,
-185,109, 2,144, 93,189, 60,182,154, 44, 44, 44, 44,255, 65,195, 5, 10, 13, 15,104,179, 37, 36,216,156,129,118, 39, 89,205,102,
-105,114, 1,168, 0,216,225,126, 14,146,154, 41,189, 77,165,217, 24, 14,192,204, 30, 79, 86,147,213,100, 53, 89, 77, 86,243, 31,
-214,108, 74,251, 73,236,146,172, 47, 51,252,214,127,106,214, 33,171,217,124,134,177,199,147,213,100, 53, 89, 77, 86,147,213,252,
-151,106,254,235, 32,132, 52, 43, 25, 25,203, 63,135,152, 61, 4, 44, 44, 44, 44, 44, 44,143, 29, 33,213,175,238,184, 31,221,114,
-175, 89,241,143,142,209,146, 56,118,112, 7,143,211,153, 98, 72, 0, 0, 16, 14,149, 8, 11, 19,167, 43,190,147,215, 82,109,185,
-135,159, 3,129,112, 47, 5,227, 51,154,220,228, 22, 39, 67,235,232,167, 28,231,234,164,152,148, 95, 92,190, 61, 33, 73,115,192,
-150,109, 85, 42, 31,149,216,193,126,188,193,100,238, 40, 20, 8, 50, 77,101, 21, 91, 75, 75, 83, 42,155, 81, 13,135,198, 86,126,
-244, 17,161, 14,231, 93,163, 4, 82, 19,199, 81, 41,160, 52,208, 16, 77,158,156,241, 45, 75, 35, 63,253,244, 12,177,245,220, 80,
- 28, 12,146, 41, 20,221, 68, 98,105,168, 84, 97,223,129, 33, 64,137, 58, 39,221,104,182,156,163,141,218, 88,194,224,247, 71,113,
-174, 88, 88, 88, 88, 88, 88,254, 5, 70,235, 26,128,145,184, 63, 70,171,233,193,240, 62, 65,253,174,138,197, 18, 95, 0, 96, 8,
- 1, 67,128,170,138,178,216,252,148,152, 97, 0,224,212, 58,228, 56, 95,172,236,198,144,251,235,105, 6,176,152,244,105, 21, 25,
-151,123, 88, 83, 35,153,179,223,216,193,225, 67,198, 69, 70,142,244,239,212,177, 83, 59, 0,184, 25,127,243,222,225,195,209, 73,
-167, 79, 82,251,170, 10,147,127,105,201, 30, 19,136, 63,237,222,189,107,191,152,152,107,159, 0,152,217,210, 35,232,232, 40,159,
-125,226,231,249, 3,134,140, 91, 37, 3,108, 51, 90, 98, 7,251,241,163, 71, 61,213,245,237, 55,166,115, 94,153,255,153,239,213,
-243,191,175,144,187, 7,151, 17,198,124,162, 74, 61,225,143,198, 30,156, 92,215, 63, 54,100,176,126, 40, 57,198, 89,247, 93,111,
-123, 93,201,189, 9,132,161, 39, 80, 20, 5,174, 80,250,147,115,219,126,123,236, 6,205, 45, 5, 96,245,140, 49,165,123, 80,184,
-139,187,215,190, 9, 47,191, 37,150,170, 92,121,224, 10, 0, 80,200, 77,191,141,211,187,151,217,191,249,241, 55, 33,231,227, 50,
- 44,167,126,222,168,167, 4,252,113,218,188, 91,236, 20, 95, 22, 22, 22, 22,150,255, 50,209,213,230, 42,186,238,138, 6,141,150,
- 88, 44,241,189,244,251, 97,135, 95,206,101, 1, 0,194, 67,220,240,254,146, 13, 17, 59,214,199, 36, 1, 64,239,193,145,126,159,
-188,247, 6, 46, 36, 20,128, 16,130,174,237, 29, 49,124,244, 51,214, 25, 15,215,192, 30,227,199, 63,253,252,252,249,243,162,238,
-222,189,155,190,107,215,174, 63, 0,160,255,128, 1,237, 63,251,236,179,103, 87,217, 59,136,126,252,233,231, 28,189,250,246,213,
-230,236,173,216,163,173,167,127,135, 54,147,126,252,118, 3,103,208,176,167, 39,166,163,106,153, 62, 55, 37,199,154,109,157,156,
-156,230,240,249,124, 21,112,255,105,236, 53,152, 76,196, 13, 0, 44, 52,163,176,247,240,175,228, 10,196,180, 72, 36,184, 85,169,
-209,108,175,200,185,189,173, 49, 77,131,217, 28,252,230,235, 47,113,174,167, 20,195, 55,184, 63,119,221,178, 15,192,208,102,251,
-183,222, 91, 50, 62,230,242,143,168, 82,227,140,149,187,198,175, 91,224,233,217,139,251,233, 50,249, 80,138,194,139, 62,189, 95,
- 30,243,201,247, 63,241,187,183, 87,194, 96,102,112, 52,182,184,247,166,181,159,174, 60,191,105,228, 33, 0, 91, 0,156, 2,208,
-164,169,115,112,116,248, 97,206,194,181,242, 42,227,159,179,189,171, 77, 22,190,222,190, 23, 55,178, 24, 4,248, 7,240,220,230,
-172,144,111, 89, 50,237,123,237,253,231,108,177,176,176,176,176,176,252, 87,201,195,195,179, 13,183, 54,105,180, 0, 64, 46,225,
- 33, 41, 53, 31, 0, 96, 39, 1,102,191, 54, 5,197, 69,133,126, 70, 11,131,151,167, 76,198,181,196, 60, 36,165, 21,130, 16, 2,
- 63, 47,171, 31,194, 13, 46,152,238, 47, 79,125,121,224,241, 19, 39,174, 44, 90,184,232,127, 20,133,139, 0,176,101,235,215,189,
- 23,127,184,248,213,201, 83, 38, 15,253,233,167,159, 18, 0, 52,203,104,241, 40,197,134,149,203,151, 10,179,139,244,250, 57,243,
-223,101,230,205,157,179, 14,192,211, 86, 57, 25, 62, 95,149,157,157, 45,231,112, 30, 30,190,246,249,210,119,207, 14, 29,183,234,
- 78,122,102,217,245,227, 7, 15,246, 8, 10, 10, 66,118, 78,126,223, 21, 95,108,238,114,244,184,228,165,202, 10,221, 56,109,209,
-237,122, 31,218, 44,226,243, 19, 62, 94,177,169, 43, 99,215,158,243,254,171, 35, 16,220,206, 3, 57, 5,101, 24, 48, 44,138, 23,
-123,245,106, 4, 96,181,209,170,155, 60,112,188,145, 41,232,242,217,246,203, 67,198,244,241,232,206,225,112,161,209,153, 81, 88,
-110, 0,205, 0,253, 3, 85,120,106,199, 23,188,146, 42,243,216, 37, 63,103,141,189,184, 62, 82,173, 47,207,157, 5, 96, 95,227,
- 31, 67, 28,188, 92,148, 72,202,170,172,215,100, 85,233, 45, 0, 0, 1,151, 6, 5,226,200,222, 95, 44, 44, 44, 44, 44,255,113,
-234,157,117, 8, 84, 63,153,251,240,225,195,245,142,223,161,105,130,164,180, 60, 36,165,229,225, 74, 98, 33, 76,132,143,117, 43,
- 62,198,234,101, 31,162, 68,199,193, 47, 23,178,144,156,150,143,228,180,124, 20,149,106,234,147,120,168, 75,105,213, 50, 73,200,
-218,181,202,149, 17, 3,100,131, 28,236,237,237,239, 36,252,175,106,241, 92,117,224,199,111,102, 9,248, 70, 81,182, 76, 46,235,
-179,119,239,158, 32, 87,103, 23,153, 92,174,120, 71,234,217,229, 27,149,234, 47, 79, 74,111,180,155, 74,226, 18, 16, 21, 53,242,
-169,193,110,110,174,204,244,117,177,137, 29, 3, 3,204, 29,218,119,232, 43,113,233, 16,213,200,102, 15, 52, 25,134, 1,135,195,
-129, 90,173, 70,110,110, 46, 82, 83, 83,145,156,156,140,172,172,116, 53, 67, 8,159, 6,195,113,119,247, 2,143, 39,132,111,107,
- 31,108, 90,183, 76,186,228,163,247, 67,197, 50,225,129, 58, 70,232,129,166,190,164,244,167, 35,199, 78,228, 28,221,181,137, 6,
-128,130, 82, 13, 78, 95,189,139,107,183,178,108, 61,145,117, 83, 56,180,206,201,184, 91, 97, 73,139,230,126,242,193,188,172,115,
-231,206,167,151, 87, 26, 81,169, 53, 65,171, 55,195, 96,164, 97,166, 25,248, 56,139,177,255,221,142, 56,248, 91,156, 43, 69, 81,
-107,155, 58,158, 6,131,153,238, 23, 32,195,196,176, 86, 8,240,146, 33, 39,233, 34,230, 44, 92,139,152, 84, 3, 74, 75,203, 96,
-174, 42, 2,163,201, 70, 81,218, 53, 88,104,154, 52,117,222, 31, 17,172, 38,171,201,106,178,154,172,230,191, 88,179, 33, 47,242,
-132,176,181,158, 5, 15,140, 86, 67,220,203, 42, 65, 82,106, 62,186, 5,120,162, 93,107,119, 92, 73, 46,197, 15,167,179,240,205,
-241, 12,156,190, 81, 8,134,167, 64,126, 5,112, 39, 93,141, 59, 25, 69, 77,230,207,230,138,248, 19,222,124,179,124,126,167,160,
-138, 94,191, 31,157, 13, 79,231, 59, 65, 11, 22,148,205,230,138,248, 19,236, 91, 41,118,189, 59,255,173, 73, 10,169, 84,104, 52,
- 24,209,182,141,143,248,141, 89,179, 95,162,236, 69, 86, 63, 19, 73,225, 25,104, 47,146, 72,182, 45,249,232, 29,209,218, 95,238,
-100, 86, 25, 81,181,239,162, 58,101,222,187,139, 75,120,124,241, 38,133,103,160,189,181, 90,102,179, 25, 6,131, 1, 70,163, 17,
- 38,147, 9, 57, 89,183,163, 78,253,242,246,176, 54,173, 28,134,137,196, 98, 16, 0, 21, 58, 11, 82,243,180, 8, 27, 50,148,219,
- 45, 36, 36, 88,238, 30, 56,181, 62,173,242,242,140,114,134,112, 21,135,247,239,228,238,249,245, 58,254,119,248, 42, 14,252,118,
- 29, 87,206, 28,181, 16,198,252,224,249, 95,114,247,246,126,114,247, 78, 25,114,143,206,234, 7,139,103,199, 70,211, 51,115,185,
- 28, 18, 54, 36,252,228,107, 51,223,248, 93, 91, 89, 92,176,109,195,199, 57,133,185,233,183, 69, 2,202, 34, 21,113,161,209, 91,
-240,253,169, 92,140, 95,118, 3,183, 50, 53, 32,132, 52,249, 0,111, 6,152, 59, 97,234,219,180,217,100,130,191,183, 28, 59,183,
- 46, 71, 84, 88, 23, 12,238,100,143, 30,237,100,144,242, 12, 72, 72, 76,194,238,157,223, 91, 24,134, 51,143,253, 33,195,194,194,
-194,194,194, 70,180, 30, 44,238,181, 87, 52,216,117,168,215,235,210,158,158, 48, 25,238, 46,110,242,209,131, 94, 20,196,222, 43,
- 67, 97, 94, 6,238, 38,199, 67,171, 55, 67, 96,223, 6, 16,187,161,181,175, 15,226,146, 14,152,214,175,140,214, 48, 22, 67, 90,
- 67,122, 81, 81,238, 94,119, 19, 41,206,202, 21,222,151,146,147, 74,187,237, 92,248, 29,158,127, 94,238,180,114,133,247,165,244,
- 20, 25, 71, 42, 38,125, 94,154, 50,145,226, 80, 4, 11, 22,204,199,232,200,167,240,242, 75, 47, 80,219,183,127,223,171,204,202,
-189,100,192,255,242,189, 15, 62, 22,170,203, 44,198, 43,201, 26,131, 84, 38,145,156,191,163,169, 10,246,245,150,140, 24,247, 98,
-110,244,222,109,107, 1, 76,177, 70,171,198, 96,153,205,102,152, 76, 38, 0,160, 1,128,195,185,255, 90, 92,105, 68, 65,153, 1,
-234, 50, 3, 44, 52,131,113, 19,166, 72,174,198,220,152, 2,160,129,241, 90, 12, 99,182,152,177,239,215,107,200,185,250, 19, 67,
-113,184,229,181, 6,195, 67,238,222,222,207,205,205,251,108,228,184, 23,156,133,226,251,221,176,149, 85, 6,108,223,188,162,209,
-122,114, 40,138, 48,180,165,204, 98, 54, 87,181,109,211, 54, 39, 32,168,139,248,220,239,199,163,206,159,220,167,177,180,125,193,
-238, 94,122, 30,184,124, 17,184, 2, 49, 12, 38,235,126, 44,168,239, 94,218, 8,128,154, 58, 99,254,186,183,222,126,159, 59,119,
-253, 31, 48,234,181, 48,232,170, 80, 81, 94, 10, 9,207,140,132, 11, 7, 45,132, 54,191, 85,149,119,125, 35,123,127,177,176,176,
-176,176,252,199,169,251,248,157, 7,101, 13, 26,173,140, 91,231,122, 0,128, 95,247,136, 98,185,152,231,192,227, 80, 80,103,223,
-195,246, 85,115,192, 48, 4, 35, 94, 93, 9,133,175, 27, 36, 2, 46, 12,154, 98, 77,201,189, 51,141,142,213,161, 40,243,208,141,
- 91,114,124,103,188,222, 86,185,115,167,134, 15, 0, 59,119,106,248,175, 79,111,165,252,106, 75,154,111,207,126,221, 64,104, 26,
-145,163,159,198,132,231, 38, 32, 61, 95,139,159,207,102,162, 74,103,180,106,182,156,196, 41,160,139,147,163,243, 83,111,190,248,
-148,140,199,165,168, 14, 62, 42,110, 86,161,217,194,229,242,233, 67, 87,203,115,199,141,123,206,233,244,145, 61,131,105,167,128,
- 46,186,162,196, 27, 77,233, 25, 12, 6,208, 52, 13,131,193, 0,179,217, 12, 7,167, 54, 71,134, 62,189, 42, 59, 47,191, 50, 58,
-191, 84,223,179,202,108,129,186,204,128,130, 50, 3,202,170, 76,112, 83,216,195, 98, 54,118,106, 72,143, 16,242,191, 49, 79, 79,
-126, 1, 0,135,226, 88,190,211,228, 37, 38,223, 95,243,167,201,122,106,244,243,206,103, 99,239,225,110,204,209, 82,194, 88,238,
-103,113,167,152,236,198,143, 43, 8,151, 2, 35,224, 81,102, 46,135,195,152, 76, 26,179,139,139,243,233, 51,167,143,141,210, 91,
- 82,192, 21,136, 30,188, 87,103,164,173,190, 98,212,119, 47,125, 9, 0, 95,172, 95,183,186,207,208,231, 5,103,174,165, 65,103,
- 6,122,135,248, 97,255,143, 95, 27, 8, 49,191, 93,149,119,253, 75,246,222, 98, 97, 97, 97, 97, 97,121,200, 96, 69,227,254,224,
-248,135, 35, 90, 53,125,163,145,145,145,127,121, 90,123,142,186, 4,142,114, 30,156, 61,124, 49,105,206,106,252,111,237, 92,208,
-180, 25,132, 0, 22,218,186,204, 4,132,240,127,157,249,186,111, 64,107, 95,174,243,164,231,165,186, 31,118,106, 37,147,158,151,
-234, 58,118,114, 44,159,249,186,111, 90,165,222,187,175,133,166,113, 62,161, 0,241,105,229,136, 79,175,128, 92, 98,125,154, 47,
-174, 80,240,250,138,229,203, 4, 60, 46, 69, 37,100,104, 52,217,197, 22, 13,151,207, 55, 73, 37, 66, 98, 36, 60, 67,122, 17, 41,
- 30, 50,230, 37,221,161, 29, 95, 76, 5, 48,171, 33,157,154,153,134, 53,145,172,154, 87, 66, 8,161, 0,134,161,104, 58,187, 72,
- 15,141,201, 12,117,233,159, 70,139,178, 52,220,115, 42,119,111,239,167, 84,200,143,113,185, 92, 17, 33,128,217,100,121, 22,238,
-237,135,105,242,238, 38,215, 54, 89,151, 18,114,113,239,250, 73, 53,109,210, 78,214, 22, 36,157,178,118,223, 41, 10,132,203, 5,
-195,229, 80, 12, 69,129,225,115,136, 17,132, 48,117,107,164,181,193,104,213,152, 45, 33,159,187,240,196,238,181, 46, 47,143, 12,
-196,143,103,239,123, 62,125,101, 97, 69, 85, 14,107,178, 88, 88, 88, 88, 88, 30, 45,141,121,145, 39, 40,170,245,215,136, 86, 99,
- 59, 68, 8,112, 39,163, 8,173,189,156,225,213,186, 29,146,111,199,253,185, 14,128,133,182,174, 59,234,224,193,188,236,213,171,
-149,204,220,185,229,189, 87,172,240,190,248,250,244, 86,170,142,157, 28,203,223,121, 39,179,247,154, 53,170,139,191, 94,226,211,
-164, 58, 95, 87, 77,110, 46,219,158, 17,196, 9,237, 18,212,134,251,241,206, 59,153,167,110, 86, 22, 8, 4, 2,179,155,189,152,
- 82,200,133, 92, 46,135, 47, 52,152, 57, 6,191,224, 16,238, 33, 14, 21,210,152, 74,141,209,170,219,117, 88, 92,120, 47,234,196,
-207,243, 59, 14, 26,179,210, 33,167, 80,135,114, 35,247, 65,215, 33,151, 67,225,230,237, 12,128, 43,136,175, 79, 83,169,112, 56,
-190,235,135,255,121,175, 89,177, 20, 38, 11,141,153,115, 23,225,165, 41,147,143,195,189,253, 48,111, 95,255,216, 63, 14,125, 39,
- 29, 54,125, 19, 50,146, 98,242, 45,134,138,221,182,152,172, 7,102, 11, 32, 52, 97, 56, 37,165, 21,114,131, 5, 98,212,227,251,
- 12, 38,166, 89, 87,142, 70,103,193,161,203,249, 56,252,203,110,168, 20, 50,182, 37, 96, 97, 97, 97, 97,121,228, 60,161,230, 10,
-117,204, 21,208, 80, 68,171, 49,124,188, 92,113, 57, 62, 13,157, 2,218, 64,165, 84, 32,241, 94, 54,184, 28, 62, 56, 20, 96,182,
- 88,111,134,136,201,252,227,154, 53, 42,100,164,201, 56, 95,109, 74,243,157,249,186,111,218,154, 53,170,139,196,100,254, 17,192,
-100, 66,238, 63, 23,168, 38, 65, 42,109,131, 47, 32,140,185,149,171,131,148, 27,147, 82, 85,204,225,112, 13,142, 42, 49,227,168,
- 18,113, 28, 21, 66,190,128,207,101, 44,132, 99,242,114,241,213, 19,134,233, 98,141, 94,237,174, 67,154,166, 65, 81, 28,186,218,
-136,201,178,138,117, 40,215,115,161, 46, 51,160,180,210,132, 14,158, 50,156, 60,253,147,150, 54,235,118,214,167,197,229, 11, 84,
-237,124,189,240,254,167,107,160, 51,208,184,147,163,129, 64, 36,114,115,117, 11,190, 49,121,198,187,162, 55,182,222,195,212,193,
-142,152,251,199,189, 28,173, 90,252,174, 45,103,150,166,105,232,244, 70,129,186,168,212,190,162,178, 74, 41, 17,139,116,206, 14,
-170,162,250,222,171,183, 49,162, 85,131, 84,204,195,168, 94,110,208,155, 38, 66,103,176,224,194,169,125,108,139,192,194,194,194,
-194,194,242, 39, 91, 27, 90, 97,149,209,146, 75,197, 32, 92, 49,254,136,189, 7,255,160,206,248,254,224, 21,180,239,212, 11,121,
-149, 22, 16,112,154,156,109, 88,195,252,247,116,215, 0, 92,139,138,146,122,141, 29,235, 57,148, 16,254,175,155,182, 84,100, 3,
- 64,155,142,247,101, 24,134,128, 16,128, 48,247, 13,151,213, 80,188,140,180,188,138,214,190,110, 50,220,202, 54, 25,100, 34, 1,
-199, 94, 38,228, 58,171,132, 2, 1,143, 7,154, 80,134,188,188,123, 6, 10, 72,183, 70,174,110,215,161, 84,238,126,100,200,152,
-149,133,233,153,229, 49, 29, 74,180, 93,202, 77, 66, 16, 2,116,240,148, 33,254, 82, 52,173,206,185,123, 71,167, 78,218, 92,159,
- 22,195,128,107,178, 48,184,145, 82,142,178, 42, 51,202, 52, 38,244, 13, 27, 37,232, 27, 30,133, 63,226,139,192, 88,204, 88,241,
-117,116, 37, 77,204, 19,128,219,102, 27,118,154,115,249, 90,130, 87, 97,233,255,177,119,222,225, 81, 20,255, 31,127,239,238,245,
-146, 70,146, 75, 35,116, 72,232, 29, 18,122, 39, 82, 5, 65,138, 8, 10, 4, 80, 65, 17, 80, 84, 84, 58,124,233, 85,148, 38,210,
-123,175, 66,232,210,123,128, 4, 72, 35, 61,151,122,189,238,238,239,143, 75,168, 41, 23,130,229,167,243,122,158, 60,151,189,220,
-189, 51,219,102,223,243,153,207,204,232, 37, 66,129, 32,183,102,245,138,177, 98,145,208,174,209,104,196, 47,127,138,129, 66, 38,
- 70,182,206, 6, 0,182,210, 94, 61,121,122, 27, 14, 92, 78,195,193, 61, 91, 33,147,201,192,147, 27,138, 64, 32, 16, 8,132, 23,
-241,131, 99,249,157,195,249,175,207,204,151, 83,139, 74,179, 28, 15, 47,207,114,144, 42, 92, 17,151,110,133,150, 82, 33,199,192,
-131,101, 29, 17,173, 98, 2, 79,133,174,238,125,224, 64,106,210,254,253,153,235, 14, 28, 72,125, 33,209,251,121, 36,235,217, 43,
-199, 59,173, 73,241,236,201, 3, 71,207,228,245,106,238,237, 65, 51,140, 81, 36,164,205, 2, 17, 99, 21, 9,104,155, 72, 64, 91,
-124, 92,133,204,153,131,219,196, 60,133, 51, 37,105,154, 76, 38,116,234,212, 9,221,186,117, 67,239,222,189,209,191,127,127, 4,
- 5,213, 82,209, 12,101,225, 41,142,243, 22,107, 81,205,155,130,192,148,136, 83,219,254,103,184,119,113,223,109,214,108,234,137,
-151, 45,231,115, 77,158,231,178,243,204, 48, 89, 89,228,232,172,200,209, 91, 97,247, 14,197,190, 63, 82, 96,180,176, 72,184,177,
-203,168, 78, 75,250,220,156,241, 56,174,132, 83,241,245,203,155,124,210,136,143,135,170, 93,164,244,227,214, 45,154,170,189, 60,
-203,217, 41,234,121,228,149,162, 40, 72, 93, 85,240,112,119, 65,220,205,163, 56, 49,175,163, 17,192,119,206, 28,207, 23,113,149,
- 11,208,171,185, 47,122,246, 29,132,122, 33, 93,157, 49,214,100, 69,123,162, 73, 52,137, 38,209, 36,154,255, 37, 10,214, 56, 44,
-120,117,110,102,248, 2, 3, 84,213, 79,129,234, 1, 10,152,172, 42,152, 44, 44,244, 38, 22, 26,131, 21, 26,131, 13,113,105, 6,
-220, 59, 80,246, 18, 58,162, 88,142, 25, 63,121, 30, 0,229, 48,120,206, 70, 79,196, 86,203,140,133,243,102,191,191,173, 81, 67,
-203,184,238,126,129,119,226, 44, 41, 20, 69, 27,105, 70, 96, 43,231, 34, 16, 62,124,120, 71,125,233,220,145, 54, 82, 59,251,161,
-161, 24, 29,187,221,158, 23, 16, 16, 0,224,229, 37,120,106, 85,147,245,190,120,248,235, 42,109,123,205,243, 94, 60,107,162,129,
-102, 68, 28, 37, 16,221, 99,109,198,173,198,244,168, 85, 40,198,126,208, 34,233,131, 43,183,238,135,184,151, 11,196,227,100, 61,
-244, 38, 59,172,118, 14, 30, 74, 17,146,238, 30,183,198, 61,188,190, 67,151,114,103,195, 27, 28,182, 45,209, 15,238,149, 15, 11,
-235,250, 94, 72, 72, 40,243,195, 15,223, 35, 56, 56, 24, 70,163, 17, 52, 77, 35,176, 82, 53,196, 69,223,194,229,195, 51, 88, 67,
- 86,252,207, 0,166, 3, 80,151,246,159,100,106, 44, 56,122, 61, 3,135,247,110, 7, 35, 20,147,219,137, 64, 32, 16, 8,132,215,
- 9,127,229,117,181, 83, 70,203,100, 50,197,181,234,212, 19, 28,199,131,229, 1,142,205,143, 60,113,207,163, 79,172,205, 20, 87,
-214,210,113, 28,123,117,197,234,117,221, 26, 53,107,203,212,174,160,132, 38, 43, 13,151, 47,158,182,131,227, 47, 57,243,253,172,
-172, 71, 58,153, 79,245,247,222,239,215,103,231,208,143, 71,231,182,105,223, 94,161, 82,249,154,147,146,147, 12,235, 55,109,182,
- 29, 63,178,191, 13, 7,251,192,172,172,199,186,226,116,242,242,242,150, 22,246,190, 68,172,108, 9,160, 10, 35,160, 44, 70,245,
-163, 82,101,132,103, 38, 39,246,157, 61, 99,106,252,224,145,227,197, 85, 3,170, 33, 35,143, 65, 92, 82, 26, 30,158,219,111, 78,
-142,190,182, 87,147,116,115,184,147, 82,169,133,188,151, 4, 96,241,229,203,151,234,132,133,133,117,237,208,161, 3, 31, 30, 30,
- 14,158, 7, 78,173, 30,195,103,199, 93,222, 5, 71, 20, 43,230, 13,207, 75,194,185, 75,183,202,245,111,211, 68,224,233, 50, 28,
-235,182, 31,177,129,231, 18,200,253, 68, 32, 16, 8, 4,194, 51,222, 60, 71, 43,241,129, 99, 62,173, 63, 27,109, 90,198,144, 13,
- 27, 54,206,220,184,105, 91, 75,147,197, 18,192, 67,148,200,218, 45,103,117, 44,126,112, 86,195,152,254,248,186,167,103,141,186,
-235,215,172,248,110,253,186,159,218,130, 99,107, 82, 64, 60, 79,225,140,212,198, 14, 45,201,100, 21,107,150, 50,181,191,116,126,
-111,129, 49, 43, 75,183,177,180,223, 53,102, 69,165,209,140, 53,240,151, 37, 51,230,211, 52,211,133,101, 57, 33,199,218, 30,179,
- 86,211,255,140,234,168, 3,112, 58,203, 13,217,197,252, 45, 18, 64,100, 68, 68, 68,235,136,136,136,102, 0,150,194,177,134,226,
-245,178,156, 23,115,150,182,227,164,137,147, 78, 77, 0, 85,145,227,120,216, 89, 46, 65,100, 52,116, 36,247, 20,129, 64, 32, 16,
- 8,207, 8,199,235,147,150, 58, 23,209,250,171,200,201,137,209, 34, 7,227,202,170,147,149,245, 72, 7,224,181,145,123,134, 50,
-234,222,123,164,217,141, 71,154,221,111,250,125,125, 70,172, 26,136, 29, 90,198, 98, 56,147,200,126, 62,255,231,173,144,153,249,
- 64,143, 76, 52, 39,247, 16,129, 64, 32, 16, 8,165, 54, 92,206, 37,195, 19, 8, 4, 2,129, 64, 32, 16, 74, 52, 89, 47,190, 2,
-112,228,158, 23, 53,114,160, 52, 43,115,191,201,232,131,147, 68,179,204,154, 66, 0, 98, 0, 74, 0, 37,117,105,118, 69,254,122,
-141,228,120, 18, 77,162, 73, 52,137, 38,209,252, 27, 53, 75,210, 62,137,127, 9,165,155,120,253,205, 32, 67, 95,137, 38,209, 36,
-154, 68,147,104, 18, 77,162,249,111, 39,188,144, 31,240, 60,255,207,201,209, 34, 16, 8, 4, 2,225,175,194,211,179,134, 18,120,
-150,215, 91, 34,114,175, 90, 62, 0, 96,200,124,144, 78,142, 30,161, 16, 94, 92,231,240,173,228,104, 9,105,129,120,146,220,197,
-243,129,194,205, 51,249, 63,126,112,169,160, 74,138,177,157,219, 84,222, 23, 92, 69,214,187, 52, 95,148,123, 7,253,234, 91,173,
-249, 83,133, 42,104, 44,252, 26,201,202, 82, 8,133,170,138,183, 50,176,201, 69,151,128, 58,239,252, 9,251, 40,169, 93,187,118,
-104,237,218,181, 67, 1, 72,222,134,160, 92, 21, 52,168,124,245,144,115,170,170, 13, 79, 43,124,106,244,123,219, 5, 86,250, 85,
-247, 84, 6, 54,222,173,244,175,159,163,244,171,175, 81,150,111,124,214,197,171, 86,213,146,190, 23,216,107,118,205,105, 91,239,
-109, 13,236, 53,187,102, 97,127,247, 8, 91,230,242,227,182, 71,179, 60,123,254, 79, 73,234,149, 55, 35,176,229, 32,119,191,182,
- 19, 60, 75,251,189,128,160,144,200, 74,117, 90,103,248,215,104,126,207,217,239,148, 15, 14,189, 89,177,118,203,244,242, 65,161,
-215,201,145,119, 14,169,119,149, 80,169, 71,133,195, 18,143, 10, 71, 36,229,170,180, 47,171,158,159,159,159,172,102,205,154, 97,
- 33, 33, 33,163, 58,118,236,248, 69,195,134, 13,195, 43, 86,172,216, 5,127,227, 96, 44,185, 42,232, 27,179,144,202, 52, 11,169,
- 76,185, 42,232,155,146,235,215,224,153, 20,205,166, 80, 52,155,162, 80, 5,207,252,167,156, 43,137, 79, 80, 69,185, 42,104,145,
-139,111,237,171, 50, 85,141,158,165,253,190,135,135, 71, 23,111,111,239,119, 11,126, 60, 60, 60, 12, 35, 15, 31, 0, 0, 32, 0,
- 73, 68, 65, 84,186,144, 59,224,141,121, 22,197,122,229,247, 55,186,208, 25,161, 68,126, 97,240,199,159,214,157, 59,117,178,116,
-201,186,125, 88, 50,107,226,125,179, 62,183,246, 63,113,207,189,170, 52,187,206,208, 76,249, 23,223, 99, 57, 54, 41, 51,246,106,
-147,183,161, 31, 92, 73, 54,252,187,175,134,124, 57,232,253, 78, 21, 59,245,248,156,138,138, 53,238,119,222,162,161,193,142,221,
-123, 3,207,157, 57,189,108,221,186,213,211,213,246,224, 69, 66,137, 96,133, 38, 49, 50,183, 52,101,112,245,174, 90, 69,160,240,
- 58,215,170,247,167,190, 55, 78,110,222,192, 90,184,206,134,204, 23, 86,255,126,115,188,171, 85,171,214,148, 97, 24,207,177, 99,
-199,138, 0, 96,241,226,197,213, 89,150,205,122,242,228,201, 53,188,193,228,167, 14,131, 25, 60,100,233,252,105, 27,223,121,167,
- 27, 82, 50,245,152,183,104,101,187, 99,135,118,244,215,167, 63,218,245, 54,206,137,187,123,101, 87,136, 92,238,126,254,213,116,
- 85, 88,187,166,140,206,100,199,177,115,183, 90,111, 94, 57,253, 42, 80,171,153, 54,243, 65,145,115,138,113,134,188, 41, 62, 74,
- 62,140, 51,228, 1,192,160,215, 30,246, 74, 91, 39,111, 25, 27,230, 39, 17,220,202, 2, 74, 92,244,209,189, 82,203,227, 66,137,
-164, 34, 77,211,160, 41,128,166, 41, 48, 20,229, 88, 39,212,106, 76, 72,126,120,190,235, 63,225, 62,113,169,208, 44, 13,140,192,
-147,166,158,151,143,162,243, 95,121, 94,147,246,232,130,231, 91,248, 55,110,117,171,187,215,105, 89, 93,191,254,108,108,182, 66,
-208,230,139,195, 20, 79,255,244,244,252,162,219, 78, 25, 0,169,212,227,224,193,131,222, 97, 97, 97,110,170, 58,189,207, 58,243,
- 29, 49,163,171,125,232,208, 1, 81, 88, 88,215, 82, 92,159, 65,157, 65,211,155, 40, 64,200,113,252, 98,134,227,119,232,178,162,
-159, 0,165, 91,125, 74,166, 10, 30, 78,131,119,186,158,225, 64, 93, 55,102, 68,173,123,211,131, 43,144,184,118, 20,138, 68, 95,
- 84, 9,170,215, 40, 57,254,241,117,189, 78,187,200,110,206, 59, 91,106, 33,155,125,210,201,243, 55,222, 17, 8,133, 84, 88,199,
-230,140, 25, 56, 93,150,147,238,227,227,243,238,242,229,203,171,134,134,134, 2, 0,236,118,187,235,206,157, 59,125,103,204,152,
-161,136,142,142,126,211,133, 83, 3,188,189,189, 43,136,197,226, 0, 0,176, 88, 44,201,106,181,250, 41,128, 18, 27,254, 10,159,
-170, 94,224, 49,253,252,185,115, 2, 0,104,221,186,205,204, 10,173, 62,243, 96, 68, 74, 99,161,135,195,162, 85,228, 62, 57, 61,
-254,242,149, 75, 20, 0,132, 52, 15,157, 44,247,170,181,226,239,140,108, 73, 85,193,205,105,224,203,144,214,157,250, 14, 24, 56,
-132,174, 83,163, 2,186,116,238,240,181, 17, 56, 88,170,107, 70, 32,144, 93,189,122,181, 26, 77,211,140,221,110, 55,133,132,132,
- 60, 45, 75,185,252,131, 66,255,160, 64, 7, 90,237,150, 53,234,152,235, 51,129,215, 22,142, 97,220, 2, 27,125, 7, 70, 48,146,
-227,184, 68,237,211,235, 45,254,133, 17,173,215,143,115,105,149,104,129,248,139, 65, 31,125, 82,119,252,132,111,165,159, 47,137,
-192,225,149,147, 51,255,169, 38, 11, 0, 24,154, 41,127,252,196,113,149, 92,204, 0, 0,116, 38, 59,222, 9, 11, 43,249,137, 80,
-169,217, 25,154,162,130, 11, 22,180, 97,237, 86,169, 64, 40, 54, 81, 14,131, 4, 10,128,151,127,165, 8, 31,251, 5,249,160,247,
- 59, 85,220,180,237,247,164,167, 73, 89,165,174,212, 40, 70,132,144, 54, 93,208,169,115, 87,183,171, 87,254,152,190,250,231, 85,
-223,216,173,182, 85,156,141, 91,100,202,126,156, 82, 98,101,238, 91,163,177, 88,233,117,172,239,168, 25,158, 38,186, 28,126,152,
-181,212,235,220,209, 45,103,147, 19, 27,112, 9, 9,137, 38,158,162,238,231,100,167,126,161, 79,123, 18,229,236, 33, 83, 42,149,
- 85,149, 74,101,131,250,245,235, 75, 39, 78,156, 40,108,215,174,221,115,203, 30, 30, 46, 58,115,230,140,223,130, 5, 11,186,221,
-185,115,199,164,211,233,110,235,116,186, 24,148, 34,209,222,215,215,251,179,247,250,244, 68,135,190,159,130,229, 40,132,127, 50,
- 30,199,143,238, 25, 13,224,173, 24, 45,155,220,117,198,200, 81, 19,189, 67,154, 54,100,166,111,137,130, 76, 44, 64,215, 38,193,
-212, 71, 99,167,184,175, 91, 54,125, 45, 50,209,182,176, 72, 22,103,200,155, 82,215,203, 50,176, 87,104, 21, 28,216,106, 25,136,
-142, 95,129,150,187,205, 76, 60,240,237, 67, 0,168, 26, 54,214, 69,194,170,151,251,187, 51, 42, 9,171, 94, 94, 53,108,236,201,
-152, 99,203,181,197,149, 69, 40,145, 84,220,186,101, 75, 13, 15, 23, 17, 4, 52, 5,134,161, 32, 96,104,152, 44, 44,250,191, 63,
-240,173, 93,230, 50, 85,141,110, 52,240,145,227,129,141, 95,141, 25,143,142,148,230,156, 80,140,200,243,208,129,189, 2,149,155,
- 4, 12, 67,129,161, 1,134,166, 16,159,110,196,240,225, 31,185,149,213,176,191,211, 82,213,116,210,128,224,174, 33,117,203,213,
-223,126,137,114, 11,121,103,128,103,166, 73, 62,108,219,254,211, 3,249,214,227,175,240, 60, 55, 63,233,194,210, 19,197,137,152,
-205,230,244,174, 97,239,184, 82, 2,133,252,228,190, 13,109, 4, 52, 5, 27,203,195,206,242, 96,243,215, 70,165,242, 91, 48, 52,
- 77,129,231,120,140, 28, 57, 28, 93,195,222, 49,112,118, 46,201,249, 74,142,222,116,236,228, 69,111,179,141,195,130,229,235,166,
-235,243,212,211, 99, 31,122,198,235,242, 50,199, 27, 51, 30, 57,189, 14, 6, 13,190, 73, 98,204,189, 81, 91, 14, 93, 70,221,218,
-181,192,114,142,114, 6,151, 87, 96,203,225,203,168, 25, 92,211, 81,110,142, 71, 80,160, 18, 77,155, 52, 5,128, 55, 50, 90, 2,
-137,203, 15,109,187, 15,153,214,163,255,199, 80,121,123,131,230,109, 61, 78, 30,222,210,227,215,159,230, 79,178,155, 52, 11, 74,
- 37,198,179,207,158, 11, 60,199,149, 57,234,228,239,239,239,221,180,233,243,233, 24,237,118, 59, 42, 87,174,140,228,228,228,224,
- 55,105,167,249,249,249,117,255,241,199, 31, 85,221,186,117, 19,250,250,250, 2, 0,210,210,210, 2,142, 29, 59,214,232,199, 31,
-127,204, 72, 77, 77, 61,140, 98,102,244, 97,109,180,136, 22,128,145, 74,229,142,125, 4, 69, 79,252,236,195,250, 62,126,254,230,
-194, 62,175, 86,167,137,191,250,244, 52, 37, 16,136,242, 63, 15,154,231, 57,170,152, 40, 81, 39,161, 80, 88,104, 15,133,149,113,
- 13,225,133,110, 35,104,134,118, 92,172,118,155, 58,231,233,205, 90,165,136,196,213, 17,138, 69,171,222, 27,240,113,139,126,125,
-123,195,207,219, 13, 39, 47,220,193,232,207,190,180,217,173,182, 69,111, 84,121, 48,140, 32, 35, 35, 35,222,195,195,195,183,236,
-207, 91,170,202,239,199,143,170, 78,158,138,152,188,112,201,178, 49, 86,139,221,198,241,252,179,117,140,101, 50,137,176,115,143,
-247, 93, 85,213, 66,164,203,126, 28, 33,252, 23, 70,180, 86,191, 21,163, 37,150,185,188,255,253, 87, 99,165, 51, 54, 95,198,225,
-149,163, 51, 13,154, 76,239,103, 45, 5, 87,247,155,122, 77,110,163, 55, 41,161,210, 59, 40,148, 98, 4,163, 40,134, 81, 80, 52,
- 37,230, 88, 46,209,110,177,204, 52,102, 61, 74, 45,235,222,115, 28,143,221,127,100,148,206, 0,241,168,190,105,251, 94,149,143,
-187, 4, 38, 43,139, 1,131,134, 96,227,198,141, 46,222,110, 98,152, 44,118,204, 95,184, 80,171,139, 63,172,138, 79,204, 73,238,
-212,243,203, 19, 49,113, 25,247,158,166,154,118,148,182,108,102, 43, 11,141,193, 14,131,153, 70,141, 58, 77, 49,127, 81, 77,233,
-211,132,216, 47, 55,252,186,118,220,253,251,204, 70,142,161,167,153, 82, 31, 36, 22,122,211,249,214,237,234,234,225,185,181,207,
-168, 89,238,143, 50, 4,224, 97,197, 19, 87, 41,222, 31, 54,206,181,170,175, 12, 10, 41,227, 30,155,144,236, 55,113,210,164, 11,
- 49, 44,223, 76,163,142,137, 45,169, 60,149, 42, 85,234,219,163, 71, 15,249,132, 9, 19,132,129,129,129,248,117,203,206,138,173,
-187,246,239,153,146,154, 30,200,243, 60,124, 84,170,196,145, 31,245, 63,120,228,200,145,132,196,196, 68,225,188,121,243,154,239,
-221,187,183,118, 90, 90,154,211, 45, 83,150,231, 97, 50,179, 96,243, 31,144,234, 60,115,169,253,105, 64, 64,128, 36, 57, 57,217,
-252, 66,148,129,122, 30, 40,164,186,118,108,219, 92,240,203,209, 56,232, 76, 44, 20, 82, 33,226,210, 13,104,210,176, 30,181,134,
-181, 55, 40, 76,112,248,251,221,167,248, 40,249,176, 94,161, 85,160,242,144, 99,253,138, 89, 56,112, 41, 54, 44, 93, 71, 97, 57,
-207,140,242,147, 8, 58, 43,184,212,229,237,154, 84,243,237,208,184, 34,174, 53,169,230,123,238, 70, 84,180,172,255,194,177,201,
- 58,225,201,156, 99,227,180,133, 87, 60, 52,202,185,136,176,238,120, 2,228, 82, 1, 20, 82, 1, 20, 18,199, 43, 77, 83,101,107,
-213,250,213, 10,100, 56,118, 56,195, 8,134, 15,124,191,191,255,224,129,253,121, 48, 52,118,238, 62,216,123,243,230, 77,169, 54,
-171,101, 45, 75, 51,235,138,186,126, 94, 58,160, 52,160,114, 19, 99,210,218,123,112,149, 9,225, 34, 23,194, 85, 46, 68,135,250,
-222, 96,222,124, 18, 24,143,209,189,171,118, 27,221,167, 82,251,224, 10,202, 26,183,159,228,221, 31, 62,243,250,146, 51,185,237,
-191, 88,177,184,182,167, 46,215, 34,248, 97,226, 72, 65, 82, 74, 74,251,157, 7,207,118, 96, 45, 31, 71,217,173,250,111,213,119,
-118, 22, 26, 21, 78,138,186,212, 40, 32,164,159,212,170,179,221,189, 29,149, 84, 45,199, 44, 65,100,188, 6, 10,169, 0,202,130,
- 99, 43, 21, 64, 33, 21, 66, 41, 21, 32, 37, 41, 14,217,122,230, 66,178, 39,221, 30,103, 47,217, 75, 83,112,147,149,197,173, 88,
- 29, 42, 5, 55,132,159,159, 63, 44,221, 62,168,116, 37, 98,247,254,171,103,247,205, 49,164, 61,252,214, 89,157, 45,135, 46, 99,
-242,248, 81, 55, 40,224,102,254, 67,186,209, 15,115, 87, 54,158, 62,249,211,151,222,155, 56,109, 89,227, 55,143,100,185, 76,233,
-208,231,147,105,173, 59,247,129, 54, 59, 29,127,156,216,129,174, 61,222,195, 7, 31,127, 14,119,119,175,249,139,102,126,117,219,
-110,214, 68,188, 86,231,250,214,108, 85,175,110,173,205, 1,254,254,129, 28,231, 88,229,131,231, 1,157, 54, 15, 95,125, 49, 18,
- 28,207,163, 65,163,102, 29,164,173, 59,243,124,254,106, 32,153, 89,153,250,168,135,247, 59,153, 50,162,174, 56,125, 44, 77, 38,
-155, 90,173,198,173, 91,183, 16, 29, 29,141,200,200, 72,100,101,101,193,205,205, 77,167,215,235, 75, 21,188,175, 95,191,254,224,
-136,136, 8,169,135,135,199,179, 55, 45, 22, 11, 92, 92, 92, 48,120,240, 96, 97,151, 46, 93, 2,186,119,239, 62,244,222,189,123,
- 91, 0,104, 10, 45, 79,246,227, 20, 23,159,224,159,219,182,107, 59, 6, 0,100,174,126,177,203,127, 61, 24, 89,108,131,214,205,
-191, 98,139, 22, 45,171,129,231, 65,129, 95,106,200,138, 78, 43, 38, 74,164,184,124,249,114, 85,134, 97, 4,207,159, 65, 28,126,
- 90,191,189,230,239,231,239,246,157, 59,127,129,212, 85, 33,129, 58,207,130, 17, 31,244,113,250, 25, 44,243, 9,238,214,162, 69,
-155,253,211,167,125, 47, 80, 42, 20, 56,113, 37, 6, 99,191,152,100, 74,141,191,183,128,231,132, 43, 13,234,232,140, 50, 62, 42,
-223,202,240,184, 26,229,149,112,233,213, 85, 58,250,195, 94, 82,139,141, 69,174,222, 6,179,149, 5,203,241,200,211,219,112,255,
-169, 22, 94,174,165, 95,202,141,231,249,166, 0,188, 1,168, 41,138,186,246,226,118, 65,131,174,192, 27,191,178,157,153,255,124,
-240, 4, 96,129, 99,164,254,179,203, 39,127,187,168,247, 11,190,127, 31, 64,173,124, 77, 22,192, 85,138,162,114,138, 48, 91,175,
- 69,185, 4,135, 14, 29,226,123,244,232,241,172,198,127,117,251, 85, 36, 34,161,191,194,205, 27, 60,255, 0, 47, 46, 96,172,242,
- 13,200, 90,176,104, 73,185,207, 62, 25,149,160,201,205,174,152,255,246, 73,103, 30, 22, 2,138, 89,212,182,101, 72,151, 49,159,
-124,130,224,170,229, 69, 44,203,242,247,162, 99,109, 27,214,173, 31,118,238,146,120,137, 38,233,222,148, 23, 66,144,165, 26,246,
-201,114,108,210,171, 17, 44,150, 99, 95,109,221,190,166, 73, 81,128,187, 82,140,159,143,198,129,231, 1, 10, 60,220, 20, 66,108,
- 59,147,132,216, 27,123, 52, 61, 26,104,244,131,231, 78,237,208,190,219,184,136,251, 79, 76, 59, 50, 50, 76,199, 1,164, 21,167,
- 89,120,133,206,193,108,101, 97,179,219,177,235,224, 65,132,117,104,142, 22, 45,154,163, 77,235, 22,130,235, 55,238,124,252,201,
-152,145,129,120, 62,186,227,153,166,212,167,122, 83,165,155,215,142,190, 99,230,185,220, 77,178, 67,192, 0, 85,124,101, 40,231,
- 34,130,197, 78, 33, 94,109,205,191,115,220, 49,118,226,180,114,147,191, 28,115, 68,163, 22,215, 5, 30, 88,139,219,119,131,193,
- 32, 30, 50,100,136,208,102,179, 89, 7,143,248,188, 75, 90,154,186,247, 79, 75,255, 39, 81,169,124, 96, 48,217,113, 35,242,113,
-173,233,211,167, 85, 57,120,236,204,190,169,147, 70,239, 15, 11, 11,115,219,190,125, 59, 87,210,241,124,169,133,152,158,185, 98,
-253,230, 93, 27, 23, 47,152,141,168,132, 28,172,251,101, 37,120,214,254,115, 9,135,234, 69, 77,126,200,144, 33,178,125,251,246,
-149, 79, 74, 74,210, 24, 12, 6,245, 75,241, 8,154, 18,164,103, 27,224,229, 34,134, 72, 64,195,199, 67, 10,149,155, 4, 66, 6,
-160, 41,138, 45, 76,115,221,142,195, 51, 57, 67, 30, 14,108,181, 12, 92,191, 98, 22, 62,254,236, 59,220,203, 20, 31,163,229,110,
- 51, 63, 29,216,119,178,183,140, 13,243,119,167, 85, 29, 26, 87,130, 66, 42,194, 55,227,134,160,217,141,120, 85,114, 46,247,157,
-218,200, 52,156,118,236,217, 98,221, 39, 95, 14,142, 56, 34, 88, 46,114, 33,142,109,158,159,161,207, 83,231, 21,116,201, 89,204,
-166, 4, 39, 47,227,147,133,180,108, 39, 55,172, 87,103,214,152,240,225,116,203,208,102, 60, 77, 11,145,169,181, 80, 60, 15,124,
- 49,118, 52, 62, 29, 61,210, 55, 49, 37,227,135,149, 43,127,158, 18,241, 59, 63, 67,175,126, 56,181, 56, 77,154,114, 68,129,148,
- 82, 1,148, 50,135,113, 81, 74, 5, 48, 89, 88, 80, 20, 24,247, 10,141,242, 40, 71, 36, 55, 37, 59,161,200, 22,248, 75,154,229,
- 42,212, 57,245,123,172, 75,205,156, 29, 57,151,226, 82, 34,103,222,184,147,126, 21, 64,118, 96, 27,247,161, 86, 59, 15,157,201,
-142,184,116, 3,236, 86,158,250,248,157,138,168,220,143, 10,158,189,254,230,198,163,119,224,250, 66,165,255,146,102,242,229, 93,
- 38,207,186,125, 6, 44, 94,246,203,181, 5,179,190, 99, 50,243, 44,224,120, 30, 82, 49, 3,153, 88,144,255,195,192,168,207,195,
-202, 85,107,210,236,160,250,226,236, 89,123,105,174, 79,112,252, 7,125,186,181,217, 70, 1, 98,138, 22, 37,249, 87,172, 84,177,
- 99,207, 97,210,142,189,134,128,181, 91, 38,223, 56,207,159, 54,100, 68,157,114, 70,179,110,237, 90,160,128,155,250,140,232,209,
- 0,160, 80, 5,253, 92, 51,184,102,227, 87,223,171, 94, 61,184,177, 51,231,253, 89,164, 84,234,242,153, 71, 57,239,239,130,235,
- 52, 84,165,231,152, 41, 23,207,242,136,123,116, 11, 91, 87,253,176,137, 51, 89,166,157, 58,188, 99,214,146,117,123,223,239, 24,
-214, 7,235,127,250,223, 55, 89,169,207,140,214,201, 23,162, 85, 31,108, 88,187, 58, 80, 40,150,192,102,231, 96, 99,121,199,171,
-157, 69,118,118, 14,108,118, 14, 82,185, 11,236, 28, 5, 27,203,193,102,231, 96,182,216, 21,163,135,116,255,196, 4, 92, 41,172,
-156, 1, 53,219, 30, 23, 73, 36, 21,121, 56,214,174,229,121, 30,113,105, 70,218,207,207,111, 11, 0, 72, 36, 18, 72, 36, 18,112,
- 28,135, 27, 81,234,207,188,130,131,198, 32,223,224,177, 86, 75, 66,110,252,197,174, 69,237,187,175,175,111,207, 87, 77,150,201,
-100,130, 78,167,195,249, 75,215,220,214,110,220, 21, 22,151,144, 84,149,227,221,204, 46,170,170, 93,181, 25, 49, 61,139, 58,158,
-218,244,168, 79, 92, 67, 70,210, 19, 62, 29, 90,125,217,134, 67, 87, 31, 31,159, 89,108,158, 86,229,142, 95, 91, 38,140,122,175,
-201,220,165,235, 30,229, 92,252,121,124, 73,231, 72, 32, 16, 8,213,106,245,179,251,123,249,154,173, 77,110, 70, 37,191,187,100,
-241, 18,233,141, 24, 45,238,198,165, 96,104,167, 10,142, 22,142, 19,231, 93,225, 83,213,171, 74,181,106, 91, 86, 46,157, 43,120,
-148, 98,194,138, 61, 87, 17,177,255,231,243,105, 25, 87,194,144,158,106,124,147, 58,228, 45, 24,173, 34, 53, 79,223,201,132,206,
-100,135,217, 98,135,141,227,161, 49,216,144,145,107,129,198, 96,133,206,104,199,208,206, 21, 10,253, 94, 9,126,196,155,162,168,
- 67, 60,207,247,224,121,190, 19, 0,113,193,182,227,153, 77, 29,202, 55,100, 47,109, 79,158, 60,249,219, 57,115,230, 68, 22,124,
-182,224,253,130,207, 22,247,254, 11,223,247,252,230,155,111,234,206,157, 59,119,118,104,104,232,182, 63,254,248, 35, 22, 64,142,
-179,221,135,130, 23,119,230,208,161, 67, 37, 29,232,170, 86,155, 85,226, 42, 19,162, 74,229, 10,248,232,219,245, 94,191,205, 29,
-158, 33, 21, 11,152,163, 71,143,150,203,178, 40, 65,211,140,211, 77, 20,165,119,141, 22, 34,145,248,240,194,133, 11, 49,176,103,
-107,217,211, 76,155,238,206, 83, 99,186,222, 2,187,202, 59, 72, 60,115,246, 92,229,220,121,243, 63, 61,116,128,203,213,165,223,
-159, 95,120, 23, 95,147,235, 12,245, 66, 14, 22, 69,129,231,216,164,156,248,107, 77, 0,160, 44,185, 88, 58,147, 13, 76,126,110,
- 13, 69, 1, 6,147, 29, 12, 67,101,228, 70,237,184, 63,120,198,204, 14,155,182,253,158,194,211,238, 90,189, 62, 78, 14,199,154,
-131,165,198,100, 97, 97,182,177,136,188,125, 3,109, 66,106,163, 69,147,154, 48,152, 88, 24,204,118, 84,174, 22, 12, 0, 94,133,
-158, 56,134,142,229, 89,155,137,231, 89,151, 30, 77,189,161,114, 23,195,207, 67, 2,137, 88, 0,155, 29, 48, 90, 56,152, 44, 44,
-226, 51,140,208, 26,101,168,215,182,127, 21, 79,191,235,230,180,120,217,190,236,167,215,251, 22,107, 78, 89, 22, 27,182,236,170,
-158,146,146,222,251,200,190,205, 18,181,198,134, 59,241,122,100,228,154, 1,198, 27, 63,206, 94, 33,249,122,124,248,187, 27,182,
-238, 78,232,216,186,121, 66,105,247,217,160,142,218,180, 99,231,174,159,123,244,120, 87, 22,121,229, 8, 30,221, 58, 53, 75,159,
- 81,170,252, 44,186, 65,131, 6,246,240,240,112,237,236,217,179, 3, 15, 28, 56, 80, 89,173, 86,223, 2, 96,115,119,119,175, 25,
- 84,189,226,237, 19,199,142, 6,116,127,183,191, 48, 41,211, 8, 55,185, 8, 21, 85,114, 92, 58,127,220, 38, 22, 11, 11,205, 55,
-201,239, 30, 28,132,142, 95,225,192,165,216,176,200, 44,233,153,145,195,135, 38,156, 56, 23,149,181,124,227,137,255, 5, 40,109,
-183,164,156,122,249,245, 38,213,124, 39,143, 29,130, 57,203, 54,225,236,141,168, 12, 61,237, 55, 43,213,108,255,189,232, 80, 58,
- 32, 96, 40,184,200,132,208,107,212,121, 79,110, 30, 11,122, 75, 97,234,161, 39,246,109,162,179,181, 54, 36,102,154,168,148,108,
- 45, 88,142,135,187, 92, 4, 59,199, 35, 55, 59,147,218,188,105, 35,174, 93,187, 68,131,161, 71, 0,152, 90,236, 1,165, 28, 93,
-133, 74,169,208, 17, 17,146, 57, 94,109, 44,135,224,234,213,176,122,249, 34, 87, 47,149, 15, 90,181,113, 62, 55,218,197,179, 98,
-131,109,191, 46,199,153, 63,110,182, 59,187,100, 69, 83,165,191,247, 50,138, 98, 23,128,135,201,108,101,145,151,155, 3,177, 37,
- 17,205, 2,212, 40, 39,103, 17,175,241,195,189,180, 71,202,146, 42,252,172,123,123,111, 81,252,187, 83,118, 29,140,152,211,181,
-115, 59,220,139,215, 64, 38, 22, 64, 42,102, 32, 21, 51, 16, 82, 44, 22,173,250,217,150,147,167,237,145, 21,185, 63,243, 13,174,
-207,147,249,173, 95,135,185, 99,117,222,155,150, 77,249,109,228, 87,243,186,134,245, 25, 70,221,187,118,250, 91, 3,112,202,185,
-134, 30,239,212,123, 28,231,252, 51, 78,234,226,181,116,220,215, 51,199,117,233,209, 31, 12, 35,128,205,102,195,238,237,155,240,
-235,138, 31, 31, 90,116, 89,195, 0,112,150, 12, 38,124,199,166, 85,253,191,250, 97, 17, 85,183, 65,179,230,167, 83, 95, 95,142,
-150, 99,168, 95, 62, 28, 62,106,128,143,143,143,203,243,136, 22,143,160,224,218,232,214,235, 61, 28,223,191, 23,247, 35,239,128,
-227, 29,134,137,227,120,228,230,100,165,217,109,150, 13, 69,246,120, 72,165, 21,215,255,186,177, 6, 77, 83,176,218, 56, 88,236,
- 28,198,127,242,145,101,244, 23,223,182,234,214,165,109,164,152,129, 38,254,105,170,251,165,155, 15,234,113, 66,101,224,240,137,
-139, 68, 38, 51,139, 60,131, 13, 71,214, 21,237,117,164, 30, 21, 66, 43, 53,238, 54,124,244,247,171, 37, 18,134,182,214, 9, 10,
-140,109, 27, 82, 39,177,130,191,151,118,250,220, 21,205, 46, 92,185,217,237,253,193,195,165, 67,107, 54,166,252, 61,101, 46, 31,
- 13,238, 83,159,181, 91, 63, 52,100, 39, 22, 57,191,160, 80,238,145, 91,161,114,117,195,243,136, 81,208, 30,138, 71,149,151,156,
- 7,133, 88, 99,122,116, 95, 0,240,243,175, 96, 18, 74, 92,181,165,136,192,240, 0,176,108,205,214, 38,183,163, 83, 70, 46, 94,
-188, 68,126, 35, 70,139, 91, 49,121,144,136,104, 88,109, 28, 40, 39,131,218, 28,207,140,250,238,155,201,174, 57,122, 22,103,238,
-168, 17,121,253, 52,111,209,153, 6,203,237,174,125,161,114,249, 16, 64, 53, 0, 79, 40,138,255, 69,159,238,187, 31, 56,107, 47,
-237,117,207,113,142,246,178,171,119,213, 42,172, 64,210, 77, 40, 86,132, 82, 20, 95,135,226,225, 1,240,201,217,249,207, 84,103,
-157,154, 62, 61, 26,243,102,255,128,165,107,247, 34, 37,203, 4, 55, 54, 17,251,215,205,196,132, 57, 91, 96, 52, 23,157,213, 80,
-146, 31, 41,204, 24,189,106,184, 10,126, 47,248,220,156, 57,115,122,188,114,110,122, 20,113,206, 94,251, 92,193,247,231,206,157,
- 59,251,133,191, 27,156, 53, 89,207,140, 86,193, 78,149, 96,182,130,188,253, 42,254,177,127,223, 30,143, 28,157, 21, 82, 17,131,
- 10,149,171, 99,234,242,253,222,239, 52,241, 66,166,213, 13, 91, 87, 47,200, 54, 25,180,219,157,170, 44, 84,193,205,101, 74,197,
-145, 61,187,247,162,106, 5,149,104,243,249,236,184,155,177,198,103,161, 94,141, 58, 65, 92,217,213, 32,232,219,167,143,252, 84,
-196,233, 47,116, 64,161, 70,139,161,152,242,107, 54,238, 86,185,200,132,160, 40, 64,107,180, 99,228,135,239,149,253, 49,198,115,
-204,240, 97, 67, 65,229,155, 44, 77, 86, 26,190,253,250, 19,147,194,246,232,254,211,248,167,201,157,122, 78, 56,165,209, 81,166,
- 1, 67, 62,185,118, 63,122, 78,142,193,240,102,139,252,152, 45, 44,204, 86, 14, 49, 49, 79, 48,126,104,103, 8, 25, 26, 12,195,
- 57,146,165,237, 69, 95,140,186,148,232,108,248,138,250,109, 90,248,217, 26,127, 31,149,167, 82, 33,227,149,114, 9, 85,167,102,
- 13, 81, 72, 72, 11,113,229,224,250,162,243, 15,140,120,170, 54, 34, 54, 37, 15, 18,159,134,130,129, 29,222,193,166, 37, 19,219,
-101, 63,189, 78,227,245, 36,197,151,248,253,204,229,158,107, 87, 45,150,164,231, 90,241,240,169, 14,105, 57, 38,164,230,152,145,
-150,109,130, 82, 38, 68,155, 94,225,146,195,251,127,233,217,177,117,243,101,111,178,223,177,177,113,135,227,147, 83,251,215,111,
-212, 12,155,126,251,181,181,187,123,101,215,220,220, 56,141,179,103,103,230,204,153,226,185,115,231, 10,150, 47, 95,174, 9, 9,
- 9,241,253,230,155,111,186,102,100,100, 92,173, 84,169, 82,240,241, 61, 27, 34, 26,182,233,221, 20,156,213,187,117,219,246, 34,
- 9, 39,192,137, 67,135,172, 59,182,111,206, 50, 26,181,163,139, 53, 28,114,183,153,233, 58, 10,222, 1, 1,145, 74, 49,219, 89,
- 64,231, 70,231, 28, 27,183, 49, 7,216, 83, 53,108,236,201,211,215,163,162,155,220,136, 87, 69,220,120,156,145,109,176, 6,197,
- 28,155, 80,108,197,203, 80, 20,132, 12, 13, 23,153, 0,116,126,173,170,244,175,255, 24, 20,229, 93, 16, 57,165, 64,229,191, 2,
- 20,133,148,156,167,183,156,200,217,160,120,142, 7,162,146,244,208,153, 28,161,249,242, 94,114,168,211,147,240,211,178, 13,184,
-121,253, 26,186,188,211, 11, 43,215,108,198,200, 15,251,155, 74,106,253,208,116,126, 68,235,133,104,150, 82, 38, 0, 64, 33, 87,
-111,195,238, 11,137,168, 86,133,118,250,193, 0, 0, 46, 74, 57,242,180, 70,208, 34, 23, 60,185,113, 68,126,244,244,149,111,166,
-204, 88, 60, 41, 39,245,206,211,199,119,207, 35,216, 43, 15, 85, 2,172,136, 76,115,197,245,172,202, 8,174, 94, 21,180,232,154,
- 83,218,153,145,245,230,237,167,119,247,104,210,176,118,104, 69,149, 59,140, 22, 54, 63,170,197,224,215,245, 27, 17, 31,151, 52,
- 60,235,254,254,155,111,195,209,234, 51, 98,213, 18, 85,245, 79,239, 94, 57, 21,219,103,240,167,240, 11,168,208, 32,247,233, 45,
-167,211, 22,156,121,143,117,210,104,137,228,238,223,140,255,238,127,227,186,116,239,135,203,231, 79,225, 86,228, 19, 52,111,222,
- 20,239,188, 59, 16, 90, 77,118,205,157, 27,151,116,182, 27,180,199, 5, 18,251,184,102, 45, 58, 80, 28,203,226,209,195,123, 79,
- 10,211, 50,166, 70,221,186,148, 26,229,250, 82,247,148, 87,205, 6, 74,183,114,183,204, 86, 22,201,201, 73,184,248,199,153, 70,
-198,212,168, 91,165, 57, 94, 18, 17,131, 19, 55, 51, 96,181,113,176,218, 57,180,105,219,217, 34,162,205,173,103, 45, 94, 31,146,
-154,146, 74, 43, 92,189,184,114, 1,181, 68,126, 18,171,249,118, 76,158,200,106,227, 80,213, 95, 81,172,166,183,127,245,217, 19,
- 39,142,175,197,136,100,208,234,205,150,212,148,100,223,213, 91, 79,235, 30, 60,188, 27, 80, 94,229,230,250,191, 37,191,136, 52,
- 38, 10, 25,121,102,100,107, 53,212,224, 81, 95,249,175, 93, 49,231,131,226,140, 86, 33,233, 34, 85, 14,159, 56, 95,211,195, 69,
- 68,233, 76,118, 46, 75, 99,101, 7,191, 91,182, 65,151,249, 38, 43,124,241,162, 37,242,155, 49, 90,220,142,201,131, 84,196, 64,
- 44,162, 97,177,113,112,242,118,162,125, 85,190,163, 91, 52,169,135,227,183, 50,193, 48, 52,140,218, 28,131, 0, 89,209, 77,218,
-117,145, 55,110, 22,130,246,237,218,226,113,116, 84,133, 67, 7,118,119,188,116,241,108,154,221, 26,244,153, 94, 29,189,183, 84,
-129, 5,131,129,177,137,125, 63,242, 11,168,212,178,239,192,143,220, 42, 86, 8,160, 84, 94,158,176,243, 2,132,127,248,158,211,
-119,190,195,152, 3,115,103,124, 3,179,217, 2,111,119, 49,120, 30, 88,191,108, 42, 44, 22, 11,252, 61, 37,200,211, 23,189,154,
- 92, 73,126,164,168, 40, 84,169,114, 79, 94, 48, 99,197,189, 79, 81,212,161,201,147, 39,127, 11,128,159, 60,121,242,183, 5,219,
-115,230,204, 49, 2, 72, 41,161,235,112,245, 75, 70,171, 96,231,138,190,187, 69,193, 94,158,126,151, 78, 28, 63,230,182,239, 54,
-135,203,123,175,163,123,115, 63,136, 4, 52,228,110,254,184, 29,151,135,195,123, 86,229,238,223,246, 75,178,217,108,158, 95,114,
- 95,115,245, 38, 74,185,226,248,111,155,182,115, 94,158,158,244, 79, 39,212, 49, 89, 90,251,179, 46,173,232, 43, 7,184,235,199,
- 87,251,241,160,142, 73,165,210,234, 22,139,197,163,164, 19,187,254, 68, 66,126, 18, 47,245, 54,234, 86, 80, 12,195,110,218,188,
- 9, 94,174, 98,152,109, 28, 38, 79,250,220, 56,180,139, 50,119,240,251, 3, 59,180,239, 54, 46, 66,168,168,113,170, 69,163, 26,
-124,195,134, 13,115, 25,134,113, 42,149, 66,165, 82, 77,165,105,122,144, 88, 44,118,177, 88, 44, 90, 11,103,146,235, 77, 22,152,
-172,128,193, 96,130, 80,228, 48,139, 66,134,130,209,100,129,193,104, 41,254,198, 72,187,119, 1, 64,144,230,133,152,210,169, 7,
- 85,197, 91,118,238,255,188,223,251, 3,166, 4, 52,120, 87, 25,151,154, 7, 17,101, 69,211, 90,126, 56,125,108, 47,159, 20, 31,
- 61,190, 36,147, 5, 0, 25,234,236, 64,111,111, 31,220,140,213, 33, 57,203,136,180,124,147,149,154, 99,134,214,168, 69,253,138,
-254,200,205,203, 11,124,227,227, 11,236, 61,126,252,120,255,110,189, 7, 96,220,164,105,173,214,173, 90,112, 71, 33, 22,126,172,
- 79,127,116,198, 25,163,117,239,222,189,236,175,191,254,186,218,154, 53,107,232, 15, 62,248,192, 88,175, 94, 61,233,144, 33, 67,
- 90,109,220,184, 81, 42,151, 75,141,183,207, 31,152, 50, 98,236,228,222,171,151,206,108,144,147,147, 67,217,109,182,163,214,156,
-156,201,186, 18,204, 92,226,129,111, 31,254, 24, 99, 29,214,185,181,247,129,114,114,186,142,132,183, 12, 68,173,169,219,241, 96,
-170, 53,230,216,114,173,172,255,194,177, 41,185,220,119, 38, 90, 53,171, 36,147, 5, 0, 52, 67,193, 98,103,225, 34, 19,130,166,
-233, 2, 19,239,247,235,246,163,114,111, 55, 49,132, 12, 13, 1, 67, 65, 99,176, 33, 83, 99,197,167, 31, 57, 59, 67, 8,207,217,
- 89, 30, 70,139, 29,134,252,214,161, 86,147,137,111, 38,125,137,119,122,246,193,136,209, 95, 34,199, 8, 92,143,213,194,106,179,
-149,120, 83,208, 20, 13,131,217,142,143,187, 84, 68,182,206, 10,189,209, 14,139,157,131, 92, 44,128, 80, 64, 67, 33, 21,192, 85,
- 46, 4,120, 94, 84, 80,153, 8,133, 66,147,205,102,219, 84, 76,139, 30,149, 3,125, 96,180,209,104, 54, 96, 1, 58,133, 6, 33,
-242,194,110,193,217,203,119,171,124, 49,233, 59,124, 62,178, 39,118, 61,172,134,114,170,138, 80, 42,100,176,241, 52, 0,222,201,
-132,189,169, 28,109,237, 51,232,231, 53,235,163,166,255, 48, 89,154,171,167, 32, 17, 49,136, 56,117, 18,151,174, 92, 95,154,121,
-127,255, 38,188, 69,132, 60,237,227,234,234, 10,169,152,129,197,106,182, 56,159,186,192,131, 7, 26, 41, 84, 65, 63,231,183,248,
- 27,177, 28, 10,121,175,100,163, 37,144,186, 78,254,108,210,244,217, 93,186,247,195,137, 67,187,176,115,215,118, 54, 52,108, 56,
-179,249,215, 85,104,213,169, 23, 90,117, 25,128,163,123, 55,126,169,231,168,218,225,227,166,204,104,211,161, 27, 78, 28,222,133,
-244,180,164,133,206,150,151, 17, 82,227, 58,116,238, 9,147,133, 69,235,142, 61,112,236,224,222,177,200, 31,100,225,252, 67,236,
-149,250, 25,180,253,203,241,227,132, 25,185, 22,161, 90, 99, 65,146,218,128,184,116, 3,246,111, 91,199, 59, 95, 95, 88,154,182,
-169, 95, 94, 24, 62, 47, 34, 49,176,188,159, 89,104, 54,202,162,159,196,212, 28,241,209, 80, 97,149,234, 53,233,140, 60, 51,212,
-121,102,100,230,153,161, 51,217, 81,189,124, 13,218,102,167, 66, 75,123,158,189,220,196,194,149, 7, 99,225,170, 16,162, 69,205,
- 55, 31,104,203,113,220,115,147,181,216, 97,178,238,196,230, 65, 34, 98, 32, 17,209,144,136, 24,216, 89,222,169,134,139, 76, 21,
-212,237,211,207, 62,241,183,216,129,172, 60, 11, 4, 12, 5,149,151,135,162,105,131, 65, 88,191, 96, 44, 0, 96,228,215, 63, 97,
-196,199, 67, 80,171, 78, 61,228,230,228,248, 14,234,215,109, 49,128,189,206,150,245,200,137, 51, 21, 78,156,187,249,245,167, 19,
-127, 84,190,223,179, 61,115, 43, 38, 15,169,217,102, 60,137,214,150, 42,242, 6, 0,118,150, 3, 15, 30, 27,182, 31,130, 76, 44,
-128, 58,207, 10,158,231, 49,115,249, 14,184,200,132, 72,205,113,116,247, 23, 71,177,126,164,152,136, 84, 41,162,141, 61,224,200,
-229,242,118, 54,162, 53,103,206,156,200, 57,115,230, 20, 26, 33,123,193,100,189,217,162,210, 34,145,162,166,171,167,215,229, 19,
-199,142,184,236,189,205,226,244,237, 44,244,107, 93, 30,186,236,167,152, 63,233,253,108, 10,188,133,102,152, 92,179,209,176,199,
-104,212,207, 2, 96, 45,246,162,241, 13,106,164,144, 42, 79,174, 92,253,155,221, 75,165,194,166,243,217, 73, 57,122,187,237,121,
-183,149,141,186,126,124,117, 21, 59,103, 11, 51,165, 63,190, 86, 82, 75,156,227, 33,154,179,106, 63, 0, 30, 28,199,129,231, 56,
- 8,165, 74,133, 87,213,144,244,252,138, 78, 42,160, 41,211,139, 53, 0,207,217,147, 50, 99,139, 15,131, 82, 0,220,228, 66,108,
- 63,155, 12, 0,233,140,246,198,131,193,239, 59,186, 11, 77, 22,169,166, 78,181,106,124,211,166, 77,115,101, 50,167,166,191, 98,
-124,124,124,174, 78,153, 50,165,230,136, 17, 35, 36, 98,177, 24,118,187,189,220, 47,171, 87,115,171,103,141, 68,223,177, 43, 33,
- 18, 75, 96, 52, 89, 33, 20, 10,144,147,167, 67,174,198, 0,173,193, 86,250, 43, 40, 38,198,162, 6,230,237,219, 43,238,211, 85,
- 89,191,153,152, 22,161,113,176, 31, 78, 31,223,199, 95, 62,182,126,164, 49, 35,250, 55, 39, 47, 68,232, 76, 54,164,100,153,144,
-156,101, 66, 90,142, 9,105,217,102,164,229,152, 64, 81, 20, 76, 22,123,153, 30, 92,250,140,168,157,155,126, 91,219,203,108,197,
-192, 54, 93,250,224,203, 31, 87, 86,220,244,243,220,147,177, 60,221,210,201, 68, 91, 54, 50, 50, 50,254,163,143, 62,106,176,117,
-235, 86,166,110,221,186,198, 7, 15, 30,200,243, 77,164, 85,169,148,203,214,173,152,115,188, 89,179,102,219,146,163, 31, 70,228,
-247,167,151, 88,177, 87,108, 59, 76, 34,179,222, 12,175,160,104,209,181,170,175, 28, 21, 20,218,174, 53,149,183,231,103,117,248,
-124,182, 58, 98,105, 70,170,217,254,187,218,200, 52, 76,214, 9,157,202,193,179,153, 77, 9,125,251, 13, 4, 67,209,176,154, 12,
- 9, 5, 23,151,202, 77,140,169,155, 31, 66, 41, 21,194, 69, 38,128, 82, 38, 68,171,218,229, 80,138,250,140,183,177, 28, 12,102,
- 22, 70,179, 29, 38,139, 29, 94,129, 30, 88,179,105, 39,158,102, 24,177,255, 90, 38,162, 18,180,168, 81, 94, 1,158, 47,185,154,
-228, 88,155,190,231,123, 31,184, 48, 52, 5,134,166,232,218, 53,131,144,173,179, 66, 36,160, 33,146,202,160,144, 8,224, 42, 19,
- 66, 36, 18, 34, 35, 35, 3,102,179, 25, 21, 42, 84,144, 22,111, 5,121,184, 40,101,168, 81,197, 31, 86,155, 29, 71,206,221,199,
-172,241,125,209,185, 77, 19, 80, 66, 37, 30,154, 27,193,165,156, 11, 56,154,134,213,206,193, 98,101, 1,208,166,162,244, 2, 3,
- 3, 59, 40, 20, 10,133,193, 96,208, 62,125,250,244, 76, 90,212,222,167, 44,211, 59,252,216,137,136, 77, 61,222,233,140,155,119,
- 34,177,107,239,129,243,153,158,121, 19, 11,190, 83,167, 78,157, 16, 47, 47, 47,101, 86, 86,150,230,222,189,123, 87,223,180, 93,
-192,211,244, 23,161,173,218, 65,151,155,129,244,196, 56,167, 91,209,181, 42,186,224,251, 57, 43, 27, 7, 7, 5, 55,102,121,135,
-241,170, 93,193, 5, 19,126, 92,214,184, 90,141,160,198, 5, 3, 66,106, 85, 40,126, 90, 54,129,220,165,203,135, 35,190,156,211,
-171,223, 48, 68,156, 56,128, 69,179, 38,109, 82,184,121,215, 42,231,225,214,176,110, 72, 23,156, 63,121, 0, 82, 23, 95,120,120,
-250,182,250,224,227,207, 58,245,251, 96, 20, 46,157, 63,137,165,115,191,221,200,154,181, 91,156, 41,171, 66, 85,197,187, 65,163,
-102,131, 93,202,249, 32, 55, 79, 11, 23, 15, 21,106,213,111, 58,248,254,109,243,215,250,140, 88,245, 27,155, 14,158,135,217,202,
- 35, 71,103, 69,162,218,136,248, 52,135,209,226,184, 82,228, 4,177, 28,165,148, 10, 4,229,108,143, 43,220, 61, 25,193, 87, 12,
-244,161,230,205,152,196, 88, 33,133, 58,215, 97,178,212, 26, 11,212,121, 22,232, 76, 54,148, 83, 8,192,177, 92,169, 91,221, 57,
- 58, 43, 92,228, 66,184,201, 69, 78, 71, 25, 11, 99,213,175,219,131,111, 71,167,188,187,104,209, 18,249,173,216, 23, 76,150,208,
- 17,205,146,136, 24,176, 28, 7, 56,113,199, 11, 5,194,113,189,187,117, 66, 98,166,209, 49,106,153,166, 80,163, 94, 51,120,201,
- 56,116, 28, 48, 25, 0,208,179,155, 35,181, 45, 54, 85,143,131,151,213,192,203,137,221,197,215,197, 70, 35,179,122,243,225, 47,
-118,238,216,230,102, 98, 5,248,229,104, 60, 12,102, 59,164, 34, 6, 18, 17, 3,153,136,121, 41, 31,187,100,163,229,200,185,123,
-154,105,131,193,100,130,198,104, 3, 15,224,234, 99, 29,140, 22, 59,242,244, 54,132,212,244, 40, 91, 32,132,162, 14,243, 60,223,
-253, 85, 67,244,170, 89,122, 33, 34, 85,152,198,181, 23, 53, 10, 62, 95,148,145,123, 49,103, 11, 64,169, 70,112, 9, 94,117,142,
- 47,110,139, 20, 30,181,220, 92,220, 46, 31, 59,122, 72,185,247, 54,135, 51,119, 28, 38,203,102,204,196,194,175, 7, 37,105,114,
- 51,219, 3,136,113,246,159,201,189,106,213,151,138, 37, 17,255, 91,242,139, 85,229, 19,192,237,185,156,155,145,103, 96, 95,114,
- 19,172,217, 76,216, 55,223,224, 0, 0, 32, 0, 73, 68, 65, 84,243, 28, 47, 50,165, 63,118,170, 15,129,166, 41,235,143, 99,251,
-128,227,121, 76, 93,178, 19,179, 39, 14,128, 82,246,129,156,162, 40,185,222,100,199,248,105,107,177,240,251,225, 46,114,137, 0,
- 20,229,200,137,250,112, 96, 31,231, 46, 64,147, 29, 79,174,108,213,105, 99, 15, 61,120,177,187,176,121,171,119,174, 55,111,222,
- 60,215,195,195, 3, 50,153,236,121,164,162, 8,124,124,124,190,255,241,199, 31,131, 71,143, 30,253,108,178, 79,129, 64,128, 79,
- 63,249,132,102, 89, 30, 71,143,174,135,119,165, 70, 56,240,251,101,132,117,104, 10,157,193,132,236, 92, 45, 56, 48,111,124, 33,
-106,115, 51, 35,210,226,239, 54,107,217,190, 39,206, 28,223,199, 95, 62,186,110,100,105,230,232,241, 40,231,145,120,227,238,147,
- 90, 20, 85,206, 17,209,202, 55, 89, 22, 27,135,138, 62,114, 36,198, 63,129,187,155, 91,162,179,122, 50,239,224,222, 20,205,143,
-166,192,175,215,167, 63,218, 9,128,215,167, 62, 24,180,115,203,234, 59,145,247,110,205,234, 49,120,156,160, 75,191, 79,152,159,
-231,124,246, 45, 0,103, 39,222,179, 70, 69, 69,221, 31, 62,124,120,139, 75,151, 46,177, 0, 12, 20, 69,217, 24,134,145, 91, 44,
- 22, 81,251,246,237,243, 30, 62,124,120, 22,133, 39, 45,190, 68,171,143,118,122, 81, 18,237, 59, 98,206, 58,168,162,139,182,115,
-251,214,161, 8,173, 19,136,196,214,161, 0, 48, 46, 65,167, 12, 54, 85, 91,187,221,102,151, 29,249,249,215,131,179, 71, 14,232,
- 52,126,147, 96,234,162,212, 67, 83,139, 77, 68, 77,124,112,182,107, 97, 54, 94,192,208,112,145, 9,161,148, 9,224, 34, 19,194,
- 69, 42,132,205,206,151,166,229,200,219,236,156, 35,162,101,177, 67,103,180, 35,226, 86, 58,210,242, 44,200,213, 90, 97,180,178,
-224,193, 59, 90,163, 78,212,230,234,199, 23,221, 11,158,164,238, 21, 26,229,173, 94,190,192,117,247,133,164,103, 35,250,220,228,
- 98,184,200, 29,163,177,207,157, 59, 7, 79,207,146, 91,251, 28,199, 97,215,177,171, 88,180, 33, 2,199,214,127, 5,169,136, 65,
-253,222,211, 48,236,221,230,224,120, 14, 79,162, 34,211,107,212,110,224, 67,211, 50,208, 20, 5,179,141, 3,192, 23,121, 60, 45,
- 22,139,231,211,167, 79, 53,213,171, 87,247,245,247,247,239,199, 48, 12, 15,237, 45,243,190,109,217,134, 83,135,182,200,245, 70,
- 51, 43,183,231,173,175,158,106,236,142,234,213, 65, 81, 20,239,234,234, 42,138,136,136,208,213,171, 87,207,251, 13,111, 37, 90,
-166, 10, 90, 58, 98,204, 23,253,170, 85,173,138,157, 91,214,131,231,169,221,206,126,121,243,193, 75,152,241,205,203, 35, 12, 39,
-252,184,172,241,194,105,227, 94,122,111,204, 55,139,138, 29,117, 40,147, 40, 39,246, 29, 20,142,235, 87,255,192,252,105, 19,182,
-153,117,217,195,108,118, 91,255,236,212,216,109, 85,106, 55, 7,111,213,226,196,142, 5, 24, 48,100,164,164, 75,143,126,184,116,
-254, 36,102,127, 59,102,179, 33, 55,227, 35, 56,153,228,204,241,194,209,237,187,190, 43, 52,154,173, 88, 54,239, 7,140,154, 56,
- 11, 33, 29,122, 10,239,221,186, 60, 26,192,116,167,211, 33,172, 44,218,215,243,114,152,103, 27,135, 3,177,140,160,176, 43, 80,
-192, 80,116,195,170,238, 48, 90,236,208,148,208,168, 20,136,132,105,185,121,154, 74, 43,102,127,193,232, 77,118,168,243, 44,200,
-200, 51, 35, 51,247,185,193,202,204, 51, 67,157,103,129, 80, 64, 33, 58, 38, 1,180, 80, 80,234,252,188, 28,157, 13,205,130, 60,
- 28,247,232, 27,246,142,216, 4,174,205,143,157,189,221,119,209,162,197,210,219,113, 90,220,137,213,228, 71,178, 24, 72,132, 52,
-196,249,191,179,156, 35, 55,178, 56, 92,189,171, 86, 25,250,225, 7, 29, 93,149, 50,164, 60,202,128,128,113, 76, 17,227,166, 10,
-132,155,196,132,207,198,132,195,203,211, 29, 79, 51,205, 88,186, 55, 26,119,238, 63, 6,103, 44,221,110, 47,251,101, 91,216,136,
- 79, 39,184,211, 66, 49, 54, 30,143,115,148,147, 97,241,240,242, 65, 83,202,147,187,122,157, 38,139, 7,207, 58,153,131, 76,241,
-118,214,113,185,205,158, 58, 25,219, 54,252,132,227, 55, 50,158, 93,129, 23,118, 47,196, 23,223,204, 68,166,198,130,194,174,203,
-226,252, 8, 0,245, 11,145,168,215,182, 95, 48, 71,133,109, 83,249,219,150, 34, 52, 44,175,152, 43,203, 43,239, 91, 94,209, 43,
-108,238,191,213, 37,118, 29,190,102,138,220,189,235,202,165,138, 63,142, 30, 61,168,216,119,135,127,102,178,172,134, 76,126,214,
-184,158, 73,154, 92,117,151, 82,153, 44,239, 26,117, 37,114,201,217, 41, 51,151,154,125, 2, 42,217,143,220,210,100,105, 77,172,
-253,245, 28, 4, 5,171,112,243, 54, 9,196,146, 69, 66,163,229,135,204,204, 7,250,146, 34, 79, 28,207,227,208,149, 52,240,188,
-163,137,180,227, 92, 50,242, 91,230, 96, 57, 71,183,202,239,183, 50, 32,200,207, 67,113, 54,252,189,234,151,159, 52,221,235,229,
-233, 7,207,158,250,172,187, 48,164,129, 35,146,229,234,234, 10,119,119,119, 40,149, 74,148,212,117, 72, 81,212,135, 35, 70,140,
-120,173,245,159,145,145,129, 78, 29,219, 99,249, 79,107,208,160,227, 80,252,126,241, 56,172, 54, 14,245,107, 87, 69, 37,127, 15,
- 36,166,107,223,232, 70, 87,248, 4,127,218,172,253,187,223,182,234,208, 19, 17,199,246,240,151,143,253, 26, 94,218,137, 16,187,
-119,106,113,112,198,140,169, 85,166,204, 90, 33,113,145, 10,240, 64,103, 1, 77, 81,168,232, 35,135,167,130,198,153,125, 27, 77,
- 3,122,182,112,122,114,188,192,192,128, 77, 11,151,175, 86, 44,156, 59,173,253,245, 27, 84,132, 46, 37, 58, 27, 0, 12,233, 81,
-243, 30, 2,247,203,255,113,226, 72,131,182,125,224,227, 95,181,115,108,250, 67,167,205, 6, 0, 67, 76, 76, 76,236,148, 41, 83,
-130,231,206,157,203, 51, 12,195, 1,144, 44, 89,178,196,240,232,209,163, 91,112, 12,205, 69, 73, 15,155,142,157,235,140, 87,138,
-217,144,114,114,186, 78, 85, 95, 57, 66,235, 56,122, 69, 7,116,111,133,192, 10, 21, 16,147,102,104,152,109,224,132, 58, 11, 83,
-117,229, 47,119,174, 85,246, 98, 70,218,141,150,251, 0,246,151,246,252, 80,120,158, 32, 95, 16,205,114,145, 9,193, 57,174,149,
- 82, 25, 45,179,149,133,209,204,194,104,177, 67,111, 97, 97,176,176,224,120,199, 61, 65, 81, 20,172,118, 14, 78, 53,155, 95,185,
-246, 93,203,121,161,106,101, 10,174,114, 71,217, 92,243,167,123,160, 0,120,122,122, 66,165, 82, 57, 21, 21,181, 88, 29,183,184,
-197,198, 61,235,214,183, 88,237,224,121, 30,209,209, 81, 95,197,199,198,246,174, 94,163,122,155,218,245, 27,148,147, 75,104, 0,
- 40,210,104, 25, 12, 6,214,197,197, 69, 85,174, 92, 57, 58, 57, 57,249,153,121,174,222,176,189,125,239,158,221,232,219,183,143,
-238,193,213,219,207,134,184, 27,141, 70,170,101,203,150,174,129,129,129,180,217,108,214,148,246, 52, 41,188,131,222,245,240, 44,
- 55,235,195,143, 70, 5,181,239, 20,134,211,167, 78, 96,255,158,173,191, 25,212,209, 39,156, 21, 9, 14,174,249,218,168,195,106,
- 53,130, 94, 27,117, 88,169, 74,141, 98,141, 86,237,250, 77,155,243,148, 0,199, 15,237,224, 77,180,117, 12, 0,142, 53,105,119,
-108, 95,245,253,244, 65,163,191,169,214,173,215, 32,124, 56,100, 24, 4, 2, 6,103,126, 63,136,133,211,190, 60,172,203,203, 24,
-234, 76,154,128, 35,244, 86, 75, 20, 32, 11,252,188, 66,181,186,184,113,249, 60,158, 68,223,139,188,125,237, 82,157,234,245, 66,
-224,237, 95,241,243, 4, 47,102, 46, 30, 60,176,150, 36, 99, 49,153, 18,134, 13, 29,130, 23, 71, 29,134, 54, 10,246,164, 94,189,
- 1, 0, 24,180, 25,214,117, 11,198, 63, 42, 24,117,200, 89, 45, 9, 69,233,230,229,168,119,157,185,120,101, 98,239,238, 97,116,
-166,198,226,136, 96,229, 89,242,127,204,200, 44,248, 93, 99, 70, 13,127, 37,162, 34,111,112,166,188,204,221,165,188, 47, 77,195,
-250,119,189, 95,112,237,114, 28, 15, 10, 48,149,186, 91, 74,232, 26, 62,111,254, 34,233,237, 88, 29,238,196,105, 28, 93,133, 66,
-198, 97,176,132,244, 51,211,229, 24,205, 94, 66,116,136, 98,102,127, 60,116, 32, 50, 53, 86,112, 28, 32, 96,232,252, 31, 17,158,
-106, 41, 36,106, 13,200,204, 81, 35, 54, 62, 1,185,105, 79, 64,211, 52,188,252,131,156,158, 73,154,229,197,126, 6, 11, 95,175,
- 95,247, 54,130, 61,127,164, 66, 46, 17,192,172, 77,199,209,237, 11,212,102,157,102,150,209,160,219,227,204,124,142,207, 83, 16,
- 40,181, 70,103,242,145, 8, 25,236,220,176, 2,253,135,141,121,169,246,253,234,187, 25, 0, 77, 33, 59, 71, 11,138,162,212,165,
-171,151,168,107,197,109,191, 97,100,172,204, 26,133,152,173,215, 27, 10, 69,183, 70,249,163, 39,142, 29, 84, 92,136,151,224,106,
- 84,106,190,201, 82,115, 51,199,118, 79,210,230,101,119, 5, 16, 93,186,118, 33,221,117,192,199, 19, 35,171, 6,213, 54,159,190,
-167,139,203,213,219,138,204,115, 8,237, 55, 37,242,250,225,229,221,242,108, 49,159, 40,252,106,179,156,221, 62,207,168,142,158,
- 86, 68,215,161,120,218,210,157,207,186, 13,191,158,187,209,241, 59,203,130,229, 57,240, 28,240,217,247,171, 96,231, 88,112, 44,
- 11,142,229, 97, 99,121,121, 73,197, 85,249, 87,218,147,243,112, 71,205,193,211, 95,239, 46,116,119,119,135,167,167, 39, 60, 61,
- 61,225,234,234, 90,162,209, 18, 10,133, 74,129,224,229, 67,157,144,144,128,248,248,120,184,186,186,130,231,108,176,216,128,186,
- 33, 93,112,247,201, 61,156,188,112, 11, 60,199, 66,161, 44,253, 42, 47, 10,159,224, 79,154,182,235,189,162, 67,175,225,248,125,
-207, 47,252,181,115, 7, 71, 25, 51,162,215, 58, 29,161,103, 89,202,102,179,161,123,151,118, 9, 55, 35, 31, 31,251,110,226,232,
-176, 22, 61, 70, 73, 66,131, 3, 96,178,176, 72,138,127,130, 51,251,126, 53, 5, 85,241, 59,222,177,117,243, 4,155,205, 6,150,
-101, 75,124,144,155, 44,214, 76, 70, 40, 83, 12, 28, 56, 88,120,237,234,213,221, 10,239, 26, 59, 89,138,190, 77,241, 92,125,138,
-231,251,214,175, 95, 11, 86, 27, 7,131, 65,147, 83,218,125,214,106,181,177,235,215,175,175, 50,116,232, 80,121,237,218,181,133,
- 79,158, 60,193,194,133, 11,179,180, 90,109,172,179, 26, 39,206, 69, 45, 17, 80, 57,143, 10, 34, 90, 79, 91,133, 98, 96,143, 86,
-216,118,248, 2,206,156,191,132, 4,157,242,150,206, 46,216,151,152,144, 98,174, 83, 78,179,187, 87,104, 37,102,231,134,156,221,
-145,237, 38,191,207,243,146, 19,153,103,167,234,157,191,185, 1,173,209, 6, 87,185, 99,190,167,130,200, 22, 67, 81, 78, 59, 34,
- 10,136, 61,127,233, 70,221, 38, 53,106,227,102,108, 30, 50,114,205, 48,154,237,224, 56, 30, 28,120,120,186,136, 33, 21,209,120,
- 26, 31, 11,142,183,198,149,242, 81,161,110,219,166,173, 0,160, 64, 81,188, 64, 40, 16,128,135, 99,126, 69,153, 76,166, 83,169,
- 84, 78, 69,180,172,118, 59,250,134, 53, 71, 72,211,250,232, 61,202, 49,103,230,169,223, 38,195, 67, 41,196,182, 77,107,145,120,
-110,201,166, 42,161,163, 79,220,187, 27,249, 94,228,205, 63, 6,191,211, 88,214,208, 87,144, 34, 42, 42, 76,170,215,235,119, 3,
- 16,139, 68,162,176, 54,109,218,148,219,189,123,119,174,151,151, 23, 39, 22,137,212,189,122,246,224,132, 34, 81,118,193,103, 47,
- 94,188, 40, 28, 53,106,148, 75, 78, 78,206,211,244,244,244, 75, 0,108,197, 55, 4,131, 59,129,198, 86, 80,148, 84, 41,147, 39,
- 84,174, 92,213,191,105, 72,115,183,119,251,246,135, 68, 44,193,239, 39,142, 97,217,226,185, 59,116,169, 15, 62, 46,205,145,124,
- 91,163, 14,147,158,198,197, 26,140,230,122,117,155,180,163,206,159,216, 55,206, 10,175,197,140,196,186,160, 83,223, 49,213, 98,
- 83,116, 88, 54,231, 43,120,184, 41, 16,247,228,161,241,209,131,187,171,108, 38,205, 87, 78,155, 44, 0,242, 44,246,189,208, 33,
- 97, 30,102, 43,139,115, 17,135, 77,156,157, 11,187,116,246,200,147,242, 65, 77,165,117,155,118,244,200,220,191,182,175, 1,216,
- 86,146, 78,242,195,215, 35,184,188, 37, 55,238, 84,196, 73, 55,159,138,117, 24, 10, 20,172,102, 19,212, 49,215,236,134,244,135,
- 26, 77,242, 61,167, 70,225,102, 37,226,251,111,126,252,223, 39, 77,155, 52, 81,240,144,190, 20,193, 42, 48, 88,153, 26, 11,188,
- 92,196, 48,106,212,120,116,237,152,201,160,102,138,157,239,204,110,209,203, 51, 51,210,197,207,211, 25,162, 67,138,251,124,102,
- 70,186,216,110,209,203, 75,126,212, 49,112, 85,136,113, 55, 46,249, 89,226,187, 68,232,200,205, 18, 11,153,103,121, 90, 5,117,
- 65, 9,180, 19, 73,221,145,156,101, 2, 5, 30, 28,107,135,221,102,129, 86,163, 65,114, 74, 26,210,211,210,161,213,230, 66,174,
-244, 64,221,134,205,224,162,144,226,246,153, 29,224,121,222,169,121, 13,109,148, 48,184,105, 72,107,201,189,120, 71, 46,150, 84,
-200,227,224,214,185, 89, 58, 77, 70,107, 93,234,163, 71,165,173,139,237, 44,123,242,206,253, 71,117,202,251, 85,166,110, 61,201,
-195,166, 53,203, 97,201,143,108,218,108, 44,238, 61,213, 35, 53,219,128,167, 49, 15,120,142,101, 79,226, 63,130,160,232, 0, 32,
- 4,245,235,214, 66,151, 15,222,197, 79, 63,173, 66, 76,108, 60, 55,107, 92,183,167, 58,109,238, 59,165, 48, 89,157,144, 63,215,
-134, 33, 61,106,158,209,163,105,210,129,155,217,180,209,194, 23,155,224, 35,245,174,136,214, 31, 47, 60,110,212,102,139, 89,179,
- 65,112,112,211,199, 91, 11,211,116, 56,104, 88,102, 77, 24, 0,165, 76, 0,138,162, 80,208, 93,184,114, 70, 56,228, 18, 71,223,
-178,209,108,199, 7,227, 23, 97,211,162, 47,193, 3, 24,212,255,130,161,168,114,194,177,118,225,103,126,184, 90, 62, 33, 62, 35,
-185, 83,207, 9,167, 76, 86,137,185, 71,159,161,215,155, 52,105,146, 43,147,201, 32,147,201,224,234,234, 10, 15, 15, 15,184,187,
-187,151,184,239, 54,155, 77,103,177, 88, 60,197, 98, 49, 56,142, 67, 92, 92, 28,226,226,226,144,151,151, 7,181, 90, 13,189, 78,
- 99,191,122,106,167,160,110,104, 55,248, 87,173,135,138, 53, 26, 64,200, 80, 16, 8,104,156, 57,176,166,168,114, 22,110,178,218,
-246, 90,217,177,247, 8,252,190,103, 53,127,237,220,193,209,198,140,232, 53,206,158,163,252,238,158,219,125,251,246,173, 55,106,
-212, 40,209,143, 19, 71, 29, 63,124,226, 76,244,206, 67,171,123,230,228,228, 6,242, 60, 15,119, 55,183,196, 1, 61, 91, 28,108,
-223,178,105,194,169, 83,167,184,173, 91,183,154, 41,138,186, 91,156,166,163,146,202,248,237,212,201,136,169,173,219,182,195,218,
- 13, 91,219, 70,222,127,208,246,201,147, 71, 8,172, 88, 21,149,171,212,128,129,242, 64,196,217,243,208,229,102,252,230, 76, 57,
- 95,137,106, 81, 57, 57, 57,127, 12, 24, 48,160,203,133, 11, 23,232, 1, 3, 6, 24, 50, 51, 51, 47,190, 16,197,226, 75,210,188,
-244,115, 31, 53,128,223, 42,182, 29,182, 35,217,154,251, 57,128,185, 21, 42, 86,192,153,243,151,112,233,194,149, 85,153,242, 10,
-211, 62,254,224,163,240, 74,189,152, 17,189, 66, 43, 49, 42, 15, 57,182,172, 94,200, 28,184, 20,191, 40, 62,139, 93, 59,247,236,
-212, 25,206,156,163,103, 15, 14,173, 21, 45,107,149,131,141,229,193,241,142, 10,215, 69, 42, 44,170,226,125, 77, 83, 96,145,124,
- 60,122,212,168, 39,117,235, 55,252,226,131,143, 70,139, 26, 86, 13,196,213,199,185, 0, 69,161,156,175, 2,169,169,169, 56,183,
-107,181, 61, 39,249,225, 42,134,225,166,151,226,120, 34, 39,225, 86,245, 23, 54,195, 51, 51, 51,113,230,204, 25, 20, 24, 44,111,
-111,239,162,140,214, 75,154, 89,233, 41, 23,103,204,255,165,229,200, 15,251,160, 71,187, 58, 56,123,237, 9, 44,249,243, 53, 21,
- 12, 37,143,189,244,179,248,243, 1, 85, 45,159,244, 13,210, 24,109,226,248,239,227,242,206,193,177, 6, 43, 87, 68, 57, 45,217,
-217,217, 7,162,162,162, 90, 53,104,208,160,210,145, 35, 71,178, 35,175, 28, 31,247, 98, 33, 38, 76,152,160,252,233,167,159,228,
- 60,207, 95,180, 88, 44, 49, 78,237, 59,141, 45, 55,174, 95,247,180,218, 56,156,191,114,187, 86,199,150, 13,193,241,192,181,107,
-215,176,118,221, 90,211,221, 59,183, 22,232,211,125,167, 23, 99, 94, 10, 61,158,108,217, 70, 29, 62,211, 76, 77,142, 95,240,251,
-225, 93,155,154,182,237,137,193,159, 77,159,126,230,240,214,169,141, 91,247,160,107, 53,237,130, 27,151, 34,112,242,200,177,255,
- 89,117,217, 83, 81,114,238, 72,161,229,148,200,228, 99,107, 55,110,139,167, 9,241,136,123,116,239, 55, 83,246,227,148,132, 39,
-204,111, 41, 73, 9,163,171,212,105,137, 11,199,183,141, 43,198,104, 21,123,205, 7,122,203, 86, 31, 57,116, 96, 96, 82,210,207,
-190,122,163, 73,194,243,188, 73, 34, 22,164, 41,105,237,118,141,211,229,124, 96, 85,167, 84,234,219,255,131,209,135,151, 45, 91,
- 44,244,113,151, 35, 45,199, 4,141,209, 10,173,193, 10,154,162, 80,221, 95, 1,131, 54, 27,103,119,205,183, 89,116, 57, 3,128,
- 39,214,162, 52, 21,170,224,153, 57,143, 35, 62,155, 48,230, 52,196,110,129,254,149, 59,124, 83,108,180, 78,155,124,171,231,132,
- 49, 7,131,121,158,239,168, 80, 5,107,245, 25, 81, 83,138,218,119,138,114,220,223,131,219, 7,194,106,119,204, 63,102,231, 0,
-150,227,242,163,124, 0,255,172, 63,159, 42, 97,223, 41,110,251,225,139, 72, 73,207,133,209, 98,131,217, 98,135,213,198,130,102,
- 24,184,123,184,163, 70,229, 70,112,115,119, 69,122, 90, 10, 46,157, 58,128,232, 59,103, 47, 82, 60,166, 25,213,143, 78, 57,115,
-142, 68, 50,247, 96, 63,127, 95, 58, 85, 99,129, 76,204,224,214,217, 35, 86,155,197,188,192, 73,147,245,154,102,110, 86,246,162,
- 47, 38, 78, 26,244,235,250, 13,190,245,170,184, 34, 41,211,136, 36,181, 9, 90,147, 45,223,136,113, 48,235, 50,113, 39, 98, 67,
- 26,107,210, 46,194,127,132, 34,141,150,221,106,210,238, 62,118,213,115,242,212,249,204,227, 39, 49,182,153,159,119, 79, 50,234,
- 52,221, 74, 29,201,122,129, 95, 63,173,178,237,207,216,137,215,186, 11,121, 14, 28,207,227,224,149,180,103,221,133, 92,126,230,
-229,205, 39,197, 47, 35,248,226,218,133,237,186,141,251,253, 78,148,118,179,209,152,238,246,240,241,130, 28, 0, 96, 24,230,217,
- 79, 65,110,150,201,100,178,148,208,133,178,113,205,154, 53, 95,143, 30, 61, 90,146,152,152,136, 39, 79,158, 32, 55, 55, 23, 82,
-169, 20,199,142, 29,179,129,179, 47,184,115, 97,111, 92,212,141, 19, 63, 4, 55,233, 82,190, 94,104, 55,200,229, 10, 8,120,231,
-147, 49,229,170,160,129, 77,218,246, 90,209,241,221,145, 56,185,119, 13,127,237,236,129, 49, 70,117,244,234,210, 30,203,220,220,
-220, 72, 0,143, 22, 44, 88,208,112,237,218,181, 85, 38, 78,156, 24,179,113,197,212,101, 0,144,149,149, 5, 0,184,121,243, 38,
- 63,102,204, 24,179,201,100,138,205,201,201,185,129, 18, 6, 64, 0,128, 81, 45,159,189,118,229,220,186,137,201,169,125,170,214,
-109, 6,239, 42,205,224, 91,189, 57,114,180, 86, 92,125,156,130,152, 7,167,240,224,252,174, 35, 6,165,125, 42, 74, 57,191,113,
-131, 6, 13, 2,105,154,174,172,211,233,124,107,215,174,221, 64,161, 80,220,108,208,160, 65, 35,129, 64,144,116,253,250,245,248,
-210,104, 37,156,221, 96,174,216,118,216,210, 4,173, 75,251,152, 52, 67,163, 4,173,203, 77,131,196,237, 75,117,196, 82,243,175,
- 76,192, 34,222,154, 25,185,115,131,102,247,150,213, 11,153, 15,194, 39,176,247,242, 60, 62, 23,200,196,191,151, 46, 92, 77,167,
-126, 50,180,247,243,233, 29,242, 35, 89,249,191, 59, 21,166,207,203,187,147, 7,224,235, 59,247,133, 43,238,125, 62,106, 70,253,
-166, 45,135,180,121,103, 0,109, 23, 41,113,124,239,207,124,236,157,136,157, 2,158,253,206,232,196,106, 0, 37,118, 7, 89, 44,
-206,152,172,215,203,152,168,104,183,115,235,186, 97,187,247,238,153,243,110,175,222,158, 43,191,127, 31,243,127,217, 7,133, 76,
- 2,158,227,240,126,251,192,126, 63,140,168,217, 51,208, 71, 26,176,251,116,210,185,207, 22,223,251,218, 96,176, 70, 59, 17,137,
-225, 51, 51, 51,207, 43,149, 74,117,171, 86,173, 66, 36, 18, 9,149,153,153, 41, 80,169, 84,118, 55, 55, 55, 75, 82, 82,146,193,
-108, 54,239, 6, 80,170,105,199,173, 54, 14,113,233, 38,236,223,179, 27,183,175,156,194,131, 7, 81,218, 7,247, 31, 44,167, 4,
-252, 98,125,250,163,108,160,212, 13,124,112,133,142, 58,228, 75, 61,234,144, 53,107,183,108, 92, 53,179,131,193,100, 30,214,160,
- 69,119, 84,170,213,146,182,218, 88,220,189,118, 26,167,119, 45,158,111,213,101, 79, 46,203, 57,246, 47, 95,165, 6,207,136,241,
-199,153,195,224, 57,110, 21, 0,240, 28,183,234,230,133, 35,163,155,119, 27,129,114,170, 74, 13,114,159,222,164,240, 6,179,135,
-139, 4,180,254,232,238, 95,247,198,197,197,225,225,195,135,120,252,248, 49,178,179,179,177,101, 75, 92,169,206,143, 33, 39,254,
-247,232,251,116,215,247,222, 31,124,176,223,192, 15,165, 85,106,212,163,131,203,123,192, 83, 41, 64,212,227,120, 68, 95,191,195,
- 69, 93, 61, 98,178,106, 50,222, 53,230,196, 23,105,252,228, 94,181,124, 0,118,114,193,218,133,161,161, 45,131, 39,205,154, 19,
-226,233,173, 42,180, 30,207, 82,103,136,191,250,236, 64,240,165,203,127, 56,181,214, 33,199,178, 89,225,195, 6,112,140, 99,161,
- 80, 60,139, 83,231, 31, 61, 71, 99,202,241, 62,207,217, 75,140,224,127,212,167, 53,236, 28, 7,189,209, 10,141,222,140, 60,173,
- 9,169, 25, 89,184,125,231, 14,206, 30, 60,128, 39, 81,183, 99,109, 22,203, 9,154,166,118, 25,211,163,207,150,174,167, 73, 80,
-197,179, 92, 57,196,102,235, 32, 21, 11, 16, 31,125,221,172,215,228,109,126,211,235,200,152,245, 40, 53,131,161,186, 12, 24, 48,
-240, 88,135,174,189,220,154,182,232, 36,247,114,117,135, 72,192,227, 81, 92, 10,110, 92, 60,166,143,185,125, 78, 99,179,232,194,
-222,198,170, 47,255,112, 74, 30,117,104, 53,235,123, 14,234,221,118, 15,195, 8,196, 28,103, 55, 91, 45,230,247,202, 98,178,254,
- 44,120,158, 77, 26, 54,168,207, 75,109, 3, 59,199,203, 6,245, 63,110,124,177,173, 96, 99,121,249,160,254, 23, 13,142, 10,164,
-232,196, 62, 63,191,114,221, 11,214, 46, 76, 72,200,186,150,157,109, 62, 13, 32,201,100, 50,189,113, 25,211,211,211,103,204,154,
- 53,171,135,193, 96,168,217,174, 93, 59,137,171,171, 43,178,178,178,112,226,196, 9,219,161, 67,135,238,103,100,100,252, 0,100,
-216,141,104,244,219, 29,211,222,161, 81,215, 79,252, 80,179, 73,215,242,245, 90,116,115,190, 50,147,200, 70,118,232, 53,156, 58,
-185,111, 13,127,245,204,190, 79,140,234, 71,191,148,225,176, 90, 77, 38,211, 21,147,201,116,239,187,239,190,107,234,227,227,227,
-243,195, 15, 63, 72, 53, 26,141,112,229,202,149,166,204,204,204, 52,141, 70,115, 9,197,228,211,188,206, 77, 91, 94, 50,250, 30,
-221,189,166, 61,191,123, 77,103,119,175,128, 46,110,222,229,171,229,170,147, 99,243,212, 41, 39, 0,156,204,159, 40,178, 84, 52,
-108,216,176, 42, 69, 81, 3, 0,212, 85, 40, 20,213,149, 74,165,132,231,249,154, 20, 69, 69,114, 28,119,167,118,237,218,135,238,
-223,191, 95,170,201,100, 19,206,110, 48, 7, 6,183,220,154,109,224, 68, 22, 90,180, 53,225,236, 6, 51, 0,100,252, 62,201, 0,
- 96,255,253,118, 95,247, 61,112, 41,126, 89,100,142,219, 56,245,153, 57, 7, 74, 91,230,188,164,219,213,223,214,245,111, 74,189,
-159, 4, 96,216,157,235, 88,120,247,230,165, 31, 41, 30, 66, 22,246,153,198,140,199,215,223,134,190, 80, 40, 52, 5, 4, 4, 20,
- 58,186, 80, 34,145,152,204,230,226, 2, 40,103,237,186, 84,172, 5,218,110,216,179, 99,195,176,125, 7,246,207,105,211,241, 93,
- 79,105,249,242,168,172,162,176, 97,114,227,113,167,110,170,175,246,154,116,238,167,152, 20,211, 29,148, 50, 31, 70,167,211, 69,
- 3,200,209,233,116,189,121,158, 79,164, 40, 42, 48, 39, 39,231,150,205,102,187, 91,106, 67,192, 97,112,104,104,179, 45, 20, 69,
- 9,120, 59, 55,239,146,144,217,106, 74,125,144,132, 50, 46, 75, 82,175,178, 43,198,255,176,180,113,181,234, 65,141, 11,214, 58,
-172, 83,201, 5,163,190, 94,216,184, 82,149, 26,141,159,175,127, 88, 98,154, 0,111, 51,228,124,188,103,221,188,115, 55, 47,159,
-254,214,203,175, 82,165,180,164,152, 7,137,143,111,205, 96, 77,154, 61,101, 61,207,113,143, 35, 23,175, 93,240,245,196,212,228,
-216,181, 6,245,163,123, 0, 96, 80, 63,186,247,224, 6,190,207, 76, 75,154,152,149, 17,179,224, 77,143,133, 94,175, 79,217,188,
-121,179,123,203,150, 45,105, 31, 31, 31,168,213,106,156, 62,125,154,227, 56, 46,185,212, 90,217,177,167,245,217, 84,185,223,126,
- 89, 49, 79,164,112,233,102,183,219,253,121, 30, 16, 8, 4,169, 22,131,230,152,150, 86, 76, 66, 78,188,169,248,103, 6, 71, 1,
-160, 11,214, 46,228, 56,142,154,183,108, 67,188, 80,234, 82,232,100,136, 54,147, 86,206,113,156,211,107, 29,230, 62,189, 81,237,
-109,221,223, 20,207, 79,107,208, 36,228, 91,155,205,106,202,191, 63, 76, 0, 76, 60,143, 44,154,166,206, 50,156,237,184,166, 12,
-141, 41,138,130, 43, 79, 9,224, 34, 19,128, 2, 5, 93, 94, 54, 95,154,156,172, 66, 13,113, 70,116,164, 33,163,109,197,163,150,
- 29, 67, 35,126, 63,210,159,101,217,202,249, 49,131, 56,179, 81,191, 83,151,234,241, 27,112,221,142,127, 63,135, 11,204, 22,245,
- 39,255, 35,167,186, 81,254, 73,154,193, 85,100,189,203, 7,248, 12,141,139,207,184, 26,147,104,248, 13, 47, 47,171, 83,150,114,
- 50, 62, 62, 62,223, 83, 20, 53, 68, 44, 22, 43, 45, 22,139,158,231,249,141,233,233,233, 51,240,218,226,191,141,132, 50,149,113,
-168, 88, 42,159, 98, 53,233,255, 48,100, 68, 15, 46,105,223,229,222, 65, 93,164, 10,197,215, 38,163,126,163, 33, 61,122,195, 91,
- 62,158,110, 18,137,164,145, 82,169, 20,102,102,102, 94, 1,144,247, 79, 58,239, 13, 26, 52,168, 64,211,116,101,142,227,124, 0,
-184,193, 49, 42, 36, 83, 32, 16, 36,231, 71,180,248,210,106,182,250,104,167, 87,199,206,117,198,159, 56, 23,181, 36,191, 91,241,
- 25, 1,253, 22, 73,135,116,107, 63,225,183, 61,251, 11, 27,117,248,255,238,154,255,235, 52,219, 10,148,126,153,195,104,177,219,
-204,142,193, 38, 67,102, 74,242,152,243,119,213, 87, 0,104,203, 82, 78,145, 72,244,129,213,106,149,137, 68, 34,163,213,106,221,
-252, 79,217,119,153, 42,120, 56, 13,222,233,149, 41, 56, 80,215, 95, 25,180,242,111,185,150,152,122,245,234,181, 22,137, 68, 21,
- 88,150,149, 91, 44, 22,131,209,104,140,139,143,143,255, 3, 69, 47,124,254,167,150, 83,161,170,177, 88, 36,146,124, 14, 0, 86,
-171,121,169, 62,227,209,248,226,190, 88,204,231,255, 95,159, 35,175,202, 77, 30, 9, 24,161, 55,242, 39,230,230,236,118,117,122,
-236,181, 26,127, 99, 57,255,117,240, 60,255,167,255,143, 78, 68,147,104, 18, 77,162, 89, 8, 52, 57,158, 68,243,239,212,148,250,
-213, 10,148,250,213,114,122,210,229, 34, 62, 79,142, 39,161,128,240, 66,126,192,243, 60, 4,228,216, 16, 8,132,191, 1,142, 28,
- 2,194,223,137, 41,245, 65,226,159,249,121,194,127,142, 34,115,162,169, 98, 92,105,105, 66,130,111,226,108, 79, 18, 77,162, 73,
- 52,137, 38,209, 36,154, 68,243, 63,167, 89,146,246,255,199, 46,201,240, 87,182, 15, 3, 72, 37, 93,135, 68,147,104, 18, 77,162,
- 73, 52,137, 38,209,252,167,104,254,155,120,214,117, 72,147, 99, 65, 32, 16, 8, 4, 2,129,240,231, 64,114,180, 8, 4, 2,129,
- 64, 32, 16,202, 70, 97, 93,135,196,104, 17, 8, 4, 2,129, 64, 32,188, 5,138, 76,134, 39, 93,135, 4, 2,129, 64, 32, 16, 8,
-101,163, 32,162,229,135, 23,166,119, 32, 70,139, 64, 32, 16, 8, 4, 2,225,237,145,138,194,162, 91,135, 14, 29,226, 11,251,157,
- 64, 32, 16, 8, 4, 2,225,175,224,255,185, 23,121, 49,146, 21,158,191,253,242,168, 67, 98,176, 8, 4, 2,129, 64, 32,252, 83,
-204,214,255, 51, 10, 34, 89, 5, 63,207, 22,205,126,102,180,122,244,232, 65, 17,179, 69, 32, 16, 8, 4, 2,225,239,226,223,232,
- 69,232, 87,119,144,156,102, 2,129, 64, 32, 16, 8,127,167,217,250, 55,237, 15,153,222,129, 64, 32, 16, 8, 4, 2,161,108,248,
- 1,232,254,194,246, 97,188,208,125, 72, 32, 16, 8, 4, 2,129, 64,120,115,194, 11,219,230,121,158, 68,180, 8, 4, 2,129, 64,
- 32, 16,254, 4,179, 69, 32, 16, 8, 4, 2,129, 64,248,179,248, 43, 22,149, 38, 43,155, 19, 77,162, 73, 52,137, 38,209, 36,154,
- 68,243,223, 78,193, 60, 90,192, 11,243,104, 1,100,102,120, 2,129, 64, 32, 16, 8,132,178,210, 29,142,249,179,194,243, 95,187,
- 19,163, 69, 32, 16, 8, 4, 2,129,240,118,121,109,249, 29, 98,180, 8, 4, 2,129, 64, 32, 16,222,174,193, 90, 77,140, 22,129,
- 64, 32, 16, 8, 4,194,159, 12, 49, 90, 4, 2,129, 64, 32, 16, 8,127, 18, 20,138, 30, 57,112,178, 20, 58,111, 50,250,224, 36,
-209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,115,154, 37,105,159,196,255, 63, 10,102,134, 63,140,231,137,240,171,121,254,207,
- 95,182,145, 12,125, 37,154, 68,147,104, 18, 77,162, 73, 52,137,230,191,157,240, 87, 94, 1,252, 53,243,104, 17, 8, 4, 2,129,
- 64, 32,252,215,204,214, 51,195, 69,150,224, 33, 16, 8, 4, 2,129, 64, 40, 27,171,139,250, 3,137,104, 17, 8, 4, 2,129, 64,
- 32,148,141,240,162,182,137,209, 34, 16, 8, 4, 2,129, 64,248,115, 12, 23, 49, 90, 4, 2,129, 64, 32, 16, 8,111,209,100,133,
- 23,250,215, 67,135, 14,241,228, 24, 17, 8, 4, 2,129, 64,248,187,248,183,121,145,103,211, 59, 20,236, 24, 49, 91, 4, 2,129,
- 64, 32, 16,254, 78,147,245,255,212,139,248,225,249,104,195,240,252,109,240, 60, 79, 70, 29, 18, 8, 4, 2,129, 64, 32,148,145,
-238,120,121,228, 97,120,193, 54, 49, 90, 4, 2,129, 64, 32, 16, 8,101, 39,188,216,191,146,110, 67, 2,129, 64, 32, 16, 8,127,
- 39,255,198, 28, 45,138,156, 86, 2,129, 64, 32, 16, 8,132, 50, 81, 88, 52,235, 47, 89,235,144, 64, 32, 16, 8, 4, 2,225, 63,
-105,184,136,209, 34, 16, 8, 4, 2,129, 64,248, 19, 76, 86,129,209,250,179, 39, 44, 37, 43,155, 19, 77,162, 73, 52,137, 38,209,
- 36,154, 68,243,191, 98,178, 94,156,226, 1, 0, 25,117, 72, 32, 16, 8, 4, 2,129, 80, 86,200,162,210, 4, 2,129, 64, 32, 16,
- 8,127, 18,100, 81,105, 2,129, 64, 32, 16, 8,132,191,216,112, 17,163, 69, 32, 16, 8, 4, 2,129,240, 22, 77,214, 75,102,139,
-228,104, 17, 8, 4, 2,129, 64, 32,148,141, 34,115,180, 40, 20, 61,114,224,100, 41,254,193,155,140, 62, 56, 73, 52,137, 38,209,
- 36,154, 68,147,104, 18,205,255,156,102, 73,218, 39,241,255,159,112,252, 69, 19,150,146,161,175, 68,147,104, 18, 77,162, 73, 52,
-137, 38,209,252,175, 17, 14, 56,230,209, 34, 93,135, 4, 2,129, 64, 32, 16, 8,111,193, 88, 21, 6, 49, 90, 4, 2,129, 64, 32,
- 16, 8,101,131,204,163, 69, 32, 16, 8, 4, 2,129,240, 39,225, 7, 71, 84,171,224,181, 17, 49, 90, 4, 2,129, 64, 32, 16, 8,
-111,135,238,112, 68,181, 10, 94,137,209, 34, 16, 8, 4, 2,129, 64,120,139, 20, 58,143, 22, 5, 0,135, 14, 29, 42, 24,127,216,
-174, 71,143, 30,103,201,177, 34, 16, 8, 4, 2,129,240, 87,242,111,244, 34, 60,207, 63,143,104,245,232,209,131, 2,112,134,156,
-106, 2,129, 64, 32, 16, 8,127, 7,255, 70, 47, 66,191,226, 36,219,145,211, 76, 32, 16, 8, 4, 2,225,239,224,223,232, 69, 4,
-175,184, 72, 2,129, 64, 32, 16, 8,132,191,133,255,199, 94,196, 15,142, 68,248,195,249,175, 64,254,148, 15,100, 30, 45, 2,129,
- 64, 32, 16, 8,132,178, 81, 48,218, 48, 28,175,204,169, 69,162, 88, 4, 2,129, 64, 32, 16, 8,101,163,176,153,225,255,146,181,
- 14, 9, 4, 2,129, 64, 32, 16,254,147,144,181, 14, 9, 4, 2,129, 64, 32, 16,222, 14, 47, 70,181, 86,255, 85,255,148,172,108,
- 78, 52,137, 38,209, 36,154, 68,147,104, 18,205,255,146,201,122,182,253,210, 60, 90, 4, 2,129, 64, 32, 16, 8,132,183, 11,233,
- 58, 36, 16, 8, 4, 2,129, 64, 40, 27, 5, 35, 14, 95,220, 38, 70,139, 64, 32, 16, 8, 4, 2,225, 45,154,173,215, 32, 93,135,
- 4, 2,129, 64, 32, 16, 8,101, 35,188,168, 63, 16,163, 69, 32, 16, 8, 4, 2,129,240, 39, 25, 46, 10, 69,143, 28, 56, 89, 10,
-225, 55, 25,125,112,146,104, 18, 77,162, 73, 52,137, 38,209, 36,154,255, 57,205,146,180, 79,226,255, 31,127,219,132,165,100,232,
- 43,209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,147,144,233, 29, 8, 4, 2,129, 64, 32, 16,254, 68, 74, 99,180,188, 5, 2,
-193,183, 50,153,236, 39,153, 76,246,139, 64, 32, 88, 0,192,163,180,255, 80,161, 80,140,243,245,245,125,232,235,235,155, 84,161,
- 66,133, 35, 46, 46,242, 47,170, 74,208, 6,128,240, 45,237, 79, 48,128, 47,100, 50,217, 3,169, 84, 26, 15, 96, 19,128, 47, 0,
-120,149, 69,120,134, 63,222,187,247,121,239,125, 51,252,241,222, 43,127,234,238,227,227,115, 30, 64,151,183,117, 82, 6,202,209,
-169,159, 2, 79,251, 41,240,116,160,252,205, 91, 13, 46, 46, 46, 67,252,252,252, 46,121,122,122, 38,251,249,249, 93,148, 74,165,
-253, 74, 41,161,242,241,241,153, 31, 24, 24, 24,237,239,239,191, 4,142,213,201,255,177,180,150,160,117,136, 4,234, 80, 49,180,
- 45,197,248, 41, 84,140,206,157, 1,249, 27,202,181, 2,176,203,213,213,245,150, 64, 32, 56, 4,160,111,254,245,213, 87, 32, 16,
- 28,114,117,117,189, 5, 96, 87,254,231,222,228, 58,157, 15, 32, 25,192,236,252,237,177,129,129,129,218,250,245,235,199,215,175,
- 95,255,215,234,213,171,127,232,172,152, 92, 46,239, 28, 24, 24,184,187, 66,133, 10,241,161,161,161,217, 1, 1, 1, 81,229,203,
-151,223, 32,145, 72,218,145, 42,142,240,127,236,125,119, 88, 20,215,251,253,217,198,238,194, 46,236,210,151,174, 82, 4, 11, 40,
- 42,118,236, 53,216,137, 93, 99,143,209,104, 52,198,174,128, 81, 99,137, 61, 38,209,143, 45,162,177, 18, 11,118,108,216,149, 69,
- 17, 16, 1, 65,164,119,182, 2,219,239,239, 15, 74,136,161,154,228,251, 75,153,243, 60,243, 44,236,222, 57,115,239,204,189, 51,
-103,222,251,222,247,165, 64,129,194,223, 31,195, 0,124, 3, 96, 79, 76, 76,140,152, 16, 34, 38,132,136, 99, 98, 98,196, 0,190,
- 7,176, 9,117,155, 16,127,243,189,165,165,101,200,250,245,235,203,115,114,114, 72, 65, 65, 1, 73, 76, 76, 36, 59, 86, 47, 51,
- 12,178, 96, 18, 87,107,243, 82, 59, 59,187, 55, 46,142,142, 39,218,240,233,203, 0,184, 53,134,179, 6,204,141,141,141,159,172,
- 94,189, 90,113,239,222, 61,133, 90,173, 86, 24, 12, 6, 69,118,118,182, 34, 34, 34, 66,209,189,123,119, 5,128, 69, 0, 24, 77,
-224,172,198, 58,123,220, 37, 7,215,144,117,246,184, 91,243,123, 47, 47,175,120,131,193, 64,198,140, 25,163, 2,224,208, 20,206,
-247,225, 0,112,219,152, 65, 24,200, 71,158,238,200,215,132,236, 93, 66, 2,121, 72,255, 16, 78, 27, 27,155,243, 11, 22, 44,144,
-101,101,101, 17,149, 74, 69,210,211,211,201,156, 57,115,164, 54, 54, 54,199, 26,217,118, 75,111,111,239,188, 71,143, 30, 25, 36,
- 18, 9,185,115,231,142,161,109,219,182,121,141, 20, 91,253,223,171,203,126,123,123,251,203, 77,217,108,108,108, 14, 52,245, 26,
-117,230, 32, 93, 35,190, 77,200,179,235,228,194,152,174,100, 71, 71, 71, 50,218,130, 45,233,193,198,231,189,106, 15,101, 82, 23,
-231,199,189,122,245, 82,190,124,249, 82, 95, 84, 84, 68,226,227,227, 13,179,102,205, 42, 7, 16, 55,107,214,172,242,248,248,120,
- 67, 81, 81, 17,121,249,242,165,190, 87,175, 94, 74, 0, 51,155, 80, 79, 58,128, 67,193,193,193,132, 16, 66,214,175, 95, 79,124,
-124,124, 72,223,190,125,137, 66,161, 32,132,144, 52, 66,200, 97,157, 78,247, 73, 99, 56, 5, 2,193,228, 5, 11, 22, 40, 74, 75,
- 75, 73, 21, 12, 6, 3,145, 72, 36,100,207,158, 61, 74,145, 72,116,185,142,151, 12,106,202,131,226,164, 56, 41,206,191, 27,231,
- 63, 25,118,168,240,211,170,218,236,128,138,169,195,134, 48, 97,217,178,101, 85,162,234, 74,143, 30, 61,158,126,242,201, 39,226,
- 79, 62,249, 68,220,163, 71,143, 59, 0,174, 69, 69, 69,137,151,246, 11, 11, 36, 0, 0, 32, 0, 73, 68, 65, 84, 46, 93, 42, 6,
- 48,161,129, 11, 97,222,173, 91, 55, 73,110,110, 46,241,240,240, 32,205,154, 53, 35,185,185,185,132, 16, 66,158,125,220,129,220,
-108, 5,146, 17,121,133, 92,255,229, 12,153,101,199, 36, 61,237, 4, 90, 59,145,168,200,202,202,106, 3, 42,156,246,235,187,184,
-163, 90,181,106, 37,143,139,139, 83, 36, 37, 37, 41, 66, 66, 66, 20,125,251,246, 85,120,123,123, 43, 70,143, 30,173,216,189,123,
-183, 66,163,209, 40, 14, 28, 56,160, 48, 51, 51,139,171, 69,108,125,176,208, 98, 50,153,187, 98, 98, 98,200,155, 55,111, 72,165,
-149,162, 46, 78,129, 80, 40, 28,108,110,110,190, 72, 40, 20, 14, 6, 32, 0, 0, 15,128,223, 78, 0,231,207,219,185,122,133, 79,
-232,239,182,167,127,167, 14,129,166,116,137,246,187, 37,132,140,113,254, 32,161, 37, 16, 8, 38,127,241,197, 23,114,149, 74, 69,
- 74, 75, 75,137, 66,161, 32,165,165,165, 68, 46,151,147, 9, 19, 38,200,184, 92,238,168,134, 56,173,172,172,190,142,140,140,212,
-229,230,230,146,200,200, 72,114,249,242,101,178,119,239, 94,131,141,141,205,246,166, 14, 64,145, 72,116,227,250,245,235,226,232,
-232,104,241,147, 39, 79,196, 90,173, 86,172,209,104,196, 26,141, 70, 28, 30, 30, 46, 14, 11, 11, 19,159, 60,121, 82,172, 86,171,
-197,106,181, 90,172, 82,169,196, 45, 90,180,184,218,212,107,228,199, 65,134,250,222, 5, 66,182,207, 35,210,205,115,137,100,241,
- 80,146, 63,199,159,124,223,201,145,248, 27,227,226,123,253,168, 78, 78, 22,139,117, 55, 45, 45,205,176, 98,197, 10,117,235,214,
-173,165,211,167, 79, 47, 87,169, 84,132, 16, 66, 84, 42, 21,153, 62,125,122,121,235,214,173,165, 43, 86,172, 80,191,125,251,214,
-192,100, 50, 35,154, 80,207, 77, 85, 34,235,238,221,187,164, 38, 20, 10, 5,233,219,183,111,154,143,143,207,225,230,205,155, 79,
-108,136,147,207,231,143, 88,190,124,185,130,212, 2,173, 86, 75,228,114, 57,121,251,246,173,161, 89,179,102,217, 0, 44,169,155,
- 57,197, 73,113, 82,156,148,208,250,203, 80,103, 10,158,122, 79,226,210,165, 75,197,132, 16,241,170, 85,171,196,149,150, 45, 35,
- 0,252,202,141, 9, 96,252,242,229,203,197,132, 16,241,178,101,203,170,202,212,117, 33,134,157, 62,125, 90,179,115,231, 78, 98,
-107,107, 75, 68, 34, 17,217,181,107, 23, 49, 24, 12, 36, 55,252, 24,185,217, 10,228,213,202,169,132, 16, 66, 18, 55,204, 39, 55,
- 91,129,164,252,176,142, 76,154, 52,169,212,196,196,100, 66, 61, 23,215,162, 67,135, 14,242,178,178, 50,197,145, 35, 71, 20, 38,
- 38, 38,207, 0,180, 70,197, 84, 36,173,178,174, 83, 90,183,110, 45,139,141,141, 85,252,252,243,207, 10, 0, 33,141,236, 48,110,
- 0,250,240,120,188,209,203, 29, 88, 73,228,224, 26,178,220, 22, 47, 1,180, 5, 96, 93, 89,198,126,217,178,101,132, 16, 66,156,
-156,156, 34,235,224, 20,120,123,123, 47, 75, 74, 74, 10,210,106,181, 65,209,209,209, 65, 45, 91,182, 92, 49,188,133, 93,215,115,
- 19, 6,248, 74,215,205,245, 37,219, 22,123,127, 59,196,175,255,137,113,189, 39, 76,107,110,117,111,186, 13,183,116,172,128, 33,
-127,111,234,176, 81, 29,219,193,193,225, 73,122,122,122,181,184,146,203,229, 36, 43, 43,139,164,166,166,146,123,247,238, 17, 59,
- 59,187,155, 13,113,138, 68,162,248,244,244,116,242,195,142, 29,100, 76, 91, 47,226, 47, 52, 37,189,204, 77, 73, 71, 62, 87,217,
- 10,232,216, 84,161,245,252,249,115, 49, 0, 49, 0,113, 81, 81,145,184,168,168, 72, 92, 82, 82, 82,253, 29, 0,177, 84, 42, 21,
- 75,165, 82,177, 90,173, 22,187,186,186, 54, 89,104,117,231,162,123,103, 46,138,187,114, 80, 54,204,193, 42,123,110, 11, 43,253,
-227, 9, 93, 73,201,188,190,100,167,175, 3,233,193,198,231,141,228, 28,198,102,179,239, 0, 88, 82, 41,202,167, 14, 30, 60,184,
-148, 16, 66, 6, 15, 30, 92, 10, 96,106,229,247, 95, 84,138,172,193,141,172, 39,221,221,221, 93, 89,101,201, 2,240,208,221,221,
- 93,233,227,227, 67,124,124,124,136,147,147,147,188,146,187, 81, 55, 52, 55, 55,183,196,178,178,178,106, 1, 40,145, 72, 72,118,
-118, 54, 73, 73, 73, 33,113,113,113,228,217,179,103, 36, 45, 45,141,156, 58,117, 74, 47, 20, 10, 47, 81, 55,115,138,147,226,164,
- 56, 41,161,245,151, 10,173,247,183,223, 10,173,240,240,240,247,101,215,230,168,168, 40,241,242,229,203,197,168, 39, 16, 23,128,
-217,171, 86,173,170,178,122,125, 83,207,195,255, 64, 98, 98, 34,153, 58,117, 42,241,244,244, 36,158,158,158,228,147, 79, 62, 33,
- 82,169,148, 40,146, 99,201,205, 86, 32,207,198,118, 36,132, 16, 34,127, 21, 77,110,182, 2, 17, 79,234, 70, 94,188,120, 65, 28,
- 29, 29,175,215,115,252,139, 15, 30, 60, 40, 56,118,236, 88, 46, 42,252,177, 88, 0,186, 0,216,101,108,108,124, 8, 21,211,133,
-205, 0,152,123,120,120, 20,151,150,150, 42,198,140, 25,163, 0,224, 92, 15,103, 47, 79, 79,207, 55, 7, 14, 28, 32,249,249,249,
-164,184,184,152,108,233,222,146,144,131,107,200,250,142,205, 12, 63,252,240,131,106,201,146, 37, 74, 11, 11,139,112, 0,246, 99,
-198,140,209, 17, 66,136,191,191,127, 94,109,100, 66,161,112,112, 82, 82, 82, 80,121,121,121,144, 68, 34, 9, 42, 46, 46, 14,186,
-112,238, 92,208,160,182, 45,167, 74,215,205,245, 61, 55, 97,128,239, 16, 7,243,209,219, 7,118,250, 52,107,197,204, 49,171,186,
-181,126, 85,190,105,225,237,143, 91,216,110,253,144,171,109,109,109,157,163, 82,169, 8,128,223,109,111,222,188, 33,150,150,150,
-233, 13,113, 88, 88, 88,172,250, 98,252, 56,253,168,102, 14,228,205,206,213, 68,123,227,103,162,189,124,132, 36,111, 94, 76,134,
-139,172,100, 93,140,232,203, 27, 91, 31,145, 72,116,227,201,147, 39,191, 17, 90, 37, 37, 37,181, 10, 45,153, 76, 38, 86,171,213,
- 98,119,119,247,171,127,180,215,119, 97,195,181,151, 49,227, 89,244,212,158,164, 96,110, 95, 50, 88,192, 74,251, 3,116,227, 1,
-220, 1, 48,169,137,251,209, 1,108,170, 18, 84,155, 55,111, 38,132, 16,226,238,238,174,196, 31,139, 99, 39,240,242,242, 74,157,
- 57,115,166,174, 85,171, 86,249,221,187,119,151, 60,125,250,148,220,189,123,151, 92,190,124,153,156, 57,115,134,196,198,198,146,
-172,172, 44,146,152,152, 72, 62,250,232, 35, 9,128, 94,212,189,144, 2, 5, 10,127,103,212,162, 69,254,209,168, 94,117, 24, 30,
- 30, 78, 2, 2, 2,104, 53, 26, 40, 0,192,237,216,177, 99,193,166, 77,155,182,161, 34,172, 60,205,155,129,143,251, 26, 51, 95,
-244, 53,102,190,240,102,224,227, 74,139,209,254, 13, 27, 54,124,237,227,227,147, 3,192, 24,128,168,142,131,245,180,180,180, 68,
-122,122, 58, 4, 2, 1, 4, 2, 1,210,211,211, 65, 8,129,142, 0, 90, 2,168, 52, 26,148,149,149,161,220, 64, 80,102, 0,100,
- 10, 5, 68, 34, 17, 52, 26,141,107, 29,109,104, 55,118,236, 88, 87,111,111,239,130,165, 75,151,102,163,194, 87,230,208,140, 25,
- 51,110, 60,124,248,208, 91,161, 80, 20,199,197,197,149,183,109,219,118, 48, 0, 81, 82, 82,210,228, 61,123,246, 96,234,212,169,
-168,231,161,211,246,163,143, 62,186, 28, 27, 27,235, 58,105,210, 36,220,185,115, 7, 91,182,108, 65, 97, 97, 33, 1, 0,149, 74,
- 69,244,122,189,166, 91,183,110,154,157, 59,119,250,249,251,251, 63,105,209,162, 5, 3, 0, 82, 83, 83,147,107, 35,164,209,104,
- 45, 93, 92, 92,160, 82,169, 80, 80, 80,128,216,216, 88,152, 10, 4,136,201, 46,180,237,189,253,135,162,149,231,110,176,198,251,
-121, 91, 44, 26,208, 93,181,241,250, 29,143,214,246,182,182,106,141, 86,148,152,147,151,253, 33, 23,214,200,200, 40,189,176,176,
- 16,106,181, 26,101,101,101,144,201,100, 40, 42, 42, 66, 97, 97, 33,178,179,179, 97,100,100,244,166, 33, 14,179,226,226,200,212,
- 7,119,105,167,126,220, 12, 87, 93, 49,152,103,119,129,121,254,123,184,169, 11,176,111,245, 28, 83,181,165,117,176,153,169,105,
-137, 80, 40,220, 15,192,189, 33, 62, 95, 95, 95, 20, 21, 21,161,168,168, 8,150,150,150, 48, 55, 55,135,185,185, 57, 36, 18, 9,
-164, 82, 41,100, 50, 25, 60, 60, 60,208,174, 93, 59, 28, 61,122,244, 79,233,224,143,213, 72,209, 65, 63,247,198,235,108, 24,241,
-120,104, 97,206,119,233,196,135, 69, 61,187,244,101,177, 88,167, 45, 44, 44,174, 3,152, 7,128, 7, 96,158,133,133,197,117, 22,
-139, 53, 18,192,122, 0,199,154, 88,141,141,193,193,193,203,146,146,146, 76, 94,188,120,129,165, 75,151, 34, 36, 36, 4,201,201,
-201,223, 1, 48, 84,150,249,204,210,210, 50,156, 78,167,255, 15,192, 80, 0,131,237,236,236,250, 53,192, 59,114,201,146, 37,229,
- 29, 58,116, 72,124,245,234,213,200, 7, 15, 30,116, 92,188,120,177,244,221,187,119, 72, 76, 76,132,157,157, 29,156,156,156,160,
- 80, 40, 80, 82, 82,130,145, 35, 71, 10,204,204,204, 38, 80,183,113, 10, 20, 40,252,157, 69,214,123, 90,228,159,102,209,170,245,
-255, 90,223,168, 77, 76, 76,130,197, 98,113, 87, 31, 31, 31, 38,128, 83, 0,224,205, 64,224,200,110,237, 15,157,219,191,217, 39,
-108,231,106,159, 65, 62, 30,135,188, 25,168, 90,197, 22,222,177, 99, 71,115,177, 88,220,141,195,225,124, 94,151,176, 3, 0,115,
-115,115, 8, 4, 2, 8,133, 66,152,155,155,195, 96, 48, 64, 81, 90, 14,165, 30,144,151,171, 33,149, 74, 33,175,252, 95,161,210,
- 64,169, 84, 86,239, 91, 11,122,207,156, 57,179, 96,207,158, 61,249, 57, 57, 57,155, 1,180,157, 58,117,234,136,221,187,119,227,
-214,173, 91,229, 67, 61,221, 44, 55,244,108,255,117,235,156,228, 32, 79, 22,102, 1,136,140,140,140, 68,183,110,221, 64,163,209,
-198,213, 70,104,108,108,252,253,137, 19, 39,140,227,226,226,224,230,230, 22, 55,110,220,184,143, 55,111,222,236,202, 83, 20,223,
- 7, 0, 93, 81,110,220,252,249,243,215,108,216,176,161,160,160,160, 64, 83, 90, 90,106, 51,124,248,112,164,167,167, 35, 43, 43,
-235, 97, 29, 34, 51, 49, 58, 58,154, 72,165, 82,164,164,164, 32, 58, 58,218,120,205,154, 53,126,122, 58,125, 68, 38, 76,167, 77,
-237,222,209,111, 82,151,246, 56,246,232,133,209,189,215,169,194,142,205, 28,204,159,103,228, 52,215,210,240,230, 67,174,182, 92,
- 46,223,245,245,215, 95, 43, 20, 10, 5, 50, 51, 51,241,242,229, 75,188,122,245, 10,105,105,105,216,178,101,139,162,184,184,120,
-119, 67, 28,246, 92,230,151, 91, 23,207,160, 49,227, 31, 2, 47,238, 2,165,114,160, 76, 1, 85,130, 24,135, 19,114,177,247,236,
- 47,236,119,233,233,194,147, 39, 79,206,116,118,118, 22, 3,240,104, 72,213, 3, 0,157, 78,127, 95,132,130, 78,167,203, 1,228,
-242,120,188, 12, 83, 83,211, 12, 58,157,158, 75, 8, 81,254, 25, 61,159,174,131, 6, 12, 6,192, 54, 6,157, 85,111,106,207,143,
-199,141, 27,119, 34, 35, 35, 99, 80, 74, 74, 74,215,221,187,119,127,205,229,114, 99,118,239,222,253,117, 74, 74, 74,215,140,140,
-140, 65,227,198,141, 59, 1, 96, 74, 83,142,239,238,238, 62, 63, 40, 40, 8, 91,182,108, 65,187,118,237,224,225,225, 81, 26, 28,
- 28,188, 11,192,106, 0,159,187,187,187,223,159, 63,127,254,244,252,252,124, 81,102,102,102,187,239,190,251,110,206,174, 93,187,
- 58,101,103,103,115, 27,160,238, 49,112,224, 64, 92,185,114, 5, 0,114, 0,164, 20, 21, 21,233,178,179,179,225,229,229, 5, 63,
- 63, 63, 40, 20, 10, 40, 20, 10, 72, 36, 18,184,184,184,192, 96, 48,116,165,110,229, 20, 40, 80,160,240,127, 42,184,106, 23, 90,
- 92, 46,215,220,215,215, 23, 45, 90,180, 48, 71,229,106, 45, 75, 54,115,197,162,153,227, 77,248,226,171,160, 69,223,196,184,158,
-109, 76, 44,217,204, 21,149,187, 48, 93, 92, 92, 56,190,190,190,224,241,120, 14,117, 28,252, 78,110,110, 46,124,125,125, 33, 20,
- 10, 33, 16, 8,224,235,235, 11,141, 70, 3,169, 92, 14,165, 30, 40,213, 26, 32,149, 74, 81, 92,144,135, 82, 61,160, 51,181, 68,
- 90, 90, 26, 24, 12, 70,106, 29,156,118,110,110,110, 5, 49, 49, 49, 5, 0, 34, 1,124, 26, 18, 18,130,229,203,151, 99,237,218,
-181, 39, 76,114,222, 14, 60,113,229,188,229,241,224,207,172, 61,216,180,241, 0, 52, 25, 25, 25, 16, 10,133,224,241,120,181, 10,
- 3,127,127,255, 14, 60, 30, 15, 71,142, 28, 33,153,153,153,221, 81,177,132, 63,149, 70,171, 16,123,198,116, 72, 1,236, 18,139,
-197,157,215,172, 89,243,186,127,255,254,172, 46, 93,186, 96,253,250,245, 0, 16, 94, 27,167, 68, 34,121, 60,101,202, 20,245,237,
-219,183,145,144,144,192, 59,119,238, 92,224,250,245,235,219,188,123,247,142,115,241,242,213, 33,161, 25,178,192,205,215,239,113,
- 55, 92,187,243,216,202,140,215,186,185,149, 5,162,223,101, 25,233, 25,120,218,208, 21,237,204, 98,204,236,205,101, 70,247,228,
-208,115,122,115,153,226, 78, 44,198, 12,185, 92,126,242,194,133, 11,215, 22, 47, 94,172,200,207,207,135,169,169, 41,138,138,138,
-176,113,227, 70, 69,116,116,244, 89,181, 90,125,177, 33, 94,189,129,116,112,106,230, 12,188,137,169,254, 78, 99, 32,120,170, 54,
- 66,192,167, 11,225,233,229, 5,181, 90,141,182,109,219,210, 66, 66, 66,120, 2,129,224,171, 6, 69, 15,253,119,221, 77, 71,163,
-209,114, 9, 33, 89, 10,133, 34,211,216,216,248,157,145,145,209,187,226,226,226, 76, 66, 72,222,159,161,179, 8, 29, 95,118,107,
-235, 14,112,140,241,174, 72,145,253, 76,129,226,218, 10,154,154,154,206,216,187,119, 47,247,224,193,131,218,249,243,231,171,230,
-204,153,195, 42, 43, 43,179,153, 51,103, 14,107,254,252,249,170,131, 7, 15,106,247,238,221,203,229,243,249,163, 63,164, 34, 90,
-173, 22, 49, 49, 49,155,147,147,147,121,168, 8, 55,178, 48, 56, 56,120,106, 82, 82, 18,119,207,158, 61, 56,115,230, 12,206,156,
- 57,131, 17, 35, 70, 96,193,130, 5, 8, 10, 10,170,143,206,196,199,199,199,215,210,210, 18,119,239,222,205, 6,240, 14, 64, 7,
- 62,159,111, 58, 98,196, 8, 12, 26, 52, 8,229,229,229,208,104, 52,213, 66,139,193, 96, 64, 40, 20, 90, 82,247, 64, 10, 20, 40,
- 80,248,203, 69,214,111,196, 22, 19, 0,170, 76,117, 1, 1, 1,180,250, 30,140,250,146,124, 72,148,165, 72,147,150, 34,189,196,
-240,155,223, 12, 6, 67,189, 71,207,206,206,190,248,232,209,163, 25,190,190,190,204,236,236,138, 25, 49, 95, 95, 95,148,150,150,
- 34,251,197, 19, 40, 13, 0,207,205, 27, 74,165, 18, 37,175,158,131,239,211, 21,150, 31, 77,194,246, 61,123, 84, 69, 69, 69, 63,
-214,198,201,102,179, 89,142,142,142, 5,169,169,169, 58, 0,197, 2,129, 96,160,179,179, 51,238,220,185, 3, 0,199, 8,176, 21,
-209,183,129,187, 97, 32, 21, 38, 21,190,139,139, 11,242,243,243,161, 80, 40,238,212,198,249,232,209,163, 36,173, 86,219,118,248,
-240,225,180,159,126,250,233,148, 76, 38, 91, 11,224,165,202, 0,198,139,140, 60, 40,245,224, 2, 24, 96,110,110,254, 69, 80, 80,
- 80,191,249,243,231,227,194,133, 11,184,126,253,186, 6, 21,190, 96,143,106,161,149,166,164,164,236, 91,178,100, 73, 23, 58,157,
-254,233,141, 27, 55,116, 30, 30, 30, 50,141, 70,163,111,233,233, 73, 95, 27,178,206,104,222,167,179,133, 69,165,136, 31,212,210,
-174, 27,141, 6,196,103,229,191, 75, 86,160,168,190,115,234,207,102,132,143,236,238,227, 63, 99,220, 48, 62,207,173, 53,148,177,
- 79, 68,251, 78, 95,222,110, 28,157, 20,112, 55, 63,127,196,133, 11, 23, 2,239,220,185, 51, 79,173, 86,183,224,112, 56,111, 36,
- 18,201, 78,133, 66,209,160,200, 98, 48, 24, 31,169,236, 28,205, 37,197,197,224, 86, 90,162,100, 90, 3, 10, 85, 58, 36, 8, 61,
- 48,193,209,169,122, 26, 52, 55, 55, 23, 34,145,136,166,215,235,135,213,199,121,253,250,117, 4, 4, 4, 84, 9, 79,208,104, 52,
-208,104,180, 66, 79, 79,207, 60, 14,135, 83,100,100,100, 36,219,186,117,107,121,121,121, 57,152, 76, 38, 87,175,215, 51,254, 72,
-111,247, 51,129, 13,135,208,190,159, 51,188, 79,255,118,173,189, 72,228,179, 23,180,146,210,242,195,245, 88, 1,191,115,119,119,
-103, 22, 23, 23, 95, 4,144,160,213,106,143,159, 58,117,138, 59,121,242,228,242,211,167, 79, 79, 4,224,186,109,219,182, 64,133,
- 66,177,191, 41,245, 72, 78, 78,254,110,195,134, 13,203, 86,173, 90,133,163, 71,143,206, 79, 78, 78, 94, 94,105,233, 26, 17, 20,
- 20,132,173, 91,183,226,232,209,163,134,132,132,132,203, 6,131, 33,121,241,226,197, 62,182,182,182,133, 57, 57, 57,201,245,208,
-118, 28, 60,120,176,234,254,253,251,108,185, 92,126, 15,192, 23,115,231,206,157,217,185,115,103,217,184,113,227,248,197,197,197,
- 18, 19, 19, 19,246,129, 3, 7,204,153, 76, 38,148, 74, 37,104, 52, 26,228,114,185,154,186, 15, 82,160, 64,225,239,138,186,180,
-200, 63, 4,117, 62, 27,152,181, 53,176,180,180, 52, 47, 61, 61,221, 43, 43, 43, 75, 7, 64, 7, 0, 69,106,221, 55, 27, 14,132,
- 29, 28,221,197,157,151,163,213,226,220,179,184,210, 34,181,174,202,249, 93,151,149,149, 37,127,247,238,157,105, 89, 89,153,162,
-142, 99, 61,252,254,251,239,203,110,223,190,109,154,146,146, 2,189, 94,143, 14, 29, 58, 32, 49, 49, 17, 37, 9, 49,224,121,117,
- 0,175, 87, 0,226,196,207, 16,125, 61, 2,111, 21,106,221,235,213, 27,164, 10,165, 50, 72,163,209,156,171,141,144,197, 98, 21,
- 3, 32,132, 16, 61, 0,200,100,178,151, 10,133,162,167,173,173, 45,226,227,227,121, 74, 61, 22, 4,174,216,190,155, 16,162, 55,
-170, 88,205,181,104,220,184,113,136,138,138, 2,128,168,218, 56,101, 50,217,252, 89,179,102,221, 62,114,228, 8, 51, 37, 37,101,
-208,193,131, 7, 7,189,126,253,154,208,138,211,245,247, 75, 89,112,157,186,160,211, 15, 46,158,215, 3, 2, 2, 96,103,103,135,
- 3, 7, 14, 96,231,206,157,218,207, 62,251, 44,105,231,206,157,157,242,243,243,143,215,209,126,169, 68, 34,185,106,105,105, 57,
-175, 77,155, 54,114,165, 82,137,162,162, 34,100,103,103,195,194,210,146,174, 3,189,155,181, 80,120,252, 98,174,156,199,188,250,
- 24, 79, 50,115,234,181,102,117, 97, 49,166,140,246,111,239,255,249,170, 21,124,220, 63, 7,218,172, 32,144,131, 95, 99,225, 39,
-129,166,229,170,227,189,148, 47,210, 38,139,101,178, 80,153, 76,118,166,137,157,101,112,183,110,221, 78,108,216,176,193,120,229,
-150, 13,216,230,229, 0, 93, 81, 17, 10, 84,122, 20,170,116,144,149, 36, 32, 62, 62, 14,150,150, 86,120,251,246, 45,202,203,203,
-241,234,213, 43,194, 96, 48, 46, 54,100,209,169, 66,141,233, 66, 9,135,195, 41, 98,177, 88,121, 76, 38,179, 56, 37, 37, 69, 89,
- 94, 94, 14, 58,157,206,211,235,245,198,141,168,171,163,149,149,213, 98, 84, 4, 19,189, 32, 47, 44,220,229,203,130, 16, 76,244,
-118,177,178, 28,178,122,206,100, 43,103,123, 27, 73, 74,210, 27,237,143,215, 30, 20,150,171,234, 94,172, 1, 32,188,184,184,184,
-218, 34,121,250,244,233,133,167, 79,159,158, 9,224, 16, 42,242,110, 69, 72, 36,146, 31, 62, 96,240,173, 62,123,246,236,178, 85,
-171, 86,193,216,216,184, 58,120,170,177,177, 49, 23, 0,126,254,249,103,196,199,199,119, 70,165,191,150,193, 96, 56,145,147,147,
-211, 16,167,171,183,183,119, 74, 88, 88, 24, 27,128,253,220,185,115,187,238,222,189, 27,159,124,242, 73, 65, 92, 92, 92, 23, 0,
-169, 0, 92, 63,253,244,211,167, 71,143, 30, 53, 55, 24, 12, 40, 41, 41,129, 90,173, 78,165,110,229, 20, 40, 80,160,196,214, 95,
- 2, 95, 0,209,168,136,159,245, 17,128, 75,168,112,235,168, 19, 78,149,234,236, 26,128,225, 85,207,199, 58,156,225,129,138, 21,
- 89, 87, 1,252, 15,128,109, 93,164,150,150,150, 95, 77,157, 58, 85,155,153,153, 73,114,115,115,201,153, 51,103,200,162, 25, 83,
-245, 3,220,236, 13,110,246,182, 74,107,107,235, 68, 59, 43,139,195,237, 77,176, 8,128, 99, 35, 26, 54,245,245,235,215,179,167,
- 78,157, 58,163,242,184, 51, 78,156, 56,161,184,113,227,134,130,193, 96,132,163, 34,180, 67,149,160,156, 50,108,216, 48,133, 74,
-165, 82,120,122,122, 22,163,194,113,191, 46, 4,246,238,221,187,228,202,149, 43, 68,175,215,255, 46, 70, 81, 65, 65, 1,185,126,
-253, 58,233,222,189,187, 4,192,228,126,253,250,221,121,240,224,193,157, 30, 61,122,156,109,168,194, 86, 86, 86, 43, 94,188,120,
- 17,149,150,150, 38,190,116,233,146,248,248,241,227,226, 79, 63,253,244,165,143,143, 79, 89, 82, 82,146, 65,167,211,145, 23,207,
-159, 19,207,150, 45,149, 0, 92,234,226,233,107,204,124, 42, 59,240, 53, 41, 95,255, 9, 41, 31,233, 68, 0, 16,249,246,175, 72,
-222,252,254, 36,113,222, 16,210,135,203,120,244, 33, 61,197,194,194,226, 90, 84, 84, 20,145,203,229, 36, 54, 54,150, 76, 9, 24,
- 68, 30,205,236, 79,174, 14,114, 39, 71,123, 53, 39,219, 7,250,144, 65,189,122,146,239,191,255,158,132,133,133,145, 21, 43, 86,
- 24,172,172,172,228,168,199, 71, 75, 36, 18,221, 56,117,234,148, 24,128,152,193, 96,136,101, 50,153, 88, 46,151, 95,204,200,200,
-216,235,233,233,185,172, 77,155, 54, 19,189,188,188,250,246,105,238,178,172,159, 41, 39,177,191, 25,247, 77, 75,190,201,118,252,
- 62,238, 85, 53, 4,128,139,155,171,171,252,238,221,187, 6,149, 74, 69,238,221,187,103,104,213,210,163,124,219,216,193,103,223,
- 30,216,116,182,252,202, 79,215, 74,207,239,127,112,122, 90, 64, 76,111, 19,250, 79, 93,121,213,225, 56, 62, 20,227, 1,156,195,
-175,171, 14,167, 2, 56,143,250, 87, 33,210, 1, 28, 90,191,126,125,205,149,134, 0, 64,247,241,241, 17, 19, 66,196, 62, 62, 62,
-226,166, 86,196,196,196,100,241,133, 11, 23,130,157,157,157,183,140, 27, 55,238,128, 68, 34,185, 52,113,226,196, 24, 84, 44, 6,
-161,161, 34, 59,194, 48, 71, 71,199,130,232,232,104,114,231,206, 29, 50,102,204, 24,185,145,145,209, 36,234, 54, 78,129, 2, 5,
- 10,127, 9,102,215,246,217, 80, 28,173, 13, 49, 49, 49, 85, 49,180,230,214, 71,190,124,249,114,113, 84, 84,148, 24, 21, 81,226,
-235, 5,147,201,252,229,179,207, 62, 35,182,182,182, 10, 27, 27,155, 95, 88, 12,198, 76, 39, 99,248,226,195,150,186,247, 12, 13,
- 13, 29,241,221,119,223,125, 4,160, 51, 0,150,131,131, 67,118,110,110,174,226,193,131, 7,138,238,221,187, 43,172,172,172,242,
-189,189,189, 21,219,182,109, 83,104,181, 90,197,226,197,139, 21,248,125,188,175,218,192, 5, 48,143,205,102,255,210,170, 85,171,
-152,213,195,251,106,183, 44,152, 73,166,186, 91, 43, 0,124, 7,224, 51, 0, 66, 0,172,192,192,192,155,175, 94,189,186,230,237,
-237,189,175, 17,188,246,109,218,180,185,117,226,196,137,168,176,176, 48,241, 87, 95,125, 21,101,105,105,153,153,148,148,100, 40,
- 47, 47, 39, 37, 37, 37, 68, 34,145,144, 75,151, 46,233, 45, 44, 44,246,212,217,112, 14, 35,135, 92, 63, 86,107, 8,135,140, 85,
-147, 72,119, 54, 61,235, 67,122, 10,143,199, 43, 46, 42, 42, 34,185,185,185, 36, 37, 37,133,156, 61,123,150, 12,238,230, 71, 78,
-126, 58,154, 28,155, 49,130,108, 29,236, 71, 58,155,114,149, 34, 83,126,148,169,169,105,126, 99, 86, 29,138, 68,162, 27, 42,149,
-170, 58,124,131,163,163,163,216,211,211, 51,204,219,219,123,251,133, 11, 23, 22,238,216,177, 99, 68,159,230, 46,203, 54, 14,234,
- 86, 86, 26,113,154,200, 79,125, 71,150,119,240, 40,175, 20,243,181,194,193,210, 34,244,238,157, 59,134, 42,241,171,211,233,200,
-185, 95,126, 33, 99,135, 12,136,145, 94,253,249,127,247,130,230,159, 88,220,193,227, 92,119, 46,198,215, 39,216,170, 95, 69,248,
-176,244, 55,163,239, 29,234,108,145,211, 83, 64,255,174,139,233,111,210, 75,141,245,240,240, 72, 33,132,228,120,121,121,165, 0,
- 56,230,229,229, 85,243,255,105,117,208, 86, 7, 39, 13, 14, 14, 38,149,227,131, 14, 96,237,134, 13, 27,196,132, 16,177,187,187,
-251,125, 0,104,199,131, 85, 47, 1,253,127,195, 93,109,139,122, 9,232,255,107,199,171, 61,101,148,139, 17, 90,246,180, 54,185,
- 55,194,221, 78,222,219, 65, 16,121,236,240,193, 45, 67,135, 14, 61, 0, 96, 15,128,175, 45, 45, 45,239,141, 31, 63, 62,254,232,
-209,163,241,219,182,109,211, 36, 37, 37,145,233,211,167, 43, 57, 28,206,215,212,125,144, 2, 5, 10, 20,254, 50, 84, 69,134,183,
-107,138,208, 26,182,108,217, 50, 49, 33,164, 42,150,214,228, 90,202, 12, 95,181,106,149,152, 16, 82, 21, 29,254,253, 0,102,181,
- 5, 52, 11,222,187,119, 47,225,112, 56,255,251,192,198,212,228, 20,141, 28, 57,178,139, 76, 38,235,100,107,107,219,169,210,114,
-229,100,101,101,149,114,252,248,113, 69, 89, 89,153,130, 16,162,208,233,116,138,168,168, 40, 69,239,222,189, 21, 53,222,250, 27,
-170,231,111,176, 82,132,251,207, 86,207, 32, 43, 69,184,255,222, 79,147, 14, 29, 58,116, 37, 53, 53,245,162,153,153,217,210, 70,
-114, 58, 89, 91, 91,175,181,176,176,184,102,101,101,181,210,194,194, 34, 71,163,209,144,146,146, 18,146,152,152, 72,238,220,185,
- 67, 30, 61,122, 68, 44, 44, 44, 50,235,170,103, 63, 99,230,227,146, 45,243,136,225,208, 6,162,222,189,130, 0, 32,146, 29,203,
- 73,225,247, 33,228,217,172, 65,164, 55,151,241,240, 3,206, 39,132, 66,225,254, 95,126,249,197,144,156,156, 76,194,195,195,201,
-165, 75,151,200,130, 5, 11, 72, 75,123, 59, 85, 23, 54, 61,175, 39,135,121,237, 67, 2,150,170, 84, 42,177, 76, 38, 19, 43, 20,
- 10,113,171, 86,173,196,126,126,126, 97, 93,186,116,217,126,250,244,233,133, 27, 55,110, 28,209,207,148,147, 88, 26,113,154,144,
-175,134, 16, 50,175, 7,121, 51,179, 55,233,107,204,124, 81, 39,167,173,109,102, 85,180,118,165, 82, 73, 34, 35, 35,201,173, 91,
-183,136,200,202, 74,230,111,204,152,221,157,131, 94,221,205, 32,108,108, 61,251, 8,232,135, 31,127,255,141,190,236,202, 81,242,
-243,212, 33,186,222, 66,250,222, 26,229, 78, 18, 66,114,198,140, 25,243,150, 16,146,115,246,236,217, 12, 66, 72,206,232,209,163,
-223, 18, 66,114, 0,156,168,141,243,189,224,164,135, 42, 69,214,188,224,224, 96, 49, 33, 68, 28, 28, 28, 44, 6, 42,130,168,246,
- 18,208,143, 60,217,183,213,160,186,116,132,156,158,254,145,190,151,128,126,164,214,122, 10,153, 23,163, 15,237, 32,234,107,199,
-200, 47, 11, 38,234,123,136,204,238,122,120,120,108, 93,184,112, 97,216,163, 71,143, 94,234,245,250,248,148,148,148,248, 61,123,
-246,196,119,237,218,245,190,165,165,101, 12,155,205,254,172,161,107,244, 39,129,226,164, 56, 41, 78,138,147, 66, 13, 16, 66, 80,
-223,122,247,139,155, 55,111,230, 17, 66, 22, 7, 6, 6, 98,211,166, 77, 99,219,180,105, 51,222,193,193,193, 26, 0,178,179,179,
- 75, 99, 99, 99,101,129,129,129, 88,187,118, 45,182,108,217,178, 29, 21,190, 44,255,151,200, 61,119,238,156,227,252,249,243,243,
- 55,110,220,104,152, 62,125,186, 23,128,216,194,194,194,150, 19, 39, 78,156,199,100, 50, 3, 93, 92, 92,188,115,114,114, 10,202,
-202,202,142, 1,216,135, 6,230, 76,235, 2,135, 14,125,199,102,118,184, 70,135,190,198,215, 67,214,174, 93, 59,110,244,232,209,
-154, 29, 59,118,232,100, 50,217,133, 70,210,101, 20, 20, 20,172,171,250,199,194,194, 66,244,226,197,139,207,108,108,108,232, 41,
- 41, 41, 80,169, 84, 72, 78, 78, 54,160, 98,106,170, 86, 40,116,100,215, 15,103,111,120, 46,158, 20, 96, 86,154,240, 28, 70, 12,
- 6,180, 44, 54,114, 31, 95,195,161,200, 4,153, 82,131,221, 31,210, 78,137, 68,242,237,130, 5, 11, 38, 46, 93,186,148,235,226,
-226, 66,123,248,240, 33, 78,157, 58,165,202,207,207, 31, 12,224,238,175,161,159,154, 6,131,193, 0, 54,155, 13, 0, 88,190,124,
- 57,232,116, 58, 43, 63, 63,159, 77,163,209, 56, 52, 26,205,132, 70,163, 49,180,169,241, 48,200, 74,144, 87, 34, 65, 70,158,164,
- 94, 62,189,193,112,234,201,147, 39,139,218,183,111, 79,127,246,236, 25, 10, 10, 10,144,156,156, 76,244,132,156,136, 44,211, 87,
- 56, 37,170, 26, 95, 63, 19, 11,203,145,237,204, 57,116,246,225,181,240, 87,211, 25, 63, 26, 48, 6, 21,177,180, 0,224, 16,141,
- 70, 51, 2, 80,212,170, 85,171, 62,175, 94,189, 50,110,213,170, 85, 89, 66, 66,194, 21, 26,141,230, 0,224, 72,109,156,198,198,
-198,133, 0, 10,207,158, 61, 11, 0,179, 80,113,242, 58, 4, 5, 5,229, 68, 70, 70, 34, 56, 56, 56, 15,192, 94, 0,224,155, 91,
- 14,247, 22, 24,209,216, 63, 5,163,171, 10,244,221, 6, 82,171,213,149,111, 99,219,183, 13,143, 14,214,193, 53,232, 36,242,164,
-179,117,154,182, 33, 33, 33,145, 10,133, 66,117,242,228, 73,245,180,105,211, 24, 73, 73, 73, 79, 1,220, 3,112, 22,149, 62,150,
- 20, 40, 80,160, 64,225, 47,197,251, 97, 29, 26,244,209,122, 95,181,110, 2,240,195,235,215,175,171,147, 74,191,126,253, 90, 12,
-224, 71, 84, 68,131, 31,214, 4,197,187,186,210,162,181,239, 3, 27,243, 62, 39,215,215,215,215,248,213,171, 87, 70,168, 61,225,
- 49,237, 3, 56,127,135,218,114, 29,122,120,120,236,212,106,181, 97, 63,254,248,227,105, 6,131, 49,241, 15,168,125, 23,119,119,
-247,146,227,199,143, 27,194,195,195,201,234,213,171,245,118,118,118, 37,248,189,143,214,111, 56,253,217,140, 51, 75,188, 28,100,
- 81,147,123,144, 55, 11,135,147,123,147,122,147,217, 14,124,153, 63,151,113,234, 15,190,149,184, 11, 4,130, 67,198,198,198, 50,
- 51, 51,179, 27, 0,186,253,145,107,100,105,105,121, 84, 36, 18,221,168,185,217,218,218,134, 89, 91, 91,127,103,101,101,181, 90,
- 40, 20,206,113,229,178,119, 44,108,105, 95, 30, 51,178, 21,137,232,110, 77, 38, 89,177,223,159, 58,124,191,158,118,174,174,174,
- 69,161,161,161,134,139, 23, 47,146, 21, 43, 86, 24,154, 53,107, 38, 67, 61,126,109,245, 90,180,132,140, 83,103, 70,119, 49,228,
-125,228, 64, 54,121,153, 26,250,152, 51,234, 90,161, 56,169, 82, 0, 79,109,136,211,205,205,237, 71, 66,200,225,245,235,215, 31,
-198,175,185, 64, 7,132,132,132, 4, 17, 66,130, 66, 66, 66,130, 0, 12, 2, 0,127, 1, 61,244,216,136,142,250,236,161,246,228,
- 27, 47,190,222, 95, 64, 15,173,213,146,105,193, 60,119,126,230, 71,134,156,153,221,201, 90,119,158,190,139, 5,231, 38,155,205,
- 94,136, 10,139,179, 31, 0, 54,245,214, 76,113, 82,156, 20, 39,101,209,250,123, 8,175,198, 36,149,174, 9,145,133,133,197,161,
- 22, 45, 90,156,118,113,113, 57,205,231,243,183,163,194,105,190,169, 23,194,117,195,134, 13, 50,129, 64,208,238, 79,188,184, 54,
- 0, 28,240,251,196,185,127, 90,135, 89,103,135,249, 73, 75,199,190, 88,103,135,249, 53,190,246,243,242,242,250, 6, 21,209,188,
-255,104, 39,116,177,176,176,216, 99, 97, 97,145, 89,233,155,229,210, 24,206,142, 12,198,196, 62, 92,198,195,110,108,122,110, 31,
- 46,243, 65, 39, 6, 99,194, 63,116, 0,214,183,216,162, 46, 78, 71, 43, 43,171, 29, 22, 22, 22,217, 86, 86, 86,123,154, 40,178,
-126,195,217,206, 24,118,125,133,140,115,221, 76,105,202,190, 2,198,217,142, 38,117, 47,234,104, 66,219,125,131,131,131, 63, 33,
-132,124, 98,111,111, 31, 88, 67,248,123,175, 93,187, 54,128, 16, 18, 80, 21, 1,222,207, 4, 54,189,133,140,227,221,205,104,146,
-222, 66,198,113, 63, 19,216,212, 85,207, 62, 66,198,169,238,102, 52,137,191, 25,253,184, 51, 7,205,168,155, 57,197, 73,113, 82,
-156,148,208,250,119, 8, 45,170,195, 80,156, 20, 39,197, 73,113, 82,156, 20, 39,197, 73, 9,173,218,133, 85,205,205,174, 74,104,
- 49,169,115, 67,129, 2, 5, 10, 20, 40, 80,160,240,135, 80,103,192, 82, 90, 61,170,180, 41,142,237, 31,162,108, 35, 40, 78,138,
-147,226,164, 56, 41, 78,138,147,226,252,207,113, 54,196,253,127,189,176,238, 47, 3, 53,117, 72,113, 82,156, 20, 39,197, 73,113,
- 82,156, 20,231,223,133,243, 95, 7, 66,200, 7, 5, 9,165, 64,129, 2, 5, 10, 20, 40, 80,160,240, 43,124, 43, 63,171, 3,151,
- 86, 89,179,106,245,209, 98,250,173,207,211,233,116, 54, 0,192,100, 50,243,181, 79, 87,219,213,199,206, 2,250,233, 42,210,239,
-128, 9,204,210, 1, 55,106,225,188,161,211,233,204, 43, 57, 75,180, 79, 87, 15,170,151,211,111,253,181,154,229,117, 79, 87, 15,
-248,157, 82, 4, 24, 44,191,245,217,239,213,213,190,177,103,133,134,223,196,196,250,203,234,249, 79,225,252, 47,131,213,121,125,
-158, 86, 91,209,143, 88, 44,102,190,230, 73,253,253,200,168,243,250,236,154,229,181, 79, 86,219,214,199,105, 98,204, 41,114,115,
-176,222, 94, 31,103, 74,118,225, 98,101,105,185,101,125,156, 77, 29,155, 78,118,118,253,244,149, 99,147, 1,204,202,204,201,185,
-241, 55,235, 75, 29, 1,172, 6, 96, 86,227,187, 24, 0, 95, 80,189,146, 2, 5, 10,255, 48,161, 21,141,138, 60,135,251, 43,197,
-214,254, 58,133,150, 78,167,179, 17,255, 18, 4,165, 10,232, 55,101,189,141,235,200,125,191, 75,148,172, 43, 47, 97, 75,226, 78,
-122, 51,180, 50,115,107,166,198, 44, 59, 59,155, 6, 0, 52, 26,237,127, 0,156,107,225, 52, 23,255, 18,132, 82, 53,224, 63, 62,
-196,220, 25, 48, 43, 48, 50,250,210,152,199,235, 83, 86, 86,214, 6, 0,140,141,141,227,202,148,202,219,214, 26,205,182,247,203,
-215,213,178,154,117,237, 59,121,189,141,215,200,125, 11,244, 6, 3, 59,235,217,143,254,229,133, 73, 76,150, 78,181,119, 37,112,
- 37,168, 22, 81, 85, 7,223,175,199,253,120,133, 37, 11,232,203,230,114,219, 9,205,205,123, 26, 8,105,101, 48, 24,104,122,157,
- 46, 94, 38,149,222, 51,232,116, 47,116,106,165,165,248,194, 55,134,250,234,249,126, 91, 62, 6,152,191, 0,129, 60, 62,191, 15,
-131,197,234, 6, 0,122,173,246,161, 82,161,184, 61, 10, 56,211,152,182, 55,246,252,124,104,249,255, 26,180, 90,157, 77,234,181,
- 32,168,180,128,239,152,111,108,124, 38,254,116, 28, 0,212,249, 47,108, 21, 73, 23, 58, 3, 0,207, 45,224, 9, 71,228,155, 7,
- 0,204,119, 57, 54,137,225,171,160,210, 2,173, 2, 66,108, 26,226,156,182,246,148,229,210,217,163, 57, 0,112,253,236,119, 45,
-111,133,253, 48, 4, 0,250,142,158,123,101,224,152,249,137, 0,176,101,127,152,229,137,111,198,214,203,217,184,177, 41, 53,146,
- 38,133,187,171,101, 57, 66, 39, 30, 83,148,148,148, 68, 7, 0,123,123,251, 70,141, 77, 71, 64,144, 3,204,163, 51, 24, 61,221,
-220,221,125, 1,144,148, 55,111,162,245, 58,221,125, 59, 96,239,159,220,151, 22, 16,242,219,224,172, 52, 26,141,234,144, 20, 40,
- 80,248,167,225, 82,165,184,186,244,187,151,217,186,246, 80,170,128,187,201, 64,175, 46, 62,152, 61,113, 40,191,230,111,103,246,
-133, 56, 39, 61, 59,239,117,240,167,109,116, 31, 31, 31,164,166,166, 54,170, 22,165,106,224, 78, 18, 0,201, 43,211, 18, 30,239,
-205,142,173, 91,205, 6, 12, 24,192,180,183,183, 7,141, 70, 67,110,110,110,151,136,136,136,142,139, 22, 45,250, 20,146, 87, 37,
-165,106,200,239, 36, 53,204, 91, 85,215, 54, 45,155, 97,245,252,177, 2, 0, 88, 57,101,111,199,103,175,243, 44,222,188,121,211,
-111,217,178,101, 69,140,219,183,127,176, 2, 14,231, 1, 25,141,169,231,209,139, 79,184,130,156,159, 93, 39,205,159,127,214,221,
-221,157,239,226,226, 66, 51, 53, 53, 5,131,193, 64, 73, 73,137,115,108,108,236,144,167, 79,159, 42, 35,238,254,143, 29,245,116,
-120, 74, 62,183,115,121,163,218, 94,150,205,189,110,106, 26, 55,121,212, 40,199,177, 99,199,114,221,220,220, 0, 0,111,222,188,
-241, 56,115,230,204,248,179,103,207,174, 69, 89,182,174, 84,141,242,134,218, 94,205, 9,128, 11,116, 19,218,216, 76, 98,176, 88,
-109,116, 58,157, 67,165,181, 33, 75,175,213,198, 73,242,243,143,189, 95,158,194,239,161,210, 2,175,114,128,254, 61,125, 49,121,
-116,127, 30, 0, 44, 27,183,161,203,187,183,201, 70,106,181, 26, 45, 61, 91,117,255,250,155,237,215, 64,167, 35, 52, 44,162,186,
-124, 99, 56, 99, 94,165, 34,232,235, 29,200,126,121,166,139, 94,154,220, 71, 46,147, 50, 0,192, 76, 32, 24,125,230,228,207,183,
-237,189, 3, 31, 39, 23,106, 26,197, 89,223,216,188,122,114,143, 93,102,236,237,214,223, 95, 63,196,114,118,118,198,203,151, 47,
-155, 54, 54,165,175, 77, 13,118,118,241,219,190,250, 74,228,239,239, 15, 62,159, 15, 38,147, 9,157, 78,215,255, 42,105,207, 98,
- 0, 0, 32, 0, 73, 68, 65, 84,254,253,251,253,131,130,130,230, 66,250, 90,217,216,177,217, 8,108,163,209,104,125,166,205, 94,
- 96, 55,116, 68, 32, 70, 15,238, 78,117, 68, 10, 20, 40,252,211, 80,101,189,170,185,242,112,127,189, 66,139,201,100,230, 15,152,
-186,209,166,103,231,182,120,246, 34, 81,154,150,158,163,168,250,173, 56,238, 76,203, 17,221, 29, 90, 71, 70,222,133, 74,165,194,
-195,135, 15,241,226,197, 11,188,125,251, 22,115,230,204, 81, 85, 78, 29,214,198, 89,226, 63, 62,196, 28,210, 36,190, 7,251,117,
-243,136,132, 4, 70,121,121, 57, 34, 35, 35, 81, 82, 82, 2, 54,155, 13, 71, 71, 71, 12, 28, 56,144,153,144,144, 96,209,111,192,
- 96,129,255,224, 9,169, 16,120, 40,152, 76,102, 73, 93,121, 68,152, 76,102,126,191, 41,235,109, 90,123, 52,195,155,180,108,233,
-234,111, 14, 42, 12, 6,194, 76,121,251, 78,115,247,238, 93,248,250,250,226,198,141, 27,150,197,197,197,107,246,238,221,187,154,
-181,249,251, 93, 90,117,209, 18,212,205, 87,226, 63, 62,196,220, 50,255,180,203,173,171,231,140,226,226,226,140,126,252,241, 71,
- 20, 21, 21,129,205,102, 67, 40, 20, 66, 36, 18,161,101,203,150,180,149, 43, 87,242, 3, 2,226,240,249,172, 64, 23,141,235,204,
-215,117,213,179,186,237,138,119, 38, 86,178,235,110, 97,151, 46,209,123,244,232,241,155,215,246, 22, 45, 90, 96,208,160, 65,220,
- 73,147, 38,185,141, 29, 63,209,224,255,209,180, 55,224,187,148, 54,200,169,204, 48,182, 44,125,100,223,127,252,248, 11, 33, 33,
- 33, 66,145, 72, 4, 30,143, 7, 0,144, 74,165,142,105,105,105, 93,214,174, 93, 59,230, 73,204, 73,166,127, 64, 70, 54,120, 78,
-101,245,157,207,255, 42, 88, 44,102,126,149, 21,201,148,103, 92,146,145,153,167, 4, 0,181, 90, 13,181, 90, 13,149, 74,133,207,
-230,206, 97,204, 26,227,231,238,210,115,193,243,183, 89,121,197,173, 34, 30, 91, 84,237,171,109,128,147, 89,250, 86, 34, 73,191,
- 57, 43,232,171,175, 68,182,182,191,206, 8,134, 30, 61,202, 40, 46, 46,238, 31, 20, 20,212,154,152,244,150,180, 10, 8, 17,214,
-199, 89,223,216,148, 36, 94,106,254,245,252, 65,237,246,125, 19, 14,189, 94,143, 71,143, 30, 33, 50, 50, 18,219,183,111, 39, 87,
-174, 92,145,154,241,120,179, 80,239,216,124,109,218,195, 46,215,117,243,230,179, 52, 14,135,131,243,231,207, 35, 33, 33, 1,116,
- 58, 29, 62, 62, 62,152, 60,121, 50,250,247,239, 47,154, 61,123, 14,241, 31, 60, 46, 5, 2, 79,249, 31,236, 75,116, 0, 11, 86,
- 4,109,182,155, 50,115, 30,182,124,189,146, 18, 90, 20, 40, 80,248, 39, 91,179,234, 12,241,128,240,240,112, 82,185,245, 2, 0,
- 2,208, 91,140,220,119,226,116,148,225, 82,139,145,251, 78, 16,128, 78, 0,186, 25,208,172,125,251,246, 90,137, 68, 66,158, 62,
-125, 74, 62,251,236, 51,229,174, 93,187,110, 95,186,116,233,140, 78,163, 57, 96,111,103,247, 45, 65,237, 14,246, 4,160,187, 0,
- 2, 19, 19,147,130,244,244,116,114,249,242,101, 18, 28, 28, 76,142, 29, 59, 70,174, 92,185, 66, 34, 34, 34,200,149, 43, 87,200,
-137, 19, 39, 72, 76, 76, 12, 73, 76, 76, 36, 60, 30,175,192, 5, 16,212,195,201, 32, 0,163,229,200, 31,151,156,125,166, 13,241,
- 28,185,111, 17, 1, 24,230,128, 87,251,246,237,245,103,206,156, 33,161,161,161,228,167,159,126, 34, 49, 49, 49,164,176,176,144,
- 48, 57,188,130,170,253,234,170, 39, 1,232, 14, 14, 14, 5, 18,137,132, 56, 57, 57, 17, 54,155, 77,108,109,109, 73,203,150, 45,
- 73,151, 46, 93,200,144, 33, 67,200,196,137, 19,201,154, 53,107,136, 68, 34, 33, 92, 46, 55,175,106,191,186, 56,125, 1, 99, 30,
-143,151, 46, 22,139, 73, 93, 40, 43, 43, 35,133,133,133,228,218,181,107,132,199,227,165,251, 2,198,245,113, 26, 3, 29,188,189,
-189, 11, 10, 11, 11,137, 70,163, 33,233,233,233, 36, 54, 54,150, 36, 36, 36,144,244,244,116, 82, 86, 86, 86,205,157,152,152, 72,
- 92, 93, 93, 11,140,129, 14,117,113,254,151, 81,213, 39,222,223,156,109,109,135,136, 68,162,178,179,103,207,146,172,172, 44,114,
-228,200, 17, 66, 7, 54,188, 95,174, 62, 78, 54, 48,176, 71,143, 30,250, 71,143, 30,145,231,207,159,147,229,203,151,147, 65,131,
- 6,145,193,131, 7,147,160,160, 32,146,153,153, 73, 50, 51, 51,201,144, 33, 67,244,108, 96, 96, 67,253,179,182,177, 41, 0,156,
- 3, 2, 2,202, 52, 26, 13, 73, 73, 73, 33,109,218,180,201,100, 0,147,120, 64,235, 94, 0,167,161,254,233, 0,152,219,217,217,
-229, 60,122,244,136,132,133,133, 17, 23, 23,151, 2, 6, 48,205, 12,104, 97, 6,180, 96, 0,211, 90,180,104, 81,240,232,209, 35,
- 82, 84, 84, 68,156,157,157,115, 28, 0,243, 63,208,151,232, 0, 14,173, 8,218, 76, 94,103, 42,201,138,160,205, 4, 64, 58,169,
-240, 30,189, 65,245, 72, 10, 20,254,123,120, 95,139,252,227,159, 43,132,252,118,213, 97, 64, 64, 0, 13,192,157,250,118, 42, 99,
- 48, 54,110,217,178,133, 89, 94, 94,142,131, 7, 15,202, 63, 30, 51,230,116,175,158, 61, 83,154,187,184, 72,104,116,122,131,217,
-134, 11, 56,156,133, 91,182,108, 17,170,213,106, 68, 69, 69,161, 99,199,142, 16,137, 68,224,243,249,224,243,249,176,177,177,129,
-167,167, 39,242,243,243, 97,106,106,138,165, 75,151, 10, 10, 56,156,133, 13,241, 26, 12,132, 9, 0,122,131,129,109, 4,204,118,
-237,212, 41,106,237,218,181,116, 75, 75, 75, 88, 88, 88,128,207,231, 35, 33, 33, 1,106,181, 26, 38,198, 38,141, 10,210, 74,167,
-211,233,124, 62, 31,183,110,221,194,130, 5, 11,208,173, 91, 55, 8,133, 66,152,154,154,162, 77,155, 54, 24, 56,112, 32,102,205,
-154,133,148,148, 20,208, 26,225, 84, 18,207,100,206,155, 53,107,150,141,175,175,111,173,191,151,151,151, 67, 34,145,160,160,160,
- 0,142,142,142, 8, 12, 12,180,137,103, 50,231,213,197,103, 9,136, 28, 61, 60, 46, 60,125,250,212,138,199,227, 33, 52, 52, 20,
-231,206,157,195,213,171, 87,113,249,242,101,132,135,135,227,252,249,243, 40, 40, 40, 0, 0,120,120,120,224,212,169, 83, 86,124,
- 27,155,112, 75, 64, 68, 13,233,198,225, 93, 94,222,245, 54,185,185, 86,147, 38, 78,188,167, 80, 40, 48,105,210, 36,108,220,180,
-105, 37, 11, 88,212,152,253, 61, 1,129,133,157,221,225,205,155, 55,211,115,115,115, 49,106,212,168,194,109,155, 54,205,136,190,
-118,205, 77,124,245,170,219,198,144,144, 25,189,122,245, 42,204,204,204,196,209,163, 71,233,182,206,206,135, 61, 1, 65, 83,235,
- 41, 7, 22,236,220,185,147, 91, 94, 94,142, 1, 3, 6,164, 24,226,226, 60,117,192,207, 10, 32,225, 14,160,105,104,255, 28, 96,
-222,210,165, 75, 69, 28, 14, 7, 95,126,249,101, 97,233,187,119,109,117,192, 79, 82, 32, 77, 10,164,233,128,159,228,169,169,109,
-167, 76,153, 82,200,225,112,176, 99,199, 14, 81,206,175, 73,183, 27,139,142, 0, 46, 0,184, 11, 32,123,218,236, 5,211,124,253,
-186,226,232,129,189,248, 38,100,217, 97, 0, 31,211,104,180, 99, 0,150, 80, 61,143, 2,133,255, 38, 26,163, 69,254,166,152, 93,
-215, 15,204,154, 74, 18, 64,239,250, 88,204, 45, 45, 59,182,109,219, 22,145,145,145,240,246,246,126, 42, 20, 10,117, 70, 28, 14,
- 88, 44, 22,136,161, 65,157, 5, 99, 30,175, 95,255,254,253,153,143, 31, 63,134,171,171, 43,140,141,141,193, 98,177,126,179, 25,
- 25, 25,193,206,206, 14, 50,153, 12,253,250,245, 99,237,222,189,187, 31, 84,170,175, 27,124, 32, 38,197,242, 11, 30,111,158,248,
-191, 35,135, 91,248,251,251, 67, 42,149,193, 96, 48,192,196,196, 4,106,181, 26, 76, 38,179, 98, 10, 72, 75,100,141, 57, 99,122,
-189, 94,207, 96, 48,224,234,234,138,141, 27, 55,162,188,188, 28, 70, 70, 70, 0, 0,153, 76, 6,137, 68,130,216,216, 88,164,165,
-165,129, 52, 34, 34,153,169, 64, 48,116,236,216,177,181, 38,252, 85,169, 84,144, 74,165,144, 74,165,144, 72, 36, 40, 47, 47, 71,
-215,174, 93,217,151,194,195,135,162,168,104, 91,173,251,112,185, 99,142, 30, 61,106,195,102,179, 81, 86, 86, 6,185, 92,142,140,
-140, 12,188,123,247,174, 60, 63, 63, 95,103,106,106, 74,119,113,113,161,115, 56, 28,206,200,145, 35,105, 50,153, 12, 52, 26, 13,
- 1, 1, 1,150,199, 67, 67,199, 66,173,222, 78, 13,233,198,225, 58,160,234,160, 86, 15,235,236,231,119,235,233,179,103,190, 11,
- 23, 46, 68, 76, 76,204,102,147,147, 39,239,150, 2, 47,234,219, 55, 5,152,247,109, 13, 1, 67,222,189,243,214, 0, 5, 53,138,
-164,185,164,166, 94,157, 50,101,202,203,152,152, 24,171, 29, 59,118,136, 62, 30, 53,106, 30,128, 13, 77,169,163,169, 64,208,201,
-206,206, 14, 87,174, 92, 65,250,219,183,203,116, 64, 89,147,204, 75, 12, 70, 15,127,127,127,156, 63,127, 30,153,239,222, 45,211,
-253,182,142, 21, 47, 74, 64, 1, 51, 37,101,217,225,195,135, 15, 77,159, 62, 29, 12, 38,179, 7,116, 77,154, 56,252,157,227,251,
-244, 57, 11,113,120,255,238,195, 0,102, 2, 48, 0,120, 74,245, 56, 10, 20,254,219, 86,173,134,180,200, 63, 72,108,237, 7,208,
- 52,139,150,141,141,141, 3,159,207, 71,118,118, 54, 90,121,121,229,115, 56, 28,176, 89, 44,112,217,236, 70,213,160,180,180,212,
-219,222,222, 30, 82,169, 20, 86, 86, 86, 48, 50, 50,170,222,216,108,118,245,223,166,166,166,160,211,233,112,118,118, 70,105,105,
-169,119,131,188,121,177, 54, 39,119,207,253,236,209,221, 43, 45, 70,141, 26, 13,115,115, 11, 56, 57, 57,194,198,198, 6,198,198,
-198,112,114,114,130,155,155, 27,217,182,109, 27, 76,108,124, 26,117, 35,175, 41,158,152, 76, 38,244,122, 61,242,242,242,240,250,
-245,107,196,196,196,224,209,163, 71,120,254,252, 57,228,114,121,163, 34,191,150,150,149,181, 99, 50,153,181,138, 44,137, 68, 2,
-137, 68, 82, 45,180, 10, 10, 10,144,150,150, 6,133, 82,217,190, 30,209, 59,186,109,219,182, 12, 0, 48, 54, 54, 70,251,246,237,
-177,111,223, 62,221,197,115,231,198,181,126,244,200,194,233,218, 53,225,255,126,252,113, 92, 96, 96,160,254,241,227,199,144,201,
-100,120,245,234, 21,172,173,173,153,108, 46,119, 44, 53,156,155, 6, 49,160,180,146,203, 7,119,235,214, 45, 85, 42,149, 98,235,
-214,173,116,150,169,233,254,144, 58,166,248,170,193, 96,116,247,247,247,199,133, 11, 23,144,253,238,221,242,119,181, 8,152,119,
- 64, 65,122, 74,202,242,195,135, 15, 99,224,192,129,160, 49,153, 77,118, 84,234,210,165, 75, 91,131,193,128,151, 47, 95, 66, 8,
- 60,105,234,254,110,238,238,190, 85,150, 95, 30,112,175,174,114, 60,224, 94,116,116, 52,140,141,141,209,170,117,235, 14, 77, 60,
-204, 54, 26,141,150, 51,125,206, 66,132, 93,125, 0, 0, 56,188,127,119, 94, 13,145, 69,129, 2, 5,202,162,245, 79,181,104, 85,
- 9,171,154, 27,126, 35,180, 26, 41, 62, 0, 0, 44, 22, 11,108, 14, 7,108, 54,187, 66, 32,113, 56,141,230,160,209,104,224,114,
-185,213,194,170,166,192,170,249,183,137,137, 73,163, 67,215,151, 36, 95,237, 57,115,198,116, 54,135,195,129, 90,173, 2, 33, 4,
- 28, 14, 23, 66,161, 16,174,174,174,144,201,100,232,214,189,151, 42, 67, 98, 20,110,217,106,100,204,135,156, 61,157, 78, 7,165,
- 82,137,146,146, 18, 20, 23, 23, 67, 38,147,161,172,172,172,209, 75,209, 13, 6, 3, 35, 35, 35, 3, 63,255,252, 51,138,138,138,
- 0, 84, 56, 90, 87,137,171,170,207,212,212, 84,132,134,134,226,237,219,183, 77,186, 62, 61,123,246, 68,120,120, 56,163,119,191,
-126, 7,110,184,184,100,223,112,113,201,238,221,175,223,129, 11, 23, 46, 48, 28, 28, 28,144,150,150,134,168,168, 40,148,148,148,
-128, 16, 66,173,159,255, 0,188, 1, 74, 74,139,139,167,175, 92,185,146,240,249,124,108,253,246,219,118, 27,128, 9,141, 21, 48,
-130,122, 4,140,224,143, 9, 24, 16, 66, 96, 48, 24,160,215,235, 63,168,109, 52, 26,141,198, 98,177,154, 26, 90,161, 41,133,171,
- 29,223,151,174,217,136,203,231,207, 84,125,159, 68,137, 44, 10, 20, 40,252, 11, 80,167, 35, 60,179,134,130,172,254,172, 11,121,
-121,121, 89, 74,165,178,133,139,139, 11, 50, 51, 51,109,156,157,157,223,177, 89, 44, 24,177,217,160,209, 27,214, 4, 38, 38, 38,
- 47,179,179,179,187, 59, 56, 56, 64,167,211, 85,139,170,247,167, 14,171,172, 52,207,159, 63,135,137,137,201, 75,148,215, 27, 57,
- 1,122,117, 73,179, 14, 29, 58, 84, 91,134,132, 66, 33,132, 66, 1, 56, 28, 46, 86,173, 90,101,216,177,109,219, 94,231,190, 33,
-210, 79, 22,173, 36, 43, 55, 28,248, 83,207,108, 99, 31, 76, 38, 38, 38, 47,157,156,156,186, 10, 4, 2,132,133,133, 33, 45, 45,
- 13, 37, 37, 37, 40, 45, 45,133, 74,165, 66,105,105, 41,212,106, 53,184, 92, 46, 90,183,110, 13, 51, 51, 51, 68, 68, 68,188,132,
- 74, 85,187,184, 44, 42, 10,123,249,242,101, 87, 63, 63,191,106,139, 74,159, 62,125,104,125,250,244,177,170,182,162,149,150,162,
-176,176, 16, 79,159, 62, 69, 68, 68, 4,104, 52, 26,146,146,146,244,170,178,178, 19,212,152,248, 48,148, 3, 15, 25,135, 15, 31,
-250,244,211, 79,103,116,239,222, 29,122, 96, 8,128,208,255,143, 2, 6, 0,240,232,209,163, 88,189, 94,223,189,101,203,150,144,
- 0,157, 1,156,111,146,136, 76, 78,142,214,233,116,253,218,181,107,135,176,211,167,123, 2, 72,171,173,156, 18,232,233,235,235,
-139,178,178, 50,188,138,143, 23, 55, 65,100, 29, 88, 17,180,121,218,148,153,243,112,244,192, 94, 28,222,191, 59,227,208,190, 93,
- 78,104,132,255, 24, 5, 10, 20,254, 83,214,172, 6,181,200,223, 20,179,235, 18, 95,204,166,176, 72, 75, 74,196,209,209,209, 45,
- 58,116,232,128, 3, 7, 14,248,117,235,218, 53,203,136,205,214,177,141,140, 64,111,196,131,164, 76,169,188,121,243,230,205,206,
- 35, 71,142,100, 62,126,252, 24, 34,145,168, 90,104, 85,125, 50,153, 76, 16, 66, 96, 98, 98,130, 95,126,249, 69, 83,166, 84,222,
-108,208, 90,164, 55,232,233,149, 66,143, 16, 2,137, 68, 2, 35, 35, 35,108,223,190, 3,123,182,109,155,168, 7,206,120,240,172,
-191, 2,192,253,255,246,128, 46, 45,189,117,249,242,229,142,107,215,174,101, 57, 58, 58, 66, 34,145,160,164,164, 4, 69, 69, 69,
-144,201,100,144,201,100, 40, 41, 41,129, 68, 34, 1,151,203, 69, 76, 76,140,182,188,180,244, 86, 93,124,156,242,242,179, 83,167,
- 78, 93, 26, 29, 29,109,199,100, 50,161,213,106, 97, 48, 24, 96, 48, 24,160,209,104,144,156,156,140,184,184, 56, 36, 36, 36,160,
-184,184, 24, 44, 22, 11, 12, 6, 3,207,159, 63, 47,225,105,181,167,213,212,152,254, 96,176,128,176,251,247,239,207,152, 60,121,
- 50,236, 29, 29,123, 33, 51,179, 81, 2,230, 92, 61, 2, 70,250, 97, 2,230, 87, 1, 36,151, 63, 75, 77, 77,237,222,187,119,111,
-216, 57, 58,110,110,157,153,121, 35,190, 9,126, 90,122,157,238,222,253,251,247,251, 77,153, 50, 5, 7, 14, 28,216,108,157,154,
-122,181,224,189,105, 78,107,192,186,185,155,219,230,105,211,166,225,250,245,235,208,235,116,247,234,161,172, 25,241,189,217,180,
-217, 11,156,222,115,124,223, 71,163,209,230, 3,216, 74,245, 40, 10, 20, 40,252,155, 45, 90, 77,154, 58, 52,214,235, 87, 44, 89,
-178, 68, 75,167,211, 49,122,244,104,211,243, 23, 46, 4, 62,127,241,194, 53, 63, 63, 95,168,215,235, 27,228,178, 86,169,118, 45,
- 89,178, 68,162, 86,171,225,233,233,137,226,226, 98,232,245,122, 48,153, 76, 48,153, 76,208,104, 52,208,233,116,240,249,124, 68,
- 71, 71,227,208,161, 67, 50,107,149,106, 87,131, 15, 9,189,254,101,104,104, 40, 24, 12, 6,225,114,185,160,209,104, 96, 50,153,
-216,177, 99, 71,254, 30, 32, 12, 0, 24,116,186, 26, 0,232,116, 90, 99,189,119, 27,156,183,100,179,217, 48, 84, 44, 2,104,176,
-172,185, 74,181,115,203,150, 45,242, 87,175, 94, 65,169, 84, 86, 91,223, 20, 10, 69,181,115,189, 68, 34, 1,141, 70,131, 82,169,
-196,133, 11, 23,228,230, 42,213,206,186,248,138,128,220,204,164,164,225,126,126,126, 69,169,169,169,144, 74,165,120,249,242, 37,
- 34, 34, 34,112,234,212, 41, 92,191,126, 29,201,201,201,208,233,116,112,112,112, 0, 33, 4,231,206,157,147,234,228,242, 33, 69,
- 64, 46, 53, 38,234, 70, 51,145,168,159,173,141, 77,186,181,149, 85,102, 51,145,168,223,251,191, 11,128,196,196,196, 68,232,116,
- 58,184,186,186, 90,212,231,167, 69,116,186,251,247,239,223,199,148, 41, 83,224,212,162,197, 38, 23,192,250,253, 50, 46,128,181,
-139,155,219,166, 42, 1, 67,116,186,251, 77,173,179, 41,176,251,171,175,190, 42, 51, 50, 50,194,201,147, 39, 93,181,238,238, 9,
- 76, 96, 2, 31,240,234, 13, 24, 53,180,191, 29,176,119,205,154, 53,185, 52, 26, 13,199,142, 29,179, 18,184,185,197, 50,129,169,
- 2,160,153, 0,104,198, 4,166, 10,220,220, 98, 79,158, 60,105,165,211,233,176,104,209,162, 92, 59, 96,111, 61,148, 11, 8, 33,
-195, 8, 33,254,132, 16,167, 67,251,118,225,242,249, 51, 85, 34,107, 38, 42,156,222, 39, 3,136,165,122, 28, 5, 10, 20,254,205,
-168,213, 12,197,244, 91,159, 7, 16,155, 94, 93,124,240,236,197,107,169,149,185,217,181,170,223,138,227,206,180,236,235,109,230,
-243,253,247,223,131,197, 98, 33, 35, 35, 3,241,241,241, 48, 51, 51,195,196,137, 19, 85,101,114,249,240, 26,185, 14,251, 3,136,
-168,228,172,200,167, 38, 77,226,187, 49, 99, 90, 92,189, 28,206, 16, 8, 4, 80, 40, 20,160,211,233,224,114,185, 48, 49, 49,129,
-177,177, 49,162,162,162,240,209,176, 17,250, 2, 19,255, 95, 3,150,254,154, 79,173,154,179, 42,214, 80,103,192, 36, 26,248,210,
-198,222,126,201,234,213,171,141, 7, 13, 26, 4, 35, 35, 35, 56, 54,243,200,117, 29,188,117, 55,157, 78,211,101, 22,201, 86,185,
- 53,179, 23,196, 39,165, 1,160,229,107,159,174,182,175,145,235,240,119,245,116, 86,223,117,253,229,167,109,102,237,219, 87,248,
-163, 75, 36, 18,228,229,229, 33, 63, 63, 31, 18,137, 4, 74,165, 18, 0, 16, 30, 30,142,203,145, 9,178, 50,199,192,148,186,234,
-249,107,219, 95,155,218,107,158, 52, 63, 30,250, 19,195,218,218, 26,121,121,121, 40, 40, 40,128, 68, 34, 65, 89, 89, 25,244,122,
- 61,138,139,139,113,240,240, 79,250, 34,190,255,219,234,128,144,245,113, 42, 51,140, 45, 20, 15, 28,124, 91,187,144, 25, 51,102,
-152,154,153,153,193, 96, 48,160,164,164, 4,233,233,233, 72, 77, 77, 69,100,100,164, 50, 95,162,134,210,106, 64,102,117,192,210,
- 90, 56,255, 68,252,227, 56,107,198,173,178,183,179,203,126,247,238,157,141, 94,175,135,131,131,131, 78, 82, 92,188,137, 13, 92,
- 55, 5,114, 0,144, 66, 96,245,206,221,187,167,143, 24, 49, 2,157, 58,117,202,200,205,203,107, 94, 91, 95, 34, 0,195, 19, 16,
-148, 58, 58,198, 61,125,250, 84,148,158,158,142, 41, 83,166, 20,190,123,243,102,121,149,191,150, 20,232,233,226,230,182,233,228,
-201,147, 86, 45, 90,180,128,183,183,119, 46, 55, 61,189,205,107, 64, 90, 71,255,172,115,108, 74, 18, 47, 53,159, 59,170,109,167,
-207, 62,251, 12, 58,157, 14,145,145,145,120,242,228, 9,222,189,123,135, 7, 15, 30, 72,204,120,188,113, 53,114, 29,214,218, 63,
-135,120, 40, 93,143, 29, 11,165, 25, 25, 25,225,240,225,195,136,142,142, 6, 0,248,250,250, 98,218,180,105,208,233,116,152, 52,
-105, 50,185,244,218, 56,165,190,254, 9,160, 45,128,111, 81, 33,242, 58, 17, 66,184, 52, 26, 45, 27,128, 19,154,230,147, 69,245,
- 79,138,147,226,252,239,112,254,171, 80,111, 82,233,154,249,212,214,255, 0,193,111,211,124,204,202, 62,179, 47,132,217,163,167,
-191, 87, 72,112, 16,221,207,207, 15, 78, 78, 78,240,245,245, 69,122,122, 58, 71, 40, 20, 54,148, 79, 77,225, 63,120, 66,170,143,
-143,143,112,249,242,229,130,129, 3, 7,178,156,156,156, 64, 8, 65,116,116, 52,194,194,194, 52, 7, 14, 28,144,149,218, 14,147,
-136,111,255,172,104, 76, 62,181, 39, 64, 41,128,117,142,217,217,251,231,205,157, 27,212,190, 67,135, 25,193,193,193,116,190,137,
- 49,107,227,170,153, 92, 0, 88,255,221, 41,193,136,192,137,216,233, 14,244,154, 80,123, 30,185,154,245, 76,207,156,245,110,232,
-168,126,238, 95,206,159,174, 31, 59,118, 44,207,204,204, 12, 78, 78, 78, 48, 55, 55, 71, 74, 74, 10, 50, 51, 51,201,197,139, 23,
- 21,143,158, 39,178,206, 93,127,246,142, 43,176,107, 76, 94, 66,185,255,160,143,223, 14, 29, 58,212,124,234,212,169,166, 29, 59,
-118,100,113, 56, 28,112, 56, 28,228,229,229, 33, 57, 57, 89,115,241,226, 69, 69,169,205,144, 18,241,237,147,242, 70,230, 58, 44,
-243, 31, 31,146,124,239, 70,240,162,184,151, 47, 39, 27,128,118, 26,141,198, 65,175,215,211,232,116,122,142,193, 96,120,169,145,
-203, 15,169,124,131,119, 80,185, 14, 27, 7,189, 94,111,164,215,235, 33,145, 72,112,227,198, 13,230,155, 55,111, 86,191,120,241,
- 98,117,118,118, 54,180, 90, 45,198,140, 25, 3, 95, 95, 95,220,190,125, 27, 5,121,121, 23,235,227,122, 13, 72, 57,153,153,211,
-102,205,154,117, 37, 52, 52,148,254,226,197, 11,171,195,135, 15, 31,172, 77,192, 76,158, 60,217,144,151,158, 62, 77, 5, 72,235,
-233,159,245,141,205,194,171, 39,247,188, 24, 57, 58,176,117,240,218,213,172,110,221,186,193,202,202, 10, 61,123,246,132, 70,163,
- 17,182,106,213,170,161,177, 41,247, 31, 60, 46,165, 93,187,118,188, 29, 59,118,136,166, 79,159,142,249,243,231, 3, 0,202,202,
-202,112,253,250,117, 44, 90,180, 40, 55,157,217, 89,217, 80,255,172,180, 84, 85, 9,176,187, 0,252, 1,164,128,114,124,167, 64,
-129,194,191, 19, 85, 73,165,237, 80,145, 88,250, 18, 42, 94,206, 27,206,117,120,239, 73, 44,106,166,249,168,128, 93,188,206,121,
-234,155, 57, 75, 54,121, 51,180, 50,115, 22,173,220, 44, 41, 49,145,214, 80,206,195,234,124,106, 2, 15,133,101,234, 9,191,141,
-235,215, 47,220,185,115,103,191,170, 16, 14, 38, 38, 38, 47,203,148,202,155,214, 42,213,174, 82,129,199,205,166,230,230,203, 4,
-242, 0,204, 53, 23,139,119, 7,140, 24,179,133,107,225,202, 90,185,225, 64, 57,131, 78, 87, 39,103, 23, 96,167, 59,192,107,196,
- 2,201, 82, 53, 16, 39,177,211,229, 89, 6,190, 94,243,213, 87, 95,174, 95,183,206,143,207,231,247,210,232,116, 30, 6,131, 1,
- 48, 24,146, 74,149,202,187, 68,163,121,170,242, 93,187,141, 43,176, 35,141,206, 75, 40,108, 37,183,120,123,198,239,200,161, 67,
- 11, 78,159, 62,253,187,182, 91,170, 84,187, 75,133,173, 34, 26,211,246,154,101,202,129,135,200,207,127, 88,159,233,146,202,117,
-216, 56, 48, 13,134,217,230,230,230, 71,251,245,235,199,237,223,191, 63, 62,250,232, 35,116,235,214, 13, 6,131, 1,132, 16,200,
-229,114,156, 58,117, 10, 91,182,108, 73,106, 14,172,107,136, 79, 5,220,228, 92,190, 60,164, 93,187,118,135,235, 19, 48,149, 34,
-171, 65,159,196,250,199, 38, 39, 73, 39, 24,158, 54,126,222, 70,119,181, 44, 71,104,105,162, 19,197,197,190,164, 55,126,108,122,
-202,245,209,167, 58,143, 25, 53,106, 30,131,201,236, 89,185, 2,146,188,138,143, 23, 87, 37,149,134,239,180, 27, 77,236, 75, 85,
-177,235, 40,199,119, 10, 20, 40,252,219,133,214, 71,168,240,215,170, 78,201, 83,103,174,195, 42,171, 15,147,201,204, 79, 57, 55,
-103, 98,125,236, 44,160, 95,165, 37, 11, 13,230, 58,172,252, 59, 13,144, 67,165,250,250, 55,193, 72,107,172, 46,100,189, 87,190,
- 41, 97, 17, 75,128,215,208,169, 2,144, 31, 15, 92,152, 91,193,231,183,126, 89,205, 54,213,249,144,253,205,113,141,138,203,129,
-123, 80, 40,238, 65,161,168,213,105,151,197, 52, 42,110,168,158,239,183, 61, 29,144,253,209,182,191,207,217,160,120,248, 3,231,
-243,191,134,172,194,194,115, 0,248,142,225,225,182, 87,195,195,199,126,185,120,241, 24, 59,123,123, 55, 43, 43, 43,115, 83, 83,
- 83,250,227,199,143, 83,117,229,229,187,219, 3, 71, 42,173,169, 13, 66, 5,220,244, 76, 79,111,243,241,168, 81,243,104, 76,102,
-143,154, 2,134,232,116, 15, 92,129,189,245, 89,178, 62,116,108, 58,113,236,250, 85, 90,178,192, 0,102, 53,166,111,100, 86,212,
- 99, 3,116,186, 13,136,137,169,165,207, 55,185, 47,173,167,209,104,114, 80,142,239, 20, 40, 80,248,247,162, 42,223,225,165,255,
-235, 3,247,167, 56, 41,206,127, 17, 39, 3, 21,171,232,168,243, 73,113, 82,156, 20, 39,197, 73,161, 94, 84,229, 58,100, 82,167,
-130, 2,133, 70, 67,143, 95,167,193, 40, 80,160, 64,129, 2,133, 42, 84,249,102,213,196,126,160,194,117,167, 46, 85,218,148,213,
- 4, 31,162,108, 35, 40, 78,138,147,226,164, 56, 41, 78,138,147,226,252,207,113, 54,196,253, 79, 92,205, 88,229,147, 85,237,155,
-213,216,236, 54,127, 20,148, 89,149,226,164, 56, 41, 78,138,147,226,164, 56, 41,206,127, 59,236, 42, 69, 86,245, 86, 53,117, 72,
-167,206, 13, 5, 10, 20, 40, 0,193,193,160, 19, 2, 26, 33,193,116, 66, 78, 51, 8, 9,100, 16,130, 63,148, 10, 36, 48,176,246,
- 96,182,159, 79, 52, 55,165,206, 56, 5, 10,255, 42,228,160,142,164,210,148,143,214,255, 95, 56,139, 68,162,125, 0,104,185,185,
-185,179, 1,164, 83,167,228,239, 7, 11, 11,139,126, 58,157, 14, 50,153,236,230,191,177,125,173,221, 48,138,208,209,170,250, 11,
-130,244, 87,201, 56, 90, 91,217, 86,238,152, 2,218,175,177,184,104, 6,188,138,127,131, 95,154,112, 56,250,144,254, 78,123, 1,
-224, 74, 68,198, 60,252, 53,113,181, 90, 90, 91, 91, 95, 99, 50,153, 76,189, 94, 63, 55, 63, 63, 63,188,110, 33, 20,200, 0, 0,
- 22,185,189, 66,146,107,179,252,139, 79,105,172, 82,213, 33,137,170, 76, 41,101,176, 24,111, 57, 44,209,253, 57,211,233, 87, 74,
- 20, 93,227,107,219,255,204,153, 51,117,102,241,110,227,142, 33,116,125,235, 97,190,109, 83, 83,190,221,229,183,179,151,171, 21,
- 43, 53,227, 57,127,243,143,210,125,108,161,203,176, 41, 99,105,225, 76, 19,218,228, 67,135,138, 20,212, 40,107, 60, 54, 2, 22,
- 26,192,155,197,225, 56,233,117, 58, 91, 26, 64, 24, 76,102,158, 86,165,202, 48, 2, 98, 86, 0,146,127, 59,167, 17,135,227,168,
-215,233,108, 1,224,239, 88, 79, 10,191, 69,157, 66,139,207,231, 71,209,233,116,199,154,201,112,171,242, 9, 86,125, 87,243, 55,
- 26,141, 6,189, 94,159, 89, 82, 82,210,177, 9,199, 55, 3, 48, 22, 64,213, 18,245,227, 0, 78,225,195, 29,142,205,140,140,140,
-150,240,120,188,190,101,101,101,109, 0,192,216,216, 56, 78,169, 84,222,210,104, 52,223,126, 32, 47, 19,192,199,124, 62,191, 15,
-157, 78,239, 67, 8,161, 17, 66,110, 43, 20,138, 91, 0, 78, 3,248,144, 72, 9,198, 54, 54, 54, 27, 44, 44, 44, 38,172, 88,177,
-162,200,210,210,210,115,209,162, 69,207,138,139,139,127, 46, 44, 44, 92,133, 38,228,168,251,139,225, 38, 18,137,142,179, 88, 44,
- 70, 70, 70, 70, 31, 0,112,114,114,186,173, 86,171,245,249,249,249, 19, 1,188,105, 34, 31, 15, 64, 23, 62,159,223,145,207,231,
-251,235,245,250, 86,149,249, 25, 95, 41, 20,138, 72,141, 70, 19, 5,224, 49, 0,229,223,104,140,152, 50,153,204,208,202,190,238,
- 1, 64,254,111,187, 9, 16, 58, 90,197,199, 37,120, 86, 11,175, 54, 94,117, 23,166,193,185,150,178,141, 22, 90,125,123,217, 13,
- 27, 62,124, 0, 29, 0,212,218, 43,195,110,221,205, 57,255, 39, 55,167,229,232,209,163, 31,134,134,134,154,171, 84, 42,204,158,
- 61,251,120, 68, 68,196, 94,153, 76,182,162,222, 27, 7,223,124,209,214, 29,215, 77,104, 52, 58, 0,216, 24, 12,122,155,172,172,
- 55, 30,241,177, 15, 7,199,197, 61,218, 88,150,112,235,177,129,198,154,163, 65,207,132,198, 84,162,149, 43, 2,134,141, 25,245,
-209,186,117,193,152, 48,110, 66,179,184,184,114, 99, 7,179, 20,118,113, 25,207,221,210,218,102,248,186,245,103,104,247,239,157,
- 27, 30,122, 56,228,214,244,233,150,125, 41,177,213, 40,208,214, 51,153, 93, 4,238,238,254,227,206,157, 3,223,201,137,201,228,
-112,232, 0,160, 83,169,156, 20, 25, 25,118, 39,135, 15,239, 28,156,152,120, 39, 24,120, 66,113,254,127,225,164,208, 20,161, 69,
-167,211, 29,179,178,178,108,120, 60, 94,197,205,152, 16,232,245,122,232,245,250,234,228,197,132,144,234, 79,157, 78, 7, 47, 47,
-175, 70,189,209, 2,232, 11,224,147,222,189,123, 7,126,251,237,183, 44,111,111,239,170,148, 33, 61, 87,174, 92,249, 93,116,116,
-244, 89, 0, 71, 80, 17,188,177,177,111,188,131,120, 60,222,177,173, 91,183,154, 13, 24, 48,128,105,111,111, 15, 26,141,134,220,
-220,220, 46, 17, 17, 17, 29, 23, 45, 90, 52, 87,169, 84, 78, 2,112,173, 9,231,167,173,169,169,233,153, 81,163, 70, 57,246,234,
-213,139,219,186,117,107,232,245,122, 60,127,254,124,122, 84, 84,212,248,179,103,207, 6,201,229,242, 64, 52, 62, 95, 27,141,207,
-231, 79, 53, 51, 51,219,176,118,237, 90,139, 73,147, 38,177, 99, 99, 99, 75, 92, 93, 93,105,247,239,223,183, 62,117,234,212,220,
- 77,155, 54,125, 44,147,201, 86, 41, 20,138,159,208,136, 28,138,166,166,166, 81,116, 58,221,177, 49, 66, 24, 64, 83,196,112,251,
-230,205,155,159,186,119,239, 94,243,180,180, 52,253,200,145, 35,143, 2,192,173, 91,183,188,181, 90, 45,109,224,192,129, 87, 50,
- 51, 51,199, 2,120,222,200,182,251, 88, 88, 88,156,159, 48, 97,130,133,155,155,155, 73,243,230,205,105, 60, 30, 15, 12, 6, 3,
- 82,169,212, 62, 54, 54,182,255,147, 39, 79,202, 34, 34, 34,138, 85, 42,213,112, 0, 49, 77,184, 78,221,108,108,108, 38,179, 88,
-172,182, 58,157,206, 1, 0,152, 76,102,150, 86,171,141,205,207,207, 15, 5,240,240, 67, 7,136,173,173,237,158, 13, 27, 54, 88,
-229,231,231,147, 77,155, 54,237,145,203,229, 83,255,173, 55,131,227, 63,159, 70,212,179, 39, 64, 69,218, 28, 90, 45,253,143, 6,
-192,232,139, 47, 22,163, 99,167,206,152, 56,225,227, 6, 57,135,246,115,220,202, 98, 27, 89,150,151,151, 63,148,150,170, 78,243,
- 76,184, 99, 39,140, 15, 72, 2,128, 43, 87,239,140,245,243, 51,191, 45, 48,225,124,204,229,114,187,105,213,154,162,203, 55, 51,
-191,106,138,168,114,112,112,184,102,110,110,110, 82, 92, 92,156, 91, 80, 80,240,195,176, 97,195,214, 31, 57,114,196, 60, 53, 53,
- 21, 25, 25, 25, 88,184,112, 33, 63, 51, 51,115, 94, 76, 76,204, 35,181, 90, 93,167,101, 75, 46, 47,222,181,114,249,136,181, 2,
-129, 21,131,103, 98, 6, 83,129, 5, 92,221,218,161, 75,183, 97, 24,242,209, 12, 36, 39, 69,119, 57,114,120, 93,116, 86, 86,196,
- 55,124,139, 22,235, 37,146,230,117,222,151, 90,183, 68,175,225,163, 42, 68,214,218,181,193, 72, 76, 72,144,167,189,165,127,126,
-233, 28,211,100, 72, 63, 47,142, 78,157,155,118,255,222,185,230, 61,122,142, 4,128,142,161,135, 67,110,125, 62,209,188,223,158,
-227, 37,114,234,145, 84,247,189,115, 29,139, 53,117,208,142, 29, 54,190,115,231, 26, 41,222,190,213,164,252,248, 99,105, 94,100,
-164,158,201,225, 16,167,193,131,105,214,125,250,112,231,190,122,101,244, 96,211, 38,127, 86, 72,136,235, 42,141,230, 24,197,249,
-127,202,249, 95, 71,149, 19,124,205,213,135,251,235, 21, 90, 52, 26, 13, 60, 30, 15, 39, 79,158, 4,139,197, 2,147,201, 4,139,
-197,170,243,111,103,103,231,198, 84,100,180, 72, 36,250,110,239,222,189,182,131, 6, 13, 2,151,203,173,254,129,193, 96, 96,192,
-128, 1,232,223,191, 63, 43, 59, 59,123,252,201,147, 39,199,111,220,184, 49, 79, 34,145,204, 71,101, 98,232,122,208,199,211,211,
- 51,236,250,245,235,198,229,229,229,136,140,140, 68, 73, 73, 9,216,108, 54, 28, 29, 29, 49,112,224, 64,102, 66, 66,130,197,128,
- 1, 3,194, 18, 19, 19, 3, 0,220,110, 68, 93, 59,218,216,216,220, 61,125,250, 52,183, 93,187,118,180,228,228,100,248,250,250,
- 2, 0,164, 82, 41, 70,142, 28,201,157, 52,105,146,219,248,241,227, 31,231,231,231,247, 2, 16,213, 0, 95, 7,145, 72,244,211,
-168, 81,163,236, 55,110,220,104,102,106,106,138,180,180,180, 28,145, 72,228, 81,117,190,199,143, 31,207, 30, 54,108,152,221,150,
- 45, 91,118,157, 57,115,230,171,252,252,252,169, 0,196,245,170,214, 74, 65,108, 98, 98,130,188,188, 60, 28, 63,126, 28,243,230,
-205, 3,131,193, 64,126,126, 62, 78,157, 58,133,207, 63,255,188, 74,208, 52, 74, 12,155,152,152,244,119,119,119, 63,120,235,214,
- 45, 71,161, 80, 8,123,123,123,250,154, 53,107,218,186,186,186, 26, 55,107,214,140,145,147,147,131,176,176, 48,215,201,147, 39,
-159, 79, 79, 79,159,174, 82,169, 26,156, 82,179,181,181, 61,116,233,210, 37,231,184,184, 56,252,248,227,143, 40, 46, 46, 6,155,
-205,134, 80, 40,132, 72, 36,130,135,135, 7,109,249,242,229, 38,195,134, 13, 51,153, 63,127,254, 33,181, 90,221,190, 17,215,168,
-157,141,141,205,190, 62,125,250,184,134,132,132, 8, 69, 34, 17,170, 94, 12,164, 82,169, 99, 90, 90, 90,151,181,107,215, 6, 70,
- 69, 69,165,230,231,231,207, 1,240,162,137, 3,167,125,235,214,173, 3, 70,142, 28,201,200,201,201, 65,104,104,104,128, 92, 46,
-111,223, 4,113,249,143, 66,212,179, 39,152,253,217, 66,133,189,147,147,209,245,107, 7, 71,159,249,165,229, 51,161,113, 69, 66,
-106, 73, 25, 52,129,163, 18, 59, 13, 28, 52,195,104,232, 71, 35, 21,251,191,223,197,111,140,208, 98,177,141, 44,143, 31,219,158,
-126,239,126, 84,219, 27, 17, 79, 6,143, 30, 62,156, 24, 25, 9, 93, 1,224,171, 69, 95,176,194, 46, 92, 56, 60,160,127,231,236,
-158, 61, 58,166, 79,156,180,216,185, 9,213,109,217,178,101,203, 59,209,209,209,182, 28, 14, 7,197,197,197,150,251,247,239,223,
-222,163, 71, 15,122, 74, 74, 10, 18, 18, 18,240,246,237, 91, 72,165, 82, 12, 24, 48,128, 47, 22,139,127, 0, 80,167,208,210,208,
-251,110,176,111,166,221,109,105,204,107,174,209,203,108,136, 54,167,245,141, 75, 55,124, 78,132,150,249,218,218,121,121,124, 50,
- 45, 8,235,214,159,101,253,124,124,243,218,155, 17, 39, 0,122,243,186, 51, 2, 16,116, 91,185,106, 5,100,114, 21, 38, 77,152,
-133,201, 19,102, 89, 18,168,237,136,190,156,167, 46, 43, 17,154, 26,189, 10,223,123, 96,251, 40, 0,142, 53,196,214, 77, 74,108,
-213,141,117, 76,102,231,128,239,190,179,110, 59,115, 38,231, 69, 72,136,178, 48, 50,178,204,125,232,208, 18,223, 79, 63, 85, 1,
-128,252,237, 91,163,196,160, 32, 19,107,127,127,227,174, 75,150,152,235,213,106,209,186,117,235,252,214, 86, 36, 47,111, 18,167,
-243,216,177,250,181,135, 15,119,138, 92,188,184, 55, 77,171,101, 12,238,218,245,249,166,208,208,172, 63,194,249,103,214, 51,251,
-238, 93, 85,177,171, 43,124, 71,142, 44,114,182,177, 81,253,153,109,255, 35,245,164, 80,141, 42, 95,173,217, 53,223, 80, 17, 30,
- 30,222, 11,192, 29, 0, 33, 1, 1, 1,193, 0, 32, 16, 8,242, 36, 18,137, 77, 88, 88, 88,131, 34,139,197, 98,193,206,206, 14,
- 30, 30, 30,249,249,249,249,182,245, 84, 32,195, 96, 48, 56, 18, 66,170,173, 47,117, 65,165, 82, 33, 41, 41, 9, 62, 62, 62,153,
-168, 72, 68, 91,167, 81,199,196,196, 36, 37, 33, 33,193, 42, 62, 62, 30, 81, 81, 81,112,117,117,133,185,185, 57, 88, 44, 22,180,
- 90, 45,100, 50, 25, 60, 61, 61,193,225,112,208,161, 67,135, 66,165, 82,233,218,192, 20, 16,135,199,227, 37,221,189,123,215,201,
-215,215, 23, 79,159, 62,133,147,147, 19, 68, 34, 17, 0,224,237,219,183,184,127,255, 62,134, 14, 29,138,232,232,104,140, 25, 51,
- 38, 67,169, 84,122, 0, 80,213, 69,104, 97, 97,145,115,235,214,173, 76,111,111,239,114,165, 82, 73,207,203,203, 99, 69, 70, 70,
-234,228,114, 57, 95, 42,149,178, 36, 18, 9, 75, 38,147, 49,149, 74, 37,139, 78,167, 27,149,149,149,177,110,222,188,201,208,104,
- 52,245, 6,200,172,186, 78, 23, 46, 92,128,183,183, 55,194,194,194,240,229,151, 95,226,193,131, 7,112,114,114,194,233,211,167,
-177,100,201, 18,188,126,253, 26, 86, 86, 86,104,221,186,117, 67,215, 8,110,110,110,201, 47, 95,190,116, 51, 50, 50,170,202,235,
- 88,149, 47, 15, 5, 5, 5,120,243,230, 13,178,178,178,224,238,238,142, 9, 19, 38,188,201,202,202,114,111,168,231, 57, 56, 56,
- 20,196,197,197, 89,249,248,248, 32, 47, 47, 15, 66,161, 16, 2,129, 0, 66,161,176,250,111, 87, 87, 87, 44, 94,188, 24, 34,145,
- 40,191,188,188,220,182, 33, 17, 79, 8, 2,211, 0, 0, 32, 0, 73, 68, 65, 84,228,237,237,125,237,230,205,155, 86,102,102,102,
-200,205,253,127,236, 93,119, 92, 20, 87,219, 61,179,189,209, 97,151, 38, 88,136,116,108, 65,141, 45,246, 10, 70, 99, 73, 51,209,
-196,110,140, 61, 70,163, 81, 99,138, 61,182,104,108,177, 98, 98, 98, 15, 86, 84,196,110, 20, 80,233, 32,210,148,133, 93,218, 46,
-108,223,217,153,239, 15, 89, 94, 36,192, 46, 70,243,189,241,221,243,251, 45,187, 59,220, 57,123,239,204,157, 59,103,158,251,220,
-231, 41,130, 82,169, 4,139,197,130, 80, 40,132,155,155, 91,141,144,207,204,204, 68, 68, 68, 68, 73,118,118,246,192, 38,136, 36,
-134,187,187,123,218,253,251,247,253,105,154, 70,126,126, 62,210,211,211, 49,109,218,180, 76,173, 86, 27,132, 87, 40,103, 95, 45,
-191, 43,206,216,143, 39,113,222, 30,214, 85,159,154, 28, 77,240,168,116,180, 15,115, 80, 0, 64, 98,146,210, 81,199, 8, 68,112,
-104, 36,125,236,196, 13,238,190,189, 59,216,160,224, 14, 2,233,169,153,248,166, 33,238, 1,189, 61, 39,204,154,245, 73, 88,175,
-238, 61, 25,149, 42,149,228,167,159,214,191,158,157,157, 42, 1, 0, 63,191, 96,217,212,169,179,227,237, 69, 34,217,229,107,113,
-212,134, 13,187,147,206,199, 74,119, 89, 81,101, 63,127,127,255,155, 39, 79,158,116,147, 72, 36,112,116,116,132, 74,165,130,193,
- 96, 64, 74, 74,138,246,208,161, 67, 70, 7, 7, 7,251,162,162, 34, 84, 84, 84,128, 32, 8,156, 60,121, 50, 31, 64,243,186, 68,
-102, 31, 45, 0,152, 54, 56,152, 29,210,199,223,153,195, 35, 5, 2,118,134, 39, 8, 19,143,160,237,220,207,156, 75,108,123, 38,
-230,207, 15,222, 30, 49, 87,220,163,231,219, 88,178,120,148,177,176, 48,191,131, 1, 61,210,234,243,209, 10,106,141, 62,195, 71,
-190, 61,122,249,242,101, 88,182,228,107, 68,159, 60,174,176, 19, 49,116, 14, 78,108,199, 55,223,232,166,157,243,233,176,130,170,
-170, 66,159,229,171, 15,189, 31, 49,108, 78,179,238, 61,134,227,218,213,227, 56,176,231,235,187,132,128,182, 77, 35,214,193, 50,
-192,217,201,207,111,242,140,204, 76,206,189,101,203,170,200,194,194,242,240,217,179, 75,234, 43,251, 56, 38, 70,196,245,242,114,
-112,126,235, 45,151,141,205,155,211, 70,153,108,123,125, 62, 70,245,113, 94,176,179,115,250,245,204,153,190, 52,155,221,115,254,
- 23, 95, 8, 34, 35, 35,161, 84, 42,113,228,200, 17,108,223,182, 77,231,233,233,249,192, 43, 41, 41, 33, 76,169, 92,108, 45,103,
-248,236,217, 37, 38,147,137, 24, 61,111, 94,255,228,156,156, 62, 69, 50, 89, 11, 0,240,116,113, 41, 8,247,243,187,187, 59, 58,
- 58,125,115,203,150,148,181,245,220,121,246,172,251,225,220,220, 9, 46, 46, 46,130, 98,153,140,197,227,114, 75,223, 8, 9,249,
-125,235,162, 69,151,201,251,247, 57,252,102,205, 28, 28, 35, 35,155,220,246,240,217,179, 75,202, 42, 43, 89, 51,190,253,182, 91,
- 94,113,113,139, 42,157,174,117, 69,101,165,135,201,104,100, 56, 8,133,165,173, 2, 3,101,154, 43, 87,164,173,212,234,153,187,
- 0,217,203, 58,215,245,105,145,127, 17,234,198,209, 58, 69,211,244, 51,185, 14, 47, 71, 70, 70,254,101,117, 13, 77,211, 86, 89,
-179,216,108,246, 51,211, 84,141,128, 67, 16, 4,226,227,227,225,234,234, 10, 15, 15, 15,240,120,207, 38, 31,148,203,229,184,126,
-253, 58, 82, 83, 83,209,174, 93, 59,243, 52, 70,195,138,136,199,155,181,122,245,106, 39,189, 94,143,187,119,239, 34, 60, 60, 28,
- 60, 30, 15, 28, 14,231, 25, 17, 40,147,201, 16, 26, 26,138,249,243,231, 59,126,255,253,247,179,116, 58, 93,131, 79,164, 44, 22,
-107,250,196,137, 19, 37,102, 11, 86, 65, 65, 1, 94,127,253,245,154,255,139,197, 98, 36, 38, 38, 34, 60, 60, 28,205,154, 53,195,
-168, 81,163, 36, 7, 14, 28,152, 78,146,228,218,134, 56,185, 92, 46,163, 77,155, 54, 29, 1, 64, 36, 18,129,193, 96,100, 56, 56,
- 56,136,221,221,221, 69, 14, 14, 14,127,105,227,158, 61,123, 42, 24, 12,134,209,162, 26, 96, 48, 80, 84, 84,132,176,176, 48, 40,
- 20, 79, 51,184,168, 84, 42,180,110,221, 26, 74,165,178, 70,180,122,121,121, 65,163,105,220,245,171,109,219,182,203,130,130,130,
- 6,136, 68, 34, 30,155,205,198,189,123,247,208,161, 67, 7, 28, 58,116, 8,190,190,190, 16, 10,133,200,204,204, 68,155, 54,109,
- 16, 23, 23, 7,177, 88,140,208,208, 80,158, 68, 34,185, 90, 86, 86, 22,155,151,151,183,172,145,122, 50,236,236,236, 16, 23, 23,
-135,221,187,119, 35, 39, 39, 7,133,133,133,176,183,183, 71,251,246,237, 17, 18, 18,130,174, 93,187, 34, 51, 51, 19,132,229,206,
-228,225,239,239, 31,253,231,159,127,186,209, 52,141, 3, 7, 14,160,170,170, 10,122,189, 30, 12, 6, 3,124, 62, 31,206,206,206,
-232,211,167, 15,196, 98, 49,252,253,253,241,219,111,191,185, 13, 30, 60,248,180, 76, 38,107, 15,160,200,210,113,117,118,118,158,
-185,116,233, 82, 31,137, 68,130,220,220, 92, 40, 20, 10,184,187,187,163, 87,175, 94,222, 23, 46, 92,152,105, 52, 26,215,191, 42,
- 55,178, 90,142,239,196,249,115, 63,143,240,111, 85,222,166, 93,160,208,231,104,180,187,207,161,104, 89, 40, 0,132, 5,187, 39,
-143,136, 20, 22,220, 75,142, 46, 56,127,238,248,221,212, 12, 28,133, 21, 83,219, 10,181,238,247,152, 11,183, 7,117,104,247, 58,
-181,122,213,188,136, 79,167, 77,224, 73,220,199,163, 56,255, 56, 46, 92,138,247,157, 55,119,162,120,237,186,157,103, 98, 46,220,
-102, 40,212,186,197,214,153,178,124, 55,239,221,218,213,173,178,228, 48,178,210,184, 16,216,135,193,207, 47, 0, 74,165, 18,124,
- 62,159,255,254,251,239,155, 22, 46, 92,168,118,112,112, 16, 18, 4,129,216,216, 88, 25,128,129,150,120,181, 18,103,218,100, 48,
-146, 52,151, 73,209,132,189,134, 48,149,113,147, 82, 30, 97, 64,191,222,197,221, 59,135,125,191,112,249,186, 47,253, 3, 58,136,
- 63,153,240, 53,251,219,101, 31,108, 3,129, 30,245,241,164,101,225, 18,241,251, 49, 1,128,136,229,223, 44, 67,118,118,166,243,
-164,113, 21, 95,179,120, 2,175,160,230,221,236,183,237,142, 29,212,186,117,203, 22,115,166,143, 58,245,195,143, 63, 68,212,182,
-108,237,221,179,244, 4,128,190,214, 28,219,255, 33,180,253, 48, 58, 26, 85,249,249,198,178,171, 87,181,125,127,252,177,196,103,
-224,192,245,122,131,193,205, 60, 84, 48, 8, 2,132,217,117,130,162, 8,214,252,249, 12,154,197,130,209,217,121, 28,202,203, 3,
- 44,113,206,149, 74, 71,124, 48, 97, 66,196,137,179,103,209,178,101,203,154,251,153,147,147, 19,230,205,155,135,217,179,103,243,
- 18, 19, 19, 59, 29, 62,124,184,211,218, 53,107,220, 1,140,176,166,158,231,111,221,114,158,178,124,249,162,118,225,225,190,251,
- 15, 30,228,189,246,218,107, 0,128,135, 15, 31,250,175, 90,185,178,121, 88,155, 54,197,223,207,154,181, 55,121,225,194, 80, 0,
- 87, 27,227, 44,186,114, 69,127, 56, 55,119,194,165,216, 88,167,176,176, 48, 0, 64,122,122,186,100,227,198,141, 19, 67, 71,141,
- 26,179,124,234,212,197,145, 90,109,133,131, 92,206,139,220,188,153,245,235,232,209, 22, 57,205,245, 4,128, 94,159,124, 50,171,
- 71,239,222, 33, 35, 38, 76,112,241,245,245, 37,236,236,236, 96, 48, 24, 80, 88, 88,232,156,156,156,252, 90,116,101,165,242,216,
-173, 91, 7, 96, 50,245,127,137,231,186, 94, 45,242, 47,179,100,253, 85, 83, 84,191,247,138,142,142,166, 1,244,138,140,140,140,
- 51,223,192, 77, 38,147, 85, 34,139,197, 98,129, 32, 8,107,197, 22,104,154, 70, 73, 73, 9, 74, 74, 74,106,166,142,100, 50, 25,
- 46, 93,186,132,204,204, 76,176,217,108,112, 56, 28, 24, 12,150,115,208,138, 68,162,126,253,250,245, 99,221,186,117, 11,126,126,
-126, 16, 8, 4, 53,245, 50,191, 56, 28, 14, 60, 61, 61,161, 84, 42,209,183,111, 95,246,166, 77,155,250, 53, 38,180, 28, 29, 29,
-135,188,243,206, 59, 92,243,247,170,170, 42, 48,153,204, 26,209, 82, 85, 85,133,178,178, 50, 84, 84, 84, 64,171,213,162, 75,151,
- 46,220,232,232,232, 33,165,165,165,107,173,105,191, 90,173,174,146,201,100, 78, 61,122,244,112,222,187,119,111,122,151, 46, 93,
- 2,159,233,105,151, 47,107,181, 90, 45,155,193, 96, 88,149, 71, 47, 42, 42,170,230,216, 63,121,242, 4,219,182,109,171,249, 95,
-102,102, 38, 54,109,218, 84,147, 10,160,177,115, 20, 20, 20, 52,248,192,129, 3,225,251,247,239, 47,103, 50,153, 72, 79, 79,199,
-193,131, 7, 65,211, 52,196, 98, 49,212,106, 53,138,139,139, 17, 27, 27, 11,146, 36, 97,103,103, 7,111,111,111,254,244,233,211,
-187,127,253,245,215,236,198,132,150,201,100, 50, 49,153, 76, 52,111,222, 28, 75,150, 44,129, 86,171, 5,135,243, 84, 95, 42,149,
- 74, 84, 84, 84, 32, 33, 33, 1,185,185,185,160, 45, 68,121,227,243,249,163,246,239,223, 47,225,114,185,208,104, 52,168,172,172,
- 68, 65, 65, 1,242,242,242,180, 50,153,140,180,183,183,103, 52,111,222,156,193,227,241,120,195,135, 15, 39,204,130, 51, 50, 50,
-210,245,192,129, 3,239,234,245,122, 75, 34, 73,236,225,225,241,229,196,137, 19,249,181,251,108, 81, 81, 17, 70,140, 24, 33,188,
-113,227,198, 66,165, 82,121, 16,128,252, 21,187,161,209,135,143, 5,220,185,123, 33,189,205,209,104,119,159,188,199,166,110,243,
- 62, 95,199, 2,128, 29,219, 87,116, 59, 26,253,228,122, 80,203,226,130,195,199, 2,238, 56, 59,167, 90, 18, 2,140, 62, 61, 61,
-135,138,132,252,119, 70,188,245, 22,253,211, 79,235, 95,255,116,218, 4, 94,243,128,121, 79, 45,156,108, 9,250,146,223, 16,106,
-205, 67,254, 79, 63,173,127,125,196, 91, 35, 19,114,114,114,183,247,233,201,251,237, 82,156,244,143,198, 44,134, 18, 87,190,183,
-144,167,130,183, 95, 8, 2,131, 69, 72,188,151,142, 35,191,223, 68,112,232, 27,208,233,116, 32, 73, 82, 52,116,232, 80,245,161,
- 67,135,180, 25, 25, 25,149, 26,141,166, 39,128, 12, 75,141,127,252, 56,133, 10,244,120,195,192, 17,240,200, 74, 5, 71,189, 96,
-241,225,209,175,119, 30, 16,238,236,233,205, 22,139,168, 63, 6,247,239,116,112,247,174, 37,179, 23, 47, 61,136,142,157, 6,116,
- 73, 77,191, 26, 2,224, 65,189,226, 53, 27,209,140, 35,199,200,236,172,172,136,188,220,220,199, 1,238, 30,250,135, 21,180,113,
-230,130,157,253,123,244, 28,213,246,181,224, 55,185,169, 41,113,196,146,249,239,254,178,124,245, 15,239,155,197,214,197,152, 95,
-122,142, 27,119,147,187,119,111,195,214,241,255, 53,112,120,188,102,118,205,155,179,114,246,238,213,248, 13, 29, 90, 14, 0,122,
-131,193, 45, 39, 55,215, 81, 40, 20,130,166,105, 24,141,198,103,124,136,205,126,195, 97,129,129,238,214,112,230,124,245, 85,219,
-249,243,231,163,168,168, 8, 36, 73,130,205,102,215, 29,179,161, 82,169, 48,110,220, 56,108, 94,179,230, 13,107, 56, 77, 38, 19,
- 49,101,249,242, 69, 95, 44, 90,244,218,228,201,147, 25,181,199, 94, 23, 23, 23, 28, 62,114,132,187,101,203,150,102, 95,110,222,
- 60,238, 3, 30, 47, 27, 58, 93,163,156, 37,173, 91,195,165,184, 88, 96, 22, 89, 0, 16, 24, 24,136,109,219,182,241,198,143, 31,
-207, 29, 58,116,232,186,196,118,237, 54,174,239,222, 61,203, 53, 32,192,129,203,227, 53,179,196,105, 62,158, 0, 80,169,213,134,
-173,223,184,209,249,246,237,219, 40, 46, 46, 70, 81,209,211,231, 81,130, 32,208,177, 99, 71,226,195, 15, 63,116,108,229,227,211,
- 9, 38,211,203, 60,221,127,209, 34,255, 34, 76,170,103,219,127,124,180,170, 27, 68, 84, 55,144,168,117,115,124, 70,176, 88, 18,
- 90,207,131,138,138, 10, 84, 84, 84, 96,215,174, 93,224,112, 56, 53, 55, 95, 0,208,235,245,214,136,150, 54, 94, 94, 94, 80, 40,
- 20, 8, 8, 8,120,198,146,197,225,112,192, 98,177,192,225,112,192,227,241,160,211,233,224,235,235, 11,181, 90,221,166, 49, 78,
-141, 70,211,222,197,197,165,230, 6,171,171,238,172, 58,157,174,166,190,122,189, 30,229,229,229,168,170,170, 66,101,101, 37, 84,
- 42, 85, 7,107,218, 75, 81, 20,146,146,146, 30, 6, 6, 6,182,103, 50,153,176,179,179, 19,169, 84,170, 26,223,162,178,178, 50,
-236,219,183, 79,245,209, 71, 31,185,157, 60,121,210,162,208, 34, 8, 2,159,125,246, 25,120, 60, 30,212,106, 53,126,250,233, 39,
-204,152, 49, 3, 28, 14, 7,149,149,149,216,182,109, 27,230,204,153, 3, 22,139, 5,189, 94,143,141, 27, 55, 54,200,149,146,146,
-146,115,235,214,173, 14,175,191,254,186,243,177, 99,199,228,253,251,247, 23, 15, 28, 56, 16, 2,129, 0, 26,141, 6, 70,163, 17,
-111,188,241, 6,130,130,130, 32,147,201,112,230,204,153, 18,127,127,127,183,219,183,111, 83, 69, 69, 69,121, 22,196, 53, 93,203,
- 98, 8,147,201,132,226,226, 98, 84, 84, 84, 64, 46,151,163,176,176, 16,143, 31, 63, 6,139,197,178, 24, 77,215,213,213,117,100,
- 88, 88, 24, 19, 0, 4, 2, 1,218,183,111,143, 69,139, 22,145, 26,141,230, 29, 0,103,170,139, 13,222,185,115,231,177,107,215,
-174,177,188,188,188,144,150,150, 6,177, 88,204,226,243,249, 22,133,150,135,135,199,158, 63,254,248,195,197, 44,174,205,199, 89,
-173,126,122, 58, 70,140, 24,225,178,127,255,254, 61, 36, 73, 14,121,213,110,106, 78, 2,112,218,135, 57, 40, 14, 69,203, 66,231,
-125,190,142, 21, 20,246,244,225,117,210,100,176,214,174,153, 27, 58,102,152,195, 41, 39,129,146, 99,137,103,112, 63,159, 45,111,
-189,213,159,241,254,123,145,153, 28,142,147,223,246, 29, 95, 75, 36,238,227,107,201, 48, 7,184,186, 57,192,175, 57,151, 56,124,
- 42, 85,178, 96,225, 55,186,168,253, 63,100,255,242,107,244, 32, 46, 59,102,192,153, 11, 5, 83, 27,226,206,120, 88,113, 82,173,
-227, 7, 43, 75,239, 19, 46,238,221,208,190, 93, 32, 36,226,114,236,220,115, 8, 45, 91,117,132, 78,167,131,131,131,131,208,100,
- 50, 25,152, 76,102,148, 53, 34, 11, 0, 46, 94,172,160, 66, 67, 43,244,204, 74,138,252,116,198,218,183,251, 15,126, 43,164, 79,
-159,126,212,249,152,243,134,110, 29, 12,210,193, 3,219, 23,159,141,217,146, 41, 45,124,228, 31,218,166, 59, 82,146, 99, 7,209,
- 52,146, 8,162,126,235, 83,114, 22,206,106,169,148,216, 67,135, 38, 81, 26, 42, 65,240,237,119, 15, 6, 71, 68,140, 13,123,179,
-199,155, 84,204,133, 75,122, 46, 74, 82, 29,186,119,125,242,233,132,193,199,126,142,218, 56,224,236,153, 61,173, 21,202,188,104,
-155,200,170,243,144, 70,146,238, 44, 30,143, 33,143,141, 37,219,140, 31,175, 51, 95,143, 66,161, 16, 39, 78,156, 0,151,203,173,
-121,113, 56,156,154,207,238,238,238, 32,170,151,145, 90,195, 9, 0, 82,169, 20, 69, 69, 69,112,116,116,132, 88, 44, 70, 81, 81,
- 17,110,220,184,129,140,140, 12,176,217,108, 12, 26, 52, 8,140, 6,124,155,235,114,142,158, 55,175,127,112,155, 54,190,117, 69,
- 22, 0, 24, 12, 6,148,149,149, 97,216,176, 97,140, 51,103,206,120,156,205,207,127, 11, 64, 84, 99,156, 29, 34, 34, 74,139, 15,
- 31,174,247,183, 95,127,253,117,226,250,245,235,188, 65, 3, 7,206,158,251,221,119, 91, 54,239,223, 95, 96, 34, 73,143,166,180,
-157,193, 96, 48, 8,130,128,143,143, 15,202,202,202, 80, 85,245,116, 6,219,206,206, 14,206,206,206, 48, 26,141,160,104,154,253,
- 50,207,117, 67, 90,228, 95,130, 29,181, 4,215,142,191, 88,180,170, 27, 5, 0,189,106,223, 88, 40,138,178, 74,100,177,217,108,
-139, 62, 87,214, 88,185,234,194, 26,161,101,174, 43,159,207,175,185,208,106, 11, 44,115, 61, 25, 12, 6,152, 76,166, 85, 33,241,
- 41,138, 98, 86, 86, 86,226,200,145, 35,232,217,179,103,205,180,148, 66,161, 64, 69, 69, 5, 20, 10, 5,180, 90, 45,114,114,114,
-112,241,226, 69,180,110,221, 26,128,117,193, 95,179,179,179,239,182,108,217, 50,220,124, 19,239,221,187,119,179,189,123,247, 22,
- 14, 25, 50,196,139,166,105, 44, 94,188,184,228,141, 55,222,112,171,125,147,183, 4, 38,147,137, 27, 55,110,160,117,235,214,160,
-105, 26, 28, 14, 7,233,233,233,144, 72, 36,160, 40, 10, 44, 22, 11,114,185, 28,246,246,141,199, 72, 76, 74, 74,250,248,147, 79,
- 62, 41,116,116,116,108, 91, 90, 90, 42,229,241,120, 61,174, 92,185,226, 99, 48, 24,224,224,224, 0, 7, 7, 7,156, 62,125, 26,
- 78, 78, 78,152, 53,107, 86,190, 70,163,185, 33, 18,137,220, 53, 26,205,253,162,162,162,197, 77, 57,223, 36, 73, 66,165, 82,161,
-188,188, 28,101,101,101, 80, 42,149,208,106,181, 22,235, 88, 31,122,244,232,129,232,232,104,230,138, 21, 43,126,206,206,206, 6,
- 0,248,249,249, 97,214,172, 89, 76,111,111,111,228,228,228,224,238,221,187, 48, 24, 12,160,105,186,209,139,151,197, 98,245,254,
-232,163,143,186,251,250,250, 18, 6,131, 1, 20, 69, 65,167,211,193,252, 57, 63, 63, 31,193,193,193,140,230,205,155,119,201,206,
-206,238, 13,235, 22, 86,216, 0,160, 56,255, 56,188,217, 18,128,225, 0, 90,115, 28,165, 37,207, 23,197, 69, 38,147,125, 55,255,
-171,235,227, 55,175, 54,184, 63,150, 2,129, 97,195,225, 31,210, 23, 31,127, 72, 98,197,154, 35,240,109, 30,136,188,188, 60,244,
-238,221,155, 83, 88, 88,248, 73, 85, 85,213, 60,107,185, 99, 98,110,153,206,159, 62, 51,106,244,187, 99,195,251,245, 27, 66,158,
- 59,119, 26, 73,247,207, 37,127,242,238, 72, 25, 77, 85, 17, 46, 78,130,132,244,180, 59,254,109,219,247,130,158, 52,245, 0,150,
-173, 6,150,209, 13, 95,239,208,159, 58,229,201, 56,117,124,207,135,239,143, 25,215,174,111,223, 1,198,115, 49,127,224,238,205,
-152,123,235, 86, 79,140, 91,177,241,183,222,253, 7,141, 12, 21,187,223, 56, 29, 22,160,155,224,227,234,248,112,231,222, 50, 91,
-103,169,239,218,228,243, 41, 84,143,139, 12,130, 0, 77,211,207,136,172,186, 66,139,193, 96, 88, 52, 0,212,230,172,125, 47, 50,
- 63, 80,111,223,190, 29, 60, 30, 15, 92, 46, 23,108, 54,219,162,251, 69,109,206,228,156,156, 62,251,162,162,120,245,137,172,210,
-210, 82,148,150,150,162,170,170, 10,239,189,247, 30,231,235, 59,119, 94, 71,181,235, 71, 67,156,190,158,158, 58,145, 64, 80,156,
-146,146,226, 21, 18, 18,242, 76,125,149, 74, 37, 4, 2, 1,162, 14, 30,228, 68, 70, 68, 76,235,123,250,244, 58, 88,136,127, 85,
- 95,219, 9,130,128, 68, 34,129,179,179, 51, 8,130, 0, 73,146, 40, 42, 42, 66,114,114, 50,238,220,185, 3, 38, 65,144, 47,243,
- 28,215,167, 69,254,133, 86,173, 29,245, 78, 29, 54, 52, 39,218, 20,161,197,100, 50,159,219,170,213, 16,172,153, 58, 20, 10,133,
- 15, 10, 11, 11,187,121,123,123,131, 36,201, 26,161, 85,119,234,208,108,253, 72, 76, 76,132, 80, 40,124,160,213,106, 27,229,164,
-105,186, 75,167, 78,157,112,244,232, 81,196,198,198,226,209,163, 71, 80,171,213,208,233,116,208,104, 52, 72, 78, 78, 6, 69, 81,
- 8, 11, 11,131, 72, 36,130, 80, 40,124,160,211, 53,254, 32,170, 82,169,164,108, 54, 59, 80, 32, 16,212,108,243,244,244, 68,105,
-105, 41,101, 52, 26,177,111,223, 62,165,135,135,135, 72, 32, 16, 88, 45, 92, 9,130,128, 76, 38, 67,179,102,205,106,124,180, 42,
- 43, 43, 33,145, 72,204,194, 2, 58,157, 14,246,246,246, 22,167, 14, 1,104,179,178,178,230,214,250,222,113,244,232,209,191, 28,
- 58,116,168,213,133, 11, 23,112,251,246,109,136,197, 98,124,255,253,247,143,114,115,115,223, 7,112, 71, 38,123,177,126,145,214,
-244,161,210,210,210, 35, 15, 30, 60,232,210,169, 83,167,154, 81,162,119,239,222, 68,239,222,189,221,106,155,250,229,114, 57,254,
-252,243, 79, 92,184,112, 1, 4, 65, 32, 51, 51,211,164,209,104,126,105,108,150,194,219,219,123,239,162, 69,139,236, 72,146,172,
-233,219, 2,129, 0,124, 62, 31, 28, 14, 7, 76, 38, 19,185,185,185, 24, 54,108,152,227,143, 63,254,184, 71,167,211,189, 6,192,
-128, 87, 4, 21, 26, 24, 18,147,148,142, 97,193,238,201, 59,182,175,232, 54,105, 50,204, 83,135,100, 88,176, 36, 57, 49,169,216,
- 49, 92, 98,185,189,103, 46, 20,124,170, 55,158, 25,122,230,236,229,119, 62,159, 61,139,237,231, 23, 44,187,112, 41,222,183, 47,
-249, 13,225,234,230,128,210, 18, 37,114,243,139,145,157,167,167,253,252,130,101,119,255,124,192, 91,179,126,131,191, 74,173, 53,
- 79, 29, 54,218, 79,175,222,120, 52,124,221, 38, 94,220,216, 79, 58,114, 5, 2, 47,148,149, 60,128,175,175, 24,195, 34,219, 98,
-247,254, 27,112,116,116,129,187,187, 59, 24, 12,134,200,218,182,151,148,148, 16, 71,126,189, 58,254,163,113, 19,223, 24, 56, 32,
-130, 60,123,238, 20, 43,246,252,201, 27,123,118,124,121,140,102,170,132, 4, 93, 41,104,209,210,227,254,195,172,196,247,251,244,
-123, 15, 2,142,125,107, 32,168,222, 14, 91,179,192,128, 70,254,209, 67,203,248, 31,141,155,212,117,224,192,183,200,115,231,142,
-227,220,233,253,183,150, 46,109,113,250,209,147,131,156,155,119, 30,243,135,143,154, 90, 30,125, 38, 85, 63,114,104,203, 12, 47,
- 81,123, 13,240,200,166,170,106, 63, 72,178, 88,197,164, 78,231,211,108,224, 64,166, 58, 47,143,109,231,238, 78, 2,128,209,104,
-180, 40,180,208,192, 20,116, 93, 78,107,235,162, 86,171, 65, 53, 16, 59,177, 46,103,145, 76,214,162,250, 33,188, 6, 70,163,177,
- 70,100,149,150,150,162,162,162, 2, 34,145, 8,114,157,206,221, 26,206, 1,157, 59,239,251,122,217,178,121,135,143, 28,225,212,
- 22, 89,230, 23,155,205,198,170,213,171, 57, 51, 62,255,124,234, 52, 22,107, 38, 72,210,234,227,105,126,104,103, 50,153, 96,177,
- 88,200,203,203, 67,126,126, 62,242,242,242,144,151,151, 7,129, 64, 0,250, 37, 47, 2,250, 23,251,103,153, 69, 86,237,247, 26,
- 43, 87,163,225, 29,154,226, 12,111,173, 48, 48, 53, 97,126,215, 26,161,165, 82,169, 46, 92,188,120,177,243,240,225,195, 89,183,
-110,221,130,135,135, 71,141,208, 50,191,155,167,163,132, 66, 33,142, 29, 59,102, 80,169, 84, 23, 44, 92, 76, 23, 79,159, 62, 29,
-190,100,201, 18,246,199, 31,127,140,148,148, 20, 76,158, 60, 25, 21, 21, 21, 80, 42,149, 40, 45, 45,133, 90,173, 70,231,206,157,
-193,231,243,113,255,254,125,163, 90,173,190,104,193, 98, 71,203,100,178, 42,177, 88,236, 89,247,127,163, 70,141,114,223,186,117,
-171, 58, 45, 45,205,216,173, 91, 55, 7,107, 5,135, 25,191,254,250,107,141,165, 46, 35, 35, 3, 91,183,110,173,241,201,138,143,
-143,199,218,181,107,107, 98,159, 53, 17,119, 74, 74, 74, 72,163,209,136,214,173, 91,195,219,219, 27, 90,173, 22, 27, 54,108, 32,
- 1,220,249,255,234,205, 90,173,246,240,216,177, 99,191, 72, 72, 72,240,100,177, 88, 79, 77,218,213,237, 51, 24, 12,200,202,202,
- 66,114,114, 50,210,210,210, 80, 86, 86, 86,243, 32,144,152,152, 88,110, 52, 26,127,107,136, 87, 44, 22, 47,222,189,123,183,135,
- 80, 40,124,166, 63,155,173,161,102, 43,169, 92, 46,135,147,147, 19,250,246,237, 43,185,120,241,226, 98,157, 78,183,228, 21,185,
-167, 17,163,222,206,232, 56,227,211,225, 24, 17, 41, 44, 56, 26,253,228,250,218, 53,115,171,157,225, 37,201, 35, 34,189, 11,238,
-165, 59, 97,212,219,199, 59, 2,120,140,198, 29,182,169, 75,113,210, 19,157, 58, 57,199, 30, 61,121,114,207,194,249,179,227,231,
-205,157, 40, 86,107, 30,242,253,154,115, 9, 0,200,206,211,211,247, 83, 40,237,218,117,179,227, 87,172,254,145, 81, 92, 90, 49,
-249,207, 63, 27, 14,111, 80, 91,188, 48, 24,224,251, 5,245, 44,244, 15,232,222,242,214,141, 40,216, 9, 53, 8, 12,234,136,129,
- 3,186, 32,246,114, 34,138,228, 90, 72,165, 82,232,116,186, 70,195, 37,164,221, 63,246, 33, 77,208,190, 4, 77,228, 19, 12,154,
-255,225,216, 9, 61, 34, 34,222,162,163,163, 79,146,199,143, 69, 93,251,237,192,166,195, 12, 14,155,165,209, 59,234, 9, 66,171,
- 0, 35, 41,165, 74,245,244,129,134,205,227, 52,108,126,173, 14,236, 26, 18, 26,228,241,225,216,201,142, 67, 6, 15,163, 79,159,
- 62, 78,253,118,104, 95,236,111,187,218, 68, 81, 12, 37, 71, 90,160,230, 41,148, 70, 5, 77,112,157,170,148,148,186, 56,251, 53,
-173, 87,196, 40, 3,112,216,166,174,106,223, 7,116,186,199, 85, 5, 5,158, 46, 61,123,242,178,150, 45, 19,186,119,238,172, 37,
-170,125,136, 27, 19, 90, 76, 38, 19, 96, 48, 40,107, 56,173,173,139, 70,163, 1, 5, 24,159,135,147, 36,201,103, 68,150, 89,104,
-153,175, 23,107, 56,119, 44, 93,122,203,119,224,192,178,203,151, 47,187,247,234,213,139,168,172,172, 68,101,101,229, 51, 98,203,
-203,203,139, 8, 9, 11, 19,254, 26, 27,235,103,237,241,180,166,237, 12, 6,227,165, 11,173,127, 57,118, 52,104, 61,108,108, 47,
-179, 69,203, 26,161,101,165, 69,203,104, 52, 26, 33,145, 72, 80, 82, 82,210,224,141,159,193, 96, 64, 32, 16,152,231,136, 27, 93,
-121,167,211,233, 54,204,155, 55,111,250,224,193,131,221, 2, 3, 3, 33,151,203,225,238,238, 14, 62,159, 95,227, 59,102,230,139,
-143,143,199,238,221,187,149, 58,157,110,131, 5,206,245,171, 87,175,254,116,196,136, 17, 46, 30, 30, 30,112,118,118,198,253,251,
-247,225,236,236, 12,165, 82,137,244,244,116,216,219,219,215,248,237,156, 60,121,178, 82,167,211,173,183, 32,222,232, 43, 87,174,
- 24,236,237,237,239,203,229,114,102, 89, 89, 25,171,188,188,156,165, 84, 42,217, 10,133,130,125,246,236, 89, 55, 71, 71, 71,245,
-165, 75,151,228,190,190,190,204, 71,143, 30, 49,141, 70,163, 69,245, 74, 16, 4,102,206,156, 9, 14,135, 3,157, 78,135, 13, 27,
- 54, 96,222,188,121, 53, 62, 89,171, 87,175,198,162, 69,139,106,132,243,206,157, 59,155,212,115,104,154,134,193, 96,128,209,104,
-132,209,104,180, 74,252,254, 29, 88, 41,216,139, 50, 51, 51, 35, 59,117,234,116,254,247,223,127,119,173,142, 73,134,226,226, 98,
- 20, 23, 23, 67, 46,151,163,170,170, 10, 36, 73,194,219,219, 27,197,197,197, 56,126,252,184,162,178,178,114, 32, 26, 89,113,200,
-100, 50,199,246,232,209,131, 85,183, 14,230,167, 60,179,120,231,241,120, 40, 44, 44, 68,239,222,189,185,151, 47, 95, 30, 11,224,
- 95, 45,180,106,135,119, 24, 48,112, 60, 39, 56,180,171,254, 94,114,116, 65, 80,203,226,130, 49,195, 28, 78, 1, 64, 98, 82,177,
-227,189,116, 39, 4,135, 70,210, 3, 6, 58,135, 23, 23,237,104, 3,192,208, 88,186, 30, 0,112, 20,242, 70,247,239,215,185,208,
- 94, 36, 98,172, 93,183,243,204, 79, 63,173,127,253,240,169,255,132,119, 88,187,238,105,120,135,254,253, 58, 83,105,169,105,163,
- 1,236,178, 86,188, 68, 70, 14, 77,216,189,119, 55,210,146, 47,121,125, 49,179, 45,183,172,216, 8,129,157, 15,194,219,187, 99,
-199,222, 7,184,119,239, 94,145, 94,175,239,221,104,255, 38,104,223,228,148,164,128, 54,161, 33, 30, 31,142,157,228, 16, 25, 57,
- 12,209,209, 39,112, 96,223,174, 43, 35,223, 27,241,243,147,114, 37, 83,194, 22,114,132, 52,197,101,114, 28, 89, 28,158, 64,166,
-215, 63, 93, 3,193,102,243, 29,128,209,141,222,120,166, 76, 26,227,216,167,223, 48,156, 58,125, 2, 7,246,237,136,251, 42,116,
-212,174,150, 29,130,137,206,175,175,153,218,178, 85,203,230,170,170, 98, 37,131,224, 26,180, 90,202,126,205,190,220, 31,178, 23,
-141,205, 6,176, 14,182, 85,135,181,113,255,192,144, 33,157,102, 60,124,200, 17,119,239, 46, 40,140,141, 21, 86,103, 34,105, 84,
-104,177, 88, 44,208, 13, 79,117, 61,195, 73,236,223,207, 0,208,232, 34, 44, 14,135, 3,181, 90, 13, 99,195, 22,236,103, 56, 61,
-207,157, 43,120,248,240,161,191,139,139,203, 51, 34,171,172,172,172,230,179, 86,171,133, 90,173,134, 64, 32, 72,214,212, 63, 35,
-242, 12,103,241,149, 43,218,149, 51,103, 46,121,255,189,247, 54, 93,184,120,145,239,234,234, 10,133, 66,241,140,208,210,235,245,
-232,211,183, 47,103,117, 66,194,135, 80, 42,151, 90,115, 60,221,123,247,182,232, 15,204,100, 50, 65,189,228,169,195, 87, 0,147,
-234, 19, 94, 12, 75, 83, 56,214,174, 58,108,224, 6, 89, 55,187,247,162,240,240,112,109, 70, 70, 6,124,125,125,107,196, 74,237,
-223,116,112,112,128,147,147, 19,226,227,227,241,221,119,223,105, 0, 44,178,192, 89,169, 86,171,223,237,223,191,191,134,197, 98,
- 33, 40, 40,168, 38,126, 22, 69, 81,224,114,185, 16,137, 68, 72, 72, 72,192,208,161, 67,213,106,181,250, 93,252, 53,134, 86, 93,
- 78,133, 90,173,254, 96,192,128, 1,234,148,148, 20,244,232,209, 3,247,238,221, 67, 85, 85, 21,170,170,170,144,147,147,131,144,
-144, 16,168,213,106,108,221,186, 85,163, 86,171, 63, 0,160,104,140,179,178,178,114,232,188,121,243,152,191,252,242, 75, 75,111,
-111,239,208,142, 29, 59, 6,246,237,219,247,181,183,223,126,187,249,144, 33, 67, 60,253,253,253,181, 3, 7, 14, 20, 15, 30, 60,
- 88,172, 86,171,217,215,175, 95,151, 26,141,198,193, 22,234, 89, 35, 78, 50, 50, 50,106,166, 10, 89, 44, 22, 74, 74, 74,106, 34,
-247,155, 7,165, 6,132,112, 63, 75, 98,219, 44,176,204,130,203, 10, 63,183,250, 56, 45,238,196,229,114,205, 22, 79,218, 10,206,
-196,212,212,212,254, 61,123,246, 76, 28, 63,126,124,101, 81, 81, 17,236,237,237,225,231,231,135,128,128, 0,184,185,185,193, 96,
- 48,224,216,177, 99,170,227,199,143, 63, 80, 40, 20,189,241,215, 24, 90,253,234, 28,199,156,250, 6, 89,179, 53,203, 44,180,248,
-124, 62,188,189,189,205,199, 54,167, 41,199,243, 57,241,114, 57,171, 5, 76,223, 62, 3, 91, 13,137, 24,238,120,236,196, 13,238,
-166, 45,199, 31,132,247,195, 78,215, 22,202,147,174, 45,148, 39,195,251, 97,231,166, 45,199, 31, 28, 59,113,131, 59, 36, 98,184,
- 99,223, 62, 3, 91,165, 36,167, 5,214,206,123, 88, 95, 61,249,124,126,215, 30,221,195,203, 47, 95,139,163, 86,172,254,145,209,
-167,247,200,132, 93, 63, 31, 59,182,235,231, 99,199,250,244, 30,153,176, 98,245,143,140,203,215,226,168, 30,221,195,203,249,124,
-126, 87,107,218, 62,101,210, 24,199,136, 33,195, 16, 29,125,140, 60,252,235,214,213,135,142,100,246,156, 48,253, 74,113, 70,198,
- 61, 90,246,248, 28,216,140, 60,164,166,166, 42,170, 69, 86,134, 53,156,147, 39,142,169, 45,178,174,186,122,244,216,153,154, 10,
- 83, 76,204, 31,198,139, 23, 19, 52, 87, 19,101,138,187, 41, 37,101,133,242,178, 71, 74,101,169,158,162, 76, 48,153, 76,204,175,
-191,174,113,216,173,247, 28,117,235,214, 11,151, 46, 28,196,190,189,219, 21, 20, 5,237,232,195,135, 77,163, 71, 47,163,155,183,
-104,209, 60,234,215,131, 68,228, 91,195, 29,105,128, 26, 58, 98,152,211, 47,135,126, 33, 90,181,110,213,194,207,175, 38,164,205,
-191,175, 47,189, 4,206,101, 64,185, 50, 47, 47, 46,254,199, 31,117,238,239,190,235,194,117,119,119,128,201, 68,152,199,247,134,
- 94, 44, 22,171,174, 5,166, 65, 78,111, 55,183, 39, 39, 79,158, 68, 64, 64, 0,188,189,189, 81,219, 71,214, 28,144,219,213,213,
- 21, 71,142, 28, 1,253,108,112,234, 6, 57, 59,180,108, 25,191,106,229, 74, 61, 69, 81, 40, 47, 47,255,139, 53,171,188,188, 28,
- 20, 69,225,244,169, 83,122,229,211, 76, 32, 86,181,189, 55,147, 89,245,254,155,111,174,136,136,136, 48, 60,124,248, 16, 20, 69,
-161,182,101, 75, 38,147,193,206,206, 14, 90,157,206, 7,128,208, 26, 78,217,217,179, 34, 88, 24,215,235,177,104,189,140,243,254,
-111, 23, 89,181, 19, 74, 79,178,202,162, 69,146, 36,124,124,124,158, 73,233,194, 96, 48,158,121, 53,113,197,225,254,148,148,148,
-115, 3, 7, 14, 92,242,198, 27,111, 76, 89,178,100, 9, 51, 48, 48, 16, 10,133, 2,206,206,206,144, 72, 36, 72, 79, 79,199,201,
-147, 39, 77, 37, 37, 37,219, 0, 44,135,117, 75,232, 99, 51, 51, 51, 35,219,182,109,123,104,193,130, 5,142, 3, 6, 12, 96,251,
-248,248,128,166,105, 36, 36, 36,224,232,209,163,134, 93,187,118, 41,171, 69,150,181,206,203,231, 11, 11, 11, 71, 14, 30, 60, 56,
-106,236,216,177,246, 38,147,137,157,147,147, 3,157, 78, 7,163,209,136,252,252,124, 67,116,116,116,149, 90,173, 30, 3,224,188,
- 21,124,241, 21, 21, 21, 33, 49, 49, 49, 99,175, 95,191,254,221,248,241,227, 93,251,246,237,203, 33, 73, 18,215,174, 93,147,119,
-232,208, 65, 34,147,201, 12, 71,142, 28, 41,213,106,181,139, 76, 38,147, 85, 41,120, 8,130,128, 82,169,132,155,155, 27,116, 58,
- 29, 40,138,130, 94,175,135,157,157, 93, 77,218, 36,154,166,209, 20,231,250, 58,125,128,105, 48, 24,240,222,123,239,129,162, 40,
-108,216,176, 1, 36, 73, 54,153,204,209,209,241,110, 98, 98, 98,100,251,246,237,107,196,139,185, 15,241,120, 60,184,185,185,193,
-213,213, 21,209,209,209, 96,179,217,119, 45,249,187, 85,227, 94, 73, 73, 73,135,152,152,152,174, 15, 30, 60,248, 8, 64,123,131,
-193,224,109, 50,153, 8, 6,131, 33,165,105,250,190, 82,169,252, 25, 86,166,224,145,201,100,223,141, 27, 55,174,195,193,131, 7,
-237, 88,172,255, 92, 26, 44, 22, 11, 60, 30, 15,230,224,152, 52, 77, 67,175,215, 99,241,226,197, 74,149, 74,245,221,171, 50, 74,
-132,119,236,140, 29, 91, 55,218, 93,188,116, 78,158,154,137,163,245,132,112,120, 92, 92,180,163, 77, 97, 65,129, 93,120,199,206,
- 86,113, 26,245,134,210, 15,198,204,241,173, 78,193,179, 56, 39, 39,119,123,212,254, 31,178, 1, 96,205,250, 13,254,197,165, 21,
-147,211, 82,211, 70,111,223,254,107, 87,163,222, 80,106, 13,231,127,196, 75,148, 2, 52,180, 0,110, 39, 60, 40,110, 57,244,221,
-179,139, 90,183,114,120, 75, 86,170,121, 82, 85,165,254, 12, 64,182,181,109,239,222,173, 39, 46,157,255, 5, 7,246, 69, 41,105,
-138,169,117,115,115,163, 1, 32, 53,213,141, 78, 77,173,160,255,227, 87,236,164, 98,211,247,150,207,249,172,239, 28,133,178,108,
-253,134,173,141, 79,165,180,109,247, 6,218,182,123, 3,211, 63,251,210, 49, 36, 52,200, 23, 0, 14, 31,134, 41,180,117,202, 31,
- 75,190, 90,246,214,242,229,203,160,172,212,193,156,174, 39, 61, 41,229, 84,118, 54,244,182,123,214,179, 88, 66,146,183, 49,103,
-142,191,186,172, 76,220,253,139, 47,220, 88,159,127,206,104,204, 25,190,246,245,107, 13,231,157,251,247, 79, 77,158, 48,225,201,
-210, 37, 75, 6,110,219,190, 93,208,166, 77, 27, 20, 21, 21, 33, 40, 40, 8,222,222,222,136,137,137,193,145,223,126, 83, 85, 84,
- 86, 46, 2,240,147, 53,156,251, 79,159, 78, 15, 12, 13, 45,217,190,125,187, 87, 68, 68, 4,161, 82,169,160, 80, 40,160, 80, 40,
-160,211,233, 80, 29, 16,154,206,200,204, 76, 53, 26,141,219,172,109,187, 73, 46,231, 47,239,220,249, 49,135,162, 86,141, 28, 49,
- 98,222,242,111,190,225,181,106,213,138,208,233,116, 53, 86, 45,131,193, 0, 59, 59, 59,131, 94,175,119, 5,160,182,134,147,183,
-107, 23, 41,151,203, 33, 22,139,107,194, 53,213,142, 75, 88, 89, 89, 9,154,166,109,193,116,159, 3, 13, 42, 36,103,103,231,187,
- 44, 22,171, 89,109,235, 86,125,185,243,106,111, 51, 26,141,143, 75, 74, 74,194,235, 40,222,134,252,161,252, 0,124,223,167, 79,
-159,145,115,231,206, 37, 46, 95,190,140,227,199,143,211,217,217,217,135,171,173, 88,217,141, 60,233, 52,196,105,207,227,241,102,
-137, 68,162,126,230, 16, 14, 66,161,240,129, 74,165,186, 80, 61, 93, 88,249, 28,156, 14, 60, 30,111,166, 72, 36,234, 95,157,126,
- 5,246,246,246,137, 42,149, 42, 70,167,211,109, 68,195,137,170, 27,227, 20, 56, 58, 58,126,231,230,230,246,193,231,159,127,238,
-122,229,202, 21,233,165, 75,151, 56, 21, 21, 21, 7,245,122,125, 99, 73,165,255,194,233,226,226,114,151,201,100, 54,123, 73,231,
- 8,109,219,182,141, 30, 58,116,104,196,152, 49, 99, 96, 52, 26,241,211, 79, 63, 33, 38, 38,230, 84, 86, 86, 86,164,133,167,209,
-186,156,110,205,154, 53,187, 60,101,202,148,230,239,189,247,158,208,217,217, 25, 44, 22, 11, 42,149, 10, 89, 89, 89, 72, 72, 72,
-160, 79,156, 56, 81, 21, 31, 31,255, 88,173, 86,247, 2, 80,210,132,227,249,119,158,154,159,225,100,177, 88, 61,125,124,124,126,
- 93,186,116,169,125,255,254,253, 5,174,174,174, 96, 50,153, 48, 26,141,144, 74,165, 72, 74, 74,194,185,115,231, 84,135, 15, 31,
- 86,149,150,150,190, 7, 32,238,255,163,158, 47,146, 51,216, 31, 95,213, 73, 20,221, 96,180,119, 11,101, 45,214,179, 79, 79,207,
- 97,163, 71, 14, 30, 4, 0,191, 31, 57,115,214,138,164,210, 13,214,211, 82, 93, 57, 2,187,231, 0, 0, 32, 0, 73, 68, 65, 84,
-173,225, 12,106,205, 88,154,156,146,244, 76, 64,203,208,144,176,140,224, 54, 35,190,181,134,168, 86,100,248,103,218, 94,107, 58,
-182,182, 77,247,153,105,214, 96, 63, 68, 14, 27,253,118,196,151,139, 22,226,251,239, 86,224,196,239,199, 78,165,102, 63,147, 38,
-232, 95,215,151, 94, 50, 39,241, 45,139,245,134,208,211,243,205, 13, 20,181,240, 94, 82,146, 93,237, 7, 54,179,229,185,246, 67,
-165,151,151,151, 76, 42,149,186, 91,195, 25,185,121,179, 65, 45, 18,241, 22,174, 90,213,179, 74,171,237,185,124,249,114,214,157,
- 59,119,176,245,199, 31, 73,237,227,199, 81,114, 96,102, 3,179, 33, 13,114, 54,159, 57,147, 63,127,235,214,143,253, 90,183,150,
-124,244,209, 71,108, 54,155, 13,149, 74,133,130,130, 2,156, 63,119, 78,159,146,154,154,162, 84, 42,223, 2, 80,104, 45,103,228,
-230,205, 6, 39, 63, 63, 8,197, 98,250, 98,108,172,227,228, 89,179,166,180,104,217,210,113,224,160, 65,108, 7, 7, 7,148,151,
-151, 35, 39, 39, 7,199,142, 29,147, 85, 85, 85,121, 1, 48, 89,195, 25,117,253,122,219,211,113,113,163,190,253,246, 91,110, 88,
- 88, 24, 28, 29, 29, 81, 89, 89,137,164,164, 36,196,197,197,233,182,109,219,166, 80, 40, 20, 83, 76, 38,211,201,151,120,222, 95,
- 5,171,150, 25, 59,204,179, 63, 47,219,195,223,154, 19, 17, 14,224,171,234,207,223,192,114,206,192, 87,105,240,241,117,113,113,
-217,161,213,106,105,141, 70, 51, 25, 64,254,127, 97, 61, 89,225,225,225, 91,101, 50, 89, 87,154,166,225,232,232,120, 35, 57, 57,
-121, 26, 26, 88,121, 99,129,147, 9,160,171,157,157, 93,103,123,123,251,158, 58,157, 46,184,122,250, 45, 85,165, 82,197, 25, 12,
-134,219,213,214, 39,211,255,115,219,153, 0,250,123,121,121, 77,160, 40,170, 53, 65, 16, 78, 38,147, 9, 70,163,177,130,162,168,
- 44,133, 66,177, 11, 64,204,127, 65, 61, 95, 8,103,200,107,120,155,102, 32,184, 33, 65,240,140,208,170, 35, 32, 8, 10,169, 41,
- 15,113,172, 9,245,100, 12,238,231,179, 5,120,186, 50, 17,150,157,107,255, 35,180,172, 16, 47, 77, 22,153,175, 49,199,209, 4,
-253, 12, 39, 65, 19,249, 65,109,223, 62,240,119,132,150,181, 8, 9, 64, 79,208,232, 74,209,184,157,150,133, 75,175,240, 88,247,
-194, 56,191, 7, 92,126,116,118,190,193, 96,177, 60, 0, 48,170,173, 47, 20, 69, 16, 38,154, 32,200,218,211, 91,117, 30, 44, 27,
-229, 52, 0,109,216, 60,158,143,137, 36,221,139, 0,187,211, 38,211,235, 90,154,174,106, 6,124,149, 8,164, 63, 79, 61, 13, 64,
- 27, 38,143,231,123,154,166,135,201, 69,162,182, 50,141, 70, 12,128,182, 19,137, 82,149, 42,213, 62,173, 86,187, 5,127,157,185,
-176,200,201,225,241,154,153, 72,210, 29, 0, 24, 44,150,236,144, 78,231,243,216,193,225, 35,173, 78,215,220,206,206,206,168,215,
-235,149, 90,173,118, 12, 73,146, 23,155,210,246, 44,146, 12,185,206, 96,244, 48,136, 68,174, 6,130, 16,233, 73,210,160, 55, 24,
- 10,180, 90,237, 3, 0, 63, 0,120,248,146,207,251, 43, 5,107,194, 73,189,168,139,197,198,105,227,180,113,218, 56,109,156, 54,
- 78, 27,231,203,231, 20, 2,240,173,126, 88,252, 55,182,253,149,178,110,153, 87,255,179,108,199,194, 6, 27,108,176,193, 6, 27,
- 94, 9,168, 81,143, 79,150, 13,255,191, 32, 26, 81,165, 77, 49, 9, 62,143,178,189, 96,227,180,113,218, 56,109,156, 54, 78, 27,
-167,141,243,127,142,211, 18,247,191,113, 74,242, 47,185, 14,105,154,222,241, 79,252,176,205,252,107,227,180,113,218, 56,109,156,
- 54, 78, 27,167,141,243,127, 14,230,169, 67,134,237, 80, 52, 8,247,234,215,139, 46,107,195,171,221, 23,254, 9,120, 87,191,154,
- 82,222,211,118, 26,109,176,193, 6, 27,254,121,252,127, 8, 45,107,111, 90,127,231,230,246,119,111,140, 43, 8, 2,133, 4,129,
- 66, 0, 43, 94, 96, 89, 75,240,114,115,115,155, 17, 18, 18, 18,229,238,238, 62, 29,128,164,137,251,251, 11,133,194,141, 34,145,
-232,178, 72, 36,186, 44, 20, 10, 55, 2,240,127, 65,231,141, 0, 48,153,199,227,197,122,122,122, 62,225,114,185,177, 0,166,224,
-249, 87,174, 6,226,105,156,180,111, 0,180,109,202,142,146,208, 97,191,137, 67,135,221, 23,135, 14, 75,114, 13, 27,234, 47, 14,
- 29,150, 36, 14, 29,118, 95, 18, 58,236,183,151,208, 95,255,214,249, 37,136,167,175,166, 28,100, 11,229, 87, 16, 4,242, 9, 2,
-249, 86,214,231, 7, 2, 40, 32, 8, 60,126, 1,253,211, 6, 27,108,176,193,134,151, 9, 47, 47,175,145,158,158,158, 23, 60, 61,
- 61, 99,188,188,188, 70, 90,177, 75,191,122,110, 18, 38,130,128,201,194,160,223, 88, 57, 75,230,202,218,251,174,181,178,105,181,
- 57,221, 9, 2, 38,186, 26, 4, 1, 74, 34,145,108,242,244,244, 92, 81,247, 37,145, 72, 54, 17, 4,168, 90,101, 77,181, 4, 94,
- 83,205,170,238, 31,126,248,225,239,229,229,229,209,122,189, 62, 58, 51, 51, 51,186, 87,175, 94,135,234, 88, 34, 26,228,228,243,
-249,239,119,234,220, 53, 62,238,218,237,204,140,172,220,194,148,244, 71,185,127,156,189,120, 39,172, 77,219, 63,249,124,254,251,
- 77, 56, 71, 4,128,201, 44, 22, 43,214,206,206,238, 49,139,197,138, 5, 48,149,201,100,158, 92,185,114,101,110,114,114,114,241,
-245,235,215, 43,226,226,226,158,140, 31, 63, 62,139, 32,136, 63,234, 17,236,253,172,176,192, 44,201,203,203, 59, 43,149, 74,207,
- 9, 4,130,239,172, 40, 95,195, 41, 14, 29,118, 95,166, 48,208, 50,133,129, 22,135, 14,163,107,125,190,223,196, 99,110,233, 28,
-253,165, 47,240,120, 60, 95, 11,130,190, 95,109,145,101, 54, 29, 91, 35,182,248, 60, 94, 67,229,251, 53, 84, 31, 0, 30,213,255,
- 11, 7,176,185,250,101, 94,206,238,193,231,241, 94, 84,255,124, 17,199,211,198,105,227,180,113,218, 56, 95, 85,116,168,126,247,
-196, 83,127, 45,207,231, 93,117,248,105,102,102,166, 29, 0, 4, 4, 4, 76, 3,112,164, 41, 66,130, 32, 48,159,162,104, 6, 0,
- 48, 24,196, 23,189,123,247,233, 32, 16, 8,158,137,130,172,209,104,184,177,177,151,250, 82, 20, 77, 84,151,155, 79,211,216, 8,
-160,216,218,223,208,235,117, 12, 54,155, 11, 6,131,152, 19, 22,214,166, 69, 73, 73,201, 21, 6,131, 17,245,228,201,147,242,166,
- 91, 36, 8,236,220,185, 51,192,211,211,243, 47,209,154,165, 82, 41,119,216,176,183,154,196, 55, 14,224,233,120,188,206, 28,130,
-240, 52,145,164, 19, 0,176, 88,172,242, 59, 92,110,248,247,223,126, 43, 36, 8,130, 42, 45, 45,133, 70,163,193,236,217,179, 5,
- 41, 41, 41,195, 75, 74, 74,182, 88,160, 13,104,219,174,195,236,115,231,206, 6, 43,203,202,181, 59,215,111,143,215,176, 56,234,
-150, 33, 65,156,173, 59,246, 57, 79,250,120,204,103,105,105,201,137,168, 63, 29, 73,109, 48, 0, 28,155, 53,107, 86,104,100,100,
- 36,183,178,178,146,175,209,104, 90, 68, 69, 69, 45, 14, 15, 15,183,107,223,190, 61,247,215, 95,127, 37, 20, 10, 5,104,154, 22,
- 6, 5, 5,209,239,188,243,142,246,208,161, 67,211, 1,108,106, 68,248,206,127,122, 44, 25, 27, 2, 3, 3,151, 2, 64,102,102,
- 38,167,214, 49,102, 7, 7, 7,139, 0, 32, 61, 61,253,107,154,166,102, 1, 0, 77, 99, 53,128,133,245, 88,125, 50, 67,187,143,
- 6, 8,180, 78,190,246, 59, 63,180,199,104, 45,104,100, 17, 64,102,245, 3,193,114,160, 86, 92,168,103,145, 90, 88, 88,248, 92,
-185, 9, 35, 34, 34, 9,130, 32, 14,199,199,199, 31,145,201,100, 45, 41,202, 52,177,177,122,214,237, 71,174,174,174, 40, 41, 41,
- 9, 16,139,197,231, 76, 38,147,238,234,213,171, 1,193,193, 79,171, 41,110,251,118, 87, 87,123, 81, 95,183,208,225, 87, 74,146,
-143,199, 89,217, 55, 9, 87, 87,215,113, 37, 37, 37, 43, 0, 76, 72, 77, 77,237, 0, 0,193,193,193, 28, 0,119, 29, 28, 28,186,
- 25,244,122,194, 54,254,217, 96,131, 13, 54,252, 35, 66, 43, 1, 64, 4,254,147,130,103, 7,128, 38, 11, 45, 46, 0, 92,185,114,
- 5, 0,120,207, 81, 17,162,246,141,103,230,204,153,240,244,244,172, 43, 94,112,249,114,236,223,105,236, 51,191,241,205, 55,223,
-216, 85, 84, 84,244,251,249,231,159,223,164,105,122,109, 97, 97,225, 45, 11,251, 23,211, 52, 86, 51, 24,196, 23, 4, 65,128,199,
-227,103, 76,153, 50, 37,161,250,127, 45,254,248,227, 15,225,208,161, 67,213, 0,114, 1,128,199,227,123, 51,153,140,128,167,202,
- 21,171, 27, 19,132,163, 0, 63,146,203,237, 51,121,243,102,242,245,161, 67, 89, 34,177,152, 0,128,220,180, 52,215,213,107,214,
-116, 43,207,206,230,106, 92, 93, 75, 75, 85, 42, 77, 70, 70, 6,120, 60, 30,193,100, 50, 95,183,212, 96,145, 72, 52,227,219,239,
- 87,137,148,101, 21, 26,173,178, 82,207, 36,141, 58,123,129,208, 84, 92, 36, 43,181, 19,136,212, 95,124,181,140,251,233,196,177,
- 51, 84, 42,213, 52, 11, 84,211,231,204,153, 19,220,169, 83, 39,239,223,126,251,141, 80, 40, 20, 96,177, 88,118,237,219,183, 71,
-120,120,184,233,210,165, 75, 68,203,150, 45, 17, 22, 22,134,107,215,174,225,198,141, 27, 68,135, 14, 29,132, 71,143, 30,253,208,
-104, 52,110,178, 36,174,153, 76,198,236,160,160,160,246, 34,145, 72, 31, 16, 16,128,137, 19, 39,130,166,105,244,235,215, 47,204,
-206,206,238,136, 74,165,226,166,167,167,189,105, 73,100,203,146, 79,188, 99,182,108, 1,104, 3, 26, 89,242,228, 19,181,167, 31,
-131,211,211,211,223, 40, 47, 47,175,177, 16,153, 19,152,191,249,230,155, 77,233, 75,197, 52,141,213, 67,135, 70,126, 1, 16, 68,
-191,126,253, 42,166, 79,159,206, 72, 75, 75,251,224,237,183,135,135,101,102,102,161,177,122,210, 52,192, 96, 60, 77,101, 49,110,
-220,199,216,189,123,119,192,128, 1, 3,174,157, 62,125,218, 53, 32, 32, 64,206,225, 60,213,154, 18,137, 4,238,174, 78, 3,227,
-142,110,152,241,221,198,168, 32, 73,200,219, 21, 52,141, 7, 22,250, 38, 49,110,220,199,197,118,118,118, 35, 14, 31, 62,156, 46,
-149, 74, 89,102, 62, 0, 76,137, 68, 34, 14, 8, 8,152,234,226,226, 34, 99, 50, 24, 18, 26, 52,109,169,127,218, 96,131, 13, 54,
-216,240,220, 56, 85, 45,174, 78,213,253, 7, 11, 0,162,163,163,107,194,151, 70, 70, 70, 54,248, 4, 76,211,116,241,189,123,247,
-124,212,106, 53,104,154,182,102,192,174,189, 68,179,152, 32, 24, 91, 25, 12, 98, 26, 65, 16, 8, 11,107,243,104,195,134, 13,245,
-229,244,210,135,133,181,121,196,100, 50, 90, 61,157, 66, 97,252, 68,211, 84,113, 3,156,245,222,136,184, 92,222,124, 0,240,240,
-240,204, 62,115,230,140,126,212,168, 81, 88,179,102, 13,103,193,130, 5,243, 88, 44,214,244,252,252,252,162, 70,234, 9, 0, 11,
-197, 98,137,112,231,206,157, 1, 83,166, 76, 73,144, 74,165, 11, 1,192,211,211,115, 5,128, 16, 0,185,181,182, 97,219,182, 67,
- 79, 38, 78,156,152, 33,147,201, 22, 54,196, 57, 2,120,205, 39, 40,168,207,242, 43, 87,104,134, 78, 71,148, 92,189,170,148, 23,
- 23, 27, 31,202,229,194,189,119,239, 70, 46, 94,177,130,237,227,235,139,203, 39, 79,186,149,168,213,114,133, 78,167, 45, 46, 46,
-166, 73,146,188, 97, 69,219, 67, 37, 98,137,112,251, 15, 63,221,177,103, 51, 41, 73, 51,111,130,237,226,194, 98, 8, 29,184, 76,
- 22, 67,215,170,133, 63, 23, 64,168,165,115,196,225,112, 62, 28, 48, 96,128,240,208,161, 67, 68, 88, 88, 24,156,156,156,112,245,
-234, 85, 36, 38, 38,162,188,188,156, 97, 52, 26,209,177, 99, 71,172, 90,181, 10,190,190,190,168,168,168, 64,126,126,190, 27,151,
-203, 21, 27,141,198,134,142,231, 51,253,105,254,252,249,240,244,244, 4, 73,146, 40, 43, 43, 3, 73,146,176,179,179, 3, 0, 60,
-126,252, 24, 39, 79,158,176,166, 47, 89, 4, 77,211,232,210,165, 75, 37, 65, 16,169,117, 45, 90, 77,225,244,246,246,254, 85, 46,
- 47, 25,220,167, 79, 31,148,151,151, 27,151, 45, 91,134,182,109,219, 34, 32, 32,192, 98, 61,189,188,188, 38,147, 36,185, 4, 0,
-142, 31, 63,190,215,211,211,243,147, 3, 7, 14,184,154, 83,132, 76,157, 58, 21,226,182,111,119,117,177, 23,245, 45,150,149,150,
-223,184,147,156, 62,103,242,168, 94, 87,110, 37, 21, 24,216,195,242, 21,247, 79, 40,234,225, 92, 88, 90, 90,250,115,243,230,205,
-127,152, 57,115,166,167,139,139, 11,116, 58,221,226,162,162, 34, 76,157, 58, 21, 0, 48,100,200,144,182,108, 54,251,204,248,241,
-227,209,178,101,203, 39,101,101,101,249,241,241,241, 19,217,175,245, 75, 82,220, 63,241, 92,199,211, 74,216, 56,109,156, 54, 78,
- 27,231,115,195, 90, 45,242, 95, 10,169,217,130, 85,141, 29,207, 8,173,200,200, 72, 34, 58, 58,154,182,162, 97,165,205,154, 53,
-243, 17, 8, 4, 0, 80,218,212, 90, 80, 20, 53,221,213,213, 85,182,112,225,194,238, 1, 1, 1,250,233,211,167, 39,229,230,230,
- 46,170, 93,166, 69,139, 22,223,253,248,227,143,200,200,200,200, 93,177, 98,197,181,210,210,210,166,230, 49, 91, 64,211,216, 80,
-109, 29, 43, 57,121,242,100,219, 43, 87,174, 76, 91,191,126,189,248,211, 79, 63,229,204,152, 49, 99, 12,128, 53,150, 72,152, 76,
-166,186,190,233,194,250,224,233,233,169,103, 50,153, 13, 6,137,139, 4, 4,124, 46,183,247,242, 43, 87,104,125,110,174,122,247,
-186,117,246,219,255,252,115,169,145,166,221, 37, 18, 9,122,116,235, 86,197,103, 50, 75,100, 69, 69,148,228,181,215,152, 57,103,
-206,184,105,184,220,194, 67,135, 14, 41, 74, 75, 75,143, 91, 52,225, 17,132,146,162,105,189, 93, 51, 95,227,168,225,253,195,238,
-220, 78, 76,179,151,184, 49, 58,180, 15,107,155,150,145, 27, 15,138, 50, 16, 4,161,180,196,227,232,232, 24, 80, 90, 90, 10,165,
- 82, 9,177, 88,140, 13, 27, 54,192,195,195, 3,106,181, 26,201,201,201,116,179,102,205,136, 43, 87,174,160, 89,179,102,144,203,
-229,208,235,245,168,172,172,148,233,116,186,134,114, 51, 22, 51, 24,204, 61, 12, 6,241, 49, 65, 16,104,213,202, 47,111,203,150,
- 45,122,138,162, 16, 28, 28,140,183,223,126, 27, 71,143, 30, 69,114,114,178,217,242,164,111,222,188, 69, 30,131, 65, 52,175,214,
- 74,207,109,129, 49,167,246, 41, 44, 44, 28,241,156, 23, 13,195,203,203,107, 76,235,214,173,167,189,255,254,251, 70, 46,151, 11,
-149, 74,101, 62, 22,198,193,131,135, 84, 12, 29, 26,233,120,234,212,169, 6,235,105, 48, 24,150, 60,121,242,196, 83,163,209, 96,
-208,160, 65, 51,214,174, 93, 43,226,114,185, 0, 0,147,201,132,159,126,250, 9, 35,167,174, 28, 24,119,116,195,140,111,215,239,
- 63, 55,107,201,150,216,115,191,174,242,250,118,193, 39,189,198, 76,255, 46, 22,192,217,122, 56, 81, 89, 89,153,237,227,227, 51,
- 97,206,156, 57, 81,219,182,109,115, 94,180,104, 17, 40,138, 2, 77,211, 32, 73,178, 38,145, 56, 69, 81, 56,118,236, 24, 30, 62,
-124,248,221,177, 51,113, 73, 99,166,191, 50,249,175,109,176,193,134, 87, 16, 77,208, 34,255,141,240,196,211,105, 67,212, 21, 91,
-255,120,100,120, 38,147,185,253,252,249,243,237,223,124,243, 77, 86,223,190,125,195,206,158, 61, 27,246,228,201,147,164,106,235,
- 65, 88,223,190,125,195, 36, 18, 9, 54,110,220,168,102, 50,153,219,159,243,103,106,110,122, 69, 69, 69, 9, 0,214, 30, 61,122,
-116,245,228,201,147,225,225,225, 17, 34,149, 74,255,209, 54, 59,240,120, 29,198,111,216, 64,178,141, 70,198,230,181,107, 29,214,
-197,198,174,254,237,247,223, 89, 93,186,116, 33,104,154,198,131,251,247, 5,171, 54,109, 18,190, 55,124,120,110,122,118, 54,121,
-226,220, 57, 99,241,147, 39,101, 79,228,242, 37, 0,202, 44,241, 27,141,198,155,153,153,153, 94, 61,122,118,241,142,251, 51, 41,
-113,212,240, 33,125,216, 44, 6,145,149,251,248,174,167,135,155,227,229,216, 11, 26,163,209,120,211, 18,143, 74,165,202, 33, 73,
-210,133,166,105,241,229,203,151, 33, 22,139, 81, 94, 94, 14,163,209, 8,189, 94,175, 87,171,213,252,210,210, 82,104,181, 90,232,
-116, 58, 56, 56, 56,224,193,131, 7,197, 36, 73, 94,106,136,211,100, 50,141,231,241,120,223,176,217,108, 46,135,195, 41,188,123,
-247, 46,148, 74,101, 11, 39, 39,167, 53, 36, 73,162,176,176, 16, 87,174, 92,249,220,193,193, 33, 23, 0,248,124, 62,184, 92,158,
-171, 78,167, 35, 1, 60,121,222, 99,254,119,114, 76,121,120,120,248, 10, 4,130,229, 95,124, 49, 63,184, 93,187,246,144,203,229,
-160, 40, 10, 34,145, 8,106,181, 26, 14, 14, 14,232,218,181,107,206,242,229,203,165, 52,141, 73,141,136, 65,102,245,249,193,228,
-201,147, 69, 14, 14, 14, 40, 40, 40, 64, 80, 80, 16, 76, 38, 19, 72,146,132, 84, 94,250,224,250,157,164,180, 57, 83, 70,247, 60,
-120, 50, 54,245,220,229,187,169,195, 7,117,107, 71, 16,116,139,198,234,152,156,156, 44,111,215,174,221,244,201,147, 39,127, 19,
- 16, 16,208,138,166,105,248,251,251, 99,192,128, 1, 56,115,230, 12, 50, 50, 50,160, 82,169, 76,183,110,221,250,229,203,239,182,
-252, 17,226,223, 28, 4, 65,219, 70,114, 27,108,176,193,134,151,131,191,248,102, 61, 99,209,250, 39, 33,147,201,228,105,105,105,
-103,227,227,227, 35,223,121,231, 29, 92,190,124,121, 28,128, 57, 0,192,227,241,198,189,243,206, 59,136,143,143, 71, 90, 90,218,
- 89,153, 76, 38,127, 17,191,201,229,114,181,122,253, 83,227, 20,159,207,231, 55,113,247, 22,213, 83,134, 0,208,162,145,109, 13,
-155, 70, 88, 44,207, 54,131, 6,177,202, 19, 19,149, 59,111,223,254, 38, 42, 42,138,213,189,123,119,194,104, 48,192, 68, 81,240,
-243,243, 35,250,246,235, 39,218, 19, 21,229, 98, 82,169,174,124,251,197, 23, 87,119,140, 31, 95,149, 89,237, 7,102, 9, 58,157,
-110,211,180,169, 19,250,197, 94,190,234, 29, 18,244,154,203,217,243,177, 9,174,174,142,194,128,214,173, 69,165,229,101,166, 69,
- 11, 62,103,233,116,186,205,150,120, 52, 26,205,177, 11, 23, 46, 12,247,241,241, 17, 39, 37, 37, 65,175,215,195,100, 50,161,111,
-223,190,160,105,154, 7,128, 98,177, 88, 72, 75, 75,131,193, 96,144,101,102,102, 22,102,101,101,241, 0,172,180, 80,191, 60,157,
- 78,135,212,212,167,179,118,205,154, 53,235, 31, 17, 17, 1,146, 36, 49,104,208, 32,156, 56,113,162,127,106,106,234,186,218,154,
-239,239,158,243,106, 11, 89,176,151,151,215,209,234, 77, 86, 57,193,123,123,123,135,249,249,249,109, 91,185,114, 37,167, 89,179,
-102,160,105, 26,206,206, 78, 80,171,213, 40, 41, 41, 69, 72, 72, 8,124,124,124,176,114,229, 74, 0,248,165, 49,139, 27, 69, 81,
-144, 74,165,200,201,201, 65,118,118, 54,124,124,124, 64, 16, 4, 42, 43, 43, 65,146, 36, 40,138,130,176, 82,121,234,199, 61,127,
-244,254,125,219,146,208,206,109,252,125,111, 39,164,200, 62, 28,209, 95,232,223,210, 55, 64,158,180,140, 1, 44,163, 26,226, 28,
- 55,110, 92, 86,239,222,189,223,153, 49, 99, 6,167,162,162, 34,188,127,255,254, 27,251,245,235,135,132,132, 4, 92,189,122,245,
- 61, 30,143, 39, 51, 24, 12,228,119, 95, 78,155,244,253, 34,194,129, 50, 24, 14, 2,203,164,192, 50,219,144,104,131, 13, 54,216,
-240, 98, 97,246,209, 66,173,247,166, 89,180,130,131,131, 69,185,185,185, 31,181,104,209,130, 11, 0, 2,129, 32,196,207,207,111,
- 94,118,118,118,101, 83,107,163, 86,171,127,139,138,138, 26,240,195, 15, 63,112,134, 12, 25,242,218,209,163, 71, 59, 1,192,144,
- 33, 67, 94,179,183,183, 71, 84, 84,148, 65,173, 86,191,176,152, 72, 70,163,241,205,142, 29, 59,162,172,172, 12,185,185,185, 73,
- 77,217,247,143, 63,254, 16,226,169, 95, 86,163,219, 26, 3,169,215, 59, 59,121,123, 51,158,196,198, 26,202,148, 74,207, 55,123,
-246, 36,140, 6, 3, 24, 12, 6, 74, 75, 75,145,159,159, 15, 71, 39, 39, 34, 45, 51,211,110,215,252,249,127,180,104,215,142,107,
-210,235, 93,155, 80, 77, 85,137,172,248,227,207,166,127,122,236,224,193, 95,196, 21, 74,229, 67,129, 64,168,227,241, 56, 30, 51,
- 63,251,204, 84, 86, 86, 54, 22, 64,149, 21, 60, 43, 15, 30, 60, 56,104,208,160, 65,247,125,125,125, 37,114,185,220,163,162,162,
-194, 84, 86, 86,198, 68,117,136, 39, 0,136,141,141,133, 82,169, 36, 77, 38,211, 21, 60,141,133,165,183,182,162,205,155, 55,119,
- 12, 15, 15,239, 37, 22,139,161, 80, 40,224,234,234,138,246,237,219,247, 98, 50,153, 63,231,229,229, 41, 94,100,175,143,137,137,
-177,167,105,250, 13,154,166, 49,104,208, 32,171,246, 49,153, 76,159, 68, 68, 68,112, 8,130,128, 70,163, 6,159, 47,128, 72,100,
- 7,123,123, 7, 4, 4, 4,162,176,176, 16, 3, 7, 14,212, 63,124,248,112,171, 84, 42,253,205, 2, 23, 10, 11, 11, 33,151,203,
-145,159,159,143,146,146, 18, 0, 64, 73, 73, 9, 40,138, 2, 73,146, 77,110, 83,125,156, 10,133, 98, 88,215,174, 93,231, 78,157,
- 58, 21, 36, 73, 98,216,176, 97, 40, 40, 40, 88,151,147,147,115,200,203,203,107,204, 39,159,124, 34,118,117,117,197,220,185,115,
- 5, 0,190,182,141,135, 54,216, 96,131, 13, 47, 28,117,125,180,254,106,209,106,108, 78,212,195,195,163, 7, 65, 16,139, 53, 26,
- 13,215, 60, 37, 67, 16, 4, 87, 44, 22,159,208,104, 52, 43,164, 82,105,147,156,226, 42, 42, 42,148,143, 30, 61, 58,113,243,230,
-205,209, 35, 70,140, 64, 76, 76,204, 88, 0, 24, 49, 98, 4,110,222,188,137, 71,143, 30,157,168,168,168, 80,190,136,150,123,123,
-123, 15,238,217,179,231,136,142, 29, 59, 34, 58, 58, 26, 38,147,233, 70, 83,246,175,189,194, 16,245,172, 58, 52,111,179,138,140,
-201, 4, 65, 16, 53, 55,216, 18,185, 28, 25,233,233, 40, 43, 47,135, 78,171,133, 74,173, 54, 5,180,108,169, 81,232,245,108, 2,
-104,234, 60, 79, 94,252,157, 91,249,106,149, 74,226,234,236,162, 17, 10,121,168, 80, 42, 56,119,239,220,170, 2,240,208, 74, 14,
- 61, 77,211, 61,207,156, 57,179,132,201,100,190, 99,103,103,135,105,211,166, 49,123,245,234, 5, 14,135, 3,157, 78,135,138,138,
- 10, 68, 69, 69,201, 77, 38, 83,171,234,125,236,132, 66,225, 62, 38,147,249,184,178,178,114,177,197, 31,208,235,135, 68, 70, 70,
-178,244,122, 61,190,253,246, 91, 44, 93,186, 20,131, 6, 13, 98,221,185,115,103, 8,128,131, 47,170,199, 83, 20,133,254,253,251,
-215,118,134, 79,181,102, 63, 54,155, 29,214,186,117,107,200,229,114,200,229,114,136,197, 98,120,121,121,193,195,195, 3,235,214,
-173,163, 55,110,220,120,214, 96, 48,108, 45, 41, 41, 41,182,166, 14,217,217,217, 53,150, 65,173, 86, 11,149, 74,133,130,130, 2,
-152, 76, 38,196,198,198, 66, 35,114, 24, 52,253,227,161,237, 84, 26,141,250,246,131,204,252,197, 51,198,116, 81,105, 52,234,204,
-156,252, 12, 96, 19,101,137,115,222,188,121,147,198,141, 27, 55,105,244,232,209,168,170,170,194,205,155, 55,209,173, 91, 55,172,
- 94,189,218,243,202,149, 43,115, 58,118,236, 8, 54,155,141,203,151, 47,131, 36,201, 2,155, 53,203, 6, 27,108,248,111,198,191,
-212, 63,171, 81, 52,106,209,242,241,241,113, 50,153, 76,159, 71, 68, 68,244, 31, 62,124, 56, 6, 14, 28,248,204,255, 15, 30, 60,
-104,127,228,200,145, 21,155, 54,109, 26,100, 48, 24, 86, 54,101,170,143,162,168, 99, 7, 15, 30, 28,210,165, 75, 23, 97,239,222,
-189,253, 0,128,199,227,233, 15, 30, 60,168,166, 40,234,216,115,180,197, 28,136,177, 24, 0,188,188,188,218,178, 88,172, 17,131,
- 7, 15,110,251,241,199, 31, 35, 57, 57, 25, 81, 81, 81, 89, 1, 1, 1,215,138,139,155,228, 95,157,107, 97,213,225, 10, 75,214,
- 45, 38,151, 91, 90, 81, 84,228,100,231,235,203,118,182,183,151, 70, 71, 71,251,244,235,215,143, 40, 40, 40, 64,121,121, 57,180,
- 90, 45,238,220,185, 67,177,128, 60,150,179, 51,145,119,243, 38,193,228,114, 75,241,236, 74, 62,139,240,241,116,246,255,106,193,
-148, 22, 90,157, 54, 84,161, 80,144, 44, 54,155,221,204,195,169, 32,253, 97,147,102,226,116, 66,161, 48, 28, 0,139,162, 40,181,
-139,139,139,240,252,249,243,224,114,185, 32, 8, 2,109,218,180, 1,159,207,231,208, 52,157, 15, 0,246,246,246,220,237,219,183,
- 59,142, 25, 51,230,170, 37,226, 14, 29, 58,176,121, 60,222, 91, 1, 1, 1,184,121,243, 38,146,146,146,242,110,222,188,217,188,
- 67,135, 14,240,245,245,125,203,211,211,243,247,132,132, 4,227,139,232,216, 79, 87,172, 54,221, 25,222,100, 50, 81, 4, 65,128,
-193, 96,128,162, 40,200,229,114,180,106,213, 10, 91,182,108,193,134, 13, 27,190,149, 74,165, 39,155,192,101, 82, 42,149, 16,137,
- 68, 72, 74, 74,210, 69, 68, 68,240, 24, 12, 6,178,178,178, 96, 50,153,176,102,205, 26, 72,252, 7,134,116,235, 24, 22,244,237,
-250,253,231, 68, 60, 30,111, 96,175,240,224,148,204,188,199, 52, 77,228, 54,100,209,170,197,201,105,223,190,253,216,209,163, 71,
- 35, 59, 59, 27, 43, 86,172, 40,145, 74,165,177,231,206,157, 27, 57,117,234, 84,102,183,110,221, 80, 90, 90,138, 61,123,246,144,
-119,239,222,221, 93, 84, 84,180,223, 54,140,219, 96,131, 13, 54,252,151, 8, 45, 31, 31,159,209, 28, 14,103,238,187,239,190,203,
- 12, 12, 12, 68,113,113, 49, 28, 28, 28,140, 4, 65,176, 1,192,201,201,201, 40, 16, 8, 48,101,202, 20,180,107,215,174,199,252,
-249,243,187,177, 88,172, 45,133,133,133,251,172,249, 97,153, 76,166,102, 48, 24,135,167, 77,155,182, 50, 49, 49,161, 21, 0,252,
-249,231,159,143, 10, 11, 11, 23,200,100, 50,117, 19,219, 97, 14,138, 73,240,120,252,219,254,254,254, 57,225,225,225, 14,195,135,
- 15,135, 88, 44, 70,124,124, 60, 86,173, 90,149,169,215,235,151,196,197,197,145,255,244, 65, 38,117,186,162,187,199,143,219,247,
-250,224, 3,135,153, 17, 17,107, 63,157, 54,237,135,175,190,250,138, 21, 24, 24, 72,168,213,106,220,190,125,155, 62,114,228,136,
-113,207, 55,223,108,128, 72,196,190,121,228, 8, 87,175,215,231, 53,209,114,215,179,251,155, 61, 2,215,254,176, 9, 90, 77, 21,
-110,223, 56,133,242,114, 57,182,239, 56, 26,232,237, 77,247,124,242,228, 73,156,181, 92, 4, 65, 4,196,196,196, 72,104,154, 6,
-151,203,197,242,229,203,225,229,229, 5, 7, 7, 7, 84, 86, 86, 98,206,156, 57,142,179,102,205,114, 4,128,228,228,228,154,240,
- 12,150, 80, 88, 88,216,117,202,148, 41,246, 36, 73,226,236,217,179,122,130, 32, 22, 95,184,112,225,231, 54,109,218,112,123,244,
-232, 97,191,127,255,254,110, 0, 46,191, 40,161,245,156,251,101,157, 63,127,190,227, 59,239,188, 67,179,217,108,162,162,162, 2,
- 78, 78, 78,216,178,101,139, 74, 42,149,158,106, 34,215,242, 5, 11, 22, 44,169,254,188,119,241,226,197, 19, 86,174, 92, 41, 46,
- 42, 42,122,234, 8, 47,149,130,116, 46,187,212, 53,226, 51, 83,105,133, 66,191,123,253,252, 81, 2, 62,143,187,120,229,238,203,
- 70, 38,110, 53,212,174, 5, 11, 22,152,175, 81,174, 80, 40,228,210, 52,141,195,135, 15, 35, 47, 47,239,147,210,210,210, 34,147,
-201,116,244,243,207, 63,159, 23, 24, 24,216, 50, 61, 61, 61,175,178,178,114,181, 79,251,183,115,180,146, 34,212, 10,239, 96,131,
- 13, 54,216, 96,195,139,131,217, 9,222,188,250,240, 20,158, 78, 39, 54,156,235,208,100, 50, 77, 57,119,238, 28,243,163,143, 62,
-194,189,123,247,176,103,207, 30, 90, 40, 20, 46,246,244,244, 20,250,249,249,241,248,124,254,188,137, 19, 39, 82, 89, 89, 89,232,
-209,163, 7,110,222,188,201, 0, 48,182, 14, 77,163, 33,250, 21, 10,197,157,132,132,248, 86, 38, 19, 69,152, 76, 20,145,144, 16,
-223, 74,161, 80,220,177,208,152,186,156, 53, 65, 49, 41,138, 38,244,122, 93,231,229,203,151,139, 39, 79,158,140,226,226, 98, 44,
- 95,190,156,250,250,235,175, 47,210, 52,189, 88, 42,149,106,172,228,124, 17,168,225,228,146,100,252,129,121,243, 88, 85,106, 53,
- 61, 97,238,220,202,239,199,143,159,177,101,211,166,188, 15, 62,248,192,240,197,130, 5,250,107,113,113, 89, 59,150, 47,159, 60,
-232,173,183,170,146,227,226,184,137, 49, 49,108,177,209,120,175, 41,245,124,242,228, 73,220,229,203, 87,177,119,231, 15, 56,176,
-103, 51,174,196, 94, 70,242,253, 84,148,148, 42, 96, 65,100,253,133,147, 36, 73,197,200,145, 35, 43, 70,141, 26,165, 63,124,248,
- 48,100, 50, 25,170, 67,122, 64,169, 84,226,212,169, 83,136,137,137, 65, 76, 76, 12,206,157, 59, 87,227,228,110,169,158, 34,145,
-232,173,110,221,186, 33, 47, 47, 15,201,201,201, 23,165, 82,105,105,114,114,242,197,130,130, 2,116,236,216, 17, 34,145,104,104,
- 83,234,249, 2,132,214, 95, 56, 5, 2,193,130,163, 71,143, 70,205,152, 49,131,124,244,232, 17,218,183,111, 15, 0,168,172,172,
- 84, 3, 48, 53,133, 83,163,209,108,215,106,181, 94, 90,173,214,203,215,215,119, 81,110,110,238,155,115,231,206,149,155,195, 47,
- 0,128, 60,229,228,205,180,107,123,191,151,184, 57, 11,186,118, 12, 13,252, 97,251,225,203,249, 5,197, 81,181, 98,104,213,229,
-132, 86,171,133, 86,171,173,105,167,209,104, 4, 69, 81,112,113,113, 81, 85, 63,196,228, 60,124,248,112, 90,110,149,235,192, 59,
-241,137, 83, 62,252,116, 89, 78,126, 65,113, 93,145,101, 75, 29, 98,227,180,113,218, 56,255,219, 56, 95, 5,152, 87, 31, 70, 88,
-180,104,209, 52, 77, 82, 20,133,203,151, 47,227,232,209,163, 38,131,193, 48, 73, 42,149,214,142, 86,189, 41, 62, 62, 62,102,228,
-200,145,251,210,211,211,153, 41, 41, 41,160,105,218,212,148,218,104,181, 90, 99,221, 28,112, 90,173,246,111, 79, 29,237,221,187,
- 23, 69, 69, 69,134,130,130,130, 11, 36, 73, 30,251,155,171, 23,255,246,170,195,189,128,238,125,189,254,194,210,238,221,251, 47,
-137,137,225, 77,248,242, 75,221,184,143, 63,254,220,164,215, 27,153, 28, 14,197, 21,137, 24, 38, 30,143,157, 28, 23,199,223, 56,
-117,170,139, 70,167, 59, 27,213, 4, 7,115,179, 69,171, 87,175, 30, 24, 55, 97, 54, 52,181, 44, 90, 55,239,100, 64,103, 64,147,
- 44, 90, 58,157, 46, 84, 42,149,130,207,231,231, 3,240,248,232,163,143, 64, 81, 20, 52, 26, 13, 42, 43, 43, 81, 88, 88,168,248,
-248,227,143, 77,213,226,137, 53, 98,196, 8, 7,107,120,253,252,252,188,216,108, 54,206,158, 61, 11, 54,155,125, 10, 0,216,108,
-246,169,152,152,152, 33,239,189,247, 30,188,189,189,253,178,179,179, 9, 88,240, 79,147,132, 14,251,141, 6,252, 65,160,245, 83,
- 19, 28, 90,139, 67,135,221, 39,128,204,234,168,241,169, 29, 58,116, 0,172,244,203,170,141,234,197, 29, 27,140, 70,227,239,243,
-231,207,159,214,185,115,231, 1, 75,151, 46, 37, 80, 29,170,225,239,224,221,119,223,205, 56,116,232,208,155, 11, 23, 46, 60, 71,
-211,180,174,246,255,100, 37,101,151,186, 68, 78,167, 43, 42, 20,137,242,212,147, 15,154,194, 75,146,100,189,194, 82, 86, 82,134,
- 46,145,211, 81, 81,161,128, 60,245,164,109,248,179,193, 6, 27,108,120,249, 86,173,191,160, 65,161, 69, 16,196,142,158, 61,123,
- 78, 2,192, 36, 8, 98, 91, 97, 97,225, 95, 6,127,169, 84,154,225,229,229,181,166,101,203,150,147, 1,208, 4, 65,236,104, 98,
-165,138,105, 26,171, 24, 12, 98,254, 83,113,247, 92, 1, 42,205,105, 73,230, 3, 32, 24, 12,230,190,132,132,132, 47,243,243,243,
-229, 86, 90, 32, 26,197,139, 88,117, 8, 0,191, 0, 57,239,230,229,157,155, 27, 22,214,111,208,212,169,104, 59,104,144,131, 87,
-243,230, 38,141,193, 64, 61,184,118,141,184,113,248, 48, 39, 49, 38,134,173,209,233,206, 30, 3,242,155, 90,207, 39, 79,158,196,
- 93,138,141, 59, 63,106,196,144, 1,126, 45,189,158,138,134,156, 66,148,148, 41,206, 55, 69,100,213, 17,189,195,182,108,217,114,
-146,195,225,176,106,167,178, 49, 24, 12,101, 58,157, 46, 20, 0,202,203,203,189,118,236,216,241, 43,131,193,200,179,196,151,146,
-146,114, 98,201,146, 37, 35,114,115,115,207, 23, 20, 20,228, 2, 64,126,126,126,174,209,104,220, 39,149, 74, 71,228,229,229, 29,
-129, 21,139, 0,104,192, 63,249,218,239,109, 0, 32,180,251,104, 36, 95,251,157, 15,160, 77,104,247,209, 0,128,231,205,101, 88,
- 27,165,165,165, 82, 0,139,111,222,188,121,112,192,128, 1, 19,241, 55, 98,122, 1,128, 94,175,135, 70,163,193,245,235,215, 51,
-214,172, 89,211,252,193,131, 7,200,203,251,207, 33,147,167,156,188, 41, 7,110, 54,145,211,168,209,104, 72,147,201,196, 50, 24,
- 12,180, 94,175,127,230, 33, 69,158,114, 18,114,219,192,103,131, 13, 54,188, 34,160,105,186, 35, 0,177,121,136,171,126, 23,215,
-249,172, 71,117,186, 64,243, 80, 89,253, 93, 78, 16,196,157, 90, 28, 53,219,173,216, 23, 0, 74, 0,220, 39, 8,162, 33, 35,200,
-142,134,190, 55, 40,180, 10, 11, 11,143,192,138,164,209,214,150,107, 4, 11,171,243,196, 1,207,159,135,173,134,195,100, 50, 21,
-231,231,231,255,237, 19,202, 96, 48,114,134, 14, 29,218,164,242,150,202, 28, 2,242, 62,211,233,246, 71,111,222,220,254,236,182,
-109,222, 38,146,116, 37, 0,154,201,229,150,234,245,250, 92,177,209,120,175,169,150,172,103,172, 49,143,158, 12,204,126,244, 4,
-173, 91,183,166,179,178,178,158,218,122,254, 30,238,169, 84, 42, 31, 75, 93, 64,173, 86,247,176, 82, 12,254,242,228,201,147, 95,
-234, 17,236,191, 74,165,210, 95,173,173, 84, 77, 82,105,128, 65, 17,212,168,208,238,163, 15, 3,160,204, 73,165, 95, 36,138,138,
-138,210, 81, 29,231,237,239, 32, 47, 47, 15, 4, 65, 96,213,170, 85, 72, 76, 76, 68, 97, 97, 33, 94, 0,167,142, 32,136, 3,171,
- 86,173,250, 48, 49, 49,241, 80, 97, 97,161,206, 54, 20,219, 96,131, 13,175,178,200, 34, 8, 34,186,250,123,100,181, 81, 40,186,
-238,103,115, 25,115,185,218,101,204, 28,117,183, 55,182, 47, 0, 44, 88,176,224,203, 21, 43, 86, 8, 1, 88,155,140,249,185,147,
- 74,191, 44, 20,255,151,112,212, 22, 5, 59, 95, 70, 67, 55, 3,122,144,228, 45,212,142,161,100, 52,190,208,223,200,202,202, 34,
- 94,229, 11,206,156, 84,186, 22,194,254, 13,245,206,205,205,133,175,175,239, 11, 17, 89,181, 56,183,248,250,250,110, 47, 44, 44,
- 36, 97,131, 13, 54,216,240,234, 66, 92,159, 48,106, 64,148, 69, 54,246,255,103, 30,220,235, 41, 87,223,119,130, 32,162, 87,172,
- 88, 17,217,132,250,214, 88,180, 24,182,115,103,131, 13,255, 28,226,226,226, 94, 6,167, 77,100,217, 96,131, 13, 54, 60, 7,234,
- 90,177,204,226,171,238,247, 5, 11, 22,124,137,198,103,156, 60,241,212,138,229, 89,253,189,198, 95,139, 64,195, 43, 7,154, 18,
-132,244,121, 86, 31, 92,176,113,218, 56,109,156, 54, 78, 27,167,141,211,198,249, 63,199,105,137,251, 66, 61,130, 40,162,161,169,
-190,198,166, 17,235,126,182,180,175,165,178, 4, 65, 52, 20,230,199, 60, 85, 88,243, 78,211,244, 14,252, 3,176, 45,125,181,113,
-218, 56,109,156, 54, 78, 27,167,141,211,198,249,183, 64,211,116, 71,154,166, 35,240,116,193, 20, 77,211,116, 4, 77,211,131, 22,
- 44, 88,176,208,188,109,193,130, 5, 11,105,154,238,107, 46, 87, 93,166,102, 31,243,182,186,239,117,183, 53, 86,182,145, 42, 78,
-170,243,121,146,121, 17,217,127,139,143,150, 13, 54,216, 96,131, 13, 54,216, 96, 67,189, 48,175, 24,172,101,109,146, 3,120,176,
- 98,197,138,242, 90,190, 83,114, 0,247, 0,180,171, 46, 39,175, 22,105,181,125,171,244,213,223,245,245,148,209, 91, 83,182, 1,
-236,104,224,179, 77,104, 53,132,118, 30,140,111,124,155, 73,194,171, 79, 0,104,234,105,218, 57,170, 58, 94, 17,109, 14, 92, 68,
- 81,160,105, 26,133,178,138,248, 7, 50,124,245,188,191, 23,224, 5, 23, 9,159,191,129,162,233,238,213,155,226, 20,165,186,217,
-201, 74, 84, 88,203, 17,228,142, 96, 62, 3,159, 83, 52,218, 2, 0,131,192,125, 45,133, 53,105,197, 77,143, 39, 85, 95, 63, 15,
- 21, 99, 18, 87, 32,124,215,209,201,185,117,121,121, 73,166, 65,171,251, 61, 69,142,237,104,122, 94, 70,248, 57,227, 13,138,198,
-151, 0, 24,108, 6,214,101,150, 89,189,146,195, 54,224, 16,230, 39, 60, 43,203, 87,255,121,206, 96,249, 54,216,240,202,129,166,
-105,230,223,187, 6, 9, 83, 61,156,196,223,228,180, 93,161, 86,136,173,122, 54,255, 89,207,182, 59,255, 77,245,110,146,208, 10,
- 17, 99, 42, 8, 44, 3, 64,131,198,215, 41,114,252,212,164,253, 61,209,143,207,100,238, 2,192,212, 26, 76,115,105, 10, 87,234,
- 61,152, 12,188,201,231, 48,215, 1,160,180, 38,211,248, 20,169,245,254, 98,161,222, 24,196,162, 24, 7, 40,154,102,155, 40,122,
- 40, 53, 96,187, 0, 0, 32, 0, 73, 68, 65, 84, 31,104, 68,219,113,112,253,214, 19,104,155, 82, 87,223,102,146,240,227,127, 74,
- 7,196,254, 52, 19,157,219,190, 6,218, 68, 2,148, 17,194, 30,159,227,226,250,143,208, 57,216, 23, 52,101, 4, 40, 18,118,131,
-215, 98,112,152, 35,253, 64,246,124,121,176, 3,188,224,210,220, 77,146,180,115,231, 46, 15, 47,191, 16,130, 34, 13, 72,255,243,
-252,152, 89,243,151,244, 9,133, 34,204, 26,177,213,214, 19, 19,124, 91, 4,126, 62,123,217, 15, 76, 79, 47, 31, 17,101,212,145,
- 69, 57,169, 29, 54,173, 94,114,132,195,200, 91,119, 95,138, 93,214,246,229, 16, 49, 38,179,120,220,209, 2,190,168,181, 90, 93,
-153,101, 50, 24,127,103,176, 89,131,214,172,221,208,190, 87,255, 33,118,166,202, 34,134,145, 66,200,111,135,126,109,190,121,203,
-214, 33, 73, 82,211, 91, 0,168,166,180,153,162, 49, 63, 99,255,164, 33,108, 22,147, 8,254,100, 39, 19, 32,159, 75,104, 5, 75,
-240, 62, 65,195, 98,120, 9,154,192,213, 84, 25,126,121,158,223, 8,146,224,103,130, 70, 0, 8, 28, 38,104,252,154, 34,135,236,
-255, 83,100, 81,212,211,241,152,193, 32, 44,138, 39, 62,143, 7, 77,117, 20,121,107,202,219, 96,195,255, 42, 24, 12, 70, 44, 69,
- 81,189, 95,176, 48,120,131,166,233, 91,182,163,251,191,141,166, 89,180, 8,124,155,252,176,192, 25, 38, 3, 66, 3,252,190, 1,
-154, 38,180,248, 76,230,190, 59,153,197, 30, 32, 13,216,249,221,180, 67,122, 35, 64, 26, 13, 48,145, 70,152, 72, 35, 72,210, 0,
-147,209, 8,218,168,195,146,221,177,128,190, 18,225, 97,254,251, 0,147,167,181,191,193,166, 25, 7,226,175,157,119, 33,244, 10,
-252,242,211,138,207, 10,228, 85,159, 93,184, 95, 88, 18, 34,209, 44, 76,145, 97, 79, 83, 4, 65,236,182,153,136, 58,118,234,241,
-198,159, 85,105, 20, 77,195,197, 65, 16, 56, 38, 50,217,103,255,137,216,130, 13,251,180,105, 0,224, 40,226, 6,142,189,159,233,
-251,119, 78,130,132,207,223,176,125,235,102, 15, 79, 87, 1, 65,222, 88, 9,210,100,130, 79,243, 8,230,194,233, 99, 60,191, 93,
-191,107, 61,148,186,113,141,237, 31, 40, 65, 72,139,150,193,115,247,157,186,225,171, 82,202,244,231, 15,126,249, 16, 58, 24, 61,
-188,131,217,223,172,248,129,185,232,139,153,115,244,166,199,183,211,101, 72,177, 52,214, 4, 75,112, 98,197,202,181,109,251, 12,
-142,180,163,170,228, 76,173,170, 42, 96,231,238, 93,203,130,218,118, 18,246, 8,107,198,145,253, 62,133,208, 84,150,193,192,224,
-243,250,132,246,115,208,124,248,158,113,231,222,168,233, 41, 50,108,106, 74,155, 77,181,166,173, 41,234,249,163,174, 19, 52,122,
- 36,222,138,157,108, 42,188, 3,218,100, 4, 76,134,154,119,152,140,160,169,167,239,157,167,236, 6,240,124, 66,139, 65, 99,192,
-133,107,119, 60,139,139,164, 29,215,175,253,126, 33,125,231,206, 25,152,112, 32,181, 12,113, 77, 21,152, 0, 2, 90,185, 50,207,
- 25, 77,208, 21, 84,152, 2, 0,160, 79, 0, 15, 0,186,122,218, 17,125,243, 21,196,149,171, 15, 53,113, 86, 14,226,112,117,117,
- 69, 73, 73, 9, 0,212,164, 66, 10, 14, 14, 6, 0, 56, 56, 56,192,160,215,219, 70, 57, 27,108,176, 94, 24,145, 52, 77,179, 94,
- 48,231, 16,154,166, 79,255, 77,154,207, 1, 76,168,254,188, 11,192,154, 23, 80,181,102, 0, 60,170, 63, 23, 1,120,108,235, 1,
-127, 11, 53,113,179,234,126,111,106,135,226,131,166,128,195,195, 1, 64,208,212, 90,208, 0, 31, 4, 19, 48,170, 48,108,112,127,
-184, 73, 60, 0,163, 26, 48,168, 1,163, 6, 48,170, 0,163, 6, 37,210, 60,192,160, 2,178,207,128,164,105, 94,147,155,171, 83,
- 0, 25,191,163,111, 7, 95,136, 29,249,152, 57, 44,196,109,199,217,140, 93,187,206,167,247, 75,145,225, 93,171,234, 74,211,232,
-220,166, 53, 54,238, 82,165,253,145, 32, 31, 8, 0, 67,218,185,158,237, 28,210,220,103,195, 62,109,218,233, 7,229,131, 0, 96,
- 80,168,195,153, 78,129,158,190, 20,158,223, 84, 64,209,116, 15,175, 22,173, 9, 83,226,118, 80,202,199, 80, 42, 53,120,156,179,
- 31,206,222,175, 51, 76, 20,122, 90,218, 95,192,196,130, 25,139, 86,177,213,202, 98, 61,101,144,155,196,204,114, 38,139, 75, 17,
-120, 18,167,171,162, 42, 76,179, 39,125, 68,206,253,234,187, 5, 0,198, 52,106,113,148, 96,250,186,117, 27,218,116, 11, 15,146,
- 20, 29,153, 73, 84,149, 23,131,100, 10,121,195,186,116,131,147,127, 8, 85,124,121, 29,193,245,235, 7, 39, 87, 63, 60,185,113,
- 16,185,183,142, 18,221, 59,140,224,237,249, 63,246,206, 59, 60,138,170,109,227,247,148, 45,201,166,247,158,144, 80, 18, 2,161,
- 73,239, 40, 69, 32,188, 20, 65,154,212,151, 34,162,136, 40, 42, 40, 32, 42,197, 6, 40, 29, 84,154,180,128,148,128,148, 40,189,
- 68, 19, 74, 42,129, 36,164,247,158,108,182,206,204,249,254, 72, 49,129,148,221, 4,245,149,111,126,215, 53,215,108,189,119,102,
-206,236,156,123,158,115,158,115, 14, 74, 95, 3,116,117, 26,173,214,246,232, 59,172,127,247,195, 45, 61, 93, 93, 8, 17, 32, 8,
- 4, 68,224, 81,166,214,227,195, 35, 9,224,121, 30,175, 12,235,251,146,153,140, 34,130, 32,128, 16, 1,169, 89,249,229,191,133,
-198,190,148, 80,136, 80, 67, 34, 85,157,122, 14,234,123, 63,252,118, 91,125,220,105,116,157,186, 54,150, 2,174,215, 56,231,250,
-222, 57,255, 99, 91,224,135,166,123, 57, 10,124,210,185,117,240,236, 63,151,217,113,240,156, 67,113,110,250,244, 99,251,182,142,
-223,182, 99,199,129,216, 28,204, 55,198,100,189,221, 95,118,125,195,111, 37,118,189, 90,154,229,166, 86,198, 41,125,108,104, 0,
- 24,182,253,108,244, 91,183, 86,247,104,187,252, 12, 41,186, 26,175,142,168,251,188,172,136, 76, 81, 20,133, 25, 51,102,194,220,
-220, 28, 65, 65, 65,200,204,204,132, 84, 42,253,211,188, 59, 58,194,215,215, 23,182,182,182, 96,104, 26, 4, 68,140,102,137,136,
- 24,112,221,127,214,102, 43, 57, 57, 57,163, 57,102,203,205,205,173,127,122,122,250, 23, 85,189, 85, 40,138,250,162, 69,139, 22,
- 43,254,188, 81,173,117,175, 87,204,243,252,212,244,244,244,171, 13,105,142, 28, 57,210,245,204,153, 51,222, 53, 52,189, 1,120,
-215,245, 89,107,107,107,190,119,239,222, 73,103,206,156,201, 16,207,144, 38, 25, 46,163,141, 86,108,202,209, 69, 93, 52,153,101,
- 0, 16,107,192,231,107, 53,249,169,245,252,186, 61,171,166,173,107,223,194, 22,165, 74, 45, 46,132, 37,129,231,245,224, 57,174,
- 50,178,197,129,231,244, 24,214,201, 30,189,213,243,241,109,240, 3,112,188,176,182, 33,205, 39,209, 17, 97,114,231,193,175, 30,
- 17, 4, 34,147, 75,232, 98, 95, 15, 59,199, 37,175,116,162, 23,141,110, 15,149,142,123,245,167,203,241,191,197,228, 96,151, 65,
-154,194,211,195, 19,145,186, 94,227,185, 70,247,189,129,104, 84,143,193, 3,251, 89, 18, 77, 49,244,121, 9, 40, 45,215, 35, 33,
- 95,143, 44,117, 17,228, 84,166, 65,154, 2, 65, 71,119, 55, 23,197,141,195,239, 63,182, 99, 74, 88, 71,134,147,202,104, 14,188,
- 64, 24, 82, 20,173,177,109, 59, 68, 82,213,111,171,161,237, 52, 85, 88, 76,235, 63,116,164, 85,202, 79,115, 41, 83,223, 97,112,
-236,226,129,199, 87,247, 32, 39, 44, 24,249, 25, 73,148,165,186, 8, 78,118,173, 48,124,234, 68,124, 57,177, 27, 74, 75, 74,193,
-100,198, 91,201, 36,114,107, 64, 87,167, 38,225, 49,245,235,245,159,187,176, 12, 93,113, 60,171, 22, 94, 15,149, 70, 3,240, 28,
- 76, 88, 1, 20,169,122, 79, 15, 94,175, 83,116, 28,247,254, 2,128, 15,109,108,223, 99,114,112,176,157, 3,250, 65,208,183, 37,
-122, 21, 40,224,122,116,238,159,230,199,223, 17,147, 95, 24, 54,179, 31,161,112,173, 41,101, 20, 96,135,192,174,222,230,102,102,
- 37,177, 72, 11,122, 19,241, 48, 33, 78,125,254,139,201,179, 22, 42,118,238,220, 57, 10, 32,175,163,118, 31,181, 16, 0,104,235,
-196, 0,192, 60, 61,143, 21, 0,160,210,147, 61, 22, 50,106,214,215,135,110,217,129,169,152,209,161, 42,146,165,214,147,151,210,
- 75, 72,161,238,210, 71, 15,122, 46, 9, 30,216,225,238,192, 84,138,146,167, 92,121,164, 41,174,107, 59,165, 82, 25,188,188,188,
-176,104,209, 34,216,218,218, 66,163,209, 32, 43, 43, 11,175,191,254, 58, 0, 96,196,136, 17,144, 72, 36,152, 61,123, 54,188,189,
-189, 81, 80, 80,128,240,240,112,148,151,151, 27,125,126, 26,137,168, 41,106,214,194,210,210,210,167, 69,139, 22, 43,244,122,125,
-127,169, 84,234,164,211,233, 32, 8, 66,150, 76, 38,187,150,148,148,180,186,164,164, 36,241,127,109,223,239,223,191,111,140,217,
-106, 84, 83, 34,145,224,193,131, 7,143,140, 48, 91, 33, 79,124,127,255,245,235,215,113,228,200, 17, 0, 64, 92, 92, 28,218,180,
-105, 99, 86,215, 23, 31, 63,126,108, 54,112,224,192,253, 0, 60, 26,210,140,136,136,240, 57,125,250, 52,130,130,130, 0, 0, 15,
- 30, 60,128,175,175,111,157, 27,115,253,250,117,102,202,148, 41, 62, 0, 50,254,134, 50,122, 30, 76, 86,205,245,159, 70, 43, 56,
- 56,152, 4, 6, 6, 82, 79, 62,174,131, 4, 79, 27, 89, 23,168,121, 0, 72, 48,118, 11, 98,178,177,126,211,190,243, 47,255, 26,
-180,165,191,137,148,198,202, 93, 75, 82,115, 11, 74,123,178, 84, 69,243, 11, 71, 64,219,152,203,110,173,157,222,201,179,176, 76,
-141, 83,191,167, 95,141,206, 49, 46, 68, 26,157,137,139,128, 96, 93,241,140,135, 90,149,227, 59,253,203,139,135, 14,125,240,114,
-199,197,163, 59,226,228,205,164,197, 0,215,232,168,239, 68, 16, 64, 4,174,186,243,123,229,173, 3, 32,212,158,192, 87, 0,169,
-120, 77, 48, 46, 92, 48, 0, 96, 11, 29, 49,220, 66, 33,219, 60,111,222, 28, 75,125,238, 67, 20,104,165, 72, 45, 84, 35, 75, 37,
- 65, 25,235,136,244,216, 8,158,166,112,177,209,144, 11,133, 18,194,169,173,109,100,230,116,192,144, 5,110, 37,231,150, 21,202,
- 40,142,177, 28,251,153,117,222,175,223, 36,113,202, 92, 37, 69,161,209,225,231,173,172,172,219,168,243,147,152,226,194, 60, 88,
- 59,183,199,203,175, 6,226,147,145,237, 80, 90,162, 68,110,193, 45,210,218,197,146, 74,190,118, 0,203,135,251, 35, 63, 59, 19,
- 26, 61, 64, 41, 53, 5,106,173,186,172,222,227, 72, 99,199,219,239, 46,157,236,229,226, 96, 86,149, 84, 64, 4, 30,157,252, 91,
- 98, 72,255, 30,184,120,253, 6,254,136,136,131, 80,153, 84, 64, 4, 1,105, 57,133,217,106, 29,191,199,168, 3,202,115, 32,122,
-117,157, 70, 12, 77,104, 50, 12,112,132,130, 7, 62,238,230, 99, 49,251,131, 64, 47, 11, 51, 57, 5,181,158,135, 90,171, 71,233,
-141,205,176,107,209, 1, 10, 19, 19,170, 11, 84,236, 29, 60,125,108, 43,167, 70, 95,145,152, 89,228,130,178, 44, 76, 25,210,254,
-173,189,107,223, 48,163, 76, 42, 78, 77, 61, 95, 59,146,117, 99, 85,183,243, 83, 62, 61,113,233,200,209, 73,174, 95,190, 55,109,
-224,176,119,246, 92, 2,112,174,174,109,211,106,181, 40, 46, 46,198, 59,239,188,131,237,219,183, 99,249,242,229,213,199,143,227,
- 56,240, 60, 95, 61, 47,229,207, 63,255,140,248,248,248, 39, 77,150,136,200, 95,202,248,241,227, 77,178,179,179, 47,123,120,120,
-180, 27, 50,100,136,162, 95,191,126, 80, 42,149,184,112,225, 2,148, 74,165,151,135,135,135,215,133, 11, 23,198,165,164,164, 68,
-187,187,187, 15, 12, 10, 10, 50,184, 15,109,165, 1, 98,170, 47,193, 0, 71, 85,100,136, 48,168,200,253, 16,208,140,121,110,101,
- 50, 89,213,148, 89,207, 52,178,149,158,158,254,168, 41,145,173,178,178, 50,169,155,155, 27, 28, 28, 28,192,243, 60,148, 74, 37,
- 78,156, 56,129,226,226, 98, 8,130, 0, 83, 83, 83,124,246,245, 46,196,222,185,140,208,208, 80, 20, 23, 23, 75, 27,211, 76, 75,
- 75,163, 58,117,234, 4,141, 70, 3,142,227,160, 86,171, 17, 18, 18, 82,253,156,101, 89, 44,253,116, 3,226,194, 46,227,238,221,
-187, 72, 75, 75,251, 91,102, 27, 49,194,139,252, 47, 82,239,152, 89,127,123,214, 33,207,115, 31,238,220,123,232,214,135,243, 39,
- 98,225,164,193, 30,171,183, 28, 31, 28,147,135,189, 0,224,111,143,233,175, 13,106,237,105,173,144,224,147,159,194, 0, 66, 62,
-108,238,239, 69, 21, 32,174,157,147,176,248,231,208,228,203,203, 38,118, 65, 75, 23,203, 54,133,178, 2, 89, 66,130, 1,115, 10,
- 10, 28,108,204,229,126, 35, 58,217,157,131, 32,192,218, 66,222, 22, 60, 7,107,115,185,223,203,237, 45,127, 1, 0, 75,133,164,
-109, 93,145,175,250,232,234, 33,153,171,144,179,115,205, 44,172, 61,103,140, 26, 98, 58, 98,212, 56, 83,115, 9,135,252,208, 11,
- 40,145,184, 67,111,235, 5,141,190, 0,105,137,241,252,175,183, 99,210,243, 74, 53, 75, 26,221, 76,130,171,233,137, 15, 28,124,
- 58, 14,177,201, 11, 94,158,227, 51,243, 39,111, 26, 2, 93,122, 96,108,182,153, 99,119,211,223, 19, 18,203, 4, 82,103, 68,167,
- 22, 37,197,197, 73,122, 30, 46, 42,158,181,136,191,244, 35, 62, 24,222, 1,133, 5, 57, 80,235, 56, 20,171, 56,157,179,181,137,
- 92,147, 24, 9,141,142,131, 86, 47, 64, 98,237,134, 11,183, 34,242, 4,189,254,151,250, 52, 19,242,113, 55,225,196, 93,243,154,
-175,181,180, 71,167,247, 45, 77,239, 66,175, 66,114, 90, 6,246,158,185,213, 37, 33, 31,119,155, 83,206, 68,224, 42,154,159,107,
- 68,178, 40,130,126, 77,233, 4,223,214, 17,221,165, 38,210,239,190, 88, 60,165, 93, 47, 95, 91,185,144,118, 11,148,160,131, 25,
-207, 66, 37,227, 97,229,209, 18,130,182,148,148,171,213, 69, 81, 64, 67,133,207, 0, 0,209, 41,241,229,180,246,102,148, 77, 75,
-240, 9,231,192,118,158, 11,189, 0,196,231, 11, 0, 16,161,187,244, 81,108,239,119, 79, 15,248,244,226,160,152,140, 51, 43, 99,
-220,198,111,238, 4,236,105,209,208, 54,230,228,228,128,101, 89,204,155, 55, 15,190,190,190, 32,132,160, 77,155, 54, 24, 58,116,
- 40,126,249,229, 23,196,197,197, 65,169, 84,226,246,237,219,200,204,204, 20,107,126,145,191, 13, 63, 63, 63,231,244,244,244,168,
-119,223,125,215,118,236,216,177,248,249,231,159, 81, 82, 82,130, 61,123,246, 96,227,198,141, 88,181,106, 21,244,122, 61,118,238,
-220,169, 56,118,236, 88,247,173, 91,183,166,121,122,122,182, 79, 73, 73,201,106,196, 96, 81, 0,228, 0, 36,149,117, 23, 5, 64,
- 56,123,246, 44, 70,140, 24,129,179,103,207, 10,149,175,241,168,184,249,105,210,220,159, 50,153, 12, 50,153, 12,197,197,197,207,
-196,108, 73, 36, 18,152,155,155, 67, 38,147,161,180,180,212,104,179,197,113, 28,147,150,150,134,226,226, 98, 12, 25, 53, 10, 27,
-214,174,197,160, 65,131, 48,100,200, 16, 16, 66, 16, 18, 18,130,193,125, 2, 48,241, 63, 3, 17, 19, 19, 3,142,227, 12,218,222,
-172,172, 44,100,103,103,227,229, 81,163,176,107,235, 86,244,232,209, 3,126,126,126,224, 56, 14,151, 47, 95,198,248, 97,125, 96,
- 50,102, 48,226,226,226,196,147,218,240,104,214, 51,233,163,213,108,162,114,113, 91, 56,121, 37,120,210,176,238,129,163,250,182,
-195,174,195,191,126, 14,135,146, 67, 0, 96,167,145,127, 54,109, 80, 75, 68,167, 20,226,215,187, 25,193, 49,121,120, 38,217, 26,
- 2, 15,123, 59, 75, 5,192,200,160,210, 9,156,101, 66,227, 29,152, 5, 66,160,232,255, 62, 94, 27, 21,237,209,163,157,135, 71,
- 85,214,161,249,136,111, 48, 61,226,145,103, 55, 63,103, 79,240,122,128,215,195,114,226, 79,192,167,102,141,110, 71, 31,111,217,
-197,183, 23, 45,234, 61,124,204,171,166, 50,133, 21,248,146, 84,232,179, 34,144,255,240, 42,148,138, 54,200, 74, 78,192,145,243,
-161,197, 15,211,242, 75,104, 26, 23,178,139, 53,239, 37, 20,162,172, 49, 93,181, 30,107, 87, 44, 95, 50,242,200,161,195, 22,242,
-150,125,169,248,205, 35,138,101, 44, 39,119,240,126,129, 46, 55,177, 39,107,246, 28,182, 84,106,177,174, 49,157,114,101,201,241,
-144, 11,231, 38,182,246,233,107,241,248,143, 51, 80,169, 53,208,232,129,246,221, 7,130,231,137,140,162, 41,193,146, 97,168,156,
-252, 66, 80,122, 62,251,218,189,199,153,215,239, 37, 48, 26, 11,172,107,112,116,145, 39,221, 61,197,188, 53,106, 96,103, 64,175,
-194,127,250,119,192,134, 3,191,190, 9,240, 51,155, 87,200, 21, 17, 45, 2,244,109,231,128,237,132,160,111,216,137,141,109,187,
-142,121, 27,198, 68,180,218,219, 99,184,191,143,235,143, 27, 62,123,223,214,206,189, 13, 67, 9,122, 16,231,142, 64, 73, 26,161,
-210,110,193,202,173, 7,120,215, 62,216,249,237, 87,101,130, 64, 14,161,158,161, 45,248,202, 51, 76, 72,185, 2, 62,246,103, 36,
- 36, 36,192,222, 43, 12,160,104,144, 22,143,161,227, 8, 52, 58, 2, 0,103, 54,237, 57, 61,232,189, 23,215,182, 31,213,150,245,
-188,117, 47, 62,231,213, 89,174,138,158,158,140,111,116,166, 25,157,167, 84,214,123,174,102,100,100, 32, 35, 35, 3, 57, 57, 57,
- 40, 42, 42,194,144, 33, 67, 48,120,240, 96,220,185,115, 7,215,174, 93,131, 92, 46,135, 78,167,131,179,179, 51, 40,138,130, 78,
-167, 67,126,126,190,120, 57, 20,249, 75, 81,171,213,199,215,175, 95,111, 27, 24, 24, 88, 21,145,193,173, 91,183,176,123,247,110,
-152,153,213,190, 78,142, 24, 49, 2,132, 16,219,149, 43, 87, 30, 7,208,171, 62,205,222,189,123,143,186,123,247,110, 70,231,206,
-157, 19, 42,205,150, 20, 0, 29, 25, 25, 73,167,166,166, 82, 54, 54, 54,196,213,213, 85,159,145,145, 33, 0,224,103,205,154,197,
- 28, 61,122,180,181, 82,169,188,210, 84,163, 37,147,201,158, 73,159, 45,137, 68, 2,138,162, 32,147,201, 32,149, 74, 65, 8, 49,
-202,108,241, 60,207,158, 61,123, 22, 97, 97, 97, 88,213,185, 51, 22,187,185,193,214,214, 22,151, 47, 95, 6, 33, 4,102,102,102,
- 40, 40, 40,192,161, 67,135,240,226,139, 47,130,227, 56,169, 33,186, 65, 65, 65, 8, 15, 15,199,167, 93,187, 98,177,149, 21,204,
-205,205, 17, 18, 82,209, 26, 40,151,203,145,156,156,140,144,144, 16, 12, 28, 56, 80, 60,169,155,137,193, 39,207, 0,128, 45,160,
-224,172,211,170, 64, 56, 2, 80,112,245,247,135, 52, 38,166,118,231, 28, 67,160,105, 44,255,118,111,240,200,111,222, 30, 69,205,
- 29,221,197,117,245,143,151, 94, 7,128,217,175,248,186, 41,228, 44, 54,157,140, 38, 52,141,229,207, 98, 7,253,253, 33,165,242,
-241,250,144, 30,126,200, 40,210, 34, 62,163,232,183, 24,192,160, 89,156,127,253,230, 53,236, 59,117, 57,117,227, 62,117, 44, 33,
- 4,214,230,114,191,233,247,227, 61,127, 60, 27,158,242,245, 17,117, 44, 17, 8,172, 21,146,182, 51, 99,250, 52,154,117,216,213,
- 67, 50,247,157, 37, 75,250,140,158,249,174, 9, 23,123, 20,218,248,243, 16,116, 42,148,232,164, 40, 98,156,145,150,146,130, 53,
- 59,131, 83, 75,148,218,137, 81,185,198, 25,204,135,249, 40, 99,169,146,177,107, 62, 89,118,113,237,103, 43,205, 85, 9,151,203,
- 24,138, 83, 49, 45, 6,176,159,173,250,134, 42,213,104, 95, 77, 40, 68,105, 99, 58, 26, 11,172, 91,255,245,183, 35,231, 76, 29,
- 23,235,219,102,128, 29,159,145,104,167, 46, 41,201,249,233, 92,184,115,229,157, 34, 5, 0,241,105,249,200, 45, 86,114, 60,167,
-191, 98, 33,193,234,104, 67,162,131,149,248, 56,194, 33,176,111,251, 41, 14, 22, 82,168,202,138,224,104, 33,193,176, 30,173,166,
-232,127,143,123, 63, 49,199, 24,187,246,164,209,210,131,232, 85,184,189,238,197,182,132,215,183, 5,175,135,238,254,126,227, 35,
- 99, 20, 22, 47,236,111,110,105,163,125, 76, 67,105, 6,152,218,131,178,244, 2,172,188, 41,137,255,171,200, 72,136,226,222,156,
- 50, 53, 63, 49, 41,237,123,123,211,250,155,181,245,149, 77,201, 66,210,101,148,101,199, 35, 50, 67,135,246, 57, 21,173,237,150,
-217,119,192, 63,195,142,233,197,197,197,232,221,187, 55, 94,127,253,117,112, 28,135,209,163, 71, 35, 53, 53, 21,143, 31, 63,134,
-171,171, 43,102,205,154, 5, 59, 59, 59, 44, 89,178, 68,188,226,137,252,229, 36, 39, 39, 79,251,240,195, 15,175,247,232,209,195,
-201,222,222, 30, 29, 58,116,192,169, 83,167,240,238,187,239, 86,127,166,115,231,206, 32,132,160,160,160, 0,235,215,175,207,202,
-200,200,152,214,224, 13,122, 84, 84,236,190,125,251,250,183,107,215, 78, 39,149, 74,139, 0,200,139,138,138, 76, 10, 10, 10, 40,
-181, 90, 13, 65, 16, 4, 43, 43, 43, 62, 35, 35, 67, 63,113,226, 68,205,205,155, 55, 91, 41,149,202,228,230, 68,180, 60, 60, 60,
- 34,243,243,243,139, 41,138,106,246,208, 15, 85, 38,203,222,222,222,161,172,172, 76, 0, 80,216,148,161, 31, 56,142, 67,215,174,
- 93,113,254,234, 29,156,253,245, 38, 74, 50, 30,224,245, 57,211,208,161, 67, 7,156, 63,127,190,201,101,214,169, 83, 39,156, 11,
-185,142,235, 97,247,144, 28,119, 31,111,190, 62, 7,237,219,183,199,185,115,231,196, 19,218,112,206,160,118,223,172, 51, 79, 26,
-173,129,193,193,193, 85,151,254,167,236,107, 91,123,116,146, 88,203,246,175, 28,222,202, 95, 50,100, 37, 40,137, 41,142,182, 57,
-215,103,249,154,205,177,140, 99,242,212,200,156,198,179,195,106,253,105,114, 16, 69, 66, 99, 15,222,139,105, 59,229, 63, 61, 60,
-176,235,148,226, 99, 0,120,181,159, 15,126,127,152,139,208,184,156,131,209,185,136,106,238, 94, 7, 56, 66,193,231,225,224,250,
-183, 70, 15,244,114,119,198,238,159,175,131,162,112,220,160, 10,151, 16,210,163,157, 23, 54,238,123, 50,195,208,217,243,235, 35,
-234,216, 11, 81,165,195, 1, 96, 72, 91,197, 47,221, 90,217,120, 18,210,112, 78,151,169,140,157, 55,124,220,107, 38, 92,220, 41,
- 32, 41, 4, 20,167,129, 74, 39, 32, 51,175, 20,229, 86, 30,184,124,235,158,170, 88,173,125, 59, 58,183,105, 81,188,152, 60, 36,
- 72,255,184,151, 82,166, 84,185, 40, 28, 90,169, 25, 90, 16,202, 52, 4,191, 71, 39,149, 68,103,225,129, 33, 26, 9, 9,208,246,
-116,227,250,109,223,123,100,133, 68, 42,123,149,161, 64, 57, 90,155, 57,108,255,230, 83, 88, 88,152, 67,208,150, 1,202, 92,140,
-125, 99, 77,110,100,134,222, 7, 0,218,216,193,188,159,143,100, 47, 75, 83,105,151,226,117, 31, 53,246, 27,148, 30,243,167, 14,
-235, 44, 17,180, 74,188,181,254, 48,118,188, 63, 26,175,189,228, 47, 57,115, 35,110, 62,128,213, 77, 45,107,194,115, 32,122, 21,
-122, 45,187, 26, 75, 1,215, 9,208, 55,236,200,103,109,129, 59, 6,107,116, 1, 36, 60, 75,249,119,244, 52,147, 10,105, 55, 32,
-164,221, 32,140, 71, 31, 80,158,253, 41,202,185, 43,249,238,139, 85,202, 93,187,118, 95, 16,104,124,210,216, 80, 25, 85, 17,173,
-188,184,235,208,106,181,208,243,128, 90,173,134, 82,169,132, 89,252, 57,232,121, 64, 42,161, 0,224,229, 69, 51, 70,117, 34,101,
- 25,229,167, 99,185,148,221,115,218,246, 34,101, 25,229,183, 83,248,184, 60,165,166,209,200,171,155,155, 27,166, 79,159,142, 9,
- 19, 38, 84, 71, 14,250,244,233,131, 47,190,248, 2, 87,175, 94, 69,183,110,221, 32,145, 72,112,249,242,101,112,156, 56,247,180,
-200,223, 66, 66, 70, 70,198,203, 35, 70,140,248,245,252,249,243,182, 1, 1, 1, 0,128,176,176,176,138,155,206,174, 93,225,235,
-235,139,236,236,108, 76,154, 52, 41, 47, 51, 51,243,101, 52,210,231,183,180,180, 52, 49, 40, 40,200, 73,169, 84,118,254,232,163,
-143,114,188,188,188, 74,212,106, 53, 85, 84, 84, 36,112, 28, 7, 27, 27, 27, 89,231,206,157,209,187,119,239,178, 91,183,110,181,
- 72, 77, 77, 45, 5,144,212,148,141, 31, 61,122, 52,174, 94,173, 72,218,123, 22,227,106, 73,165, 82, 4, 4, 4,184, 37, 36, 36,
-164, 87,214, 45, 70, 95,227,107, 86, 47,247,238,221,195,149, 59,105, 96,181, 42,200,114, 51,112,251,231, 32,140,154,183,160, 89,
-255,239,123,247,238,225, 68,200,109,152,201, 89, 60,120, 16,133,160,160,160,234, 27,183,191,153, 6,189,200,255, 56,153,168,167,
-159, 22, 11, 0,129,129,129, 87,170,162, 21, 53,105,217, 18, 50,121, 25, 86, 14,233,226,182,244,213,190,173, 24,125, 73, 6, 4,
- 94, 0, 35, 1, 28,237, 45,177,127,255, 65,159,131,135, 15,223,218,186,101,235,183, 2,199, 45,143,204,129, 49, 61,110, 87,126,
-115,248,250,171,251,151, 12,100, 95, 31,222,214, 22, 0,164, 44,141, 77,167,162, 56, 0, 43,155,179,183, 61,221, 96, 82,166,199,
- 92, 71, 59,171,143, 63,252,239, 72,219,129, 93,125,113, 37, 52, 18,223, 6,221,186, 42,203,193, 62,131, 79,110, 65,143, 39,253,
- 83, 93, 89,135, 16, 26,239,119,201,243,196, 89,106,102, 3, 93,210, 37, 64,167,134, 90,163, 67,106, 62,143,212, 2, 53, 88,133,
- 20, 97,113,105, 42,187, 44, 4, 55, 99,183, 41, 51,133,137,235,138,207,191,118, 87,171,202,184,146,194, 60, 78, 42,187, 45, 81,
-152,202, 51,141,233,170,112, 59, 29,234,254,222,146, 23, 0,129,145,153,144,242,101,239,204, 48, 75,143, 62,143,214,116, 6, 40,
- 66, 96,234, 63, 18, 22,166,140,180,111, 11, 73, 10, 0,152,153, 41,100,235, 63,121,215,234,237,247, 63,105,180, 15,152, 63, 32,
-245,109,233,252,118,128,151, 13,174,134,199,226,106, 68,114,212,213,176, 7,237, 7,117,112,133,175,187,245, 34, 89, 97,209,186,
- 24, 24, 31, 33,173, 40, 24, 14,208,171,171,179, 14,253, 29, 49,185,219,171, 31,213,151,109, 88, 39,222,128, 16,199, 19, 80, 12,
- 3, 80,116, 69, 6,100,234, 13,176,214, 45,201,193, 35, 39,202,119,239,222,247,105, 76,158, 97,201, 25,250,138, 83,130, 47, 41,
- 41,129,153,153, 25,206,197,113,154,215,134, 73,229, 52, 77, 35, 53,238, 78, 69,103,120, 91, 26, 0,218, 73, 7,125,214,246,198,
-170,110,231, 45,100,148,220,117,228, 39,254, 92,196,190, 52, 67, 42, 9,127,127,127,248,248,248, 96,194,132, 9, 72, 72, 72,192,
-218,181,107,145,153,153,137,243,231,207,227,245,215, 95, 71,159, 62,125,144,159,159,143, 31,127,252, 17, 97, 97, 97,200,202,202,
- 18, 45,128,200,223, 66,113,113,241,253,152,152,152, 97, 29, 59,118,220,243,214, 91,111, 89, 76,157, 58,213,117,206,156, 57, 52,
- 0,100,103,103, 11, 27, 55,110,204,248,238,187,239,138,243,242,242,102,234,245,250, 8, 67,254,225,153,153,153, 55,191,255,254,
-251,220,107,215,174,181,239,222,189,187,252,133, 23, 94, 16,108,108,108, 88,185, 92,206,107,181, 90,117, 92, 92, 28,159,144,144,
-224, 82, 84, 84,244, 8, 64, 60,154, 48, 99, 69,101,244,106, 53,195, 48, 43, 8, 33, 1,207,162,143,150, 66,161,112, 5,240,136,
-162,168,214,198, 54, 27, 62, 85, 97,179, 44, 10, 11, 11, 81,158, 21, 5,147,180,135,232,104, 70,163,157,141, 57, 44, 45, 45,155,
-101,138,138,139,139, 1,101, 58,174, 95,191, 7,112, 28,172,172,172, 96,101,101,245,183, 27,173,250,188,200,191,132,185,117,188,
-214,112, 31,173,118, 14,120,221, 84,139,141,243, 70,182,146,122,123,186, 67,147, 22,134,123,169,101, 88,222,179,123, 52, 35,183,
- 80,207,155, 54,186,235,184,241, 45, 48,176,119, 55,202,219,197,106,209,186,111,182,189,209, 14,121,239, 70,231, 96,147, 33, 91,
- 20,157,139, 68, 1, 57,187, 47,221, 79,155,239,174, 80, 65, 16, 8, 46, 69,100, 34, 34,169,112,119,108, 46, 18,141,217,187,118,
- 46, 24,204,130, 62, 76, 8, 49,177, 50, 51, 43,109,231,235,110, 63,184, 87, 39,250,229, 1, 93, 33,101,128,235,191,223,195,226,
-111,142,223, 22, 4, 50,242,142,129,205,134, 21, 25,134,181, 13, 84, 69,134,161,190, 86,134, 33, 33,132, 84,100, 29, 54, 28,124,
- 96, 24, 42,171, 60,249, 15,103,137, 93, 27,168,226, 47, 33,169, 80, 64,114, 78, 41, 74, 88,103,104,210,211, 1, 34,164, 92,105,
-184, 99,117,131,216,219,219, 59,250,180,243,109,181,121,111, 16,116,229,197, 72,188,188, 7,101,133,153,248,108,251,169, 86,110,
-110,118, 3,210,211,211,175, 24,113,177,241,253, 53,248,160, 35, 8,192, 72,228, 56,179,245, 8,242,236, 76, 97,175,144, 66, 80,
-229, 98,222,219, 83,173,134, 15,153,106, 5, 0,201, 15,238,194, 75,161, 50, 72, 87,103,135,113,175, 14,242,179,134, 94,133,189,
-231,238,170,105,224,229,125, 23,162,226, 7,181,181, 54,121,181,175,151,205,234,140,162, 87,144,223,180, 65, 69,171, 34, 90,213,
- 17,190, 38,100, 27, 6, 1,124, 91, 1,241,135,111,230,152,141, 31,242,130, 66,202, 82, 20, 41, 75, 7, 49,181,199,182,189, 71,
-203,100,122, 24, 60, 19,123,229,217,176,186,199,218,196, 21, 21,231, 9,246, 12, 95, 27,246,223,139, 31,247,116,200,202,202,130,
-142, 39, 72, 44, 16, 0,224,183,105, 67,218,241,105,197,130,246,194,186,177,227, 41, 83, 7,217,123, 95,238,187, 76,208,120,100,
-147,227, 56, 40, 20, 10, 16, 66, 16, 20, 20,132,228,228,100,228,231,231,131,231,121,188,247,222,123,240,243,243,195,131, 7, 15,
- 80, 90, 90,138,156,156, 28,136,136,252,157,168, 84,170,112,149, 74,213,225,189,247,222,155,188,108,217,178,254,102,102,102, 62,
- 0,160, 84, 42, 19,245,122,253,213,202,255,167, 49,217,129, 4,192,163,248,248,248,196,248,248,120,167, 3, 7, 14, 88, 3, 48,
-169,124, 79, 13,160, 8, 64, 54,154,145,113, 88,101,170, 40,138, 90,241,172,142, 67,149,169,162, 40,170,117, 83,190, 79,211, 52,
- 79, 81, 21, 99,231,201,229,114, 92,187,118, 13, 19, 70, 14, 65,204,153, 34, 4, 88,155,163,251,204,121, 56,124,241, 34, 24,134,
- 1, 69, 81, 96, 24,198,168,122,132,101, 89, 92,191,126, 29,175, 77, 26, 15, 57, 11, 88, 89, 89,225,189,247,222,195,201,147, 39,
-193,178,226, 44,125, 70,176,179,134,225, 50,112, 28, 45, 10,171, 47,238, 89, 35, 5,175,199,233, 61, 95, 33, 56,178, 76,251, 32,
- 23,203,253,114,177, 49, 8,165, 66,238, 55,251,230, 95,188, 30,249,229,172,137,129,138, 23, 7, 13,193,139, 3, 7,177,237,187,
- 13,248, 24,168,101,180, 6,163,129,177, 54,120, 1,159,238, 60, 23, 59,239,240,229, 56, 10,186, 82, 76, 28,218,141,240, 2, 62,
-109,100,103,158,210,180, 50, 53, 63,124,253,214, 45, 27,232,202,144,116,247, 55,147, 22, 62,173, 0, 94,135, 71,143, 30,226,187,
-189, 63, 11,151,127,127,176, 95,203,225,173,132, 66, 40, 13,213,172,168, 45, 57, 88,153,201,252, 94,110,111,249,139, 0, 2,107,
-133,180, 45, 17,120, 88, 43, 36,109,135,180, 85,252, 66, 8, 33, 22,166,146,182,132,215, 55,170,169,210,114, 59,246,254,176,251,
-235,217,179,103,155,229,165,101, 33,163, 36, 18,101, 50, 55,232, 21, 30,136,191,123, 85, 85,174,225, 12,169,196,235, 61,158,121,
-121,121, 57,225,161, 5, 56,188,125, 45,244, 90, 13,114,210, 42,188,106, 70, 94, 9, 44,237,221,110,165,167,167, 27,172,169,227,
-132,226,113, 83,231, 74, 77, 45, 96,250,218,184, 64, 89,124,190, 6, 93, 92, 45, 42, 46, 26,101,185,136, 9,185,142,129,149,125,
- 76, 19, 82,105,120,117,114, 53,104, 59, 45, 76,164,111, 13,127,193, 13,137, 41,153,184, 22,149,190, 55,177, 0, 25,124,108,230,
-222,248,140,162,249,163,123,122, 98,195,201,232, 55, 1,253, 65, 99,246,221,223, 17,147, 9, 65,223,138,206,240, 42, 16,160,175,
-191, 35, 38, 27,152,105,248,148, 38, 43,197,148,175,127, 73,254,232,232, 31,121,163,151, 78,233,103,217,187,247, 8, 25, 56, 45,
- 74, 85, 26,125, 76, 17, 74, 12,213, 44, 81, 9, 0,176,163,114, 1, 0,132,167, 9,251,251,173,188,117,245,224, 28, 15, 7,129,
- 0, 87,227, 53, 0,112,107, 86, 15,211, 91, 62,182,244,199,210, 65,159,249,221, 90,221,227,124, 68,166,112,224,106,124,245, 24,
- 90, 13,150, 59, 33, 4,122,189, 30,130, 32,192,214,214, 22,249,249,249,200,201,201, 65, 78, 78, 14,226,227,227,155,116, 46, 53,
- 3, 81, 83,212,124,234, 50, 15, 96,191, 94,175,223, 95, 84, 84,244, 44, 53, 51,240,244,184, 78,205,218,247,154,205,132,132, 16,
-182, 50,154,213, 88,103,248, 6, 53,107, 54, 19, 18, 66,206, 86, 70,179, 26,139,106,213,210, 20, 4, 33,163,107,215,174,182,163,
- 70,141, 2,207,243,120,248,240, 33,146, 83, 83, 49,120,254,155,176,182,182,198,213,251,247,241,224,193, 3,172, 88,177, 2,122,
-189, 30, 39, 78,156, 72,107, 76,147,101, 89, 93,171, 86,173,164, 99,198,140, 1,199,113, 72, 72, 72, 64,122,122, 58, 22, 47, 94,
- 12, 43, 43, 43,132,135,135, 87,107,230,229,229,129,101, 89, 93, 29,209,173,191,226, 92,250,183,243,148,201,106,216,104, 1, 60,
-120, 61,138, 47,174,196,166,107,208,233,244,104, 27,157,139,199,209,127, 70,164,182, 49,161,247, 79,223,143,140, 77, 12,191,241,
-162, 12, 57, 17, 48,246, 78,226, 97, 62, 50, 45, 76, 74, 75,161, 43,181, 68,194, 47,120,156, 93, 90,246, 48, 31, 70,231,162, 19,
-129,167,160, 43, 7, 50,195,112,243,234, 21, 92,190,125, 15,127, 68,196,242, 55,195,227, 14,211, 2, 62,141,201,199,195, 38,220,
-133,192,124,228, 6,204,136,120,228,217,205,215,201, 19, 60, 7, 34,232, 97, 53,241, 32,102, 70,247,246,236,214,210,218,179, 34,
-146,165,135,205,127,127, 3,190, 54,105, 80, 47, 44, 85,191, 83,118,242,252, 43,165, 69,249, 61, 95, 26,208,203,204,202,127, 56,
-242, 30,197,225,225,189,235,170,240,200,248,155, 97,169,250,157,205, 41, 93, 55, 55,183,254, 47, 13,240,195,196,121, 31, 66, 87,
- 94,140,132,203, 63,160,172, 32, 11,215,110,153, 35,182,164,164, 23, 0,131, 35, 90,183, 82,184,246, 72, 41, 68,159, 22,146, 20,
- 11,104,156,167, 5,142,130,156, 82, 67,208,148,128, 42,207, 67,124,186,182,248,149,237,169, 60, 0, 40,228, 20,107, 70,138, 45,
- 13,138, 60,122,217,181, 81, 48,122,236,187, 24, 5, 65,168,152,190, 73, 16,176,109,223,111,241,243, 63,125,173, 11,218,121,218,
-116,186,155,158, 67,193,136,144, 63, 69,208,239,143,195,159,180, 85,255,250, 49, 32,232,112,125,145,109,219,126,155, 10,250,161,
-137,211,237, 68,102, 32, 29,192,124,176,229, 59, 22,109, 58,247,113,215,139,209,125,151,252,119,180, 37,200, 51,201,208,141,139,
-206,226,251,247, 88,151,124, 94, 32,127,182,231,254, 25,217,242, 39, 25, 37,228,238,213,120, 77,132, 49,162, 28,199,129,136,195,
-190,139,136, 60,151,148,149,149,205,155, 57,115,230, 14,137, 68,226, 0,128, 18, 4, 1,130, 32,176, 95,126,249,165,132,231,121,
-154,166,105,158, 97, 24,238,236,217,179,122,158,231,115,213,106,245, 60, 3,174, 25,241, 11, 22, 44,104,213, 88,134,226,161, 67,
-135,170, 76, 86,188, 88, 18, 6,153,172,154,235,234, 40, 23,219, 64,144,246,147, 62,175,173, 92, 9,128, 2,193,170,232, 92, 60,
-126,242, 35, 17, 5,200,104,199,232, 22,183,239, 54, 96,101,213,119,140,221, 50, 53,207,143,239,214,193,247, 16, 0,104, 8,255,
- 90, 83,246,174, 68,163,122,181,115,183, 94,135, 5, 66, 88,142,144,221,180,128, 99,106, 14, 49,134,100,218,213, 71, 70, 78, 81,
-248,240, 0, 43, 2, 84, 52, 25, 86, 55, 23, 86, 14,227, 64, 8, 33,213,205,133, 95,153, 32,175, 88,211,232, 56, 80, 55, 30,107,
-135,104,185, 63,230, 94,184,113,119, 30,207, 19,103,134,161,178, 84, 90,110, 71,115, 77, 22, 0,164,167,167, 95, 9,185,152,126,
-225,126, 39,167,161,246,138,202, 40, 87, 57,144, 87,142, 11,233,185,101, 87,154,162, 89,168,212,143, 94,182,241,228, 41,153,132,
- 97, 65, 72,197,128,162,132, 64,173,227, 11,110,165,112,237, 1,160,131, 45, 92,223, 59,193, 29, 98, 24, 42,185, 49,189,208, 7,
-153, 27, 38,174, 11,121, 55, 42,169,112,119, 82, 17, 34, 1, 32,169, 8,145, 71,174, 63,254, 56, 62,171,244,221,200,228,194,175,
- 96,100,191, 10, 66,225, 90,183,137, 43,159,122,173,185,199, 51, 54, 19,247, 0,140, 5,210,134, 76, 92,242,221, 18,138,194,179,
-154,126, 34, 78,165, 35, 94, 53, 95,168,138,108, 85, 46, 6,163,213,106,161, 82,169,192,243, 60,116, 58, 29,180,226,188,134, 34,
- 34,207,140,170,168, 22, 77,211,171,159,161,230, 89,138,162, 70, 0,120,100,196,215, 66,203,202,202, 58, 60,227,221,203,231, 56,
-206,160,177, 94,196, 36, 26,131,217,249, 79,253,240, 96, 81,243,239,215,108,221,186, 53, 49,194,176,136,199,243, 95,172,217,162,
- 69, 11, 4, 6, 6,194,213,213, 85, 60,158,162,166,168,105,160, 38, 33,132,105,206, 82,143, 38,213,156, 69, 44,163,127, 61, 79,
-118,134,159, 91, 21,156,160,197, 99,243,252,241,232,209,163,234, 49,175, 68,158,111,146,146,146, 80, 86, 86,134,140, 12,113,190,
- 87, 17, 17, 67,161, 40,138,111,206, 82,143, 38,105,206, 34,150,202,115,107,184, 68,163, 37, 34,242,111,231,202,149, 43,226, 65,
- 16, 17, 17, 17,249,223, 49, 89,181,204, 22,133,111,195, 47,213, 0, 0, 32, 0, 73, 68, 65, 84,250,195,127,198,100, 19, 52, 37,
-132, 24, 34,106,138,154,162,166,168, 41,106,138,154,162,230,255, 59,205,198,180,159,139,108,198,191, 43, 73, 73,236, 15, 32,106,
-138,154,162,166,168, 41,106,138,154,162,230,243,142,216, 71, 75, 68, 68, 68, 68, 68, 68, 68,228,239, 70, 28,246, 85, 68, 68, 68,
- 68, 68, 68, 68,164,121, 52, 58,169,180,136,136,136,136,136,136,136,136, 72,211,104,120, 82,105, 17, 17, 17, 17, 17, 17, 17, 17,
-145, 38, 99,252,164,210, 34, 34, 34, 34, 34, 34, 34, 34, 34, 6,177, 83, 60, 4, 34, 34, 34, 34, 34, 34, 34, 34,127, 15,181,179,
- 14,131,131,131, 73,205,181,136,136,136,136,136,136,136,200,223,201,243,234, 69,196,166, 67, 17, 17, 17, 17, 17, 17, 17,145,230,
- 49, 87, 52, 90, 34, 34, 34, 34, 34, 34, 34, 34,127, 13,245,246,209,170, 26,176,116, 96,101,168,110,160,120,172, 68, 68, 68, 68,
- 68, 68, 68,254, 1,158,111, 47, 34,246,207, 18, 17, 17, 17, 17, 17, 17, 17,189,200,179,161,170, 51,188,136,136,136,136,136,136,
-136,136, 72,243, 16,231, 58, 20, 17, 17, 17, 17, 17, 17, 17,249,155, 13,215, 95,110,180,196,153,205, 69, 77, 81, 83,212, 20, 53,
- 69, 77, 81, 83,212,252,255,100,178,106,153, 45, 49,235, 80, 68, 68, 68, 68, 68, 68, 68,164,121, 52,154,117, 40, 34, 34, 34, 34,
- 34, 34, 34, 34,210, 52,230, 2, 8,172,124, 28,136, 26, 81, 45, 49,162, 37, 34, 34, 34, 34, 34, 34, 34,210, 60,118, 2,112,169,
- 52, 88,103, 0,100,138, 70, 75, 68, 68, 68, 68, 68, 68, 68,228,217, 80,179, 95,214,200, 26,230, 75, 52, 90, 34, 34, 34, 34, 34,
- 34, 34, 34,205,164,222, 62, 90, 20,234,207, 28, 8, 49,226, 7,154,146,125, 16, 34,106,138,154,162,166,168, 41,106,138,154,162,
-230,255, 59,205,198,180, 67,240,239,227,169, 97, 29, 8, 33, 59,255,142, 31, 22, 83, 95, 69, 77, 81, 83,212, 20, 53, 69, 77, 81,
- 83,212,252,127,199, 95, 54, 96,105, 23,192, 84, 60,188,207, 37, 78,149,139,136,136,136,136,136,136, 72,195,252, 53, 89,135,254,
-192,127,167, 6, 56,108,215, 71,230, 90, 70, 2,229, 13,125,214,193,193, 97,135, 66,161,152, 90, 94, 94,174,164, 40, 74,168,233,
- 0, 1,212,156, 28, 40, 33, 55, 55,183, 95, 99,191, 45,147,201, 54, 58, 57, 57,253,183,172,172,172,156,162, 40, 66, 81, 20, 40,
-138, 2,128,167,214, 60,207,167,229,231,231,119,253,151, 91,101,198,222,201,233,119, 9,195,184, 25,251, 85, 94, 16, 30,231,100,
-103,247, 50,226, 43,107, 41, 10, 75, 43,126, 22, 95, 0,248,240,185,187,243, 0, 24, 67, 62, 23, 0, 88,196, 1, 19,121,154,126,
- 83, 2,108,209, 8,194,118, 0,160, 0,190,169,191,173, 9, 69, 43,138,160, 19, 69,193,138, 16, 20, 19, 10,247,228, 61, 16,255,
- 15, 29,138,113, 18,137,100,180,165,165,165,121,126,126,254, 21, 0,135, 0, 76,178,179,179, 27, 80, 82, 82, 82,166,215,235, 79,
- 2, 56,222, 20,225,126,157,240,190, 76, 42,153,165,214,233,215,223,184,135, 31, 6,116,129, 29, 39, 96,157,137,148,237,167,209,
-114, 95, 92,191,143,221, 70, 74, 82,149, 75,213, 53,195,232, 73,197,142, 26, 88,238, 0,112,194,198,198, 87,238, 96,249,171, 68,
-198, 60, 46,202, 46,155, 58, 62, 39, 39,117, 66, 51,202,253,127, 17,123,123,251, 25, 52, 77,127, 78, 8, 1,207,243,203, 11, 10,
- 10,246, 60, 35,233,229, 0,172, 43, 31, 23, 1,248,188,153,122,201, 0, 60, 43, 31,167, 0,240, 18,235,245, 38,179,237,231,159,
-127,158, 63,104,208, 32,108,216,176, 1,219,182,109, 75,202,205,205, 93, 7, 96, 47, 0,237, 63,160, 35, 82, 31,237,128, 17, 95,
- 14,235,193,235,127,252, 84,168,241,242,224,122,254,204,223, 79,155, 54, 77, 71, 8, 33, 15, 30, 60, 32, 90,173,150,232,245,122,
-194,113, 28,225, 56,142,232,245,250,234,197,205,205, 45,253,137,175, 63,165, 73,211,244,166, 87, 94,121,165,148, 16, 66,194,194,
-194,136, 74,165, 34, 26,141,134,104,181, 90,162, 86,171,137, 74,165,170,181, 56, 57, 57,101, 55,164,105,105,105, 25,102, 99, 99,
-147,109, 99, 99,147,109,107,107,155,109,107,107,155,109,103,103, 87,189,216,219,219, 87, 47, 14, 14, 14,217, 14, 14, 14,217,182,
-182,182, 97,141,109,103, 37,195, 0, 92, 49, 96, 25, 86,199,119, 7,215, 52, 90, 46, 46, 46,217,164, 9,184,187,187,167, 26,176,
-157, 85, 56, 81, 20,248,170,239, 82, 20, 4,185, 92,238, 89,243,125, 60, 29,233,106, 52,164,236,234,234,250,138,139,139, 75,136,
-139,139,203, 69, 87, 87,215, 87, 12, 56,197,106,105, 90, 88, 88,132,217,219,219,103, 59, 59, 59,231, 84, 45, 46, 46, 46,181, 22,
- 87, 87,215,234,197,201,201, 41,219,198,198,166,222, 50, 34, 0, 83,223,114, 25, 96,229,192,139, 44,195, 4, 59, 57, 57,149, 68,
- 68, 68,240,132, 16, 66,211,116,122,213,103,140,217,247, 39, 77, 86,249,117, 44,207,187, 36, 15, 45,123,188,174, 56,239,146, 60,
-180,252, 58,150,107, 66,209,170,169,154, 6, 82,151,230,244,233,211,167,223,203,206,206, 78, 47, 42, 42,202,220,190,125,123,156,
-137,137,201,245,237,219,183,199, 21, 21, 21,101,102,103,103,167, 79,159, 62,253, 30,128, 5, 70,104, 2, 0,122,117, 66,207,217,
-227, 92,202,239,157,120,173,252,197,110,236,221, 62, 1, 8, 28,210, 75,154,190,249, 3,255,242,171,187,250,150, 15,122,129,142,
- 52, 82,147, 98, 89,182,183,167,167,231, 44, 7, 7,135,105,149,203,107, 85,139,179,179,243,107,206,206,206,175,217,216,216, 76,
-104, 72,243, 40,192, 24,178,120,152,152,244,158,224,227, 89,158,188,122, 21,137,120,251, 77, 50,171,165, 71,201,120, 71,199, 22,
-255, 64, 25,253,165,154,142,142,142, 25,122,189,158,232,116, 58, 98,103,103,151,241, 12,183,243, 43, 66,200, 87,132,144,175, 0,
-124,245, 12, 52,171,175,103, 70, 24,236,134, 52, 77, 88,154, 94,162,144,201, 46,202, 89, 54, 71,206,178, 57, 10,153,236, 34, 75,
-211,239, 2, 48,249, 95, 42,163,191, 64,211,220,193,193, 33,113,227,198,141,164,188,188,156,148,151,151,147,141, 27, 55, 18, 7,
- 7,135, 68, 0,230, 70,104, 54, 85,231,121,138, 96,213, 90,170,154, 14,159, 73, 68,203, 31,232,250, 98,167,214,199, 22,205,152,
- 8, 33,104, 35,213,200, 29,211,247,189,186,118,157,181,119,239, 94, 0,192,212,209,163, 49,180,123,119, 88,152,155, 65, 38,171,
-216, 28,138, 80,144, 74,164, 24,179,248, 29, 67,126,254,139, 49, 99,198, 76, 9, 10, 10, 50, 7,128,109,219,182, 97,220,184,113,
-176,181,181,133, 66,161,128, 84, 42,133, 68, 34,169,181,110, 12,134, 97,220,211,211,211, 29, 77, 76, 76,170,163,108,130, 32,212,
- 90,106,206,202,205,113, 28,218,180,105, 99,232,225,250,160,184,184,184,191, 82,169,172,214,168,107,241,241,241, 1,128,243,134,
- 8,126,254,217,167, 16, 56, 37, 88, 22,224, 56, 64,163,163, 33,144, 58,205, 13, 22, 44, 88,208,172,217,196, 71,142, 12,164, 40,
-138, 10, 10, 15, 15, 63,150,147,147,227, 45, 8,252,156, 38, 70,186,222,120,248,240,161, 57, 0,248,250,250, 46, 0,112,204,152,
-237, 96, 89,214,253,254,253,251,142,114,185,188,222,200,101,141, 8, 38,116, 58, 29,186,116,233,194, 25,243, 27, 78,128,103, 1,
- 77,207,233,252,194, 11,115, 87,142, 25, 99,242,251,239,191,155,208, 52, 13,142,227,240,229,151, 95,114,132, 16,235,118,128,101,
- 52, 80,210,128,204, 50, 0, 51, 42, 43,131,221, 0,190,172,229, 22, 8, 58,169,244,242,192,132,178, 49,221,123,180,120, 31,209,
- 81, 17,221, 91,154,159,128, 5,171,137, 7,254,222,168,150,165,165,229,232, 13, 27, 54, 56,236,222,189,187,228,193,131, 7,186,
-237,219,183, 59,204,155, 55,207, 66,167,211, 97,254,252,249,185,126,126,126,210, 13, 27, 54, 56, 28, 63,126,252, 69,165, 82,185,
-213,168,242,162,240,233,164,209, 67,161,214,211,208,235, 57, 7, 23, 7,139,253,139,166, 15,148, 16,162,197,190,147,225,208,115,
-194, 15, 70, 70,178,122,141, 31, 63,190,229,193,131, 7,217,216,216, 88,182,109,219,182, 16, 4, 1, 60,207, 67,175,215, 3, 0,
- 4, 65, 64,235,214,173,155,125, 92,102, 1,190,246, 78,182, 23,123,141, 24,110,234, 98, 34,135,109, 97, 46,102, 75, 89,139, 61,
- 10,205, 1, 0,189,159,171,200, 46, 33, 96, 89, 22,169,169,169,112,116,116, 52, 21, 4, 33, 19,192,170,194,194,194,157,120,126,
-233, 46, 99,217, 99,251,126,216,228,220,163,119,111,198,201,197, 17,113, 15, 83,192, 82,252,224,251,127,132, 15,156,245,250,146,
- 69, 90,142,123, 5,192,239,207,219,142, 59,247, 94, 48,150,162,153,109, 20, 17,240,201,230, 83,165,107,191,216,168,152, 63,103,
- 58,179,120,241, 98,120,120,120,120,143, 29, 59,246, 11, 0,175, 55,170,211, 99,193, 88, 48,244, 54, 16,130,149,223,157, 42, 93,
-243,197, 70,197,235, 77,208,249,151, 83,239,127,164,217, 70,203, 31,104,217,222,195,241,194,218,165,175, 75,200, 47, 63,210,229,
-249, 57,245,126,214,193,193, 97,199,203, 47,191, 60,117,207,158, 63,163,209,189, 2, 2, 48,246,197,190,112,180,179,130,194, 76,
- 86, 81, 29, 9, 20,238, 61,120,108,144, 33,240,240,240,152,127,236,216, 49,243,154,102, 66, 42,149, 86, 47, 53, 77, 86,213, 82,
- 85, 1, 55,132,137,137, 9, 66, 66, 66,192,178, 44, 24,134, 1,203,178,213, 75,205,231, 12,195,192,201,201,168,174, 75,235,172,
-172,172, 58,150,150,150, 90, 22, 21, 21,193,211,211,179, 4,192,253, 26,239,119,204,205,205,181, 52, 70, 80,224,148, 88, 60,219,
- 31, 18,237,109,104, 37,221,161, 98,251,224,230, 31, 49, 8, 62,127, 5,233, 25, 89,232,219,179, 51,166, 77, 30,143,139, 23, 47,
-130,231,141,110,233,200, 38, 4, 95,140, 26, 21,248, 62, 64, 81,131, 7, 15, 46, 90,184,112, 33, 29, 27, 27, 59,101,236,216, 49,
- 1, 15, 31, 62,170,140, 42, 82, 75, 9,193, 38, 0,217, 6,234,202, 0,224,234,213,171, 0, 32,111,202,185, 39,151,203,113,235,
-214, 45, 84, 53, 19,211, 52, 13,154,166,193, 48, 12, 78, 63,178,135, 82, 75,163, 60, 59, 18,111, 6,122,194,199,199, 7, 52,221,
-120,151,196,129,128,201, 77, 96, 44, 37,145, 44,118,113,117,245, 30,208,178,165, 34, 36, 36,132, 1, 0, 47, 47, 47,146,153,153,
- 89,116,242,228,201, 82, 22,216,230, 69,200,222,134, 76,150,135,135, 71,159,244,244,244,207,171,142, 57, 69, 81, 95,180,104,209,
- 98, 69,117,185, 9, 2, 86,253,160,148, 44, 90,244,182,180,199,192,143, 0, 0, 61, 70, 29, 68, 73,194, 90,127,170, 96,153,213,
-223,125,149, 40, 41, 41, 57,220,186,117,107, 38, 63, 63,255, 38,128,100,189, 94,255,193,254,253,251, 29,103,207,158,157,115,224,
-192,129,117, 0, 92,215,175, 95, 63, 80,169, 84, 30, 49, 70,183,111, 71,140,120,161, 99, 64, 79, 79, 15, 15, 92,185,249, 59,164,
- 50,137,245,130, 25,129, 48, 55,103,241,213,238, 51, 66,114, 90,193,194,235,247,177,215, 8,147,213,125,252,248,241,222, 7, 15,
- 30,148, 1,192,253,251,247,145,149,149, 5, 7, 7, 7,152,154,154, 66, 34,145,128, 97, 24, 72, 36,146,103, 98,178,172, 60,236,
- 66, 79,156, 56,105,106,107,107,141,205,239, 44,194,180,156,108, 88, 91,152, 67, 95,166,244,126,206, 42, 10,223,126,253,250,153,
-240, 60, 15,165, 82,137,203,151, 47, 91,153,154,154, 90,185,187,187,175,108,168, 18,169,227,218,153,173, 86,171, 29, 43, 31,231,
-168,213,106, 39, 0, 37,114,185,188,234, 58, 93, 86,185, 54,180, 57, 49, 25, 79, 55, 19,166, 80, 20, 85,243,181,166,210,173,123,
-183,142, 33,199,131,126, 50, 47, 46,205,130,181, 77, 14,104, 20, 99,231,206, 45, 48, 53,181,196,202,149,203,216,199,131, 95,116,
- 27, 54,226,149,144,168,152,184,193,207,157,217, 34,212,206,193,163,166,218,154, 42, 44, 42,235, 18, 61,246,236, 90, 4,154,166,
-177, 98,197, 10,180,111,223,126,110, 84, 84,212, 71, 0, 10, 26,150,193,206, 14,253, 95,181,149,153, 84, 20,177,192,235,177,253,
-208,187, 21, 58, 31,206,195,164, 81, 62,115,223, 27,159,120,174,125, 75,148, 86,222,152,171, 36, 52, 82,168, 30,168, 54, 12,193,
-193,193, 3, 2, 3, 3,175,212,247,252, 95,128, 11,254, 28, 63,171,150,249, 98,131,131,131, 73, 96, 96, 32, 85, 99,231,106, 61,
-111,136, 78,128,189,141,149, 34,100,219,170, 69,230,236,237, 51,140, 42,229, 17, 50,212,181, 42,242, 90, 41,154, 10,133, 98,234,
-158, 61,123,106,133,148, 60,157, 28, 33,149, 74, 32,145, 82,176,238, 87, 49,122,125,209,181, 96, 80, 84,189, 38,171,150,166, 82,
-169, 84,223,189,123,215,124,247,238,221,112,116,116,132,183,183, 55, 20, 10, 5, 76, 76, 76,106,153,171,154,134,171, 14,163, 85,
- 75,179,234,125,150,101, 65,211, 52, 46, 94,188, 8,142,227, 48,126,252,248,167, 76, 22,203,178,245, 25,183,250,210, 83,207, 3,
-184, 79, 8,233, 95, 89, 1,223, 7, 48,160,198,251,195, 28, 28, 28, 62, 0,176,206, 80, 77,134, 33, 96,212, 55, 33,184,111, 4,
-155,186, 8, 90, 73, 39, 92,186, 30,142, 61, 59, 54, 0, 0,188,219,118,195,132,177,129,213,209, 56, 3,183,179, 26, 55, 55,183,
- 67,185,185,121,195, 95,124,241, 69, 20, 22, 22,234, 87,173, 90,133,142, 29, 59,194,215,215,215,160, 50,170,231,206, 57,251,254,
-253,251, 30, 42,149, 10,132, 16, 67,204,217, 83,154, 20, 69, 97,255,254,253, 80,171,213, 79,125,216,102,192, 26,188, 59,206, 11,
- 51,223,220,139, 47, 30, 28,193,214,173, 91, 27,220,119, 5,208, 81,109,213,122,147,140,225, 58,174, 91,246,134,124,218,180,105,
-204,204,153, 51,145,146,146,130,217,179,103,171, 47, 94,188,168,205,202,204, 60, 41, 19,132,205,186,218,198,184, 94, 77,185, 92,
-190,239,252,249,243, 56,114,164,194,151,196,197,197,161, 77,155, 54,102,181, 76,114,193, 81,148, 38,111, 70,232,233, 88,244, 24,
-117, 16,161,167, 39,131, 47, 58, 35,233,218, 6,197,198, 28,207, 38, 80,151,230,145,252,252,252,106, 19,117,224,192, 1,211, 3,
- 7, 14,140, 1,112, 10,192, 17, 0, 40, 40, 40,248,198, 72, 77,128,194,204, 87,199,141, 1, 43,181, 64,236,163, 52, 12,232,213,
- 5, 78,142,142,184, 31, 19,143,228,244,130,108,138,194,140, 97,189,101,235, 84, 42,237, 71,215,238,225,251, 70, 52, 41,119,119,
-119,223,163, 71,143, 74,107, 68,160,171,255,227, 12,195, 84, 63,175, 50,222, 77, 57, 63,171, 76,150,133,187,121,232,167, 91,250,
-152,133, 70, 28, 64, 27,175, 17,176, 25, 17,136,239, 47, 92,192,195,168,104,181,182,156,123,233, 31, 40,163,191, 74,211,119,220,
-184,113, 55,127,250,233, 39,235,212,212, 84, 92,189,122, 21,222,222,222, 40, 47, 47, 55,228,134,183,150,166, 90,173,118,172,250,
- 14, 69, 81,142, 85,129,119,173, 86, 91, 85, 24, 85,127, 68,235, 26,159,179,110, 64,211,179,198,231,170,204,149,215, 51,216,119,
-153,137, 84,122,244,196,241, 67,230,209,177, 87,209,185, 83, 79,152, 91,181,131,192,103, 33,191,160, 12,133,143, 50,240,217,103,
- 95, 96,229,170,229, 56,245,115,144,185,159,127,167, 99, 90,142,107, 13, 64,253,220,148, 59, 69,230,134,156, 62,176,141, 34, 2,
- 84,217,177,114,137, 50, 81, 49,117,242, 43,204,196,137, 19,113,234,212, 41, 68, 69, 69,109,107,192,100,133,212,136,204,207,141,
-188,122,100, 27, 8,129, 42, 39, 86, 46, 85, 37, 42,166, 79,153,192, 76,155, 52, 20,183,127,219,132,161,157, 19, 35, 93, 29, 49,
-182,176,210, 98,179, 12,242,229, 38,184, 65, 66,113,187,134,217,186, 12,128,170, 97,176, 46,227,207, 62,152,255, 6, 70, 86, 26,
-171,185, 79,222,152,176, 77, 49, 88, 0,208, 6, 48,167,100,210,208, 61, 43,223,112, 85,164, 68,177,154,200, 91,200,208, 8,100,
-123, 18, 39,116, 1, 76,239, 0,170, 39,191, 83, 94, 94,174,140,143,143, 55,157, 49,118, 44,122, 7, 4,192,197,206, 14,173,221,
-221, 97, 42,151, 65, 38,149,212,186,101, 53,184, 13,129,162,136,159,159, 31, 70,141, 26, 5,137, 68, 2,133, 66, 1,115,115,115,
-200,100,178, 58,163, 89,134,222,229, 18, 66,192, 48, 12, 34, 35, 35,145,156,156, 12,107,107,107,220,184,113, 3, 47,189,244,210,
- 83, 81,173,154,230,204,152, 16,125, 29, 21,127,149, 17, 59,111,140, 22,207, 83, 40, 35,157, 96,146,180, 16,229, 84, 23,104, 52,
- 28, 52, 26, 13,190,191,174,195,239,241, 74,232,116, 90,104, 52,154,134,126,179, 62,104, 87, 87,215,169,173, 91,183, 94, 48,121,
-242,100,189, 76, 38,131, 82,169, 68,121,121, 57,162,162,162,244,195,135,143, 40, 26, 53, 42,208,234,204,153, 51,164,178,233, 48,
-219, 8,237,124, 55, 55, 55,143,202,230,217,252,166,156,213, 20, 69, 85,155,152, 39,153,241, 77, 52, 88,166,162, 76,182,109,219,
- 6,158,231, 65, 8,169,183,144,212, 20,245,235,170, 53, 95, 91,173,223,248, 3,172,108,157,112,229,202, 21,254,220,185,115,165,
- 20, 16,247, 48, 42,234,155,255, 0,103,143, 2, 58, 99,182,175,176,176,208,212,219,219, 27,238,238,238, 16, 4, 1,122,189,190,
- 58,250,146,159,159, 15,149, 74, 5, 91,179, 34,180,178,115, 7, 87,122, 25,153,145,159,192,197, 60, 22,123,207,107,245, 47,248,
-226,222,255,192,133,227,199,202,165,153,119,205,112,115,116,246, 0, 77,244,200,200,201,199,152,145, 67,193, 72,205,241, 56, 53,
- 15,157,218,181,116,153,242,159, 62, 46, 12,197, 97,233,186,131, 11, 0,225,251,198,228,202,202,202,248,216,216, 88,220,191, 95,
-225,119, 45, 45, 45, 97,102,102, 86,235, 63, 78,211,116,179, 34, 90, 85, 38,107,205,182,151,204,104,137, 18, 37,124, 8,118,239,
- 15, 71, 39,191, 64,108, 15,253, 67,205,103, 23, 12,254, 74,173,142, 59,244, 47, 14,102, 56, 59, 59,207, 19, 4, 97, 37, 33,164,
-168,111,223,190, 78, 7, 15, 30,180, 73, 79, 79, 71,120,120, 56, 86,172, 88,145,203,243, 60, 71, 8,161, 8, 33,159, 60,131,159,
- 19,106, 24,172,103,137, 68, 97,130, 55,237, 45,169,209, 44,109,233,205,149,148, 61,206,211,146,147,229,156,240, 29, 0,125,131,
- 23, 55,154,254,111,208,225,109,174,246, 14, 2, 6, 58,188,136,204,108, 29,214,188, 51, 29,249,249,165,248,126,215, 90, 0, 50,
-232, 56, 6,253, 7,190, 2, 71, 71, 55,204,157, 51,215,121,219,142,237,111,112,130,240, 21,158, 19,178,110,110,253, 25, 64,136,
-131,131, 67,212, 27,115,231, 58,120,123,191, 6, 19, 19, 19, 28, 58,116, 8, 7, 55,111,230, 55, 2, 19,228,192,165,249,192,207,
- 13,234,132,254,169,179,104,254,124, 7,127,255,249,144,203,229,248,237,220,143, 80,103,237, 47, 29,217, 27,186,114, 53, 70,182,
- 24, 69,108,147, 78, 83, 5, 18, 9, 30, 1,128,196, 4,153, 0,158,108, 6,251,183, 25,172, 42,206,224,207, 76,195,185,181, 34,
- 90, 77,190,118, 74,100, 17,187,222,158,228,229, 4, 13,165,189,126, 26,233, 26,129, 95,255, 80,199,220, 41, 38,239,198,212, 97,
-178, 42, 79,108,193,211,211, 19, 47,118,237,138,177,253,250,129,101, 89,152,200,164,176, 48, 49, 5,225, 43, 34, 89, 85, 77,135,
- 13,212,137,168, 43,250,100,103,103, 7,169, 84, 90,109,176,140,136,102,213,169, 41, 8, 2, 88,150,197,253,251,247,209,183,111,
- 95,120,120,120,224,200,145, 35, 24, 54,108,216, 83, 77,137,198,154,172, 42,163,245, 68, 51,222, 48, 0, 85,145, 44,163,140,150,
- 90, 75, 33, 79,219, 9, 20, 21, 0,142, 3,120, 2,104,212,106, 16, 2, 16, 2,232,117, 90,168,213,234,234,223, 52,164, 73,214,
-217,217,217,211,212,212,116,245,251,239, 47,245,239,212,169, 51,114,115,115, 33, 8, 2,204,204,204, 80, 94, 94, 14, 75, 75, 75,
-244,238,221,251,241,234,213,171, 51, 9,193, 92, 35, 77, 86,179,169, 58,230, 23, 46, 92,168,213,108, 88,181, 40, 51,211, 48,243,
-173, 3,144,177, 21, 77, 75, 85,125,120, 26,186,238, 14,234,223, 7, 55,239,196,113,255, 93,186, 73, 35,201, 15, 95,231, 44, 8,
-123,210,154,177, 95,132, 16,228,229,229, 33, 59, 59, 27,163,199,140,193,193,159,126, 66, 82, 82, 18,218,181,107,135, 65,131, 6,
-193,209,209, 17, 73, 73, 73,248,253,154, 6,154,194, 2, 20,104,195,161,176,232,129, 19, 87,226, 53, 43,182,233,226,255,193, 11,
-198,104, 0,211, 45, 45, 45,125,202,203,203, 51, 57,142, 59, 10,224, 40,128, 9, 44,203, 78, 80, 40, 20, 46, 37, 37, 37,137,168,
-200, 38, 58,217,152,152,169,137,137,157,220,196, 18, 2,167, 1,203,178,240,240,240, 6,225,181, 40, 44, 81, 97,198,196, 81,184,
-115, 63, 6,231, 46,221,230,244,122,225, 91, 67, 14, 43,195, 48,196,215,215, 23, 57, 57, 57,144, 72, 36, 48, 53, 53,133,185,185,
- 57, 62,252,240, 67,108,222,188,185,218,100, 53,213,104,205, 2,124, 45, 61,205,111,127,190,165,194,100,101,101,100, 34, 59, 77,
- 2, 7, 59, 39,124,187,121,163,178, 48, 41,171,199, 15, 64,220,191,189,146, 21, 4,225,147,244,244,116, 71,150,101,157, 57,142,
- 67,106,106, 42,194,194,194,176,112,225,194,236,252,252,252,129,104,226, 62,154,152,152,228, 84, 69,178, 42,155, 14,235,107, 78,
- 44,170, 17,201, 42,106, 64,178,190,102,194,150,222,238, 22, 23,119,109, 88,236,217,173, 71,111, 90,193, 90, 22,150, 61,202,234,
-123,253,234,149,222, 11, 55,124,255, 70,114, 97,217, 80, 0, 9,245,137,202, 37,146,225, 61,251,244, 97, 65,178,193,202,250,226,
-139,245, 19,145,155, 87,130,194,130, 82, 72,165,102,208,234, 25,240, 2,133,222,125,251,225,199,189,135,209,126,206,108, 70, 38,
-145, 12,225,180,218,231,198,104, 85,178,246,187,239,190,243,244,243,243,195,158, 61,123,112,105,223, 62, 76, 43, 46,198, 21,154,
-102,244, 18,137,253, 89,189,126, 39, 26, 49, 90, 53,117,218,183,111,143, 31,126,248, 1,251,247,239, 79,153,250, 82,206,177,197,
- 83,225,168,211,225,229,240, 7,176,109, 49, 10, 8,127, 0,219, 23,252,208,154, 99,241,136,162,106, 15, 7, 21, 28, 28, 60,160,
-230,250, 95, 70, 38,234,105, 98,103, 1, 12, 12, 14, 14, 38, 53,215,141, 94, 56, 29,218,204, 95, 59,212,199, 43,160,149, 39,165,
- 63,178, 9,169, 74, 78,251,209, 3,157,236, 97, 25, 89, 28, 3,108,108,224, 14,130, 48, 12, 3, 11, 83, 83, 56, 88, 91, 87,132,
-249,105, 26, 16, 0, 65, 15, 80,124,133, 1, 32, 2, 5,194, 27,117,193,128, 76, 38,171,179,227,187,177,125,179,106,106,150,150,
-150,226,241,227,199,152, 59,119, 46, 20, 10, 69,133,115,207,202,130,151,151, 23, 88,150, 69,122,122, 58,126,251,237, 55,248,248,
-248, 64, 46,151, 27,229,182,106, 68,151, 58,162, 34,203,176, 99,102,102,166,165,139,139, 11,140,142,104, 9, 4,229, 26, 10, 90,
- 45,143,135, 15, 31, 34, 35, 35, 3,143, 19, 31,161,155,178, 4, 4, 12, 8, 33, 70, 69,180,220,220,220, 2, 90,182,108,185,125,
-221,186,117, 82,119,119,119, 16, 66, 96, 99, 99,141,242,242,114,228,229,229,163, 93,187,118,240,240,240,192,186,117,235, 0,224,
-224,223,109,178,158, 56,167,170,141, 86, 77,195,245,214,127, 60, 81, 80, 96, 14,134,161,171,141,115, 35,125,180,164, 0, 48,112,
-232, 56,246,226,185,179,102, 28,176, 58,139, 97, 86,179,141,151,163,158, 23, 4, 69,125,239,167,166,166, 66, 34,145, 32,232,232,
- 81, 20,100,103,163, 83,167, 78,232,222,189, 59, 30, 61,122,132, 59,119,238,192,206,206, 14, 14,238,189,112, 37, 81,135,232, 12,
- 21,172,172,172, 16,159, 70,255,147, 67, 6,204, 25, 60,120,240,138,111,190,249,198,209,217,217, 89,146,155,155,235,183,101,203,
-150, 78, 91,182,108, 89,244,198, 27,111, 56,189,241,198, 27, 54, 14, 14, 14,108, 86, 86,150,239, 59,239,188,243, 66, 72, 72,136,
- 15,128,175, 27, 18, 52, 51,179,176,101,164,102,160, 40, 22,214, 86, 54, 96,101,102, 16, 56, 22,188, 0, 88, 90, 57,224,230,157,
- 32,220,136, 40,157,151,147,143,163, 6,197,199, 42,203,221,206,206,238,169, 72,245,194,133, 11,177,107,215,174,234,102,196,166,
-154,172, 53, 91, 94, 50,167, 42, 77, 86, 86, 42, 11, 74,227,131,211, 63,223, 42, 42, 76,202,234,251, 60,152,172,170,107, 28, 33,
- 4,137,137,137, 40, 47, 47,199,181,107,215,240,201, 39,159,228, 62,105,178, 28, 29, 29,231, 88, 90, 90,174, 42, 43, 43,251, 34,
- 43, 43,107, 83,163, 55,126, 21, 38,170,234,113,213,186,206,230, 68, 3, 55,213,171,174, 72,150,135,139,201,249, 59,215, 14,120,
- 89,145,123, 20,146,231, 2, 15, 75,162, 44, 66, 29,251,143,232, 54,146,238,178,245,211, 22,221,231,125,120, 62,181, 68,237, 87,
- 95,100, 75,224,249, 46,102,230, 22, 0,114, 16, 30,118,185,218,100,229, 23, 20, 67,163, 99,160,209, 82, 80,235,104,188, 56,248,
-101,108,222,190, 31,233, 57, 5,224,121,190,195,115,102,178,108, 3, 2, 2,230, 79,152, 48, 1,171, 87,175, 70,200, 55,223,104,
- 95,167,168, 18, 22, 32,103,120, 30, 2, 33, 20,109, 88, 39,246, 90, 58, 95,125,245,213,207, 0, 38,173, 91,136, 94,133,101,152,
-225, 58,138,216,182, 24, 85,241,193,241,239, 19, 0,176,205, 13,169, 93,101, 6, 6, 6, 82, 85, 45,107,198,182,176,253,175,195,
- 6, 6, 6, 94, 9, 14, 14, 70,205,117, 67, 95,176,112,242, 27,241,222,146, 5,235,187, 13,235, 71,101, 46, 25,130,130, 18, 53,
-183, 44, 90, 39, 75, 83, 53,108,178,106,242,222,150, 45,184, 19, 87,241, 63,118,119,116,196,210, 41, 83, 64, 56,224, 70, 84, 52,
- 14,135,132, 96,226,224,193, 48, 51, 49, 49, 56,178, 33, 8, 66,157, 81,172,154,209, 44, 99,163, 78, 69, 69, 69, 56,122,244, 40,
-186,119,239, 14,133, 66, 1,150,101,209,177, 99, 71,196,196,196,160,101,203,150,160, 40, 10, 39, 78,156,192,216,177, 99,145,144,
-144,128, 94,189,122,153, 39, 39, 39, 27,109,180,162,163,163, 45, 9, 33,253,171,162, 31, 77, 69,163,209, 32, 54, 54, 22,163, 70,
-141,130,141,141, 13,220,220, 14, 34,228,252, 1, 40, 2,166,129,162, 96,148,209,226,121,126,214,200,145, 35,165, 20, 69, 65,165,
- 42,135,137,137, 41,204,204,204, 97, 97, 97, 9, 95, 95, 63,100,100,100, 96,216,176, 97,218,248,248,248,173,153,153,153, 71,140,
-221, 86,127,127,127,179,164,164,164,105, 45, 90,180,144, 1,128,169,169,105,187,150, 45, 91,190,155,144,144, 80,106,108, 84,171,
-202, 96, 81, 20, 5,134, 97,170,141, 22, 75,211,112,113,118,172,126, 94,217, 63,141,106, 64,171, 36, 61, 95, 35, 7, 0, 79, 79,
- 79,108,222,113,138, 30, 57,114, 36, 22, 45, 90, 4,189, 94,143,173, 91, 43,146,236, 38, 79,158, 12,157, 78,135, 99,199, 42,146,
- 36, 89,150,109, 48,108, 18, 22, 22,134,240,240,112,232,245,122, 20, 23, 23,227,151, 95,126,193,149,171, 87,113,232,196,175, 72,
- 74,124,132,142,126, 94,152, 61,123, 22, 36, 18, 9,246,238,221,139,190,125,251,254,163, 23, 4,137, 68, 50,117,215,174, 93, 46,
-123,246,236, 41, 58,113,226,132,178,103,207,158,242,141, 27, 55, 58,110,222,188,217, 65,171,213,226,237,183,223,206,185,125,251,
-182,102,204,152, 49,102, 59,119,238,116,105,213,170,213, 16,142,227,234, 50, 90,102, 0, 38, 2,120,173,176, 84,203, 22,149,170,
- 32,112, 90, 36, 38, 61, 70,113,153, 22, 2,175, 67, 74, 90, 6,202,212, 60,242, 11, 74,209,177,203,208,239, 46, 95,190,188, 92,
-167,211, 45, 3, 16,220,216,118, 70, 69, 69,225,246,237,219, 72, 74, 74, 66, 98, 98, 98,109,167, 56,103, 14,246,239,223,111,116,
- 68,171,110,147,197,128,210,180, 68,240,137,208,162,156, 71,153,207,141,201,170,188, 6,173,116,113,113, 89,233,226,226, 98,114,
-225,194, 5,171, 22, 45, 90,128,227, 56,237,147,145,172,129, 3, 7,126,180,107,215, 46,151,150, 45, 91, 46, 4,176,233,127, 97,
-219,105, 26,115,190,216, 54,223,222, 66,150,146,129,135, 95, 87,142, 37,200, 0,229, 37,192,229,159,192,246,249,248,241,194, 49,
-239,219,124,176,103,245, 28, 1, 66,189, 25,178,241, 9,169,216,182,109, 51, 22,191, 61, 3, 63,126,255, 5, 4,129,133, 70,207,
-192,211,187, 39, 52, 58, 1, 20,205,162, 83,151,174,184,116,249, 26, 36, 52,112,116,207,182,231,204,103,161, 32, 50, 50,114,235,
-137, 19, 39,222, 92,180,104, 17, 4, 65,144,173,218,182, 77,149,155,155,187, 22,198,141,127,245,164,206,216,109,219,182,197,125,
-176, 57,247,231,197, 83,193, 36,157,166, 10,194, 31,192,118,252,251, 4, 65,235, 41,188,224,135, 2, 69,221, 85,252,213, 39,214,
-207,135,209,170,114,146, 53,215,117,209,165,141,207,167, 86,182, 54,179,104, 11, 55,251,165,139, 94,103, 19,178,212, 56,214, 98,
- 74,217,111,251,190, 53,203,226,228,223,197, 67,189,209,152, 31, 62,252,219,111,213,143,191, 60,120,176,206,247, 50,199,143, 55,
-248,206,172,190, 40,150,177,145, 44, 0, 80, 40, 20,214, 67,134, 12,193, 75, 47,189,132, 87, 94,121,165,186, 79, 86,231,206,157,
-113,232,208, 33,140, 27, 55, 14,119,239,222,133,139,139, 11,218,182,109,139,182,109,219,226,236,217,179,198, 94,228,192,243, 60,
- 2, 2, 2,170,178, 14, 59,166,165,165, 89, 54,181, 32, 53, 26, 13,242,243,243, 97,107,107, 11,153, 76,134, 30, 61,186,227,205,
-183,122,192,222,229, 7, 4,248,251, 65,169, 84, 86,167,191, 27, 80,217, 6,180,110,221, 26,185,185,185,200,205,205,133,131,131,
- 3, 92, 93, 93,225,236,236,140,175,191,254,154,108,218,180,233,156, 78,167,219,154,151,151,103,116, 36,203,217,217,185, 31, 69,
- 81, 31,169, 84, 42, 89,141, 59, 92,153,131,131,195, 73,149, 74,181, 54, 51, 51,211,224,142,160, 20, 69, 65,167,211,129,162, 40,
-156, 73,116,133, 82, 75,161, 36, 45, 28,139,254,227, 85,203,120, 73, 36,146, 70,155, 75, 9, 33,202, 73,147, 38, 57,122,120,184,
- 35, 53, 62, 10, 65, 65, 4,223,124,243, 77, 85, 86, 36,226, 42,111, 12,170,158, 15, 26, 52, 8,222,222,222, 32, 70,140,149, 33,
- 8, 2,238,223,191,143,131, 39,175,192,197,203, 31, 41, 15, 99,113,231,236,105,180,112,176, 69,251, 46, 93,161,215,235,155, 53,
-244,198,179, 64,175,215,239,110,211,166, 13,209,106,181, 87, 0,108,142,136,136,152,145,153,153,249,246,169, 83,167, 92, 39, 76,
-152,144,113,250,244,233,141, 0,246, 68, 68, 68,204,255,236,179,207, 94,226, 56,174,206,108, 65,134, 97,126,124,231,157,119, 6,
- 78,152, 48,129,146,210,122,237,133,243,123, 89,142,211, 83,239, 45,219,205, 95,190,126,133,230, 56, 61,245,202,164,119,132,179,
-191, 69,208,243,222,250,146,239,220,115, 36, 34, 35, 35,157, 3, 3, 3, 63,211,235,245, 13, 26,173,170, 72, 85,125, 17, 74,134,
- 97, 48, 99,198, 12, 28, 58,100,120, 15,170,217, 64, 75, 75, 47,243,219,107,182, 12, 54,167,216,178, 26, 38,171, 21,130, 79,132,
- 22,101, 63,204,120,174, 76, 22, 0,228,231,231,239, 0,176, 67, 16,132,108, 51, 51, 51,148,150,150,214,117,254,153, 68, 68, 68,
-152,200,100, 50, 12, 29, 58,212, 54, 36, 36, 36,142,166,233, 77, 25, 25, 25,245, 58,142,186,154, 9,235,106, 78, 68, 51,178, 14,
-109, 28, 16,216,163, 95, 23,139, 7, 86,171, 45, 76, 88,245,221, 22,113, 38,150, 20,128, 98,141, 83,226,205,228,137, 37, 84,142,
-188,115,215, 65, 47,192,146, 53, 11, 44,226, 74,235, 52, 90, 52,195,220, 41, 46, 44, 26, 94, 82,170,197,245, 27,145,152, 52,177,
- 53, 52, 58, 10,130, 64,163, 76,169, 1, 24, 9,104, 0,147,167, 76, 7,161, 88, 20,100,103,128, 97,152, 8,112, 28,158, 51, 62,
-156, 63,127,254,240,101,203,150,249, 44, 93,186, 20, 75,151, 46,245,218,181,107,215,142, 53,107,214, 44,205,205,205,237,128, 70,
- 6, 31,111, 64,167,197,233, 67, 31, 47, 57,121,109,123,241,200,222,170,135, 47,248, 85, 68,190, 94,240, 67,129, 68,130, 71, 44,
-131,124, 66,106,119, 51, 10, 12, 12, 28, 80,115,253, 47,227,201, 78,240,213,207, 13,234,163,213,218,199,237,229, 46,157, 3,222,
- 90,190,108,185, 69,204,205,203,248,224,211,205,164, 77,215, 33,165, 59,174,221,209,150,153,121, 15, 47,203,123,116,195, 80,127,
- 1, 0, 47,191, 56, 14, 29,219,117,127,234,205,190,131, 42, 6,107,191,126, 41, 12,217,185,233, 6, 87,182,149,230,160,206, 62,
- 89,134,164,244, 63,137, 74,165, 42,138,140,140,116, 76, 75, 75,171,213,241,221,219,219, 27, 20, 69, 33, 52, 52, 20,183,111,223,
-198,164, 73,147,192,178, 44, 36, 18, 9,174, 92,185, 98, 84, 52,166, 70,116,169, 42,235,112,152,187,187,123,125,217,134,141,106,
-169, 84, 42, 20, 23, 23,227,252,249,243,104,221,186, 53,214,172, 89, 3, 87, 23, 39, 44, 95,190, 4,130, 32,160,164,164, 4, 60,
-207, 27, 26,209, 18,170,162, 69,130, 32, 32, 55, 55, 23, 62, 62, 62,216,178,101, 11, 54,110,220,248, 89,102,102,230, 41, 99,183,
-209,195,195,195,154,231,249,247, 70,142, 28, 57,100,204,152, 49, 24, 54,172,246,120,172, 63,253,244,147,197,177, 99,199,214,126,
-251,237,183, 47,235,116,186,117, 57, 57, 57,185,134,232,254,240, 67,197,240, 75,138,158, 43,241,193,132, 22,120,109,193, 94,124,
-253,245,113,200,229,242, 90, 21,239,234,213,171, 27, 52, 49, 2, 33,109,164,121, 55, 51,150,188,255,149,227,218,181, 33, 8, 9,
-201, 1, 77,211,112,113,113, 1, 77,211,120,252,248, 49,104,154,134,151,151, 23,104,154, 70,122,122,122, 85,159,192, 66,212,145,
-245, 88,247, 93, 56, 13,181, 90,141,212,148, 36,164,197,199,193,188, 36, 11, 14,150, 10, 20, 70,221, 71,199,217,115,170,199,127,
-250,135,217,175,213,106,247,215,120,254,213,233,211,167,181, 20, 69,189,130,138,126, 26, 85, 17,141,207, 56,142,251,172, 62,145,
-158, 61,123,118, 94,182,108,153,164,106,184, 13, 87,207,207, 57,157, 78, 39, 0,128, 95,199,254,181,220,254,163, 71,143,240,245,
-215, 95, 67,169, 84, 66, 42,149, 74, 13, 57, 14,130, 32, 84,103, 24,214,101,194,140, 49, 89, 0, 96,231,229,254, 93,104,248, 21,
-254, 94,252,118, 85,196,131, 95, 76, 51, 83,104,208,218,231,215,100, 61, 25,217,114,119,119, 95, 41, 8, 2, 33,132,124, 92,227,
- 45,185,167,167,231,181, 11, 23, 46,216,113, 28,135,111,191,253,214, 58, 43, 43,203,186,127,255,254, 31, 0,168,215,104,213,213,
- 76, 88, 87,115, 34,106,100, 29,202,229,114, 91,173,182,222,224,201, 83, 89,135, 60, 15, 95, 75, 11,107, 20, 34, 13, 26,123,125,
-231, 34, 59,174,224, 98,230,156,187,174,201, 93,218,153,241,122, 31,186, 68, 11, 55,133, 53, 4, 66,234, 77,141,214,232,245,191,
-220, 13,191, 51,212,211,163, 53,115, 42,248, 42, 70,143,157, 0,141,134,134, 90, 79,129, 98, 36,160, 24, 41, 58,116,236,130,182,
-237, 59,130, 0, 8,251,253, 38,167,213,235, 47, 62, 79,101,239,210,231,205, 73, 20,133, 77, 32, 2,169, 99, 28, 45,159,177, 99,
-199,174, 5,240, 86, 99, 58,142, 61,223,156, 68,211, 21, 58, 53,199,209,122,231,205,249,136,250, 93, 98,117, 53,124,189,116, 88,
- 79,156,201, 13,161,160, 48,249, 51,235, 80, 66, 55,107,104,142,127,139,225,106,220,104,121,120,120, 88, 91,202, 77,126,120, 99,
-246, 44,139,228,123,183,144, 21, 29,138, 27, 87,227, 10, 15, 31, 59, 94,160,204,207,153,109,132,201,170,110,230,179,115,110, 1,
-111,255,167,141,150,137,185, 3, 0,192,219,191, 59, 24, 51,227,134, 17,170, 43,154,213, 20,147, 85,243,130, 93,215, 24, 90,243,
-230,205,195,174, 93,187,208,167, 79, 31,180,105,211,166,250, 98,111,108,212,172,142,232,146,209,217,134, 53, 41, 45, 45,133,151,
-151, 23,118,238,220,137,136,136, 8, 88, 88, 88, 96,210,164, 73, 40, 45, 45,173, 54, 88,134,118,134, 39,132, 60,186,112,225, 66,
-183, 87, 95,125,149, 72, 36, 18,170,168,168, 8,214,214,214,216,178,101,139, 50, 51, 51,243, 76, 19, 76,214, 4,169, 84,186,100,
-226,196,137,140,159,159, 31,178,179,179, 97,105,105,169,167, 40, 74, 2, 0,214,214,214,122, 83, 83, 83,204,159, 63, 31,157, 58,
-117,234,183,116,233,210, 62, 44,203,110,201,200,200,216,219,208,185, 68, 81, 84,117,133, 58,123, 83, 44,180,218,138, 10,122,235,
-214,173,168,236,235,246,103, 19, 65,124, 60, 96, 64, 38,139,185,185, 57,218,180,105, 83,103,217,247,235,215, 15, 97, 97, 97, 21,
- 77,147, 44, 11, 71, 71, 71,220,184,113,195,160, 76,170,170,129, 32, 35, 35, 35,225,239,109,143,136,144, 11,176, 87, 72,208,201,
-213, 25,238,253, 6, 32, 46, 46,238,159,140,102, 81,168,232,135, 49,184,242, 28,220, 13, 96, 94,141,231, 91, 0,124,103,140, 32,
-199,113,132,166,105, 42, 53, 53, 85,167, 80, 40, 40, 91, 91, 91, 86, 46,151, 67,163,209, 84, 27,174, 71,143, 30, 33, 56, 56, 24,
-105,105,105,176,181,181,165,173,172,172,160,211,233, 10, 13,209,247,245,245,133,179,179,115,173,142,239,179,103,207,110,146,201,
-154, 1, 4,236,250,124, 93, 11, 57,205, 88,249,219,191,140,196,216,199,106, 90, 11,147,255, 15,167, 78,133,254, 0, 0, 32, 0,
- 73, 68, 65, 84, 38, 11, 0,138,138,138,118, 0,216, 81,245,220,222,222,126, 38,195, 48,203, 53, 26,141,213,149, 43, 87,172, 29,
- 28, 28,168,189,123,247,234, 63,254,248,227, 34,134, 97, 10, 41,138,218,240,207,155, 67, 68,231, 21,199,123, 73,108, 92,133,123,
-106,114,243,237,212, 15,218, 22, 74, 90, 59, 80,237, 3, 48, 54, 39,230,250, 76, 46,190,119,118,102, 22, 77, 32, 68, 55,112, 13,
-222,253,193,178,213,239,197,197,222,241, 52,177, 52,193,188,249,203,112,230,220, 37, 80,180, 4,215,110,134, 66,171,227,145, 87,
- 80,140,137,147,167,194,221,197, 30,209,183,207,231,114,130,176,229,249, 50,217,194,230,161,163,103,218,200, 77, 21,149,199,132,
-199,254,239,151,128,166, 55, 97,197,138, 21, 8, 8, 8, 88, 16, 25, 25,249, 9, 26, 25, 71,139,162,132,205, 29, 6, 76,182,145,
-202, 43,116,136,192, 99,231,209, 15, 42,199,209, 90,140, 45, 59,142,117,104,239,157,184,170,161,113,180,158, 35,147, 85,115,221,
-176,209,242,242,242,146,155, 73, 48, 87,194,176, 75,223,152, 50,198, 33, 39, 62, 10,105, 49,119, 42,154, 23,116, 42, 93,214,195,
- 24, 67,134, 66, 31,140,218,227,119,144,134,154,174,212,106,131,238,232,107,105, 86, 85,184, 79, 70,179,140, 52, 89, 79,105,214,
- 52, 91, 53,199,205,242,240,240,192,218,181,107, 13, 25, 71,235,201,125,175, 98, 24, 42, 58,192,215,236, 12, 63,204, 64,147, 85,
-167,166,131,131, 3,242,243, 43, 70, 72, 24, 56,112, 32, 6, 14,252, 51,159, 65,167,211, 85, 71,177, 44, 44, 44,234,138,104, 61,
-165,105,106,106,250,193,241,227,199,103,221,188,121,243,213,119,223,125, 87,242,210, 75, 47, 85,153,185,114, 24, 54,183, 91, 45,
- 77,158,231,231,159, 63,127,158, 17, 4, 1, 59,119,238, 68, 88, 88, 24, 81, 40, 20, 31, 41, 20,138,205,166,166,166,188, 74,165,
-154, 55,103,206,156,169,171, 86,173,162,251,245,235,135, 91,183,110,209, 62, 62, 62,211,129, 90,131, 88,214,185,239,161,161,161,
-160,105, 26, 92, 65, 10, 22,124,112, 24,102,166, 44, 98, 99, 99, 81, 80, 80,240,212, 32,166,134, 28,207,154,145,146,170,165, 95,
-191,126,213,205,144, 61,122,244, 0,195, 48,184,123,247,110,125,205,176, 53, 53,137,157,157, 93,245,249, 33,149, 74,113,233,210,
- 37,124,250,233,167,240,180,181, 70, 97, 76, 4,156, 7,190,136, 33,179,230, 96,210,164, 73, 96, 24, 6,182,182,182,213,145, 95,
- 3,206,165,230, 80, 83,115,150,191,191,255,244,232,232,104,247, 14, 29, 58,184, 68, 70, 70, 14, 10, 8, 8,240,138,136,136,168,
-122, 46,135, 97,125,115,170, 53,255,248,227,143,160,205,155, 55,207,159, 49, 99,134, 84, 16, 4, 62, 57, 57, 89, 15,128,114,118,
-118,102,254,248,227, 15,225,212,169, 83, 80,169, 84,112,119,119,167,221,220,220,168,139, 23, 47, 10, 49, 49, 49,161,132,144,101,
-134,236, 59,207,243,181,134,113,168,122,252,211, 79, 63, 25,253,127,111,209,214,119,205, 75,253,253, 60,242, 50,238, 34, 51, 61,
- 30,124,177,131, 46,248,196,105,141,145, 38,235,175, 46,163,191, 83,115,245,195,135, 15,221, 52, 26, 13,100, 50, 25,182,110,221,
-170, 91,187,118,109,116, 94, 94, 94, 95,212,157, 81, 94, 75,179,137, 89,135, 5, 13,104, 62,149,117, 88,156,143, 51, 39, 78,254,
-209,205,124,236,110, 44,200,200,173,238,216, 72, 40,202,246,184, 83,187,190,138,238, 29,210,233,179, 43,233, 82,190,252, 76, 3,
-251,174, 85,105,181, 19,198,142,155,252,235,161, 67, 7,205, 63, 94,185, 18, 55, 66, 35,144, 95, 84, 6,129, 48, 16, 40, 10,203,
-151,127, 12,103,123, 91,148,100, 60, 44,215,232,116, 99, 81,123, 12,173,127,125,185, 83, 20,189,240,226,169,189,155,104, 10,130,
- 50,251,129,156, 41,141, 87,188, 54,105, 44, 59, 97,194, 4, 28, 63,126, 28,145,145,145,219, 27, 48, 89,213,154,132,208, 11, 35,
-174, 28,222, 68, 1,130, 42,247,129,156, 45, 75, 84, 76,159, 50,150,157, 52,105, 18,126, 14,190,137, 67,167, 19,183, 29, 58,141,
-211,120,190, 49,126,100,120, 11, 22,145,125,219,181,116,235,215,165,189, 9,203,171,144, 22, 19,143, 2,165, 26, 23,163,146,139,
-104, 66, 55,121,108,157,138, 11,164, 20, 41, 41, 15,235,184,179, 50,169,172,208,213, 70,105,210, 52, 93, 43,154,213,156, 72, 86,
-205,237,116,114,114,170, 53,157, 75,205,138,187,170, 15, 80, 19,134,118,248, 32, 37, 37,197, 50, 37, 37, 5,132, 16,132,134,134,
- 90,246,232,209,227,131,230, 68,179,150, 44, 89, 82, 29,181,122,114, 93,215,107,141, 81,217, 41,125,163, 94,175, 63,186,116,233,
-210, 5, 61,122,244, 24,186,114,229, 74, 10, 70, 76,192,251, 68, 52,135, 19, 4, 1,151, 47, 95,198,241,227,199,121,157, 78, 55,
- 55, 51, 51, 51,162,198, 71,190, 13, 15, 15,191, 56,110,220,184,189, 15, 30, 60, 96,162,163,163, 65, 72,227,121,167, 42,149, 10,
-109,218,180, 1,199,113, 88,191,192, 3,165,165, 29,192,113, 28,120,158,135,153,153, 89,117, 20,175,166,121,110,236, 60,226,121,
-254, 41,163, 21, 26, 26, 10,134, 97,208,183,111, 95,220,185,115,167, 58,162,213, 88, 4, 74,167,211,165, 56, 57, 57, 57,173, 94,
-189,186,122,187,114,115,115,113,225,194, 5,244,236,213, 27,237,230,206, 67, 70, 70, 6, 54,108,216, 0, 87, 87, 87,172, 89,179,
- 6, 5, 5, 5,224, 56,238,239, 14,167, 15,143,142,142,118,159, 50,101, 74, 78, 68, 68,132,123,112,112,176,117, 96, 96,160,217,
-228,201,147,115, 34, 34, 34,220, 41,138,234, 13, 35, 59, 65, 11,130,240,225,242,229,203,207,173, 89,179,230,131,183,222,122,171,
-199,140, 25, 51, 36, 18,137, 68, 72, 79, 79,231, 14, 30, 60, 72,181,105,211,134,150, 74,165,212,249,243,231,133,223,127,255,253,
- 54,199,113,235, 1, 92, 51, 38,226, 92,211,100, 49, 12, 99,168,201,170,197,219,142,242,233, 22,116,110,223,205, 91,215,210,126,
-222,238,186,125, 7, 47,164, 94,187,245, 48,129,209,112,111,255,208,192,208, 0,207, 51, 12,195, 28,241,247,247,159,185,112,225,
- 66,211, 97,195,134,201, 87,173, 90, 85, 92, 90, 90, 90,159,201,170,227,134,249,111,201, 58,252,254,195,119,131,223,126,167,195,
-204,150,255,117,110,129, 16,101, 14, 10, 89,134,182,180,166,209,197,139, 65,105,222, 35,135,211,191,238,121, 12,160,177,113,217,
-254, 8,191, 31, 57,184,125,135,206,199,214,175, 89,239,248,209,251, 75, 37,199,130,127, 1,225,116, 8,189,114, 5,230, 82,158,
-196,132,135,100,107,116,218, 49,120, 14,167,224,201,188,241,221, 33, 0, 39,109,109,109,239,205,154, 49,163,141,191,255,100, 40,
- 20, 10, 4, 5, 5, 97,255,183,223,242, 27,129, 87,229,192,157,249,141,140,167,151,115,187, 90,231,238,156, 89,179,124,187,116,
-249, 47, 20, 10, 5,142, 30, 61,138,189, 27, 55, 26,172,243, 47,167,106,100,248, 51,248,115,132,248, 70,250,104,209, 84,233,237,
-135,201,101,161, 15,147,203, 32, 16, 34, 16,162,161,105,164, 42,117,186, 53, 15, 19,211,155,100, 10,170,154, 14, 63,251,124,225,
-179,107,243,168, 97,126,154,154,210, 93,135,201, 74,171, 57, 71, 90,205, 74,186,190,199,122,189, 62,205, 64,249,117,158,158,158,
- 79,189,214,244,208, 47, 49,202,100, 25, 58,142, 22, 0,228,231,231,103, 2,248,232,214,173, 91, 63, 13, 29, 58,116, 14,128,244,
- 38,150,209,206, 1, 3, 6,204, 5,192, 80, 20,181, 61, 35, 35, 35,226,169, 63,124,102,102,156,171,171,235,151,222,222,222,243,
- 42,110, 76,169,157,141, 84,228,137, 29, 58,116,208,213, 85, 22,245, 61, 23, 4,161,209, 50, 42, 42, 42, 66,247,238,221,159,154,
-211,146, 16,130,228,228,228,170,136, 83,245,177,111,200,192,149,149,149,205,123,243,205, 55,119, 72, 36, 18, 79, 0, 84,149,201,
-229,121,158,249,238,187,239,254,143,189,235, 14,139,226,106,191,103,182, 87,154,116, 1, 17, 81, 32, 40, 86,212, 24, 49,216,177,
- 27,187, 81, 99,239,189, 99,212, 88, 98,141, 26, 91, 44, 81, 99,193,222,141,216, 69,177, 97, 23, 4, 69, 80,233, 44, 75, 95,202,
-246,221,217,153,223, 31,148, 31, 42,101, 65, 83,190,239,219,243, 60,243,236,238,148,179,119,238,157,153,123,230,125,239,125, 95,
-190,193, 96, 96, 2, 32, 24, 12, 6,201,102,179,213,103,207,158, 37, 73,146, 76,214,104, 52, 19,255,230, 7,196, 41,162, 40, 21,
-131,226,245,235,215, 94,197,150,172,212,168,168,168,240,227,199,143,219, 2, 56, 81, 67,222,123, 74,165,242,222,218,181,107,219,
-237,220,185,115,209,196,137, 19, 91, 13, 29, 58,148,213,190,125,123, 92,186,116,201, 16, 26, 26,250, 88,165, 82,173,171,142,192,
- 42,110,203,124, 23, 23,151, 82,193, 85,197,189, 92,233, 64, 94,107, 87,222,111,195, 39,215,230,239, 89,119, 93,158,157,166, 13,
-211,203,181, 63, 30, 4,162,240, 63,140,140,140,140,121, 0,150,110,222,188, 57,173,105,211,166, 60, 14,135,163, 53, 86,100,253,
-141, 32,169, 60,121,143, 95,187, 12,188,224,191,120,186, 91,151, 14,126, 66,151,186,118, 78,209,239, 51,240,238,225, 37, 69,196,
-197,213,137,180, 70,214, 23,128, 49, 35,215,159,104,116,186, 6,115, 23,204,157,194,101,179,187, 26, 12,134, 38,157,110,156,167,
-153, 76,102,164, 86,175,191, 81,236, 46, 84,255, 23, 55,249,170, 13, 27, 54,120,120,123,123,227,244,233,211,184,113,228, 8,134,
-100,103,227, 54,147,201,100,112, 56,214, 23,117,186,141, 48, 78, 32,173,218,180,105,147,167,143,143, 15, 78,158, 60,137,107,135,
- 14, 97,112,205,120, 42,234,235, 90, 2,176, 45,254,153, 13, 32, 6, 64, 11, 0, 2, 0, 26, 20,165,118,178, 41,219,133, 21,111,
- 43,217,126,151, 32,136,191,114, 32,108,213,145,225, 63, 70,212,187,196, 22, 95,186, 20, 42,149, 42,215,195,195,163, 90,115,174,
-245,122,125,165, 62, 92,146, 36, 83,221,221,221,141,182, 90, 24, 35,138,114,115,115,125,255,194,198,248,172,177, 88, 31,116, 34,
- 20,149,232,232,232, 72,149,116,250,229,137,176,242,214,209, 64, 66,117,254, 39, 61, 61, 61, 6,192,156,154,150, 51, 45, 45,237,
- 12,140, 72, 26,109,236,126, 0, 32,147,201,190,120, 50, 95,130,166, 37,203,151, 47,175,150,192, 6, 77, 87, 38, 62, 35,229,114,
-121,107, 99,254, 91,167,211,225, 31,196,201,226,133, 17, 21, 21, 53,158, 32,136, 0, 20,185, 4,118,227,203, 68,243,190, 87, 80,
- 80,112,239,151, 95,126,105,183,103,207,158, 89, 52, 77,163,160,160, 96, 75,117, 5, 86,233,219,115,102,230,165, 47,117,226,185,
- 25,218, 91,199,118,167,118, 84,229,233,102,237,149,107, 15,193,132, 82, 99, 20, 77,211, 7, 70,140, 24,241, 53,128,131,159, 75,
- 86,193,172,195,207, 69, 2, 37,203,111,122,123,238,207, 99,110, 91,154,245,132,129,229, 5, 45,227, 34,180, 57,151, 0,236,135,
-113,195, 28, 74,207,151,164,168, 77,164, 86,187,169, 76,231,242,191,208,206,181,124,124,124,102,141, 30, 61, 26, 75,151, 46,197,
-181,141, 27,117,147, 9, 34,159, 13,208, 87,139, 94, 52, 25, 4,176,208, 88,158,145, 35, 71, 98,233,210,165,184,188,126,125, 77,
-121, 42,131, 45, 65, 16,193, 0, 16, 24, 24,248,227,218,181,107,173, 22, 45, 90,212,100,221,186,117,107,138,127,191, 42,217, 94,
-220,215,245, 90,180,104, 81,163, 50,219, 11, 1, 60,253,139,235,179,220,200,240,127, 53, 58,155, 56, 77,156, 38, 78, 19,167,137,
-211,196,105,226, 52,113,126, 14,104,154,238, 89,244, 81,241,103, 69,223,203,124,226,111, 46,115,209, 68, 40,211,139,155, 9, 38,
-152, 96,130, 9, 38,152,240,159,136,178, 86,172,154,108,255,130, 40, 25,163, 85, 22,123,128,162,105,221, 21,169,210,234,204,122,
-168,137,178,189,105,226, 52,113,154, 56, 77,156, 38, 78, 19,167,137,243,127,142,179, 42,238, 79,142,167,105,186, 39, 65, 16,193,
- 52, 77,247,170,232,179, 68, 88,125,252,189,204,231, 23, 27,118, 80, 14, 74,198,102,149,142,209,250,187, 66,246,152,204,170, 38,
- 78, 19,167,137,211,196,105,226, 52,113,154, 56, 63, 11, 37, 46, 64, 0,116, 96, 96,224,162,127,161,235,208,177, 88,100,149, 46,
- 85,186, 14,105,250, 20, 83, 34,129, 57,151, 43,228, 0,128, 86,171,212, 57, 57,161,128, 32, 6,253,147, 9,111, 77,248,207, 68,
-201,116,239,140, 47,188,175, 9, 38,152, 96,130, 9,255, 27,200, 42,177, 84, 1,200, 2, 64, 20,255,214, 22,127,102, 21, 11,178,
-143,191,127,176,253, 47,132, 20, 21, 12,126,103, 85, 36,178,178,179,133, 54, 44,150,204,211, 96, 80,127, 5, 0, 44, 22,227, 77,
-118,182, 85, 44, 77,159,202,174,137,216,178,177,179,123,206,102, 50,157,140,217, 87,111, 48, 72,178, 51, 50, 62, 12, 29, 79, 16,
-255, 13, 2,207, 88, 17,241, 57, 98,227, 47, 23, 42, 54, 54, 54,246,246,246,246,125,204,205,205,219,228,229,229, 61,201,202,202,
- 58, 87, 73,222,195,181, 4,129, 5, 69,215, 21,126, 1,176,168, 18,234,234,236,251, 49, 60,132, 66,225, 20,130, 32,124,138,111,
-176, 40,165, 82,185, 19,192,219,255,193, 7,146, 0,192,119, 44, 22,107,164,141,141, 77,171,244,244,244,229, 0,106, 26,205,155,
- 5, 96,174,165,165,229, 16, 75, 75, 75,247,220,220,220,184,130,130,130,147, 0, 54, 1,168,114,170,244,242, 25,142,109,218, 7,
-180, 95, 18,122, 45,116,213,242,109,210,135,159,108,159,235,104,221,181, 75,219,165,161, 23,195, 86,254,184, 35, 45,183,154,101,
- 99, 20, 47, 64,209,236, 72, 26,159, 6,123,253, 92,176, 1,244, 6,208, 30, 64, 40,128,139,198,156,119, 5,248, 26,192,143,197,
-101,222, 4,224,246,191,252, 58, 18,217,219,219,175, 7,208,155,197, 98,189,150, 72, 36, 19, 0,164,254,195,101, 98, 1,104, 9,
-192, 7, 69, 97, 56,158,194,184, 16, 14, 85,194,218,218,186, 23,139,197,154, 82, 28,218,101,103, 78, 78, 78,240,191,181, 97,184,
- 92,238, 22, 7, 7,135,113, 42,149, 74, 73, 16, 4, 93, 54,222, 35, 73,146,169,217,217,217,190,255,109, 15, 53,130, 32,158,254,
-203,139, 56,161,156,117, 21,199,209,146, 72, 96,206, 98,201, 60, 51,211, 35,135,164, 73, 95, 14, 6,128,218,142, 77, 78,218, 57,
- 52, 62, 33,145,112,117, 14, 94,253,196,108, 33,107, 39,147,201,110,166,214,106,108,216, 44,118,182,142,212,135, 51,180,244,148,
-244,152,115,229, 6, 91,100, 51,153, 78,137,177,183,237, 72, 93, 46,216,252,218, 96, 11,234, 84, 88,218,218,181,107,215,232, 44,
-173,172,220,205,116, 60,254, 44, 54,155,217,133,162, 73, 31,154, 2, 24, 4, 59,138, 52,232, 67, 56, 26,205,175, 50, 89, 92, 97,
- 77,107,208,203, 26, 14, 52, 48, 20, 4,186,128,198, 13, 2, 56, 30,147,131,244,106, 80, 24, 43, 34, 62, 71,108,148, 61,118, 51,
-128,121, 95,250, 74,114,114,114,178,234,213,171,215,150,159,127,254, 89, 32, 22,139,137,228,228,228,128,133, 11, 23,126,251,236,
-217,179, 57, 18,137, 36,237, 99,209, 71, 16, 88, 64, 81, 52, 3, 0, 24, 12, 98,161,173,173,157,144,201,100,126, 18,219,200, 96,
- 48, 8,179,178, 50,167, 81, 20, 77, 20,239,187,128,166,177,213, 24,193,200,231,243,191,247,105,220,108,206,250, 13,155,196,246,
-118,118, 34,210, 64,233, 18,146, 18,133, 75, 2,231,181,126,255,238,237, 86,181, 90,125,172, 38,247, 53,147,201, 28,194,227,241,
-122, 1,240, 46, 94, 23,173,209,104,130, 13, 6,195, 9, 99, 59,116,123,123,251,187, 76, 38,179,110,117,254,216, 96, 48, 36,103,
-100,100,248,213,176,137, 6,213,169, 83,103,191,191,191,191,176, 85,171, 86,224,114,185, 88,186,116,233, 92,169, 84, 90,149,208,
- 98, 1,152, 43, 20, 10,135,136, 68, 34,119,185, 92,254, 94,165, 82,157,225,114,185,157,183,110,221,234,210,182,109, 91,179,140,
-140, 12,130,201,100,218, 95,190,124,249,135, 45, 91,182, 4,144, 36,217,169,170, 78, 46,255, 61,189,132,215,219,187, 93,254,251,
-219, 75, 0,116,255,120, 59,169,230,143,164,153, 46,189, 84,244,139,148, 98,241, 97,180,200, 98,179,217, 91, 29, 28, 28, 70,171,
-139, 98, 5,208, 31,119, 56, 0,160,213,106,101,121,121,121, 94, 53,185,229, 1,140,181,180,180, 28, 61,127,254,124,171,238,221,
-187,227,200,145, 35, 83,247,238,221, 43, 43, 40, 40, 56,128,162, 64,152, 49,213,228, 92,144,158,158,222,131,205,102, 19, 46, 46,
- 46, 76,149, 74, 85, 29,161,229,137,162, 36,204, 79, 1,236, 68, 81,232,130, 14, 64,209,253, 14,224,151, 18,225,198, 96, 48,118,
-122,121,121,245,137,142,142,222, 5, 96, 85, 77,239,117, 7, 7,135,223,119,236,216, 49,184,111,223,190,204,172,172, 44,167,166,
- 77,155, 30, 77, 79, 79,111,247, 5, 30, 35, 99,120, 60,222,236, 38, 77,154, 52,140,137,137,137, 45, 40, 40,216, 84, 92,159,149,
-221, 83,206, 0, 58, 91, 90, 90,118, 90,188,120,177,184, 87,175, 94,216,179,103, 79,143,189,123,247,202, 11, 11, 11, 67, 80, 52,
-166,231,179, 68, 32,139,197,154,146,154,154,106, 67,211, 52, 28, 29, 29,167, 0,248, 87, 10, 45, 6,131,177,181,127,255,254,163,
-143, 30, 61, 42, 76, 76, 76, 20, 58, 57, 57,149, 6,207, 38, 8,162,198,253,167, 9,159,141, 61,101, 4, 87,213,113,180,184, 92,
- 33,199, 96, 80,127,149, 38,125, 57,248, 91,255,237, 22, 0,112,247,206,244,193,118, 14,141,162,184, 92, 97, 44,207,156,127,182,
-127,239,206,205, 6,246,242, 39,156, 29,237,144, 42,205,180,255,227,248,181,110,193,215,110,159, 69, 81, 0,177,114, 65,234,114,
- 33,208,221, 68,204,253,109,176,105,159,134,223, 46,167,226, 97, 68, 2,148,249,217,168,235, 32,192,134, 89, 93,225, 96, 37,172,
-217,171,151,157, 71, 7,146,197, 59, 49,236,251, 17, 22,125,190,243,102,187, 58, 56,128,166,121,136,125, 47,255,230,202,245,219,
- 45,207,156, 58, 54, 69,196,246, 24,162,200,124,107,244,195,173,185, 35, 4, 10, 29,190, 99, 49,137, 31,218,250, 54,236,244,125,
-143,118,140,134,222, 13,240,250, 85,116,215, 11,183, 30,111, 96,132,189, 10, 33, 13,116,144,136,131,243, 47,164,149, 6,244,251,
- 68,112,116,234,212,185, 29,143,199,251, 32,120,146, 70,163,225,132,132,220,252,186, 38, 98,163,228, 63,180, 90, 13,131,205,230,
-130,193, 32,230,248,248, 52,246,206,206,206,190, 77, 16,196,254,180,180,234, 89, 11,166, 3, 92, 25,139,213,130,193,227, 57, 26,
-180, 90,107, 0, 32,184, 92, 89, 2,131,209,120,241,143, 63,138,153, 76, 38,149,147,147, 3,165, 82, 73,140, 31, 63,158,255,254,
-253,251,254, 18,137,100, 91, 21,111, 36,216,187,119,175,167,163,163,227, 39,217, 99,165, 82, 41,183,111,223, 62, 53,105,122,207,
- 38, 77,155,207,190,118,237,170,119, 65,174, 76,189,119,243,239,207,245,124,161,166,158,183, 23,123,231,158, 67, 22, 19, 70, 15,
-159,254,230,205,171,112, 84, 47, 95, 93, 29,129, 64,112,118,227,198,141, 62, 29, 58,116, 96,219,217,217, 33, 35, 35, 3,209,209,
-209, 62,183,110,221,250,238,208,161, 67,115, 85, 42, 85,127,192,168,132,168, 30, 33, 65,251,237, 68,181,172, 97,208,235, 81,187,
- 73,243,210, 1,146,239,110, 93, 7,169,211,129,210,235,225,221,235,187, 98,107, 50, 13,111,111,239,154, 70,221,173,221,168, 81,
-163,195,107,214,172,225,104, 52, 26, 60,126,252, 24,183,111,223,166,164, 82,105, 85, 1,113, 89, 4, 65, 92, 95,182,108,153,179,
-159,159,159, 89,118,118, 54, 12, 6,131,205,249,243,231,167, 52,107,214,204,220,197,197,133, 27, 20, 20, 4,185, 92, 14,146, 36,
-107,185,187,187,215,250,254,251,239,181, 65, 65, 65,115, 1,172,175,200,146, 85,240,158, 94, 34, 37,220,187,121,181, 24,137,116,
-226,106,183,217,221,112,197,188, 62, 81,106,217,234,230,238,110, 86, 32, 17, 46, 20,155, 55,174, 85, 32,185,185,176,155,187,251,
-222,171,113, 70,189, 12, 49,138, 59,155, 97,199,143, 31, 23, 70, 71, 71, 11,189,189,189, 65, 81, 84,105, 4,254,146,128,179, 30,
- 30, 30, 53,169,199,117,147, 38, 77, 90, 56,120,240, 96, 52,105,210,164, 52, 40,234, 79, 63,253,132,133, 11, 23, 90,221,189,123,
-119,238,177, 99,199,230,158, 59,119,110, 61,128,192,106, 90, 99, 74, 80,221, 54, 94, 17, 31, 31, 63,232,236,217,179,195, 23, 44,
- 88,224, 1, 96, 26,128,165, 57, 57, 57,254,197,214, 24,110,177,208, 26, 51,119,238,220,201,129,129,129,232,209,163,199,210,199,
-143, 31,175,174,161,149,143, 73,146,100,143,190,125,251, 50,245,122, 61, 68, 34, 17,244,122,125,253,207, 53, 74, 0,216, 49,113,
-226,196,201,147, 38, 77,130,149,149, 21,244,122,189,231,241,227,199,247, 46, 93,186,180, 13,128,177, 21,148,117,228,228,201,147,
- 7,140, 24, 49, 2,190,190,190, 96,177,138,170,113,227,198,141, 88,185,114,165,248,250,245,235,223, 5, 5, 5,125,119,225,194,
-133, 51,248, 48,109, 87,181, 64, 81, 20, 88, 44, 22, 82, 82, 82, 96,103,103,199,163, 40,234, 26, 65, 16,123,114,115,115,207,253,
-139, 58,243, 95, 6, 13, 26, 52,236,232,209,163, 98, 0,216,176, 97, 3,102,207,158, 13,123,123,123,136,197, 98,147,212,249,247,
- 88,180, 38, 84,105,209,170, 10, 74,165,178,249,162, 25, 63,128,193, 40,122,107,108, 80,175, 14,214,254, 56,129,184, 16,124,173,
-121,165, 54,120,126,109,196,220,223, 6,158,203, 44,104,244, 36, 30, 69,196,227,198,134,128,162,222,178,251, 98,104,116,157, 74,
- 58,155, 90, 92,129,224, 23,173,193,240, 0, 14, 14,143,145,148,148, 85,149,200,178,117,176, 15,222,189,123,189,192,167,190, 23,
-116,164, 30,146, 76, 9, 8,130, 7,103, 39, 51,140, 25,217,157,237,239, 95,219,102,197,138,223, 47,165, 83,232,167,204,126, 91,
-101,192, 80, 79, 27, 28,108,238,227, 49,248,251,158,126,188,198, 62,141,192,225, 9, 74,183,181,240,245, 69, 11, 95, 95, 70,160,
-188,176,203,147,167,207,187,156,190,254, 72,163,212, 39,157,140,205,198,168, 42, 30, 50,165,130, 99,230,204,153,176,183,183,255,
- 96,135,140,140, 12,220,186, 21, 82,238, 49,213,120,144,149,254,199,234,213,171,205,100, 50, 89,247,125,251,246,117,164, 40,106,
-117,122,122,250,125, 99, 72, 70, 0,117,243,121,188, 78,163, 55,109,162,154,245,233,195,180,116,112, 96, 80, 6, 3,145, 22, 23,
-103,189,121,219,182,246,185,239,222, 9, 20,181,106,229,202, 84, 42,101,108,108, 44,248,124, 62,193, 98,177, 90,150, 67,149, 65,
-211,248,133,193, 32, 22, 18, 4, 1, 30,143, 31, 59,105,210,164, 23,197,219,234, 94,188,120, 81,216,187,119,111, 37,128, 68, 0,
-224,241,248, 78, 76, 38,195,179,104, 0, 33,126, 49, 70, 96,138, 68,162, 25,171,214,172, 23, 21,228,230,169,116, 10,133,222,214,
- 92, 76, 16, 98, 51,102, 65,126, 97,161, 68,154,165, 89,188,124, 37,115,226,152, 17, 51, 20, 10,197, 20, 99, 69, 86,211,166, 77,
-159,156, 61,123,214,206,218,218, 26,121,121,121,200,201,201,193,147, 39, 79, 64, 81, 20,250,247,239,207,251,166,117,171,230, 63,
- 46, 94,242, 48, 69, 34,105, 99,140,216, 18,213,178,193, 6,191,102, 69,157,117, 98, 78,105,251,236, 25,212,171,116,159,149,169,
-249, 37,214,185,207, 73, 33,213,166, 83,167, 78, 28, 0, 24, 59,118,108, 65, 97, 97,225, 90, 0, 71, 81,117, 68,255,185, 75,150,
- 44,113,170, 87,175,158,235,209,163, 71, 33,151,203, 1,192,174, 94,189,122,240,244,244, 52,132,134,134,194,211,211, 19,102,102,
-102,184,123,247, 46, 30, 62,124, 8, 95, 95, 95, 51, 14,135, 51, 88,167,211,149, 43,180,218, 7,180, 95,194,235,237,221,206,171,
-197, 72,136,205, 29,177,247,216, 9,196, 60, 63,212, 78,163,139, 94,194, 49,220, 25,161,162,121,163,178,146,197,129,117,125,253,
-173, 27, 52,234, 3,215, 22, 47,108,212,134,123,241, 75,186,212, 91,199,226,171, 15, 45,223, 36,205,169, 72,100, 1,216,208,191,
-127,255, 65,199,143, 31,183, 4,128,200,200, 72,100,100,100,192,214,214, 22,124, 62, 31,108, 54,187, 52, 63,105, 13, 49,106,231,
-206,157,165,162,141, 36,201,210, 44, 0, 66,161, 16,223,126,251, 45,154, 53,107,134,115,231,206,141,170, 64,104,249,181,110,221,
-250,136,171,171,171, 75,217,149, 10,133, 2, 67,135, 14, 5, 0,248,251,251,119, 18, 8, 4,116,137, 32,148, 74,165,242,167, 79,
-159,118, 1,240,184, 2,101,169,146, 72, 36,152, 63,127, 62, 18, 18, 18,166,238,222,189, 59, 9, 0,159,203,229,150,190, 31, 3,
-240,108,212,168,209,214,217,179,103,227,253,251,247,120,253,250,245, 19,212,220,149,106, 16,137, 68,239,244,122,189, 47, 73,146,
- 80,169, 84,232,215,175, 31,255,204,153, 51, 25, 76, 38,243, 77,118,118,246,112, 20,141, 73, 49, 22,124, 0,155, 38, 77,154, 52,
-121,193,130, 5, 8, 9, 9,193,133, 11, 23, 48, 98,196, 8,204,154, 53, 11, 98,177,120,244,172, 89,179, 30,162, 40,161,249,199,
-232,180,115,231, 78, 24, 12,134, 79,238, 13, 62,159, 15, 63, 63, 63, 52,108,216, 16, 23, 46, 92,232,244, 25, 66,203,213,207,207,
-143, 75, 81, 20, 20, 10, 5, 66, 67, 67,197, 2,129, 64,236,236,236, 60, 30,192,191, 70,104,185,186,186, 78, 58,126,252,184,184,
-172,247,135,199,227,161,204,117, 96,194, 63,111,209,170,244, 13,171, 20, 90,173, 82,199, 98, 49,222,212,118,108,114,242,238,157,
-233,165,174, 67,128,241, 70,171, 85,234, 0,192, 64,209, 40, 80,146, 16,240, 24, 72, 76, 47,196,171,184,236,242,168, 62,152,162,
-201, 22,212, 1,175, 85, 34,104,154,134, 86,103,128, 38, 63, 29,107, 47, 41, 17,157,170,134, 86, 33,131, 86, 87, 52, 12,203,198,
-198,134,117,237,218,149,217, 55,111,222,154,124,224,192, 1,102,170,133,197,235, 66,160,121,121,156, 86, 86,238,102, 20,151,123,
-114,215,238,165, 2,154, 25,135,216,100, 5, 26, 56,183,130,141,165, 11,210,179, 21,120,240,250, 50,222,188, 13, 70, 61, 71, 87,
-204,154,209,141,191,106,205,209, 19, 28,210,173, 78, 94, 94, 66, 65, 69,229, 44,121,139,250,253,106, 44,200,220, 56, 24,114,222,
-195, 80,152,246,201, 14, 98,219, 58,104,209,193, 9,182, 46,245,121,163,102,173, 28, 9,124, 32,180,202,114,102, 16, 4, 99, 23,
-131, 65, 76, 38, 8, 2, 77,154, 52, 77,221,180,105, 83,121,161,192,117, 77,154, 52, 77,101, 50, 25,206, 69, 15,118,198, 78,154,
-166, 50,170, 40,231, 7,162,134,203,229, 45, 40, 50,251, 59,166, 92,186,116, 73, 55,104,208, 32,108,220,184,145,187,112,225,194,
-197, 76, 38,115,108, 57,238,189, 15, 56,251, 1,117, 44,235,215,239,186,250,193, 3,154,173,215, 19,185, 79,158, 20,228, 73,165,
-100,122, 97, 33,247,212,155, 55, 61,198,205,155,199,117,113,113,193,253,224, 96,235, 44,133,130,206,211,104, 84,121,121,121, 52,
- 73,146, 79, 42,224, 92,100,107,107, 39,220,187,119,175,231,164, 73,147, 94, 72,165,210, 69, 0,224,232,232,184, 22, 64, 67, 0,
-137,101,214, 97,247,238, 19,146,241,227,199,199,102,102,102, 46,170,172,156,101,208,200,206,214, 78,120,236,247,160,151,181,204,
- 4, 12, 91,231,218, 12,182,165, 37,139,228, 10, 56, 20,160,170,231, 82, 95, 4,160, 81, 5,199,126,204, 73, 8, 4,130,179,127,
-254,249,167, 29,155,205,134,193, 96,128,173,173, 45, 18, 18, 18,144,151,151,135,194,194, 66,196,191,137,134,155,139, 11, 86, 4,
- 46,116,156,182, 48,240,172, 82,169,244,253,168, 51,251, 52, 1,178, 94,247,137,101,175,188, 44, 6, 31,187,189,140,108,247,178,
- 72, 72, 78, 78,134, 88, 44,134,143,143,143,248,193,131, 7,247, 42, 17, 89,101,147, 0, 15,110,219,182,173,217,209,163, 71,225,
-235,235, 11, 11, 11, 11,132,134,134, 34, 50, 50, 18, 58,157,142, 33,151,203, 33, 22,139,177,110,221, 58,212,169, 83, 7,133,133,
-133, 72, 76, 76,180,102,179,217, 54, 31, 69,180, 47,229, 12,189, 22,186, 42,255,253,237, 37,233,196,213,110,123,143,157,192,248,
-239,135,192,129,142,187,103, 81,159, 88,213,181,119,219,159,104,166, 75, 47,145, 89, 19, 43, 15,159,222,224,112,197,152,182, 96,
- 37, 98,163, 46, 90, 41, 11, 95, 78, 37, 12, 41, 46,203, 55,157,154, 89,206,185, 19, 0, 24, 46, 46, 46,227, 78,157, 58,101, 86,
-106,122, 97, 50, 75,115, 30,150, 77, 2, 95, 73,194,247, 42,235,147, 32, 8, 36, 36, 36,192,206,206, 14, 98,177,184, 52,129,120,
-116,116, 52, 30, 61,122,132,146,108, 20, 21,112, 14,191,121,243,166,139, 72, 36,250, 96, 7,154,166,145,157,157, 13,146, 36, 33,
- 20, 10, 97, 48, 24,160,211,233,160,215,235,161, 86,171,197, 13, 27, 54,156,162,215,235, 31,151,199, 73, 81,212,156,193,131, 7,
-183,125,252,248,177,251,182,109,219,160,213,106, 55,164,167,167, 99,192,128, 1,160, 40, 10,157, 58,117,250,154,166,233,152,197,
-139, 23, 3, 0,102,207,158,173, 87, 40, 20,147,106,114,238,197,104,216,162, 69, 11,247,144,144, 16,180,107,215, 14, 26,141, 6,
- 27, 55,110, 52,223,189,123,183,121, 80, 80,144,237,130, 5, 11,246,103,101,101, 5, 84,193, 73, 0,216,224,224,224, 48,185,125,
-251,246,130,226, 28,166, 56,116,232, 16, 86,172, 88,113, 28,192,226, 43, 87,174, 44,187,112,225,194,200,113,227,198, 97,197,138,
- 21,179,242,242,242,246, 85,196, 25, 31, 31, 15, 91, 91, 91,152,155,155, 23, 61, 44,117, 58,132,135,135,227,198,141, 27,248,234,
-171,175,140, 57,167,138,202,233,218,191,127,255,253,199,142, 29, 51, 75, 73, 73,193,221,187,119,225,230,230, 6,165, 82,105, 76,
-110,216,155,127, 65,135, 93, 33,167, 74,165, 82, 39, 39, 39,139,215,175, 95, 15, 71, 71, 71,184,186,186,130,207,231,131, 32, 8,
-232,245,250,202,194, 9, 84, 89, 78,127,127,176,178, 37, 86,125, 45, 44,173,166,210, 52,205,202,207,151,253,174, 67,222,233,184,
- 56,104,255,198,115,255, 79, 70,115, 0, 47,240, 97,206, 67,105,169,208, 10, 14, 14,166,123,245,234, 69,148,124, 58, 57,161, 32,
- 59,219, 42,214,206,161,241, 9, 59,135, 70,197,121,191, 24,111,152, 76,171, 88,123,123,101, 1, 0,232, 72, 26, 97,111,242,240,
-242, 93, 58, 34,223,165, 67,196, 51,206,248,162,209,145, 69, 35, 86,105, 26,106,249,255,191,180,234,148, 50,104,116, 69,195, 61,
-180, 26, 37,242,179, 94, 19,131,250,117,225, 79,158, 60, 17,142,142, 78,182, 21,241,233,120,252, 89,211,102,247,176,172,101,201,
- 70,240,131,171,248,250,171,126,224,243,216,200,201, 87, 3, 4,240, 54,238, 6, 64,153, 33, 42, 54, 25,173, 27, 9, 17,208,213,
- 91,124,238,116,204, 60, 0, 75,141, 41, 47,153,250, 4, 28,143,238, 96, 27,244,208,103,199,128,202, 75, 2, 68, 14, 80, 17, 98,
-228, 72,147,240,230,222, 25,163,222, 25, 41,138,154,106, 99, 99,147,183,120,241,226,246, 13, 26, 52,208, 77,153, 50, 37, 34, 41,
- 41,105,206, 71,111, 43,191,238,220,185, 19,239,222,189,147,172, 94,189, 58, 52, 59, 59,123, 73, 53, 27, 58,144,166,177,165,216,
- 21,151,125,254,252,249, 22,119,238,220,153,181,101,203, 22,251,233,211,167,115,167, 79,159, 62, 6,192,207,149,185, 11, 11,120,
-188,206,171,239,222,165,201,212, 84,205,225,237,219,185, 59,194,194, 22,235, 40,170,182,141,157, 29,241, 77,235,214, 10, 33,131,
-145,157,147,145, 65,218,186,187, 51, 19,110,220,176,166, 5,130,180, 43, 87,174, 20,200,229,242, 10, 83,231, 48,153, 76,101,121,
-238,194,242,224,232,232,168, 45,111, 12, 87, 37, 29, 98, 1, 69,211, 58,203,122,245,232,174,157,218, 52,120, 23, 19, 23,199,183,
-180,100,122, 52,112,243,122,245, 38,225, 9,109, 48,168, 9,130, 40, 48,202, 87,194,100, 14,217,178,101, 75, 99,115,115,115, 80,
- 20, 5, 11, 11, 11,100,101,101, 65,171,213,162,160,160, 0,218,194,124,104,243,243, 17,153,148,128,182,237,219, 99, 80,183,174,
-222, 65,231,255, 28, 98, 48, 24,142, 87,234,207,107,210,188,212,146,181,178,174,245,255,251,130, 82,242, 74, 69,215,250,230, 30,
-224,136,197,232, 50, 39,240,115,110,244, 23,151, 46, 93,186,220,191,127,255, 30,243,230,205, 99, 72,165,210,171, 9, 9, 9,109,
- 1,188,174,236, 32,177, 88, 92, 63, 59, 59, 27,114,185, 28, 22, 22, 22,216,178,101, 11,236,237,237,161, 84, 42,241,244,233, 83,
-218,217,217,153, 8, 13, 13,133,179,179, 51,114,114,114,160,211,233,160, 82,169,210,181, 90,109,133,238,242, 98,247, 96,247,217,
-221,112, 37,230,249,161,118, 78, 68,252,211,193,115,253,223,197, 68,190, 73,190,126,227,193,207,164,154,159,146,151,122,115, 97,
-189,150, 47,108,166,206, 95,129,223, 54, 44, 67,204,227,187,185,246,117, 10,118, 8, 8,205,193,202,202,171, 80, 40,212,111,222,
-188, 49,139,136,136, 0, 65, 16,176,176,176,128, 80, 40, 44, 87,108,213, 0,140,178, 22, 40,133, 66, 1, 14,135, 3,107,107,107,
-236,219,183,175,180,227,117,115,115,171,140,227,247, 46, 93,186, 12,169, 83,167,142, 89,217,149, 45, 91,182,196,196,137, 19,177,
-107,215, 46,132,133,133,125,144, 79, 51, 61, 61, 93,170,215,235, 43, 59,239,188,140,140,140,110,253,250,245,123,126,239,222, 61,
-243,125,251,246,129, 36,201,114,151,189,123,247,226,209,163, 71, 75, 1,188,169,225,117,244,213,128, 1, 3,238, 30, 57,114,196,
- 50, 43, 43, 11, 37,215,134, 66,161,128,193, 96,128,151,151, 23, 65,146,100, 85,227,222, 24, 76, 38,243,252,246,237,219,123,143,
- 31, 63, 30, 44, 22, 11, 90,173, 22,219,183,111,199,194,133, 11, 51,138, 95, 74,117, 0, 22, 31, 60,120,112,100,159, 62,125,208,
-180,105, 83,239,219,183, 43, 30,217, 33,151,203, 33,151,203,193,102,179,225,224,224,128, 85,171, 86, 65,171, 45,122,172,120,122,
-122,150,222,198, 0,126,247,244,244,236, 29, 27, 27,187, 17, 69, 99,215, 62,129,131,131, 67, 63,154,166, 39, 24, 12,134,194,118,
-237,218, 89, 31, 59,118,204, 76, 34,145,224,249,243,231, 88,186,116,169,140,162, 40, 3, 69, 81,132, 74,165,138,183,179,179,123,
-206,227,241, 4, 74,165, 50, 55, 39, 39,103, 13,128,171,255, 84, 79, 78, 16, 4,193,102,179, 49,118,236, 88,176, 88, 44, 8, 4,
- 2,168,213,106,232,245,250, 82, 49,143,106,186,165, 27, 52, 16, 91,179,192, 25,111,101,214,112,214,160,153,189,108, 29,107, 59,
-193,210,156,135,232,232,215,109,111,133,220,216,206,101,197,236,166,180,250,221, 49,137,249,127,121,178,251,143,181,200,127,168,
-208,250, 36,231, 33,171,252,198, 28,100,160,233, 83,217, 18, 9, 87,199,229, 10, 99, 75,172, 92,246,246,202, 2,130, 24,100,176,
-109,212, 23,164, 78, 95,252,160,160,139, 23, 35,133,150,222,128,119, 49, 81,184,119,253, 79,216, 40, 37,200,142,111, 6,112, 26,
- 67,171,202,135, 90,171, 43, 22, 37, 6, 68, 60, 15, 65, 65,126, 46,124,124,123, 1, 12,198,163,138,248, 44,172,137, 94,223,180,
-104,194,124,151, 28,133,150,158, 3,225,238,220, 14, 73,210, 2,228,201, 53,144, 21,168,209,204, 39, 16, 89, 50, 21, 10,148,106,
-188,126, 23, 4,167,218,238, 12,130, 21,215,201, 88,161,165,121,125, 22,154, 55, 23,192,113,109, 11,174, 87, 31, 48, 93,253,144,
-252,242, 54, 34,174,108, 70,234,171,251,160, 41, 3, 28, 61, 91, 25,123,147,108,191,122,245,106,171,182,109,219,178, 58,119,238,
-220,244,242,229,203, 77,165, 82,105, 68,177,192,104,218,185,115,231,166,182,182,182,216,186,117,171,138, 32,136,237, 53,108,236,
- 82, 11, 88,102,102,230, 19, 0,171,207,158, 61,187,125,226,196,137,176,179,179,107,156,150,150, 86,225,129, 89,108,118,211, 81,
-107,214,208,108, 38,147, 62,254,219,111,156, 21, 87,175,110, 58,112,240, 32,167, 99,135, 14, 4, 77,211, 8, 15, 15, 23,174,255,
-237, 55,225,176,190,125, 19,147, 50, 51,201, 59, 97, 97, 58,105,106,106, 97,166, 66,177, 66, 42,149,166,255, 19, 87,182, 94,175,
-127, 24,159, 16,239,228,219,186,153,237,139,232,248, 87, 1, 29,191,249,134,193, 96, 48, 98,226,146,194,108,109,205,133, 55,174,
-223,208,233,245,250,135,198,112,241,120,188, 94, 29, 59,118,100,201,100, 50,212,174, 93, 27, 89, 89, 89,144, 72, 36, 69, 22,135,
-124, 25,116,249,249,208, 23,228,193,160,144, 35,254,233, 19, 52,115,175,199, 59,197,227,245, 82, 42,149,149, 10,173,146,183,204,
-242, 18, 93,151,172,227,154,153,129, 43, 22,131,168,190,219,176,175,165,165,229,194,188,188,188,203, 0, 86,233,116,186,105, 11,
- 23, 46,108,185,109,219, 54,155,213,171, 87,155, 79,152, 48,225,148, 92, 46,111,134,162,164,170, 21,117, 96,239, 73,146,180, 6,
- 96, 31, 18, 18, 2, 59, 59, 59,228,231,231,151, 88, 90,180, 74,165,146,159,147,147, 3,141, 70, 3,173, 86, 11,115,115,115, 60,
-123,246, 44,151, 36,201,139, 85, 21,206,188, 62,177, 74,163,139, 94, 98,237, 45, 74,211,145, 86,254,153,185,148,108,249, 38,233,
- 74, 0,155,186,185,187,239,213, 81,119,227,223, 70, 93,180, 74,120, 26,154,155,246, 86,225,190,239,114,124,101, 99,180,104, 0,
- 20, 65, 16,180,145,103,230,210, 0, 0, 32, 0, 73, 68, 65, 84,167,167, 39,178,178,178,192,100, 50, 33, 20, 10, 33, 22,139,177,
-104,209, 34,108,223,190,189, 38, 66,139, 47, 18,137,214, 48, 24,140, 33, 12, 6,195,214, 96, 48, 32, 48, 48, 16,189,123,247, 6,
-151,203,133, 78,167, 43,181,104,150, 88,169,170,176,116,132, 63,122,244,200,252,209,163, 15, 30, 91, 29,108,108,108,110,105, 52,
- 26,196,197,197,225,252,249,243,237, 1,220,169,102, 91,199,133,135,135,119,243,243,243, 59,212,162, 69,139,250, 52, 77,163,113,
-227,198, 24, 58,116, 40,130,130,130, 16, 17, 17,129,252,252,124,234,198,141, 27, 7, 0,108,172,110, 31, 94, 92,191, 94, 3, 6,
- 12,184,127,244,232, 81,171,156,156, 28,168, 84, 42, 40, 20, 10,156, 58,117, 10,109,219,182,133,141,141, 13,142, 28, 57, 66,210,
- 52, 93, 89,219, 51, 24, 12,198,190,221,187,119,247, 30, 55,110, 28,118,236,216,129,227,199,143,163, 79,159, 62, 24, 50,100, 8,
-178,178,178,236, 55,108,216, 48,178,216, 77,184,108,232,208,161,144,203,229,120,250,244,105,180,145,247, 60,242,242,242,144,151,
-151, 7,129, 64, 80,246, 30, 35, 0, 4,109,222,188,249,251, 89,179,102,193,221,221,125, 89,124,124,252,102,148, 51, 75,148,162,
-168, 73, 18,137,196,138,197, 98, 89,147, 36,137,148,148, 20, 60,123,246, 12, 83,167, 78,205,205,205,205,157, 8, 32, 9,192,226,
-177, 99,199,174,154, 51,103, 78,233,181, 52,103,206,156,224,203,151, 47,119,251,187,173, 57,158,158,150,141,184, 76,222, 76, 89,
- 33,211, 90, 38,147,149, 62, 59,180, 90, 45, 52, 26,205, 7,150, 44, 14,135,109,221,178, 89,157, 75, 42,101,225,143,175,223,230,
- 85,152, 32,221,187,190, 69, 19,161,200, 98, 86,219,118, 29,135,119,237,246, 29,147,212,235,113,237,218, 69,252,241,199, 78,116,
-240,243,132,123,131,198,152, 62, 99,166,133, 70, 75, 6,222,184,113,117,161,229,163,123, 87, 11, 11,242, 22, 85,198,249, 63,142,
- 75,197,226,234, 82,185,174,195,242, 20,100,113, 8, 7, 89,241, 79, 27, 43, 43,171,223, 12, 6, 67, 7,115,115,115, 80,121,177,
-120,253,236, 49,114,101,108,104, 84, 6, 80,116,145,216, 50, 74,184,104,180,184,123,237, 2,182,108,222,132,156,156, 28,248,125,
-219, 30,114,150, 11,234,184,212,129, 90,165, 44,190,105, 0,157, 86, 15, 91,123, 87,188,120, 17,161, 47, 80, 40, 42,124, 32,113,
-248, 58,239, 58,246,158,208,232,218,128,207,229, 34,191, 80, 11, 89,177,200, 58,114,122, 48, 52, 74, 21, 72,173, 14,164, 86, 15,
-219, 58, 3,240,149,125, 71, 80,134,139,141,170, 85,125,148, 1,186,132,187,208, 37,220,133,160,205, 12,252,185,246,251,143, 58,
- 82,227,242,238,102,101,101,101,190,122,245,234, 98,120,120,120,191,193,131, 7,227,246,237,219, 19, 0, 76, 46,118,223, 76, 24,
- 60,120, 48,194,195,195,241,234,213,171,139, 89, 89, 89,153, 95,162,229,185, 92,174, 74,163, 41,234, 99,133, 66, 33,191,138,125,
-157, 90,246,239,207,200,127,241,162, 96,243,131, 7,203,246,238,219,199,233,220,169, 19,161, 39, 73, 80, 6, 3, 26,120,120, 16,
- 93,187,118, 21, 5,157, 60,105,205,212,235, 31,205,159, 54, 45,100,215,136, 17,133, 79, 20, 10, 99, 7,154,215, 45,118, 25, 2,
- 64,221, 74,214, 25, 13,141, 70,179,109,210,248,209,157,239,220,189,239, 82,199,197,201,252,218,141, 59, 17, 60, 1,151,225,238,
- 86,159, 41,203,207,101,173, 92,246,163, 64,163,209, 24, 43, 90,189,109,108,108,144,158,158,142,119,239,222, 65,163,209, 64,175,
-215,131, 82, 42,160,149,229, 65,155,159, 11, 66,173, 2,207, 96,128, 58, 59, 3,117,221,235, 1,255, 63, 35,177, 74, 87, 84,121,
- 66,171,228,147,111,110, 14,142, 72, 12, 6,155,109,116,114,116, 0, 45, 90,181,106,117,242,204,153, 51,156, 49, 99,198,180,190,
-121,243,230,111, 0,146, 36, 18, 73,167,165, 75,151, 62,249,237,183,223,120, 19, 39, 78,244,218,184,113,227, 72, 0,191, 87, 68,
-162, 86,171, 79, 94,186,116,105,152,171,171,171,125,100,100, 36,212,106, 53, 40,138, 66,247,238,221,129,162,177, 53, 0,128,152,
-152, 24,149, 90,173,206,140,138,138, 42, 72, 74, 74,210,193,136, 89,130,203,183, 73, 31, 22,164,223,237,111,239,224,244,136, 47,
-168,235, 70,203, 95,244,155, 61,208,105,195,230,211, 18,245,213,184,184,194, 37, 93,234,173, 83, 20,190,156,106,233, 44,223,113,
- 53, 56,222,152,129,240,165,179, 11,173,173,173,193, 98,177,192,102,179,193,225,112, 64, 16, 4,102,204,152,129, 61,123,246, 84,
-229, 58,252, 64,100,153,153,153,189, 90,177, 98,133,243,196,137, 19, 57,124, 62, 31, 50,153, 12, 71,142, 28,193,216,177, 99,241,
-199, 31,127,148, 59,254,197, 8,151,210,199,214,210, 89, 35, 70,140,128, 86,171,197,208,161, 67,177,119,239,222, 89, 6,131,225,
- 78, 13,110,233, 71, 17, 17, 17, 30, 17, 17, 17,230, 0,250, 12, 25, 50,228,224,128, 1, 3,112,231,206, 29, 92,188,120,177, 61,
-138, 38,125,168, 0,172, 5, 96, 87,252, 89,217,253, 41,178,183,183,223, 73, 81, 84, 31, 91, 91,219, 8, 79, 79, 79,159,163, 71,
-143, 90,102,102,102,150, 76,126, 64, 66, 66, 2,246,239,223, 47,221,183,111, 95,129,193, 96,176,102, 48, 24,151,242,242,242, 22,
- 85, 34,216,246,109,222,188,121,116,177, 59, 16,103,206,156,161, 55,109,218, 68, 44, 93,186, 20, 50,153, 12, 29, 58,116,192,238,
-221,187,103,202,229,242,166,155, 54,109, 26, 63,104,208, 32,172, 92,185, 18, 10,133, 98,115, 85, 47, 43,149,136, 47, 2,192, 55,
-155, 55,111,118,157, 53,107, 22,206,156, 57,131, 22, 45, 90, 8,226,227,227,119, 1, 24, 87, 94,251,209, 52,141,248,248,120, 40,
-149, 74,220,191,127, 31,203,150, 45,147,149, 17, 89, 51, 39, 79,158,188,106,230,204,153, 88,179,102, 13, 29, 25, 25,153, 57, 96,
-192, 0,251, 61,123,246, 48, 27, 52,104, 48, 83,169, 84,254,109, 66,203,171, 65,173,117, 45, 91,180, 91,232,232,212, 0, 71,142,
- 30, 67,110,110,110,105,157,148,212, 11, 77,211, 40, 44, 44, 68,122,122, 58, 44,204,205,176, 97,227,170, 30, 83, 38,140,118, 65,
- 81, 24,140, 79, 77,150,238, 86, 27, 7, 12, 25, 51,119,232,176,209,136,140,120,142,160,131,191, 35, 42, 50,188,148,143,212,235,
- 16, 27,253, 12,177,209,207, 96,239,224,138,174,157,219, 19,223,127,255,125,247, 17,195,134,216, 2,248,203, 66, 71,252, 7, 91,
-179,128, 79,227,104,237,249, 64,104, 85, 97,174,179,177,178,178,122,117,226,196, 9,107, 63, 63, 63, 38, 73,146,184,122,237, 26,
-166, 78,254, 1, 35, 71, 4, 66, 7, 43,144, 90, 14, 40, 14,223,168,146,168, 84, 74,208,160,161, 80, 40, 16, 22, 22, 6,154, 34,
- 17,180,103, 19,104,154, 42, 21, 90, 0, 13,173, 78, 7,167, 58, 94,216,185,119, 53, 9, 54,251, 9,244,229,135,174, 41,200, 97,
- 26,244, 36, 13, 73,102, 50,146,165, 81,176, 48,171, 3, 22,187, 14,114,242,148, 96, 49, 28,160, 87,199,192, 80,124,172, 82,145,
- 10,149,238,243,218,207, 80,142,245,148,174,198, 67, 87,165, 82, 29, 62,124,248,112,143, 95,127,253,149,219,179,103, 79,207,211,
-167, 79,127, 3, 0, 61,123,246,244, 52, 55, 55,199,225,195,135,181, 42,149,234,240, 23,180,248,116,108,213,170, 21,100, 50, 25,
- 18, 18, 18, 34, 42, 61, 55,173,214, 90,108,103,199,204,188,125, 91,159, 37,147,185,116,236,216,145,208,147, 36, 24, 4,129,220,
-252,124, 36, 37, 38,194,210,210,146,120, 21, 19, 35,222, 62,125,250, 57, 79, 31, 31, 86,201,140, 68, 99,112,241,226, 69, 33,138,
-198,101, 85,186,174,154, 80,100,102,164,143,158, 54,109,218,185,195,135,143, 88,100,100,102,196,242,184, 92, 82, 44,230,215, 30,
- 49,124, 10, 43, 47, 47,111, 24, 0,185,177,100, 50,153, 12,241,241,241, 16, 8, 4,224,176,217,160, 84, 74, 24, 20,114,168,115,
-179,192,212,105,193, 53, 24, 80, 75,200,131,139,189, 61,234,216,218, 24,197,249,238,214,245,210,129,239,101,221,133, 27, 90,121,
-131, 43, 18,131,107, 38,198,148,224,208,226,183, 81, 14,176,244,103, 99,104,109,156,156,156,254, 60,122,244, 40, 39, 43, 43, 11,
-225,225,225, 17, 0,242, 1,152, 1,160,162,163,163,111, 70, 69, 69,245, 42,158,117, 87,213,108,177, 77,103,207,158,237,226,231,
-231, 71,186,185,185,137, 50, 51, 51, 93,100, 50, 25, 37,149, 74, 63, 48, 9, 93,191,126,157, 87, 88, 88,168,160, 40,234, 92,177,
-200,170, 50,126,209,236,129, 78,252,176, 23,152,225, 31, 80,183,177,185, 77, 19,228,146, 47, 26, 63,138,144,206,152, 61,208,105,
-219,230,211, 18,181,128,208, 28, 36, 12, 41, 46, 44,190,218,216, 65,204, 52, 80, 52, 86, 42, 44, 44, 12, 73, 73, 73,136,143,143,
-255, 64, 80, 77,152, 48, 1, 65, 65, 65, 70, 89,180, 68, 34,209,154,229,203,151, 59,207,154, 53,139, 83, 70, 20, 97,218,180,105,
-200,207,207,199,222,189,123, 49,109,218,180,106,119,252, 31,161, 94,199,142, 29,123, 58, 58, 58, 34, 39, 39, 7, 14, 14, 14,240,
-243,243,235,125,231,206, 29, 55, 0, 9, 53,188,238,167, 4, 4, 4,172, 90,177, 98, 5,244,122, 61,198,142, 29,139,183,111,223,
-158,124,251,246,237,150, 58,117,234,204, 88,176, 96,129,189,189,189, 61, 6, 15, 30, 44, 34, 73,178,127, 69, 36,181,106,213, 90,
-251,251,239,191, 15,235,217,179, 39, 67,167,211,125,123,235,214, 45, 36, 38, 38, 66,171,213,130, 36, 73,188,127,255, 30,211,166,
- 77,147, 22,207,110,124,111, 68,185,198, 44, 94,188,120,244,140, 25, 51,176,126,253,122, 44, 95,190,252,128,133,133,133, 79,179,
-102,205,154, 47, 95,190, 28,243,231,207,135,171,171, 43,172,173,173,191, 90,186,116,169,247,156, 57,115,176,109,219, 54, 44, 91,
-182,236, 0,128,253, 53,169, 8,138,162,136,117,235,214, 53,221,188,121,179, 99,137,200, 98, 48, 24, 56,113,226, 4, 94,188,120,
-209, 59, 46, 46,174,188, 99,118, 59, 56, 56, 76,112,116,116,228,222,184,113, 67,236,234,234, 10,146, 36,245,197, 34,107,123,157,
- 58,117,166,190,127,255, 30, 61,123,246, 68, 92, 92,220, 97, 0, 35, 45, 44, 44, 20,115,230,204, 17, 10, 4, 2, 11,165, 82,249,
-119,117,222, 96, 50,136, 81,107, 86,206,199,211, 23, 49, 56,123,150,131,167, 79,159,194,222,222, 30, 60, 30, 15, 52, 77, 67,163,
-209, 32, 43, 43, 11,122,157, 6,141, 27,213,195,161,125,235,144,153,153, 5, 48,136, 10,135,220, 16, 12, 98,248,232, 31,250,225,
-222,253,107,216,181,235,119,200,229,138, 10, 94,190,249,104,224,233, 13,167,218,118, 72, 73, 77, 1,193,128,205, 95,121,174,255,
-225,174,195,210, 71, 16,140, 9,239, 80, 22,150,150,150, 91,142, 31, 63,110,221,161, 67, 7,166, 66,161, 0, 69, 81,104,231,231,
-135, 25,179,102,225,226,209,163,240,104, 61, 20,132, 86, 12, 82,104,220,172, 7,181, 74,137,134,205,191,193,160,193, 67,144,156,
-148,132,128, 94, 3,160, 86, 43, 75,223, 48, 74, 44, 90, 90,173, 14, 54,118, 46,184,126,253, 58, 19, 99,199,190,198,246,242,141,
- 18, 6, 29,247,101,236,123,117,219, 60,213, 11,132, 61, 13,130, 78,163, 67,227,198, 75,161,163,172, 97,231, 60, 1,122,253,121,
- 20,100,221, 42,114, 99, 88,119, 64,106,114, 50, 24, 76,206,171,154,214, 32,165,200,250,172,135,110,126,126,126,126,124,124,252,
-233,176,176,176,225,253,251,247,199,245,235,215,199, 3, 64,255,254,253, 17, 22, 22,134,248,248,248,211,249,249,249,249, 95,162,
-181, 29, 29, 29,251,180,111,223,126,104,203,150, 45, 17, 28, 28, 12,154,166,239, 25,117, 99,179,217, 52,131,193, 0, 69, 81, 32,
- 0,228,228,229,225,237,219,183,200,201,206,134, 94,175,135, 66, 46,167,188, 61, 61,229, 52, 69,153, 85,167, 60,101,103, 24,162,
-156, 89,135, 37,235,106,112,170, 73, 79, 30, 61, 72, 46,148,203,109,173, 44,173, 10,185, 92,174, 65,150,151,151,255,250, 85,164,
-214,200,206,161, 4,209, 81, 81, 81, 62,105,105,105, 72, 78, 78, 6,169, 40, 4, 83,163, 5, 67,163, 68,167,111,218, 64, 0, 26,
-124, 80, 96, 83,122,176,153,108, 20, 22,205,206,171,210,221, 97, 40,243,146, 80, 34,178, 8,130, 40,114, 23,138, 68,224,138,205,
- 62,176,112, 25,115, 61,241,120,188,163,167, 78,157,114,116,114,114,194,202,149, 43,225,236,236,252, 85,237,218,181,149, 22, 22,
- 22, 2,123,123,123, 52,108,216, 16,223,124,243, 13,174, 92,185, 2, 35,234,128,164,105,186,235,189,123,247,230, 62,120,240, 96,
-144, 72, 36, 34,166, 79,159,206,234,222,189, 59,120, 60, 30,148, 74, 37,100, 50, 25,142, 29, 59,150, 77, 81, 84,201,164, 20,107,
-161, 80,184,159, 32,136, 4,133, 66, 49,235, 99,194, 67,191, 54,174,157,153, 75,141,165,229,194,126,254, 1,117, 27,119, 12,232,
-140,122, 30, 29,209, 49, 32, 25, 0,214,213, 98, 37, 14,253,101,177,229, 57, 75, 51, 98,255,245,171, 55,150,249,249,119, 92,188,
- 80,126,123,213,250, 61,121, 85,142,167, 35, 8, 2, 20, 69,125, 16, 59,232,227,237, 35, 71,142,196,137, 19, 39,170,172, 71, 6,
-131, 49,100,226,196,137,156,143, 44,207,144, 72, 36,232,213,171, 23,250,247,239,255,129,208,178,177,177,129,131,131, 3, 18, 19,
- 19, 1, 32,199,200,235,106,198,152, 49, 99, 8,149, 74,133,113,227,198, 97,239,222,189, 24, 58,116, 40,113,231,206,157, 25, 0,
-102, 85,247, 98,103, 48, 24, 27, 22, 44, 88, 48,119,218,180,105,200,205,205,197,229,203,151,209,189,123,119,156, 56,113,194,246,
-242,229,203,107, 58,116,232, 0, 38,147,137,224,224, 96,144, 36, 89,105,172, 47, 14,135,211,167,103,207,158,140,148,148, 20,112,
- 56, 28,248,250,250, 34, 53, 53, 21, 74,165, 18, 18,137, 4, 51,103,206, 76,207,201,201,105,111,236,125,196,225,112,102,205,152,
- 49, 3,199,143, 31, 71, 96, 96,224, 65, 0,227,242,243,243, 7, 61,120,240,224,120,223,190,125, 33,145, 72,112,238,220, 57, 44,
- 91,182,140, 24, 57,114, 36,118,236,216,129,153, 51,103, 30, 40,182, 58, 85,116,225, 23,102,102,102, 90,212,175, 95, 31, 25, 25,
- 25,144,203,229, 56,119,238,156,221,149, 43, 87,220,156,156,156,204,227,227,227, 13, 63,255,252, 51,119,214,172, 89,216,178,101,
- 11,194,195,195, 17, 20, 20,132,142, 29, 59,146,113,113,113,229, 90,201,138, 67, 54,156,163,105,250,134, 72, 36, 66, 97, 97, 97,
-201,125, 55, 47, 48, 48,112,218,218,181, 69, 70,246,180,180, 52,140, 26, 53,106, 68, 72, 72, 8,213,161, 67, 7, 33,135,195,129,
- 90,173, 86,252,157,189, 54,101,160, 0, 80,112,115, 17,227,218,197,125,120, 30, 17,135,231, 17, 81,224,242,138, 6,193,171, 84,
- 74, 52,111,220, 0,173,125, 91, 33, 77, 42,193,225,160,125,168,101,227, 84,233,115,132,166,105,112, 88, 6,120,123, 58,224,104,
-208,239, 8,190, 28,130,160,195,199, 74,199,188,177, 88,108, 52,107,222, 26,190,190,126,136,139,127,143,125,251,118,193,214,206,
-197,228, 28,172, 33, 74, 93,135,101, 63, 63, 82,254, 29,253,252,252,152,114,185, 28,106,181, 26,233,233,233, 72, 76, 76,132,165,
-149, 37,226,210, 18,208, 94,168, 67, 58, 85,128,232,136, 87, 6,130,201, 14,175,234, 15,123,250, 55, 3,252,155, 97,234,152,161,
-149,188,178,210, 16,153,219, 20,185,110, 72,242, 29,182,109, 35, 43, 18, 90,164, 65,127,243,218,141, 91,173,198,140,236,195,190,
-126,107, 47,244, 90, 10, 42,189, 5, 20,106, 45, 20, 58, 54, 24, 22,221,129,236, 59, 96,178,120,248,186,105, 3,156, 59,123, 69,
- 71,147,250, 16,163, 43,200,222, 7,100, 70, 84, 25,161,149,249,145,223,161,150,209,174,195,210,142,215, 96, 56,113,228,200,145,
-239,218,180,105, 35,236,208,161, 67,253,226,142, 83,119,228,200, 17,101,113, 48,204,234,226,131,104,240, 14, 14, 14,205, 57, 28,
-206,208,238,221,187, 55, 31, 61,122, 52, 94,191,126,141,195,135, 15,199, 54,104,208,224,182, 84, 90,241,140,108, 38,151,155, 35,
-207,204,180, 20,187,185,177,172,204,204,210,174, 92,190,236,218,185, 75, 23, 34, 57, 57, 25, 57, 57, 57, 80,171,213, 8,143,136,
-160,217, 76,102, 42, 97,110,206,136,121,241,130,193,228,114,115, 42,178, 54,150,131,196, 42,102, 29,174,173,169,117,203,197,209,
-170,254,178,192, 73,245,212, 26,181, 79, 65, 65, 1,201, 98,179,217,206, 14,150, 73, 49,239,141,127, 38,106, 52,154,224,155, 55,
-111,126,215,185,115,103, 94,236,203,112,144,249,249,208,230,203,192,161, 12,168,213,188, 41,152, 58, 13,160,213,195,201,155,134,
- 58, 79,136, 59,143, 99,244, 26,141,166,202,160,134, 37, 66,139,241,145, 48,224,138,197,224,153,153,131, 39, 22,127, 44, 24,170,
-122,147, 19,118,237,218,181,211,215, 95,127, 13,154,166,177,103,207, 30,232,116, 58,174, 78,167,131, 86,171,133, 78,167, 67, 65,
- 65, 1,130,130,130,176,115,231,206, 7, 0, 14, 24,113,250,164, 64, 32,232, 75, 16,132, 29,139,197, 82,218,218,218,138, 78,156,
- 56, 81, 26,110,162, 89,179,102, 48, 51, 51,227,160, 56, 40,164,157,157, 29,251,143, 63,254,176,236,221,187,247,221,114,221, 29,
-141,191,154, 95,143,180,242,231, 11,234,186,153,219, 52, 65, 61,143,142, 0,128, 46,189,198,160, 94,131, 58, 40,200,126,233,166,
- 86, 37,246,227,176,100, 86,175,182, 73, 94, 11,122,250,140, 86,100,134,190, 69,249,211,251,203,237, 40, 24, 12, 70,133,238, 88,
- 99, 68, 86,145,102, 97,216,150,140,243, 1,128,156,156, 28, 72,165, 82, 68, 71, 71,195,203,203, 11,185,185,185,112,114,114,130,
- 86,171, 69,203,150, 45,161, 82,169,176,121,243,102,220,191,127,255, 1,128,153, 70,252,135,192,195,195, 99, 84,243,230,205,113,
-249,242,101, 60,125,250, 84,114,237,218, 53, 39, 63, 63, 63,184,185,185,141, 78, 72, 72,248,177,216,213,103, 44, 68,126,126,126,
-211,167, 77,155,134,168,168, 40, 76,154, 52, 41, 39, 37, 37,229,220,201,147, 39,199, 45, 91,182,140, 17, 16, 16, 0,169, 84,138,
- 13, 27, 54, 24,238,223,191,191, 17,192,202, 42,234,241, 77, 74, 74,138,179, 90,173, 70,110,110, 46, 72,146,132, 82,169,196,149,
- 43, 87, 16, 20, 20,148, 81, 44,178,222, 25, 91,184,166, 77,155, 54,100, 48, 24, 56,126,252, 56, 0, 44, 65, 81,196,254,115,253,
-250,245,147,252,252,243,207, 78,139, 22, 45,194,248,241,227,161,211,233,176,126,253,122, 44, 90,180,232, 82,177,200,170,236, 33,
-250,171,131,131,195,132, 73,147, 38,125, 53,103,206, 28,132,133,133,217, 61,123,246,204, 55, 60, 60, 28, 46, 46, 46,200,201,201,
- 97, 89, 91, 91, 99,203,150, 45,152, 61,123,246, 25, 0,217, 15, 31, 62, 28, 18, 31, 31,191, 22,192,134, 42, 68,251,110, 39, 39,
-167, 9, 52, 77,211, 74,165, 50, 49, 48, 48,112,195,234,213,171, 49,123,246,108,188,122,245, 10,249,249,249, 48, 51, 51, 35, 22,
- 44, 88, 48,106,201,146, 37, 24, 59,118, 44,173, 80, 40,118,254,221, 29, 53, 77, 27,160,148, 69,193,160,177, 66,179,198, 94,104,
-230, 83, 23,215,110, 61, 7, 0,116, 26,224, 7,165,162, 16, 7, 15,238,193,187,119,111,193, 98,179, 97, 89,203,193, 24, 75, 32,
-180, 5,111,144,167,147,162,115, 7, 95,116, 15,104,143, 3,135, 78,128,212,235, 48,110,204, 48,200,242,242,112,232,208, 62,196,
-197,191, 7,139,205,134,181,205, 95, 31, 8,181, 50, 45,242, 31, 47,180,140,112, 63,129,162, 40, 72, 36, 18, 60,123,246, 12, 9,
- 9, 9, 16, 10,133, 80,145, 6,106,215,205,251, 20, 65,112, 82, 41,154,126, 64,147,165, 81,138, 63,229, 48, 24, 36,101, 34,214,
- 90, 88, 89, 89,113, 53, 26, 21, 72, 82, 95,166, 87, 33, 0, 2,224,176, 0,199,218,245,144,146,156, 66,171,213,234,208, 74,223,
-160, 52,234, 45, 23,206,157,154,246, 77, 91, 63,155,238,157, 86,224,220,249,165,144, 21, 20, 64,173, 99, 67,161,214, 65,169, 6,
- 44,107,121,162,101,227, 38, 72, 75,203,193,203,167,119,228, 44,141,210,152,129,162,111,183, 47, 30,227, 49,102,234,124, 8, 92,
-219, 66, 19,125, 14,148, 60,163,212,162,197, 23, 91,161, 86, 29,111,228, 41, 52, 56, 21,242, 28,168, 70,170,151,204,204, 76, 37,
-147,201, 60, 50,109,218,180,245,207,159, 63,115, 6,128,231,207,159,167, 74,165,210,133,153,153,153,213,181, 73,151, 68,131, 39,
-248,124,193,243, 6, 13, 26,164,249,250,250, 90,244,235,215, 15, 54, 54, 54, 8, 15, 15,199,218,181,107,223,232,116,186,249,119,
-238,220,169,212,213,163,213,106, 37,207,207,159, 55,111,255,195, 15,150,243,123,247,222, 48,109,218,180, 45, 43, 87,174,100,123,
-120,120, 16,122,157, 14,145,145,145,244,209, 35, 71,244, 59, 23, 45,218,204, 21,137, 88, 79, 46, 92, 96,147, 26,141,228,159,190,
-136,157,156,156,252,253,190,109,231,189,241,215,109, 80,171,228,120, 28,118, 9, 50, 89, 22,126,223,115,214,219,201,137,246,151,
- 72, 36,119,140, 21,192,251,247,239,159,219,186,121,243,230,238, 46, 46,136, 76, 74, 0,151, 50,128, 67,146, 96,234, 52, 96,144,
-106,184,248,208, 32, 24,102,144,166, 23, 96,245,241,211, 81,198, 8,227,175,122,244,193,202,212,124, 16, 4,129, 77,109,124,192,
- 53, 19,131, 35, 18, 99,202,159,183, 74,133, 65,240,202, 69,224,138,197,168,223,218,168,128,240,202,219,183,111, 63,139,140,140,
-108,233,227,227,131,185,115,231, 34, 49, 49, 17, 20, 69, 33, 35, 35, 67, 45,149, 74, 37, 89, 89, 89,137, 40,138,255,179,183,138,
- 78,172,172,234,112,186,115,231, 78,169,187, 33, 36, 36, 4,181,107,215,134,133,133, 5, 10, 10, 10, 48,113,226, 68,203,159,126,
-250, 9, 0,240,236,217, 51,148, 21, 40, 31, 35,242,121,244,198,188, 66, 90, 70,203, 95,244,203, 37, 95, 52,238, 24,144,130, 46,
-189, 70,227, 70,240, 1,220,186,118, 19,181, 88,137, 9, 16, 21, 94,201, 78,200, 46, 72, 85,120,236,246,110, 49,142, 41, 85, 92,
-219, 61,189, 79, 44,211,209,145, 58,181,104, 87, 65, 94,101,101,245,240,240,128,189,189,125,233, 24, 45, 22,139,133,177, 99,199,
-130,166,105, 99, 69, 86,113, 95, 67,101,169,213,106,123, 62,159,143,244,244,116,188,127,255, 30,113,113,113,165,161, 3, 40,138,
-210,207,155, 55,143, 61,125,250,116,236,218,181, 11,161,161,161, 15, 0,172, 0, 96,236,203,218,176,193,131, 7,155,105,181, 90,
- 28, 59,118,140, 4,208,235,212,169, 83,207, 90,182,108,201,234,214,173,155,217,142, 29, 59,134, 21,183,145,209, 66,203,220,220,
-156,163,211,233,176, 99,199, 14,164,164,164,248, 3,136,126,242,228,201,238,193,131, 7,239,244,241,241,105, 16, 21, 21,245, 86,
- 46,151, 79, 1,240,178, 42,178,140,140,140, 49,190,190,190,167, 40,138,114,237,220,185,179,232,215, 95,127, 53,143,137,137,129,
-179,179, 51, 40,138,138, 68, 53, 83, 88,189,125,251, 54, 90, 42,149,122,183,111,223, 30, 87,174, 92, 89,103, 48, 24,214, 0, 88,
- 63,121,242,100,167,164,164, 36, 52,111,222, 28,181,106,213, 66, 76, 76, 76,161, 84, 42,221,137,162,148, 68, 85,153,112,227, 1,
- 44,220,189,123,119,147,221,187,119, 15,173, 85,171,214,215,225,225,225,184,119,239, 30, 54,110,220,136,159,126,250, 9,237,218,
-181,195,220,185,115,179, 1, 12, 5, 64,198,199,199, 27, 21, 55,175,196,178, 5, 0, 45, 90,180, 72, 91,187,118, 45,198,141, 27,
- 71,255,241,199, 31, 91,143, 28, 57, 50,107,216,176, 97,165,125,224,168, 81,163,232,195,135, 15,143, 66, 81, 26,166,191, 19,122,
-157, 78, 11,243, 90,245, 32,207, 75, 70, 86, 74, 24,132,102, 14, 8,232,216, 20, 74,149, 22, 23, 47,156,193,203,200, 8, 48, 24,
- 12,216, 59,184,192,210,202, 6,177,177,111,129,202,103, 27,235,117, 58, 29,204,172,234, 66,158,159, 2,109,230,115, 8,196,118,
- 24,253, 67, 63, 40, 85, 58,156, 61,119, 6, 81, 81, 47,193,100, 50,225,224,232, 2, 11,203, 34, 78,130,174,124, 6,179, 9, 0,
-202,137,167, 85,165,208, 98, 50,153,183,175, 94,189, 58,176,117,235,214,172,119,239,222,225,221,187,162,151, 27,153, 76, 70, 18,
- 48,156,206,140,188,240,125, 37,135,119, 70,241,236,140,178,185, 11,197,102,102,146,152, 55,209,246,178,220, 12, 68,188,184,143,
-119,177,145, 72,136,139,134, 78,167, 6,147,193, 0,131,201, 64,221,122,141,112,255, 65,152, 86, 77,146, 97, 21,113, 22,149, 35,
-174, 80,100,231, 49,100,213,202, 31,131,103,207, 95, 46, 24, 52,112, 23, 94,198,188,134,156,116, 0, 77, 3, 14,214, 34, 52,115,
- 95, 0, 73, 90, 22,142, 31,216,161,164,116,186,225, 31,197,208,250,132, 19, 0,236,179,209,112,231,158, 3, 99,247, 6, 29, 93,
- 62,127,250, 68,251,190,253,135,131,155,251, 26,250,180,231,168,215,178, 59, 8,158, 37, 46, 95,191,133, 59,207, 94,103, 80, 6,
-122,185,125, 14,254,136,173,130,179, 44,242,242,242, 30,166,167, 75,157,203, 68,129,119,230,241,248, 85,205,142,251,152,243,131,
-136,243, 76, 38,163,197,170, 85,171,244,246,246,246,186,168,168, 40,236,218,181,139,122,254,252,249,117, 6,131,177, 93, 42,149,
-170,171,226,180,213,235, 35,142, 6, 6, 54,108,213,191, 63,253,253,244,233, 74,240,120, 51, 54,108,218, 20,152, 37,147,213,166,
- 41, 10,182,181,106,165,110, 88,180,104,237,192,193,131,101,175,238,223, 23,132,157, 63, 47,224,146,228,115, 35,202,249, 37, 80,
- 33,167, 68, 34,185, 19, 26,122, 15, 7,247,254, 10,157, 78, 3,169, 36, 9, 0,144,157,147,143, 42, 68,214,199,156,180, 82,169,
-236,191,228,167,159, 30, 45,153, 61,203,225,219, 78,157,145, 28, 17, 14, 93,110, 22, 8, 61, 9, 54,193,130, 34, 83,136,204, 12,
- 57, 22, 30, 62,153, 41, 87, 42,251,151,211, 73,148, 91,206, 18,139, 21,207,220, 12, 28,145, 24, 92,177,217, 7, 86, 44,190,185,
- 57,184, 34, 49, 88, 92,110,121, 3,184, 63,225,148,203,229, 3, 6, 14, 28,248,242,201,147, 39, 86,227,198,141,195, 55,223,124,
-243, 66,165, 82,117, 0, 80, 88,211,250,164, 40, 74,242,237,183,223, 50, 8,130, 16, 15, 31, 62,156,151,149,149, 85, 26, 89, 93,
- 46,151,227,202,149, 43,240,242, 42,154,213,255,234,213, 43, 52,106,212,168, 66,206,241, 11,163, 36, 0, 86,206, 30,232,180,225,
- 81,132,116, 6,128,117,245, 26,184,224,214,181,155,184,119, 43, 44,240,107, 31,106, 91,143,225, 45,127, 22,118, 24, 60,223,187,
-197, 56,166,216,220, 17,135,206,158, 97, 70, 63,223,183, 90,169,140,172,143, 93,231,230, 85, 84, 78,130, 32, 64,211,244, 39,161,
- 28,152, 76, 38,142, 28, 57, 82,221,115, 63,185,119,239,222,201,147, 38, 77,226, 72,165, 82,188,121,243, 6, 10,133, 2,124, 62,
- 31,215,174, 93, 35, 1,236, 56,114,228,200,181, 35, 71,142,116, 67,209,108,162,144,234, 92,159, 34,145,104, 90, 64, 64, 0,222,
-188,121,131,167, 79,159,158, 1,240,242,197,139, 23,103,222,189,123, 55,164, 93,187,118, 56,112,224,192, 52,149, 74,181,183, 58,
-156, 20, 69,149,141,153, 84,146,241, 33, 66, 46,151,127, 29, 22, 22, 86,221,118,151,230,228,228,180, 45, 22,214, 41,246,246,246,
-230, 17, 17, 17,168, 83,167, 14,116, 58, 93,235,234, 94, 75,249,249,249,191,110,223,190,253,143, 49, 99,198,224,231,159,127, 30,
-126,242,228,201,225, 61,122,244, 64,207,158, 61,177,127,255,126,188,124,249,114, 29,140, 75, 43, 86,222,185,191, 4,240,210,222,
-222,126,170,139,139, 11, 54,110,220,136,200,200,200,181, 43, 87,174, 92,244,242,229, 75,120,121,121,241,162,163,163,201,154, 60,
- 67, 0,192,220,220,220, 92,175,215,227,252,249,243,143, 1,204, 30, 62,124,184,221,150, 45, 91,134,138,197, 98,228,230,230,170,
-162,162,162,134, 1,184,240,119, 63,235,104,130, 88, 60,110,252,140,221,227,199, 13,227,251,182,104, 6,101, 65, 42, 84,242, 12,
- 40, 11,211,177,125,239,117, 16, 4, 3,182,182,142,176,115,112, 70, 82, 82, 50, 30, 92,186,172, 85, 40, 85, 91,184,122,106, 93,
-229,156,211,139, 56,155, 23,113, 42, 21,153, 80,201, 51, 75, 57,237,236,106, 23,115, 38,225,126,216,101,181, 74,161,248, 85, 75,
- 19,191,252,197,231,254,159,140,234,229, 58, 44, 11,153, 76, 54,115,226,196,137, 29, 22, 46, 92,104, 77,146, 36,179, 86,173, 90,
- 72, 74, 74, 34, 79,159, 62,157, 43,151,203,103,214,164, 52, 44, 54,251,165,135,167, 87,135,190,125,251,146,125,250,244,230,140,
- 24,211,141,101,107,103,135,252,188, 28,196,190, 9, 71,204,235,231,240,240,106,138,101, 43, 55, 3,150,150, 85, 38,146, 44, 78,
-171,211,107,197,146,121, 39,218,250,119, 53,247,106,212,148,211,172,190, 5,116,122, 18,169,169,169,184,112, 62, 66, 23,245,236,
- 94, 1, 69,106,135, 40,179,141, 75,193,115, 7, 32,145,131,223,125,236,116, 71,214,108,216, 62,119,199,239, 7,231, 47,156, 49,
- 78,212,206,175, 11, 34,111, 30,192,153,224, 19, 10,181, 70,187,129,195,196,166,168, 28, 40, 99,171, 89, 7,106,181, 90,247,113,
-127,170, 86,171,117,159,219,210,251,247,239, 71, 70, 70,134, 54, 49, 49,241, 42, 73,146, 39, 43, 73,246,252, 9,182, 3,218,126,
- 26,205,205, 37,126,126,221,150, 92,187,198, 31,181, 96,129,118,248,136, 17,243,160,209,232,192,229,210, 44,145,136, 1, 30,143,
-253,234,254,125,193,214,201,147,107, 17, 90,237,141,131,149,132, 13, 40, 7, 95,124,214, 97,137, 69,171,125,251,118, 24, 53,110,
- 54, 84,101, 44, 90, 15,159,198, 66,163,131,209, 22,173, 98, 36, 39,166,164,124, 61, 99,241,146,179, 67, 2, 58,121,251,184,214,
-229,217,186,213,133,216,193, 1, 57, 89, 89,184,255, 52, 70,191,242,196,217,168, 98,145,101, 84, 92, 25,138,162,138, 6,185, 3,
-232, 52,115, 33, 8, 38, 19, 40, 14,227, 80, 50,115,200,173,229, 55, 32, 88, 44, 24,104, 10, 26,141,198,152, 65,127,169,239,223,
-191, 31, 48,124,248,240,144,224,224, 96, 70, 64, 64, 64,179,115,231,206, 81,159,115,237,168, 84,170,175, 1,128,207,231, 39, 88,
- 90, 90, 58,141, 25, 51, 6,122,189, 30, 74,165, 18,249,249,249, 72, 77, 77,205, 27, 51,102,140, 14, 0, 4, 2, 1,119,224,192,
-129,230, 85,113,110, 62, 45, 81,207, 30,232,180,173, 22, 43,113,104, 65,246, 75,183, 90,172,196,132,175,125,168,109,155, 79, 75,
-212,230,181, 21,171,178, 19,239,196, 74, 21,215,118, 31, 58,123,134, 57,178,223, 0,131,179,248,109, 32,223,142, 62, 93, 21, 47,
- 65, 16,159, 4, 39, 53, 82,100,125,128,194,194,194, 69, 75,151, 46,237, 41,147,201,156,187,117,235,198,241,246,246,198,163, 71,
-143, 16, 28, 28, 76, 62,124,248, 48, 69,161, 80,252, 8, 64, 13,224,122, 77,234,212,211,211,211,141,197, 98,149,184,210,126, 43,
- 94,253,219,185,115,231,134,140, 27, 55, 14,117,235,214,109, 24, 29, 29,205, 67, 53,238, 35,154,166, 75,189, 12, 95, 18, 4, 65,
-196,109,221,186,213,201,193,193,129,184,114,229, 10,201,100, 50,107, 98,185,217,191,111,223,190,214,122,189,126,252,132, 9, 19,
-224,239,239, 15,146, 36,113,248,240, 97,236,219,183,207, 88,145, 85, 41, 98, 99, 99,159,167,164,164,124, 59,111,222, 60,108,220,
-184,113,209,188,121,243,144,146,146,130,216,216,216,240,207,225, 45, 40, 40, 80, 37, 39, 39, 11,219,180,105,227, 27, 21, 21, 21,
-213,161, 67,135, 70,227,198,141,195,186,117,235,232,208,208,208,129, 0,174,252, 19,189,119,204,187,220, 32,182,129,117,109,229,
-170, 95,127,170,239,238, 54,105,236,232,193, 76, 79,143, 70, 80,228,167,194,218,198, 30,206, 46,245,144,149,153,141,171, 87,175,
- 24,178,179,243,246, 27, 24,196,138,119,239,114,211, 62,135,211,201,185, 30, 50, 51, 51,113,249,242,101, 67,158,172, 96, 15,244,
-140,149,209, 73,121, 25, 48,193, 24, 75,214, 4, 84, 18, 37,190, 50,216, 88, 89, 89, 29, 51, 55, 55,207, 48, 55, 55,207,176,178,
-178, 58, 6, 24, 53,251,160,115,153,167, 3,243,131,101,224, 64, 62,248,252,175,193, 98,205,177,180,178,186, 98, 97, 97,145,211,
-190,125,123,237,238,221,187,213,209,209,175, 40,137, 36,133,182,176,176,200, 47,221,191, 60,206,143, 96,101,229,110, 38,114,108,
-244,147,133,115,179,251, 98,199,134,133, 98,199,134,133, 22,206, 77, 31,136, 28, 27, 46,183,178,114, 55, 51,170,156, 21,160,158,
- 29,108, 61,108,176,195,203,150, 80,121,216, 96, 71, 61, 59,216, 26,125,238,149,187,253, 12, 4, 1, 3,138,166, 97,163, 6,156,
- 37, 28, 20,147,201, 60,232,236,236,236,136,234, 5,172,251,132,115, 4, 80,119, 4,143, 55,254, 84, 96,224,168,132,208,208,225,
- 5,241,241,223,231,199,197, 13, 14, 63,113, 98,200,111, 67,134,140,248,158,199,155, 48, 16,112, 55,150,211,209,209,113,237,243,
-231,207,131,141, 93,202, 8, 47,163,235,211,189,158,211,181,128,206,173,233,105, 19,251,211,211, 38,246,167, 3, 58,183,166,221,
-235, 57, 93,251,140, 54, 34,152, 76,230, 80,161, 80,120, 76, 36, 20, 70,138,132,194, 72,161, 80,120,140,201,100, 14, 69,229, 99,
-168, 62,224,180,182,182,126,102,111,111,159, 81,157,197,198,198,230, 69, 53,202,249,189,155,155, 91, 10,131,193,216, 92,205,123,
-186, 50, 78, 15,129, 64, 16, 39, 18,137, 82,203, 46, 2,129,160,108, 96, 40,107,161, 80,120, 81, 36, 18,109, 49,134,243,151,197,
-141,126,122,112,125,234,203, 95, 22, 55,250,233,227,109,211,191,179, 26,243, 40,100, 69,206,244,239,172,198, 24, 83, 78, 59, 59,
-187, 80, 59, 59, 59,169,157,157,157,212,222,222,190,210,197,198,198,230,153, 17,156,124, 51, 51,179, 45,102,102,102, 25, 34,145,
-200, 32, 22,139, 51, 68, 34,209,102,148, 9,109, 81,211,250,100, 48, 24,235, 26, 54,108,168,102, 50,153,127,124,180,105, 99,253,
-250,245,213, 44, 22,107, 67, 53, 57,205,219,181,107,103,136,136,136,160,253,253,253,105, 0, 86, 95,176,221, 29,172,172,172,174,
-152,155,155, 39,155,153,153,109, 7, 32,170, 33, 39, 1, 96,168,147,147, 83,120,199,142, 29,149, 78, 78, 78, 97, 0,250,126,193,
-114,246,252,238,187,239,168,228,228,100,154,166,105, 58, 57, 57,153,254,238,187,239, 40, 20, 5,138,252,156,103,242,226,201,147,
- 39,211, 15, 31, 62,164, 31, 62,124, 72,135,133,133,209, 61,123,246,164, 0,252,240,153,207,121,124,169,115,247,174,103,227,254,
- 85, 3,171,147,195, 6,248, 81,215, 47,108,166,151,253, 56,137,238,226,223,136,246,170,111,117,214,195,195,218,227, 75,112,254,
-244,227, 68,186,243,183, 13, 41,111,119,171, 19,222,245,108,220,255,230,115,255,175,178,106,149,188, 72,255,213, 3,206,254,223,
-180,248,161, 88, 42, 31,181,107,215, 70, 78, 78,107, 62,139,229,199,227,241, 58, 48,152,204,219,185, 89, 89,179,138, 95,183, 12,
-127,151,169,182,210, 14,221, 29,220, 74, 82, 18,212,132,243,131,129,236, 53,228,172, 14,135, 81,156, 21, 37,149,166, 52,154, 52,
-107,146,124,182, 29,149,214,193, 7,156, 78, 78, 78,227, 41,138,114, 51,182, 64, 12, 6, 35, 65, 34,145,236,173, 73,125, 54,104,
-208,128, 46,118,111, 19, 95,178,221,255,138,107,233,127,137,243,208,175,141,107,123, 53,254,106,126,228,243,232,141,197,110,197,
- 82, 44,159,110,101,230,215,177,253,210,251,183, 66,127, 94,190, 93, 86,248, 15,159, 59, 3, 70,142,105,251, 2,156, 37, 65, 66,
-171,197,201,102,179,119,183,106,213,106,252,163, 71,143,254, 48, 24, 12, 19,254, 71,175,207,158, 76, 38,115,158,167,167,103,179,
-216,216,216,112,131,193,176, 17,229, 4,138,172, 65, 57,127,116,115,115,155,194,225,112,120,114,185, 92,150,150,150,182, 20,192,
-201,127, 91,125,122, 55,168,229, 75,211,165, 65,183, 87,191,121,159,251,228,139,113,210,148,129,162,153,171, 98,227,115, 94,252,
- 3,237,254, 95, 35,178,138,133,214,158,191,227,143, 59,155, 56, 77,156, 38, 78, 19,167,137,243,139,115, 10, 76,245,105,226,252,
- 47,228,252,175, 66,137, 69,139,101,170, 10, 19, 76, 48,193,132,255, 56,168, 76, 85, 96,130, 9,255, 58,148,181,106,149, 90,179,
-136, 74, 84,105,117, 76,130, 53, 81,182, 55, 77,156, 38, 78, 19,167,137,211,196,105,226, 52,113,254,207,113,254,183,138,172,178,
-174,194, 9, 38,215,161,137,211,196,105,226, 52,113,154, 56, 77,156, 38,206,127, 19,231,127,186,208,194, 71, 66,203,228, 58, 52,
-225,239,193,182,126,112, 2,128, 25,231, 32,249, 43,246, 55,193, 4, 19, 76, 48,193,132,127, 24,123, 80,129,235,240,223, 32,180,
-106, 3,248, 26, 69,137,111, 99, 0,220, 3, 32,251, 12, 62, 27, 0,131, 9,130, 24, 4, 0, 52, 77,159, 66,209,172,145,108, 99,
- 14,230,243,249, 25,106,181,218,174,248,123,166, 90,173, 46,155,203,128,192,167,179,217,232, 50, 75,185,112,115,115,203,208,104,
- 52,118, 70,252,125, 62, 77,211, 47, 25, 12, 70,164, 88, 44,190, 21, 27, 27, 27, 92,157, 19,239,208,161,195, 40, 38,147,185, 26,
- 0, 12, 6,195,226,219,183,111, 31,252, 11,219,173,181, 75,109,132,110,109,220, 0, 0, 32, 0, 73, 68, 65, 84,135, 3, 58,189,
-142,204,200,202, 93,138, 79, 3,249, 1, 0,118,244,194, 90,130,196,252,226,239, 27,166, 6, 87, 30, 71,167,186,251, 87, 2, 95,
- 54,155, 61,205,222,222,190,123,106,106,234, 51, 0, 11,128,170,163, 26,187,184,184,252,192, 98,177,134, 27, 12, 6,119, 38,147,
- 25, 71,146,228,145,148,148,148, 32,211, 51,196, 4, 19, 76, 48,193, 4, 35,196,214, 39,168,150,208,242,178,134, 3, 13, 12, 5,
-129, 46,160,113,131, 0,142,199,228, 32,221,216,227,123,120, 65,175, 39,139,254,147,195,128,225,202,123,198,158,238,221,187, 59,
- 79,159, 62, 29,223,124,243, 13, 30, 61,122,212,102,255,254,253, 99, 78,158, 60,249,146,162,168,219, 0, 30, 1, 70,133, 82, 16,
-161, 40, 78,203,176,238,221,187,119, 94,189,122, 53,179, 81,163, 70, 80,169, 84, 8, 13, 13,245,219,176, 97,195,150, 7, 15, 30,
-220, 4,112,180, 88, 16, 84,152, 0, 79,173, 86,219,149, 36,227, 36, 8,194,110,224,192,129, 79,202,138,171,226,252,106, 4, 77,
-211, 15, 9,130, 8, 51, 24, 12,143, 78,159, 62,157,226, 5,180,158,232,198, 57, 61, 43, 65,231,252, 49,167, 70,163,177, 59,255,
-203, 26,176,120, 60,104, 10, 11,208,102,244,255,139,222, 27, 63,205, 7, 65,145, 96,130,150,117, 88,181,229, 37,128,200,180,180,
-180,151,254,254,254, 9,213,109, 97, 38,147,185,250,234,213,171,142, 52, 77, 35, 32, 32, 96, 53,128,191, 74,104,241,190,246,109,
-122,251,226,153, 99,124,121,110, 6,186,245, 29,114,228,109, 74,230, 40, 0,103, 62, 16, 77,221, 97, 79, 16,152, 63,121,205, 81,
- 38, 0,236,252,113,216,130,205, 93,177,109,246,117,164, 3,232, 80, 44,126, 0,224, 23, 0,183,119,116,135, 61,128,133,147,215,
- 28, 37, 0, 96,215,143,195,230,239,232,142,173, 83,175, 84, 59,108,197,148, 81,163, 70,109, 91,189,122, 53,211,209,209, 17, 18,
-137,164, 91,195,134, 13, 61, 11, 10, 10, 26,162,146, 65,196,117,235,214, 61,209,174, 99,239,122,253, 7, 13, 21,218,218, 88, 33,
- 77,154,109,126,226,216, 31, 19,153, 15, 67,187, 39, 38, 38, 14, 49, 61, 67, 76, 48,193, 4, 19, 76,168, 0, 53,143, 12,223,220,
- 17, 2,133, 14,223,177,152,196, 15,109,125, 27,118,250,190, 71, 59, 70, 67,239, 6,120,253, 42,186,235,133, 91,143, 55, 48,194,
- 94,133,144, 6, 58, 72,196,193,249, 23,210,202,103,194,232, 73,176,174,159, 63, 90,212, 19,142, 25,198,124,242,228, 73,131, 22,
- 45, 90,148,166,134,233,212,169, 19, 58,117,234, 68,236,220,185,179,233,245,235,215,155,238,219,183, 79, 23, 18, 18,114, 0,149,
-199, 71,153, 86,191,126,253, 13,219,182,109,227,249,251,251,131,199,227,149,110, 16,139,197,232,221,187, 55,122,247,238,205, 76,
- 75, 75, 11,184,120,241, 98,192, 47,191,252,162, 77, 74, 74,154,135,255,143,210, 92, 41,150, 46, 93,234, 91,206,234,171, 4, 65,
-188, 39, 73, 50,188,105,211,166, 41,158, 64,131,137, 61,190,185, 49,165,173,135,104,214,162,253,229,242,176,184, 92, 28, 26, 85,
-212, 87,151, 21, 90, 9,183,174, 64,108,110,150, 35, 52, 51,123, 9, 32, 18,192, 75,154,166, 35,227,226,226,162,191, 2,154,126,
-109,197, 56,240,135,140,106, 82, 13,177,133,148,148, 20, 88, 88, 88, 8,252,253,253,165, 4, 65, 44, 15, 13, 13,253,210, 3,242,
- 90, 47,159, 63,133, 35, 75,124,137,244, 55, 15, 49,103,144,159,112,214,246, 63,127, 86,107,245,103, 42, 59,136, 32, 24,140, 95,
-194,168, 64, 20, 37,227, 93,154,147,147,227, 15, 0,214,214,214, 92, 0,183, 55, 63, 70,143,217,109,137,207,137,237,198, 97, 50,
-153, 59,246,239,223, 63,238,135, 31,126, 40, 74, 29,113,255, 62,196, 98, 49, 86,174, 92, 89,119,238,220,185,107, 73,146,156, 89,
-145, 37,171, 93,199,222,245,182,110,252,185, 97, 97,110,190,230,247, 29, 39,159,214,246,241, 98, 76,158, 54,215,108,171, 78,227,
- 96, 48, 24,126, 48, 89,182, 76, 48,193, 4, 19, 76,168,142, 53,171, 74,161,229,105,131,131,205,125, 60, 6,127,223,211,143,215,
-216,167, 17, 56,188,255, 15,221,210,194,215, 23, 45,124,125, 25,129,242,194, 46, 79,158, 62,239,114,250,250, 35,141, 82,159,116,
- 50, 54, 27,163,140, 45, 85, 73, 82,218,213,125,237, 59, 42,242, 50,249, 0, 32,178,180, 83,255,120, 62,253, 86,219,182,109,225,
-236,236,204, 9, 9, 9, 25, 91,133,208,250, 49, 38, 38,134,199,100, 86, 30, 15,181,118,237,218, 24, 56,112, 32,188,188,188,184,
-237,219,183,255,177, 34,161,197,231,243, 51, 9,130,176, 3,128, 90,181,106, 25,150, 47, 95, 30, 78, 23, 1, 0,104,154,166, 31,
- 50, 24,140, 71, 20, 69, 61,254,243,207, 63, 83, 27, 2,118,221, 90,120,221,155, 50, 98,160,144, 62,189,165, 66,145,160, 46, 40,
- 40,119,189, 80, 44,202, 18,136, 68, 47,121, 66,126, 36,138,114,121, 69, 58, 59, 59, 71, 55, 4,156, 91,121,185, 93,223, 57,123,
-152,217, 31, 19,126,174,178, 46,155, 55,111,238,217,164, 73, 19,190,193, 96,128, 66,161,192,174, 93,187, 44, 4, 2,129, 69,247,
-238,221,151,149,189, 0,188,129,198, 3,106, 51, 39,172, 72, 51, 76,173,193,133,100,217,174,141,111,226,192,222,221,205,125,191,
-110,135,183,183, 15, 35, 55,183, 16,249,121,114, 80, 20,245, 73, 92,159,169, 87,144,177,163, 23, 54,236, 92, 52,108, 33,193, 96,
- 16, 77,251, 45, 64, 31,135,252, 25,187,119,239,126, 5,128,205,229,114,203, 94,135,181, 5, 78, 62, 27, 26,116,109,135, 93,139,
- 71,128,166, 40, 26,192,134,106, 88,179,236,204,204,204, 46, 92,191,126,189,117,203,150, 45,241,232,209, 35,196,199,199, 99,202,
-148, 41,218,169, 83,167,114, 70,142, 28, 73,204,153, 51,103,250, 47,191,252,114, 26,192,131, 79,110, 4, 22,107,120,223,254, 67,
-184,242,188, 2,181, 86,163,211,214,178,177,164, 52, 10,181, 50, 91, 86,160, 30, 50,108,188,246,213,139,199,195, 1,124, 34,180,
- 62,179, 62, 77, 48,193, 4, 19, 76, 48, 2, 52, 77,183, 4, 96, 11, 32,139, 32,136,167,101,127, 23,239, 82,146,173,229,227,223,
-217, 40,242, 74, 89,151,161,203, 70,209,112, 31, 91, 0, 6, 0, 79, 8,130,144,125,102, 17, 43, 79,189, 19, 28, 28, 76,151,253,
- 44, 35,180,104,154,166,105,125,206,123, 90, 19,123,133, 86, 62,221,251,201,162,122,117,134,150, 62, 57, 73, 63, 62,250, 19,237,
-105, 83,121, 22,246, 30, 94,208, 15,107, 2,122,114, 75,208, 51,219, 91,170,159, 60,121, 18, 66, 81, 84,112, 96, 59,208,244,235,
-163, 52,253,250, 40, 61,187, 13,232,211,167, 79, 95, 93,187,118,109,112, 80, 80, 80, 48,128,170,198, 41,101, 20, 62, 13,163, 31,
-219,129,174, 8, 49, 49, 49,244,238,221,187,233, 69,139, 22,209,127,252,241, 7,141, 42, 34,168, 7, 4, 4,132, 70, 69, 69,209,
- 35, 71,142, 12, 71, 37,129, 1,189, 1,209,240,186, 14,111, 52, 39,182,232,180, 63, 52,166,101,223,242,203, 61,127, 71, 71,199,
- 15,202,179,206,195,129,254,173,149, 7,125,176, 75,139,116,154,166,175,210, 52,189,142,166,233, 33, 52, 77,123, 1, 64,115,192,
-188,175,163,245, 59,245,201,173, 42,237,132,175,171,204,123,215,188,121,115,207,121,243,230,229,106,181, 90, 58, 33, 33,129,254,
-253,247,223,233, 27, 55,110,208,231,207,159,167,253,252,252,210,202,148,215,126,140,151,107,134,118,223, 10, 77, 77,174, 34, 54,
-147,249,219,211, 27,167,233,119,247, 78,209, 79,142,175,165,143, 44,249,158,158,222,183,181,206, 92,192, 83, 3,232, 88,209,113,
- 83,219,162,129, 87, 93,219,216,164,164, 36, 90,167,211,209,163, 71,143,166, 3, 2, 2,232,174, 93,187,210,157, 59,119,166, 59,
-117,234, 68,119,236,216,145,190,117,235, 22,157,150,150, 70,119,110,215, 66,209,203, 27,190,213, 40,154,143,171,171,107,122, 66,
- 66, 2,173,211,233,232,144,144, 16,250,240,225,195,116, 72, 72, 8, 29, 24, 24, 72, 3, 56, 56,121,242,100,149, 76, 38,163, 3,
- 2, 2, 82, 81, 78,212,120, 87, 87,215,232,168,216,148,148,205,107,246,222, 58,244,219,177, 91,103, 79,223,184,117,225,218,147,
- 75,231,175, 61, 61,249, 56, 34,238,188,171,171,107,116, 57,237,255, 89,245,105,130, 9, 38,152, 96, 66,213, 90,164, 88,104,245,
- 44, 54,118,244,164,105,186,243, 71,191,123, 22, 11,167, 79,126, 7, 6, 6, 46, 42,251,187,100,159,192,192,192, 69, 0,232, 54,
-109,218, 28,163,105,186,193, 23, 40,254,132,143,151,106,205, 58, 36, 83,159,128,227,209, 29,108,131, 30,250,236, 24, 80,121, 73,
-128,200, 1, 42, 66,140, 28,105, 18,222,220, 59, 83,121, 34,137, 98, 92,142, 1, 27, 64, 72,116,116, 52,222,188,121,131,148,148,
- 20, 8,133,194, 79,246,187,127,255, 62, 4, 2, 1, 28, 29, 29,141, 83,186,218, 15,251,185,151, 45, 92, 33,110,227,143,236,239,
- 39, 33, 36, 36, 4,153,153,153,224,112, 56,224,114,185, 32, 73,178, 74, 62, 6,163, 40,227,111,137, 21,171,188,125,252, 1, 22,
-175,150,248,226,206,101, 51,221, 24, 15,131,217,170,228,119, 72, 83, 27,140,179,228,137, 69, 16,138,132, 82,129, 64, 88,234, 46,
- 4, 16, 73, 16,196,219,230, 0, 91, 36,230, 95, 60,176,106,142, 3,243, 69, 8, 95,245,238,101,185, 28,157, 59,119,158, 8, 96,
- 25, 77,211,121, 77,154, 52,177, 95,189,122,181,149, 68, 34,193,235,215,175,113,242,228,201, 44,178,232, 68, 9,154,166, 87, 0,
-192,215, 0,223,210,214,242,218,111, 63,205, 52,195,237, 19,220,154, 92, 69, 22,222,189, 47, 13, 24, 57,121,234,182,153,189,161,
- 40, 84,225,232,141, 23,184,250,252,125, 31, 0,247, 81,201,184,183, 29, 15,240, 14,200,234,212,191,127,255,240,187,119,239,218,
-236,219,183, 15, 36, 73,150,187,236,219,183, 15, 55,239, 61,159, 1,224,153,145,197,170,237,230,230,118,243,241,227,199,182, 66,
-161, 16, 55,110,220, 64, 94, 94, 94,169, 37,107,212,168, 81, 68, 94, 94,222,208, 93,187,118, 13, 72, 76, 76,220,120,239,222,189,
- 28, 20,229,130,252,224, 66, 96, 50,153,239, 73, 82,247,149,163,119, 3,214,160,222,237,218,201,115, 94, 66,108,221, 4, 15, 35,
-222, 95,204,147,229,168,152, 76,230,251,178,251,127,137,250, 52,193, 4, 19, 76, 48,161,122, 32, 8, 34,152,166,233, 94, 4, 65,
- 4,127,188,238,227,239, 37,251,173, 93,187,182,244,119,201, 49,235,214,173, 91, 83,230,183,242, 11, 21,175,210,193,240,237,139,
- 21,100,251,242,118,210,188, 62, 11,205,155, 11,224,184,182, 5,215,171, 15,152,174,126, 72,126,121, 27, 17, 87, 54, 35,245,213,
-125,208,148, 1,142,158,173,140, 45,136,250,171,175,190,130, 90, 93, 52, 52, 75,163,209,128, 35,178, 82,207,153, 48,140, 15, 0,
- 20,139,175, 41,163, 96,141, 34, 52,107,219, 1,173, 50,104, 60,177, 47, 50, 84,180,202, 40, 58,110,213,232,209,224,112, 56,224,
-112, 56, 32,138,135,254, 24, 35,180,136,226,157,169, 34,247, 85,121,133, 32,148, 60,246,209,227,203,166,181,226, 37, 70,114, 53,
- 81, 15,145,166,161,232,139, 25,134, 75,198,148, 87, 40, 18, 74, 4, 66, 97,164, 64, 44, 42, 21, 90, 4, 65,188, 7, 0,154,205,
- 14, 58,188, 98, 90, 19, 81, 70,156, 72,253, 52, 4, 82, 53,165,171,128,102,197,149, 43, 87,236, 88, 44,150,131,193, 96, 64,114,
-114, 50, 94,189,122,133,173, 91,183,102, 20, 22, 22,182,127,241,226, 69,108, 89,237,104, 16,112, 79, 6,173,156, 89,143,245,242,
- 14, 95,243, 62,170,218, 87,143,141,207,119, 1,125,218, 55,189, 52,113,196, 98,124,215,163, 43, 70,182,111, 72, 39,164,229,170,
- 1,220, 40, 54,189, 86, 5,201,139, 23, 47,186,124,251,237,183, 71,154, 53,107,230, 77,211, 52, 26, 55,110,140,161, 67,135, 34,
- 40, 40, 8, 17, 17, 17, 40, 40, 40,208, 93,191,254,127,236,125,119, 88, 20, 87,227,245,153,217,190, 44,189,131, 5, 21, 69, 41,
- 10,138,162,216, 16, 75,212,136,137,221,216, 19, 19,125,237, 53, 17, 53,198,146, 40, 36,198, 94,162, 38, 49,150, 55, 22, 98,139,
-216, 91,192,136, 29,165, 8,130, 5,105, 46,189, 45,176,125,230,126,127,176,172,136,148, 5,205,247,203,155,236,121,158,125,102,
-103,103,230,236,157,123,103,238, 61,247,220,118,113, 51,128,189, 6, 6,203,196,202,202,234,252,213,171, 87,237, 76, 76, 76,112,
-241,226, 69,200,229,114, 56, 57, 57, 97,214,172, 89,130,208,208,208,253, 37, 37, 37,163, 67, 66, 66, 68, 41, 41, 41,219, 47, 92,
-184,208, 2, 21,235,206,189,241, 16,168, 84,170, 61,191, 30,216,183,117,214,236, 57, 77,174,222,122,116, 69, 89, 42,179,112,113,
- 73, 47,177,179, 50, 53,219,252,237,234,230, 42,149,106,122,205,241,249, 71,163,226,211, 8, 35,140, 48,194,136, 55, 80,167, 22,
-169, 42,158,170,139,173,134,136, 52, 0,242,224,224,224,101, 20, 69,133, 7, 7, 7, 47, 11, 9, 9,145, 3,120,249, 87,136, 44,
-189,208, 10, 10, 10,138, 8, 15, 15, 71, 80, 80, 80, 68,173, 20, 44, 3,117, 74, 36,212, 41,145, 16,251,207,197,239, 33,227,170,
-221, 60,219,232,208, 13, 93,115,233,170, 82,169,228,238,219,183, 79,223,111, 11, 0, 24,134,121,231,169,216, 16,161,165, 19,122,
-111, 4,162,165,208, 52, 98,207,130,209,221,108,152,114,158,234,207,211,200, 84,178,218,239,159,168,203,239, 22,145,239,106,227,
- 60, 57,127, 58,210,175, 95,134,137,169,105,250,167,145,177,122, 23, 75, 39,178,158, 3, 64, 11,161,217,149, 93,243,134,245,116,
-228,131,175, 58, 19,134,151, 74, 86,185,235,133,102,111, 45, 15, 27, 8, 33,120,254,252, 57,202,203,203, 17, 21, 21,133, 99,199,
-142,229,214, 32,178,208, 82,104,250,199,207, 95, 76,232,106, 46,203,226,171,238, 94,198, 75, 37,107, 80, 83,151,109,135, 97, 61,
-248, 52,117,145,162, 57,226,126,221,218, 98,254,103,195,177,233,231,223,181, 42,251, 94, 65, 91, 79,157, 29, 83,170, 84, 47, 51,
- 80,100,233,205,198,232,232,104,207,232,232,104, 33,128,192,143, 62,250,232,236,200,145, 35, 17, 17, 17,129,211,167, 79,187, 1,
-144,234,206, 91,131,138,133,178,191, 3,240,172, 54,227,145,207,231, 31,190,124,249,178,151,179,179, 51, 46, 95,190, 12,185, 92,
-142, 25, 51,102,168,102,207,158,205,159, 50,101, 10, 85, 92, 92,172,119,178,162,162,162,242,107, 19, 89, 0,144,153,153,121,238,
-216,209,131,221,123,247,238, 61,188,149, 91, 59,243,103,178,146, 28, 19, 19,145,248,122,196, 53,254,221,219, 55,182,103,102,102,
-222,169, 57, 62,175, 24, 28,159, 70, 24, 97,132, 17, 70,212, 14,131,180, 72, 53,103,170, 33,168,114, 29, 47, 36, 36, 36, 62, 36,
- 36,228, 53,199,235, 45, 81,125,212,225,153,202, 50,173, 81,243,104, 49,197,105,111,222, 0,203, 54,228,102,223,248,205,202,202,
- 74, 43, 22,139, 95, 19, 90,172,129,156, 5, 39, 14,225,217,204,241,122, 39,171,210,217,194,160, 41,111, 37,180, 88,150,141, 2,
-240, 90, 32, 76,236,219,142,219, 60,212,163,135,103,171, 38,180,230,232, 22,100,148,107, 21, 43, 31,171, 21,137, 50,242, 65, 66,
- 13,157,172,245,156, 90, 13, 68, 18,113,170,216, 84, 82, 93,100,189, 0, 0,137,131,219,200,239, 7,183,235,227,211,174, 53,173,
- 61,178, 17,153,229,154,210,224, 4,181,250, 89, 25, 57, 94, 75, 28,174,124,239,189,247, 86,218,216,216,136,182,110,221,106,225,
-226,226, 2,173, 86,171,170, 46,178, 76,236,219,142,219, 50,172,125,143,182,142, 86,180,230,183,109, 72,151, 51,229, 91,158,105,
-246, 27, 34,178,108, 45, 76, 47,236, 90, 55, 83,108, 34,228, 65,161, 80, 32,116,231,111,184,120, 35, 46, 40, 47,238,228, 5, 0,
- 23,222,226,129,252, 52, 40, 40,104,211,154, 53,107,160,209,104, 48,117,234, 84, 60,125,250,244,226,227,199,143,183, 52,111,222,
-124,241, 23, 95,124,225,236,232,232,136, 49, 99,198,240, 53, 26,205,148, 90, 56,190,253,245,215, 95,131,124,124,124, 16, 17, 17,
-129,162,162, 34, 56, 57, 57, 97,246,236,217,130,144,144,144,253, 37, 37, 37,163,215,173, 91, 39,122,254,252,121,157, 78,214,107,
-207, 53,195,124,179,123,211,204,197, 93,186,245,164,159, 60, 73,210,166,249, 5,208,215, 46,159,142,180,177,177,217,159,150,150,
-246, 42, 62,135,119,104,112,124, 26, 97,132, 17, 70, 24,241,110, 64, 81,212, 25, 93,191,171,215, 92,174,234, 34,172,210,177,170,
-186, 95,253,124,221,241,119, 81, 89,222, 83,131,240,122,125,122,135,160,160, 32,131,135,213,179,101,185, 6,137,167,234,120,191,
- 29, 52, 77, 76,193, 93, 22, 64,131, 47,177, 82, 12, 93,115,233,106,109,231, 74, 36, 18,131, 29, 45, 86,169,168, 47, 81, 26, 36,
-180,116,125,180,206, 19, 66, 94, 19, 90, 22, 14,109, 3,150,124, 49,111,115,207,145,131,232,236,207,252, 81, 84,170, 84,126,241,
- 72,203,102,148,215, 45,178, 42, 74,113, 77,138,137,196, 52, 86, 36, 49,169, 42,178,210, 0, 64,100,223,218,239,243,249,179,118,
-246, 29, 55,148,202,157,209, 19,133, 69,114,229,226,120, 45,149, 41, 39,163, 19,128,107, 53,209, 93,189,122,117, 55,128,221, 1,
- 1, 1,217, 18,137, 4,165,165,165,111,164, 65,101,120,123,140, 28, 68,103,127,218, 21, 5,101,106,229, 23,241, 90,188,148,179,
-135,235, 19, 89,118,150,102, 23,118,173,157,105,242, 50,227, 5,248,124, 62, 76, 77, 77,113,233,207, 88,228,197,159,122, 27,129,
- 5,154,166, 87, 5, 7, 7,175,156, 53,107, 22,242,243,243,113,250,244,105,188,255,254,251, 56,116,232,144,203,217,179,103, 55,
- 5, 6, 6,130,195,225, 32, 60, 60, 28, 26,141, 38,185, 22,154,225,211,166, 77, 91, 60,114,228, 72,220,185,115, 7, 82,169,244,
- 53, 39,171,168,168,232,163,157, 59,119,142, 76, 73, 73,169,215,201,170, 6,191,150,173, 59,241,151,174,216, 0,101,121, 14, 55,
- 55,243, 86,196,149, 75,244,205,130,130, 2, 19, 0,197,141,141, 79, 35,140, 48,194, 8, 35, 12,118,181,106,211, 34,185, 58, 17,
-149, 91,211,126, 21,129, 85,211, 62, 85,205, 5, 83, 85, 59,254,240,175,188, 39,131, 28, 45,174, 67,123,104,179,227,170, 8,173,
-156,215,142,139,204,172, 13,106, 58,212,104,193,221,181, 87, 63,143,150, 40, 63, 63, 95,100,107,107,171,168, 42, 16, 76, 76, 76,
-224,236,236,140,194,194, 66,236,217,179, 7,168,191, 83,180,214,124,228, 68,248,141,155,138,187, 77, 5, 32, 26,181,222,217,218,
-245,241,199,175,137, 45, 62,159, 95,217, 55,172,190, 66,247,182,206,105,186, 9,128,116,114,107,245,181, 72, 34,249, 88,100,219,
-204,118,254,204, 79,121, 41, 57, 74, 92,237,185,180,232,183,111,151,152,166, 19,211, 89,105, 40,190, 81, 15,223,179, 15,127, 56,
- 88,221,201,202,232,232,214,106,185,200, 68,244,153,192,186,133, 99,240,194,153,188,148,108, 37,117,213,239,139,146, 99,223,125,
- 97,242, 28,102,139, 51, 80,116,205,128,228, 89,249,254,251,239,175, 36,132, 16,150,101, 87, 0, 64,213,240, 46,156,253, 25,239,
- 89,150, 2, 87,122, 46, 47, 60,246,237, 18,179,116,212, 29, 94,219, 14,195,122, 56, 88,153, 95,216,181,110,150,137, 52, 51, 21,
- 66,161, 16,102,102,102, 72,207, 46, 6,143,203,145,191,229,243, 38,236,213,171,215,146,153, 51,103, 34, 54, 54, 22, 51,102,204,
-144,166,165,165, 29, 63,114,228,200,140,175,190,250,138, 59,112,224, 64, 72,165, 82,172, 95,191, 94,243,231,159,127,174, 3,176,
-190,198,231,145,203,253,244,235,175,191, 38, 47, 95,190,164,158, 63,127, 14, 39, 39, 39,204,153, 51, 71,176,110,221, 58,125,159,
-172,134, 56, 89,149,200,204,204,140,184,120,249, 38, 62, 56,183, 25, 90,141, 50,162, 40, 63, 45, 50,241, 89, 97,132,181, 64,176,
-168, 73,167, 14,141,138, 79, 35,140, 48,194, 8, 35,222,137,139,117,183,174,253,191, 1,106,106, 58, 52, 72,104, 37,111, 91,254,
-137,219, 39,179, 62,135,216,165, 7,148, 9, 39,192,150,102,235, 29, 45,145,169, 21,172,155,123,160,168, 76,137,176, 43,247, 1,
- 32,185, 33,161,146,201,100,240,245,245,197,142, 41,109,251, 42,100,249, 34, 49, 0,165,208, 92,113, 82,208,235,234,217,179,103,
-203, 89,150, 61, 12,224,108, 61, 52,171,188,188,188,182,111,216,176, 65,224, 49,238, 19,148,222,186, 94,221, 65,129, 88, 44,134,
- 80, 40, 68, 76, 76, 12,174, 94,189,170, 2,176,170,158, 4,189,173,213,106, 31, 30, 57,114, 36,163, 77,171, 38,131,124, 59,122,
-207, 93,182, 52,216,236,209,245,139, 88,177,110, 59,219,166,243,192,226,208, 67, 39,101,197,166,205,251,201,165,143, 31, 24,112,
-171, 15,171,137,172,151,238, 45,155,245,237,216,222,235,243, 21, 43,150,155,199, 95,191,132,175,190,219, 69,220,124,250, 23,127,
-119,236, 84, 73,158, 73,139,247, 20, 57,137,119, 12,137,195,136,136,136,221, 0,118, 87,238, 87, 15,111,240,154, 45,108,219, 46,
-131, 10, 67, 15, 29, 43, 43, 49,107,222,191,174,240,218,121, 12,239,222,212,206,234,194,182,111,254, 99,146,149,153, 6,161, 80,
- 8, 83, 83, 83,164, 73,139,176,114,243,209, 50, 53,203, 14,122, 91,161,101,102,102, 38, 84,171,213,216,177, 99, 7,210,210,210,
-252, 1,164,221,187,119,111,215,216,177, 99,183,118,232,208,193, 61, 62, 62, 62,185,180,180,116, 22,128,196,218, 72, 44, 45, 45,
-253,237,236,236,168,155, 55,111,226, 63,255,249,143,106,206,156, 57,252,201,147, 39, 83,133,133,133,141,117,178, 0, 0, 77,154,
- 52, 9, 24,208,175, 27,122, 12,152, 17,161, 82, 20, 69,166, 36,238,143,160,201, 13, 81, 99,227,211, 8, 35,140, 48,194,136,127,
- 13, 26, 55, 49,120, 0,192,109,107,131,233, 94, 77,248, 89, 7,190,157, 67,100,207,162,136,252,206,110, 82,114,226, 51,114,102,
-253,100,114,118,219,124, 50, 99,136, 23,113,183,167,178,218,218, 96,122,192,155,194,237,181,213,189,223,111, 7,205,128,214, 32,
- 3, 90,131, 12,105, 11, 13,128,101,157, 58,117, 58, 57,219,239,213, 60, 90,179,253, 64, 0,252, 7,128,105, 45,193,170,105,197,
-112, 39, 0,123,124,125,125,181,215,174, 93, 35,143, 71,247, 39,209,238,182,100,214,172, 89,228,171,175,190, 34,227,199,143, 39,
-118,118,118, 90, 93, 68, 56,213,199,249,193, 7, 31, 52, 5,128,102,205,154, 89,118,246,104,147, 21,115,229, 52,137, 60,176,149,
-252, 60,123, 4,233,218,193, 35,207,209,189,247, 67,177, 83,187,142,245, 68,159,158,211,209,209,113, 41, 33,100, 16, 33,196, 9,
- 0,220,220,108, 76, 59,185,183,121,249,240,242,105,114,253,224,118,242,243,236, 17,164,155,183,103,126, 83,143,192, 68,145,189,
-187,159, 33,156, 53,161,198,240,182,119,207,115,104,211,253, 65, 29,225,213,115,182,242, 27,115, 42,227,101, 54,185,125,251, 54,
- 57,123,246, 44,185,126,253, 58, 57,112,228, 20,105,222,101,116,169,109,135, 97, 61, 26,240,232,212, 22, 78,139, 33, 67,134,144,
-228,228,100, 50,120,240, 96, 2,192,162,145,156, 39, 83, 82, 82, 72, 92, 92, 28, 89,182,108, 25, 1,176,111,230,204,153,242,226,
-226, 98,210,191,127,255, 52,157,192,226, 54, 38,156,174, 45,155,132, 14, 31,218,107,213,236,255,140, 12,120,219,248,124,135, 48,
-114, 26, 57,141,156, 70,206,127, 3,231,255, 50,156,116,174, 86,229,182,147, 65,243,104, 69, 0, 90,228, 99,119,123,123,245,127,
-215,173,223,182,104,199,238,125,159, 47,153,251,169,164, 87,207, 1,136,189,252, 11,142,133, 31, 41, 83, 40, 85,235,249, 28,108,
-136,203, 71,121, 82, 61,161,208,205,163,245, 26,162,163,163, 77,172, 91,191,154,131,233, 73,197,220,172,187, 26,120,131, 82, 0,
-211,238,223,191,191, 33, 48, 48,112,237,103, 61,252, 70,204,238,222, 23, 26,141, 6, 7, 14, 28, 64,106,106,234,113, 0,203, 13,
-117,220, 98, 99, 99,243, 60, 91,187,204,227,113,184,159,207, 26, 63,220, 46,247,233, 35,100, 36, 68, 3, 0,148, 74,185, 38, 43,
- 57,210,167, 33,129, 19,139,197,183,237,236,236, 30,219,217,217, 21,182,109,213,108,154, 16,188, 21, 51, 62,250,208, 62, 63, 37,
- 17,233,241, 21, 45,163, 74, 69,185, 58, 35,249,154,123, 99, 82,215,197,197, 69, 40,225, 97,122,141,225, 85, 41, 52,217, 79, 18,
- 59, 26,194, 83,174, 84,173, 91,189,233,192,123,223,124,254,177,208,220,220, 28,247,227,158, 96,197,198, 67,101,114,149,102, 80,
- 94,236,201,119,210, 60, 70, 8,129, 70,163, 49,120,160, 67, 45, 88,226,227,227,211,110,237,218,181,110, 83,166, 76,193,219, 58,
- 89, 85,241, 44, 37, 51,184, 73, 51, 87,207, 39,143,239, 7, 90,139,249,255,125,155,248, 52,194, 8, 35,140, 48,226, 95,131, 33,
- 58, 51,103, 90,149,109, 52, 12,172,245, 35, 46, 7,229, 0,214,180,226,148,238, 90,186,118,211, 74,154,218,252, 49, 75,200, 47,
- 90, 26,171,159,231, 35,247, 45, 3, 87,206,227, 66,251,222,176,241, 92, 0,224,113, 27, 87, 64,234,144, 12, 96,228,143, 55,238,
-116,249,241,198,157, 47,117,191,125, 3,160, 65,109,185,102, 92,196,245,244,116,109,210,171,147,151,136,195,200,145,145,240, 20,
- 5,101, 10, 92,138, 79, 45,162, 9,253, 75, 67, 3,245,252,249,243, 63, 0,192,193,194, 36,161,151,103,235,230,189,125,189, 76,
-120,148, 10, 25,143,238,163, 88,174,194,197,248,212, 98, 80, 84,163, 59, 84,191,171,240,102,199,158,186,251, 59,168,254, 20, 69,
- 93, 94, 54,123,156,112,229,198,195,239, 84,100, 1, 40,207,204,204,204, 47, 47, 47,183,121,249,242,165, 10,141,159, 36,238, 73,
- 73, 73, 73,135,249,243,231,175, 89,188,120,241,231,223,126,251, 45,191, 49,125,178,106, 67, 97,102,234,137,222, 94,239, 46,253,
-141, 48,194, 8, 35,140,248, 87, 96, 90,181, 45, 12, 22, 90,122,193,144,131, 92, 0,179, 92, 93,201,194,103,207,160,122, 87, 33,
-171,201,233,122, 75,220, 5, 48,180,209, 87,211,148,236, 86,114,106,233,237,228,212, 82,176,132,176,132, 40,105, 26,233,101,106,
-245,186,228,231,153,141, 31,117, 71, 81,204,221, 39,105,242,123, 79,211, 21,132,101, 9, 75,136,138,162,144,165,209,176,235,226,
-159,167,158,250, 59,132, 55, 47,246,228,141,112, 45,213,235,198,237,184,133,101,101,234,237,121, 9, 39,163,222, 97,186,104, 98,
- 99, 99, 39,248,251,251,127,194, 48,204, 46, 0,154,183,224, 82,105,181,218, 37,161,161,161,199, 99, 99, 99,143, 70, 69, 69, 73,
-223,133,200,250, 75,211,223, 8, 35,140, 48,194,136,127, 42, 26,183,168,116,109,120,151, 34,235,239,136,184, 39, 47,124,255, 10,
-222,248, 39, 47,218,255, 47,132, 55, 59,225,196,189,108,224,163,191, 40,122, 47, 50, 12,115,241, 93,138,234,243,231,207,183, 68,
- 13,203,234,252,221,210,223, 8, 35,140, 48,194,136,127, 44,166,213, 38,190,184,198,184, 49,226, 31, 0,242,174, 68,150, 17, 70,
- 24, 97,132, 17, 70, 52, 2,181, 58, 90, 20,106, 31, 57,112,185, 1,127,208,152,209, 7,151,141,156, 70, 78, 35,167,145,211,200,
-105,228, 52,114,254,235, 56,255,137,112, 66, 69,135,248, 51,186, 45, 8, 33,123,254,127,252,177,113,232,171,145,211,200,105,228,
- 52,114, 26, 57,141,156, 70,206,127, 58,222,232, 8, 95, 57,189, 3,109,140, 27, 35,140, 48,194, 8, 35,254, 66, 8,117,159,198,
- 30, 55,194,136,255, 69,177,165, 23, 92,141,233,163,213, 70,183,125,242, 23, 6,118,182,147,147,211, 52,111,111,111, 15, 62,159,
- 79,203,100,178,213,215,174, 93, 91, 85,253,164, 94,158,220,123, 28, 26, 77, 95,253, 66, 1, 20, 7,160,105, 48, 4, 25,215, 99,
-228,157,141,233,254,183,134,139,216,220,238,119,138,230, 8, 24,173, 26,140, 70,141,138,238, 86, 21, 96, 89,109, 42,163, 86, 14,
-172,237, 98, 71,159,225,205,181, 12,251, 45, 64,118, 0,244, 76,128,221, 73,129, 59,131, 64,251, 3, 5,206,127,192, 33,223,129,
-161,190,224,242, 56, 75,165,209,191,165,255, 19, 34, 44, 44, 44,140,243, 54,215,143, 30, 61,186,198, 5, 68,157,157,157,195, 77,
- 76, 76, 90,215,118, 93, 89, 89,153, 84, 42,149, 6,254,195,159,199,222, 0,182, 1,240,170,246,123, 34,128,121, 0,174,188,237,
- 31, 4, 0, 92, 7, 96, 58, 31,248, 2, 0,212,192,119,217,192,238,136,191, 81, 31, 67, 59, 59,187, 72, 46,151,235, 86, 86, 86,
- 86, 38,147,201, 92,205,204,204,158, 73, 36, 18,137, 86,171, 77,206,205,205,237,221, 64,186,153,120,181,148,214,231, 0,118, 54,
-240,184, 17, 70,252,175,224,173, 70, 29,182,173,200, 31, 16, 0,160,119,151, 46, 93, 28,202,202,202,144,152,152,152, 13, 32, 18,
- 64,132,238,147,244, 46, 66, 74,211,244,247,155, 54,109, 90, 52,103,206, 28,253, 98,208, 49, 49, 49,240,241,121,115,142, 80, 14,
-141,166,215, 78, 95,182,191, 27,155,132, 46,253, 71,233,132, 22, 13,148, 73, 17, 56,192,175,177, 65, 48,179,178,178, 90, 77, 81,
-212,104,154,166,235, 45,212, 88,150,101, 8, 33, 97,133,133,133, 43, 1,200, 26,242, 71, 18, 19,161, 70,203, 48, 53,254, 7,151,
-195, 97,202,202,149,181, 78,123, 97,109,109, 29, 69,211,116,171,170, 11,102, 3,175, 47,160, 93,219, 49,173, 86,155,145,151,151,
-103,136, 8, 21,209, 92,254, 60,138,226, 15, 0,205,182, 5, 40, 80,160,147, 88, 70,117,137,213,170,183, 0, 80,188,141,200,114,
-106,230,122,125,193,242,208,166,113, 9,137, 88, 54,123, 60,190,221,182, 15, 75,231,125,130, 45,123, 14, 97,222,180,113,240,244,
-244, 66, 93,203,138,179,224,175, 91, 62,119,116,255,144, 29, 71,123, 46,157, 53, 90, 24,178, 35,172,215,178,217, 99, 5,235,182,
- 31,237,181,108,246, 24, 97,200,246,163, 61,151,206, 29, 45, 94,183,243, 55, 22,192,196,198, 4,114,156,155,115, 25,165,213,214,
- 88,219, 38, 92,174,242, 80,242, 75,201,255,197, 27, 61,101,202, 20,111,185, 92,126,127,252,128, 78,161, 29,219, 54,201,172,233,
-156,252,172,204, 38,207, 30, 71, 7,243,248, 98,223, 15,131,247,197,212,105, 57, 8,133,173, 18, 19, 19,221, 88,150, 5,195, 48,
-208,106,181,250,173, 74,165, 66,239,222,189,223,213,192,153,161, 0, 86, 87,188,172, 8, 1,112,244, 45,184, 76,185, 92,238, 2,
-129, 64, 16,160,213,106, 61, 0,128,199,227, 37, 40,149,202, 8,173, 86,187, 9, 64,105, 3,249, 54,103,102,102,122,154,154,154,
- 66,173, 86,235, 23,160,231,112, 56,238,205,155, 55,223,161, 80, 40,220,222,246,230, 29,128,233,221,123,246,220, 50,121,209, 34,
-142, 60, 50, 18, 91,246,238,221,140,146, 18, 0,216, 81,223,181, 2,129,224, 2, 77,211, 46, 13,249, 63,150,101, 83, 85, 42,213,
-192,134, 92,195,229,114,221, 94,190,124,105,239,236,236, 12,153, 76, 6,137, 68, 34,169,220,111,132,147,181,158, 16, 34,214,229,
-237, 91,186,117,235,230, 79, 81,148, 22, 0, 97, 89,150,190,125,251,246, 56,150,101,185,186,252,105, 61,128,189, 0,148,198, 50,
-219,136,255, 81, 55,107, 79, 67,133,214, 89, 0, 1, 93,186,116, 17,127,244,209, 71, 8, 8, 8,128,155,155, 27, 68, 34, 81, 69,
- 38,158,159,239,240,224,193,131, 49,145,145,145, 99, 78,159, 62,141, 71,143, 30,201, 1,252, 9,160,198,151,186, 95, 80,207, 57,
- 34, 83,225, 86, 0,200,205,200,151,102, 60,207,217, 42,149, 74,215, 3,168, 58, 69,184,235,196,137, 19, 23,206,157, 59, 23,225,
-225,225, 56,116,232, 16,148, 74, 37,100,178, 58,244, 75,121, 14, 10,175,134, 2,146, 20, 32, 45, 2, 48,177, 7, 36, 14,141,142,
- 41, 43, 43,171,213,243,230,205,155,239,233,233,169,159,197, 92,163,209, 64,171,213, 66,163,209,160,176,176, 16, 11, 23, 46,172,
- 40,104, 9, 1,203,178, 56,119,238,220,156,105,211,166,161,176,176,112, 65, 77,156,221,124,155,221,163, 41,186,105,165, 87, 67,
- 24, 38,227,214,131,140,206, 90,134,225, 40, 20,234, 26, 87, 42, 23,137,248,117,138, 60, 30,143,215,244,209,239,191,219,211, 2,
- 1, 8,195, 0, 44, 11,194,178,186,232,212,125, 72,197,111,132, 97, 65, 52, 12, 88, 45, 11,173, 92, 9,191,153, 51, 13,137,138,
-238, 60,129,248,208,132,207, 22, 57,118,237,214,141,215,162,153, 51,180, 12,139,167, 41, 25,142,247,239,221,234, 17,182,127,199,
- 12,149, 92, 54, 14, 64,163,230,217, 18,152,152, 95,220,254,195,143, 77,239, 62,136,195,149,107,145,184,124, 53, 2, 0,112,225,
- 90, 84,165,224,174, 55,169,160, 45,237, 48,111,234, 48, 97,232,246,195,188,121, 83,135,115,190,221,126,132, 55,247,147, 15, 57,
-161, 91, 15,241,231,126,242, 33, 39,116,219, 33,254,220,169,195, 56, 33, 91,126,246, 6, 96, 5,160,176, 54,178,218,210,136,210,
-106,133,255,125,150,205, 1,128,220, 93,187,160,201,201,129,243,202,149, 0,128, 9,174, 14, 6, 55,119,216,218,218,222,227,241,
-120, 77,235, 59, 79,163,209,212, 43,130,167, 76,153,226, 35,151,203,239,105,181, 90,194,229,114,131,199, 15,127,239,228,160, 94,
- 62,249, 85,207,137,137,121,104,179,110,221,239,195,142,222,151,145, 49,190,102,247,195,191,159,210, 57,104,241,190,135,117, 20,
-200,180, 82,169, 68,114,114, 50,170, 46,242, 94, 5, 76, 99,235, 78, 0,182,216,216,216,116,205,207,207,159, 0, 96, 89, 73, 73,
-137, 55,135,195,129,181,181,245, 50,149, 74,245,212,194,194,226,167,226,226,226, 40,157,107,100,232,146, 1,189,205,205,205, 15,
-156, 56,113,194,170, 83,167, 78,116, 94, 94, 30, 90,182,108,137,130,130, 2,191,200,200, 72,223,169, 83,167, 78,149,201,100,147,
-116,149, 65, 67,209,206,196,196,132, 76,158, 60,153, 98,152, 87,183,251,243,207, 63, 99, 96,123,109,107, 59, 75,147,114,133,138,
- 20, 95, 73,182,248, 15,159,207,255, 51, 53, 53,181,184,161,145,193, 7,190,152,188,104, 17,199,244,197, 11,152, 62,124,136, 9,
- 37, 37,220,111, 43,220,173,122,133, 22, 77,211, 46, 7, 14,253,226, 38, 16, 8,160,213,106,245, 98,176, 50,143,210,104, 52, 80,
-171,213,208,104, 52, 96, 24, 6, 26,181, 6, 33,223,124,215,232,188,208,196,196,196,196,201,201, 41,219,196,196,196,228, 93,148,
- 66, 66,161,144,187,127,255,254,113, 2,129, 0, 0,160, 82,169,208,190,125,123,202, 88, 62, 27,241, 15, 19, 91,111,184, 92,117,
- 9,173,193, 37, 37, 37, 96, 24, 6,102,102,102,224,112, 94, 47,247,109,108,108, 48, 96,192, 0,244,238,221, 27, 31,125,244, 17,
- 30, 61,122, 36,254,232,163,143, 6,212, 70, 54,126, 81, 16,154,185, 57,232, 10, 19,214,233,198,153, 7,161, 63,127,253,155, 93,
- 86, 86,214,162, 42,167, 77,157, 62,125, 58,149,159,159,143,209,163, 71, 71, 42,149,202, 15, 0,148,212,198,201,176,200, 8,252,
-104, 2, 88, 66,137, 55,221,254,145, 82, 41,228,132,166,105,121,101,211, 97, 99, 98,137,162,168,209,206,206,206, 56,124,248, 48,
- 84,170, 55,167, 11, 51, 55, 55, 71,124,124,252, 43, 87,141,195, 65,183,110,221, 56, 20, 69,141, 6,176,160,102, 78,186,233,141,
-187, 47,236, 43,247,131, 6,120,241,187,249,210,217, 47,179,203, 8, 0,106,249,242,229,122,225, 6, 0,171, 87,175, 54, 36,156,
-160,121, 60,228, 70, 68,188,202,136,185, 52,104, 62, 5,138, 7,208,220,138, 86, 84, 16,128, 48, 0,171, 5, 88, 13, 32,114,106,
-102, 72, 52,248, 53,105,238, 22,190,110,227, 78, 75,165,134,224,240,169, 43, 72, 73,121, 14, 14, 77,195,181,181, 27,222,235,211,
-139,231,219,197,191,217,119,171, 22,157,126,153,246,100, 48,128, 59, 13,142,104,150,136, 90, 55,183,197, 79, 63,223,135,157,149,
- 41, 70, 15,123, 31, 98,145, 16,223,110,251, 5,223, 44,157, 13, 55, 87, 23,236,222,188,182,214,203, 45, 44, 44,214,120,184,181,
-118,217,185,255, 12, 60,220,221, 57, 59, 15,156,129,135,167,110,235,229,193,217,121,224, 12, 60,189, 60, 57, 59, 15,156,129,183,
- 87,187, 22,247,164,183,215, 20, 20, 20,204,174, 61, 62,171,165,209,123, 21,105,196, 43,101,245, 5,193,139, 25, 51, 0, 64, 47,
-180, 26, 2, 30,143,215,244,229,203,151,246,245,157, 87,159,107,160,115,178,238,105,181, 90,228,228,228, 80, 69, 69, 69,196,210,
-210,114,216,249,221,203, 78, 12,236,233, 83, 0, 0, 15, 31, 62,180, 14, 9, 89, 55,236,200,189, 18,200,111,109,167,254,251,123,
- 4, 59,225,131,128,123,167, 66,167,248, 66,183, 36, 68,117, 40,149,202,148,142, 29, 59, 18,221,247, 38, 66,161,144, 95,237,121,
-115,110,211,166,205, 27,174,181, 1, 77,138, 91,110,222,188, 57,219,211,211, 19,238,238,238, 81, 93,187,118, 53,151, 72, 36, 56,
-127,254, 60, 60, 60, 60,188,204,205,205,111,135,133,133,241,150, 44, 89,226,179,119,239, 94, 0,152, 99, 64,116,246, 15, 12, 12,
- 60, 28, 30, 30, 46,226,243,249,144,203,229,136,143,143,135,133,133, 5, 4, 2, 1, 62,252,240, 67, 78,143, 30, 61,108,250,244,
-233,115, 44, 41, 41,105, 28, 26, 48, 2, 74,161, 80,144,101,203,150,193,196,196, 4, 38, 38, 38,144, 72, 36,144, 72, 36, 48, 21,
-129,218, 53,175,185,120,238,158, 34,241,130,149,187, 66, 15,236, 92,117,173, 89, 51,246,171,244,244,244,162,134, 50, 47,200,121,
- 0, 0, 32, 0, 73, 68, 65, 84, 62, 11,242,200, 72,152, 62,124, 8, 84,121,119, 13,133,133,196, 26,193,193,193,245, 57, 82,224,
-243,249,232,222,189,123,189,124,214,214,214,199,185, 92,238,107, 53, 83,173, 86, 43, 10, 14, 14,102,146,146,146, 36, 52, 77, 75,
- 88,150, 69,112,112, 48,163,213,106, 69,246,246,246, 81, 44,203,102,231,229,229,141, 48, 32,184, 74, 0,159,211, 52,189, 69, 40,
- 20,114, 91,180,104,145,186, 98,197,138,155, 58, 55, 19,132, 16,186, 69,139, 22,126, 98,177,216, 69,169, 84,106, 81,209,116,104,
-116,179,140,168, 17,132, 16,223, 10, 83, 88, 15, 21, 0,129,238,123,126, 69,105, 7,219,106,191, 3, 64,158,174,162,232, 80,203,
-126, 62,128, 71, 0,218, 1,176,215, 29,187, 75, 81, 84, 65, 35,130, 89,187,163, 21, 30, 30,174,175,194, 6, 5, 5,233, 11, 22,
- 51, 51, 51,220,189,123, 23, 20, 69,193,204,204, 12,230,230,230,176,176,176, 64, 73, 73, 9, 30, 61,122,132,196,196, 68,188,120,
-241, 2, 20, 69,193,213,213, 21,149, 47, 80, 21,232, 51,184, 95, 55,132, 67,100, 42, 4, 69, 1,157,250,122,195,187,119,123,116,
-185,243,108,222,189,203,212, 30,169, 84,154, 12,128,219,190,125,251,169,221,186,117,195,198,141, 27,161, 84, 42, 55,214, 34,178,
-244,156,215, 31,105, 59, 3,128,147,147,211,226,131,231,159,154, 76, 28,212,186, 92, 42,149,126,223,136,200,121, 45, 35,206,203,
-203, 51,120, 45, 62,150,101, 81, 88, 88, 88, 39,103,117,135, 96,211,150,237,150,178,226,108,124,253,237, 65,104, 52, 26, 44, 90,
-180, 8, 44,203,234, 63, 69, 69, 69, 6,133,147, 48,204,155,222, 1, 93,209,122, 74,113,129,230, 99, 43,116, 69,218,225,237,160,
- 8, 64, 49, 0,222,188,175,234,133,144,136,195, 23, 31, 89,245,237, 86,203,232,196, 12,156,186, 18, 13,117, 73, 38,164, 15, 79,
- 84, 88,142,221,199,225,168,146,131,174,222,173, 49,127,249,119, 86, 95,206,159,116, 68, 37,151,185,227,245,102,196,203,245,191,
- 52, 12,190, 94,179, 6,123,182,110,196,119, 27,183,162,164,184, 8, 60,158,173, 46,163,103,192, 48, 76,221,247, 78,200,160,224,
-121, 31, 83,223,254,112, 28,126,158, 78, 56,118,254, 14,122,118,116,193,137,139,247,208,219,183, 37, 78, 93,142, 70,223,174,173,
-113, 54, 34, 14,243,167,143,163,198, 93,216, 59,168, 33,105,180,121,243,118, 75, 89, 73, 54,194,215,238, 71,206,142, 29, 72,157,
- 61, 27,126,186,115,238, 80, 20,248, 77,155, 2,252,250,211,168, 58, 18, 18, 18,160, 84, 42,107,170,237,195,195,195,163,222,116,
-151,203,229,247,181, 90, 45,201,206,206,166,178,179,179, 33,145, 72,168,248,248, 56,198,203,171,253,112,146,248,219,143, 0, 16,
- 18,178,110,248,209,251, 37, 40,143,218, 10,249,205,109,224,183,140,161,247,172,158,174,158,182,114,247,253, 42,239,232,107,225,
-204,202,202, 26,156,149,149, 5, 0,104,213,170, 85, 98, 82, 82, 82,187,202,166,102, 93, 19, 34, 95,171,213,186, 85, 54, 39,106,
-181, 90, 40,149, 74,244,239,223,159, 83,215,189, 91, 89, 89,117,243,240,240, 64,116,116, 52,182,110,221,106, 29, 24, 24,136, 39,
- 79,158,128,162, 40,172, 91,183,142,242,244,244,228,229,229,229, 97,224,192,129, 56,126,252,120,247,146,146,146,250,226,211, 76,
- 34,145,236, 61,125,250,180,136,166,105,200,100, 50,176, 44,139, 30, 61,122,128,166,105,196,197,197, 97,249,242,229, 56,126,252,
- 56, 78,158, 60, 41,246,245,245,221, 91, 94, 94,238,129,215,155,245,107, 75, 35,162, 80, 40,136, 80, 40,132, 80, 40,132, 72, 36,
-130, 72, 36,130, 64, 32, 64,169, 2,152,182, 41, 85,201, 17,217,178, 94, 29,123,182,254,120,238, 58,250,251, 21,159, 92, 5,112,
-202,208,103, 30,168,232,147,181,229,151, 95,182, 78, 40, 46,166, 1,224, 39,138, 98,213,132,124,103,200,251, 14, 0,165,138, 98,
-184,184, 54,197,177, 35, 39, 49,114,236,176, 26, 69, 22,143,199, 7,159,199,131,185,181,164, 94, 78, 62,159,239,144,152,152,104,
-195,227,241, 64, 8, 1,195, 48, 80,171,213,217, 95,126,249,165,221,144, 33, 67,204,206,157, 59, 71, 15, 25, 50,132,181,178,178,
- 42,187,115,231, 78,142, 86,171,181,233,213,171, 87, 67,158,249,157,222,222,222,157, 78,156, 56,241, 73,112,112,240,189,197,139,
- 23,127, 93,245,224,250,245,235,215,156, 61,123,214,101,248,240,225, 7, 30, 62,124,184,179, 33,121,200,219,230,243, 70,206,191,
- 31,103,109, 90, 68, 7, 7,138,162,194,171,228,217, 65,149,251,193,193,193,203, 66, 66, 66,226, 41,138, 10,175,250,123,229,121,
-186,202, 98,120, 77,251,186,107,173,151, 46, 93,218, 62, 52, 52,116,157,191,191,255,225,168,168,168,231, 0, 26, 42,180,234,238,
-163, 85,121, 67, 85,111,178, 90,161,134,146,146, 18,148,148,148, 32, 61, 61, 29,187,118,237,210,189,208, 60,112,185, 92,112,185,
- 92,125,127,134,218,112, 37,252,207,109, 0,182,117,234,212,137, 23,123, 51,236,220, 23,123,230,246,235,220,191, 19,231,254,149,
-216, 81,168, 88,143,112,240,228,201,147,109, 1, 96,255,254,253,121, 0,206,253, 31,169,230,176,228,228,228,249, 78, 78, 78,250,
- 62, 42, 85,155, 15,181, 90, 45, 68, 34, 17, 42,251,178, 40, 20, 10,236,218,181, 75, 75, 8, 9,171,131, 19, 73,241, 87,145, 28,
-127,173,226, 58,150, 5,203,188,186,126,213,170, 85,250, 97,160, 0, 48, 67,231,156,212, 43,242,106,138,115, 82,109, 91,237,119,
-194, 48,245, 52, 79,240,231,142,154, 52,219,137,165,184,248,253,234, 3,240,120, 60,176, 85,220, 76, 30,167,162,182, 28,255,228,
- 37,156, 29,188,240,193,184,233,142, 39, 14,108,159,171, 85, 43,190,109,104, 92,187,123,251, 99,222,252,249,248,113,207, 30, 44,
- 95,185, 70,175, 0,180, 12, 3,109,189,225,164,233,254, 61,218, 67, 91,250, 18, 28, 14, 7,125,253, 90,131,195,225, 96,128,127,
- 91,112, 56, 28, 12,236,225, 14, 46,151,139, 65, 61, 61,209,166, 77, 27,112,185, 92,186,158,116, 71, 82,252, 21, 36,199,255, 81,
- 69,244, 18, 16, 0,106,169,244,141,243, 53, 82, 41, 72,115,155,134, 62, 91,152, 58,117,106, 81,122,122,186,186,250,177,102,205,
-154,241, 35, 35, 35, 45,107,105,182,211, 67, 44, 22,251,114,185,220,251, 5, 5, 5,172,137,137, 9,205,178, 12,235,229,213,158,
-115,126,247,178, 19,149,231, 44, 93,186,236,196, 24, 95,243,225, 7,195,194, 9,191, 69, 79,138,226, 9,181,159,173,220,205,231,
-241,197,190,128,220,144,202, 3,173, 84, 42,241,248,241, 99,212, 23, 30, 66, 72,157, 77, 63,133,133,133,147, 61, 60, 60, 34,183,
-109,219,102, 77, 81, 20,174, 95,191, 14, 14,135,163,255, 60,123,246, 12, 52, 77,227,139, 47,190, 80,151,148,148,124, 90, 95,216,
-184, 92,238,252, 99,199,142, 89, 8, 4, 2,200,100, 50,253,123,195,225,112,144,152,152,136,239,191,255, 30,147, 39, 79, 70, 90,
- 90, 26,156,157,157,177,104,209, 34,211,208,208,208,249,106,181,122,141, 1, 73, 20,163, 82,169, 58,155,152,152, 64, 36, 18,161,
- 82,112, 1,192,197,120, 94,156, 92, 46,239, 96, 99, 83,238,104, 23, 17,254,123,247,192, 15,124,108,236,156,252,165, 82,105,131,
-150,206,122, 10,236, 73, 97,152, 47, 7,159, 56, 97,127,227,196, 9,246,214,233,211, 25, 66,153,108,183,193,207,144,134, 70,234,
-179, 12,248,250,250,226,254,253,251,240,245,245,173, 42,154, 32, 16, 8,192,231,243,193,231,243, 97,107,101, 80, 23, 10, 66,211,
- 52,110,220,184, 1,134, 97,160, 82,169,160, 82,169,224,233,233, 89,112,237,218, 53, 83, 0,120,246,236, 25,153, 56,113, 98,209,
-237,219,183,209,177, 99,221,235,169, 59, 56, 56, 68,114, 56,156, 22, 85,127,203,207,207,183, 26, 49, 98, 4, 10, 11, 11,223, 31,
- 49, 98, 68, 79,221,251,155,249,219,111,191, 77, 4, 0,129, 64, 0,154,166, 25, 24,241,175, 71,125, 90,164,170, 80,170, 46,184,
- 66, 66, 66,130,170,255, 86, 85, 84,213,244,189,234,181,161,161,161,235,170,112,203, 27, 17,252,250,251,104,133,135,135,147, 26,
- 20,164,193,168, 79,104, 85, 34, 58, 58, 90,227,236,236,252, 99,242,131, 23,253, 90,123,187, 66, 44, 17,190, 7, 96,155, 80, 40,
- 92, 56,105,210, 36,220,186,117, 11,113,113,113, 63,227, 45, 71,225,180,111,223,254,130, 80, 40,116,169,165,153, 36, 53, 46, 46,
-110, 96, 45, 5,195,202,211,167, 79,163,174,206,240, 87,175, 94,173, 90, 40, 85,237, 12, 95,243,131,193, 18,104,212, 26,148,149,
-203, 95, 21,226, 58,161, 85, 86, 86,134,177, 99,199,190,230,104,229,228,228,212,123,127, 20, 69,225,251, 83,167,112, 41, 44, 12,
-239,251,248,224,248,157, 59, 8,157, 52, 30,238, 46, 77, 64, 24, 10,132, 2,210, 14,109, 71,126, 73, 41,126,189,114, 3, 5,178,
-114, 76,232,213, 11,110,230,182,117,243,242,248, 3,252,186,249,243, 47, 71, 61, 2,143,199, 5, 13, 22, 68, 83, 14,103,143, 62,
-224,208, 52, 44, 28, 90,130,207,227,129,199,227,226, 89,122, 30, 60,218,119, 17,132, 11, 68, 3, 26, 35,180,154,185,180, 4,195,
- 48,152, 60,121, 50, 14, 31, 62, 12, 27, 71, 23, 88, 52,107,143,111, 54,238,193,251,253,123,213,123,255,149, 53,120, 46,151, 11,
- 14,135,243,198,182,242,187, 33,238, 36, 97, 9,212,213,211,136, 37, 0, 33,104,186,118, 45,154,174, 93,139, 59,186,255,244, 44,
- 43,131, 92, 46, 7,186,122, 53, 72,100,169, 84, 42,164,167,167,171,179,178,178, 28,106, 56,158,173, 82,169,234, 21, 54,251,246,
-237,139,153, 50,101, 74,103,107,107,235,123, 49, 15, 31,106,188,125,124,120,231,118, 45, 59, 89,217,108, 8, 0, 62, 62, 62, 5,
-203,150, 45, 59, 57,113,116,208,176,157,193, 31, 49, 51,215, 28,224, 10,197,226,206, 65,139,247,197, 28, 26, 61,186,254,246, 30,
-165, 50,197,219,219,155, 24,114, 95,229,229,229, 89,117, 28, 30, 10, 96,117,167, 78,157,204, 3, 3, 3, 17, 25, 25,137,145, 35,
- 71, 42,213,106,117, 50, 0, 12, 25, 50,164,237,175,191,254, 42,120,244,232, 17,236,236,236,120,169,169,169,123, 81, 79, 7,121,
-129, 64,208,167, 75,151, 46,180, 82,169,124, 67,100,133,134,134, 98,220,184,113,104,219,182, 45, 88,150, 69,105,105, 41, 2, 3,
- 3,121, 91,183,110,237, 99,160,208,154,231,238,238,254, 61, 42, 70, 29, 86,205, 11, 19, 80,209,172,133,252,252,252,172, 7,183,
-175,196,247,234, 63,162,115,139, 54,237,157,226, 98,238,215, 73,104,111,111,191,148,166,233, 49, 44,203,114, 74, 74, 74,210, 31,
-168, 84,109, 60, 93, 92, 28,122, 12, 27,134, 98, 30,143,179,229,202, 21, 58, 91, 38, 51, 5, 96, 80, 19,164, 66, 83, 6, 23,215,
-138,174,126, 35,199, 14,195,253,251,247, 49,234,163,225,224,243,249,224,114,121, 21,239, 38,191,194,209,178,180, 53, 55,232,217,
-212,104, 52,250, 60,188,178,159,151, 90,173, 70,101,215, 44, 19, 19, 19,253, 49,165, 82, 9,138,162,234,122, 54,220,142,174, 89,
- 97, 47, 54,183, 0,163,209,192,107,216, 40,253, 51,125,251,167,157, 98,176,172,184, 40, 53, 5,115,194, 78,243, 96,132, 17,181,
-184, 90,117,105,145,170, 66,233,109, 65, 81, 84,120,112,112,240, 50, 0, 36, 56, 56,120, 89,229,126, 72, 72,136, 28, 64,102, 35,
-197,214, 27, 46, 23,247, 93,136,172,202,230,133,186, 16, 24, 24, 56,199,204,204,108,107,229,126,250,173, 76,164,223,202,132, 71,
- 59,175, 30,157,124, 58, 23,143, 27, 55, 14, 54, 54, 54, 88,188,120, 49, 1,240,115, 67,255,255, 89, 82,188, 41, 0,226,228,228,
-180, 88,151, 33,251,220,185,115,199,238,238,221,187,232,210,165,203, 43,235, 94,173, 70,207,158, 61,235,162,146,233, 58,181, 47,
-120,119, 46, 25, 11,181, 90,141,242,114, 57, 84, 42, 53,180, 26, 22, 90,173, 22,190, 94,102, 56,176, 39,184,226, 55,109,165,123,
- 86,225,154, 53,117, 52,131,153, 41, 79, 67,211,148,252, 94, 76, 86,141, 57,166, 74,165, 66, 76,106, 42, 30,190,120, 1, 0,248,
- 32,164,238,142,175, 7,174, 68,194,211,211,179,190,208,182,110,234,236,136,151,151, 98, 42, 50,111,121, 58,238,254,121, 20,102,
-102,166, 0, 0,175,128, 9,224,243, 43,132, 86,153, 92, 13,219,118,205, 64, 17, 82,235,180, 0, 38, 86,142, 23,184,124,145, 11,
- 97, 88, 16,194,130,176, 12, 8, 97,193,225,241, 77,230,204,248, 4, 44,203,192,207,207, 15, 20,135, 3, 70,163,196,232,161, 3,
- 80, 88, 44,131,141,165, 97,133, 4,159,207, 71, 64, 64,128,184,182,227, 79,158, 60,145, 87, 21,102,117,167,145, 6,101,101,114,
- 40,149, 74,168, 85, 90,168, 53, 90, 48,173,248,248,250,203,241,208,170,181, 40,255,200, 31,106,141, 22,236,252,225, 80,171, 52,
- 72, 51,161,105,111, 15, 91, 13, 13, 74,254, 32, 33,215,188, 62,161, 85, 41, 14,106, 67, 77,125, 2,107, 17, 91, 15,167, 76,153,
-226,235,237,227,115,127, 76,127,159, 13,177,113,241, 47, 99,227,226,223, 56,207,165,173, 79,202,204,208,195,139,120,124,177,111,
-208,226,186, 71, 29, 86, 69,213,102,196,183,196, 50,153, 76,230,109,106,106,138,164,164, 36,112, 56, 28, 80, 20,245, 4,128, 55,
- 0, 56, 57, 57, 61,229,114,185,174, 28, 14, 7, 59,118,236,160,184, 92,110, 7,127,127,255,101, 10,133,226,104, 29, 21, 58, 15,
- 51, 51,179,215,220, 44, 62,159,143,224,224, 96, 76,156, 56, 81, 47,178,248,124, 62,246,237,219,135,206,157, 59, 67,165, 82,121,
- 24, 24,222,187, 0,122, 25,224,248, 81, 58,113, 94,175, 24,213,106,181, 83,242,199,140,105,131,136, 8,244,112,117,245,244,245,
-245,133, 90,253,202,208,116,117,117,109, 38,147,201,178,228,114,249,127, 81, 49,181,193,131, 58, 69,145,130, 69,234,179,138,238,
-167,247,239,223,135,159,159,159,222,193,170,234,102,241,249,124,136, 5,166, 13, 18, 90, 44, 91,145, 47,201,100, 50, 58, 34, 34,
-194,214,221,221,157, 2, 0,119,119,119,234,193,131, 7,214, 38, 38, 38,121,173, 91,183,174,183, 2, 44, 54,183,192,190, 41, 99,
- 1, 0, 95,245, 31,164,175, 24,157, 95,189, 12, 60, 30, 15,253, 22, 47,123,227,185,103, 89,150, 3, 35,140, 34,203, 0, 45,242,
-174, 68, 86,117, 71, 43, 36, 36, 36, 62, 36, 36,228, 13,119,172,129,168,223,209,170,106,221, 53, 20,149, 47,107,109,216,184,113,
- 35, 58,116,232, 80,103, 65,180,117,235, 86, 28, 60,120,112, 35,128,103, 13,182, 28,251,117,242,194,166, 19,241,174,109,189, 40,
- 0, 88, 51,127, 40, 93, 86, 86,134, 27, 55,110,192,194,194, 2, 79,158, 24, 60,237,151,153,133,133,197,106,154,166, 71,115,170,
-143, 0,168, 89, 96, 50, 44,203,134, 21, 23, 23,215, 58,189, 3, 33,128, 90,163, 69, 89,185, 2, 42,149, 10,243,191,216, 94,111,
- 32, 66, 0, 74,173,146,113, 3,122,251,139,107,115,116,252, 58,244,193,172, 73,166,111, 20,222, 28, 26,160,105,160,163, 95,133,
-227,242,224, 78, 60, 88, 22, 96, 88,192,214,222, 10, 63, 31,218, 80,167,200,215, 50,172,174,118,204,160, 84,201,192,163, 91, 16,
- 50, 18, 34,244, 14,146,128, 95,209,100,204,231,241,192, 18,170, 98,214,135,218,132,144, 64,236, 82, 40,125,230,182, 39, 60, 22,
-211,130, 58,224,183,203, 49, 24,213,223, 27,215,110, 63, 66, 96, 87, 79,196, 39,191,128,151, 91, 11,236,216, 27, 6, 66, 32,251,
- 97,211, 55, 89,175, 10, 52,109,170, 33,142,214,173, 91,183,228,213, 93,172,170, 91, 82,127,121, 8, 66, 94, 57, 90,114,133, 18,
-139,151, 26, 52,157, 79, 69, 26,245,234, 38, 54,228,228,186, 28, 43, 67,132, 88,117,103, 11,245, 76,207,210, 10, 64,103, 96,201,
-255,101,198,201, 48, 12,206,156, 57,163, 79,143,154,210,177,106,218, 25, 32,114,144,154,154,138,248,248,120,116,235,214, 13,197,
-197,197,224,209, 52, 22,197,198,194,115,210, 36,168,248,124,176, 44, 11,129, 64,128,233,211,167, 27, 28,159, 13,204,157,117,157,
-185,153,250,200, 55,248,251,251,183, 73, 42, 43, 67,124, 98, 34,250,175, 90, 5, 0, 56,123,246,236,107,207,196,194,133, 11, 5,
-143, 30, 61,154,122,239,222,189,169, 47, 95,190,220, 8, 96, 81,173,249, 44, 81,234,251,104,141, 25, 63, 18,109,220, 91,225,224,
- 47,135,244,199, 23,126, 62, 15, 60, 30, 31, 60, 62, 15,150, 22,150, 6,221,141, 70,163,209,139,214,242,242,114,250,236,217,179,
- 77, 7, 12, 24,192,159, 55,111, 30, 5, 0, 7, 15, 30,164,183,109,219, 38,185,116,233, 18,191, 73,147, 38,210,122,197,165, 90,
-253, 70, 26, 83, 20, 5, 30,143, 7,190,128, 15,176, 44, 40,138,146,172, 95,191,126, 77,124,124,124, 23,119,119,119, 40,149,202,
- 73,168, 24,168, 97,156, 71,203, 40,182,234,212, 34, 53,245,181,210,185, 82,181, 33,183,106,191,173,218,132, 90,213, 62, 91,104,
-220,160, 12,195,250,104,213, 4, 14,135, 83,175, 91, 69,211,116,189, 77,135, 11, 23, 46,132,153,153, 89,109, 5, 16,137,141,141,
-125, 36,149, 74,247, 0,216,222,168,196,185, 18, 29,191,122,193,112, 25,116,109,171,150,150,150,121,125,251,246, 45, 5,160, 62,
-122,244,245, 10,178, 82,169,172,181, 0,183,176,176, 88,253,211, 79, 63,205, 29, 54,108, 24, 93,125,138,129,170,205,123,149, 31,
-141, 70,131,163, 71,143,206, 93,178,100, 9,138,139,139, 23,212, 85,136,151,151,201, 33,215,117,132,126, 26,247,155,161,153,122,
-173,135, 76, 45,157,208,180,149,119,173,133, 9,205,175,232, 67,228,208,252, 85, 1,102,102, 38, 2, 83, 7, 39, 69,209,207, 94,
-164,189,108,210,204,209, 26, 79,211,115,225,208,162, 3, 10, 51, 95,197, 3,151,203, 1, 79,215,116,104,105, 46, 65,110, 78, 14,
-104,154, 83,167, 48,254,230,215,104,220,142,123,129, 99,151, 31, 64,173, 40,195,166,253,231,161, 86,150, 66,173, 40,131, 90, 81,
-177, 93,183,228, 51, 80, 20,178, 52,202,178,182, 13, 73,119, 46,151,139,174, 93,187,214, 42,116, 50, 51, 51, 13,116,180,136,222,
-209,146, 43, 26,152, 70,134,213,156,234,116,172, 42,143, 55, 86, 24, 84, 78,249, 32, 22,139, 59,239,219, 87,251, 52, 14, 53,193,
-209,209,241,156,169,169,105, 75, 67,207,111,192,228,165,235, 44, 45, 45, 87,187,187,187,123,108,218,180,137,199,225,112,208,175,
- 95,191,182,142,142,142,169, 0,224,229,229,229, 92,153,199,204,156, 57,147,220,186,117, 43,174,162,142, 81, 59, 4, 2, 65,162,
-133,133, 69,231,192,192, 64, 20, 23, 23, 35, 61, 61, 29, 18,137, 4,158, 27, 54, 32,118,230, 76,248,236,218, 5,186,111, 95, 80,
- 20, 5,129, 64,128,216,216, 88,136,197,226, 68,133,162,214, 41,223,186, 2,248, 14, 64, 15,188,106, 46, 36, 0,110,160, 98,218,
-133,219, 53,228,119, 52, 0, 48, 44, 91, 95, 98,141, 95,188,120, 49,138,120, 60, 96,200, 16,240,159, 61,131, 90,173, 70,183,110,
-221,244, 46,123,183,110,221,192,229,114,225,237,237, 13,103,103,103,236,216,177, 99,124, 93, 66, 75, 81,170, 70,234,179, 12,248,
-251,251,235,157,171, 33, 67,134,232, 29, 45, 30,143,167,119,182, 40,166,126,225, 74, 81, 20,169, 90, 73,102, 24,134,226,114,185,
-220, 5, 11, 22, 80, 35, 71,142, 36, 42,149,138, 21, 8, 4,244,177, 99,199,168,107,215,174,113,203,202,202,234,173,136,183, 31,
- 62, 26, 95, 13, 24, 92,241,238,183,180, 3,143,207,131,128,207,199,226,196, 12,125,186,152,239, 59, 44, 8, 13, 13, 29,229,238,
-238, 94,209, 12, 15,112,141,243,104, 25, 81,143,209,147, 91, 77, 36,169,170,236,231, 2,160,116,251,185, 85, 4, 85, 46, 69, 81,
-119, 9, 33, 93,170,157, 91,121, 92, 85,109, 91,121,252, 97, 35,130, 95,185,214,225, 27,226,171,174, 26,113,242,205,155, 55,221,
-124,125,125,145,150,150,246,198, 72,184,202,130, 75, 34,145, 64, 44, 22, 35, 42, 42, 10, 0,146,107, 35,187,118,237,218, 54, 84,
-204,186, 92, 17, 34, 39, 39,255,192, 49,125,162,252, 6,117,193,175, 33,135,138,165, 82,169, 55, 94,205,161, 67, 57, 59, 59, 79,
-228, 9,184, 99, 93,219, 55, 15, 0,203,126,119,229,244,141, 85,117,221,161,107, 91,175, 82, 0,242,202, 81,135,141, 28,125, 8,
-154,166, 71, 15, 27, 54,140,126,244,232, 17,198,142, 29,139,131, 7, 15,214,122,238,196,137, 19,113,248,240, 97, 12, 27, 54,140,
- 94,186,116,105,173,211, 59,188,238,150,168,222,217, 67,153,244,228, 33, 14, 28,254,169,214, 62, 72,246,246, 21,253,177,114,114,
-242,244,191,117,241,173,187,101,132,213,170, 46, 69,223,187,227,223,189,119, 63,126,122,118, 17, 88,173, 18, 10,217,171,235,203,
-139,178, 65,180, 10,240, 77,172,225,104,107,129,251, 55, 47,170,212, 42,197,165,186, 56,231, 14,243,194,204,161, 30, 0, 97, 49,
-124,209,207, 8,223, 62, 71, 95,131,238, 57,114, 30,174, 28,221, 98,112, 31,191,234,224,241,120,136,141,141,149,215,230,102,113,
- 56, 28, 67,230,228,210,185,142, 26,148,151,203, 81, 46, 87,188,203,188,195,206,193,193,225, 7, 43, 43, 43, 81, 45, 66,202,206,
-206,206,238, 7, 27, 27, 27,145,161, 77,135,181,137, 44,221,188, 90,247,166, 76,153,210, 32,177, 37, 20, 10, 91, 38, 39, 39,235,
- 39, 43,173,107,171, 82,169, 16, 24, 24,104,232,228,165,167, 1, 60,119,114,114,186,225,233,233,105,241,244,233, 83, 28, 58,116,
-136,207,227,241,154, 87,230, 31, 50,153, 12, 28, 14, 7, 57, 57, 57, 26, 0,159,160,158,166, 51,165, 82, 25, 17, 17, 17,209,113,
-232,208,161,156,196,196, 68,112, 56,156,138,112,249,251,195,103,215, 46,196, 45, 88,128,128, 23, 47,160, 80,171, 33, 18,137,112,
-225,194, 5,117,121,121,121, 68,109,124, 98,177,120, 79, 74, 74,138,151, 72, 36,130, 90,173, 6,203,178,160,105,154,226,114,185,
- 61, 45, 45, 45,183, 2,232, 82, 45,177,236,125,186, 4,182, 99,180, 90, 70,154,246, 52,183,190, 8,200,207,207,199,233,211,167,
-209,173, 91, 55, 4, 4, 4, 32, 51, 51, 19,207,158, 61,195,251,239,191,175, 63,231,225,195,135,136,142,142, 70,235,214,173,235,
-119,244,104, 13, 90,183,107, 9, 62,159, 95,225, 16,241,248,186,138, 15, 79,239,100,241,121,124,240,184, 60,136,196, 34,131, 29,
- 45,138,162, 64,211, 52, 40,138,130, 88, 44,174,172,100,179, 77,155, 54,149, 22, 20, 20, 56, 1,224,136,197, 98, 48, 12, 99, 80,
-165,165,178,140,168, 20, 89,124, 1, 95,239,108, 1, 64, 81, 81,145, 98,216,176, 97,255, 85, 42,149, 31,163,113, 43,148, 24,241,
- 47, 3, 69, 81,119,255, 47,174,109, 0,134,232,132,213, 27,157,226,235,122,192,223,239,222,189,251,174,113,227,198,245,219,188,
-121, 51, 76, 77, 77, 33,149, 74,245, 5,162, 64, 32, 64,179,102,205, 80, 80, 80,128,221,187,119, 35, 35, 35,227, 42,128,233,134,
-134, 72, 42,149,222,122,242, 32, 57, 63,112, 84,119, 27,175,238,237, 44,211,147, 51,186, 73,165,210, 40,157,200,250,121,220,194,
-247, 63, 14, 28,225, 7,190,128,135,244, 39, 89,184,114,250,198,255,151,196,228,112, 56, 28,138,162, 48,118,236, 88,131,206,255,
-232,163,143, 16, 17, 17,129,186,154, 25,217, 74, 71,171, 92,129, 50,249,187,171,172,205,154, 51, 17,179,230, 76,212,139, 9, 67,
-154, 94, 0,192,217,249, 72, 29, 66, 75,189, 57,252,200,238,105,157,252,252, 93, 58,123,181,196,237,123, 15,240,235,174, 87, 38,
-195,222,109,107,240,237,222,171,104,230, 96, 5,181,178, 12,231,126,251, 49, 75,173, 44,223,220, 72, 83,174, 66,220, 82, 20, 8,
- 97, 27,116,239,149,226,137,199,227,161,125,251,246,181, 58, 90, 5, 5, 5,242,250, 10, 6,125, 26,169, 52, 40, 45,147, 67, 94,
-254,206,132,150, 79,207,158, 61, 47,133,133,133,217,216,219,219,227,229,203,151,213,133,150, 79,143, 30, 61, 46,133,133,133,217,
- 56, 56, 56, 32, 61, 61,221,224,105, 69,106, 16, 89,200,205,205,165, 10, 11, 11, 89, 43, 43,171, 6,137, 45,154,166,161, 84, 42,
-145,144,144, 96,232,223, 26, 60, 66,204,194,194, 98,223,225,195,135, 45,242,242,242,192,225,112,144,144,144,240,218,168,195,202,
-207,207, 63,255,204, 31, 62,124,248, 79, 69, 69, 69,117, 14,107,211,106,181, 27, 39, 78,156, 56, 53, 51, 51,211,202,222,222, 30,
- 82,169, 20, 2,129, 0,132, 16, 80,129,129,232,245,252, 57,212, 12, 3,177, 88,140,164,164, 36,236,217,179,167, 76, 55, 85, 76,
-141, 6, 25, 69, 81,110,124, 62, 31, 19, 38, 76,120,237,192,254,253,251,241, 65,103, 78,103, 59, 11,110,169, 22, 34,101,182,120,
-240, 57, 14,135, 67,249,116,237,219,182,107,239, 33,237, 31,199,221,126,154,155,157, 81, 95,166,164, 81,169, 84,112,119,119,199,
-221,187,119,113,249,242,101,244,237,219, 23, 1, 1, 1,136,137,137,193,197,139, 23, 17, 29, 29, 13,138,162, 96, 99, 99, 83,217,
-253,162,206, 62, 24,170,114, 45,114, 94,230,191,225, 94, 85,223,231,243,249, 80,202,213, 6,165, 81, 98, 98, 34,238,222,189,171,
-159, 90,134,195,225,104, 39, 77,154, 4, 66, 8, 73, 73, 73,129,153,153, 25,153, 50,101, 10,195,229,114,181,153,153,134,245, 15,
-174, 20, 85,149, 34,139,203,231,189, 38,208, 88,150,149,197,196,196, 76, 3, 16,163,115,178, 0,227, 60, 90, 70,252,111,227, 12,
-222, 92, 88,186, 94, 71,235, 57,128,254,135, 14, 29, 26,127,242,228,201,141, 91,183,110,181, 11, 10, 10, 66, 97, 97, 33, 92, 92,
- 92,224,228,228,132,240,240,112,156, 61,123, 54,143, 97,152, 69, 0,106,178,126,250,163,142, 57,107, 50,159, 74,195,148,165,165,
- 51,125, 3, 60,112,245,232,245, 16, 71, 71,199,233, 28, 14,103,254,148,101, 31,126,220,103, 88, 23, 36, 69,167,224,214,197, 88,
-100,167,229,213,203, 89,189, 51,188,165,165,229, 84, 19, 19, 19, 1, 0,117, 13,181,226,234,163, 14,245,156, 12,195, 48, 42,149,
- 10, 71,142, 28, 49, 72,108, 29, 58,116, 8, 10,133, 2,204,155,237,171,122, 78,194, 18,138,203, 19,194,185,153, 59,212,234, 50,
-176,108,163, 7, 84,234, 57, 43,107,160, 79, 5, 2,216,231,229,225,246,237,219,134, 73,238, 33, 67,234, 75, 35,133, 74, 33,155,
-176,101,237,226,240,217,193,223, 89,246,237,222, 17, 95,109,216, 15,181,122, 47,104, 14, 13,177,144, 15, 95,191, 30,224, 64,137,
- 31, 66, 63, 47, 42, 47, 41,156,128, 55,151,226,121,141,147,212,213,194, 66, 0,134,101,113, 57,242,142,193,247,174, 47,237, 25,
- 6, 92, 46, 23, 79,158, 60,145,215, 52,218,144,195,169,104,230,172,172,169,215,197, 73, 88,150,226,241, 69,104,230,226, 9,149,
-178,244,157,164,145,189,189,253,231, 39, 78,156,176,169,156, 42, 33, 38, 38, 6, 20, 69, 37,188,114, 28, 43,142,203,229,114,196,
-197,197, 33, 38, 38, 6,168, 24,225,102,240,123, 84,233,100,229,230,230, 82, 82,169, 20, 38, 38, 38,116, 76, 76,140,210,219,219,
-251, 94, 61,239,183,158, 83,161, 80,188,168,173,255,164, 66,161,104, 34, 18,137,120,213, 10, 81,231, 54,109,218, 36,213,208,132,
-248, 70, 56,139,139,139,111, 47, 89,178,196,119,208,160, 65,248,252,243,207, 11,172,172,172,204,126,248,225, 7, 46,135,195,161,
-102,207,158,205,228,228,228,148,254,248,227,143, 22, 39, 79,158, 68, 81, 81, 81,148, 1,247, 46, 83, 40, 20,211,186,119,239,190,
-255,252,249,243, 38,110,110,110, 40, 41, 41, 1, 33, 4,251,246,237,195,236,217,179, 33, 18,137,144,148,148,132, 15, 62,248,160,
-188,188,188,124, 26,222,236, 59, 89,201, 73, 81, 20, 69, 88,150,197,138, 21, 43,244,147,147, 86, 78, 86,106, 38,166,176,103, 97,
- 43,201,188, 31,139, 37,227,191,250,113, 18, 0, 48, 90, 45,243, 56,238,246,211,125,219,191,186,198,231,243, 35,235, 73,163,229,
-243,230,205,251, 97,200,144, 33, 98, 83, 83, 83, 20, 20, 20,224,198,141, 27,184,121,243, 38,110,221,186, 5,149, 74, 5, 27, 27,
- 27, 88, 89, 89, 65, 42,149, 34, 49, 49, 81, 14, 96,121, 93,156, 2, 19, 30, 92,219, 86,142,252,173,112,176,120, 85, 70, 27, 86,
-117,183,248, 60,158, 65,239, 81,239,222,189,209,181,107,215, 74, 1,196,164,166,166, 74,149, 74, 37, 85, 69,244,103, 86, 10,242,
-230,205,155,107, 15, 30, 60, 72,234,226,188,181,103, 7,206,127,189, 28, 2, 62, 31,139, 18,210,245,162,107,127,223, 78,224, 9,
-248,240, 24, 58,178,234,181, 59, 81,209, 92,136,106, 34,171,174,178,227,173,223, 77, 35,231,223,150,243,127, 25, 82, 52, 98, 9,
-158, 74,252,170, 80, 40,206,125,246,217,103,161, 62, 62, 62,159,109,218,180,137,226,243,249, 88,181,106, 21,121,249,242,229, 47,
-186, 90, 72, 97, 99, 66, 69, 8,249,229,143,227, 81, 51, 38, 7, 15,163, 22,110,158,210,243,222,149,184,196, 14,221,221,208,161,
-187, 27,238, 93,125,132,237,203, 14, 29,100, 52,204,138,172,172,172,180,122,168,148,253,123,180,171,222, 25,222, 38,226,218, 21,
-155,134,142, 58,100, 89, 54,236,208,161, 67,115, 71,140, 24, 65,223,185,115,231,141, 62, 89,149,203,238,176, 44,139, 75,151, 46,
- 65,173, 86,227,151, 95,126, 97, 89,150,173,125, 30, 45,144, 83, 91, 54,135, 78,254,229,192, 41,129,128, 79,225,102,228, 49, 20,
- 23,214, 61,170,139,207,231,225,231,125,199,213,124, 62,239,113, 77,199,213,106,117,250,149, 43, 87, 28, 6, 50, 12,143,166,233,
-154, 4, 84,141, 8, 11, 11,211,176, 44,155, 90,207,105, 81,217, 25,105, 67,191,249,252,147, 67, 67,198,124,230,208,189,123, 79,
-158,173,189, 3, 40,138, 66, 78,118, 14,146,226,238,104,206, 29,251, 41,187,172,220,176, 37,120, 62,249,254, 15,125,159, 44, 0,
- 8,154,189, 85,223, 63, 11, 0,134, 78, 89,130,192,110, 94,160, 12,177,158, 94,137, 44, 86,171,213, 66, 34,145, 64,171,213,214,
- 56,197,131,133,133,133, 88,161, 80,200,117, 19, 49,214,105, 21, 17,224,157,167, 17,195, 48, 30,133,133,133, 40, 43, 43,195,205,
-155, 55,201,218,181,107,115,115,115,115,245,157, 54, 53, 26,141, 71, 65, 65, 1, 74, 75, 75, 17, 21, 21, 69, 66, 67, 67,115,243,
-243,243,151, 53,228, 29, 18,139,197,157,185, 92,238,189,194,194, 66,214,196,196,132,214,104, 52, 26,111,111,111,161, 88, 44, 54,
-120, 65,117,169, 84, 58,168,182, 99,174,174,174,201,201,201,201,109, 24,134,169,186, 6, 34, 95,161, 80,184,117,239,222,221,144,
-252, 99,222,222,189,123,113,252,248,113,191,146,146,146,137,169,169,169,251, 1,248,113,185, 92, 60,120,240, 32, 65,161, 80,140,
- 27, 49, 98,196,190,194,194,194,219,168, 88,130,199, 16,156, 79, 74, 74,154,224,225,225,177,119,245,234,213,166, 1, 1, 1, 92,
-103,103,103,116,233,210, 5, 73, 73, 73, 56,115,230,140,102,231,206,157,101,229,229,229,159, 0,184, 84,119,178,131,210,106,181,
- 16, 8, 4,250,143, 80, 40, 4,159,207,135, 76, 78,240,233,134,103,114, 45,196,242,141,171,166,157, 33, 0,149,149,254, 44, 47,
- 39, 43,253, 54, 69, 81,145, 82,169,180,184,150, 56, 19, 40, 20,138,142,132, 16, 14, 69, 81,155,213,106,245,148, 57,115,230, 56,
-173, 91,183, 14,237,218,181, 67, 94, 94, 30, 36, 18, 9,220,220,220,144,155,155,139, 59,119,238, 48,229,229,229,187, 0,172,129,
-174,255, 72,109, 40,202, 43, 65, 83,199,230,175, 57,159,132, 16, 16, 6,208, 40, 25, 48,106, 2, 21,165, 1,143,167, 1,159,207,
- 55,196,121, 34, 44,203,162,208,201, 9,108, 92, 28,110,221,186, 5, 66, 72,173,174,154,187,187,187, 1, 25, 59, 11,129, 80,240,
- 90,115, 33, 69, 81,224, 11, 4,224, 9,248, 53,141,156, 49,186, 88, 70,252,163, 97,104,219,120, 17,128,233, 15, 31, 62,220,223,
-167, 79,159,112, 66, 8, 15, 21,237,145,215,223,230,207,179,178,178,238, 71,157,185,191,212,161,169, 85,232,224,137, 61,209,174,
-163, 11, 24, 45,131, 27,103, 31,224,151,117, 39, 15,103,166,103, 78,129, 1,107,159,177, 44,123,173, 71,231,118, 52,170,204,213,
-237,236,236,204, 54,102,212, 97,113,113,241,202, 69,139, 22,225,243,207, 63,111,204,168,195, 26, 17,155,152, 59,157, 2,105, 58,
-116,112,175,129,160,104,162, 82, 41,235,200,248,160,159,185,148,207,231, 61,190, 27, 35,245,174,233,188,220,220,220,129, 31,127,
-252,241, 37, 46,151,219,178, 33,113,206,178,108,106,118,118,118,191,250,207,212,222, 80,202, 75,220, 78, 31,222,189,224,252,241,
-189, 3, 89,150,105, 77, 1,224,112,249, 79, 53,106,245, 5,165,188,100, 19, 12, 92, 84,122,253,116,127,204,219,114, 17, 59, 62,
- 31,138, 57,161, 71,241,211,138, 79,177,116,195, 33,124,247,249, 60,172,221,250, 95,124, 53,111, 2, 70,141,255,152, 37, 20,253,
-167,161,247,193,225,112,206,239,222,189,123,242,167,159,126,170, 31,180, 64, 8,121, 45, 99,215,104, 52,114,150,101,177,107,215,
- 46, 22,192,249,186,248, 94, 79, 35,138,212,213, 95,202,208, 52, 42, 41, 41,249,196,223,223,127, 31, 0, 33, 33,228, 73, 97, 97,
-225,127,128, 87, 75, 67,149,150,150,126,210,189,123,247,125,132, 16, 33, 69, 81,111, 28, 55, 4,186,169, 30, 58, 91, 89, 89,221,
-211, 57, 89,194,198,116,136,175, 43,170,235,104, 86, 52,164, 9,145, 5, 48,167,202,140,239,235,252,252,252,170, 46, 42,157, 80,
- 88, 88,216,185, 17,225,186, 36,151,203,189, 86,172, 88,177, 64, 36, 18, 5,150,151,151,183, 5, 0,137, 68,146,164, 84, 42,175,
-201,229,242, 77,168,127,110, 42, 21,203,178, 73, 90,173,182,189,157,157, 93,197,136, 90,157,216, 2,128,223,239, 49,247, 0,166,
- 75,133, 41,254,171,193, 1, 59,123,246,108, 11, 43, 43,171,247, 40,138, 26, 69, 8,113,151,201,100,202, 21, 43, 86, 68,133,133,
-133, 21,183,108,217,114,240,144, 33, 67, 40,107,107,107,220,189,123,151,228,231,231, 31, 3,176, 12, 6,140,180,102, 89, 54,117,
-253,250,245,104,232,251, 94,215,113,181, 90,157,117,246,236, 89,219, 65, 57, 57, 92,150,101, 49,116,232,208,215, 4, 92,117, 60,
-126,252, 24, 74,165,178,206,201, 28,149,197,133,232,187, 96, 9,160, 27,253, 89,137, 10, 39,139,128,168,140,186,202,136,127, 23,
-254,234, 5, 61, 13,178, 22,157,156,156,198,138, 36,194, 89, 46,109,157,188, 95, 62,203,121, 36, 43, 46, 63, 40,149, 74,119,215,
-146,145, 27,196,217,192, 9, 75,141,246,239, 95,196,249,106, 30, 45, 6,132, 48, 32, 44, 1, 33, 44, 88,150,169, 88,240,154,176,
- 32, 12, 67, 81, 20,254, 84,201,235,156, 25,188,122, 56,173,108,109,109,215, 16, 66, 6,113, 56, 28,186,170, 25, 86,245,187,206,
-201, 58,159,155,155,251, 85, 13,206,235,255, 92,124,134,133,133,213, 40,254, 13, 29,117, 56,122,244,104,166,129,239,230, 53,137,
- 68,226, 84,211,177,178,178,178, 52,169, 84,250,222,223, 36, 62,171,142, 24,108, 8,103,131, 71, 29,214,199,233,226,226, 34, 84,
-171,213,157, 0,184, 81, 20,101, 9,160, 64,173, 86, 95,200,203,203,203, 6,208, 25,192, 10,221, 53, 95, 3,184,247,127,252,190,
-139,109,109,109,247,210, 52,221,212,144,139,181, 90,173,170,160,160, 96,114,181, 10,129,158,211,198,198,230, 30,151,203,109,106,
- 0, 79, 70,126,126,126,103, 99,254,105,228,252, 7,161,122, 39,248,105,132,144, 61,255, 63,254,184,191,145,211,200,105,228, 52,
-114, 26, 57,141,156, 70, 78, 35,231,191, 64,104,161,154,208, 2, 33,196, 56,172,214, 8, 35,140, 48,194, 8, 35,140, 48,226, 45,
-113,166,154,216, 58, 83,249,133,170, 67,149, 54,196, 18,108,140,178,189,108,228, 52,114, 26, 57,141,156, 70, 78, 35,167,145,243,
- 95,199,249,175,192, 95,178, 50,197, 59, 74, 32, 35,167,145,211,200,105,228, 52,114, 26, 57,141,156,255, 62,206,255,101,212,218,
-116, 72, 27,227,198, 8, 35,140, 48,194, 8, 35,140, 48,226,175,129,193, 66, 75,226,224,238, 97,235,226,189,207,170,105,135, 24,
-171,166, 29, 98,108, 93,188,247, 73, 28,220, 61,254,165,241, 38, 6, 48,158,203,229, 94,114,116,116, 44, 65, 45, 75,239,252, 3,
- 96, 14, 96, 20, 42,230,247, 25, 14,192,228, 93,146, 7, 0,220,177,192,172, 73, 64,218, 36, 32,109, 44, 48, 43,224, 31,184, 28,
-199,170,185, 78,254,145,231,198,159, 91, 53,215,201,191,198,227,139,156,108,110, 93, 28,189,101,221, 44,103,235,119,244,151,102,
-246,246,246,123, 28, 28, 28, 94,216,219,219,167,218,219,219,239, 5, 96, 97,204,238,140, 48,194, 8, 35,254, 50, 84,246,209,170,
-252,232,251,104,113, 1, 32, 60, 60, 60, 0,192, 31, 0,250, 4, 5, 5, 69, 84,191,218,170,121,251, 79, 91,183,106,253,249, 55,
-171,150, 81,142,246,182, 38, 90,134, 85,167,188, 72,247, 92,249, 77,232,111, 47, 5,220,141,133,105,113, 63, 53, 34, 80, 20,135,
-195, 25, 43, 20, 10,131, 0, 84, 10,182, 4,165, 82, 25,206, 48,204, 17, 24, 54, 76, 27, 14, 14, 14,145, 28, 14,167, 69, 67,254,
-152, 97,152,180,236,236,236,158,141,140,204,209,205,155, 55,223, 27, 16, 16, 96,226,231,231, 7,129, 64,128, 21, 43, 86, 44,146,
- 74,165,155, 12, 37,176,178,114, 53, 83, 11, 69,243,185, 2,193, 0,162, 81,181, 39, 32, 0, 45,140, 99,181,202, 43,124,165,114,
- 99, 97,225, 51,153,129, 84,203, 55,111,183,181, 0, 0, 32, 0, 73, 68, 65, 84, 0, 76,209,197,213, 79, 0,214,191,205, 83, 50,
-185, 35, 52, 26,166,226,153,224,115,193,156,122,110,241,199,242,229,203,185, 65, 65, 65,248,233,167,159,122,238,217,179,103,154,
- 76, 38,187, 2,224,119, 0, 79,223,246,169,116, 0,166,119,239,217,115,203,228, 69,139, 56,242,200, 72,108,217,187,119, 51, 42,
-230, 91,218,209,208,103,137,207,199, 40, 91, 91, 94, 16, 33,232, 68, 1, 20, 5, 60,200,205,103,207,170,213,204, 17, 24, 48, 23,
- 91, 29, 24,143,215,135,227,255,218, 80,130,226,167,228, 75,225, 80,143, 94,197, 79,175,125, 9, 96,112,245,227, 90,133,104, 50,
-225, 52, 11,146,147,232,116, 0, 27,222, 50, 90, 77,236,236,236, 98, 78,157, 58,213,212,207,207,143, 11, 0,247,238,221,155, 20,
- 20, 20,212, 55, 55, 55,183, 61,128,146,255,163, 76, 72,196,165,233, 89, 2, 30,111, 0,195, 48, 29, 0,128,195,225,196,170, 52,
-154, 75, 90,150,221, 1, 3,231,100, 51,194, 8, 35,254,185,168, 79,139,252,205, 81,235,204,240,149, 55, 71,170,110,171, 66, 98,
-223,206,179, 91,191,145,143,139,101,229,138, 23, 47, 50, 11, 23,206, 90,123,105,218,188,239, 79,110,248, 49,252,108,196,237,132,
- 91, 30,126,239, 61,146,216,183,243,172,133,186,182, 54,220,230, 98,177,248,254,206,157, 59,213, 73, 73, 73,164,168,168,136, 60,
-126,252,152, 28, 59,118,140,204,152, 49, 67, 33, 22,139,239, 3,104,110, 8,167,131,131, 67,246,227,171, 23, 73, 70, 76, 52, 73,
-189,119,155,104, 52, 26,162, 86,171,137, 90,173, 38,143,206,135,147,152,223,143,147, 7,199,142, 16,149, 74, 69, 84, 42, 21, 81,
- 42,149,164, 85,171, 86, 47, 13, 12,103,117, 56,123,121,121,169,194,195,195,201,111,191,253, 70, 22, 45, 90, 68,124,124,124, 24,
- 0,179, 13,189,119,137,189, 91,160, 89, 19,239,220, 79,131,119,168,207, 68, 93, 32,241,207, 31,144,248,231,201, 36,236,114, 2,
-153,178,120,171,218,172,137, 79,174,196,222, 45,176,190,123,183,178,178,234, 70, 81, 20,169, 4, 0,210,162, 69,139,210,170,159,
-230,205,155,191,246,105,214,172, 89,105,203,150, 45,159,218,216,216,116,170,137,115, 92, 7, 16,242,232, 87, 66, 30,253, 74,150,
-247, 6,137,143,143,191, 69, 8,249,163,242, 35,151,203,255, 56,113,226,196, 31, 31,126,248,225, 31, 0, 62,168, 35,158, 12,138,
-207, 73, 64,154,236,212, 41, 66, 54,109, 34, 36, 32,128, 36, 0,100, 18,144,214, 64,206, 86,142,142,188, 7,223,175,159,166, 58,
-117,234, 23,114,238,220, 25,114,246,108, 56, 57,121, 98, 47,217,188,105,150,218,193,129, 23, 7,160, 77, 3, 56,185, 0,214, 2,
-216,136, 10,231, 50, 41, 55, 55,151,100,101,101, 17, 0, 73,186,223, 54,218,217,217,109, 64,205,238, 91,255,170, 78,214,130, 65,
-142,231,198, 12,238, 73,100,197, 47,201,152,193, 61,201,130, 65,142,175, 57, 91,131, 92, 93,205,230, 12,237,144, 27,127,239, 32,
- 51,103,104,135,220, 65,174,174,102,141,140, 79, 10, 21,235,132,238,188,122,245,170,150, 84,129, 70,163, 33,251,247,239,103,172,
-172,172,126,105, 0,103, 91, 59, 59,187, 84,107,107,235,164,170, 63,218,121, 15,239,238,222,107,210, 74, 27,207, 15, 3, 26, 16,
- 78, 63, 17,159,159,113,233,232, 15, 76,126, 90, 44, 81,201,179, 73,241,147,104,146,145,112,139,236,223,189, 81, 35,224,114, 51,
- 0,248,189,205,179,212, 64, 24, 57,141,156, 70,206,191, 33,103, 93, 90,228,127, 17,111, 76,239, 80,219,141, 9,133,130,224,149,
-203,151, 80, 69,249, 69,114, 69,137, 76,165, 81, 40, 20, 52,159, 40, 98, 31, 61,207,161,185,156,162, 5,243,230,154, 5, 47, 93,
- 30, 92, 6, 76, 48,240,191,155,251,248,248,220, 57,126,252,184,189,181,181, 53,138,139,139,145,159,159,143, 59,119,238,128, 16,
-130, 17, 35, 70, 8,187,118,233,210,233,203, 21, 43,110,102,100,102,250,163,246,130,247,149,120,177,182,197,250,158, 21,107,209,
-126,245, 34,191,162,212,161, 40,236, 25, 29,164, 63,103, 77, 70,197,106, 25, 34,145, 72,191, 32,113, 35,224,223,175, 95, 63, 62,
- 0, 76,157, 58,181, 68, 38,147,133,232, 28, 14,131, 86, 90,149,216,187, 5,218, 58, 57,135,255,176,107,189,184, 67,107, 55,168,
- 53, 90,164,102,189, 4,151,103,137,166, 77,249,248,120,194, 0, 94,239,238,214,182,107,191,222,115, 38,139,197,240,242,188,228,
- 11,181,113, 89, 90, 90,238, 63,114,228, 8,142, 30, 61, 10, 0, 72, 74, 74,130,155,155,155,164,190, 48,196,197,197,185,126,240,
-193, 7,135,243,243,243,219,212,119,110,245,137,241,133, 66, 33,122,246,236, 9, 79, 79, 79,156, 58,117,170,143,206,217,122, 43,
-200, 35, 35, 97,250,240, 33, 16,209,168,202, 75, 43, 95, 95,151, 91,103,207, 28,180, 61,115, 54, 1, 27, 54,236,197,211,167, 21,
- 70,155,171,171, 43,198,143, 27,205,139,141,141,242, 26, 53,106,124,212,245,235, 79,123,234,132, 82,125, 88,253,227,143, 63, 46,
-107,217,178, 37, 70,141, 26, 53,218,203,203,203,209,220,220, 28,187,119,239,134,147,147,147,171, 74,165,122,114,234,212, 41,231,
-172,172, 44,204,157, 59, 23,217,217,217,139,106, 35,234, 51,176,207,151,194,161, 30,189,218,249, 78,134,169,185, 19,126, 60,116,
- 4,143,239,239,239,165, 84, 39,124,201,103, 34, 38,202,137,112, 74,110,154,105,112,139,206, 1, 54,109,188, 62,128,139,111,180,
-173,130,185,254,252,203, 1,173, 66,185, 34,197,254, 85, 27,164,249,111,144,142, 10,227,180, 47, 73,180,142,187,132,124, 96, 21,
- 91, 41,176,244,110, 45,193, 7,189,123,247,214, 39,220,139, 23, 47,160, 84, 42,225,225,225, 65,171, 84,170, 64, 3,227,181,237,
-123,239,189,247,231,217,179,103,109,218,182,109,155, 91, 80, 80,160, 63,224,104, 99, 57, 48,226,248,230,185,107,183,252,215,253,
- 0,161,138,114, 19, 78,198,214,195,229,215,163,155,239,229,115,199, 15,154, 82,165,233, 16, 88,230, 1,108, 62,158, 29,254, 25,
-148,137, 53,198,206, 88,200, 13,236,215,183,201,128,193, 35, 47, 63, 78,126,218, 15,192, 93, 99,189,222, 8, 35,254,213,174, 22,
-249,167,221,147, 94,104, 5, 5, 5, 81, 53,221, 32, 75, 88,111, 7,123, 27,241,230,239,247,221,229,168, 85, 42,137,165,133,138,
-103, 97,206, 82,102, 22, 28,181, 74, 83,234,226,234, 34, 96, 9,235, 93, 11,127,245, 33,158,148, 88, 44, 62,254,251,239,191,219,
-243,120, 60,176, 44, 11, 59, 59, 59,164,164,164,160,168,168, 8, 50,153, 12, 79, 19, 18,208,178,121, 51,172, 10, 94,226, 52,119,
- 73,240,241,242,242,242,206,120,189, 25,241,141, 97,163,140,230,245,117,163, 43,151, 96,121,163,202,175,251,173,134, 99,134, 14,
- 69, 77, 73, 75, 75,131,169,169, 41,218,183,111,111,122,227,198,141,235,117,136,172,215, 56,173,172, 92,205, 88,161,224,232,206,
- 31, 86,136,213,154, 56, 60,122, 86,128,118, 45,123,193,193,166, 57, 94, 22,168,112,235,206,239,136,139,249, 21,173,155, 52,199,
-236, 25,125, 69,161,235,127, 59,194,215,182,108, 94, 84,148, 82, 82, 19,103, 73, 73,137,105,171, 86,173,208,188,121,197,186,103,
- 12,195,224,209,163, 71, 96, 24, 70,191, 95,117,187,239,216, 85,104, 75, 82, 49,121,210, 36,228,231,231,155,214,196,201,227, 64,
-187,112,218,120,174,152, 7, 8, 36,214,170,210,210, 82,253,240, 84,181, 90,141, 7, 15, 30,192,223,223, 63, 32, 44, 44,172, 62,
- 85,100, 80,124,170,129,239,182,252,242,203,214, 9,197,197, 52, 0,252, 68, 81,172,154,144,239, 12,125,150,236,237,121,199,206,
-159, 59, 96,203,161, 19, 97,109,241, 45,238,220, 73,133, 90, 93, 17,222,252,252, 28,204,153, 85, 2, 62,207, 12,167, 78,253,215,
-198,195,163,231,177,172, 44,117,123,188,222,140, 88, 83, 56, 69,231,206,157,195,156, 57,115,240,232,209, 35,103, 14,135,131,219,
-183,111, 67, 44, 22,227,251,239,191,231,120,120,120, 56, 75, 36, 18,156, 63,127, 30,217,217,217, 84, 93,225,252,227,194, 31,223,
- 20, 63,189,246,101, 22,117,126,208,143,135,142,224,179,113, 99,225, 72,158, 93,183,104, 77,125,243,222,208, 30, 95, 17, 78,179,
- 32,137,153,183,149, 91,251,161,224, 11, 76, 49,251,139, 53, 72,138, 59,109, 85, 46,139,153, 69, 49,233,205, 86,109, 8,155,247,
- 70, 56,127, 27,205, 76,253,245,134,239,165,230,119, 93, 30, 62,152,118, 91, 26,189, 39,230,149,208,114,229, 82, 52, 99, 81, 89,
-147,122,242,228, 9,158, 62,125, 10, 46,151, 11,185, 92, 14,173, 86, 91, 99, 56,157,157,157,167,107,181,218,175,116,233,188, 79,
- 36, 18,125,114,240,224, 65,155,170, 66,219,206,123,120,119, 27, 51, 73,191,236,156,252,194,168,187,241,143, 23, 78, 31,213, 39,
-242, 86, 92,186,154,247, 97, 90,113,204,169,226, 90,226, 83, 36, 22, 8,142,157, 63,241, 95, 83,205,243,171,144,120,244, 1,207,
-212, 13,140, 38, 19,229,133,101,144, 61,149, 66,249,195,118,116,156,181, 0,167, 79,254,102,234,213,161,115,152, 82,163,113, 3,
-160,106,196,187,217, 16, 24, 57,141,156, 70,206,191, 39,103,173, 90,132, 16,226, 11,192, 65,183,155,175,211, 5,182, 0,242, 80,
-177,138,140,131, 46,239, 16, 84,185,172,250,126,213,115,171,239, 87,253,158,175,251,110,175,219,222,165, 40,170,160,158,160, 59,
-161, 98,105,194, 51,186, 45,160,107, 74,172,183,227, 49, 69,209, 37, 12,195, 10,249,118,246,138,169, 99,250,117,184,120,249,222,
- 3, 19, 91,115,238,192, 62,157, 2,238,196, 62,191, 73,209,148,134,162,104,131,250,125,112, 56,156,177,155, 55,111,238, 96,110,
-110, 14,150,101, 97, 97, 97,129,220,220, 92,168, 84, 42, 20, 23, 23, 67, 41, 43,129, 90, 86,130,135,233, 47,208, 35,160, 15, 70,
- 14,122,207,227,191, 39,127, 31,203, 48,204,225,186,120,157,189, 59,233,157,172, 53, 45,108, 94, 89, 19,233, 69,122,209,245,109,
- 39, 55,240, 77, 77, 49, 96, 97,240,219, 60, 3,209,103,206,156, 57, 55, 98,196,136,193,139, 23, 47,166,165, 82,233,249,148,148,
-148, 30, 0, 30,213, 43, 42,132,162,249, 51,231, 7, 89, 89,153, 18,132, 93,250, 29,189, 59,141,131,137,128,131,252, 18, 53, 40,
- 10, 72,136, 63, 14,138,178, 70, 76,146, 20,189, 58,154,227,189,129, 30,166, 39,127, 75, 88,140, 87,253,131,222, 72,154,194,194,
- 66,228,228,228, 64,163,209, 64,163,209, 96,212,232,209, 56,176,127, 63,202,202,202, 32,151,203,161, 82,169,192, 48, 12,104,154,
-198,165,240, 48,164, 63, 79, 64,119,127,127,160,150,165,151,246, 63, 0, 15,192,173,199,143, 31, 35, 33, 33, 1, 25, 25, 25, 16,
-137, 68,112,116,116,196,154, 53,107,160, 84, 86,172, 81, 54,122,244,232, 0, 0,177,111,251, 66, 61, 5,246,164, 48,204,151,131,
- 79,156,176,191,113,226, 4,123,235,244,233, 12,161, 76,182,219,144,107,249,124,140, 90,255,221,140,118, 18,137, 4, 25,105,155,
-225,238,206,199,162, 5, 54, 8,249, 54, 15, 0, 48,119, 78, 83,116,233,108,139,146,162,223, 96,107,191, 12, 91,183,206,107, 61,
-101,202,198, 73,229,229,204,190,122,168,191,252,253,247,223, 71,186,185,185, 53,137,142,142,166, 4, 2, 1,196, 98, 49,196, 98,
- 49, 68, 34, 17,114,114,114,144,146,146, 66,214,175, 95,159, 9,224,203,186,136, 86,109,149,222, 4, 48,120,193, 32,156,123,124,
-127,127,175, 38,156,231, 15, 71,206,238,249, 34,230, 86,180,236,226,165, 27, 95,107, 21,162,244,162,140,203, 75, 90,117,137,182,
-157,245,249,106,108, 95,191, 18,143,111, 71, 22, 56, 52, 47,217, 33,166,148, 53,134, 51, 32, 96, 21,215,201,193, 90, 59,125,202,
- 72,203,211, 14, 81,211,207,114,169,220,172,188,251,223, 35, 37, 90, 46,108,211,105, 98, 91, 87, 90,117,245,234, 85,113,239,222,
-189,161, 80, 40,244,206,228,193,131, 7, 89,173, 86,123,173,198,103, 83,173,254, 42, 51, 51,211, 73, 46,151, 99,208,160, 65,115,
-191,255,254,123, 73,229, 26,117, 12,195,188,230,100,125,179,233,192,133,249, 95,237,184,118,225,240,183,206,223, 4,127,210,103,
-194,236,181,215, 80,203, 58,146, 92,154,158,117,250,196, 94, 71,145,149, 6, 98,235,247,160,200,150,227,241,158,207, 80, 94,162,
- 64,151,111, 86, 3, 16, 64,165,161,177,123,232, 40,240,108,156,177,242,211, 79,156,151,239,254,113, 6,203,178,155,141,245,122,
- 35,140, 48,162, 26, 28, 40,138, 10, 7,128,224,224,224,101, 33, 33, 33,241, 20, 69,133, 19, 66,130,116, 6, 74, 56, 33, 36,168,
-242, 28,157, 56,123, 99,191,242,220,234,251,213,191, 47, 93,186,212, 43, 52, 52,116,157,191,191,255,225,168,168,168,231, 0,234,
- 19, 90, 67,116,194,170,250, 82, 60, 21,163, 14,131,130,130,168,170,219,215, 28, 45,150,141,124,242,252, 69,249,123,253,187, 54,
- 13,143,136,189,251,241,199, 67,250,141, 29,218,123, 96, 74, 90,126, 66,107, 23, 71,219,248,248, 88,115,150,101, 35, 13,137, 37,
-161, 80, 24,212,183,111, 95,110, 97, 97, 33, 76, 76, 76,144,155,155,139,204,204, 76,168,213,106, 40,138,139,160, 44, 46,130,162,
-168, 16,234,226, 66, 60,189,119, 7,222,173, 93,133,186,206,242,117,162,210,117,169,238, 84, 85,117,182, 4,102,102, 16,154,153,
-129,106,120,179,225,135,150,150,150,183, 42, 11, 85,181, 90, 61,107,201,146, 37,121, 44,203, 98,237,218,181,230,166,166,166, 97,
- 0,132,245,145,152,217,113,130,252, 59,182,167, 19, 83, 98,208,211,103, 50,218,182,122, 31, 41,217,114,228,201,212,200, 41, 82,
-163, 75,239,109,104,225,179, 26,205, 58,134, 32, 33,181, 0,206, 77,220,104,112,133,117, 46,254,156,158,158,254,218,254,225, 67,
-135, 80, 94, 94,142,214,173, 91, 99,220,184,113, 88,178,100, 9,198,141, 27, 7,103,103,103, 76, 24,243, 1, 86,174, 92,137,172,
-172,172,250,130,170,108,219,182,173,210,197,197, 69,233,226,226,162, 84,171,213, 40, 45, 45, 69, 81, 81, 81,245,248,158,215,208,
-136,180,183,183, 95,234,232,232, 24, 99,111,111, 31, 47, 20, 10,207, 62,160,168, 68,133,139,139, 67,143, 97,195, 40,207, 49, 99,
- 56,169, 98, 49, 21, 1,152, 26,194,101,107,205, 27, 18,216,119,176,160,168,112,175,222,164,250,228, 99, 59,252, 25,225,133, 27,
-215, 59, 99,206,172,214,160,104, 17, 40, 90,128,242,178,171,232,234,231,207,183,180,164,234,123,150,198, 3,120,208,163, 71, 15,
-231,217,179,103, 83, 66,161, 16,115,231,206, 85,127,250,233,167,201,227,198,141, 75,190,114,229, 10,227,226,226,130,102,205,154,
- 81,205,154, 53,115, 2,240, 64,119, 77,157, 48,111, 77,125,163, 84, 39, 92,183,116,147, 60,103, 96,219,189, 84, 35, 28,181,106,
-131, 52,255,155,157,207, 55,164, 60, 46,119,125,124, 59, 50, 63, 57,238, 52,155,114,247,143,188,151,201, 50,215,111,118, 62,223,
-176,108,199,203, 26, 95,234,136, 8,176,199,195, 35,212,229,101,229,220, 97, 67, 3,203,167, 79, 29,219,214,218,212,235, 32,154,
-188,231,211,162,121,211, 9, 43,215,109, 85,127, 58, 99,190,250,167,159,247, 18,153, 76,134,146,146, 18,108,221,186, 85,123,250,
-244,233, 76,134, 97,230,215, 86, 7, 2, 0,141, 70,131,233,211,167, 75,204,205,205,145,158,158,174,119, 68, 1, 64,154,155, 31,
-123,227,110, 92,226,194,255,140, 14, 40, 83, 42,149, 23,254,184,151,224,233,230,210,148,162, 72,173, 3, 81, 4, 60,222,128,206,
- 93,187,114, 8, 41, 2,197,109,142,167,251,215,163, 36,171, 0, 37, 57, 5,224,240, 36,208, 66, 8, 13, 43,128,165,183, 31,146,
-238, 70,163,137,157, 3, 87,200,227, 13, 52,150, 39, 70, 24,241,239, 68, 93, 90,164,170, 88, 10, 13, 13, 93, 87,215,241, 42, 91,
- 85,181,125,189,144,170, 46,194,170,126, 7,128,208,208,208,117,132,144,160,168,168,168, 67, 0,228, 6,222,194,180, 42,219,105,
-175, 9,173, 58, 93, 40,133, 42,100,241,146, 47, 97,101, 33,182,240,235,228,230,120,234,124,196,189,200,168,123, 9, 45,154,217,
-218, 17,141,202,234,187,141,219,155, 82,229,242, 80, 3, 3,225, 97,107,107, 11,181, 90,141, 39, 79,158, 32, 35, 35, 3,106,181,
- 26,218,178, 50, 40,139,138,160, 40, 44, 4, 83, 38, 3,159, 97, 32,207,205,129,141,137, 8,120, 53, 34,177, 30,231,141,170, 81,
-104, 85,110, 69,230,230, 16,154,153,131,230,241,106,108, 86,172, 5,190,126,126,126, 71,227,226,226,186,246,239,223,255,107, 84,
- 12,145, 79,205,204,204,236,183, 98,197, 10,165,131,131, 3,166, 79,159,222, 14,192,228,122, 69,166, 64,229,225,226,216, 14,109,
- 93, 39,163, 69,179,190, 40, 42,211, 32,183, 68,131,156, 34, 53,118,111,243,199,177,159,252,240,231,177, 94,136,187, 48, 0, 69,
- 26, 71,152, 58,127, 8,194,168,188,234,226,188,116,233, 18,214,172, 89,131,175,191,254, 26,107,215,174,197,215, 95,127,141,204,
-204, 76,180,111,223, 30,105,105,105, 56,119,238, 28,164, 82, 41,108,109,109,113,231,206, 29,108,218,180, 9,127,254,249,103,189,
- 55,109,200,108,182,186,115, 26,212,150,174,213,106,167, 72,135, 13,235,144,109,109,237,217,169, 83,167,193,115,231,254, 63,246,
-174, 59, 46,138,107,109, 63, 51,219, 27,101,233, 44,160, 2,138,162,130, 64, 68,196,142, 26, 73,236, 13, 75, 20, 75, 52,154,196,
- 18, 77, 98,176,197, 94,226,181,197,146,168,137, 61,118, 49, 42,118,197,222, 5, 11, 2, 10,210,123,135,101,123,153,153,239, 15,
-129,139,134,178,104,114,111,242, 93,158,223,111, 88,118,119,230,217,115,166,156,243,156,247,125,207,123,102,184,119,238,220,185,
-234,123,119,119,247, 38, 66,161, 48, 23,175,103, 80,250,214,197, 69, 3,126,182,182, 94,208,105,227, 43,174, 49, 7, 4, 33, 64,
-207, 15,227,208,185,235, 35,232, 13, 92,144, 4, 31, 36, 41,128,209, 88, 4,169, 84, 6,134, 33,188,234, 41,226,194,130,130, 2,
-143,203,151, 47,147, 41, 41, 41, 16, 8, 4, 0,144,186,120,241,226, 45,235,214,173,139,181,182,182,166, 34, 34, 34,240,251,239,
-191,163,127,255,254,172, 73,147, 38,121,184,184,184,108,171,175,222,139, 55,229,220, 61,176,254,220, 40,142, 65,234, 43, 16, 54,
-115,133, 82, 50,232,139,238, 54, 98, 0, 56,159,148, 84,110,215, 68,190, 90, 89,254, 52,221,210, 89,241,195,249,164,250,102,156,
- 46,166,163, 18,226,239, 29, 56,113,190, 44, 63,175,132,227,231,221, 86,189,106,233,183,220,102,174, 45,214, 44,250,110,170, 67,
-150, 92, 80,250,225,140,115,241,225,231, 31, 40,198, 78,152,108,252,244,179,105,154,115,231, 47,157,160,105,218, 27,181,204, 56,
-164,105, 26, 57, 57, 57,120,254,252, 57,146,146,146, 80, 80, 80,128,194,194, 66,148,151,151, 87,185, 27, 69,229,242, 51, 91,118,
-159,126, 34, 22, 10, 69, 1,222, 30, 77,238, 71,199,230,139,133, 66,145,135,107,147,150,192,226, 26,219, 17,138,162,188, 5, 34,
- 33, 0, 2,165, 49, 55,160, 40, 81, 64, 81,170, 64,121,177, 2, 90, 61, 11, 26, 45, 9,181,142, 68,211,238,125,160, 80,106,160,
- 40, 42, 3, 77, 81, 62,141,221, 77, 35, 26,209,136, 58,250,250,136,176,176,176,121, 38,238,107,178,123,243,109,225, 21, 22, 22,
- 54,143, 32,136,136,185,115,231,182, 69,237, 19,170,170, 99, 71, 13, 27, 0, 19,210, 59, 20, 21, 37, 40,204,136,214, 67,103,205,
-249,254,220,193,157,155,237,180, 90, 85,186,181, 84, 66, 73, 68, 60,155, 79,167,172, 64,185,162,100,136,210,244,116, 4, 40, 41,
- 41, 65,114,114, 50,132, 66, 33,184, 28, 14, 40,181, 26,148, 90, 9,117, 73, 17, 72,189, 22, 92,138,130,149, 72,136,166, 50, 7,
- 52,179,119, 48,137, 51, 49,242, 98, 85,224,123,117,119,225,191, 58,180, 6, 79, 44, 1,207, 76,130, 47, 34,174, 1, 0,184, 92,
- 46,176,112,153, 73, 70, 19, 39, 39,167, 83, 7, 14, 28,224, 22, 20, 20,224,241,227,199, 79, 0,148, 1, 48, 3, 64,199,197,197,
- 93,142,137,137,233,239,225,225, 1, 0,205,235, 35,147, 23,146,148,193,200, 32, 35, 55, 21, 41,153,209,176,178,112, 3, 71,212,
- 18,249,165,122,240,133,110, 48,104,255,237,125,212,200,211,160,214,179, 76,170,187, 78,167,131,209,104,132,209,104,132, 78,167,
-195,103,159,125,134,219,119,238,224,208,239, 87,144,252,234, 37, 90,185, 58, 32, 52,116, 44, 58,116,232,128, 59,119,238,212,201,
- 53,206, 23, 6, 39, 9,216,235, 63, 38,193,147, 88,107, 59,126,119,225,126,125, 98,139, 32, 8, 6,181,184, 34,223,194,186,192,
-192,192, 22, 47,149, 74, 60,143,143, 71,239,197,139, 1, 0,103,207,158,125,163, 46,179,103,207,230,197,198,198,126,250,232,209,
-163, 79,179,179,179,215, 3,168, 57,216,156, 1,206,156,185,139,169, 83, 99, 81, 80, 80, 0, 0, 56,124,240,223,186, 52, 37, 89,
-143,143,250,189,246,104, 89, 90, 90, 98,253,122, 47,147,206, 39, 69, 81,216,177, 99, 71,149,187, 16, 0,216,108,118,231,217,179,
-103, 15,173,105,255, 22, 45, 90,112,235,227,156, 53,220, 73,112,235, 9,243,165, 69,139,102,109,205,109,218,161,200, 16,237, 21,
-157,149, 51,125,214,112,167,141, 27,142,101,105,132,132,118, 15, 65,101,184,176, 5,154,189,166,148, 49,233,252,102, 93, 81,211,
-241,123,115, 11,228,243,167, 77,254,196,218,220,210, 78,249,235,150, 85, 82,146, 69, 50,167, 30,233, 75,219,186, 91, 91, 14,234,
-248,163, 98,234,172,133,209, 58, 99,198, 52,100,156,122,137, 58, 82, 92, 80, 20,133,236,236,108, 20, 20, 20, 32, 61, 61, 29,133,
-133,175,221,175,133,133,133,160,105,250,125, 26, 68,168,211,211,145,118,226, 87, 52, 27, 59, 22,254,203,150,130,162,217, 80,171,
- 40,172,239,212, 11, 37,101,106,104,105, 2,178, 15, 58, 97,242,217,155, 32, 25, 10,216,190,181,177, 39,105, 68, 35,254, 71, 97,
- 74,122,135, 74, 65,180,106,213,170,254,127,246,239, 87, 23, 91,171, 86,173,122,190,106,213,170,134,252,214,219, 46,195,170,247,
-149, 49, 90,215,170, 5,160,253,161,211, 44, 47,140, 75,138,141,101,103, 43,213, 74,145,189,157,173, 86, 36,224,211,101,242,114,
- 86,244,179, 39,122,101,238,171, 23, 13,168, 71, 92, 76, 76,140, 87,118,118, 54,210,211,210, 96, 84, 43, 65,106,117, 96, 52, 42,
-244,238,210, 9, 2, 0, 2,146, 0,151,214,131,205,226,161, 92, 33, 7,128,184,122, 59, 71,131,225, 15,150, 45,130, 32,192, 51,
- 51, 3, 79, 44, 6, 79, 98,246,134,133,203, 20,139, 13,159,207, 63,112,244,232, 81, 71, 39, 39, 39, 44, 93,186, 20,206,206,206,
-158, 50,153, 76,101, 97, 97, 33,180,183,183, 71,155, 54,109,208,169, 83, 39,156, 59,119, 14, 48, 33,167,148,193, 40,120,250, 34,
- 21,157, 11,139,239,224,230,181,159,161, 83,107,225,215,253,103,232,217,205, 96,219,118, 9,232,196,253, 80,229,158,124,109, 61,
-112, 24,128,204,244, 84, 16, 44,222,115, 83, 45, 79,149,255, 63,121,242, 4, 7, 79, 94,135, 99,211,214, 72, 79,136, 71,252,213,
-203,184,109,107,141,166,173,219, 84,185,129,106, 45, 35, 5,246,242,173,175,211, 68, 45,248,242, 19,126,113,113, 49,223,202,202,
- 74, 91,121,238, 28, 29, 29,223, 71,108,125,242,205, 55,223,160,148,195, 1,250,245, 3, 55, 41, 9,122,189, 30, 29, 59,118,132,
-191,191, 63, 0,160, 99,199,142, 96,179,217,104,215,174, 29,100, 50, 25,182,110,221,250, 73,109, 66,139, 36,240,216,104, 44,242,
-116,119,119,175, 18, 90,123,247, 21, 32,250,209,135, 32,192,195,166, 45,137, 85,251, 54,105,210, 4,185, 57, 73, 32, 8, 38,166,
-158, 50, 46,115,112,112, 88,232,232,232,232,190,110,221, 58,150, 64, 32,192,231,159,127,238,166, 80, 40,154, 85,152,146, 49,119,
-238, 92, 0,192,162, 69,139,176,120,241, 98,104,181, 90, 85,109,100,123,215,123,203,242,139,233, 79, 25,133,104, 72,144, 77, 51,
-239,158,193,189,225,230,209, 19, 61,131,211, 1, 96,165, 21, 59,117,196,154,249,150, 39, 44,205,136, 93, 23,207, 95, 90,212,165,
-123,207,249,223, 41,174, 46,255, 97, 71,105,189, 49,143,101,105,123,202, 95,240, 70,110,216,188,109,223,134,239,231,206, 20,164,
- 23,232, 74,178, 74, 24,133,132,207,150, 52,183, 39, 36,211,231, 44, 75,206,206, 78,250, 26, 25,231,235,157,105, 73,211, 52,146,
-146,146,170, 98,250, 52, 26, 13,148, 74, 37, 50, 50, 50,170,238, 25,181,216,252,163,105, 19, 6,248, 40,213,106,213,253,103, 9,
-233, 11,102,140, 9, 84,170,213,170,132,148,244,151,192,166, 26,213, 24, 73,146,207, 84,229,170,222,170, 82, 13, 10, 30,191,128,
-115,175,166, 48, 24, 9,232,140, 20, 10,138,202,161, 53, 2, 20,201, 65,219, 17,161,160, 8, 54, 10,179,179, 64,178, 88, 79,240,
-102,208,126, 35, 26,209,136,255, 29,212,169, 69, 42, 45, 90,129,129,129,135,170, 91,157, 42,255, 7,160, 69,221,161, 60, 5,213,
-197, 84,165, 59,177,182,223,121,139,215, 84,252, 33, 70,171,222,244, 14,149,191,233, 98, 33,151,253,107,209, 24,103,218,104,108,
-149, 95,152,103,100,179,249, 28, 23, 11,117, 78,113,186,233,191,174,213,106, 35, 46, 95,190, 60,248,195, 15, 63,228, 39, 60,123,
- 2, 93, 89, 25,116,101,165,224,208, 70, 88, 9,219,131,212,107, 65,232,116,112,242,164,161, 41, 23,226,250,237, 24,131, 86,171,
-141, 48, 85,104,145, 44,214,155,113, 89, 18, 9,248,102,230,224, 75, 36,111,187, 22,235, 19, 5,162, 62,125,250,244,234,216,177,
- 35, 24,134,193,142, 29, 59,160,215,235,121,122,189, 30, 58,157, 14,122,189, 30,114,185, 28,251,246,237,195, 79, 63,253,116, 27,
-192,238,122, 59, 51,163,238,242,133, 75,145, 29, 38,142,233,207, 57, 27,177, 30, 70, 29, 5, 53,225, 12,165,210, 0,133, 78, 4,
-202,122, 44,144,119, 6, 44,182, 0,129,237,220,112,242, 88,184, 30, 70,237, 21, 19, 85,248, 27, 86,161,140,244, 84,100,190,122,
- 9,137, 60, 23,182,230, 34,168,146, 94,194, 47,116,220, 59, 89, 39, 92, 92, 92, 64,211, 52,130,130,130,170,130,171,223, 85,108,
- 21, 21, 21,225,244,233,211,232,216,177, 35,186,119,239,142,172,172, 44, 36, 37, 37,161,111,223,190, 85,251, 60,121,242, 4,209,
-209,209,104,222,188,110, 35, 97, 97,177,225,108,102,198,227,144, 65,131, 6,113,239,221,187, 7,134, 97,224,225, 97, 14,115, 51,
- 49, 8,146,143,214,173,237, 0,188, 30, 3,244,232,209, 3,114,121,146,177,164,132, 57, 91, 79,117, 15, 0,248, 93,167,211, 37,
-118,235,214, 77,246,234,213, 43,204,154, 53,139,125,248,240,225, 74, 83, 50,194,194,222,156, 76,161, 86,215,238,186,111,229,237,
-249,173,155, 81,218, 93, 32,108,230,106,110,211, 14,110, 30, 61, 1, 0, 31,246,159, 8,183, 22, 77, 32, 47,124,234,170, 81,167,
- 14,225,178, 75,164, 79, 55,101,197, 10,251,121, 77,208,228, 95, 75,192,107,215,105,189,151, 93,157,112, 56, 47,157, 51,246,200,
-239,167,206, 77,233,219,127, 32,199, 64, 25,141, 94, 77, 57,150, 71, 79,156,201,207, 74, 75,255, 17,233,231, 99,254,109,255,171,
-211,138, 71,201,229,114,136,197, 98,196,196,196,104,251,245,235,199, 39, 73, 18,137,137,137, 85, 66,203,206,198,170, 77,103,127,
- 47,207,229, 27,246, 93, 16,243,249,252,224, 30,237, 91,199, 38,164,101, 50, 12,145, 90,171,181,213, 96,184,244,236,241,147, 32,
- 91, 89, 11, 86,210,181,123,176,238,218, 23, 90, 45, 9,181,142,134,214, 8, 24, 89, 92, 56,250, 6,192,178,121,107, 48, 0, 30,
-222,187,109,208, 26, 12, 23, 26,251,154, 70, 52,226,127,218,170,197,212, 37,146, 42,254, 47, 6,144,186,106,213,170,194,106,214,
-166, 2, 0, 79, 0,248, 84,236, 87,240,214,113, 5, 4, 65, 60,100, 24,198,191, 26, 79, 65, 53,193, 85,253,127,221, 91,251, 60,
-105,128,200,170,254,250,166,208,170,109, 74, 37, 0,216,216,216,216,249,249,181,111,254,203,206, 35, 96, 24, 6, 47,162,215,162,
- 36, 63, 30, 11, 87,222,109,238,228,228,212, 61, 43, 43,235,186, 41, 37,160, 40,234,240,174, 93,187,190, 14,248,192,207,207,213,
-217, 25, 79, 82, 83,192,101, 40,112, 41, 10,164, 94, 11, 54,165,131,179, 23, 5,146,144, 32, 59,187, 12,171, 15, 28,137,169,200,
- 18, 95, 39, 60,251, 14,196,210,204, 50, 16, 4,129,117,129, 94,224,153, 73,192, 21, 75,240,197,169,200, 42,113, 21,177,116, 46,
-120, 18, 9,154, 7,152,148, 16, 94,117,245,234,213, 71,207,158, 61,243,247,242,242,194,215, 95,127,141,212,212, 84,208, 52,141,
-188,188, 60, 77, 78, 78, 78, 86, 65, 65, 65, 42,128, 19, 0,126,129, 9,153,199,185, 90,205,198,136,227,123,167, 5,118,233,110,
- 51,104,200, 79,248,253,216,108,148,150,201,161, 50, 10,161,212, 24,161,212,178, 96,101,237,141,128,118,237,144,157,149,143,231,
-247, 46, 40,216, 90,213,218,134,220,160, 4, 65, 32, 58, 58, 26,238, 50, 51,188,188,121, 29, 54, 34, 14,124,100, 14,144,117,238,
- 82,149, 95,170, 46,112, 88, 48,126,242,201, 39, 85,153,225,251,244,233,147, 50,118,236, 88,199,217,179,103, 99,231,206,157,184,
-125,251,246, 31, 2,180,187,119,239,142, 27, 55,110, 44, 1,176,168, 62,163,158, 78,167,131,167,167, 39, 30, 62,124,136,203,151,
- 47,163,103,207,158,232,222,189, 59,158, 62,125,138,139, 23, 47, 34, 58, 58, 26, 4, 65,192,218,218, 26,134,215,226,217, 80, 27,
-153, 94,143,163, 63,172,217, 53,111,195,134,159,218,142, 25, 51, 6,199,143, 31,194,196, 9,173, 64,144,124, 16, 4, 31, 3, 7,
-180,194,210,101, 15, 17, 16,208, 3, 54, 54, 28,108, 88,127, 50, 89,173,166,246,153,112, 26,151, 95,188,120, 81,166,209,104, 80,
- 90, 90,202, 72, 36, 18,162,168,232,245,140,214,154, 44, 90, 42,149, 74, 80, 27,209,179,168,184,181,165,229, 76, 9,163,136, 30,
- 82,108,140,246,238, 25,156,129, 15,251, 79,192,165,136,221,136,188,112, 25, 86,236,212, 20,136,203,207, 21,166, 20,202,115,148,
- 30,219, 90,127, 48,137,149,169,188,176,109,250,192,151, 44, 71, 71,250,232,220,159,229,165,117, 9, 45, 0, 68,113,236,254, 83,
- 39, 24, 12,236, 20, 24,208,194,171,137, 35,175,164, 48,159, 57,118,242, 92,140, 62,229,248,233,106, 2,139,169, 71,168, 47, 13,
- 11, 11,251,190,226,255, 61, 11, 22, 44,152,180,122,245,106,219,220,220,220,170, 24,173,252,194,226,200, 78,253,166, 83, 69,165,
-101,186, 93, 27,230, 12, 23, 10,248,188, 5,171,119, 93, 51,176,112,175, 54, 94, 35, 77,111, 29, 49,107,225,204,132, 23,209, 78,
-205,132, 60,156,156,179, 8, 79, 46, 94,133,129,228, 98,234,229,251,208,234, 41,148, 22, 22,225,202,167, 95, 66, 98, 47,197, 79,
-215,142,231,209, 52,253,115, 99, 87,211,136, 70,252,239,162, 54, 45, 66, 16, 68, 77, 57,246,242,106,248,236, 97, 93,199,213,194,
-243,103,160,214,172,240, 38, 77,193, 43, 44, 44,204,191,113,227, 62,174, 69, 44,199,245,136,229,120, 30,253, 4,217, 89, 58,100,
-229,105, 96,110,110,126,183,142, 67,223,206, 28,203,168, 84,170,161, 11, 22,126,159, 43, 16,138,208,173, 87, 47, 56,216,218, 65,
-196,229,128,101,164,193, 34, 56, 80, 20, 88,226,229, 83, 21,190,219,181, 63, 95,161, 82, 13,173,161,147,232, 93,155,200, 32, 8,
- 2,124,115, 51,240, 36,102,224,155,153,191,225, 70, 20,152,155, 67, 96,102, 14, 54,143, 87, 83, 48,252, 31, 56, 21, 10,197,176,
-225,195,135,151,148,149,149, 97,210,164, 73,184,126,253,122,244,133, 11, 23,204,159, 62,125, 42, 44, 40, 40,104, 1,160, 15,128,
-237,117,136,172, 55, 56, 75, 74,146,202, 25,163,118,228,170,239,191, 82,107,140,214, 8, 25,119, 24, 98, 50, 3, 70,138, 6, 3,
- 64,102,197, 67,231,222,203,144,175,235,132,195,219, 86,168,104,189,102,204, 91, 57,180,222,224,100, 24,134,177,183,183,255,195,
- 57,184,124,249, 50, 66,134, 15, 67,240,144,193,176,117,117,135, 93,239,190, 8,158, 52, 21,219,182,109, 3, 73,146,176,177,177,
-121,187,227,173,226,220,251, 24,156,131,207, 64, 28,124, 6, 98, 79, 52,216, 0, 66,247,239,223,255,131,143,143,207,213,219,183,
-111,175, 5, 48,178,250,111, 85,195,226,183,172, 89, 53, 93,163,249, 51,103,206, 84, 39, 36, 36, 64, 44, 22,195,104, 52,226,246,
-237,219,248,233,167,159,176,110,221, 58, 68, 71, 71,195,218,218, 26,205,155, 55,135, 86,171,197,195,135, 15,213, 0,230,215,193,
- 73, 23, 20, 24,135,109,218,180,186,168,127,255,174,216,181,107, 11, 28, 28, 58,129,195,118, 0,155, 99, 11,177,196, 19,191,254,
-242, 3, 62,254,216, 15,167, 78, 30, 41, 46, 44, 50, 14, 3, 96, 52,225, 94,210,220,191,127, 31,219,182,109,195,240,225,195,179,
- 66, 66, 66,168,178,178,178, 42,139, 86,101,166,223,197, 21, 49,102, 90,173,150, 95, 27,231,228,239, 98,178,230,172,120,190, 52,
- 47, 55,171,227,245,171,119, 63,137,188,112, 25,201, 9,145,136,188,112, 25, 55, 35,239,132,229,229,102,117,244,235,208,146, 59,
-116,210,180,111,247,134, 31,103, 73,204, 29,177, 55,252, 56,107,244,244,175, 86,180, 15,238, 57,191,190,123,190,226, 58, 50,138,
-252,188,185, 43,215,110, 86, 24,245, 26,242, 95, 63,110,205, 86, 23,228,204,175,118, 95, 50,245,221,159,106,181,122,187, 70,163,
-145,105, 52, 26,153, 86,171,157,159,154,154,218,237,235,175,191, 46,160, 40,170,202, 90, 90, 16,123,234,110,252,173, 61, 43,237,
-108,164,194, 78,254,109, 91,173,223,126,236, 90,122, 70,222,111,213,114,104,213, 84, 78,141, 66,173, 25, 54,120,232, 88,101,105,
-137, 22,129, 95,133,129, 22, 72,160,165, 0, 3,195,130,145, 96,227,217,242,245, 16, 90,153,225, 64, 74,148,170,204,160, 31,134,
- 55,115,104,213, 85,247,247, 65, 35,103, 35,103, 35,231,223,147,243,159, 12, 71,188,185,214,161,227, 27, 22,173,250,166, 84, 58,
- 57, 57,117, 27, 52,176, 55,122,244, 95, 0,134, 97, 16, 31,181, 6, 37, 5, 47,224,228,192, 71, 82,186, 60, 16,192,245, 6, 20,
- 38, 61, 53, 35,163,227,204,249, 11,194, 67,250,244,106,237,229,234,202,111,214,172, 41,196,118,118, 40, 44, 44,192,173,123,177,
-134, 21, 7,143,198, 84,136, 44,147, 28,147, 52, 77,191, 14,114, 7,208,107,230,119, 32, 88, 44,160, 34,141, 67,101,199,232,234,
-223, 9, 4,155, 13,138,161,161,213,106, 77,153, 45,151,249,234,213,171, 97, 99,198,140,185, 18, 17, 17, 65, 6, 7, 7,251,158,
- 56,113,226,125,214,204,131, 50, 63,225, 42,128,254, 43,230, 78, 57,220,177,231, 96,115,143,182,237,185,237,155,177,160, 55, 16,
-200,206, 74, 67, 68,248, 3,125,236,253, 11,114,198,168, 25,169, 42, 76,184, 90, 23,151, 94,175, 79,111,209,162,133,253,182,109,
-219,170,130,225, 41,138, 66, 97, 97, 33,238,222,189, 11,111,255, 0,180,158,240, 41, 10, 10, 10,176,105,211, 38, 52,105,210, 4,
- 3, 6, 12, 64,113,113, 49,140, 70,163,169, 14, 95, 10,192,133,138, 13,111,137, 44,162, 98, 9,160, 58,221,134,238,238,238, 60,
-141, 70,227,203, 48, 12,139, 32,136,141, 58,157,110,252,220,185,115, 29, 87,174, 92,137, 86,173, 90,161,176,176, 16, 98,177, 24,
- 30, 30, 30, 40, 40, 40,192,131, 7, 15, 40,149, 74,181, 13,175, 23,178, 46,168,167,124,137, 15, 30,164,116,156, 49,227,139,240,
- 31, 86, 79,241,208,104,123,240,172,172,186,128, 97,140, 40, 40, 72, 69,185,252,182,126,217,210,221,175,242,242, 13, 67, 1, 36,
-152, 88,231, 69,211,166, 77, 3, 0, 1,128, 5, 73, 73, 73,143, 91,183,110,237, 81,155, 69,203, 20,108, 56,150,165, 1,112,112,
- 88,176,108,150,188,240,169,135, 21, 59, 53,165,163, 23,189,105,195,177, 44,141,185, 76,185,188, 48,245,250,203, 28,229,133,109,
-123,195,143,179,198, 13, 25, 70, 57, 75, 18,194, 4,118,204, 49, 19,168, 25, 31, 31, 31, 23,130, 40,118,203, 47,122,241,104,226,
-164, 41, 35, 44,184,234,179, 62,206, 69,205,201, 38,126,130,232,232,232, 20, 52,112,102,104, 5, 94,102,101,101,117,155, 59,119,
-238, 5,134, 97,222,136, 77,200, 47, 44,142, 12,236, 63,141, 41, 45, 45,123, 92, 16,119,202,148, 92,106, 15, 30, 68, 69,247,242,
-242,246, 59,254,195,202,213,246, 61,102,126,205,126,121,245, 26, 64, 25,144,118,253, 26, 40,190,142, 94,127,231, 82, 94,153, 94,
- 63, 4,141, 89,225, 27,209,136,255,121,107, 86, 93, 90,228,111,142,126,168, 37, 24,222,228,202,184,187, 57, 93,104,229,209,172,
- 79, 19,103, 91, 0, 64, 82, 74, 54,146, 82,178, 46, 38, 37,103, 5,215,163,120,107,155, 94, 89,181,168, 52, 81,145,194,129, 49,
-109, 81,233, 55, 56,173,173,173, 31,177,217,108,231,134,156, 13,138,162,178, 11, 11, 11,253, 76, 44,231,104, 87, 87,215,213,105,
-105,105,225, 52, 77,207,106,160,218,175,145,179,114, 81,105,146,205,235,205, 24,117,222, 0, 64,176,121,166, 44, 42, 93,157,211,
- 91, 34,145,108,231,112, 56, 77, 42,175, 99,101, 12, 22, 69, 81, 44,189, 94, 47,160, 40,138, 5,128, 32, 73,210,200,225,112, 52,
- 4, 65, 24,141, 70, 99,186, 86,171,157,130,127, 39, 28,173,171,238,245,118,244,175,178,100, 50, 0, 0, 32, 0, 73, 68, 65, 84,
- 21, 66, 11, 53, 88,180, 46, 3, 64, 66, 66, 66, 75,169, 84, 58,146, 32,136,225, 12,195,120,150,151,151,107, 23, 46, 92, 24,125,
-244,232, 81,185,171,171,235, 71,253,250,245, 35,158, 62,125,138,152,152, 24,166,168,168,232, 88,133, 21, 43,169,129,247, 18,201,
-231,179, 70, 89, 89,145,253, 24, 6, 62, 96, 64, 16, 36,158,149,149,209,103, 85, 42,234,183, 10,193,216,208,251,179, 18,159, 52,
-107,214,108,119, 74, 74, 10,167, 54, 75,106,109,117,127, 27,107,230,183, 93, 16,216,181,235,176,187, 55,111,158,152,179,226,249,
-210,234,223, 77, 31, 44,157, 56,250,203,153,107, 14,110,253,113,206,230,223, 75,118,153, 82, 78, 95, 95, 95,119,130, 32, 70, 2,
-240, 98, 24,166, 5,195, 16, 2,130, 96, 74, 8,130,120, 14,224,169, 78,167,139,136,141,141,205,124,143,186,191,203, 8,183, 54,
-206,170, 69,165, 65, 81,237, 40,128, 49,113, 81,233,255,116, 57, 27, 57, 27, 57, 27, 57,255,123,156,255,100,124, 86, 67, 7,105,
- 90,102,248, 74, 36, 37,103, 5, 39, 37,103,161, 69,139, 22, 76, 98, 98, 98,131, 68, 90,109,157, 52, 69, 81,135, 84, 42,213,161,
-247, 33, 41, 42, 42,106,255, 23,159,188,131, 41, 41, 41, 7,255, 76,194, 10, 33,181,180, 98,123, 87, 60, 83, 40, 20, 1,166,238,
-172,215,235,255,138,115, 67, 84, 88,179,150,212,182, 67,159, 62,125,210,244,122,253,101, 0, 25, 4, 65, 88, 2, 40,214,235,245,
- 23,140, 70, 99, 94, 98, 98, 98,251,245,235,215, 87,102,190, 95, 6,224,209, 59,150,131,214,106,169, 3,217,217,212,129,191,160,
-142, 7,116, 58,221,108,107,107,235,230, 26,141,134,167,209,104,184,213, 39, 31, 8,133,194,130,186, 2,226,171,195,210,140,216,
-195,101,151, 88, 91,154, 17,111, 11, 41, 88, 57,225,184, 90, 25,211,202,202, 9,199, 77, 45,216,227,199,143,147,124,124,124,246,
-147, 36,233,202, 48,140, 61,192, 88, 48, 12, 10, 24,134, 41,100,179,217, 89,177,177,177, 89,127,163, 70, 72, 99,164,233,181, 70,
-157,238,223,113,135,141,179, 11, 27,209,136, 70,252,255, 65,173, 49, 90,236,134, 50, 37, 38, 38, 18,141,231,179, 17,213,197, 86,
- 93, 95,166,165,165,105, 1,220,169,216,222,198, 35, 0, 3,254,238, 21,204,201,201,241,171,237, 59, 83, 69, 22,240, 58,102, 11,
-136,169, 49, 59,251,226,205, 37,229,216, 28,254,109, 67,203,246,228,201,147,116,152,232, 98,111, 68, 35, 26,209,136, 70,252,101,
-248,172, 54,241,197,110, 60, 55,141,104, 68, 35, 26,209,136, 70, 52,162, 17,239,133, 29,213, 4,215, 27,214, 45, 2,181,207, 28,
-104,136,239,245, 93,102, 31, 92,110,228,108,228,108,228,108,228,108,228,108,228,108,228,252,159,227,252,255,138, 55, 68,150, 41,
-201,209,255, 12, 52, 78,125,109,228,108,228,108,228,108,228,108,228,108,228,108,228,252, 95, 16, 89,111,108,149, 89, 15, 26, 93,
-135,141,104, 68, 35,254,103,113,244,232, 81,147, 22, 21, 29, 53,231,215,254, 18,137,116,161, 66, 94,182,250,208,218,137, 39, 42,
- 63, 15, 9, 9,161, 26,207, 98, 35, 26,209, 8,188, 75, 48,188,155,155,115, 27,146,162, 59, 51, 12,201, 98, 72,198, 64,200,213,
-135,147, 74, 74,222, 72, 59,224,226,226, 98,201, 33, 49,128, 96, 24, 49, 65,208, 20,205, 34,111, 39, 39,103,198, 54,160, 96, 60,
-169, 84, 58,141,203,229,246,214,233,116,206, 36, 73,102,106,181,218,203, 42,149,106, 11,254,152,184,240,191,134,150, 45, 91,142,
-190,118,237,154,101,151, 46, 93,180, 66,161,208,168, 86,171,217,231,207,159,231,127,252,241,199,165,175, 94,189,122,167, 25,137,
- 50,153,172,231,175,191,254,234, 22, 28, 28,140, 22, 45, 90, 40, 71,142, 28,201, 13, 12, 12,228, 78,154, 52, 41, 57, 59, 59, 59,
-178,129,116,109, 8,130,216, 71, 16, 4,139,166,233, 80,252, 59,117,195,159, 13,146, 36,201, 41, 4, 65, 12, 97, 24,198,157, 32,
-136, 36,134, 97, 78,208, 52, 93, 87,226,214,186, 48, 12, 64, 95,146, 36,253, 0,128,166,233,104, 0,103, 1,211,103,222,253, 39,
- 57, 69, 34,145, 47, 0,168, 84,170,199,127, 22, 39, 65, 16,190, 0,192, 48,204,187,114, 78, 16, 10,133,147, 1, 64,173, 86,255,
- 2, 19,150,131,122, 27,204, 54, 79,198,111, 73, 60, 0, 32,122,145, 39, 0,160, 33,239,137,169,241, 68, 67,126,171, 38,190,134,
-112,212,128,190, 99,198,140, 89,249,219,111,191, 45, 2,112,242,175,184,241, 29, 28, 92,182,172,251,113,135,236,171,105,159,174,
-198,235, 21, 33,234,126, 32,129, 15,121, 44,214, 64, 29, 69,221,140, 5,142, 2, 96, 91, 89, 89,141,230,241,120,221,116, 58,157,
- 35,155,205,206,209,233,116, 55,202,202,202, 14,162,142, 21, 16, 76, 62,175,113,144,234, 85,112, 32,232,127,175,243,198,144,208,
-114, 69,200, 37, 90,163,228,111,208,140,146, 0,102, 86,212,117, 39,106, 79,231, 81, 87,227,243,149, 76, 38, 27, 34,151,203, 85,
- 44, 22,139,193,235, 89,207,175,255,188,254,158,160,105, 58,191,184,184, 56,180, 62, 46,113, 19,180,226,137,137,125,148, 1,106,
-163,150,249, 92,153,129,120,137, 11, 58, 49, 64, 40, 3,184,146, 44,210,150,166,233, 28, 0,145,164, 17,167, 21,217, 72,252,155,
-118,238, 77, 43,206,107,179,138,247, 28, 0,246, 0,158, 2,248, 10,128,162, 81,255,252,199,240,118, 48,252, 25, 0, 57, 85, 66,
-171, 90,186,251, 30,253,251,247,191,238,230,230,220,102,248,224,161, 43,167, 78,249,156, 96,177, 72,196, 60,127,206,254, 36,116,
- 66, 31,169, 84,234, 36,209,106, 91,131, 32,104,149, 64, 16, 35,151,151,101, 29, 61,248,155,153,103,171, 86, 20, 69,209,216,182,
-253,231,143,143,253, 30, 62,207, 68,177,213,210,193,193, 97, 95, 88, 88,152,195,192,129, 3, 89, 14, 14, 14, 72, 77, 77,181, 60,
-116,232, 80,171,205,155, 55,143, 40, 41, 41, 9, 5,240,242, 29, 42,219,213,193,138,236, 99, 38, 36,122,161,156, 66,185, 1, 87,
-114,213,184, 8,224,230,187,158, 61,149, 74, 53, 93,165, 82, 5,248,251,251, 51, 59,119,238, 36,198,143, 31,207, 16, 4, 65,168,
-213,234, 61, 0,222, 73,104,137,197,226,173,193,193,193, 30, 30, 30, 30, 73,175, 94,189,234,123,228,200,145,179,227,198,141,115,
- 23,139,197, 9, 0, 90, 54,144,110,119, 81, 81,145,143, 90,173,134,179,179,243, 78, 0, 31,252, 5, 55, 17,193, 98,177, 78, 56,
- 57, 57, 49,107,214,172, 57,233,227,227, 99, 95, 92, 92,108,252,246,219,111,123,223,187,119,239, 99,138,162, 6, 54, 64,108, 73,
- 9,130,216,110,111,111,111,179,122,245,234,196,246,237,219, 63,229,243,249,188,132,132, 4,209,236,217,179,103,189,124,249,114,
- 4,195, 48, 83,128, 6,117, 16, 82,130, 32,182,203,100, 50,155,149, 43, 87,166,250,249,249,197,112,185, 92,110, 66, 66,130,248,
-187,239,190,251, 42, 62, 62,254,157, 56, 73,146,220, 22, 16, 16, 32, 93,180,104, 81, 92,171, 86,173,238,176, 88, 44, 94,102,102,
- 38,185,120,241,226,105,151, 46, 93, 10,161,105,122,234,187,148,211,206,206, 78,186,120,241,226,184,192,192,192,123, 92, 46,151,
-251,226,197, 11, 50, 44, 44,108, 90, 98, 98,162,201,229,180,178,178, 10, 34, 8, 98, 71,110,110, 46, 27, 0, 28, 29, 29, 59,152,
-155,155,111,174,190,166,101,101,140,128,193, 96, 40,215,104, 52, 99,138,139,139,107, 76,132, 59,126,238,166, 1, 0,176, 89, 95,
-249,254,245,107,125,239,129,109,167, 77,169,180,175,195,235,188,120,235,148, 19, 7, 3,192,232,138,165,194,215, 41, 1, 54,155,
- 77,251, 58,124,197, 60,206,109, 80,202,152, 65, 61,123,246, 92, 28, 25, 25,249,115,143, 30, 61,190,219,191,127,191, 93, 70, 70,
-198, 15, 55,111,222,116, 25, 53,106,212,248, 43, 87,174,172, 42, 44, 44, 60,246,103,221,252, 60, 46,159, 79,144, 4,132, 2,145,
-185, 41,251,115, 72,178,255,157, 65,131, 38,255,242,226,133,223,230,248,120, 55,165,163, 99,192,140, 25, 51,236,135, 14, 29, 74,
-186,184,184, 32, 49, 49,209,122,255,254,253,173,127,249,229,151, 33,165,165,165, 51, 1,164,189,143,200, 82,150,194, 91,171,131,
- 31,195,192,178,234,129, 37, 80,202,215, 35,154,137,195,179,191,129,216,250,126,247,238,221,139, 18, 19, 19,177,106,213, 42, 0,
-216,210,192,227,103, 15, 26, 52,168, 95,120,120,184,240,232,209,163, 66,127,127,127, 56, 56, 56,160, 98, 48, 85,149,152,218,205,
-205,205,180,115, 70, 99,221,198,179, 19, 63,136, 41, 62,135,173, 67,115, 87, 9,157, 97,236, 52,200, 99, 72,255,241,126,176,176,
- 21, 65, 32, 97,163,180, 72,238,245, 34, 58, 35,248,234,145,196, 31, 18,163, 10, 86, 43,211,241, 61,106,207,201,247, 95,129,181,
-181,245,206,228,228,228, 32,177, 88,252,198,231, 73, 73, 73,190, 30, 30, 30,101, 0,190,110,168,112,179,181,181, 61, 64,211,180,
-182,168,168,232, 83, 0, 48, 51, 51,251, 77, 44, 22, 75,115,114,114,230,253, 85, 3,153, 74,188,173, 69,254,225, 22,173,170,120,
-173,154,214, 58, 36, 72,138,238, 60,117,202,231,196,200,209,163,114, 19,147,146,105, 54,135, 55,250,252,133, 11,162, 54,109,218,
-144,218, 45, 91, 96, 44, 40,128, 97,214,172, 78,151, 47, 95, 54,132,140, 30,171,230,176,136,221,238,110,174,162,195, 7, 15, 57,
-132, 31, 63,214, 25, 64,125, 66,139,231,224,224,176,239,218,181,107, 78,110,110,110, 40, 45, 45, 69,106,106, 42,148, 74, 37, 70,
-140, 24,193,233,220,185,179,211,240,225,195,247,149,149,149,117,105,128,101,203,190,133, 51, 59, 98,202,132,161, 45, 63,238,211,
- 89,236,228,210, 28, 76,174, 6, 25,175,226,253, 35,174,221,155,177,251,248,217,151,137,101, 76,127,212,188, 54, 82,157, 40, 44,
- 44,156, 51,100,200,144,227, 65, 65, 65,182,124, 62, 31, 50,153,140, 24, 56,112, 96,126,118,118,246,146,119, 86, 45, 21, 75,216,
-144, 36, 73, 85,127,173, 97,121, 32, 83,224, 44,149, 74, 33,149, 74, 1,192,233,125, 71,158,150,150,150, 91,204,204,204,134,203,
-229,114, 53, 73,146, 12, 65, 16,140, 78,167, 19, 74,165,210, 39,113,241, 47,101, 90,173,182,197,218,141,191,252,216,179,171,143,
-249,165, 75,151, 48,116,232, 80,230,226,197,139, 83, 76, 93,167,142, 32,136,237, 67,134, 12, 81, 45, 92,184, 80,147,152,148,234,
- 20,247, 50,137, 16, 11,120,180,141,141, 13,231,193,131, 7,236, 13, 27, 54, 8, 22, 47, 94,188,157, 97,152,225, 13, 56,159,219,
- 71,141, 26,165,255,230,155,111,114, 94, 36, 38,219, 61,139, 75,100, 36, 2,142,209,198,198,154,117,239,222, 61,250, 93, 56, 73,
-146,220, 54,103,206, 28,249,148, 41, 83, 74,138,138,203, 28, 74,228, 10,134,207, 97, 25, 28, 28, 28,216, 39, 79,158,212, 30, 56,
-112,128,156, 60,121,242, 54,154,166, 67, 26,112,126,183, 13, 28, 56,176, 60, 44, 44,172, 52, 33, 41,197,225, 89,236, 75,136,248,
- 28,131,189,189, 29,235,225,195,135,250,181,107,215,146,203,151, 47, 55,169,156, 98,177,120,239,145, 35, 71,216, 39, 79,190,110,
-251,238,222,189, 75,186,187,187,139,170,239,163,214,104, 65, 18, 64, 97, 97,161, 40, 48, 48,112, 47,128, 63, 36,247,245, 91, 18,
-143,241,115,129,233,211,167,231, 52,244,102,241,115,156, 81,239, 62,212,207,158,204, 6,213,196,193,108, 54,155,158, 60,121,114,
-238,219,223,107, 52, 26, 2,192, 64,252, 96,186,216,234,219,183,239,252, 51,103,206, 52,223,191,127,255,250, 3, 7, 14,232, 0,
- 64, 32, 16,216, 28, 58,116,104,213,136, 17, 35, 48, 98,196,136,133,199,142, 29,251,211,132, 22,197, 80,122, 0,224, 11,248,252,
-248,248,120,194,211,211,179,206, 40, 87, 61, 77, 63,250,229,197,139,246, 95,120,122,250, 23,211,116, 11,238,199, 31, 43,102,207,
-158, 93, 40,151,203,145,154,154, 10,189, 94,143,241,227,199,179,122,244,232, 33, 27, 49, 98,196,166,242,242,242, 97, 0,244, 38,
-220,147,107,157,156,156, 62, 43, 43, 43, 83, 84, 90,117,186,132, 82,236,110,190, 70,126,187, 22, 6, 30,151,101,228, 14,152, 69,
- 19, 23,183, 16, 74, 79, 55,220, 2, 0,174, 10, 5, 13, 28, 12,212, 8,115,103,184, 81, 28, 44,183,117, 22,246, 44, 72, 83, 47,
- 85,166,215, 41,150,134,137,197,226,193, 74,165,242, 88, 69,231,220,178,127,255,254,184,119,239, 30, 0,116,174, 16, 90, 61, 73,
-146,252,132,166,233, 95, 1,212,181,148,219,140, 65,131, 6,125, 24, 30, 30,110, 6, 0,199,142, 29,131,193, 96,128,187,187, 59,
-184, 92, 46,120, 60, 30, 56, 28, 78,213,234, 32, 38,194,209,214,214, 6, 54, 22, 28, 72,173,196, 31,127,247,211, 32,118,147, 54,
-230,200,167,158,163,152, 41,133,145,209,130,107, 45, 70,171, 96, 75,248,245,233, 73,158,222, 22, 51,239,244,214,184,246, 42, 18,
- 3,144, 6,237,223,165,103, 39, 73,146,255,244,233, 83,200,100,178, 55, 62,103,177, 88, 0,208,237, 29, 40, 23, 38, 37, 37, 5,
- 70, 69, 69, 33, 40, 40,104,161,183,183,247, 71,215,175, 95,119, 40, 42, 42, 66, 80, 80,208,166,204,204,204,147,127,117,157,170,
-107,145,255, 47,166, 46,242, 45, 37,217,227,245, 40,152,100,177, 88, 36,146,147, 82, 13, 65, 65,189,198,165,167,167, 75, 2, 2,
- 2, 72, 14,135, 3,101,100, 36, 52, 15, 31, 66, 34,145, 96,200,144, 33,156, 27, 55,110,152,155, 75,204, 39,165, 36,167,148,179,
- 88, 36, 24,134,172, 55,230, 65, 42,149, 78,155, 55,111,158,131,135,135, 7,140, 70, 99, 85, 70,115,163,209,136,140,140, 12, 72,
- 36, 18,132,134,134,218,137, 68,162,105, 38,214,163, 89, 75,119,187,232,107,103,183,127, 48,123,106, 95,113, 75,209, 37,136, 51,
-102, 66,114,236, 11,180,206, 62,143,176,193, 1,226,139, 91, 23,250, 53,151, 89, 69, 87, 51,177,154, 12,173, 86,123, 43, 38, 38,
-102,210,245,235,215,105, 0,184,122,245, 42, 19, 23, 23, 55,229,125, 70,161, 52, 77,163,180,180, 20, 52, 77,179, 42,222, 87,190,
-254, 87,239, 7,115,115,243,109, 31,125,244,209,168,180,180, 52,225,185,115,231,172,211,211,211,109, 82, 82, 82,108, 91,182,108,
-201, 94,181,106,213, 25,141, 86,207, 50, 80,140,206, 72, 25,202,115,158, 63, 79, 42,201,203,139,222,181,107,151,154, 32,136, 33,
- 38,254,198, 48, 71, 71, 71,235,185,115,231,130,224,136, 58,180,106,237,237,193,226, 8, 45, 72, 14,207, 66,173,214, 80,201,201,
-201, 25,115,231,206,117,245,241,241,145,225,181,123,205, 36, 78,153, 76,102,243,205, 55,223,128,205, 55,243,109,231,227,215,156,
-199, 23,155,177, 56, 66,179,128,128,128, 30, 73, 73, 73,217, 97, 97, 97,142,254,254,254, 13,226,244,247,247,151, 78,158, 60,217,
- 40, 16,154, 5,186,185,185,183,110,215,182,117,191,150, 45, 91, 14,102,179,217,198,130,130,130,180,208,208, 80,199, 1, 3, 6,
-216, 55,132,211,206,206, 78, 26, 22, 22,102,116,105,234, 30, 28,252, 97,159,142, 92,161,153, 5,155, 39,182, 84,169, 52,212,139,
- 23, 47,210, 22, 44, 88,224,232,235,235,107,103, 10,167, 74,165,226,216,216,216,192,203,203, 11,109,220,221, 81, 86, 86,134,240,
-240,112,236,222,189, 27,191,254,250, 43, 14, 30, 60,136,246, 93,250,192,204,204, 12,217,217,217,144,203,229,156,255,244, 13, 69,
-253,236,201,108,214,125, 54,240,243,207, 63,207,158, 60,121,114,174, 80, 40,164,223,222,172,172,172,168, 49, 99,198,228,133,126,
-183,113, 96,165,107,177, 30, 75,214,211,179,103,207,190,218,191,127, 63,218,180,105,131,224,224, 96, 30, 0, 76,155, 54,141, 55,
- 98,196, 8, 28, 57,114, 4,199,142, 29,139,245,240,240,184, 13, 96,144, 41,229, 12, 13, 13,237, 18, 18, 18,114, 51, 36, 36,228,
-241,200,145, 35,119, 76,153, 50,229,141,158, 43, 39, 59,243,145, 78,167,131,143,159,191,104,217,206,251, 99,234,227,139, 3,246,
-239,136,143,223,189,250,249,243,180,133,109,218, 88, 54, 77, 73,177,218,179,118,173, 77,229, 34,221, 6,131, 1, 25, 25, 25,144,
- 74,165, 24, 51,102,140, 13,159,207, 15, 53,161,152, 27, 6, 13, 26, 52, 33, 61, 61, 93,242,203, 47,191, 56, 62,126,252, 88,150,
-147,147,227,120,229,242, 5,219,111,191,158,102,102, 33,225,241,178, 11, 24, 2, 0, 82,178, 33,142, 79, 70, 23,134,129,101,117,
-119,226, 59,193, 17, 66,161, 51, 54, 55,239, 98,249,242,155, 35,190, 35,195, 34,252,108,164,142,252,185,117, 28,209,110,205,154,
- 53, 71, 79,159, 62, 61,186, 75,151, 46,199, 1, 8,107,216, 71,208,190,125,251,240, 35, 71,142, 76,232,218,181,235, 45, 0, 94,
-181,142, 34,157,157,135,252,254,251,239,214,149,239,109,108,108, 32, 16, 8,254, 32,178,184, 92, 46, 72,146,108,112,245, 86, 28,
- 26,205,182,106,173, 69, 76,201, 89, 28, 89,243, 20,107, 62,126, 65,175,236,148,162,221, 18, 26,143,139, 71,158, 34, 31, 79,209,
-247,139,230, 24,189,192,167,183,136,194,242,191, 83, 7, 94, 80, 80,240, 73,183,110,221,142,246,237,219, 87, 27, 21, 21,133,130,
-130, 2, 56, 57, 85,141,181,115,223,129,210, 74, 36, 18,193,197,197, 5, 30, 30, 30,163,111,220,184,225, 96, 48, 24,144,146,146,
-130,252,252,252,232,255, 68,157,170,107,145,127, 24,222, 14,134, 63,243, 7,161, 85,177,182,208, 53, 0, 96, 8, 66,249, 52, 38,
-134,195,226,241,198,254,118,224, 0,159,203,229, 34, 45, 45, 13,177,177,177, 80, 93,185, 2,245,157, 59,200,203,203,131, 66,161,
-128,189,189, 61,182,239,220, 41,214, 81,204,196, 23, 47, 95,178, 24,146,169, 30,111, 80,227, 20, 79, 62,159,223,123,232,208,161,
-181, 10,178,236,236,108,244,237,219,151,195, 98,177,106,154,213,240, 54, 39, 33,179, 37, 78, 95, 57,190,204,209,145, 23, 11, 36,
-206, 6,202,163, 1, 70, 11, 24,117, 64,214, 51,224,204, 18, 52, 85,196, 19, 23,150,141,115,112, 18,177, 79,215,160,148,235,155,
-138,234,238,233,233,249,235,216,177, 99, 73, 0,232,217,179, 39,225,233,233,185, 3,128,123, 29,199, 92,174,167,147,188, 87, 82,
- 82,130, 17, 35, 70, 88, 55,111,222,252,242,136, 17, 35,172, 43, 63,127, 87,206, 74,107,114,155, 54,109,138, 4, 2,193, 65,192,
-164, 6,182,138,211,210,210,114, 75,223,190,125,135, 31, 56,112,128, 11, 0,215,174, 93,195,233,211,167,241,252,249,115, 36, 36,
- 36,208,126,126,126,182, 27,127, 61,186,109,203,207,123, 55, 12,238,236, 35,235,209,193,175,181, 68, 81,162,176,183,183,239,204,
- 48,140,187,137,229,236,187,100,201,146,216,184, 87,105, 22, 36,155,195,230,114,216,124,115,115,177,189,212, 76,236,108, 37, 18,
- 56,241, 73, 66,162, 82,169,114, 15, 30, 60, 72, 3,232,107, 42,231,178,101,203,146,227, 18,211, 44, 9,146,205,230,176, 57, 92,
-137, 68,100,249,113,112,144, 63, 0,112,193,112,229,114,121,222,238,221,187,245, 13,225, 92,180,104, 81, 76,113,169, 66,202,230,
-112, 56,108, 54,171,234, 92,138,133, 66, 91, 17,159,207,211,106,181, 89, 63,254,248,163,186, 33,156, 75,150, 44,137,125,241, 42,
-221,138, 36, 8, 22, 65,144,108,115, 51,177,181,181,133,200,214, 86, 34,180, 17,177, 89, 60,185, 92,158,181,111,223, 62,147, 56,
-245,122, 61, 55, 47, 47, 15,113,113,113,112,241,247,199,165, 75,151,208,164, 73, 19,140, 24, 49, 2,163, 70,141,130, 80, 40, 68,
-207, 64,111,204,157, 59, 23,175, 94,189,130, 94,175,231,215,196, 89, 25, 39,245, 54,100, 50, 89, 84,125, 55,207, 91,199,190, 81,
- 78, 95, 7, 48,155,117,159, 13,172, 46,176,106,227,183,178,178,162,106,178,118,189,205,217,183,111,223,249, 87,174, 92,105,190,
-111,223,190,129,161,161,161,183,246,237,219,135,142, 29, 59, 34, 46, 46, 14,174,174,174,216,179,103, 15, 70,141, 26,117,107,211,
-166, 77, 3,163,162,162,124,220,220,220,230,213,199, 57,114,228,200, 47,125,125,125, 35,115,115,115, 3,139,139,139,189,194,195,
-195, 39, 14, 25, 50, 36,121,244,232,209,189,170, 4,163,193,112,224,204,169,227,232, 55,112, 40, 90,181,245,218, 54,126,222,126,
-239,122,158, 77,230, 57,176, 99,119, 78, 78,193, 1,141, 70, 53,130,195, 17,137,238,223,183, 58,246,243,207, 54,213,167,124,103,
-101,101, 97,192,128, 1, 28, 46,151,219,181,158,114,174, 25, 60,120,240,136,240,240,112,105,165, 85,231,206,157, 59,120,246,236,
- 25, 82, 83, 83, 81, 90, 90,138, 94, 83, 20,248,124,213,107,238,207, 87, 49,232, 51,141, 17,191, 99, 27, 82, 5, 97, 19, 56, 88,
-155,179,111, 79,252,177,213,180,207,182,181, 97, 75,172, 56,248,237,187, 4, 20,166,104,143,213,194, 73, 4, 6, 6,238, 15, 9,
- 9, 33,116, 58, 29,116, 58,157, 14, 64,141, 89,125,157,156,156, 4,237,218,181,195,148, 41, 83, 72,115,115,243, 77,181,149, 83,
-169, 84,106,207,158, 61,139,208,208, 80,204,156, 57, 19, 45, 90,180,128, 84, 42, 5,135,195,193,222,253,135,109, 70, 77,156,218,
-242,131, 46,221,124,218,124,208,177, 93,185,150,229,207, 17, 74, 39,215, 98, 13,169,177,238, 10,187, 40,196,164,220,197,230,129,
-153,244,131, 61, 42,197,183,159,252, 43,254,197,245,188,231,243, 66,118,196, 48,119, 59, 21,238,255, 42, 29,121,134, 56,116, 29,
-209, 20,110,190,210, 89, 98, 23,120,190,235,249, 52, 17, 13,226,244,246,246,238,242,224,193, 3,126,183,110,221,144,150,150, 6,
- 14,167,106, 60, 69,189, 79, 57,151, 44, 89,194,215,104, 52,120,242,228, 9,198,141, 27,151,165,215,235,103,189, 79, 57, 27, 98,
-209,170,212, 34,255, 48,236,120,107,203,169,205,162,181, 4, 0, 12, 52, 78,143, 29, 55, 81, 21, 17, 17, 33,226,241,120, 72, 75,
- 75, 67, 78, 78, 14,246,238,222, 77,245,180,179, 43, 15,118,114,146,239,221,189,155,209,233,116, 96, 24, 6,158,158,158, 24, 62,
-124,184,112,216,136,209,249,132, 92,125,216, 4, 55,143, 99,165,127,125,226,196,137,127,248,254,219,111,191,133,185,185, 57, 8,
-130,112, 48,161,114, 33, 51,150, 12,118,150,186, 89,230, 49,185,123,139,193, 18, 0,108, 51,128,109, 14, 8, 44, 0,190, 25,192,
- 19, 65, 27, 21, 89, 76, 50,193,169, 67,187,126,234, 4,160, 33,174, 30,200,100,178,133,145,145,145,182, 81, 81, 81,140, 92, 46,
- 71, 78, 78, 14,179,114,229, 74, 91,153, 76,182,240, 93,175, 72,118,118,246,178,126,253,250,229,141, 27, 55,206,226,252,249,243,
- 46,227,198,141,179,232,215,175, 95, 94,118,118,246,178,247,185,210, 92, 46,151,245,252,249,115,171,229,203,151,143, 2,240,168,
-109,219,182, 69, 78, 78, 78,143,240, 58,104,178, 78,152,153,153, 85,137,172, 74,235, 26,155,205, 6,135,195,129, 76, 38,211, 21,
- 23, 23, 83, 93, 63,112, 23,122, 90,144, 6, 25,159, 43,180, 18, 10,156,205,204, 45, 2,138,138,138,158, 18, 4,145,100,162,139,
-207,183, 67,135, 14, 28,138,225,208,159,143,237, 41,155, 54, 33,200,238,167,229,147,155,252,184,236, 51,167, 53,139, 39,121, 46,
-155, 51, 38,136,164,105,141,171,171,171, 67,101, 64,187, 9,230,115,191,246,237,219,179,105,112, 16,247, 50, 53, 47, 45, 51,171,
-252,195, 30,129, 85,150,203, 54,190,126,193,182,182,182,221, 60, 61, 61,219, 19, 4, 97,210,148,100,161, 80,232,219,170, 85, 43,
- 54,201,226, 16,214, 82, 51, 23, 51,137,208,190,202,133, 98,105,217,201,202,214, 54,132,100,152, 50, 71, 71, 71, 59,161, 80,232,
-219,128,186,179,105,112, 97,111,103,101, 97,107, 99, 41, 9, 14,234,220, 34,176, 83, 96, 75,239,128,142,129,109, 63,104, 63,140,
- 48, 26,229,238,238,238,118,149, 65,242,245, 88, 90, 5, 7, 14, 28,192,242,229,203,209,174,105, 83, 56, 57, 57,193,206,206, 14,
-119,238,220,193,131, 7, 15, 32,149, 74,145,159,159,143,181,107,215,226,196,137, 19,208,235,245,102, 13,189,159, 76, 17, 91,117,
-193,104, 52,146,111, 11,172,218,248,133, 66, 33, 93, 25, 36, 95, 27,206,158, 61,187,191,210,146,245,213, 87, 95,117,217,184,113,
-227,173,248,248,120, 72, 36, 18, 60,120,240, 0, 19, 39, 78,188,181,105,211,166, 46, 83,167, 78,197,238,221,187,145,156,156,188,
-179, 46,190,145, 35, 71, 46,158, 52,105,210,143,215,175, 95, 39,237,237,237, 33,149, 74, 49,120,240, 96,236,220,185,147,109, 52,
- 26,119,133,132,132, 60, 14, 9, 9,121, 76,101, 92,156,127,244,215,149,119, 98,158, 62,198,151, 51,190,225,233,140,134, 48, 19,
-170,207,168, 37,146,114, 99,183,110,197, 71, 12, 6,213, 72, 46, 87,100,241,248,177,213,233, 93,187,170,196,214,220,185,115, 97,
- 97, 97, 1,188, 14, 96, 70, 29, 86,157,207, 78,156, 56, 81,213, 30, 90, 91, 91,131,199,227,129,203,229,130,195,225,128,197, 98,
-225,242, 54, 49,126,158,251, 90, 95,252, 60,151,192,197, 45,132,242,125,174,157,200, 9, 94, 82,123,222,227, 47,246,180,245,241,
-234,101,141, 59,135,114,177,178, 95, 84,230,131, 35, 5,179, 53,249, 88, 87,203, 97, 31,124,251,237,183,109,242,243,243,241,240,
-225, 67, 60,124,248,176, 54, 11,144,230,212,169, 83, 63, 40, 20, 10,184,185,185, 97,208,160, 65,221, 0,248,215,242,220,160,125,
-251,246, 24, 48, 96, 0,130,130,130,208,174, 93, 59,232,244, 70, 78,200,216,207, 90, 61, 79, 46,112, 90,185,118,165, 40,242,106,
- 56,121,235,214,117,214,254,227, 23, 45, 2,131,250,252,200, 53,115,188, 7,161,181,163, 41,245, 84, 81, 69,240,117,252, 24, 59,
-174,204, 32, 55, 95, 27, 39,217,123,122,179,187,153,153, 25, 17,253,240,177, 97,239,214, 35,233, 94,226, 65,249,247, 14, 21, 65,
- 69,228,162,215, 4, 55,146, 6,134,255, 93,122,118,129, 64,176,241,250,245,235, 14,122,189, 30, 49, 49, 49,152, 57,115,166,230,
- 61, 41,171, 12, 32, 46, 46, 46,184,118,237, 26,198,140, 25,163,201,203,203,187,251,159,170, 83,117, 45,242,255, 5,236,106, 10,
-178, 10, 25, 25, 25,165, 82,169,212,169, 85,171, 86,164, 78,167,123,237,146, 56,118,140,250,117,215,174, 51, 26,141,102, 6, 0,
-238,150,159,126,218,230,228,236, 28, 52, 54, 52,148, 48, 24, 12,232,215,175, 31, 47, 34, 34,194, 58, 41, 63,191,220,132, 14,231,
-141,223, 27, 63,126, 60, 54,110,220, 8, 0,152, 62,125,122,149,105,157, 48, 33, 96, 73, 98,129,190,193,253,219,155,103,136, 55,
-155,235, 59, 25, 20,205, 94,153,221, 19, 43,132,237, 65,242,216, 16,176, 64,235, 13,198,132,252, 33,143, 94, 37,180,110, 35, 44,
- 46,114,237,221,182, 59,126,189,180,175,175,138,210, 28, 49,185,193, 17,137, 58, 72, 36, 18, 60,122,244,168,184,125,251,246,165,
- 12,195, 88, 44, 91,182,204, 70, 36, 18,117,120,143,115,159,242,242,229,203,110,157, 59,119,158, 70,146,100,111,154,166, 47,231,
-229,229,109, 1,144, 98,226,241,159, 3, 88, 4,160,106,100,169,211,233, 64,146, 36, 24,134,193,200,145, 35, 49,119,238,220, 54,
-207,158, 61, 67,100,100,164, 85,239,222,189,239, 1, 40, 5,240, 41,128, 26,173,102,114,185, 92,253,224,193, 3, 97,100,100, 36,
-104,154,134,149,149, 21,204,205,205,193,231,243, 49,120,240, 96, 73, 88, 88, 88,175, 11, 23, 46,228,203,155, 53, 97, 9,114,178,
-148,124,137,196, 12, 14, 78, 93,167,142,254, 36,158, 97,152, 19, 13,104, 28,120, 66,182, 81, 67, 80, 90,114,205,247,155, 72, 17,
-151, 75, 8,184,108,240,105, 21,230,255,176,130,224, 50, 20, 27, 13,244,207,115,185, 92,174, 25, 31, 58, 22,143,101, 16, 17,248,
- 83,178,196,177, 88, 44,158,128, 91,123, 60, 6,135, 36, 73,146, 36,185, 0, 76, 94,180,143,207,231,115,205,248, 76,173,156, 66,
- 22,193, 34, 8,130,135, 90,102,162,249, 58,128,169,180, 34,241,102, 36,105,171,139,226,174, 93,187,226, 76,228, 35, 28, 59,125,
- 25,133,105, 79,177,224,187,175,224,239,239,143,136,136,136, 58,203, 84, 25,163, 85,155,117, 89, 38,147, 69,101,103,103,127, 80,
-219,177,117,185, 12,107,177, 82,253,145,255,123, 11,248, 45,137, 71, 61, 49, 90,131,186,118,237,250,229,129, 3, 7,116, 31,125,
-244, 17,111,228,200,145,240,242,242,234, 50, 97,194, 4, 0, 64,239,222,189,177,113,227,198, 46, 19, 38, 76,192,225,195,135, 17,
- 30, 30,174,237,209,163,199,119,215,174, 93,203,194,235, 25,157,127, 0, 77,211, 3,182,111,223,254,182,165, 16, 70,163, 17, 6,
-131,193,209,104, 52, 58, 86,180, 69,248,241,199, 77,133, 23, 47, 68,224,187,121, 75, 96,103,235,224,107,226, 61, 68,140,255,230,
-155,194, 61,107,215, 98,237,225,195,248,198,213, 85,180, 47, 54, 22, 23, 53, 26, 28,137,140, 44,172,248,157,122, 99, 51,149, 74,
-165,250,236,217,179,230, 71,142, 28,129,165,165, 37, 90,180,104, 1, 43, 43, 43,112, 56, 28,144, 44, 33, 88, 92, 41, 90,181,237,
- 0,224, 1, 0,192, 85, 6,165,167, 27,110, 17, 4, 74, 25,178,225, 49, 69,252, 38,104,102,227, 44,184,254,229,110, 47, 75,115,
- 59, 46,206,111, 73,199,133,205, 25, 39, 52,133, 88, 15, 35, 94,160,246,152,175,246,110,110,110,200,207,207,199,217,179,103,149,
- 64,173,130, 12, 52, 77,255,240,211, 79, 63,125, 59,111,222, 60,190,167,167, 39, 0,248, 2,120, 88,211,190, 98,177, 24, 78, 78,
- 78, 85,194,114,228,184,169,238, 83,102, 79, 21, 14,233, 19, 4, 54,219, 6,165, 74, 3,138,202, 13,144,218, 72,240,221,236, 16,
-193,229,246, 78,254,219, 55,253,118, 74,173,134, 63,240,199,246,128, 32,240,240,254,211, 91,222, 2, 79,128, 32,129, 12,242, 42,
- 8, 16, 80, 16, 6, 16, 44, 22, 67, 81, 20,210,211,211,193, 48, 12,198, 12,153,152,241,217,202,112,187, 46, 99,228,112,105, 37,
- 3,193,160,251,223, 69, 8, 88, 91, 91,251, 22, 21, 21, 33, 37, 37, 5,227,198,141,203, 42, 44, 44,188,164, 84, 42, 39,102,103,
-103, 3, 64,241, 59, 80, 86,137,121, 95, 95, 95,116,232,208, 1, 35, 70,140, 16,168, 84,170, 16,119,119,119,167,130,130,130, 78,
-127,101,125,222,214, 34,255,175,132, 86,141, 15,154,193,208, 74,187,109, 27,148,151, 47,131,119,241, 34,142,200,100, 10,141, 70,
-243, 53,128,140,138, 7,255,171,221,123,246,220, 30,120,247,174,185, 46, 62, 30,238,207,158,129, 99,105,233,219,208, 2,236,218,
-181, 11,114,185, 28,101,101,101, 0,128,205,155, 55, 67, 46,151,195,104,226,130,179,108, 46,186, 56,216,185, 34, 23, 9,160,217,
-164, 36,181,149,170,163, 68, 99,150,237,148,110,175, 44, 35,157, 16,159, 22, 32, 86, 23,233, 58, 18, 44, 29, 52,133, 42, 56,117,
-110, 1, 54,216, 93, 26, 82,198, 74,191, 63,155,205, 46,126,249,242,229,128,150, 45, 91,158, 6, 96,243, 46,241, 0,111, 33, 49,
- 47, 47,111,198,187, 28,200, 98,177, 22, 37, 39, 39,219,237,220,185,115,218,178,101,203,152,234, 66,171,242,127, 54,155, 13,134,
- 97, 96, 97, 97, 1, 14,135, 99,127,231,206, 29,251,128,128,128,173, 52, 77,251,214, 82, 79,198,203,203, 11,201,201,201, 96,179,
-217,176,176,176, 0,109,212, 99,201,236,169,160, 88,124,246,156, 57,115,124,135, 14, 29, 26,179,115,231, 78,131,121, 96,231, 78,
- 69, 69, 69,207,191, 28, 51, 54,230,228,201,147,186,138, 20, 15,245, 15,241, 25,230,113, 66, 66, 2,203, 89,102,207, 98,140, 42,
- 90,204, 5, 4, 79,127,100,120, 18, 7, 8,216, 44,134, 75,144,224, 11,132, 22, 41,153,153, 69, 52, 77,199,153,194, 73,211,116,
-116,114,114,178,208,222,206,154,173, 82,235, 20, 66, 14,195, 75,141,126,148,212,204,175,189, 59, 0,104,162, 31, 92,227,183,106,
- 45, 76,205, 43, 16,187,186,186,154,196,169, 86,171, 31,103,101,101,177,236,237,237,217,105, 25,153,167, 44, 37, 98, 91,115, 75,
-203,142, 0,160, 47, 47,123, 64,106,181, 5, 44, 14,219,190,160,168,168, 88,173, 86, 39,155, 90,247, 87,175, 94,177, 29, 29,237,
- 88,231, 47, 94, 57,109, 47,226,219,153,241,216,230,124,130, 32, 68, 44, 66,206, 53,210,133, 2,145,200, 46, 37, 51,179,152, 97,
-152, 90, 45,132,171, 75,199, 14,121,125,189,150, 28,174,198,141,167, 79,159,226,220,173, 56,136, 25, 29, 8, 77, 25, 46,238,254,
- 5, 99,230,204,123,239,184,191,250,196,214, 59, 89,179,182,183,142,122,139, 31, 57,245, 4,194,143, 25, 51,102,201,254,253,251,
-171, 2, 80,226,226,226,208,179,103,207, 74, 55, 7,130,131,131, 17, 16, 16,128,184,184, 56,120,120,120, 32, 50, 50,146,207, 98,
-177,248, 99,199,142, 93,249,219,111,191,157,173,215,238,191, 99, 7, 38, 78,156, 88, 83, 96,245, 43, 0, 26, 66,234,169,152,187,
-122,175, 77,113, 81, 33,242, 11,114, 31,155,122, 30, 8,130,192,248,111,190, 41,220,174,211,225,192,253,251, 8, 21,139, 69,123,
- 18, 19,209, 47, 32, 0,222, 61,123, 22,154,210,214, 85, 90,117, 52, 26, 13, 56, 28, 14,204,205,205, 97,109,109, 13, 46,151, 11,
- 22, 71, 6, 54,207, 7, 36,151, 11,191,174, 62, 88,251,181, 88, 53,238, 99,108, 34, 8,148,242,121,136,230,138,106,141,213, 33,
-196, 77, 48,152, 97, 32, 87,101,224,106,165, 32,177,104, 10, 11,142, 25,231,226,164,173,158,150,230,118, 92,156,219,148,134,139,
- 91, 51,143,107,114,177,160,226, 92,208,117, 12, 36,188, 45, 45, 45,145,145,145,129,244,244,244, 88,212, 29,224,175,138,139,139,
- 75,226,243,249,109,108,109,109, 1,192,173,182,129, 57, 77,211, 85,113, 88,251, 14, 28,181,241,237,230, 46,248,176, 75, 27,236,
- 61,189, 2, 95,132,108, 2,135, 69,128,162,244, 88,191,177, 63, 40,173, 2, 33, 3, 63, 35,186,247,246,240,185,124, 90, 55,201,
-160, 46,249,229, 15, 3, 1, 54,150,255,107,212, 29, 75,190,132,244, 6, 77, 88,218,216,216,137,185, 92, 46,172,205, 29,117,243,
-166,204,202, 97, 24,166,234,185,225,176,184, 6,178,220, 74, 93,148,171, 16, 90,114,212, 0, 67, 54,123,183,108, 54,127, 62, 50,
- 51, 51,103,116,235,214,109,101,121,121,121,137, 82,169, 28, 3, 0,110,110,110, 77, 73,146,228, 3,168,203, 59,210, 20, 53,167,
-133,224, 62,123,246, 12,102,102,102,200,202,202,170,110,124, 1, 77,211,127,155, 73, 0,127, 83,248, 1,136, 6,224, 8,160, 31,
-170,165,119, 32, 43, 76,117,221, 35, 34, 34,152,136,136,136,238, 85,157, 23,195,208,198,226, 98, 48,218,215,231,150,195,225, 48,
- 0,170,207,104, 18, 89, 90, 90, 18, 28,103,103, 16,252,215,161, 31,204,159, 56,245,213, 96, 48, 45,181, 12, 77,129, 5, 66, 15,
-166,218,160, 69, 41, 32,176,194,166, 23,102,240, 22, 34,151,103, 89,189,167, 3,140, 12, 40,208,172, 6, 22,135, 81, 42,149, 48,
- 26,141,210,230,205,155,159, 49, 26,141,210,138,206,141,249,111, 93, 81,138,162,146, 88, 44, 22,166, 77,155,134, 74,235,143, 78,
-167, 67,110,110, 46,180, 90, 45,116, 58, 29,146,147,147, 81, 86, 86, 6,157, 78,135,231,207,159,195,205,205, 13, 44, 22,203,177,
-142,198,156, 97, 24, 6, 46, 46, 46,104,214,172, 25, 88, 4,131, 95,215, 44,198,252,153, 83, 49,202,141,198,174, 45,235,209,163,
- 71,143,214,174,174,174,129,108, 54,155,114,112,112,224,134,135,135,159,162, 40,106, 48, 76,111,121,206,206,157, 59,183, 89,219,
-182,109,237, 44,205,205, 12,124, 30, 11, 60,131,146,225,107,139, 24,182,170, 16, 46, 46, 77,141, 16,138, 60, 66, 67, 67,169,218,
-172, 16, 53,113,126,253,245,215,142,158,158,158, 22, 82, 75, 51, 37,143,195,202,231,130, 41, 44,123,250,240, 30, 0,240,108,237,
- 52, 16,136,218,140, 27, 55,206,216, 16,206,133, 11, 23,186,217,218,218, 90,146, 96,202, 41,189,254,223,254,118,173,174,136,224,
-112,212,224,242,218, 79,159, 62,157,104, 8,231,183,223,126,235,218,166, 77, 27, 75, 75,115,177,130,205, 97,229,112,105, 58, 71,
- 0, 58,151,163,211,151, 8,108,109, 84, 16, 73,252, 66, 67, 67,107,229,172,180,102,133,133,133,101,188, 37,188, 81, 92, 92, 12,
- 77,110, 12,184, 89,241,240,145,112,224,111, 43, 5,159,207,175,154,250, 94,219,237, 90, 91,140, 86, 77, 98,203,212, 99,219, 47,
-173,195, 5,184,189,117,212,219,121,179,178,179,179,225,232,232, 88,231,243,244,219,111,191,205, 11, 10, 10,202, 15, 14, 14,214,
-157, 57,115, 6, 4, 65, 32, 50, 50, 18, 89, 89, 89, 8, 14, 14, 6,195, 48,149,179,218,240,248,241, 99,244,238,221, 91,215,173,
- 91,183,172,138,252, 90,245, 98,226,196,137, 48, 24, 12, 80, 40, 20, 40, 46, 46, 70, 68, 68, 4,124,124,124, 24,145, 72, 52,148,
-229,210,103, 69,200,164,121,157,188,218,249, 98,235,166,181, 58, 30,155,179,186, 33,207, 43, 65, 16, 24,247,245,215,133,101,126,
-126,197,251,148, 74,213,120,115,115, 81,243,140, 12,171, 71, 23, 46,216,232,245,122,147, 56, 42,173, 58,206,206,206, 85, 34,139,
-203,229,130,205,179, 5, 75,236, 13,158,117, 48, 68, 14, 67,113, 53,154,175,181, 16,227,132,153, 4,231,197,150,181,167,118, 16,
-185, 96, 69,167,145,142,225,157, 71, 57, 94, 17, 53,193,206,138,254,128,100,216, 68,248,132,245, 45,155,219, 54, 19,226,238,209,
- 92, 92,220,154,249,187, 38, 23,139, 1, 36,214,247,156,235,245,122, 13, 69, 81, 32, 73, 18,108, 54,187,122, 76,224,237,223,127,
- 96,217, 72, 25, 0, 0, 32, 0, 73, 68, 65, 84,255, 29,143, 30, 61, 2,170,165,237, 41, 47, 47,167, 88, 44, 22, 4, 2, 1, 0,
- 72,234,104,239,192,225,112,192,225,112,112,237,222, 13,235, 81,195,250, 19,119,158, 92, 66,103,159,209, 40, 82,232,145, 87,166,
- 71,169, 10,104,235,191, 0, 94,189, 79,224,105,114, 57,124,219,121,177, 88, 60,241,184,154,248, 52, 41,200, 80,166, 99,120, 81,
- 44,221, 66,151, 41, 60,119,247,100, 92,236,141, 99, 79,159, 31,250,233,116, 98, 39,255,110,202, 10, 99, 2, 20, 10, 5, 67, 16,
- 4, 51,107,242,188,164,125, 19, 75,168, 77, 99,158,210,108,173,224,213,127,176,169,111,106,107,107,123,199,218,218, 58,178, 66,
- 28, 53, 53, 51, 51,187,237,232,232, 24,143,215, 19, 61, 78,230,228,228,120, 42,149,202,206,120, 61, 57, 43,173,168,168,168,103,
-133,229, 41,173, 14, 75,216, 78,185, 92,254, 21, 69, 81, 3, 43,182,143, 41,138,242, 77, 72, 72,104,227,235,235, 27,235,238,238,
-254,216,221,221,253,156,187,187,251, 41,119,119,247, 83, 65, 65, 65, 27, 43,211, 61,252,197,110,195, 63,104,145,127,152,208, 66,
-133,200,218, 81,241,138, 42,161, 5,224,218,219, 1,104, 70, 62,255,185,241,203, 47, 97,121,234, 20, 56, 9, 9,152, 48,110,156,
-185, 72, 36,218,132,215, 57,154, 58, 75, 36,146,173,139, 23, 47, 54,179, 89,181, 10,178, 27, 55,144, 26, 17, 1, 3,135,243,240,
- 93, 74,167, 86,171,193,102,179,171, 44, 49, 98,177, 24, 20, 69,161, 38,147,239, 31, 30, 64, 35,238,102,229,197,131,135,102,160,
-193, 40,206,203,187,221, 31,157,180,192, 46, 66,238,230,145,168,228,122, 44,181,237,104,183,169,105,151,251, 74,130,173,224, 89,
- 10,144,158,158, 1, 10,116,131,252,205, 26,141,166, 76,169, 84,194,215,215,215,250,209,163, 71,205,125,124,124,172, 42, 62,127,
-240,158, 23, 38, 80, 38,147, 29,117,114,114, 74,145,201,100, 71, 1, 4, 54,224,216,157, 55,111,222, 4,139,197,194,226,197,139,
- 81, 94, 94, 14,189, 94,143,162,162, 34,164,167,167, 67,167,211, 33, 51, 51, 19, 47, 94,188,128, 78,167, 67,106,106, 42,180,218,
-250, 7, 36, 52, 77,195,220,220, 28, 26,181, 2, 63,175,152,143,133, 97,179, 81,246, 42, 10,153,217,121,176,180, 16, 99,198,140,
- 25, 44,169, 84, 74,211, 52,221,140,162,168,222, 52, 77,111, 51,229, 58, 85,187,223,110,185,184,184,120,173, 89,179,166,205,252,
- 21,219,184,230,108, 5,195, 55, 19,208, 60, 51, 62,195,107,221, 17, 19, 23,108,226,254,184, 97,221,203,187,119,239,102,193,180,
-228,157, 36,128, 91,126,126,126, 45,179,178,178,124, 60, 61, 61, 91,217, 52,117,229,243, 29,157, 74,185,142, 77,228,140, 86,115,
-159,112,106,210,117,219,182,109, 49,183,111,223,206,110, 8,167, 88, 44,110,189,119,239, 94, 47,123,123,123, 47,142, 80, 40, 80,
-149,149, 29, 49,170,148, 71, 89,150, 82, 1,105,110,249,241,137, 19, 39,162,142, 31, 63,158,219, 16, 78, 15, 15, 15,207, 21, 43,
- 86,180,245,246,246,110,235,224,214,156, 47,116,114, 41, 18, 56, 55, 45, 18,122,251,240,225,220,236,163,173, 91,183, 62,190,123,
-247,174, 73,156, 44, 22,203, 72,146, 36, 56, 28, 14, 68, 34, 17,206,159, 63,143, 47, 39,141,134,139,147, 53, 90,121,122,162,215,
- 23, 95,225,248,241,227, 85, 49, 60, 44, 22,171,214, 30,125,207,170, 25,167,253, 28,137, 40,108,111, 29,133,237,173,163,252, 28,
-137,168, 90,197, 86,197,247, 53,237, 99, 82,107, 84,139,187,209, 4,177,117,246,218,181,107, 63,140, 31, 63,158,215,183,111, 95,
-220,191,127, 31, 19, 39, 78,188, 21, 30, 30, 14, 0,184,127,255, 62,102,205,154,117,235,202,149, 43,152, 58,117, 42,122,246,236,
-201,187,121,243,230, 86,152,144,251,199,104, 52, 98,215,174, 93, 48, 26,141,144, 72, 36,176,178,178, 66,255,254,253, 17, 19, 19,
- 51,117,247,238,221,241, 44, 14,231,147,126, 3,135,225,204,169,112,188,120, 30, 51,117,207,202,177, 13, 78, 10, 76,146, 36,250,
-142, 27, 87, 88,216,182,109,241, 30,185, 92,245,169, 84, 42,242,204,205,181,186,122,244,168,141, 9, 66,141,160, 40,170, 74, 92,
- 85,138,142,202,141,205,179, 5, 91,236, 5,182,153, 63,158, 38,114, 13,220, 0, 68,243,252, 17, 87, 87,254, 44, 14,143,156, 56,
-116,190, 27,134,206,119,195,160, 57,174, 19, 68, 77,240,171,184, 9, 62,239, 59,179, 89,144,187,191, 5,228,249,122, 68,172, 79,
- 77,211, 20, 97, 21,128, 23,166, 60,231, 52, 77,199,102,101,101,129,199,227,161, 73,147, 38, 45, 1, 84,198, 5,238,156, 60,121,
-242,244,165, 75,151,206, 6,176,180,226, 51, 73, 80, 80, 80, 91,133, 66,129,132,132, 4, 0,120, 84,135, 53,184,106,150, 97,177,
- 60,149,239, 42,243,134, 79,235, 41,144, 74,219, 33,171, 88,135,236, 98, 29,126,253,121, 48,162,110, 46,199,163,139,161, 72,203,
-205,133,208, 97, 8, 40,163,214,203,132, 65,189,236,201,147, 39,196,205,155, 55, 9,154,166, 97, 48, 24,152,114,185,156,137,190,
-117, 11,234,235,215, 9,115,115,115,162, 75,135,110,138, 61,203,207, 60, 56,177,229,214, 35,189,170,193, 3,245,247,193,194,164,
-164,164,192,163, 71,143, 6, 1, 88,232,237,237,125, 55, 61, 61,189,211,141, 27, 55, 90, 57, 59, 59,111,122, 87,210,202,180, 16,
-169,169,169,111,108, 21,105, 33,116, 21,162,161,111,133,152, 27, 4, 96, 22,222, 99,150,125, 3,112,237, 31, 28, 12,127, 6,111,
-205, 54,124, 91,104, 85, 79, 20, 6,119,169,212,204, 96,208,103, 94,186,116, 73, 79,146, 36, 68, 34, 17,198, 79,156, 72,254,252,
-211, 79, 93, 71, 7, 6, 70,126,246,225,135,231, 34,175, 92,241, 11, 8, 8, 0,195, 48, 32, 73, 18,135, 15, 31, 86,107, 52,234,
- 34, 23, 23, 23, 75, 83, 26,141,234, 15,144, 92, 46,175, 18, 90,101,101,101,176,183,183, 55,217,117,168,148,227,242,149,243, 81,
- 37, 12,245, 69,122,223,196, 13,250,213,185,131, 3, 74,105,138, 93, 70, 25, 80,166,102, 80,174, 1,251, 62,105, 21, 48,222, 99,
-136, 62,185,119,192,139,235,241,119,138, 52,148,166, 65,179, 37,242,243,243,231,135,132,132, 20, 57, 58, 58, 18,230,230,230,112,
-114,114, 34, 7, 13, 26, 84,152,145,145,177,244, 93,175,136,181,181,245,168,160,160,160,211, 89, 89, 89,195,175, 95,191,222,236,
-198,141, 27,195,131,130,130, 78, 91, 91, 91,143, 50,145,226,200,188,121,243,148, 60, 30, 15, 29, 59,118, 68,121,121, 57, 42,102,
-249,212,185,153,226, 34,229,114,185,216,190,102, 17, 22,134,205, 70,113,252,125, 60,189,117, 9,215,114, 9, 44, 88,177, 14, 92,
- 46,247,157,114,125,181,176, 21,121,123,203,204,226,102, 77, 28,153, 61, 55, 44,204,236,241,227,199,156,233, 51,103, 49,169, 57,
-197,224,245, 93,203, 66,247,249,228, 19,165, 45,250,125,220, 11,139, 23,126,227, 93,145,180,179, 78,180,182, 21,121,123,201,204,
- 98,191,249,108,116,210,204,153, 51,133,171, 87,175,214, 4, 6, 6,170,243,242,242,132, 98,169,149, 39,219,194,210, 43, 53, 39,
- 87, 18, 24, 24,152,252,197, 23, 95,148, 54,148,115,193,130, 5,162, 11, 23, 46,176, 67, 66, 66,140, 37, 37, 37, 18,142, 80,232,
- 75,240, 5, 29, 10, 74, 74, 44,134,135,132, 36, 14, 31, 62, 92, 85,145,176,212,100,206,239,191,255, 94,244,226,197, 11,118, 96,
- 96,160, 33, 55, 55,215, 76,108,109,227,195,178,180,242, 79,201,201, 51,239, 16, 16,240,106,250,244,233,202,186,202, 89, 93,164,
-152,153,153,101,117,238,220, 25,235,215,175,199,143, 63,254,136,143, 62,250, 8, 49,207, 99,208,111,250,108,180,249,124, 22, 78,
-221,185,135,172,172, 44, 44, 91,182, 12, 62, 62, 62,224,114,185, 47,106,124, 30,167,198, 19,143,115, 65, 60,206, 5, 65, 76,141,
- 39, 42,223,215,106,217, 90, 90,134,234,251,215,180,223,163,239,107,182,116,249, 57, 18, 81,117,197, 97,213, 39,182,134, 15, 31,
-254,101,101, 10,135, 79, 63,253,244,214,166, 77,155,186,124,250,233,235,129,118,199,142, 29,177,124,249,242, 46, 11, 22, 44,184,
-181, 98,197, 10,244,234,213, 11,238,238,238,245, 78,124,161, 40, 10, 70,163, 17,163, 71,143,134,209,104, 68, 65, 65, 1, 94,190,
-124,137, 29, 59,118,128, 97, 24, 1, 0, 56,202,156,219,243,120, 60, 60,137,126,168, 90,248,105,192,111, 13,176,100, 17,213, 7,
- 49, 10,133, 2,195, 63,255,188, 48,179, 69,139,226,109,133,133,170, 73, 82,169,200, 53, 45,205,202, 76,167,115, 66, 29,113,137,
- 4, 65,128,166,233, 42, 97, 85, 41,184,222,222, 42, 58, 74,147,160, 87,209,103,111,236,207, 6, 0,116, 27, 43,195,160, 57,174,
- 19, 28, 61, 68,155,187,142,121,109,244, 62,190, 60,137, 41,207,166, 86,195,128,216, 6, 88,172,239,223,191,127, 31,150,150,150,
- 8, 9, 9,225,147, 36,185,170,114,188,138,215,185,179, 54, 84,114,241,249,252,181,161,161,161,100,105,105, 41,158, 62,125, 10,
- 0, 87,106,107,151, 24,134,169,170,187,162,152, 0, 69,243,112, 59,250, 60, 46,222, 56,134,148,172, 2,164,229,107, 0,182, 5,
- 52,202, 76,232,213, 89,208,149, 70, 67,174, 21,153, 84, 96, 46,151, 91,224,237,237,205,248,251,251, 51, 12,195,224,213,171, 87,
-198,212,180, 52,227,195,141, 27,153,103, 83,166, 16,102, 47, 95,114,133, 66, 33,225,230,230, 6,129, 64, 64, 11, 4,130,162,255,
- 96,231,253,151,164, 91,248, 11,210, 66,252,153, 86, 45, 6,255, 76,228,224,205,217,134, 85, 9, 76,107, 74, 88, 10,198, 92, 56,
-242,216,214,159, 45, 66, 70,143, 85,250,248,248, 72,157,156,156, 64, 16, 4, 6, 15, 25, 66, 4, 93,191,110,198,145,201, 96,253,
-193, 7, 85,238,136,203,151, 46,225,252,249,243,202, 51,191,159,112,154, 56,105,210, 0, 0,123,235, 40, 12,155,207,231, 87,253,
-110, 78, 78, 14,248,124,126, 85, 76,132, 92, 46,135,173,173, 45,114,114,114, 76, 93,249,122,223,220,176,123, 97,249, 1,243,221,
- 2,204, 56,196, 57,101, 46, 40,134, 1,135,160, 0, 53, 3, 3, 5,104, 13, 12,218,187,178,172, 46,170,141,210,136,251,225,201,
- 0,246, 53,228,236,105,181,218,171,143, 31, 63,158, 66,211,244, 49, 0,228,245,235,215,233,216,216,216, 47, 97,122,224,250, 31,
-205,246, 34,209,156,200,200, 72,171, 57,115,230,148, 68, 68, 68,148,245,239,223,223, 98,199,142, 29, 86, 61,123,246,156, 83, 84,
- 84,116,200, 20, 67, 96,122,122,250,222,140,140,140, 47,253,253,253, 81, 92, 92, 12,189, 94,143,168,168, 40,120,120,120,224,209,
-163, 71,104,217,178, 37, 30, 62,124,136, 86,173, 90,129,162, 40,104, 52, 26,208, 52, 77,213,215,152, 23, 23, 22, 0, 69,233,200,
-190,127, 14, 47,159, 69, 33, 50,155,192,150, 67,167,209,164,153,219, 59,229,169,105,105, 39,106,235,104,107,125,113,245,146,239,
-237, 82,175, 30, 70,248,174, 45,244,181,115,231,218,240,204, 48,165,251,232,175,134,233, 12,104, 10,128,215, 41,192, 31,125,165,
- 47, 40, 81, 51,228, 70,198,214,157, 96,177,165,157,168,173,189,141,245,133,127,173, 90,106,246,234,252, 30, 28,217,190,158, 57,
-190,255,160,143, 6, 8,104,219,182,109, 95,146, 36, 45, 1,104, 42,226,188, 76, 90,218,166, 38,206,203,167, 79,251,105,128,128,
-147, 39, 79,246, 21,137, 68, 14, 0, 12, 42,149, 42,233,125, 56,175, 68, 68,248, 85,150,147, 32, 8, 59, 0,122,134, 97, 94,161,
-129, 75,240,140, 24, 49, 98,249,172, 89,179,194, 40,138,178,173, 54, 58,103,173, 93,187,150, 77,211, 52,139, 97, 24, 61, 73,146,
-250, 11, 23, 46, 80, 70,163, 49, 91,163,209,124,254, 62,173,200,176, 97,195,112,239,222,189, 37,120, 61, 9,195, 84,107,245, 27,
-113, 90, 21, 75,246,188, 51,255,245,235,215,151,125,242,201, 39,115, 15, 29, 58,244,114,211,166, 77, 3,167, 78,157,138,195,135,
- 15,163, 69,139, 22,120,242,228, 9,230,207,159, 15, 0, 93, 22, 44, 88,112,106,231,206,157,238,169,169,169,107, 77,176,104,192,
-104, 52,226,224,193,131, 24, 60,120, 48,108,109,109, 33,147,201, 64, 16,196,213, 73,147, 38,253, 4, 0, 44,130,197, 5, 0,173,
- 70,171,245,244,244, 55,217,130,203,229,114,171,218,186,220,220,220,170,153,130,125, 62,249,164,240,215,213,171,241,155, 90,141,
- 73, 82,169, 40,211,217,217,241,212,171, 87,159, 61,127,221, 56, 51,117, 89,117,234, 19, 89,166,134, 52,168,115, 48,239,247,149,
- 41, 14, 0, 62,234, 54, 86,134,110, 99,101,240, 31,100, 71,144, 44, 2,207, 46, 22, 33,230,114,241,113,131, 28, 87,209,176,229,
-114, 98, 87,173, 90,117,170,123,247,238, 3, 91,183,110,141,201,147, 39,127,177,107,215, 46,174,193, 96,152,137,127,167,121,176,
- 32, 73,114,233,246,237,219, 63,179,178,178,194,205,155, 55,113,227,198,141,171, 0,210,107,107,151, 0, 84,229,204,106,226,210,
- 82,243, 34, 85, 33,202,207,186,141, 91, 55,127, 71, 11,159,175, 32,116, 24, 0, 43,207, 21,208,199,255, 8, 93,209, 69, 88,185,
-244, 71,102,234, 43,176,216,252,152,250,130, 80, 24,134,121,158,153,153,233,238,238,238, 78,164,164,164, 24, 1, 48, 20, 69, 49,
-250,174, 93, 13,109, 86,175,230,196,124,241, 5,209,233,197, 11, 22, 67, 16,116, 84, 84, 20, 0,196,253, 55,122,241,202,116, 11,
- 49, 49, 49,181,165, 91,104, 16,188,189,189,187,220,184,113,131,175,209,104,112,237,218, 53,116,232, 80, 53,183,235,191,154,253,
-190,186, 22,249,135,225,179, 26, 62,219,241,134, 69,235,141, 27,155, 38, 56,173, 90,182,164,184, 36,118, 15, 30, 48, 64,245,248,
-241,227,170, 81,159,230,193, 3, 40,207,159, 7, 69, 81, 96, 24, 6, 55,174, 95, 71,232,216,177, 10, 14,139,248,213,213,181, 25,
- 67, 48,111,228,110,233, 93,195,232, 33, 36, 36, 36,164,170,241,201,200,200,128, 88, 44, 6,143,199, 3, 77,211, 48, 26,141, 96,
-177, 88,176,176,176,128,209,104,172,201, 4,243, 54,167,129, 42, 86, 14,223,217,111, 76,142, 76,161,103,166, 88,186,162, 41, 87,
- 88,245,112, 58,152, 19, 24,232,195,129, 13, 59,159,185,178,246,195,108, 90, 91, 52, 28,127,156,209, 85,223,148,255,150,237,218,
-181,251, 41, 52, 52,148, 4,128,222,189,123,147,237,218,181,219,140,186,151,202,169,147, 83, 32, 16,240, 1,224,244,233,211,197,
- 47, 95,190,252,232,244,233,211,197,213, 63, 55,145,115,199,154, 53,107, 32, 18,137, 96, 52, 26,161,211,233,170,226,179,170,191,
-234,245,122,216,216,216,224,204,153, 51,160, 40,234, 76,125,229,116,105,218, 12,132,109,115,236, 61, 29,137, 27,133,220,119, 17,
- 89, 85,156,205, 29,196,173, 28,108,172, 47,253,107,229, 50,219,146,196, 40,100,102,102, 50, 23,206,159,185,171, 1,178,202,202,
-177,176, 84,137, 86,106, 29, 4, 29,220,145,126,105,251,119,204,130,110, 48,160,230, 89,131, 85,156,109, 28,196,173,156,108,173,
- 47,172,251,215, 74,179,210,196, 40,228,228,230,226,236,153,211,143, 53, 64,165,187,113, 2, 77,211, 94, 52, 77,123, 1,152, 80,
-135,120,105, 16,167, 74,165,242, 86,169, 84,222,127, 38, 39,195, 48,222, 12,195,152,204, 89, 61, 38,106,195,134, 13,241, 57, 57,
- 57,161,249,249,249,193,149, 91, 73, 73, 73,111,133, 66,209, 67,165, 82,117, 85,111,104,102,161, 82,169,236, 20, 10,133,163, 70,
-163,105, 15, 32,170, 1,247,124, 21,170,103,157,206,201,201, 89,156,147,147, 67,212, 87, 78,214,231,241,196,129,117,223,252,190,
-125,251,118,199,247,228,127,163,156,133,133,133,199, 14, 29, 58,228,235,230,230,230, 62, 97,194, 4,108,219,182, 13,155, 54,109,
-210, 2,192,206,157, 59,181,213, 44, 89, 46,169,169,169,254,181,184, 13,123, 87,179,150,236,235,211,167, 15,115,227,198, 13, 12,
- 30, 60,184, 42,145,232, 47,191,252, 2,163,209, 40,239,213,171, 23, 13, 0,106,141, 74,206,208, 12,116,250, 90,253,239,127, 56,
-159, 60, 30,239,227,234,249, 2, 43,147, 49,243,120, 60, 48, 12,131, 86, 93,186, 20,150,250,248, 20,239, 42, 43, 83, 45,246,246,
- 54,255,204,211,115, 66,107, 96,108, 77,156, 4, 65,188, 97,213,121,123,107,128, 37,171,122, 57,243,213,217,152,252,251,202,148,
-243,149,150, 45,129,132, 13, 77,185, 17, 39, 86,167, 20,104, 10,240, 75,109,226,167,174,186, 23, 23, 23, 79, 95,189,122,181, 86,
- 42,149, 98,216,176, 97, 88,177, 98,197,164, 46, 93,186,148,217,217,217,221,107,209,162,197,179,145, 35, 71,230, 68, 69, 69, 77,
- 15, 10, 10, 66, 66, 66, 2,214,173, 91, 87, 90, 82, 82, 50,166, 46, 78,130, 32,170, 44,121,131,250,245, 46,254,121,243,122,186,
- 87,247, 47, 33, 18,154,195,192,113, 65,177,194,128, 18, 37, 3, 29, 63, 0, 60, 46, 31,193,129,109,113,239,194, 30, 21,165, 83,
-238,173,239,158, 87, 40, 20,199,199,143, 31, 47,231,114,185,208,233,116, 12,135,195, 1,255,117,220, 49,205,249,232, 35,125,167,
-216, 88, 35,197, 48, 52, 65, 16,248,250,235,175,149, 37, 37, 37,135,222,229, 57,106, 0,170,115,254, 89,233, 22,122,191,213,255,
-252, 25,105, 33,254,138,186,255,147,177,163,134,237,223, 22,173,202, 41,149,149,175, 4, 65, 83, 20, 69,195,213,205,213, 44, 53,
- 37,125,203,136, 17, 33,159,246,237,219, 79,212,175, 95, 63, 65,219,248,215,163,209,211,167, 79, 35, 60, 60, 92,117,241,226, 69,
- 57,159,195,218,233,210,196,197,158,162,104, 16, 4, 93,167, 26, 54, 51, 51,155, 57,111,222, 60, 97, 89, 89, 25, 54,109,218, 68,
-251,250,250,146, 98,177, 24,122,189, 30, 59,119,238, 52,180,109,219,150, 67,146, 36,202,202,202, 64,146,228, 11, 19, 43,248,180,
- 44, 61, 43,248,167,160,161,225,254,211, 38, 90,183, 9,234, 36,237,225,226, 4,195, 7, 12,178, 51, 82,240,242,202,197,146,231,
- 23, 54, 22, 65,147, 55, 20,245, 47, 15, 84, 83, 71,176,232,226,197,139,118,211,167, 79,103, 52, 26, 13,145,158,158,206,172, 92,
-185,210,110,242,228,201,139,178,179,179, 71,189,227, 69, 33, 74, 75, 75, 65, 16, 4, 93,209,144, 84,142,250, 27,226,151,139,217,
-187,119,239,201, 33, 67,134, 12,234,213,171, 23,226,227,227,171, 92,132,213,133, 86,229,236,195, 85,171, 86,149, 2,152, 91, 31,
- 41,135,195,193,166,189,199, 80, 90, 82, 8,123,123, 25, 4, 66, 33,222,117,134, 37,143, 36, 23,255,176,236,123,187,194,184,123,
- 68,204,221, 72,250,232,211,188,124, 35,197,212,156,241,191, 60,155,169, 80,255,117,143,102, 72,214,226, 31, 86, 46,181,168,116,
-107, 30,138,206,145, 19, 20, 51,253,189, 30,145,127, 10,231,127, 24, 50,153, 12, 57, 57, 57,132, 76, 38, 99, 42, 98,180,152, 58,
-132,214,155, 55,248,107,119, 25, 81,151,219,240, 93,249,147,147,147, 87,126,240,193, 7,223, 36, 36, 36, 28,109,211,166,205, 84,
- 0, 77,180, 90,109,233,130, 5, 11,254,181,115,231,206, 79, 77,177,100, 1,192,225,195,135, 55, 78,156, 56,241,252,128, 1, 3,
-190,163,105,186, 93,181,142, 61,217,206,206,174,202,133, 91,144,151, 27, 54,229,211,209, 97, 10, 69,137,201,121,238, 36, 18,201,
-103, 11, 22, 44, 16, 40,149, 74,108,221,186,149,110,219,182, 45, 89, 57, 40,218,191,127,191,177,101,203,150,236,144, 47,191, 44,
-220,144,155,139,229, 55,111, 42,195,188,188,124,119,189,124,217, 30, 52,189,175, 54,171, 78, 77,150,172,202,176,139,119, 68,118,
-133,216,250, 5,192, 71,157, 70, 56,224,228,154, 20,148,164,234,254, 5, 35, 94,193,132,101,129,106, 64,230,241,227,199,131,243,
-242,242, 78,126,255,253,247, 22,237,219,183,135,151,151, 23, 71, 34,145, 4, 84,166,139, 41, 43, 43,195,229,203,151,177,109,219,
- 54,221,243,231,207,135,212,229,174,162, 40, 42,191,101,203,150,149,231,129, 33, 8,162, 72,174, 37, 44,142,180, 14,144, 76,152,
-114,148,184,245,240, 14,178,245, 52,180, 6, 26,174,110,126,232,241,209, 6,156, 58,247,140,202, 78,141,141, 53,168, 75,126, 53,
-161,188,175, 18, 19, 19, 79, 44, 91,182,108,196,119,223,125, 39, 44, 44, 44,164,180, 90, 45,125,236,216, 49,214,132, 9, 19, 40,
-134,205,166,185,108, 54,102,206,156,169, 46, 45, 45,253, 29,248,143, 46, 48,253,151,164, 91,248, 11,210, 66,252,105,214,172,234,
-175,255, 95, 80,227, 19, 74,179,200,219,219,182,255,252,241,225,131,135, 28, 88, 44,242,255,216,187,238,248,166,170,247,253,220,
-123,179, 71,211, 52, 29,105, 58,104, 89,101,149, 85,246, 6, 65, 65, 64, 81,100,124, 17, 4,190, 96, 1, 81, 4, 20, 28, 56,160,
- 44, 65,252,130,130,140, 10,202, 16,148, 41, 27,101, 72,109,217,180,128, 80,202, 30,221, 35, 77,147, 54,105,246,205,253,253,209,
- 36,166,165, 35, 41, 69,193, 95,158,207,231,126,146,155,123,243,228,220,147,123,207,121,206,123,222,243,190,193,119,238,222,189,
-240,242,208, 97, 89, 71,143, 30,149,113,124,125, 59, 2,176,153, 38, 79, 62, 99, 54,234, 85, 7,246,238,141,168, 95, 63,178,141,
- 61,169, 52, 99,163,200, 83,213,253,160, 86,171,213, 37, 38, 38,150,126,244,209, 71, 68, 70, 70,198, 86,185, 92, 62,242,240,225,
-195,226,161, 67,135,234,211,210,210,118, 5, 7, 7, 15,233,211,167,143,207,251,239,191,111,212,106,181,158, 36, 30, 77,101, 10,
-138,154,159,255,108,217,235,231,151,174,121, 30, 44,170, 27,140,108,192,102, 57, 5,115,201, 81, 0, 91,225, 65,188, 35, 87,136,
- 68,162, 54, 66,161, 16,151, 46, 93, 42,234,212,169,147,201, 96, 48,112, 22, 46, 92,232, 47, 18,137,218,212,182,226, 25,134, 97,
-138,138,138, 96,179,217, 88, 0, 8,251, 43,108,158,175,197,255,207,203, 47,191,188,119,251,246,237, 47, 12, 26, 52, 8, 13, 27,
- 54,132,197, 98, 65,147, 38, 77, 96, 50,153, 16, 21, 21, 5,163,209,136,121,243,230, 65,163,209,204, 68, 53, 57,207, 8,130,128,
-213,106,117, 58,219,134,134, 69,148,197,233,121,140, 48, 22, 34, 54,217,240,198,129,239,145, 95,168,180,109,191,156,151, 87,106,
-166,251,223, 46, 40,189, 86,241,188, 82, 26,186, 62,227,167,101, 1,128,209, 86,125,198,121, 17, 23, 13,111, 30,252, 14,121,249,
- 74,252,156,146,163,214,153,109, 3,110, 86,194,233, 81, 57,159, 17,206,152,121,105, 24, 54,205,253,115, 31, 7,238, 10,170,170,
-112, 41, 23,196, 69,225,247, 12,214,125, 95,105,140,172,199,228,223,123,235,214,173,189, 0,144,154,154,154, 49,106,212,168, 15,
-239,223,191, 63, 31,192,161, 7, 15, 30,172,243,132,232,251,239,191,191, 5,224,191,213,157,243,211,178,255,238, 1,176,199, 19,
-222,146,146, 18, 67,114,114,178,225,253,247,223, 39, 50, 50, 50, 14, 7, 7, 7,191,112,228,200, 17,225,208,161, 67,141, 87,175,
- 94, 61, 30, 18, 18,210,179, 95,191,126,226, 67,231,206,101,149,222,185,115,224,192,253,251, 97, 22,155,237, 64,117,207,103, 29,
-139,172,114, 98,107,207,130,251, 75,246, 46,185,223,207,102,196, 46, 83, 17,206, 0,200,124, 12,206, 63, 78,157, 58,213, 98,204,
-152, 49,219, 7, 15, 30,220,181, 69,139, 22,168, 87,175, 30,110,222,188,137,130,130, 2, 92,185,114, 5,251,247,239,223,111, 48,
- 24,106, 76,168,173, 82,169, 30, 77, 79,196,151,133,108,252,118,238,254, 11, 73, 29,155,244, 24, 52, 78,208, 50,196, 6,147,153,
- 65,198,195, 59,152,247,233,250,210,156,135,183, 82,205, 86,243,171,112,115,161,142, 94,175,143,255,250,235,175,217, 7, 14, 28,
- 24,180,106,213, 42,159,136,136, 8,138,195,225,144, 0,152,139, 23, 47, 50,211,166, 77,211, 41,149,202,131,197,197,197,241,127,
-115, 31,253,199,221,187,119, 99, 40,138,170,211,112, 11,143, 17, 22,194,139,186, 68,131, 6, 97, 45, 26, 69,132, 76,110, 88, 47,
-108,106,131,136,240,177,149, 57,185, 55,244,243,243,105, 16, 25, 26,219,176, 94,216,212, 70, 17, 33,147, 27, 52, 8,107,225,134,
-105,177,161, 68, 34, 57,172, 80, 40,218, 2,128,175,175,239, 16,169, 84,122,205,215,215,119,136,125, 20, 56, 68, 44, 22, 95,143,
-142,142,126,243,111, 52, 87, 86,203,217,164, 73,147, 81, 90,173,246,173, 38, 77,154,140,114,236,223,185,115,199,185, 95, 27,206,
-240,240,240,190, 23, 47, 94,252,207,178,101,203, 94,107,220,184,241,144, 69,139, 22,189,246,203, 47,191,252, 39, 44, 44,172,125,
- 45, 56,121, 0,126,100,179,217,121, 92, 46, 55,159,205,102,231, 57, 54, 22,139,149, 71, 81, 84, 30,128,117, 85, 88,203,250,185,
-140,114,146,228,114,249, 3,185, 92,254, 32, 56, 56,248, 65,112,112,240, 3,133, 66,241,200, 22, 16, 16,144,228,110,125, 54, 11,
- 22,119,239, 84,207,231, 84, 43,133, 56,169,185, 92,212,172, 46,254,163,102,193,226,238, 29,235,249,158,106,165,240, 73,252,255,
-198,217, 54, 24, 12,179,182, 25,195,172,109,198,180, 13, 6, 83,211,126, 93,154,253, 21, 10, 5,163, 80, 40,230, 62,169,169,132,
- 42,248,255,246,231,189, 14, 57, 27,250,248,248,252, 84,175, 94, 61, 71, 91,247,146, 68, 34,249, 93, 44, 22,191,100,111,235, 94,
- 18,137, 68, 9,209,209,209,227,106,226,148,201,100, 23,131,130,130,114,237, 91,142, 92, 46,207,145,203,229, 57, 65, 65, 65,217,
- 65, 65, 65,217,129,129,129, 89,142, 77, 42,149,158,173,229,181, 7, 1,232, 12,160, 61, 0, 73, 29,214,103, 3, 0,147,236,109,
-208, 23, 0,222, 4,208,186, 14,254, 35,130, 45,144, 77,225, 73,195, 79,177,197,129, 37,108,113, 96, 9,207, 55,236, 84, 53, 41,
-120,220,225,108, 42,147,201, 22, 74, 36,146, 95,124,124,124, 18,125,124,124,246, 6, 4, 4, 44, 2,208,244, 31,186,151,196, 0,
- 54,160, 44, 62,211, 33,148, 77,133,239, 69,217,162,130,136,167,240,158,255,255,140,216, 74, 12, 42,248, 59,162, 64,245,243,114,
-122, 57,189,156, 94, 78, 47,167,151,243, 25,228, 36,189,245,233, 21, 90, 30, 10,173,114,155, 67,104,177,188,117,227,133, 23, 94,
-120,225,133, 23,143,192,230,173, 2, 47, 60, 68,165, 83,203, 68, 53,170,212,147, 88, 83,181, 81,182,199,188,156, 94, 78, 47,167,
-151,211,203,233,229,244,114,254,191,227,252,127,129,191, 43,121,140,215,172,234,229,244,114,122, 57,189,156, 94, 78, 47,167,151,
-243,223, 14,239,212,161, 23, 94,120,225,133, 23, 94,120,225,197, 19, 66,188,139,224, 42, 55,133,232, 21, 90,158,131, 4,240, 22,
-128, 97, 0, 26,161, 44,155,253, 78, 0,171, 81,187, 57,125, 9,128, 15, 1,116, 67,217,234,156,123, 0, 18, 81,182, 58, 71,235,
-173,238,202, 17, 16, 16,240, 49,155,205,150, 2,101,169, 77, 28,175,174,239,105,154, 86, 23, 23, 23, 47,122, 66, 69,160,224,102,
- 4,101, 71, 89, 93,203,230,250,106,177, 88,158,100, 57,189,120, 58,209, 68, 38,147,253,168, 82,169, 70,195, 37,201,178, 23, 94,
-252, 27, 16, 24, 24, 56,217,108, 54,127,194,225,112, 22, 22, 20, 20,172,249,127,116,233,143,136,172,114, 66,235,192,129, 3, 9,
- 0, 48,120,240,224, 94, 0, 32,149, 74, 79,147, 36,217,192,147, 95,176,217,108,247,212,106,117,149, 1,212,164, 82,233,105,138,
-162, 30,225,180, 88, 44, 62, 44, 22,171,164,178,239, 88,173,214,204,226,226,226,246, 79, 73, 37, 18, 0, 14,248,249,249, 25,230,
-207,159,191,186,119,239,222,225,217,217,217,214,217,179,103,247,188,124,249,242, 32, 0, 47,122, 40,182,186, 16, 4,177,177,109,
-219,182,123,198,142, 29,187,189, 83,167, 78,220,194,194, 66,159,157, 59,119,134,110,218,180, 41,217,102,179,141, 70, 53,137, 86,
-255, 63,131,205,102, 75, 51, 51, 51,125,128,178,121,112,187,176,130,197, 98,129,197, 98,129, 78,167, 67,155, 54,109,234,252,119,
-131,131,131, 99, 8,130, 88, 37, 22,139,219,107,181,218, 11, 0,166,230,228,228, 92,246,164,172, 86,171, 21, 12,195, 56,203,217,
-162, 69, 11,239, 31,234, 25, 38,114,185,220, 1, 81, 81, 81, 29,141, 70, 99,209,189,123,247,206,211, 52,253, 25,234, 46, 71,155,
- 47,128,207,120, 60, 94,167, 70,141, 26,133,223,186,117, 43,195,108, 54,159, 67, 89, 50,100, 77, 93,136,172, 94,189,122, 37,125,
-251,237,183,254, 83,166, 76, 73, 74, 76, 76,236,238, 21, 91, 94,252, 83, 8, 15, 15,151,234,116,186,245, 0, 98,216,108,118, 48,
-159,207,135, 64, 32,200,229,241,120,151, 4, 2,193,132, 83,167, 78,169, 61,229,164,105,250,179, 7, 15, 30, 4,119,238,220,121,
-105, 80, 80,208, 60,165, 82,105, 48,155,205,199,139,138,138,102, 2, 40,174,238,187, 21,181,200, 51, 38,178, 92, 95,225, 16, 93,
- 44,251,133, 49, 0,122,151, 83, 96, 44, 86,216,195,135, 15,131,248,124, 62,108, 54,155,179, 51,171,184, 57, 62, 55,153, 76,104,
-217,178,165,185,134, 14, 39, 60, 35, 35, 35,136,203,229, 58, 63, 51,153, 76, 8, 13, 13,181,101,102,102, 6,217,211, 30, 56, 97,
- 52, 26, 17, 22, 22,246, 52,229, 60,122, 75, 38,147,105,210,211, 51,218, 24,140,230,184, 55,223,249,232,227,209,195,158,247, 59,
-125,250,180,237,197, 23, 95, 52, 38, 36, 36,188,133,178,196,169,110, 53,230, 4, 65,108,154, 61,123,246, 60,190, 80,226,127,226,
-116,170,113,211,206,131, 89,109,155,212, 39,102,206,156, 73, 77,155, 54,237,143,152,152,152, 31,109, 54, 91, 59,120, 96,217,242,
-243,243, 59,194,227,241, 34,237,245,151, 94, 84, 84,244,194, 83,120, 67,178,240,104,240,216,202, 62,171, 17,133,133,133,208,235,
-245,143,108, 45, 90,180,120, 18,142,136, 44, 54,155,189,119,241,226,197,161,185, 57, 57,248,223,242,229,157, 81,102,201,236,236,
-206,151,243,243,243, 31, 41,103,179,102,205,224,133, 71,248,112,222,188,121,139, 95,127,253,117,208, 52, 13,189, 94, 31,114,251,
-246,237,232, 79, 62,249,228,213, 59,119,238,116, 4,112,247,113, 7,227, 81, 81, 81,105,211,167, 79,151,117,236,216, 17,246, 44,
- 21, 33,137,137,137,157, 55,108,216,240, 70,122,122,122, 51, 0, 5,143,243, 3, 50,153,236,199,239,190,251,206, 95, 40, 20, 98,
-223,190,125,254,125,251,246, 77, 76, 73, 73,233,241, 24, 98,139,244,247,247,159, 6,224, 57,155,205,198, 5,112,174,168,168,104,
- 1, 60,143,234,174, 16,139,197,187, 72,146,172, 15,252, 21,141,158, 36,201, 0,130, 32,148,142,207, 8,130, 8,178,217,108,103,
- 84, 42, 85, 87,239,237,248,108,195,223,223,127, 98, 94, 94,222,183, 60, 30,143,227,231,231, 7,161, 80, 8, 22,139, 5, 22,139,
- 85,143,199,227,213,227,241,120, 3,251,244,233, 51,245,247,223,127,175, 54,194,126,151,182,242,241, 32,137, 56,138, 32, 41, 0,
- 32,217, 34,137,175,175, 47,226,226,226, 68, 67,134, 12, 17, 1, 64, 82, 82,210,216,113,227,198,245,205,204,204,108, 89,149,216,
-170, 76,139, 60, 67,136,175,174,195,131, 93, 61, 38,148,123,114, 73, 18, 92, 46, 23,103,207,158,133, 59,193,202, 29, 41, 18,170,
-109, 13,236, 17,198, 47, 95,254,203, 0,224,232,104,184, 92, 46, 78,157, 42, 31, 84,190, 75,151, 46,206,135,253,239,194,176, 22,
-101, 65, 30,119,188, 93, 86,174,225,171,202,162,107,239,120,187, 25,122,126,245, 16,195,166,205, 29, 89,106, 48,119, 0,160, 83,
- 23, 21, 21, 93,216,189, 59,187,109,147, 38,156, 31,127,252,177, 99,104,104,232, 48, 15,132,214,135,237,218,181,219, 69, 9,124,
- 3,198,142, 27, 63,118, 2,139, 52,191, 49,233,253,133, 25, 57, 74, 93,108,108,236,238,125,251,246,141, 93,178,100,201,245, 89,
-179,102,125, 8, 96,142,187,229,231,243,249,145, 55,110,220,136,162,105, 26, 45, 90,180,120, 26,211, 24,180, 69, 89,240,189,215,
- 1,108,179,127, 54, 10,101,145,251, 99, 0, 92,242,132,204, 97,193,170,108,171,107,132,134,134, 54, 27, 51,102, 76,128, 74,169,
-196,255,150, 47,119,124,220, 30, 53, 76, 35, 58,158, 31,147,201,132,215, 94,123,109, 12, 77,211, 44,135, 8, 52, 26,141, 38,141,
- 70, 99,192, 95,142,165, 5, 0,158,119,163, 56, 13, 68, 34,209,151, 0, 98,244,122,125, 40, 0,136, 68,162, 44,155,205,182, 71,
-167,211,205,193, 95, 9,124, 61, 30,224, 2,136, 70,213,169,160,152,197,139, 23,223,250,232,163,143,238,254, 3,156,145,114,185,
-124,209,240,225,195,113,240,224, 65, 28, 58,116,200, 34, 16, 8, 88,227,198,141, 35,166, 78,157,234, 55,125,250,244,129, 0,190,
-126,204,191,121,224,188,121,243,100,205,155, 55,199,206,157, 59,113,229,202, 21,125, 84, 84,148,160,119,239,222, 96,177, 88,178,
-143, 63,254,248, 69, 0, 27, 31,231, 7, 84, 42,213,130,247,223,127,127,211,182,109,219,124,238,221,187,135, 85,171, 86, 5,140,
- 28, 57, 50, 33, 61, 61,189,151, 7, 98,139, 7, 96, 26,128, 62, 20, 69,245, 24, 55,110,156,245,157,119,222, 97,147, 36,105, 89,
-190,124,121,224,134, 13, 27, 70,178,217,236,152,194,194, 66,119, 6,105, 36,128,184, 9, 19, 38,252,247,247,223,127,247, 59,127,
-254, 60,215,223,223, 31, 52, 77, 59, 45,197, 54,155, 45,200,113,207, 90,173, 86, 52,107,214, 44,204,229,251,130,103, 85,104,144,
- 36,105,182,217,108,108, 0,124, 0,198,154,246,255, 77, 34, 75, 38,147, 77, 81,169, 84,171,131,131,131, 33,151,203, 31,233,107,
-141, 70, 35,248,124, 62, 39, 56, 56,248,187, 33, 67,134,176,247,238,221, 91,229, 20, 32, 65, 17,159,237,251,105,126,168,204,207,
- 7, 0,176, 98,237,175,165, 0,240,203, 47,191, 32, 59, 59, 27,126,126,126,104,217,178, 37, 53,127,254,124,197,204,153, 51,255,
- 87, 84, 84, 52,161, 42,174,138, 90,228, 25,179,104,197, 87,182, 95,173,143, 22,195, 48,206, 60,121,110,222,180, 21, 63, 58, 86,
-129,143, 48,153, 76,168,104,209,114, 60,188,108, 54,187,162,249, 17, 4, 65, 48,213,113, 86,130,113, 34,145,168,141, 78,167, 91,
-233,193,232,214,201,185,227,237,102,216,196,155, 61,202,145,137,116,224,251,101,175,155, 0,156,190, 63, 97,213,183,189,122,133,
- 78,251,244,155,185,250,194,108,229,199, 99, 94,138,140, 10,246, 23,136,212,249, 26, 89,211,166,253, 43, 88,100,106, 42,103,207,
-177, 99,199,110,254,237,236, 3,130,207,231,112, 88, 20,197,238,222,170,137,127,184, 47,229,235, 3,248,102,220,189,117,122,252,
-248,241,173,102,205,154,213,195, 3, 78,216, 59, 92,108,217,178, 5, 4, 65,144,158, 92,123, 29,226, 88,117, 34,139, 97, 24, 16,
- 4,177,213,165, 83,217,106,255, 44,197, 69,108,177,170,171, 79,135, 53,213, 33,170,198,141, 27, 55,198,106,181,178, 92, 26,137,
-138, 2,166, 50, 17,227,214,181, 43, 20,138,223, 0, 60, 79, 16, 4, 76, 6,131,233,203,175,190,114, 61,124,177,130,200, 58, 86,
-213,179,100,177, 88, 64,211, 52, 43, 37, 37,133,237,114,175,179, 1,136, 0, 4, 48, 12, 3,146, 36,255,116,163, 62,155, 9,133,
-194,211,251,247,239,151,180,111,223,158,224,114,185,176, 90,173,184,122,245,106,248,146, 37, 75, 38, 29, 59,118,236, 69,157, 78,
-215, 2,143, 38, 79,119,231, 63,138, 78, 76, 76,212, 53,108,216,176, 82,225, 88, 92, 92,204,106,210,164, 73,175, 42, 68,209,147,
-230,204,204,203,203,123,229,249,231,159,159,156,155,155,155,102,181, 90, 63, 0,208, 50, 32, 32, 32,101,232,208,161, 16, 8, 4,
-125,244,122,253,215,143,115,207, 7, 5, 5, 13,233,218,181, 43, 86,173, 90,133, 37, 75,150,244, 3,112, 28, 64,223,226,226,226,
- 99, 47,191,252, 50,164, 82,233, 43,106,181,122,227, 99, 60, 71, 77,122,246,236,249, 93, 92, 92,156,207,193,131, 7, 17, 21, 21,
-133,146,146, 18,188,247,222,123, 65,159,127,254,249, 73,181, 90,221,219,229,185,168,138,179, 5,143,199,219,184,109,219, 54,113,
-195,134, 13, 27,114, 56, 28,178, 97,195,134, 80,169, 84, 48, 24, 12,188,133, 11, 23,182, 18, 8, 4,151,191,254,250,235,141, 0,
-134,214, 80, 78, 18,192,130,117,235,214, 77,142,141,141,149,142, 25, 51,134, 54,153, 76,216,190,125, 59, 40,138, 2,155,205,134,
- 80, 40,116, 38,175,230,112, 56,104,218,244,145, 32,233,251,170,185, 94, 13,202,252, 80,165,240,108,218,245, 88, 53,124,206,169,
- 15, 54,155, 13, 62,159, 15, 62,159, 15, 30,143,135, 27, 55,110,124,202,231,243,151, 19, 4, 97,117,135,147,248, 75, 93,180, 1,
-112,190,166,125, 60,234, 26,242,119,182,159, 14,132, 17, 4,177, 2, 64,159,178,110,151, 76, 8, 8, 8,120, 55, 47, 47,239,161,
-187,156, 10,133,194,191,176,176,240,107,133, 66, 1,185, 92,238,236,191, 67, 67, 67, 97,177, 88,144,151,151, 7,134, 97,160, 86,
-171, 33, 20, 10, 17, 18, 18,242,117,108,108,236,206,248,248,248,194, 74, 57,109, 88,242,242,200, 79, 62,163, 40,138, 4, 0,138,
- 37, 22, 79,255, 8,136,140,140, 68,247,238,221, 97, 48, 24,160,209,104, 16, 29, 29,205, 34, 8, 98, 44, 65, 16, 18,134, 97,214,
- 0, 56,241, 47, 52, 20, 86,233, 12, 63,175,226,188,168, 35, 91, 60,135,195,113, 75,104,217,207,175,201,130, 66, 90, 44, 22,112,
- 56,156,114, 22, 9,130, 32, 64,211,116,185,207, 29, 66,171, 54, 66,125,234,212,169,182,239,190,251,110,114, 81, 81,209, 90,212,
-114, 42, 97,236,216,177,143,248,123,204,156, 57,201, 18, 85,156, 0, 0, 32, 0, 73, 68, 65, 84, 51, 51, 63, 63,159,121,173,127,
- 27, 81,218,225,236,156, 70,126, 98, 65,160,143, 79,125,190,159, 76, 90, 88, 88,120,198,222,152,184,139,198,237,218,181, 19,108,
-218,157,152,249,230,140,197,243,219, 55,244,151,180, 14, 11,240, 11,246, 21,112,197, 36,161,227, 91, 45,153, 50,153, 44,202,211,
-114, 59,218, 5,161, 80, 8,146, 36,159, 38,139, 22,203, 33,178, 84, 42, 21, 14, 30, 60,136, 65,131, 6,165, 56, 68, 72,113,113,
- 49,114,114,114,160, 80, 40, 82,236,150,143, 26,167, 17,109, 54, 27,204,102, 51,204,102,179, 83,192,184,220, 67, 78, 1,227, 56,
-151,162,168, 63,107, 89,246,249,126,126,126, 61,251,244,233,195,253,105,251,118, 46,195, 48, 58,148,229, 80,211, 50, 76, 21, 9,
-178, 43,192,106,181, 58,173,108,108, 54, 27,233,233,233,206,142,203,145, 91,146,207,231,187,103,202,224,241,222,255,249,231,159,
- 37, 29, 59,118, 36, 10, 11, 11, 97,179,217,156,141,228,234,213,171,249,195,134, 13, 11, 77, 78, 78,254,216,104, 52,206,171,197,
-181, 18, 85, 9, 34, 0,144, 72, 36, 86,184, 23, 49,187, 70, 78,171,213, 74,116,235,214,109,150, 82,169,108,165,215,235, 23,186,
- 83,141, 0,246,101,102,102,186,118,236,151,211,210,210,244, 35, 70,140, 16,212,175, 95,191, 83,106,106,234, 99,221,164, 77,154,
- 52,233,194,102,179,113,238,220, 57, 35, 0,199,200, 58,225,202,149, 43,198,161, 67,135,242,194,195,195,187,168,213,110,187,172,
- 52,105,214,172,217,209,160,160, 32,129,163, 13, 13, 12, 12,100,199,199,199,251,100,101,101,193,108, 54,227,195, 15, 63,196,224,
-193,131, 17, 16, 16,128,153, 51,103,202,151, 46, 93,250,163, 86,171,109, 87,157,209,154,203,229,110,190,125,251,118,148, 66,161,
- 16,156, 61,123, 22,173, 91,183,134, 82,169, 68,110,110, 46,180, 90, 45,114,115,115, 49, 97,194,132,160,255,253,239,127, 33,110,
- 88,178,156, 34, 43, 62, 62, 94,189,107,215, 46,106,253,250,245, 62,108, 54,219, 41,180, 88, 44,150, 83,104, 57,114, 43,214, 98,
-166, 65,109, 23,109, 82,141, 70,243, 56,126,110, 60, 0, 92, 87,145,197,227,241,192,227,241,192,231,243, 31, 43, 47,235, 51,130,
- 80,130, 32, 82, 57, 28, 14, 79, 40, 20,114, 72,146, 4,143,199,235, 47,147,201,174,181,108,217,178,229,209,163, 71, 31,184, 67,
- 98, 48, 24, 54,243,120, 60,118, 80, 80, 16, 0, 32, 42, 42, 10,173, 91,183,134, 78,167,179,105, 52, 26, 72,165, 82,242,225,195,
-135,208,235,245,200,201,201, 65, 68, 68, 4,155, 36,201,205, 40,243, 67,126, 4,167, 83,114,215, 2, 88,235,216, 15, 8, 8,200,
-115,181,116,242,249,124,132,134,134, 34, 43, 43, 11, 62, 62, 62,212,231,159,127, 62,116,251,246,237,175,158, 62,125,122, 44,128,
- 45, 46, 84,243,158, 97, 31, 45,135,200,114,125,253, 75,104, 13, 30, 60,120,238,129, 3, 7,122, 85, 54, 10,103,179,217,117,230,
-235,226, 16, 84, 18,137,164,162,213, 10, 54,155,173, 42,139,150,199,191,195,231,243, 5, 83,166, 76, 41, 89,179,102,141,199, 98,
-107,248,170, 52,167, 21,235,145, 97,100,139, 22,167, 63,254,248,227, 33,191,255,254,123, 86,251,134,245, 89,162,236,135, 90,190,
- 68, 42, 69, 88,189, 65,227, 94, 25,122, 5,101,171, 15,221,197,237,146,146, 18, 65,163, 48,161,137, 36, 13, 68, 61, 30,203, 71,
- 33,226,240,130,253,252, 66, 57, 38, 99,190,196,207,143,107, 52, 26,213,168, 38, 9, 52, 0,200,229,242, 95, 5, 2, 65,132, 99,
-223,207,207,207,151, 97, 24, 8,133, 66, 40, 20, 10, 49, 69, 81, 55, 93, 30,174,135,121,121,121,253,107, 42,152, 84, 42,253,149,
-199,227, 69,144, 36, 9,130, 32, 64, 81, 20, 72,146, 4, 73,146,206,247, 20, 69,129, 32, 8,148,150,150, 62,124,240,224, 65,127,
- 55,174,215, 10, 32,134, 32,136,148,131, 7, 15,162, 83,167, 78, 56,124,248, 48, 6, 12, 24, 0,141, 70,131,171, 87,175,162,103,
-207,158, 64,217,148,162, 91,112,117,126,119, 12, 10,110,220,184,225, 20, 46,174,155,143,143,207,227,152,216,147,134, 15, 31,142,
-239,190,251,142,177, 15, 38, 68, 4, 65,180,246,245,245,189,113,253,250,117,183,252, 96, 24,134,129,217,252,215,169,142,206,203,
-238, 15,225, 81,114, 96,138,162,250,183,107,215,142,208,104, 52, 14, 1, 9, 22,139, 5,138,162, 64, 81, 20,190,253,246, 91, 65,
-199,142, 29, 63,225,241,120,179, 56, 28, 78,177,197, 98,249,201, 96, 48, 44, 4,160,126,154, 90,164, 30, 61,122,204,200,200,200,
- 24, 28, 17, 17,177,255, 49,104, 24,139,197, 98, 2, 32,160, 40,138, 93, 7,109, 20,101,191,183, 12, 46, 98,223,106,223,231,161,
-108,154,216, 45, 4, 4, 4,252,120,232,208,161,176,136,136, 8, 88, 44, 22, 88,173, 86,104,181, 90, 36, 36, 36,192,104, 52,194,
-106,181, 34, 42, 42, 10,159,125,246,153,225,221,119,223,229,175, 91,183, 46, 95,171,213,142,174,129,246,221,157, 59,119,138, 20,
- 10,133, 64,175,215,227,238,221,187,104,215,174, 29, 74, 74, 74,160,211,233, 80, 90, 90, 10,179,217,140,226,226, 98, 41, 77,211,
-166, 26,184, 62,117, 21, 89,147, 38, 77,250,147,203,229,182,123,231,157,119,144,153,153,233,124,230,223,124,243, 77,200,229,114,
-231,179,100,111,147, 61,106,152, 89, 44, 22,120, 60, 30, 56, 28,142,186, 94,189,122, 32, 8,130,255,240,225,195,218, 76,197, 73,
- 0, 20,179,217,108,174,171,192,226,241,120, 56,119,238,220,199, 92, 46,183, 42,107, 86, 85,207, 37,227,201,254, 63, 13,130, 32,
- 86,112, 56, 28,158, 76, 38,227,184, 12, 56, 57, 98,177, 24, 65, 65, 65,171, 0, 12,116,243,186,219,202,100, 50,103,251,222,166,
- 77, 27,100,100,100,236,209,104, 52,111,228,231,231,131, 36,201,205, 36, 73,190,234, 24,164, 22, 21, 21, 33, 60, 60,188,109, 85,
-124, 93, 99,130, 39,131, 96,202, 89,180, 42, 12,208, 32,145, 72,112,255,254,125,232,116, 58,230,214,173, 91,196,148, 41, 83, 8,
-147,201,244, 67,114,114,242, 25,148,173,182,175, 82,139, 60, 35,240,220, 71,203, 97,209,114,183, 3, 32, 8,162,198,209,132,197,
- 98, 17, 71, 71, 71, 87,230,240, 69, 84, 38,180,236,211, 73,181,186,209,217,108,182, 79,109,197, 86, 69,236,223,181, 77,190,228,
-179, 15, 63,147,133,212,111, 52,107,214,167,172,151, 94,122,233,236,166, 77,155,104, 89,243,129,125, 79,252,186, 69,254,245,123,
-179, 15, 31, 58,116, 8, 40,115,140,118, 23, 73, 7, 14, 28, 8,158, 57,109, 42, 62,123,255,221, 35,146,168, 0,174,152,144,137,
-248, 70, 93,129, 24,140,158,215,184,217,224,221,251,247,231, 0, 72,174,142, 68, 40, 20, 70,164,166,166, 70,185, 46, 36, 48,153,
- 76, 16, 10,133, 56,113,226, 68,160, 64, 32, 8, 4, 0,189, 94,143,150, 45, 91,186,107, 49,137,184,121,243,102,148,143,143, 15,
- 74, 75, 75, 97, 52, 26, 97,177, 88, 96,179,217, 64, 16, 4,216,108, 54,184, 92, 46, 68, 34,145,167, 43,251, 46, 1,120,125,208,
-160, 65, 91, 15, 31, 62,140,232,232,104, 20, 21, 21, 33, 45, 45,205, 33,178, 60,242,209,114, 88,137, 92,253,177, 88, 44, 22,126,
-108,216, 16,111,102,103, 59, 5,204, 10, 95, 95,124,102,171, 93, 54,141,150, 45, 91, 50, 73, 73, 73, 56,114,228, 8, 94,126,249,
-101, 98,239,222,189,102,154,166, 57,217,217,217,127,102,103,103,187,197, 97,179,217,156,101,117,180,219,174, 2,203, 83,161,101,
-181, 90,125,184, 92, 46, 12, 6, 3, 28,150, 7,215,173, 65,131, 6, 80,169, 84,172,226,226, 98, 86,118,118,182,112,193,130, 5,
-239,156, 60,121, 82, 81, 82, 82, 50,234,159,108,133,214,172, 89, 19,241,230,155,111,166,179, 88, 44,102,192,128, 1, 99, 30, 62,
-124,248,138, 66,161, 56,254,251,239,191,127, 5,160,137,167,124, 1, 1, 1, 23, 89, 44, 86, 88,113,113, 49,103,199,142, 29,150,
-146,146, 18, 78, 96, 96, 96,158,163,237,112,212,181,197, 98,113,107,229,114, 64, 64,192, 69,165, 82,201, 89,185,114,165,165,176,
-176,144, 35,151,203,243, 28, 60,106,181,154,179, 99,199, 14, 75,113,113, 49,199,215,215,247,162, 70,163,169,145, 79,169, 84,142,
- 30, 59,118,108,226,241,227,199, 3, 40,138,194,195,135, 15, 81, 88, 88, 8,169, 84,138,205,155, 55, 35, 34, 34, 2, 59,119,238,
- 84,169, 84,170,137, 95,126,249,229, 39,118,145, 85,147,143, 86,207, 78,157, 58, 69,168,213,106, 72,165, 82,232,116, 58, 92,188,
-120, 17, 45, 90,180, 64,118,118, 54, 72,146,132, 84, 42,197,234,213,171, 75, 9,130, 80, 85, 71, 36, 16, 8, 94,137,141,141,149,
- 2, 64,108,108,172, 52, 54, 54,182,210, 14,174, 75,151, 46, 88,181,106, 85, 69,161,229,201,192,192,105,117,114, 17, 71,134,206,
-157, 59,227,228,201,147,179, 61, 20, 71, 38,135,104,171,104,205,226,241,120, 30, 47,166,177,217,108, 28,148,185, 52, 16,238,236,
- 63, 5,232, 37, 16, 8, 56, 21, 63, 44, 45, 45,229, 40, 20,138, 30, 30, 8, 95,127,129,160,204,224, 20, 17, 17, 1,141, 70, 67,
-155, 76,166,145, 91,182,108,177, 0, 64, 76, 76,204, 72,154,166, 13, 86,171,149,226,114,185,208,233,116, 8, 10, 10,242,175,198,
- 54,250,193,190,159, 22, 4, 87,244,209, 82, 40, 20,136,137,137,129,209,104, 68, 78, 78, 14, 18, 18, 18, 44, 52, 77,111, 93,179,
-102,141, 45, 48, 48,240,191,175,189,246, 26,149,156,156,252, 54,128, 25, 85,105,145,103,204,154, 21, 95,165,208,178, 43,200,147,
- 0,122, 87,188,200,138,226,167, 58,161, 85,211,212, 33,151,203, 85,167,167,167,139, 92, 59, 21,171,213,138,144,144, 16, 27,195,
- 48, 68,101, 66,235,113, 76,193,108, 54,219,231,163,143, 62, 82,175, 89,179,102,244,253,251,247,231,186,243,157, 29,111, 55,195,
-166, 10, 34,107,237,146,184, 85, 43,151, 44,144,221, 57,242, 3,214,127,179,140,166,105, 36,183,106,213,170,135, 86,171,101,249,
-138, 44, 80,170,113,216, 46,178,220, 21,133, 36,128,239,207,159, 63,159, 60,112,224,192, 83,223,255,188, 91,150,125,247,238, 25,
- 94,177, 50, 71,210, 56,138,197, 9,141,120,181,196, 96,224,140, 28, 57, 50, 16,192,107, 53, 53, 98,106,181, 26,185,185,185, 21,
- 5, 24,110,220,184,241,200,185,110, 21,142, 36, 65,211, 52,118,237,218, 5,161, 80, 8,145, 72, 84,110,115,136,172, 90, 46, 84,
-184, 9, 0, 3, 6, 12,128, 74,165,130, 88, 44,118,187, 92, 21,197, 11,195, 48, 48,153, 76, 48,153, 76, 48,155,205, 52, 0, 54,
-139,197,194,132,204, 76,167,149,199, 19, 1, 83, 17,173, 90,181, 98, 78,159, 62,141, 83,167, 78, 65,167,211, 97,229,202,149, 80,
- 40, 20,207, 1,248,212, 83, 46, 23, 39,125,186,184,184,152, 93, 92, 92,236,180, 14,178,217,108,167,245,192, 77, 75, 30,135,197,
- 98, 57, 71,163,142,205,213,170, 69, 81, 20,228,114, 57,130,131,131,177,118,237, 90, 78,253,250,245, 7,255,147, 45,208,210,165,
- 75, 27,175, 88,177, 98,195,166, 77,155, 14,143, 30, 61,122,251,213,171, 87,199,251,250,250,254,121,226,196,137, 5, 60, 30,207,
- 86,203,231, 59, 44, 59, 59, 59,200,245, 35,155,205, 38,180, 90,173, 78, 97, 91, 90, 90,234,246, 0,131,205,102,135,165,166,166,
- 10, 1, 96,193,130, 5,108, 0, 66,135, 51,184,131,179,180,180,148,221,162, 69,139, 48,119,239,245,196,196,196, 30,253,250,245,
- 59,125,244,232, 81,191,136,136, 8,100,101,101, 33, 43, 43, 11,141, 27, 55,198,162, 69,139,116,197,197,197,221, 0,220,212,106,
-181,123,221,228, 12,241,243,243, 99,167,167,167,195,106,181,162,109,219,182, 88,189,122, 53, 70,142, 28,137,150, 45, 91,162,184,
-184, 24,169,169,169,216,184,113,163, 31,135,195,169,182,237,208,235,245,123,227,227,227,195, 43, 90,180,198,140, 25, 35,202,203,
-203,115,222,147,113,113,113,229,166, 16, 61,105,147,237, 83, 91, 85,110,181,129,213,106,149,240,249,252, 98, 30,143,199,117,248,
-103, 37, 36, 36,120,108,205,170, 48, 0,244,100,255, 31,131, 67,180, 86,210,183, 34, 56, 56,216,109, 30, 30,143, 71, 56,218, 70,
-171,213, 10,141, 70, 67, 43, 20, 10,231,244,126, 74, 74, 10, 29, 25, 25, 73, 83, 20, 69,113,185, 92, 16, 4, 1,161, 80, 88,101,
-131,207,208, 76,220, 75, 35, 63, 45,183,234,112,250, 71,128,217,108, 70, 74, 74, 10,204,102, 51, 18, 18, 18, 44, 95,126,249,101,
-182, 90,173,158, 14,128,245,235,175,191,142,157, 61,123, 54, 21, 20, 20,212, 47, 63, 63, 31, 53,105,145,103, 72,108, 61, 98,229,
-114,244, 66, 39, 7, 15, 30, 76,216,151, 86, 18, 14,225,228,137,208,178, 63,124, 53,246,188, 4, 65, 32, 39, 39,199,185, 31, 20,
- 20,228,241,111,185, 11,127,127,127, 93,151, 46, 93,124,148, 74,229,222,165, 75,151,214,202,146,181,118, 73,220,170,197,243, 63,
-151,169,174,159, 69,102,118, 14, 84,249,150,228,164, 63,239,239, 1,176, 7, 0,176,174,249, 73, 98,114,218,183,238,114, 54, 11,
- 16,180, 97,115, 88,123,158, 31, 56, 56,124, 68,236, 12,242,173,183,222,234, 62,118,236, 88,205,232,209,163,167,137,197,226, 38,
-102,179,185,104,247,193,131, 15, 70,140, 24, 81,159,166,233,177,168, 33,230,136, 94,175,127,216,187,119,111,215,250,148, 28, 59,
-118, 76,254,224,193, 3, 76,157, 58,181, 32, 43, 43, 75,237,122,174, 59,101, 52,155,205, 15,219,180,105, 83,229,116,161, 99, 74,
- 17, 0, 74, 74, 74, 30,122, 80,165,163, 96,119,124, 47, 44, 44,196,141, 27, 55,192, 98,177,208,185,115,103, 36, 37, 37,161,123,
-247,238, 41,158, 88,181, 12, 6, 3, 34, 34, 34, 96, 48, 24,160,211,233, 74, 1,240, 54,215,175, 15, 0,120,187,176, 16, 23,191,
-252, 18,103, 23, 47,134,235,253,236, 46, 90,183,110,205,156, 61,123, 22,127,254,249, 39,140, 70, 35, 38, 78,156, 8, 0,132,253,
-222,245, 36,100, 70, 67,138,162, 6, 12, 28, 56, 48, 4, 0,116, 58, 29,113,254,252,121,240,249,124,231,179,176,127,255,126,100,
-101,101,129, 32, 8,248,249,249,133, 21, 21, 21,213, 7,112,191, 26,179, 63,113,255,254,125,124,241,197, 23,176,217,108,152, 61,
-123, 54,162,162,162,156, 2,235,225,195,135, 88,176, 96, 1,104,154,198,231,159,127,142,198,141, 27,195, 98,177,240, 81,203, 16,
- 26,117,129,153, 51,103,222,217,179,103,207,225,140,140,140, 23,151, 44, 89,210,139, 32, 8,219,172, 89,179,190,144, 72, 36,244,
-227,240, 22,105, 74,112,227,246, 67,167, 16,170,184, 5, 6,200, 60,230,187,117, 55,195,249,125,154,118,229,163,225, 47,243,243,
-180,136,165, 22,139, 69,247,234,171,175, 74,119,237,218, 69, 52,110,220, 24,247,238,221,115, 88,134, 74,225,121, 72,135, 44,149,
- 74, 21, 69, 81, 20,231,246,237,219,136,140,140, 68,167, 78,157,176,112,225, 66, 40,149, 74, 88,173, 86, 4, 5, 5,217, 44, 22,
- 75,138,217,108,254,163, 6,174,184, 73,147, 38,113, 0, 76,182, 91,182, 90, 77,159, 62,221,182,108,217, 50,164,164,164, 56, 45,
- 88,174,206,240,158, 78, 29,186, 90,157, 92,183,132,132,132,217, 92, 46,151, 1,112, 14,158, 7,122, 54, 85,180,104,213,198,154,
-245,164,240, 36, 87, 50, 42, 20,138, 4, 31, 31,159,193, 69, 69, 69,229,172, 90,221,186,117, 51,203,229,242, 68,119,121,196, 98,
-113, 17, 69, 81,254, 0,144,149,149, 5,145, 72,196,185,123,247,238, 98,148, 5,207, 70,253,250,245, 23,171, 84, 42, 78,125,123,
-123, 26, 28, 28, 12,147,201, 84,165, 27,203,153, 75,121, 63, 0,248,193,177, 47,147,201,114, 52, 26,141, 96,217,178,101,218,197,
-139, 23,235,105,154, 54, 2, 56,161, 86,171,157,113,180,114,115,115, 53,108, 54, 91, 38,149, 74, 67, 29, 66,171, 50, 45,242,140,
-161,106,139,150, 93, 73, 50, 21, 5, 17, 65, 16,143, 56,168,215, 32,180,106, 20, 89, 52, 77,151,179, 50, 56, 28,222, 43,251, 45,
-123,167, 94,171,169, 67,187,200,226,239,222,189,123,243,210,165, 75,207,185,251, 61, 87, 31,173,117, 95,205, 95,226, 16, 89, 87,
- 78, 29,197,222, 52,141,114,246,226,229, 43,106,251, 15, 52, 15, 16,182,150,203,253, 79,126,185, 40, 78,114,231,200, 70,108, 95,
-247, 63,230,202,133, 11, 29, 47, 92,184,240,198,212,169, 83,235,217,111, 44, 21,128,203, 0, 70,192,141, 85, 58, 89, 89, 89,253,
- 43,116,194, 55, 57, 28,142, 92, 40, 20, 34, 43, 43, 75,123,235,214, 45,143,167,100,148, 74,101,255, 39,112, 3,178, 28, 34, 75,
-169, 84, 34, 53, 53, 21,125,250,244, 1, 0, 36, 37, 37,161, 91,183,110, 72, 78, 78, 70,187,118,237, 82, 0,116, 64, 13,129, 90,
- 45, 22,139,186,121,243,230, 78,235,150, 70,163,177, 1, 64,108, 78, 14,226, 21, 10,176, 88, 44,156, 93,188, 24,115, 44, 22, 44,
-244, 80,192,183,105,211,134, 57,127,254, 60, 30, 60,120, 0,171,213,138, 33, 67,134,160,150, 15,125,203,102,205,154, 29, 59,113,
-226, 68,160, 88, 44,134, 78,167,131, 86,171,197,184,113,227, 48,114,228, 72, 24,141, 70,236,216,177, 3,251,246,237,131,143,143,
- 15,116, 58, 29,116, 58,157,223,160, 65,131, 78,223,188,121,179, 39,128,219, 85, 8, 45,166,127,255,254, 72, 76, 76, 4, 69, 81,
-232,216,177, 35, 10, 11,255, 90, 12, 36,151,203, 43, 59, 70,253,147, 66,139,197, 98, 49, 9, 9, 9, 75,122,245,234,133,140,140,
-140, 23,219,181,107,183,114,252,248,241, 89,143,203,235,231,235,131, 54, 45, 26,194,104, 52,194,104, 52, 34, 36, 36, 4, 37, 37,
- 37,184,115,231, 14,140, 70, 35,228, 65, 82,143,249, 98, 90, 54,118,242, 5, 5, 5, 65,167,211,225,254,253,251, 48,153, 76, 8,
- 8,240, 72,104,133,247,239,223,255,247,173, 91,183,250,111,220,184,209,212,187,119,111,238,202,149, 43, 9,137, 68, 2,151,142,
-197, 83, 36, 36, 37, 37, 69,244,235,215,175,233,245,235,215,145,144,144, 0,147,201,132,152,152, 24,220,186,117, 11, 93,186,116,
-129, 86,171, 61,119,225,194,133,125,238, 24,134, 1,124, 50,105,210, 36, 56,196, 86, 98, 98, 34,114,114,114,224,227,227,243,136,
-208,114,248, 62,218, 87,141,135,184, 83, 88,135, 32,114,177, 60,205,145, 74,165,102, 0, 43,106,105,125, 2, 0,100,100,100,240,
- 90,181,106,101,228,243,249, 92,187,104, 91,254, 56,124,117,137, 58, 88,201, 88, 37,130,131,131,167, 7, 4, 4,244,107,208,160,
- 1,242,242,242, 56, 92, 46, 23,221,186,117, 51,119,232,208,193, 28, 28, 28,252,182,187, 60, 60, 30,239, 58,135,195,233, 89, 54,
-152,160,145,158,158, 14,134, 97,102,183,108,217,242,221,146,146, 18, 20, 22, 22,114, 37, 18,137,115, 80,221,180,105, 83, 24,141,
-198,235, 30, 88,222,226, 34, 35, 35, 63,225,112, 56, 11,149, 74,101,101, 97, 33,184, 82,169, 84,194,225,112, 96, 54,155,203,137,
-205,138, 90,228, 89, 23, 89,229,132,150,139,138, 44, 39,116, 60,177,104,185, 99, 53,112, 56,216,187,238, 59, 68, 93,197,223,170,
-109, 12, 45, 95, 95, 95,163, 67,100, 45, 92,184,240, 92,109, 56,118,110,221,162,240,181,149,134,103,159, 59,132,155,127, 38, 99,
- 79,170, 90, 57,123,241,242,105, 47,189, 54, 42,175,162, 48,115, 7, 81,129,194,150,242, 32,255,147, 95, 45, 93, 44, 81, 93, 63,
-139,156,220, 92, 28, 58,119, 33,217, 12,164, 2,152, 93,151,166,101,160,108,234,144,162,168,167,233,134,117, 58,195,231,228,228,
- 56, 68, 86, 12, 0,116,239,222, 61,197, 46,178,224,174, 69, 75,173, 86, 87, 76, 89,211, 15, 64,128,227,250, 89, 44, 22,186,125,
-242,137,199, 34, 11, 0,147,156,156, 12,149, 74,229, 24, 41,214, 86,100, 33, 56, 56,248,253, 19, 39, 78, 4,126,255,253,247,197,
-155, 54,109, 42,180,217,108,236, 54,109,218,132,181,111,223,158,216,188,121, 51, 0, 96,196,136, 17,152, 61,123, 54,174, 93,187,
- 6,145, 72,132,238,221,187,211,115,231,206, 13,154, 62,125,250,219,121,121,121,211, 42,237, 29,109, 54, 14,159,207, 63, 14,224,
-185,235,215,175, 3,192,105,148,165,112,114, 88, 17,170, 60,230, 78,231, 91, 82, 82,194,246,241,241,169, 52, 52, 4,167,108, 52,
-228,169, 5,194,201,121,234,212,169, 47,190,250,234,171, 61,239,189,247,222,237,199,228,172,212,162, 53,120,240, 96,232,141,102,
-100,230,105, 64,211, 86,232,205,249, 30,243,185, 90,180, 6, 15, 30,140, 82,131, 9,233, 57, 42, 88,173, 52, 74,244,110,247,229,
-194,231,159,127,254,215,159,126,250, 41,248,204,153, 51,160,105,218,118,235,214,173,251,175,190,250,170,100,214,172, 89,254,143,
-177,200,232,155, 81,163, 70, 13, 59,117,234,148,170,105,211,166,178,115,231,206, 33, 63, 63, 31, 86,171, 21,207, 61,247, 28,184,
- 92,110,250,226,197,139, 57, 0,190,113,247,191,177,139, 45,243,133, 11, 23,222, 60,123,246,172, 76, 38,147,113,109,205,154, 33,
-231,232, 81,236,218,181,235,145, 47,172, 91,183, 14,112, 51, 10,191,195,226,116,254,252,249, 58, 17, 88,229,122,106, 46,183,214,
-211,143,207, 42,206,159, 63,159,245,214, 91,111,181,144, 72, 36, 43,122,244,232,209,199,223,223,159,244,243,243, 75, 8, 13, 13,
-125,183, 77,155, 54,110,207, 46,176,217,236,241, 34,145,232,142,213,106,165,180, 90, 45,116, 58, 93, 89, 35,109,181,114, 73,146,
- 68,253,250,245,157,125, 73,199,142, 29, 17, 28, 28, 76,167,165,165,141,119,151,191,160,160,160,220, 42,196, 74, 48,169, 91,183,
-110, 44,163,209,136, 7, 15, 30, 36,185, 30,168, 76,139, 60, 35,136,173, 86,124, 57, 46,202,245,226, 66, 67, 67, 51, 44, 22, 11,
-147, 10, 48,151, 47, 95,102, 98, 99, 99,171,221, 12, 6, 3, 19, 20, 20,148, 83, 73,231, 7, 87, 78,163,209, 88,238,123, 70,163,
-145,145,203,229,180, 94,175,127,132, 83,175,215, 51, 97, 97, 97, 89,213,113, 86,130,113,151, 46, 93, 90, 51,103,206,156, 78, 30,
- 84,144,147,147, 89,219,140,217,184,113,227,127, 24,134,233,213,163, 69,196,159,195,219,200,153,110, 81, 65,217,251,118,110, 29,
-201, 48, 76,175,138,155, 35,192,105,117,156,205,228,162,230,125,163,235, 21, 93, 57,178,141, 57,177,236, 29,230,171, 33, 81, 76,
-187, 48, 31,117,179, 0,129,167, 57, 98,106,204,150, 30, 29, 29,125,211,102,179, 49, 38,147,137,137,142,142,190, 85, 23,156,181,
- 64,117,156,109, 81,230,203, 54,170,146,207,218, 62, 70, 57,175, 48, 12,195,168, 84, 42, 70,171,213, 50, 70,163,145,161,105,154,
-113, 5,128, 43,110,112, 50,102,179,153, 41, 42, 42, 98,224,190,207, 93,165,156, 10,133,226,254,221,187,119,153, 70,141, 26,101,
-216,205,241,211,117, 58, 29, 83, 17, 58,157,142,233,211,167, 15,115,235,214, 45, 38, 50, 50,210,112,235,214, 45, 70,161, 80,220,
-168,161,156, 13,194,195,195,143, 7, 4, 4, 36, 0,136,242,224, 88,181,245,185, 99,199,142,134, 12,195, 76,100, 24, 38,182,138,
-109, 34,195, 48,205,254,105, 78,123,253,230, 49, 12,195,148,150,150, 50, 42,149,138,201,206,206,102, 74, 75, 75, 25,173, 86,203,
- 92,186,116,137, 57,115,230, 12,243,231,159,127, 50, 50,153, 44,207, 29, 78, 7,159,201,100, 98,138,139,139,153,252,252,124, 70,
-175,215, 51, 58,157,142,185,122,245, 42,115,241,226, 69,230,250,245,235,149,241, 61,194,233,239,239,191, 46, 55, 55, 87,123,250,
-244,233,210,181,107,215,150, 6, 7, 7, 95, 7, 16, 1,160,137,159,159, 95,238, 59,239,188,195,136,197,226,135,181,124,142, 90,
-176,217,236, 75, 75,150, 44, 57,127,224,192,129,188,125,251,246,153, 54,108,216,144, 57,117,234,212, 63, 88, 44,214, 37, 0, 45,
-106,249, 28, 5, 73,165,210,211,231,206,157,179, 22, 21, 21, 49,106,181,154, 41, 46, 46,102,116, 58, 29,163,215,235, 25,147,201,
-196, 88, 44, 22,230,143, 63,254, 96,228,114,185,235,180,228, 7,213, 12,172,103, 48, 12,243, 62,195, 48,172,186,110,235, 92,184,
-123,212, 21,103, 93,180,117, 36, 73,154,237,109, 71,231,178,221,234,247,255,169,114,246,237,219,247,243,145, 35, 71, 50, 3, 6,
- 12, 96, 98, 98, 98, 30,217,218,181,107,199, 76,153, 50,133, 57,112,224, 0,243,229,151, 95,126, 94, 7,229,100,161,108,209,203,
-162,190,125,251, 90, 18, 19, 19,153, 17, 35, 70, 48, 0,250, 87,167, 69,158,101,193,229, 88, 76,227, 8,239, 64,184,190, 2,128,
-217,108,206,184,121,243,166,162,169,213, 74, 1,192,183,223,126,251,136,101,202, 21,137,137,137, 86,130, 32,238, 84,247,235,102,
-179, 57,227,196,137, 19,242, 85,171, 86,177, 93, 76,192,176, 90,173,182,236,236,108,114,229,202,149,229,206, 63,121,242,164,213,
-106,181,166,123,120,145, 27,219,182,109,187,177, 46,106,235,143,107, 15,222,253,245,208, 47, 1,157, 59,245, 80, 75,100,178, 74,
- 71, 97, 59,222,110, 6, 98,114,245, 86, 45,130, 69, 46, 92,178, 40, 78,234,152,130,252, 57, 37, 87,109, 48,210,125,210,148,250,
- 43,117,253, 15,107,181,218, 7,142,149,128, 58,157, 46,253, 41,188, 9, 47,161, 44,198,149,181,194,103, 29,240,152, 78,167, 54,
-155, 13,190,190,190, 78,107,104, 45, 44,162,140,195,194,234,248,235, 30,167, 60, 12,195,156,186,122,245,106,228,184,113,227,124,
- 54,109,218,116,151,166,105,246,132, 9, 19,204,193,193,193,156,164,164, 36, 11, 0,162, 87,175, 94,172,220,220, 92, 38, 43, 43,
- 75,245,242,203, 47,151,188,249,230,155,254,151, 47, 95,230,218,108,182,154,130, 22,222,203,200,200,232, 91,139, 99,213, 98,248,
-240,225,119,241,248,105,108,158, 56,167, 3, 42,117, 49,238, 62,200,178, 71, 48,183,129,126,152,231,244,171,178, 88,172, 80, 21,
- 23,122,108,209,186,115, 63,203,158, 98,140, 6, 77,103,219,249,202, 28,226,153,162,210,154,123, 19, 22,171,251,220,185,115, 7,
-146, 36, 73,158, 61,123,214,184,116,233,210,140,130,130,130, 33, 0,210, 1,160,168,168,168,247,198,141, 27,127,116, 35,148, 67,
- 85, 72,181, 88, 44, 93, 62,248,224,131,105, 0,186, 3,168,103,231, 78,178, 91,178,106, 27,193, 60, 95,173, 86,191, 48,112,224,
-192,163, 20, 69,213,119,121,142, 2, 0, 40, 29,207, 5,195, 48, 65,121,121,121, 47,186, 67, 72, 16,196,242, 39,213,144, 60, 73,
-238,199,108,135,158,137,149,140,199,143, 31,159, 55,100,200, 16, 86, 68, 68,196,199, 17, 17, 17,100, 81, 81, 17,180, 90, 45, 72,
-146, 68,112,112, 48,162,163,163, 17, 28, 28,108,187,126,253,250,162, 15, 63,252,176,198,152,124,205,155, 55,111,104,177, 88, 26,
-145, 36,217, 16, 64, 67,134, 97, 26, 18, 4,209, 16,128, 12, 0, 36, 18,137, 36, 50, 50,146,213,185,115,103,116,234,212, 9, 39,
- 79,158,196,206,157, 59,127, 0,240,171,171, 53,171,162, 22,121, 26,144,218, 22, 76,139, 75, 32,174,181, 67, 47,194,134,147, 12,
-137,222,209,201,206, 56,123, 21, 69, 86,213, 73,165, 43, 49,253,245,127,238,185,231,156, 15,156, 27,157,202,131,154, 30,190,130,
-130,130,254,227,199,143, 47,199, 73,211,180,177,176,176,240,173,174, 93,187,174,166, 40,138, 87,225,134,125,152,159,159,255,183,
-230,234,171, 24, 71,171,255,192, 87,148,143,203, 41,230,144,141,110, 30,252, 14,121,249, 74,252,156,146, 91, 84, 98,162,123,223,
- 82,150, 94,125, 18,229,127,248,240,225,128,103, 64,241, 87, 38, 90, 31, 55,121,118,129, 27, 1, 73,107,202, 81, 71,216,195,137,
-212,201, 67,158,155,155,187,236,147, 79, 62,121, 97,209,162, 69,129,135, 15, 31,150, 56, 6, 40, 67,135, 14,205,191,122,245,106,
- 15, 0, 60,131,193,112,108,209,162, 69,129,113,113,113,254, 0,252, 1, 96,208,160, 65,121,121,121,121,171,224, 69,181,176, 88,
- 44,153,209,205,155,150, 27, 57, 58, 6,128,174,239,173, 86,107,166, 39,124,149,241,184,238,211, 52, 93, 45, 31, 69, 81,239,117,
-234,212,137,122,239,189,247,242, 14, 31, 62,236, 72,164,235,170,208,110,214, 16,148,212, 29, 24, 1, 44,181,111,117, 9,157, 74,
-165,234,226,225,119,104,239,221, 88,233,128,210,147,253,127, 4,123,247,238,253,116,196,136, 17, 27,101, 50,217,150,134, 13, 27,
- 54,149,203,229, 18,129, 64, 0,163,209, 88, 98, 50,153,110,220,188,121,115,244,167,159,126,122,207, 45, 11,199,198,141, 20, 0,
-142,205,102,227,147, 36, 41, 2, 32, 33, 8,194,207, 33,180, 8,130,128,217,108,198,131, 7, 15, 48,103,206, 28,250,248,241,227,
- 95, 2,248,220,131,129,107, 7, 0,129, 46,237,120, 32, 0, 19,202, 2,216, 22, 16, 4,113,225, 73,215, 23, 97,195,201, 22,151,
- 64,164,182, 69,101,253, 68,245, 73,165,171,122,224, 10, 10, 10,186,212,245, 67, 92, 21,103, 65, 65, 65,196,211,242,132,140, 53,
- 46,221,134,117, 75,203,229, 57,116,136,176,202,246,107,130, 70,111,157,250,205,175,215,150, 25,173,140,205,108,181,253,247, 86,
- 65,105,170,183, 29,170,115, 60, 95, 87,207, 82, 29,150,233,106, 90, 90, 90,215,169, 83,167,126, 42, 20, 10, 59, 2, 64,105,105,
-233,217,236,236,236,249,176,175, 42,172,233,184, 23, 85, 67,169, 84,182,127, 26,249, 76, 38,211,187, 93,187,118,253,154,166,233,
-175,172, 86,107,210,255,131,191,194,224,189, 27,159, 93,108,223,190,253, 30,128, 46, 0, 48,108,216, 48, 10, 0,118,238,220,233,
-177,120, 30, 55,110, 28,205, 48,140,217,126, 63,232, 80,182,186,176,200,209,166,234,116,186,162,236,236,236,235, 52, 77, 95, 7,
-240, 35, 60, 95,113, 27, 72, 16,196, 1,134, 97, 6,219,133,219, 1,134, 97, 6,187,126,246,164,173, 90, 53,156, 82,179, 51,188,
- 23,101,216,153, 10,162,226, 84, 96, 77,251, 53,225,102,158, 46, 1, 64, 59,111,237,254,191,196,221,236,236,236,177,143,113,220,
-139,103, 15,233, 38,147,105,200,255,163,235,213,120,255,242,127, 73,255, 87, 11,129,229,192,245,235,215,159,152,139,192, 63,141,
- 22,151,202, 15,192, 43,238,187, 32,182, 50,225,229, 21, 90, 94,120,225,133, 23, 94, 60, 14,212,222, 42,240,226,223, 12,135,111,
-150, 99,191, 10, 31,173,138,254, 89,206,125, 2, 85,175, 28,240, 36, 43,121,109, 86, 73, 28,243,114,122, 57,189,156, 94, 78, 47,
-231, 63,206, 41, 5, 16, 9, 96, 73, 13,231, 85, 92, 93,152, 7, 64, 9,192,226,173, 79, 47,231, 99,232, 7,183,192, 48,204,160,
-234,166, 14, 9,130, 56,248,164,132,150,211, 25,190, 45,230, 70, 95,194, 92,199,126, 77, 66,139, 97,152,248,191, 67, 8,246,243,
-114,122, 57,189,156, 94, 78, 47,167,151,211,203,233,229,124, 76,161,213,231,195, 15, 63,252, 8,101,161, 49,152, 15, 63,252,240,
- 35,134, 97, 6,149, 29, 98, 6, 61,201,223,190,214, 14,189, 82,219,130,113,108,215,218,161, 87, 21,167,198,186,108,229,195, 59,
-120,225,133, 23, 94,120,225,133, 23, 94, 60,197, 56,189,120,241,226,210,197,139, 23, 59, 28,223, 11, 0, 16,118, 11, 87,193,147,
-252, 97,251, 52,161, 59, 11,165,170, 79,193,243, 15, 32,132,100,113,198,176, 57,188, 62, 96,108,209, 0, 0,146,186, 70,155, 12,
-191, 91,173,230, 45, 0,178,107, 75,220, 12,104,222, 88, 42,216,103,164,105, 78, 70,137,105, 88, 90, 89,154, 3,143, 49, 12,232,
-198,227,114,127,227, 73,165,130,202,142, 27,213,106,189,209,100,122, 97, 39,112,202,251, 12,120,225,133, 23, 94,120,241,140, 64,
-228,231,231,119,156, 36,201, 8,199, 7,174,113, 7, 43,198, 32,164,105, 58, 71,165, 82,189,128,178,169,226,191,147,211,245,251,
- 38,212,178, 47,175,107,184, 59,117, 8,215,240, 14, 46, 81, 88,255,150,140,217, 20,155,247,166,143,175,116,225,127,198,191,235,
- 31,213,164, 41, 17, 30, 30, 10, 48, 64,122, 70,166,252,206,237, 91,125,183,111,250,102,102,177, 70, 53,199, 98, 52,126,231, 41,
-119,115, 64, 84, 79,204, 75,250,238,195,215,165, 44, 88, 49,106,193,214, 35,132,214, 28,126,189,108,185,169, 71, 34, 75,234,239,
-255,235,226, 99,199, 4,126,173, 91,151, 59,198, 48, 76, 89,126,189, 43, 87, 4, 31,191,240,194,175,195, 84,170,254, 94,177,245,
-175, 68,176, 68, 34,153,206,102,179,123,155,205,230, 8, 46,151,155, 65,211,116, 66, 81, 81,209, 10, 0, 89,222,234,249,119,163,
-105,176,168, 71,211,134, 17, 91,179,115,243, 82,138, 13,166, 9, 55,179,181, 42,111,173,120,140,234,242,107,254, 99,185, 55, 1,
- 64, 44, 22, 95, 36, 73, 50,204, 85, 4, 56,114,246, 58,246, 43,190,218,108,182,123, 42,149,170,107, 53,180, 13,101, 50,217,106,
- 0, 29,106, 10,152,108,143,205,118, 65,165, 82,189,133,170, 87,235,249,248,249,249,205, 35, 8, 98, 56, 73,146, 84, 77,215,100,
-179,217,104,134, 97,118, 20, 21, 21,125, 14,160,164,170,243,252,252,252,142,165,165,165,117, 8, 10, 10,170,209, 74, 99,181, 90,
-145,158,158, 30,216,177, 99,199, 63, 84, 42, 85,179, 39,201,249,119,107,145,218,162,154, 85,135, 85,222,232, 0,202,229, 23,122,
-162, 17, 89, 57,124,241,190, 46, 61,251,247,153, 50,237, 61,209,165,171, 55,240,219,201, 51, 40,214, 25, 65,145, 36,164, 62, 66,
- 52,105,210,136, 88, 30,191, 43,224,135,181,203,191, 58,155,120,116,144, 65,167,121,217, 35,153, 46,100,205,153,253,106, 71,145,
-191,140, 6,108, 52,222, 31,216, 70,244,241,129,148, 57, 40,181,126,228,177,200, 58,126, 92,152,159,151,135,184,144, 16,176,172,
- 86,240, 73, 18,124,130, 0,159, 36, 33,226,243, 49, 96,195, 6,204, 63,124, 88,248,233,139, 47,122,197,214,191, 12, 98,177,120,
-124, 72, 72,200,210,245,235,215,251, 55,104,208, 0, 34,145, 8, 42,149, 42,224,230,205,155,109,103,204,152, 49, 54, 39, 39,231,
-147,226,226,226,117,222,154,250,247,194,102,195,152,239, 23,190, 21,154,243,240,118,232,164, 69,219,154, 16,254,116,239, 27,133,
-250, 92,111,205,184,141,182, 0, 82, 80,121,254,210,234,142, 85, 9, 62,159,159,103, 48, 24,130,170, 59,135,203,229,230,155, 76,
- 38,121, 77, 92, 36, 73,134,101,101,101, 5, 9,133, 66,208, 52,109,207, 6, 96,115, 14,164, 93,179,159,216, 3,213,162, 89,179,
-102,230,234, 56,125,124,124,190,205,207,207,239,231,200, 19,232, 34,168, 42, 69, 86, 86, 86,191, 22, 45, 90,124, 91, 82, 82,242,
- 66, 21,226,101,222,180,105,211,166,183,108,217,210, 97, 5,178,103, 65, 40,123, 85, 42,149,152, 58,117,170,243, 55,108, 54, 27,
-142, 30, 61, 58,109,252,248,241, 40, 42, 42,154, 81,205,181, 71, 4, 5, 5, 17,246,132,226, 85, 98,238,220,185,152, 59,119, 46,
-190,249,230, 27,130,205,102, 75,107,168,207, 58,225,252,187,180, 72,109, 44, 88, 53, 68,134, 63,136,242,225, 29, 14, 62, 34,180,
-254, 14, 80,108,222,127, 59,116,237,215,123,234,244,217,162,109,191,156,192,205,235, 87,144,150,244, 83,185,115,218,191, 48, 30,
-185,202, 18,140,159,242,190,152,160, 88,189, 19,143,237,253,175,197,168,255,222, 77,107,150, 60,130,199,125,167,115,199,104,118,
-150,224, 38,130,253, 4,232,222,174, 49, 59,252,215, 63,223,209,193,250,245,245,178, 85, 50, 30,137,172,245,175,191,142, 30, 22,
- 11,130, 40, 10, 20, 65,128, 2, 64, 18, 4, 12, 70, 35, 46,140, 25,131,142,155, 55,227,243,253,251,133,243, 94,122,201, 35,177,
- 37, 18,137, 46, 17, 4,225,167,213,106, 7,161, 44,177,244,179,128, 22, 98,177,248, 32,195, 48, 69, 58,157,174,237, 83, 84, 46,
- 5,202,230,232, 43,142,142, 57, 40, 91, 81,229, 81,102, 97, 30,143,247,230,176, 97,195,150,175, 90,181, 74,152,151,151,135,236,
-236,108,208, 52, 13, 62,159,143,168,168, 40,226,216,177, 99,254,179,103,207, 94,118,240,224, 65, 94, 73, 73,201,215,158, 12,108,
-216,108,118,188, 76, 38,123, 81, 46,151,139,242,243,243, 75,213,106,245, 81,163,209,248, 38,106,159, 54,133,100,179,217,163, 35,
- 35, 35, 95, 9, 9, 9,145,103,101,101, 41, 51, 51, 51,247, 25,141,198, 31, 80,203, 68,205, 46,117,218, 26,246,104,245, 0,114,
- 34, 35, 35,175, 61,120,240, 32,191, 14, 57,179, 35, 35, 35, 83,107,193, 41, 2,176, 29, 64, 72, 13,231,101, 3, 24, 1, 15,173,
-217,206,138,101,108,135, 22,172, 88, 63, 33,110, 92,119,226,251, 25,253,162, 38,127,115,236, 12,201, 97,122, 94,207, 49,100,120,
- 53,148,123, 34,203,158,210,170,162,160,170,238, 88,181, 48, 26,141,129,102,179, 25,236, 42,146,197,235,116, 58,248,248,248, 4,
-186, 91, 72,129, 64,128,159,126,250, 9,108, 54, 27,108, 54, 27, 69, 69, 69, 8, 11, 11,115,238,115, 56, 28,231,251,122,245,234,
-213,200, 71,211,116, 71,138,162,160,213,106, 65,211,180,115, 83,171,213, 96, 24, 6, 60, 30, 15, 52, 93,150,206,201,229,120,199,
-170,248, 8,130, 24, 30, 18, 18,130,109,219,182,193,100, 50, 61,114, 92, 34,145,224,234,213,191,146,140, 80, 20,133, 78,157, 58,
-145, 4, 65, 12, 7, 48,163, 26, 94, 6, 0, 98, 99, 99, 65, 81, 20, 40,138, 2, 73,146,206,247,142,141,166,105,204,157, 59, 23,
- 21, 82,147,253,109,156, 79, 27,106,136, 12,159,131, 42,124,180,200, 39, 92, 46,215, 37,158, 33, 66,145,228,139,183,222,125, 95,
-124,240,143, 63,145,158,145,254,136,200, 2,128,139,191,253,128,156,236, 44,164,164,101, 98,244,150, 61, 49, 16, 0, 0, 29, 44,
- 73, 68, 65, 84,127,223, 22, 75, 36,210, 47, 42, 52,168, 85, 46, 27,245,245,225,124,249,225,136,238,124,173, 37, 27, 37,126, 0,
-213,144, 11,182, 80,135,217,131, 91,243, 36, 62,156,165,238,148,147,199,229,254,182,248,216, 49,167,200,234,102, 52,130, 71,211,
-176,210,180, 83,100,153,172, 86,232, 77, 38, 40,180, 90,220, 25, 63, 30,140,197,130, 79,246,236, 17,242,184,220,223,220, 41, 39,
- 0,112, 56, 28,197,190,125,251,234,181,106,213,234, 36,220, 15,102,122,236, 9,255, 71,213,161, 93,155, 54,109, 18, 54,111,222,
- 92,143,195,225, 40,234,130,147,207,231,191, 38, 18,137, 10,248,124,254,107,181, 44, 39, 9, 96,193,132, 9, 19,146, 27, 53,106,
-116,194, 46,172,156,162,166, 81,163, 70,199, 38, 76,152,112, 9,192,220, 42,238,245,202, 56, 67, 67, 66, 66, 22,174, 90,181, 74,
-120,235,214, 45,100,101,101,193, 98,177, 96,212,168, 81,160,105, 26,122,189, 30, 38,147, 9, 75,150, 44, 17,249,251,251,207, 65,
- 89,162, 96,119,174,157,227,235,235,123,107,211,166, 77,195,238,223,191, 47, 62,113,226, 4,113,245,234, 85,209,178,101,203,134,
-248,251,251,223, 4,192,171, 69,125,146, 10,133,226,251,189,123,247,190,117,245,234,213,176,221,187,119,179,207,158, 61,171, 88,
-187,118,237, 68,133, 66,177, 25, 0, 85,203,255,168,173, 80, 40,236, 59,107,214, 44,219,233,211,167,179, 78,159, 62,157,181,124,
-249,114,244,232,209,163, 91, 92, 92, 92, 76, 45, 57,219,249,248,248, 60, 55,107,214, 44, 91, 98, 98, 98,246,185,115,231, 50,151,
- 45, 91, 70, 62,247,220,115,221, 23, 46, 92,216,218, 67,206,237,167, 79,159,238,149,145,145,209, 32, 51, 51,179,126,102,102,102,
-100,102,102,102,100, 86, 86, 86, 68, 78, 78, 78,189,220,220,220,240,252,252,252,240,132,132,132,238, 0,182,186,195,217, 84, 46,
-122,107,198,168,126,165,115,254, 59,144,249,232,141,231,153,217,163,122, 49, 47,246,108,245, 11,197, 98, 17,231, 82,211, 17,230,
- 11,252, 48,181, 67, 68,120,128,232,106,180, 76,220,228, 41,123, 54,159, 54, 78,150, 67, 72,169, 84, 42, 28, 60,120, 16,118,235,
- 85, 91, 87,145, 85, 92, 92,140,156,156, 28,199, 49,150, 59,229,148, 72, 36,199,215,175, 95,207, 24, 12, 6,104, 52, 26,228,231,
-231, 35, 35, 35, 3,119,238,220, 65, 97, 97, 33,110,220,184, 1,161, 80,120,220,157,114, 18, 4, 1,154,166,157, 66,234,232,209,
-163,152, 48, 97, 2, 84, 42,149,243, 51, 22,139,229,124,239,248, 78, 77,156, 14,203, 19, 77,211, 56,119,238, 28, 38, 77,154,132,
-229,203,151, 99,235,214,173, 56,112,224, 0, 84, 42,149, 83,108, 89,173,214, 26, 57,149, 74, 37,108, 54,247,198, 76, 12,195, 64,
-163,209,184,253,191,187, 10, 32, 22,139,245,136, 40,114,108,158,220, 75,143,201,249,212,194,141,200,240, 85,143,176, 29,111,236,
-166,186,222, 79,170,144, 36,139, 51,122,248,184,105,254,153,249,197,200,202,211,128, 34,255,234,247, 98,250,141, 3,139, 34,113,
-254,215, 50,195, 21, 73, 81,208,232,140, 80,107,205, 24, 54,110,186,236,187,229,159,141,182,154, 13,213,198,120,105, 9, 68, 69,
-139,197,175,182,104, 81,143,188,206, 75, 67,204,139, 73,160,109, 0,147,248, 18,218, 22, 5, 81,205,126,227,190,170, 43, 49, 47,
-188, 10,220,170,214,154, 33,149, 10,252, 90,183, 70, 92, 72, 8,122, 90, 44,224, 48, 12,158,207,203,195,149,233,211, 97,220,181,
- 11, 36, 0,206,107,175,161,207,138, 21,248, 35, 36, 4,193,122, 61,212, 51,103, 34,240,200, 17,112, 36, 18, 1, 10,220, 91,252,
- 64, 16, 4,122,247,238,141, 99,199,142,249, 15, 24, 48,224,215, 63,255,252,115,168,213,106,253,163, 54,117,235,235,235,123,145,
-197, 98,133,213,116,158,213,106,205,212,104, 52, 30,167, 25, 97,177, 88, 61, 59,117,234,180,103,247,238,221,126,102,179,185, 78,
- 70, 33, 92, 46,119,192,144, 33, 67,214,175, 89,179, 70, 50,113,226,196,245, 7, 14, 28, 40, 53,153, 76, 71, 60,185,165, 0, 44,
- 88,183,110,221,228,216,216, 88,233,196,137, 19,153, 59,119,238,184, 90,175, 2,123,244,232,209,104,253,250,245,193, 29, 58,116,
-152, 54,105,210, 36, 14,128, 79,106,178,242,136,197,226, 41,235,215,175, 15, 80, 42,149,208,106,181,206, 70, 54, 51, 51, 19, 2,
-129, 0, 36, 73,130, 36, 73,176,217,108,124,241,197, 23,254, 83,166, 76,153,174, 82,169,166,187, 97, 37,139, 95,189,122,117,224,
- 11, 47,188, 64,222,191,127, 31, 36, 73,130,207,231,227,245,215, 95, 39,245,122,189, 95, 92, 92,220, 70,157, 78, 55,210,147, 58,
-100,179,217,163,227,227,227,155,116,235,214,141,149,150,150,134, 46, 93,186,224,252,249,243,120,237,181,215,216, 37, 37, 37,245,
-103,207,158, 61,193,104, 52,122, 26,199, 69, 33, 20, 10, 91,254,254,251,239, 25,225,225,225,206,134,165,126,253,250,244,160, 65,
-131, 84,105,105,105, 77, 79,159, 62, 93,216,181,107, 87, 79, 18,150,135, 10,133,194,102,135, 14, 29,202,137,139,139,235,187,110,
-221,186, 33, 0,208,177, 99,199,125,243,231,207, 63,161, 82,169,162,255,248,227, 15, 85,207,158, 61, 51,221,228, 11, 81, 40, 20,
-244,212,169, 83,197,213,157,180, 97,195, 6, 53,202, 18, 46, 55, 0, 80,109,190,182,166,145,193,115,150, 78, 31, 46, 0,109, 6,
- 99,209, 3,230, 82,192,172,133,205, 84, 10,130, 35, 0, 44,122, 4,242, 84,216, 62,165,169,228,131,109,119,175,211, 55,136, 65,
-105,202,146, 35,240,162,210,166, 6, 64, 12, 65, 16, 41, 7, 15, 30, 68,167, 78,157,112,240,224, 65, 12, 26, 52, 40,197, 85, 12,
- 92,189,122, 21, 61,123,246,132,221,162,229,150,175,150, 70,163,249,112,238,220,185,137,163, 71,143, 22,150,107, 12, 72, 18, 82,
-169, 20, 3, 7, 14, 52,232,116,186, 15,221, 45, 40, 77,211, 96,177, 88,200,204,204,196,134, 13, 27,176,104,209, 34, 68, 69, 69,
-193, 98,177, 60, 34,182,236,237,158, 91,141,159,213,106,197,133, 11, 23,176,101,243,102,124, 50,103, 14,124,124,124, 0, 0,102,
-179, 25,170,162, 34,240,249,124,167, 24,171, 65, 56,237,184,125,251,246,244,176,176,176,114, 83,134,142, 87,123,155, 5,155,205,
- 6,171,213, 10,131,193,128,229,203,151, 91, 25,134,217, 81, 83,255,227, 16, 69,211,167, 79,135,209,248,151, 65,189,181,221, 39,
- 57, 50, 50, 18,109,218,180,113,238,147, 36,201,184,203,249, 93,215,150,208,187,156,221,116,238, 50, 0, 64, 88, 88, 24,154, 54,
-109, 10,133, 66, 81, 37,231,147,214, 34,181,129, 7,145,225,171, 22, 90,127, 71,166,108, 54,135,223,167, 97,227, 38, 68,122,142,
- 10, 44, 22, 11, 34,223, 0,116,125,101, 6, 40,138,132, 88, 26, 0,130,214,255,165,136, 73, 10, 44,138, 5, 85,137, 30,145, 13,
- 26,147, 60,190,160,143,174, 6,161, 37,241,101,175,158, 53,178, 43,191,208,154, 9, 65, 61, 62,104, 71,119, 26,194, 5,233, 95,
-130,247, 6, 68, 9, 98,247,253,185, 26, 26,203,115,238,148,151,178, 90, 17, 68, 81, 48, 51, 12,174, 76,159,142,152,248,120,164,
- 56,132, 97,124, 60, 82, 98, 99, 33, 99,179,193, 35, 73, 48, 22,203, 35,115,250,238, 8, 45, 0,200,200,200,192,174, 93,187,100,
-195,135, 15,223,115,245,234,213,209, 30,138, 13, 7, 87,192,185,115,231,130, 26, 52,104, 80,229, 57,247,238,221, 67,251,246,237,
- 61,158,158,226,114,185, 3,158,123,238,185,109,187,118,237,242, 77, 77, 77, 69, 80, 80,208, 99, 11, 45, 30,143,215,179, 95,191,
-126,219, 54,109,218, 36, 41, 40, 40, 64,124,124,188,228,165,151, 94,218,154,156,156,252,138,209,104,116, 71,108,150, 19, 89,241,
-241,241,234, 13, 27, 54,124,135,242, 83,132, 57, 27, 54,108,248,190, 67,135, 14,111,197,198,198, 74, 1, 76,182,251, 14, 84, 43,
-182,120, 60, 94,239,134, 13, 27,150, 27,213,242,120,101,198, 38,145, 72, 4, 95, 95, 95,112, 56, 28, 24,141, 70,196,196,196, 16,
- 92, 46,183,187, 59,215,236,227,227,211,239,213, 87, 95, 37,147,146,146,144,155,155, 11,169, 84, 10,177, 88, 12,154,166, 49,113,
-226, 68,106,249,242,229,189,117, 58,207,102,184,194,195,195,135,244,237,219,151,117,237,218, 53,220,191,127, 31, 70,163, 17, 55,
-111,222,132, 68, 34,193, 27,111,188,193, 89,186,116,233, 75, 89, 89, 89,158, 10,173,150,177,177,177,121,174, 34,203, 1,145, 72,
- 68, 52,105,210, 68,229,239,239,223, 14,128, 39, 66,171,229,219,111,191,157,191,120,241,226,158,199,142, 29,115, 6,189, 60,118,
-236,216,108, 0,248,250,235,175, 19, 3, 3, 3,219, 1,112, 87,104,129, 97, 24,219,127,254,243,159,135, 92, 46, 23,108, 54, 27,
- 92, 46,183,220,198,225,112, 64,146,164,143,227,113,174,137,239,250,253,220, 37, 19,103, 47, 91, 38,226, 83,236,119, 95,105,133,
-122, 82, 14, 32,144,129,211,243, 3, 16,210, 50,163, 37,163,186, 7,252,246, 1,190,122, 85, 69,198,254,104,248,197, 76,251, 5,
-222, 45, 42, 42,249,135,251,128, 14, 0,254,135,178,228,186,115, 0,156,123, 74,250,166, 75, 0, 98, 6, 13, 26,228, 20, 91,135,
- 15, 31,198,128, 1, 3,160, 86,171,113,237,218, 53, 87,145,229, 73,130,229, 75, 22,139,229,242, 79, 63,253,212,117,248,240,225,
-132,203,243,133,212,212, 84,220,184,113, 35,197, 93, 62,146, 36, 97,179,217,192,102,179,177,108,217, 50,152,205,102,252,248,227,
-143,216,185,115, 39, 72,146, 4, 65, 16, 32, 8, 2, 18,137, 4,223,124,243,141, 71,237, 30, 77,211,216,184,113, 35, 62,152, 61,
-219, 41,178,236, 51, 25, 8,150,203,225, 31, 16,128,187,119,239,214, 40,180,138,138,138, 62,223,191,127, 63,170,115,134,223,191,
-127,191,243,125, 5,103,248,154,251, 57,138,130,209,104,196,243,207,255,149, 42,246,237,183,223,118,190, 87,169, 84,160, 40,202,
- 81, 23,132,187,156,122, 6,120,133,255,215,103, 3,223,123,175,156,133,174, 42,206,191, 67,139,212,149,117,171, 18,177, 21, 99,
-183,206, 42, 0, 12, 66,153,143, 86, 14,240, 55,250,104, 49,140,173, 89, 88,104, 8, 46,223,185, 10, 22, 69,129,235, 27, 0, 95,
-153, 28, 54,171, 9,154,252,251, 56,185,251, 91, 0,192,186,141, 59, 64,146, 36, 88, 44, 10, 70, 19,141,168,122, 33,176,217,108,
-205,170,227,110, 14,116,237, 45, 15,232, 20, 30, 33, 37,174,249,221, 71,147, 32,255, 10, 19, 33, 60, 68,101,139,137, 46, 98, 65,
-199, 34, 77,113,215,235,192,233, 26,197, 0, 73,130, 36, 8, 8, 57, 28, 24,119,237, 42,243,218,140, 47,235,179, 82, 98, 99, 65,
-254,242, 11,124,120, 60, 80, 4, 1,150,221, 4, 93, 27, 20, 23, 23,131, 32, 8,108,217,178,197,239,141, 55,222,216,122,237,218,
-181, 88,131,193,176,203, 19, 14,181, 90, 61,168, 91,183,110, 39, 54,110,220, 24, 24, 28, 28,252,200,241,220,220, 92,140, 27, 55,
-174, 64,173, 86,123, 20,212,141,207,231,191, 54,100,200,144,245, 63,252,240,131,228,246,237,219,208,106,181, 8, 12, 12,124,220,
- 91,161, 93,231,206,157,247,236,218,181,203, 55, 55, 55, 23, 26,141, 6, 70,163, 17, 91,182,108,145, 14, 28, 56,112, 87, 90, 90,
-218, 0, 0,201, 53,112,124,234, 42,178, 38, 77,154,244, 39,128, 32, 0,171, 43,106, 80,251,177, 86, 46, 98, 75, 3, 96,105, 53,
- 35,209, 8,145, 72,132,252,252,124,140, 27, 55, 14,183,110,253,101, 0, 13, 9, 9,113,142,244,238,222,189,139,192,192, 64, 16,
- 4, 17,228,206, 69, 7, 6, 6,138, 77, 38, 19, 38, 76,152,128,140,140,140,114,156,153,153,153, 32, 8, 66,232,105, 69,202,229,
-114,185, 94,175, 71,143, 30, 61, 96, 48,148,229,245, 29, 49, 98, 4,216,108, 54,242,243,243,193,102,179, 3,106,241,255, 4, 12,
- 26, 52,168,202,208, 42, 18,137,196,236,231,231,215,220, 67, 78,255,151, 94,122, 41, 43, 62, 62,254,145,133, 45,231,207,159,127,
- 89, 38,147, 29,147,201,100, 77, 60,228,180,185,138, 42, 14,135, 83, 78,104,177,217,108,144, 36,233,182,143,218,173,124,221, 42,
- 22,145,211,102,241,212, 23,198,213, 11,242, 5,163,205, 3,231,185,207,113,185, 64,128,101,203, 15, 1, 0,222,127,189, 61, 90,
-247, 91, 0,211, 15, 47, 96,122, 23,138, 59, 38,211, 56, 11,192,167,255,112,155,255, 37, 0,199, 42,184, 53, 0,218, 60, 69,253,
-145, 83,108, 29, 62,124, 24,209,209,209, 40, 42, 42, 66, 90, 90, 90,109, 69,150,163,189,251, 96,222,188,121,191, 13, 29, 58, 84,
-228, 24,180, 10, 4, 2,204,156, 57, 83,175,213,106, 63,240,232, 38,178,217,192, 98,177,156,131,100, 62,159,143,152,152, 24,167,
-200, 34, 8, 2,165,165,165, 96,177, 88,142, 21,137,132,155,101,132, 34, 56, 24, 62, 62, 62,104, 28, 21,133,219,246,118,196,241,
-158,199,227,129, 32, 8, 88,173, 53, 26,242, 74,236, 78,237, 51,234,186, 75,118,136,162,106, 77,199, 33, 33,176,217,108, 14,145,
-201,212, 5,103, 64, 64, 0,180, 90,173,187,156, 79, 37,170,176,104, 57,132,214, 32,148,249,106, 61, 18,222,161, 23,128,147,120,
-130, 75, 42, 9, 48,132,141, 97,192,162, 72,251,220, 45, 5,138, 34,161, 42,200,193,138,207, 39,219, 69,214, 78, 28, 76, 76, 67,
- 88,195,232,191,230,113, 9, 2, 96,170,191,185, 3,125, 57,241, 83,134,118, 22,228, 17, 57,144,134, 8,193,231, 87,208,143,126,
- 28, 16,145, 36,166,246, 14, 19, 94,216,111,136,191,174, 49,215,216, 81,240, 73,178,204,249,157, 32, 42,117,238, 33,237,199, 40,
-130, 40,139,254,106,243,204,239,216, 33,228, 5, 2, 1,204,102, 51, 40,138,194,202,149, 43,165,253,250,245, 91,237,169,208, 2,
-144,154,151,151, 55,112,226,196,137,135,119,236,216, 17, 16, 16, 16, 80,110,244, 48,113,226, 68,101, 94, 94,222, 64,120,232,116,
-207,102,179, 87,175, 89,179, 70,242,224,193, 3,148,150,150, 66, 32, 16, 56, 27,159,218,222,159, 29, 59,118,252,245,200,145, 35,
-126, 26,141, 6,102,179, 25, 2,129, 0, 12,195,128,162, 40,252,252,243,207,254,131, 7, 15, 62,148,158,158,254, 92,117,101, 21,
- 8, 4,175,216,133, 19, 98, 99, 99,165,177,177,177,189,128, 42, 35,245, 58, 17, 27, 27, 43,157, 49, 99,198, 75,122,189,126,105,
- 53,215,156,161, 82,169,130, 5, 2, 1,118,239,222, 13,177, 88, 12,161, 80,136,144,144, 16,168, 84, 42, 8,133, 66, 48, 12, 3,
-139,197,226,104, 44, 10,221,185,240,130,130, 2,173,213,106,245, 61,124,248, 48, 10, 11,255,250, 74,189,122,245,160, 86,171, 97,
-179,217, 74, 61,173,204,236,236,236, 60,130, 32,194, 47, 95,190,140, 7, 15, 30, 96,192,128, 1,248,229,151, 95,208,190,125,217,
-236,176,201,100,170, 77, 16, 63,154,162, 40,166,154,251,150, 0,224, 87,151,156,246,206,203, 35, 78,155,205,102,115,136, 44,215,
- 87, 87,241, 85,195,111,150,123,156,155,203,197, 27, 22, 79,233, 59,238,133,232, 0,232, 11,238,131,239, 19, 0, 66, 26,137,101,
-203, 15,225,218,189,178,255,107,217,214,139,216, 22, 55, 16, 16,200,208,212, 87,137, 96, 31,214,171, 55,242,255,113,161,229,235,
- 58, 78,120, 90, 59,166, 1, 3, 6, 64,165, 82, 65, 44, 22,215,133,127,206, 25,189, 94,127,115,239,222,189,237, 6, 13, 26, 4,
- 46,151,139,155, 55,111, 34, 57, 57, 57, 13,192, 25, 79,133, 22,155,205,198,188,121,243, 48,121,242,100,200,229,114,124,240,193,
- 7, 96,177, 88,206,141, 32, 8,167,133,203, 19, 4,201,171, 95,248,232,112,136,175,201, 24,238,235,235, 59,143, 36,201,225,148,
- 27, 21, 71,211, 52,109,179,217,118,104, 52,154,106,195, 59, 56, 28,215,221,249, 47, 92,235,160,134, 62,237,177, 57,255, 14, 45,
- 82, 27, 84, 92,109, 88,133, 69,203,177,234,240,145, 84, 64,142,171, 60,105, 55,217,157,124, 82, 5, 37, 72,234, 70,102, 86, 54,
-252,253,196,118,145,101,223, 72, 18,173,163,203, 6,179, 7, 19,211, 16,214, 32, 26, 44,138, 2,139,162, 32, 22,240,144,151,155,
- 3, 22,139,188, 81, 21,111, 75, 10, 67,135, 54, 9,143,244,243,103, 67, 25,104,130, 66, 94,133, 97,160,157, 15,194, 20, 92,244,
-247,231, 71,180,164, 48,180,122,235, 27,227, 20, 90,102,171, 21,156,215, 94,115, 78, 23,166,196,198, 34, 38, 62, 30,244,144, 33,
-208,153,205,229, 76,197,181, 21, 90, 2,129, 0, 37, 37, 37, 24, 61,122,180,202, 98,177,188, 85,203, 42, 78, 46, 44, 44, 28, 54,
-102,204,152, 66,135,128, 49,155,205, 24, 51,102, 76, 97, 97, 97,225, 48, 55,172, 68,143,192, 98,177,188,213,190,125,123,149, 82,
-169,116,150,179, 54, 13,142, 3, 50,153,236,224,134, 13, 27,100, 70,163, 17, 86,171,213,201, 41, 16, 8, 64, 81, 20, 2, 3, 3,
-177,109,219,182, 64,153, 76, 86,109,206, 42,189, 94,191, 55, 62, 62, 94, 13, 0,241,241,241,106,130, 32, 18, 8,130, 88, 75, 16,
-196,154, 10,219, 90,130, 32, 18, 92,207,213,235,245,123,170,227, 54,153, 76, 9,105,105,105,140, 80, 40, 4, 69, 81, 48,155,205,
-224,243,249, 78,147,120,113,113, 49,244,250,178,105,238,228,228,100, 88, 44,150, 36,119,174,189,164,164,228,248,198,141, 27,109,
-245,234,213, 67,116,116, 52, 98, 98, 98,208,185,115,103, 68, 68, 68, 96,254,252,249,180, 78,167,243,248,217,203,206,206, 62,184,
-125,251,118, 75,120,120, 56,218,181,107, 7, 30,143,135,214,173, 91, 35, 36, 36, 4,139, 22, 45, 50,105, 52,154,195,181,248,155,
-210,175, 94,189, 74, 85, 35,114, 37,112, 99,245,110, 5,100, 92,184,112,129,234,220,185,243,190,138, 7, 58,118,236,184, 79, 44,
- 22,251, 58, 76,236,158,140,200, 93,197, 21,143,199,115,110,142,207, 89, 44,150, 59,163, 31,178,185, 92,188,225,139,201,125,198,
-189, 16,237,135,125,199,207,129, 99, 86, 3,166,106,102, 4,105, 11, 8,142, 8,114, 95,118,216, 83,208, 7, 76, 7,240, 39,202,
-226, 48,125,128,167, 11, 78,199,247,194,194, 66,164,165,165, 33, 57, 57, 25,157, 59,119, 70, 82, 82, 18,240,151,131,188,199,208,
-104, 52, 31,196,197,197,233, 28, 43,249,230,204,153,163, 47, 41, 41,249,192,211, 54,152, 97, 24,176,217,108, 52,109,218, 20, 51,
-102,204,192,161, 67,135,112,243,230, 77, 88, 44, 22,167, 16,114,248,100,122, 98,209,226,112, 56,144,203,229,176, 88, 44, 78,107,
- 22, 0,220,190,117, 11, 44, 22, 11, 54,155, 13, 38,147,169, 70,139,150,175,175,239,188,245,235,215, 79, 83, 42,149,138,130,130,
-130, 32,215, 45, 47, 47, 47, 40, 39, 39, 39, 40, 43, 43, 43, 40, 35, 35, 35,232,225,195,135, 65,247,239,223, 87, 44, 89,178,100,
-154,175,175,239, 60,119,202, 73, 81, 20, 90,183,110,141,183,223,126,219,185,173, 90,181,202,185,157, 60,121,210, 99,231,117,138,
-162,208,116,238, 50, 12, 44, 96,156,219,161, 64,194,185, 93,123,127, 82,117,156, 79, 92,139,212, 74,191,216, 87, 27,186, 38,150,
-174, 4,142, 85,135,142,182,204,233,182, 81,209, 25,254,137,193,106, 50,156,184,119,231, 86,159,166, 45, 59,144,185, 74,109,185,
-229,159, 49,189,135,129, 32, 8,132, 54,136, 6,197, 98,129,162, 72,176, 40, 10, 82, 9, 31,105,151, 47,219,140,122,253,137,202,
- 56,123, 1, 44,174,128,187,234,245,254,173,249,217,220,124, 4, 42, 68,224,176,203,180, 35,115,111, 88,133, 30,130, 5,180,244,
-193,248, 44,127,193,137, 60,195, 42, 63,157,121, 95, 66, 21, 35, 64,155,205, 6, 49,143, 7,131,209, 8,189,213,138,222, 43, 86,
- 56,167, 11, 73,130,192, 37, 0,173, 86,172,192,233, 93,187, 32,225,114, 1, 30,207,237, 85, 33,149, 9, 45,165, 82,137,177, 99,
-199, 22,230,228,228,188, 81, 27, 31, 45, 7,140, 70,227, 31,185,185,185,111, 12, 27, 54,108,203,238,221,187,101,195,134, 13, 83,
-229,230,230,190,225,166,223,211, 35, 48, 24, 12,187, 50, 50, 50, 74,199,142, 29,187,121,235,214,173,254, 1, 1, 1,206,145, 72,
-173,110, 86,130, 80,246,237,219,151,231,206,121, 53,156, 18,103,119,110,159,108,183,108,181,154, 52,105,210,105,148,249, 95,185,
- 98,238,186,117,235, 70,184, 76, 49,174, 5,176,162, 58,226,226,226,226, 53, 51,102,204,248,239, 31,127,252, 17,192,231,243, 65,
- 16, 4, 56, 28, 14, 26, 55,110,236, 92, 69,195,102,179,193, 48, 12,222,123,239, 61,101,126,126,254,215,110,254, 55,147,226,226,
-226,122, 26, 12, 6,191,177, 99,199, 82,124, 62, 31,121,121,121, 88,190,124, 57,253,195, 15, 63,168,117, 58,221,184, 90, 8,225,
-141,159,125,246, 89,111,173, 86,219, 96,226,196,137, 28,141, 70, 3,189, 94,143, 89,179,102,153,190,255,254,251, 76,189, 94,239,
-113,192,223, 46, 93,186,220,121,248,240, 97,247,210,210,210, 34,161, 80, 88,209,218, 71,136, 68,162, 14, 0, 54,123,194, 25, 19,
- 19,115, 55, 61, 61,189,243,130, 5, 11, 18, 44, 22, 11,251,252,249,243, 78,103,248,149, 43, 87,158,228,243,249,125, 81,197,178,
-232,106,238, 17, 27,143,199, 43,103,193,170,248,158,197, 98,213,216,166, 53, 11, 22, 46,248,226,205,158,227,158,111,238,139,189,
-199, 47, 34,110,207,189, 27, 81,227, 2,155, 54,242, 43,128,173, 32, 13,239,191,222, 30,203,182, 94, 4, 80, 54,117,104,203,191,
- 6,166,232, 46, 24,159,112,220, 87, 41,179,159,130, 62,224, 36,202, 66,102, 60,109, 40, 39,178,174, 93,187,134, 62,125,250, 0,
- 0,146,146,146,208,173, 91, 55, 36, 37, 37,161,123,247,238, 30,199,210,178,227,247,226,226,226,135, 39, 79,158,108, 17, 30, 30,
-142, 51,103,206,220, 7,240,187,167,133,116, 8, 45, 22,139,133, 81,163, 70,161, 95,191,126,168, 87,175, 94,185,213,134,142,247,
-158,136, 13,171,213,138,150, 45, 91,194,104, 50,129,195,225, 56,167, 38, 89, 44, 22, 2,131,130,112,231,206, 29,183, 44, 90, 36,
- 73, 14,127,229,149, 87,200,212,212, 84,140, 28, 57, 18, 91,182,108,169,242,220, 49, 99,198,224,167,159,126,194, 43,175,188, 66,
-126,244,209, 71,213,134,119,112, 56,161,187,115, 77,142,126,186,166,118,191,174, 56,159,180, 22,121, 28,184,132,118,168,116,210,
-164,146,207,226,203, 9, 45,151, 32, 97, 79, 70,104, 89,205, 91,126,249,241,219, 25,157, 87,119, 15, 84, 4,249, 66,165,209, 59,
-197, 86,202,201,157, 0,128,161,147, 22,130, 69,149, 77, 41, 74,196,124, 8, 56, 20,118,109,250, 90,105, 54, 27, 42,189,187, 74,
-216,228,228,143,186, 54,246,229,138, 44, 40, 14,102, 16, 29,248, 87,166, 28,162,193,206, 71, 5, 87, 91, 63, 4, 92, 43,194,235,
-141,196,146,175, 83,213,147, 97,177,173,122,164, 67, 84,171,245,234,203,151, 5, 3,214,175,199,249, 55,222, 64, 40, 77, 35, 33,
- 36, 4, 50, 54, 27,190, 60, 30, 72,130,128,254,192, 1,156,222,189, 27,114, 30, 15,240,241,129,117,254,124, 24,211,210, 96, 41,
- 41,209,215, 98,100,134, 17, 35, 70, 40,149, 74,229, 48,147,201,244,199,227,214,179, 94,175, 63,146,145,145, 49,185, 75,151, 46,
-171, 45, 22,203, 91,122,189,254,177, 86, 70,153, 76,166, 35,185,185,185,175,141, 24, 49, 98,231,158, 61,123, 2,164, 82,105,173,
-185, 10, 11, 11,219,215,209,237,100, 3,240,137,221,185,125,114,108,108,172,244,194,133, 11,255,221,176, 97,195,106,151,209, 68,
-208,132, 9, 19,222,172, 32,178,106, 92,117, 8, 32, 61, 63, 63,127,254,204,153, 51, 23,126,245,213, 87, 98,135,227,251,149, 43,
- 87, 96,181, 90,193,102,179, 65,211, 52, 38, 76,152,160, 45, 44, 44, 92,134,170, 35, 58, 63,114,107, 21, 23, 23, 55, 94,176, 96,
-193,134, 21, 43, 86,244,163, 40, 74, 68,211,180,174,180,180, 52,193, 96, 48,140, 67,237,226,104,217, 10, 10, 10,198,126,250,233,
-167, 99,151, 47, 95,254, 10, 73,146, 65, 86,171, 85, 89, 82, 82,178, 95,175,215,127,143, 90, 76, 37,157, 57,115,166,224,245,215,
- 95,191, 87, 80, 80,208, 44, 44, 44, 76, 35, 22,139, 77, 38,147,137, 18, 8, 4, 18,145, 72, 20, 3,224, 12, 65, 16,215, 61,225,
- 76, 73, 73,201,157, 56,113,226, 3,163,209,216,116,237,218,181,137, 18,137,228, 56, 65, 16, 4,135,195,241, 19, 8, 4,125, 0,
- 36, 16, 4,113,219, 19, 78,146, 36,109,174,214,171,138,254, 89, 92, 46,215, 45, 31,173, 6,129,194,241,253, 26,179,176,247,196,
- 69,196,237, 77,223, 72, 51,204,238,221, 41, 69, 7, 62,232, 6,152,119,188,142,214,195, 54,151, 77, 23, 2,176,229, 95,131,121,
-199, 24, 16,194, 0, 36,102,177,161,209,155, 15,194,139,202,224, 12,239,160, 84, 42,145,154,154,234, 16, 89, 49, 0,208,189,123,
-247, 20,135,216, 74, 78, 78, 70,187,118,237, 82, 0,176, 61,189, 95,139,139,139,103,142, 30, 61,250,136,125,112, 60,179, 22, 3,
- 63,167,208,114, 8,170,122,245,234, 57,247, 93, 55, 23, 31, 45,183, 64,211, 52, 56, 28, 14, 88, 44, 22, 20, 33, 33,206,223, 98,
- 24, 6,119,238,220,129, 74,165,114, 75,104, 81, 20, 69, 17, 4,129,145, 35,221, 91,144,252,159,255,252, 7, 9, 9, 9,160,220,
- 84,133, 20, 69, 33, 50, 50,178,198,115, 28,186,212, 93,206,176,176,176, 90,115, 62,105, 45, 82, 91,129, 85,217,251,202, 68, 85,
- 85, 15,196,223,133,108,173, 86,243,201,166,245, 43,191,154, 48,229, 61,241,181,187,121,208,104,141,160, 40,210,181,241, 4,139,
- 69, 65, 34,226, 35, 60,216, 23, 91,191,251, 95, 73, 73,177,250, 83, 84,145,247,176,158, 15,103, 82,223, 14,141,120, 28,133, 14,
- 77, 91,141, 0,197,255, 75, 4, 48,185, 85,204, 14,118,251, 13, 47,166,235,248,191,164,235, 38, 93, 42, 50, 61, 42,180, 76,166,
- 23,230,244,239,255,107,220,161, 67,194,142, 27, 55,226,238,132, 9, 8,209,235,193,179, 79, 37,146, 4, 1, 49,135, 3, 49,135,
- 83, 38,178,150, 47,135,222,106,197,138, 55,222, 40, 53,154, 76,253, 61,121,200, 11, 11, 11, 49,100,200,144,130,236,236,236,129,
-168,197,212, 94, 85,208,233,116,187, 0,236,170, 43, 62,163,209,248, 71,102,102,230,139, 67,134, 12, 57,116,228,200,145,192,167,
- 36,200,156, 67,108,153, 47, 92,184,240,102, 98, 98,226, 93,148, 79, 44,170, 78, 76, 76,188, 59,113,226, 68, 98,195,134, 13,223,
- 3,248, 12,110, 6,240,212,233,116, 43,143, 30, 61,138,158, 61,123,126,182,120,241, 98,255,246,237,219, 35, 40, 40, 8, 37, 37,
- 37, 72, 78, 78,198,244,233,211, 85,197,197,197,139,213,106,245, 87, 30,150,217,108, 52, 26,199,184, 46,165,174,139,122, 48, 26,
-141, 63,228,228,228,252, 80, 87,132, 83,167, 78,189,114,231,206,157,194,192,192,192, 78, 28, 14,167, 21,202,252,128,114, 1,124,
-239,169, 32,114, 96,202,148, 41,151,239,220,185,163, 12, 13, 13,237,108,231,148,162, 44,141,209,250, 90,112,102, 95,188,120, 49,
-172, 67,135, 14, 36,155,205,102, 40,138, 2,155,205,102, 88, 44, 22, 99,247,171, 97, 0, 96,255,254,253, 60, 0,213,166,205,185,
-155,175, 95, 48,230,127,167, 62,186,158,107,216,157,150, 87, 58, 3, 0,179,227,154,240,183,214,129,212, 11, 47, 52,201,132, 49,
-190, 59, 8, 73, 89,160, 74, 70,155, 3, 66, 36, 71,166, 45, 20,115,247,221,200,181,130, 88,234,213, 84,149,143,171, 97, 15,239,
-144,147,147,227, 42,178, 28, 86,171,152,238,221,187,167,216, 69,150,227, 88,109,252,203,142,217,108,182,199,234,195, 24,134, 65,
- 92, 92, 28,214,173, 91,135,154, 34,154,219, 87,247, 17, 53,241, 57, 44, 90, 52, 77,195,108, 54,227,218,181,107,206,152, 93,142,
-233, 66, 71,104, 7,171,213, 90,237,106,117,154,166,105,147,201,132,159,127,254,217, 45,177,181,109,219, 54, 24, 12, 6,208, 53,
- 40, 56,215, 80, 12,109,218,180,129, 74,165,114, 46,246,137,137,249, 43, 84,158,217,108,246, 72,184, 58, 56,155, 54,109, 10,165,
- 82, 9,135,191,112,248, 27,127, 25,123,172, 58,221,191,245,190,175,210,162,245,183,247,152, 60,161,228, 72,251,174,253,186,189,
-241,230,116,145,214, 72,227,193,131,135, 40,200,207, 1, 73,144, 80,132,134, 33, 34, 34, 18, 2, 46,137, 45,241, 95,233, 82, 78,
- 31, 63,165, 45, 41, 26, 80, 21,215, 32,223,255,107,239,108, 98,219, 40,162, 56,254,223,117,252,145,164,117, 12,235,184,144,130,
-132,107, 75, 77,133, 64,168, 80, 33, 80, 36,108, 65, 64, 28, 16,135,208, 54, 7, 90,110,149,162, 34,144,122,171,132, 84,163,158,
- 56, 68, 37, 72,225, 16,113, 33,226,196, 33,135,170, 7,135, 15,149, 28, 40, 32, 4, 82, 32,253, 74, 85,197,170, 72,237, 56, 45,
-113,140,227, 38,246,122,135,131,189,210,118,179,235,122,227, 55,182, 55,218,191,180,202,135,162, 95,222,204,123, 35,191,153,217,
-121,227,249,249,194,123, 67,175, 68,163,126, 1,114, 25,168,148, 1,185, 12, 40,181,175,234,239,148,135, 99,110, 97, 97,141,157,
-253,243,254, 47,151,114, 37,195, 59,171,142, 2, 67,143, 73, 82, 50,113,241, 98,175, 82, 42,225,222,153, 51,232,149,101,116,215,
-102, 37,213,134,248, 32,159, 63, 95, 77,178, 78,156,216,200,173,173, 89,186,130,167,191,191,255,119, 65, 16,250,179,217,172,173,
- 42,195,135, 66,161, 75,140,177,213,213,213,213, 35, 29,100,215, 62, 0,107, 0, 74, 6, 19,137, 16,172,191,255,163, 42, 28, 10,
-133,206,138,162,248, 42, 99, 44, 40,138,226,191,138,162, 92, 89, 89, 89,249, 12,192, 45,231,243,180,109, 82, 43,195, 31,120,196,
-223,173, 0,248, 24,213,151,130,151, 26,133,191, 16, 8, 4, 54,189,229,153,119,159,243,197,143,189, 24, 64,228, 73, 63,220,158,
-110, 44,175,203,248,254,234, 58,190,186,156,190, 83, 44, 87,222,185,153,221,248,203,113, 69, 93,145, 95,193, 67, 41, 73,146,126,
- 77, 38,147, 71, 34,145,136,168,125,225, 93,173,149,167,110,111,117,117, 85,115,185,185,185, 57,121,116,116,244, 74, 38,147,121,
-205,140,233,247,251,103,231,231,231,223,204,229,114,219, 18, 42,109,165,120,245,231, 66,161,128,177,177,177,239,204,174,224, 9,
- 4, 2, 23,198,199,199, 63, 26, 25, 25, 17,213,114, 20,218, 71,189, 46, 72,125, 74,165, 18,166,167,167,149,137,137,137, 47,114,
-185,156,233,214,225,192,192,192,157,229,229,229,167,213, 82, 11,141, 20, 21, 13,135,195,119, 83,169,212,254, 86, 50,109,156,112,
- 77,105, 19,239,182, 44, 77,184,123,122, 78,251,247, 62,126,110,228,253, 15,131,225,232, 65,225,137,129,167, 32, 64, 68, 38,253,
- 15, 82,183,111,178,153,111, 38,239, 21,214,239,127, 90, 44, 22, 38,235,113,158, 5,162, 7,250, 60,223,122, 43, 24,132,154, 0,
-233,238,167,218, 54,227, 0, 80,114,139,215,151,242,229,227, 87,235,108,251,168,201,214, 39, 51, 51,189,222,193,193,109,133,226,
- 20, 69,193,230,181,107,248,252,228, 73,203, 73,150, 35, 71,142, 72, 20,193,163,107,100,149, 81,173,207,101,117,197, 68, 56,180,
-111,207,113, 6, 28, 19,161, 60, 47, 10,130, 87,102,184, 1,134,217,222,174,141, 47,255,184,139,162,211,253, 13,169, 99, 47,149,
- 6,176, 71,146,164, 31, 92, 46,215, 51,234,138,140,118,181,222,224, 66,233,165, 76, 38,243, 6,128,122, 39,132,163,126,191,127,
-178, 82,169,188,220,200,165,210, 46,151,235,183,124, 62,127, 26,117, 46,149,230,113,234, 48, 24, 12,222, 74,165, 82, 81,245, 20,
-181,246,179,210,232,100,249,226,226, 34, 98,177, 88, 42,157, 78,135, 91,201,236, 84,153,156, 58, 60,101,224,227,246,172,104,105,
-180,223,227,219,251,129,183,167,251,117,165, 44, 31,130, 0,116,185,221,215,183, 30, 20,127,220, 44,254,247, 53, 76,182, 11, 91,
-169,163,192,144,207,235,157,245,244,245,245, 24, 37,109,229,124,190,184,185,181,245,150,147,100, 57,114,228,200,145, 35, 27,105,
- 80,146,164,164,219,237,246,105,147, 73,253,247,170,100, 89,126,144,205,102,223, 6,112,163,197, 76, 91,203, 74, 17,243,135,100,
-241, 37,181,225, 70,153,181, 39,214,233, 76,142,109,103,132,204, 88,141,153,176,137,157,177, 78,101,170,237,181,192, 29,182, 18,
- 71, 84,253,169,177,147, 81,219,201,139, 73, 53,142, 12,236,100, 28,252,158,176,137,157,177, 78, 99,234,227,167, 65,174, 37,102,
-131, 49,101,213, 78, 70,109, 39, 47,102,179,227,168,142,157,172,217, 88, 50,241,125, 2, 54,212,194, 97,176,133,195, 96,127,191,
-100, 88,183,209,104, 69, 11,140, 49,107, 47,195,243, 58, 9,160,150,221,175,241,133, 78,101,106,251,129,242,170, 0, 14,215, 14,
- 92,166,102,234,250,147, 74,137,218, 9,147,159,208, 64,193, 81, 43,109,167,240,187,174,173, 36,220, 29, 36, 89,150,152, 84,113,
-207,155, 73, 53,150,244, 76,138,184, 55,242, 59, 71, 31, 81,217, 73, 50,150,120,196,188, 65,252, 52,205,213, 51, 41,198,146,158,
- 73, 17,247,173, 96, 82,140, 37, 35, 38, 69,220,155,249,222,174, 43, 84,234,118, 97,173,196,131,208, 64,178, 53, 5, 0,226, 78,
- 58,141,135,120, 92, 36, 73,157, 16,241, 74, 54, 45,172,192,180,157, 73,236,163, 68,141, 73, 57,187,137, 83,249,136, 71,188,107,
-153, 84,124, 61,135,194, 79, 70,204,102,237, 53,177,147,188,237,205,198,125,171,152,196, 62, 34, 25, 75, 58,102,156,120, 50, 16,
-215,252,156,160,100, 82,141, 37, 3, 59,155,246,147, 17,179, 89,123, 77,236, 36,111, 59,197,103, 8, 47,110, 59, 87,180,152,104,
- 26, 19, 83,186,167, 37,137, 70,219,182,228, 44,178,119, 21,211,226,246,204, 48, 7,223,183,213, 78, 74,166,222, 70,202,237, 30,
-158,118, 82, 50, 45,216,186,235,152,118,243,123, 39,246,167, 25,175,153,109, 41,179,213, 81, 30,118, 82, 50, 27,100,239, 10,102,
- 19,190,223, 53,218,209,214, 33, 79,169, 29, 79, 60, 51, 1,241, 10, 12,183,118, 19,219, 25,231,177, 66,200, 65,228,118,214,102,
-202,231, 56,180,221, 46,125,234,140, 37,103, 44,117,220, 88,210,197,100,156,112,165,136,116,229, 89,207,164,248, 31, 90, 6, 85,
-140,242,110, 59,229, 88,226,225,123,187,233,127,210, 11,149,201, 8, 25,190, 81, 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, 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, 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, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0,
+ 0, 0, 7,116, 73, 77, 69, 7,219, 9, 1, 15, 54, 15, 19,126,136,129, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120,
+ 20,213,226, 61, 51, 59,179,187,217,146, 77, 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, 86,132,167,207,103,
+197,134, 5, 84, 68, 68, 32, 54, 64,240, 39,242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201,
+ 38,219,203,220,223, 31,217, 89, 55,203,182, 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,156, 57,183, 1, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, 64, 57, 29,219,128,
+191, 59,103, 11,198,157, 52, 35,231, 0, 7,231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,228,163,230, 74, 79,
+151,112,146,230, 14,103, 75,113, 54, 87, 57,242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,243, 79,128,188, 77,
+226, 12, 48, 79, 53, 53,156,164,185,195,217, 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,117, 4,174, 5, 69,
+ 86,192,200,204,204,100, 92,248,153,191, 43,167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,230,194,187,153,153,
+153,204,234,213,171,183, 2, 24,208,156,113,111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,247, 45,205,217, 92,
+101,201,157,179, 57,242,189,167,251,222,130,247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,238,156,205, 81,150,
+220, 57,155, 35,223,255, 25,156,205, 81,150, 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,123, 1, 31,248,119,
+ 22, 68, 45, 37, 54,155,224,192,252,229,156,205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,223, 93, 57,155,139,
+223,157,167, 57,238,147, 39,206,171, 13,175,151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, 44,185,113, 14,108,
+230,151,129,129, 46,191,223,109, 78,206,230, 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, 61,238,205,241, 12,
+105, 41,222,107, 26, 45,213,124,214,220,156, 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,230,228,116, 15, 99,
+115, 54,247,180,100, 56,155,147,179, 9, 97,189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,155, 59,218, 18,225,
+108, 78,206, 0,185,175, 9,206,171,184,247,215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,146,194,181, 57,195,
+ 57,176, 37, 28,194, 22, 64,179,135,211,241,166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, 37,183, 60, 57,176,
+ 25,157,162,102,117,158,221, 57,155,227, 26,174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,133, 11, 65, 57, 41,
+ 39,229,164,156,148,147,114, 82,206,235,150,243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,226, 31, 5,175,237,187,113,113,113,171,149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,240,175, 3,189, 71,
+ 20,255, 32,176,248,195, 65, 23, 0, 16,199, 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,201, 14,130, 32,192,
+110,183,195,102,179, 57, 63,205,102, 51,250,247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,216,237,246,243,101,
+101,101,125,125, 28,178, 19, 64, 10,195,252,161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, 73,113,231,243,194,
+ 37,126,247,201, 25, 18, 18,178,159,227,184, 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,215, 51,162,163,163,
+115, 56,142,107,114,254, 44, 45, 45,245,154, 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, 47, 94,236,235, 67,
+136,236, 4,144,226,243, 13,202, 45, 63, 49, 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, 78,145,197,113, 92,
+ 86, 84, 84,212, 51,122,189,222, 8,128, 72, 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, 34, 5, 5,197,117,
+ 33,180, 4, 65, 96, 77, 38, 19,242,242,242, 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,209,176, 89, 44, 80,
+181,138,116,114,151,157, 56, 6,155,213, 2,155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, 62,248,224,131,168,
+224,224, 96, 24,141, 70, 24,141, 70,152, 76, 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,216,108, 54,152, 76,
+ 38,100,103,103,219,173, 86,171, 79,206,105,211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,209,104,196,166, 77,
+155,124,114,114, 28,151, 80, 82, 82, 18, 37,149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,139,175, 64,182,208,
+ 61,186,158,209, 97,218,210, 53, 81, 33, 10, 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, 96,179,161,253,243,
+163,157,251, 59,117,234,228, 51,127, 18, 66, 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,104,112,155,189, 9,
+173, 4,131,193, 16,229,224,191, 76, 16,177, 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, 95,142,178, 90,173,
+ 48,155,205, 48,153, 76,176, 90,173,176,217,108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,125,112,219,109,183,
+ 61,190,102,205, 26,213,207, 63,255,172, 74, 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, 14, 55,223,124, 51,
+ 67,179, 32, 5, 5,197,117, 35,180, 76, 38, 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,246,237,219,231,186,
+159,231,175,185, 42, 56, 42, 26, 19, 91,135, 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,168, 5, 0, 40, 20,
+ 10, 48,174,175,209, 94,160, 82,169,112,219,109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,193,243,188,223, 68,
+ 97, 24, 6,106,181, 26, 83,166, 76, 17, 69, 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, 4, 28,199, 57,183,
+ 64, 56,165, 82, 41,142, 30, 61, 10,142,227, 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, 14, 10,133, 2,240,
+ 51,115,176,235, 61, 50,155,205,177, 50,153,204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,200, 49,102,222, 79,
+ 0,128,162, 89,207, 59,239,221,158,103,223,113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, 89, 93, 93,109,120,
+232,161,135,182, 7, 7, 7,175,215,106,181,240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,230, 76,156, 57,115,
+ 38,160,184, 27,141, 70, 44, 88,176, 0,118,187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, 94,179,102, 77, 24,
+195, 48,248,236,179,207, 32,149, 74, 49,124,248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,105,230,163,160,160,
+240, 85,231,241, 0,110, 4, 16,233, 48, 17,234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, 79, 47,199, 49, 21,
+ 12,195,236,115,249,109, 6, 32,243,176,191, 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,203, 1, 13,235, 15,
+ 1,216, 2, 96, 96,102,102,230, 86, 0, 40, 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,163,168,121, 28,205,
+ 83, 82,155,205,214, 65,108,170, 18,221,162, 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,115,133, 55, 1, 99,
+177, 88,240,192, 3, 15, 0,128,215,135,142,235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,210,113, 19,177, 66,
+ 87,207,192, 86,171,195, 61,106, 43, 78,118,238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,171,200,146, 72, 36,
+152, 55,111, 30, 30,122,232, 33, 72, 36,146,128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,142,123, 36,183,217,
+108, 26,155,205, 22, 97,183,219, 35,154,114,143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, 86, 87, 87, 27, 50,
+ 51, 51,119,203,229,242,133,209,209,209, 37,197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,103,206, 28, 12, 26,
+ 52, 40,160,112,154, 76, 38, 48, 12,131,249,243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, 23, 23,247,236,186,
+117,235, 52,226,177,173, 90,181, 2,207,243,232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, 37, 5, 5,197,181,
+ 11, 79, 90,196, 5,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,151, 58, 49,211, 81,
+191,174, 22,127, 19, 66,122,185,138, 30,135, 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, 76,252, 61,113,226,
+196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, 56, 60, 57, 90, 62,
+215,158, 18,155,168, 78,157, 58,229,173,137,202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,247, 79, 41,174,113,
+ 62,192,230,246,104, 7,149, 74,133, 97,239,125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,114, 42, 21, 65,200,
+126,185, 11,138,170,100,120,119, 87, 53,214, 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,120,249,116, 33,172,
+ 36,176, 62,189,132, 16,143, 2, 75,252, 46, 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, 8, 13, 15,118, 5,
+ 33, 36,140, 97,152, 58,135,203, 21, 27,232, 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,238,168,243,158,140,
+159,247, 33, 0, 96, 80,247,155,253,150,135, 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,122,116,193,230,205,
+155, 21,129,132,213,147,208, 18, 93, 91, 81,100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, 74,175,196,209,130,
+ 78,167, 51,175, 92,185, 18,115,231,206, 69, 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, 60,255,252,243, 80,
+ 40, 20,162,123, 77, 51, 32, 5,197,245, 13, 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, 98,202, 85,172,165,
+249,121,254,175,118, 23, 79,226,117, 25,134, 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, 50,153, 10,186,117,
+235, 22,144,154,208,235,245,165,254,196,134,167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, 90,173, 78,161,178,
+113,227, 70, 40, 20, 10, 12, 31, 62,252,170, 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,157,193,249,128,217,
+146, 95,128,131,101,229,120, 57, 99, 48, 84,138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, 3, 15, 60,224,116,
+ 19, 92,251,173,192, 71,211, 97, 68, 68,196,126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, 16,132,250,208,208,
+208, 31, 1,196, 17, 66, 18, 0, 4, 7,114,143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,134,204,204,204,221,
+118,131,249,155, 11, 23, 46,236, 6, 16,116,211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,230,204,113,254, 31,
+168,208,178,217,108,141, 4,212,233,211,167, 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, 56,207,137,137,137,
+ 65,104,104, 40, 4, 65,128, 32, 8, 8, 10, 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, 76,152, 48,225, 77,
+134, 97, 86, 59,156,165, 99, 62, 4,149, 39,237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,226,196,137,105,238,
+225,240,212, 92,233,172, 85,221,166,221,111, 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,144, 72, 88, 48, 12,
+ 67,252,113, 89, 44, 22,103,197,255,204, 51,207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, 50,236,236, 54,231,
+185,226,198,114, 60,206,197,116,132,228,212, 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,203,178,206, 52,225,
+ 56, 14,237,219,183, 71, 65, 65,129, 79, 46,142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,183,163,109,219,182,
+198,188,188,188, 23,105,209,189, 58,145,229,109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,168,173,181,181,181,
+223,220,112,195, 13,167,209,120, 10, 4,191,124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,213, 26,208,139,128,
+213,106,189, 76,240,124,252,241,199,141, 62, 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,182,219,110, 67,215,
+174, 93,241,243,207, 63, 67, 16, 4, 60,247,220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,234,104, 81, 80, 80,
+248,210, 34,166, 25, 51,102, 28,155, 49, 99,134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, 1, 48,121, 18, 68,
+158, 92, 50,119, 1,230,186, 47, 43, 43,107,186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, 91,210, 1, 52,110,
+ 46,156,119,115, 71,168,212, 42,168,130,213, 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,170,242, 41,178,154,
+226,104,177, 50, 14, 43, 18, 46,129,200,120,112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,182,128, 56, 9, 33,
+151, 53, 21,142, 29, 59, 22, 12,195, 56, 71,136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,123,115,236, 7,149,
+ 70, 90, 98,175, 36,127,238,255, 18, 39,127,120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,232, 86,167,251,248,
+ 30, 94,189, 34,206,170,170, 42,195, 77,157,210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, 24,218,173, 91,183,
+128,202,164, 56,184,194, 93,100,185, 58, 89,226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,243, 68,204,219, 26,
+141, 6,106,181,218, 57,226, 54, 40, 40, 8, 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, 58, 14,177,212,200,
+105,114,244,173,202,116,253,237,201,241,114, 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,106,111, 34,141, 19,
+ 21,164,235,103, 76, 76,204,175,106,181, 58, 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, 96, 53, 20,106, 21,
+ 20,193,106,175,174,151, 47,161, 37, 58, 69,226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, 90, 78,161, 37,101,
+177, 65,190, 9, 18, 25,215, 72,100,113, 28, 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,107,193,113, 28, 38,
+ 77,154,228,124,131,119, 21, 89, 77,137,179, 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, 36,157, 78, 39,191,
+120,241,226,173,180,188,250, 80, 6,118,235,101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,142, 29,157, 78,150,
+ 82,169, 20, 71,155,250,191,199, 44,235, 81,100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,152, 49,195,201,235,
+234,100,137,104, 74, 57, 18,195,186,117,235, 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,155,205,134,169, 83,
+167, 66,161, 80, 64, 38,147,209,204, 71, 65, 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, 73, 96,185, 54, 19,
+138,223, 25,134,177,122,224, 53,187, 53, 41,186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,135, 95, 71, 75, 46,
+151, 39,231,229,229, 57, 39,194,244,245,105, 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, 11,101,176, 26, 74,
+ 77, 48, 20,106,181,187,224, 96,252, 85,226,226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, 0,175,190,250,106,
+192,125,180, 68, 78,216, 25, 20,147,179, 72,159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, 32,220, 52, 18,122,
+133, 26,156,221, 22,240,168,195,234,234,106, 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,182,141, 27, 55,250,
+141,187, 39, 39,107,242,249,106, 39,143, 66,161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,250, 8,180, 40,251,
+ 17, 69,130, 45, 32, 81, 21,104,254,116,231, 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, 71,135, 42,149, 74,
+124,245,213, 87,122, 0,178,229,203,151, 43,252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, 26, 79, 89,226,175,
+ 99,124, 32,121, 94, 12, 43,195, 48,176,219,237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, 40, 40,252,213, 37,
+251, 2,174,199, 9,233,229, 34,170,246, 93, 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, 64,121, 2,158, 24,
+179,117,207,155,241,222,133, 90, 48, 12,131,255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, 31,157,254, 42,228,
+ 42, 53,226,250, 13, 13,168, 34, 23,155, 14, 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,193, 7, 31, 32, 62,
+ 62, 30, 23, 47, 94,196,242,229,203, 3,114,180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,219, 38,227,130,153,
+195, 78,163, 18,253,141,199, 33,219,240, 41,204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,236, 83,101,179,217,
+ 96,181, 90, 97,177, 88,240,193, 7, 31, 4, 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, 33, 36, 28, 64, 8,
+128, 74, 90, 92,125, 35,182,247,243,136,236,249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,182, 97, 1,128,142,
+ 73, 67,155,196, 89, 85, 85,101,184,125, 80,159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,248, 29,144, 93,198,
+178, 44, 36, 18,201,101,205,133,222,196, 86, 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,226,137, 39, 16, 27,
+ 27,235,116,178,222,123,239, 61, 40, 20, 10, 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,127,186, 40,251, 51,
+224,177, 38, 53, 26,141,133, 93,187,118,133,151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, 19,226, 16, 0,217,
+158, 42,117,134, 97, 16,172, 9, 70,144, 90, 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,198, 41,246, 45,113,
+ 21, 90,226, 86, 91, 91, 11,158,231, 49,119,238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, 95, 84,135,147,211,
+179, 33, 11,218,137,118, 67, 31, 66, 44,175,128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,120,231,157,119, 46,
+155,214,193, 27,226,227,227,253,198,221,221,201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,244,208, 67, 2, 0,
+ 3,128, 10,131,193,112, 62,144,244,108, 6,252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,178,140, 2,255,117,
+ 65, 65,129,232,100,133, 40,149, 74,124,241,197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, 68, 34,193,172, 89,
+179, 60,246,201,242, 36,186,154, 82,142, 92,207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, 68, 68, 56,157, 44,
+187,221,238, 28,109, 40,206, 62,239,227,165,130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, 47,222,238,237,132,
+182,109,219,230,229,229,229,181, 23,151,226,112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, 32,151,203, 65, 8,
+193,173,239,100,129, 97, 1, 22,141, 31, 98, 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,208,232,225,224,105,
+171,175,175,135,201,100, 10,120, 54,111,163,209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,160,253,118,130,130,
+130, 26, 53,253,248,113,172,152, 64, 28, 45,215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,209,108, 30, 56,196,
+ 1, 11, 0,144,218,103, 56, 4,193, 14, 98,183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,201,223,180, 39, 76,
+101,101,165, 97,212,168, 81, 91, 1,252,239,158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, 84, 3, 32,151, 46,
+ 93, 10,185,112,225,130, 96, 52, 26,219,248, 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,162, 43,234, 58,187,
+123, 32,249, 83,108, 46,247, 52, 35,188, 55, 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, 67, 42,149, 66,169,
+ 84, 2, 0, 62,253,244, 83,231,228,171, 20, 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,179,217,138, 19, 19,
+ 19,155,116, 49,187,221, 94,230, 71,184, 21, 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,175, 90,181, 74,234,
+201,221,240,182,192,180, 63, 78,187,221, 94,156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, 48, 52, 18, 9,227,
+143, 23,121, 93, 59,145,194,111, 94,243,145, 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,232,232,170, 29, 59,
+118, 68,244,234,213, 43,194,245,152, 94,189,122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,227, 49,207,139,162,
+201, 67,254, 44,246,151,231,247,238,221, 43,117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, 93,121,188,229,125,
+171,213, 90, 65,115, 33, 5, 5,197,117, 47,180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,170,170,158,205, 29,
+ 1,171,213,218,231,159,192, 89, 89, 89,217,172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,143, 0,160,188,188,
+252, 38, 0,208,233,116,240,183,172, 78, 19, 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,230, 44, 10, 10, 10,
+ 42,180,154, 0,186, 24,241,223, 3, 45, 33, 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,
+150, 1,131,134,145, 3,158,208,148,209, 4, 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188,238, 56,253,113,
+211,209,140, 45, 44,192, 40, 39,229,164,156,148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, 20, 20, 20, 20, 20,
+ 20, 45, 4,142, 38,193, 95, 6, 9,154, 48,163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,224,100, 0, 72, 29,
+155, 56,209,145, 21,128, 5,128,133, 97, 24,226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,192,225, 54,109, 90,
+ 31, 98,152, 59,204, 0,160,138,238,212, 89,173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,158, 87, 72,179, 7,
+ 5,197, 95,130,187, 0, 76, 65, 67,183,146, 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,155,224,111,126, 30,
+ 17,142,181,204,138, 47, 93,186,212,179, 9,215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,245,245,155, 1, 44,
+ 7, 96,187,194, 56,105, 0, 60, 0,224, 17,199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,158, 84, 86, 86,246,
+ 6,128,136,136,136,221, 86,171,149,209,106,181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,109,219,182,255, 1,
+152,219, 76,247, 82,206,178,172, 71,129, 34, 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, 56,189,184,184,184,
+ 11, 0, 36, 36, 36, 28, 29, 61,122,244,161,113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, 43, 47,205,127,166,
+172,252,196, 3, 0, 16, 19,219,101,153, 68,194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, 87,115,165, 73,201,
+173,177,105,231,193, 27,199,189,248,102,218, 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, 25,247, 84,230,237,
+118,123,113,117,117,117, 79,111,156, 28,199, 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, 26,141,102, 23,199,
+113,201,129,114,137,159, 54,155,173,216,219, 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,200,175,168,168,240,
+ 22,206,203,226,222, 28,225,188, 18, 78, 95,225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, 55,181, 90,109, 55,
+137, 68,130,240,240,240, 55,205,102,243,153,144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,162,185,160,209,104,
+202,234,235,235,137, 8, 65, 16,136,213,106, 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,181,164,182,182,150,
+ 84, 85, 85,145,200,200, 72,247,201, 27,189,181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, 88,136,197, 98, 33,
+133,133,133,228,163,143, 62, 50,105, 52,154, 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,230, 53,107,214, 16,
+163,209, 72,116, 58, 29, 89,182,108, 25,185,225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, 49,197,103,207,158,
+181,111,220,184,209, 18, 18, 18,146, 29, 18, 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,125,155, 16, 78, 0,
+ 24, 57,126,252,248,178,194,194, 66, 50, 96,192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, 67, 8,137, 69,195,
+ 36,151,151,109,132,144, 88,199, 49, 97, 1,114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, 24,198, 28, 29, 29,
+157,149,159,159,223,154, 16,162,242,197, 89,124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,255,125, 61, 80,251,
+212,184, 71,151,198,182,237,190, 32, 52, 33,109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,191,206,191,119,220,
+236, 47, 34, 18,211,159,106, 66,122, 94, 13, 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,139,197, 66, 76, 38,
+ 19,209,235,245,164,190,190,158,212,213,213, 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, 86,102, 48, 24, 26,
+213, 29,102,179,217, 89,127,232,245,122,162,215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, 56, 47,138,225, 20,
+ 4,129,216,108, 54, 98,177, 88,156,188, 70,163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, 16, 78,163,209, 72,
+ 18, 18, 18, 74,188,113,134,135,135,151, 25,141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, 51,144,112,250, 74,
+ 79, 7,230,230,230,230, 18,131,193, 64,226,227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,233,233,194,192,129,
+ 3, 45,149,149,149,228, 95,255,250, 23,241,241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,124,255,253,247, 94,
+151,227,112,253,222,166, 77,155, 64,175,217, 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,155, 17, 22, 22,134,
+231,158,123, 78,118,215, 93,119,181, 31, 58,116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,159, 77,154, 52, 41,
+250,193, 7, 31, 68, 68, 68,163, 73,183, 49,106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,208,188,121,243, 74,
+235,235,235,199, 1,248,209, 23,169, 66,161,184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,133,125,253,245,215,
+219,119,232,208, 65,145,144,144,192, 94,188,120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,139,197,178, 50,128,
+184,203, 34, 34, 34,222,124,250,233,167, 91,105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, 70,175, 45, 91,182,
+124, 11,224,203, 43,113,178, 8, 33, 90,252,209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, 60, 35, 35,227, 71,
+147,201,212,253,153,103,158, 57, 63,125,250,116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,207,158,253, 70,231,
+206,157, 7,239,218,181,235, 62, 66,136,213, 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,206,196, 87, 19, 62,
+156,150,124,110,223,241, 34,129, 83,104,240, 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,124, 90, 72,252, 13,
+ 3,106, 47, 28,207,129,143, 25,210, 41,154, 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, 90,113, 28,135,208,
+208, 80,191,171, 27, 4, 5, 5, 97,227,198,141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,131,160,160, 32,236,
+216,177, 3, 44,203,122, 92, 26,200,125,159, 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, 86,171,129,134,166,
+127,239,133, 82, 46,199,246,237,219,189,198,217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,125, 73, 48,215,223,
+ 42,149, 10,140, 31,210,176,176,176,222, 9, 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, 79,131, 97, 24, 76,
+159, 62,157,185,225,134, 27,248,210,210, 82,244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, 2, 66, 8, 15,224,
+ 70, 0,145,104,232,118, 83, 7, 32, 20, 13, 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, 87, 58,234, 22, 87,
+129, 80,225,186,248, 52, 33,164,151,131, 91, 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,176,122,245,106,241,
+ 97, 54, 48, 51, 51,115,171,107,228, 2, 17, 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,238,221,138,200,200,
+ 63,226, 96, 50,153, 80, 87, 87,135,250,250,122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,135,186,186,186, 14,
+142, 68,243,198, 57,235,226,197,139,209, 54,155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, 55, 49,108,216,176,
+152, 65,131, 6,205,114, 19, 90,151, 13, 37, 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,197,197, 24, 63,126,
+124,107, 65, 16, 80, 84, 84,132,211,167, 79,227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, 60, 13, 79,125,230,
+229,151, 95,238, 24, 22, 22,198,126,244,209, 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,247,143,250,247,191,
+255, 77,118,236,216,177,216,113,227,188,166,167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, 7, 33, 36, 6,128,
+137, 97,152, 26, 15,156, 12,128,144,161, 67,135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,224,162,152,249, 66,
+ 66, 66, 84,179,102,205,138,206,204,204,204,189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, 10,151, 62, 91, 78,
+ 78, 65,192,225,152,216, 46,203,114,118,141,123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, 94,181,253,120,126,
+ 5,234, 12, 54,220,123,107,195, 2,230,189,187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,103, 8, 84,245, 37,
+199,215,248, 72,207,171, 5,229,132,179,137, 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,118,237,218,133, 91,
+111,189, 21, 60,207,227,137, 39,158, 8,136,147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, 9,178,221, 42, 91,
+112, 28, 7,150,101,189, 46,164,237,206,233,175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,200, 10,148, 83, 12,
+ 39,199,113,232,211,167, 15, 14, 29, 58,228, 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,153, 59,119,110, 56,
+ 0, 84, 85, 85, 57, 23,188,151, 72, 36, 56,117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, 71,148,179, 37, 57,
+125,105, 17, 0,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, 72,166,248, 57,113,
+226,196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,155,136,139, 20,121,
+ 28,101,174,209,177,158,126,187,127,122,226,110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,
+123,126,250,244,233,209,190, 68, 86,125,125, 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,207,219,108,182,143,
+125,208, 74, 37, 18, 9,246,238,221,139,242,242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,174, 93,139,154,154,
+ 26,244,232,209, 3,104,232,220,237, 17,221,186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,124, 24,221,187,119,
+199,247,223,127,143, 54,109,218, 64,169, 84, 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,244,116,155, 86,171,
+221, 86, 93, 93,189,249,220,185,115,239,122, 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,205, 55,219, 1,108,
+ 7,240,252, 91,111,189,245,248,176, 97,195,162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,205,253,161,100,183,
+219, 77, 6,131,193,108, 50,153,172, 44,203, 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, 89, 89,249,220, 75,
+ 47,189, 84,224, 16, 89,167,208,208, 1, 30, 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,248,204,210,165, 75,
+159, 27, 59,118,236,242,111,190,249,166, 30,128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,177,252,203,151,215,
+174,122,190,117, 81,209,133,246, 17,173, 34,117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,217, 82,240,188, 4,
+ 39,138,106,209,255,246, 81,252,153,188,105,125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,159,142,214,174, 93,
+187,192,243, 60, 20, 10, 5,102,207,158,237,147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, 65,112, 46,244,238,
+190,253,223,255,253, 31, 94,122,233,165, 70,215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,209,190, 64, 22,165,
+183,219,237,224,121, 30, 11, 22, 44, 64,102,102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,244,236,211,167, 15,
+ 44, 22,139, 51,204,167, 78,157,242,200, 59,111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,132,156,156, 28,220,
+127,255,253, 38,139,197,146, 7, 0,119,222,121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,252,249,255,129,118,
+144,167,104, 97,120,210, 34,226, 51, 47, 43, 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,233, 42,138, 92,127,
+139,174,147,155,136, 75,115,117,164, 92, 69,148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,171, 11, 36, 86,190,
+254, 68,150,143, 55,199, 70, 8, 9, 9, 25,126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,115,115,115,209,179,
+103, 79,105, 72, 72,200,240,170,170,170,143, 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, 68, 88,173, 86,172,
+ 95,191, 30,181,181,181,224,121, 30, 82,169, 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,104,209,162, 75,226,
+ 27,221,146, 37, 75, 64, 8, 65,100,100, 36,244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,164,164,164,200,238,
+185,231,158,190, 83,166, 76,225,125, 8,173, 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, 12,199,190,201,227,
+198,141,139, 40, 44, 44, 52, 63,249,228,147,123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,213,106, 21,211,180,
+160,190,190, 30,173, 90,181, 74,116,117,182,188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,215, 48,152,205,102,
+212,215,215, 67,167,211, 89,107,107,107,203, 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,115,135, 89,163, 81,
+202, 8,145,188, 53,127,254,124,245,176, 97,195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,155, 50, 61,235,195,
+ 13,154,132,174,101, 59, 14,231,227, 66,105, 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,211,209,114, 21, 21,
+ 57, 57, 57,184,253,246,219,157,101, 93, 42,149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,203,150, 45, 30,221,
+ 39,127,112, 21, 69,238,226,200,147, 0, 99, 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, 95, 51, 7, 56,142,
+195,184,113,227,192,243, 60, 94,127,253,117,112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,111,189,181,201,113,
+223,189,123, 55,186,119,239,238, 12, 83,122,122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, 67,135, 6,194,249,
+102, 93, 93, 93, 55,181, 90,141,220,220, 92, 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,111,130,189, 0, 0,
+ 32, 0, 73, 68, 65, 84,215,235,219, 26,141, 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, 26,169,208,162,104,
+ 49,184,107, 17, 23, 24, 38, 76,152,240, 38,195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,251, 28,101,181,151,
+155,136,171, 96, 24,102, 31, 33,228, 78,111,231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,242, 13, 84,104,249,
+131,209,104,188, 49, 42, 42,202,171,200,114,253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,216, 88, 88, 44, 22,
+124,249,229,151,144, 74,165,144, 74,255,208, 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, 71,143,176,159,126,
+250,169, 98,192,128, 1,145,195,134, 13,131, 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, 20, 23, 23,227,215,
+ 95,127,173,236,208,161, 67,171, 61,123,246, 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,235,214, 85, 2,216,
+ 39,151,203,215, 78,155, 54, 45,204,108, 54, 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, 96,192,128,140,236,
+236,236,111, 5, 65,152,221,212,140,234,158,182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, 0,149, 74, 21, 14,
+224,140, 51,135, 27, 12,141,196,176,217,108, 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,115,231,242,131, 93,
+251,207,133,134,134,226,145,135, 31,102,111,233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,230,148,184, 8, 88,
+237, 86,100,111, 88, 47, 16,193,186,129, 86, 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,217, 62,169, 84,138,
+255,254,247,191, 1, 9, 3, 81, 84,121,107, 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, 2, 8,130,128,151,
+ 95,126,185, 81,115,162, 43,127, 64,118,158,139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,206, 9,200, 37,155,
+ 59,119,110, 64,142,214,157,119,222,233, 87,184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, 55, 61,237,118, 59,
+214,172, 89,227, 20,169, 34,222,126,251,237,167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,250,122,244,238,221,
+ 59,133,101,217,195,165,165,165,133, 39, 78,156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, 25, 51, 60, 58, 86,
+238,206,146, 47,231, 73, 20, 88, 14, 65, 20, 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, 70,144,155,138,156,
+226,169,242, 13,164,249, 48, 64, 59,157, 99, 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,176,219,237, 87, 60,
+215,151,167, 55, 89,127, 66,235,232,209,163,255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,112,235,174, 93,187,
+ 34, 57,142,131, 70,163,129, 70,163,193,218,181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, 28, 97, 48, 24,126,
+ 47, 45, 45,125,219,171,130,225,249,161,253,250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,209,219, 91,183,110,
+205, 76,155, 54,205,120,246,236,217,217, 0,202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,163,177,117,235,214,
+249, 0,140,129,198, 89,167,211, 53, 18, 88, 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, 12, 65, 8,113,222,
+ 27,135,155, 37,222, 31,194,113,156, 56,170,209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,221,142,178,178, 50,
+104, 52, 26, 76,122,251,109,233,123,227,255,221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,217,131,219,128,119,
+105,205,243, 39, 64, 20, 6,119,223,125,247,101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, 61,122,244,240,251,
+114, 37, 10,131,187,238,186,203,233, 12,173, 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, 5,112, 28,135,207,
+ 62,251, 12,175,188,242, 10, 88,150,197,204,153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,176,225, 51,225, 21,
+ 45,170,230, 69, 3, 0,130, 53, 26, 49, 66, 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, 70, 6, 56,142,115,
+ 58, 89,195,135, 15,119, 77, 71, 18, 8, 39,199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,238,188,243,206, 64,
+130, 57, 61, 52, 52,116, 74,167, 78,157, 58,207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,155,205, 22, 49,117,
+234, 84,165,135,115, 20, 0,186,117,238,220, 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, 9, 47,146,171, 93,
+143, 23, 57,220,197,145,195, 33,203,241,199,229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,159, 23, 83, 42,149,
+ 71,202,203,203, 51, 20, 10, 69, 35,145,229, 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,118, 19,253, 53, 29,
+ 2, 48,158, 62,125,122,188,203,239, 33,195,135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, 35, 35, 49,119,238,
+220,139,101,101,101,255, 2,176,177,178,178,210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, 21,192,191,159,123,
+238, 57,198,106,181, 98,222,188,121, 58, 0,235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,217,218, 61,123,246,
+252, 22,160,200,178, 11,130,112,153,192,114, 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,202, 96, 48,104,229,
+114,121,176, 86,171, 53,185, 10, 44,145,159,227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,228, 56,110,240,224,
+193,131, 57,247,123, 80, 86, 86,134,210,210, 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,211, 58, 80,145,245,
+ 39, 57, 90, 68, 44,235,226, 40, 65, 79, 35, 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,198,141, 27,125,118,
+ 88,119,107, 58,244,107,141,139,199,127,254,249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, 76,155, 54, 13, 19,
+ 38, 76, 0,199,113,126,155, 14, 93, 5, 76,210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, 98, 2, 21,111,190,
+220,188, 64, 90, 2, 92, 57,197,243,130,130,130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,200,200,200, 8,217,
+191,127, 63,102,206,156, 41, 53,153, 76,109,178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,184, 89, 62,254,174,
+112,235, 95,197,184, 54,227,249,248,116, 63, 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,126, 13,215, 99, 42,
+188, 58, 90,254, 42, 11,127,130, 43, 16, 71, 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, 80,167,211, 33, 58,
+ 58, 26,199,142, 29,179,233,245,250,223, 2,112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,125,123,196,199,199,
+195,104, 52,162,166,166, 70, 2, 96, 99,128, 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, 14, 29,112,224,192,
+ 1, 84, 87, 87,255, 8, 96,216,148, 41, 83,122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, 86,107, 64, 74, 67,
+ 16, 4,179,205,102, 75,102, 89,214, 82, 83, 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, 13, 68,104,117,235,
+214,109,239,249,243,231, 49,117,234,212,138,233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,163,145,109,213,170,
+149,124,222,188,121, 10, 0,232,214,173,219, 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, 45, 45, 69,105,105,
+ 41,202,202,202, 80, 87, 87,135,148,148, 20,232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,125,144, 55,165,172,
+187, 10,152,187,239,190,219,217,183, 75,116,200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, 94,120,225, 5, 4,
+ 5, 5, 97,214,172, 89,141,154, 14,221,197,129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, 17,207,148, 53,106,
+162,243, 32, 56, 2, 10,231,244,233,211,155,165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,194,182,109,219,174,
+184,233, 48, 45, 45,109,201,234,213,171, 67,142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,123,109, 21,112,212,
+229, 65,180,228, 80,252,201,245,212,190, 63,147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,211,172, 23, 95,124,
+241,185, 33, 67,134,132, 7, 7, 7,163,164,164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, 86,105, 77, 38,211,
+ 44,127,226,192,106,181, 34, 42, 42, 10,149,149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,159, 78,230,158, 30,
+ 24, 22,139, 5, 86,171, 21, 86,171, 21, 22,139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,184,184,246, 65, 65,
+ 65, 40, 40, 40, 0, 26, 70,246, 13,185,253,246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,179,227,155,115,114,
+114,146, 1, 64,161, 80,228, 2, 64,113,113,177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, 33,200,201,201, 73,
+150, 74,165, 4,222, 71, 53, 26, 87,174, 92,121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,233,146,172,211,233,
+202, 13, 6,131,193,104, 52, 18,137, 68, 34, 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, 75, 87,174, 92,121,
+220,155,243,166, 82,169,138,245,122,125,146,120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, 60,239,175, 89,151,
+162,229, 32,190, 84,185, 59, 47,238,251, 2, 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,189,242,202, 43,152,
+ 51,103,206,101,142,214,180,105,211, 0, 0,111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,110, 20,118, 0, 96,
+196,240, 53,173,204,131,227, 56, 76,157, 58,245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, 56,142, 67,120,120,
+ 56, 30,121,228, 17, 12, 29, 58,212,217, 4,217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,253,247,223,175, 14,
+ 13, 13, 13,254,207,127,254,195,213,212,212, 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,135, 94, 42,203, 33,
+104, 60,215, 70,173, 94,175,127,228,182,219,110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,174,134,217,108,134,
+ 84, 42, 69,108,108, 44,106,106,106,240,245,215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, 47, 62,254,248,227,
+160,244,244,116, 84, 87, 87,163,190,190,222, 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,253,122, 3,128,183,
+252,112,122, 82,115,176, 88, 44, 78,193, 21,128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, 99, 0, 32, 63, 63,
+ 31, 0, 10, 83, 82, 82,166,180,109,219,150, 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, 66, 46, 1,136, 49,
+155,205, 82, 0,168,173,173,181,180,106,213, 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, 54,155, 77, 10, 0,
+253,250,245, 51, 3, 40,117, 91,163,208,149, 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, 73,123,246,217,103,
+143, 62,249,228,147,108,124,124,124, 88, 93, 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,225,121,254,220,252,
+249,243,167, 0,208, 50, 12, 35,120,226,180,217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,202,202,156, 34,171,
+172,172, 12,157, 58,117,194,174, 93,187,236, 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,222, 4,150,248, 50,
+ 21, 40,167,171, 40, 26, 53,106, 84, 35, 23, 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, 58,199,215, 27,111,
+188,209, 72,180, 77,154, 52,201,107,117,230, 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,214,157, 60,207, 99,
+210,164, 73, 1, 59, 90,184,188,143,214,101,156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,233,105,183,219, 95,
+152, 51,103, 14,209,104, 52, 55,107,181,218, 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,153, 76,114, 90,142,
+ 40, 39, 90,102,126,174,235, 71,104, 57, 30,146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, 3, 27,242,242,242,
+238,187,229,150, 91,190,125,225,133, 23,130,211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, 99,182,149, 43, 87,
+106,245,122,253,163, 0, 2, 25,117,182,232,248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,178, 36, 53, 53, 21,
+181,181,181, 8, 11, 11, 67, 84, 84, 20, 78,157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,161,250,123,225,183,
+ 88, 44,120,232,161,135, 32, 8, 2,102,207,158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,222, 49,187, 52, 78,
+159, 62, 13, 0,231,146,147,147,131, 1, 32, 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,212,169, 83,129,123,
+229, 40, 58, 89,162, 11,230, 47,220, 12,195, 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,254,240,231,159,127,
+126,217,113, 26,141,102,233,204,153, 51,223,123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,204,152, 7,142, 28,
+ 57, 18, 28, 20, 20, 4,157, 78,135,170,170, 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, 24, 12,239,210,226,
+248,215,192, 85, 24,120,115,181, 2, 16, 89, 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,206,109,229,235,165,
+ 72,156,150,198,211,148, 17, 77,172,215, 46,227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, 45,145, 51, 60, 60,
+188,193, 38, 87, 42, 33, 8, 2,238,188,243,206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, 83,167, 78,169, 0,
+228,174,105,208, 68, 23,159,130,130,194,159,208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,181, 22, 7,120,221,
+245, 58,157, 46,101,230,204,153, 47,170, 84,170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,167,104,218, 34,208,
+ 21, 0,158,223,189,123,247,236, 97,195,134, 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,228,236,217,179, 43,
+ 28, 46,214,217, 43, 73,164,240,240,240,227, 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,193,193,193,199,171,
+171,171, 3,165, 40,223,180,105,211, 55,125,250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,251,246, 29,179,107,
+215,174, 37, 0,142,109,222,188,121, 97,239,222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,205,230,185,165,209,
+139,147,229,139, 83, 75, 8,177, 60,254,248,227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, 0, 8, 13, 13, 61,
+210,171, 87,175,189,203,150, 45, 59,229,112,178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,191,175, 74, 75, 75,
+227,218,183,111,143,194,194, 66, 28, 61,122,212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,157,208, 34,132, 32,
+ 52, 52,180,209, 75,148, 56,228,191,169,205,133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, 86,171,157,147,155,
+ 6,210,101, 65, 16,124,207,199, 70, 8,113,114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,189,131, 74,165,130,
+213,106,117,242, 6, 48,242,179,169,106,241, 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,235,210,165, 75, 61,
+ 91,248,218, 90,147,201,244,158,201,100,122, 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,166, 77,155,196,118,
+132,169,240,191, 94,162, 79,156, 60,121, 50,147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, 11, 11,255,211, 20,
+ 14,187,221,254,248,174, 93,187,158,131,163, 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,246,199,247,236,217,
+227,252,221,196, 7, 37, 33,132,152, 8, 33,113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, 28,198, 31,243,100,
+ 89, 29,155,209,173,185,208, 23, 54,235,116,186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, 85,100,179,217,126,
+211,235,245,111,161, 97,141, 42,138,191, 8,102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,172,236,118,123,113,
+135, 14, 29,252,190,156,121,224,188,224, 67, 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, 37, 37, 5, 77,229,
+244, 23,247,228,228,100,143,113,247, 35, 8,189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, 50, 50,178,222,104,
+ 52,242, 38,147,137,183,217,108,141,236, 71,133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,126, 52, 44, 47,209,
+ 92, 48, 29, 57,114,228, 49,167, 61, 85, 94,126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, 66, 74,223, 76,116,
+149,245,245,245, 79,138, 63,196, 62, 32, 20,127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,172,172,204,104,129,
+184,247,188, 94, 57,125,161,164,164,228,102, 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,160,160,160,104, 25,
+ 48,104, 24, 57,224, 9, 77, 25, 77, 48,228, 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,142,211, 31, 55, 29,
+205,216,194, 2,140,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, 65, 65, 65, 65, 65,
+133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, 0,198,182,240,181,
+ 30,233,221,187,119,149, 92, 46,223, 0, 32,149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,181,235,246,147, 39,
+ 79,118,202,206,206,142,139,143,143,255,176, 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, 98, 98, 98,114,174,
+ 80,108,165,182,105,211,230, 68,106,106,106, 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, 4, 41,174, 3,116,
+ 1,208,149, 10, 45, 10, 10, 10,138, 22, 20, 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,181,228, 5,115,115,
+115, 47,237,220,185, 19, 9, 9, 9, 88,178,100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,113,226, 68,167,236,
+236,236,248,168,168,168, 79,154, 51,124, 55,221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,149, 10, 65, 10,138,
+191, 51,228, 0, 30, 99, 24,102,111,151, 46, 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, 25, 24, 86,175, 94,
+189,117,245,234,213, 91,105, 30,161,160,160,104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,246, 25, 9, 15, 15,
+183, 0,248, 13,192, 74, 15,219,155, 0, 52, 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,145,252,252,124,114,
+252,248,113,146,154,154,106, 8, 80,208,164,118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, 81, 52, 26,205,177,
+156,156, 28,114,246,236, 89,178, 97,195, 6, 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,234,187,238,186,139,
+124,245,213, 87,100,213,170, 85,228,199, 31,127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, 1,132, 94, 79, 90,
+132,113, 68,140, 0, 24, 8, 0,153,153,153, 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,186, 58,180,110,221,
+ 26, 60,207,123, 60,176,188,188, 28, 59,118,236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,119,239,190,115,243,
+230,205,169,193,193,193,206,157,130, 32,192, 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,147, 65,161, 80, 32,
+ 60, 60,252, 40,124, 55, 97, 56,221, 55,131,193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, 54, 99,186,164, 70,
+ 69, 69,229, 44, 90,180, 40, 50, 37, 37, 5,231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, 10,138, 63, 19, 19,
+238,187,239,190,105,209,209,209,108,151, 46, 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, 33, 4,181,181,181,
+200,201,201,193,230,205,155, 77,151, 46, 93,250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, 51,147,161,121,133,
+130,130,162,153,112,164,182,182,182,139,201,100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,105,233, 45,240,188,
+168,188,166,123,247,238,123,114,114,114, 82,141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, 34, 98, 23,128, 62,
+222,222,196,187,116,233,178,127,215,174, 93,225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, 14,192, 91,224,171,
+209,176,142,234, 57, 15,255, 37, 2,120,209,241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, 22,122,189, 30,163,
+ 70,141,170,206,205,205,237, 5,160,128,102, 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, 38,147, 9,122,189,
+222, 41,180, 36, 18, 9, 8, 33,176,217,108,206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,165,107, 86,139, 80,
+161, 69, 65, 65,209, 18, 72,237,208,161,195,161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,181,186,186,122,155,
+187,120,137,142,142, 78, 91,184,112, 97,114, 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,243, 77,173, 86, 59,
+205, 98,177,224,208,161, 67, 24, 51,102, 76, 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,123,244,232, 1,173,
+ 86,139,145, 35, 71,234, 79,157, 58,213, 27,192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, 36, 36, 36, 64, 42,
+149,250,140,156,193, 96, 64, 82, 82,210,174,138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, 20, 62, 57, 44, 22,
+ 11,138,139,139, 33,147,201, 96, 50,153,208,174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,184,195,119,223,125,
+135,238,221,187,163,115,231,206,168,175,175,119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,252,114, 30, 28,205,
+231,215,170, 22, 17, 59,166, 77, 17,219, 68, 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,250,144, 33, 67,182,
+173, 88,177,162,213,240,225,195,209,174, 93, 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, 27, 51,102,204,254,
+162,162,162,100,199,174, 94, 94, 56,123, 5, 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, 31, 62,124,152,151,
+201,100,216,183,111, 31,198,142, 29, 91, 89, 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,139,253, 70,238,252,
+249,243, 16, 4,193,228,233, 63,150,101,229, 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, 54, 20,255, 80, 88,
+205,102, 51,122,246,236,137,130,130, 2, 28, 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,247,226,224,193,131,
+232,223,191,191, 59,207, 53,169, 69,156,202,113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, 53, 46, 46, 46,103,
+209,162, 69,145,177,177,177, 24, 52,104, 80, 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,109,219,174, 2,112,
+207,149, 28,147,152,152, 88,177,111,223,190, 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,114,167, 78,157,246,
+109,216,176, 33,156,101, 89, 28, 59,118, 44,144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,123, 57, 87,213,161,
+ 67,135,190,251,247,239,151, 50, 12,131,194,194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,255,123,238,185,231,
+ 66,122,247,238,141,226,226, 98, 92,184,112, 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, 95,191, 30, 7, 15,
+ 30,132, 92, 46, 71, 66, 66, 2,212, 75,191,195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,169, 84,186, 62, 62,
+ 62,190, 28,158,231,165, 10, 27, 57,114,100,137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, 61,123,150, 68, 71,
+ 71,231, 3, 8,243,112,204,216,152,152,152, 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, 34, 69, 69, 69,100,
+221,186,117, 36, 34, 34,162, 37, 70, 4,166,118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, 19, 19, 43, 64, 71,
+ 30, 82,252,243, 17, 12, 96,106, 74, 74,138,241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, 35,227,199,143, 39,
+ 25, 25, 25, 36, 35, 35,131,140, 26, 53,138,188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,233, 40, 40, 40, 40,
+154, 23,137, 0,102, 57, 4,213,202,145, 35, 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,221,224, 9,111,150,
+150,150,146,210,210, 82,113,106,132,124,252, 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, 39,133,133,133,100,
+237,218,181,196, 33,216,154, 13, 10,133, 98,131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, 34, 10,192,220, 27,
+110,184,193, 58,123,246,108,178,114,229, 74,242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,131, 36, 50, 50,210,
+ 4, 32, 11, 64, 8, 77,174,171, 7, 93,217,156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,185,112,225, 2,217,
+176, 97, 3,137,137,137, 57,134,198,243,105,185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, 98,177, 56, 57, 78,
+158, 60, 73, 0,108,109,134,112,166,198,199,199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,220,147,146,146,202,
+ 43, 42, 42,200,166, 77,155, 72,100,100,164, 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,251,156, 57,115,200,
+211, 79, 63, 77, 18, 19, 19,237,142,151,162,248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,189, 27,114,185,220,
+185,227,247,223,127,119,157, 71,203,219,188, 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, 58,138,105,203,150,
+ 45, 0, 96,106,134,176,229, 94,184,112,161,255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,120, 97, 97,225, 43,
+ 93,187,118,157, 94, 87, 87,167,213,235,245,163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,112,224,192, 91, 0,
+ 8,128,247, 1,156,184,222, 18,130, 10, 45, 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,159, 15,145, 37,226,
+ 82, 65, 65, 65,159, 59,239,188,243, 57, 52, 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, 9, 75, 74, 75, 75,
+151,208, 44, 64,113, 29,225, 24,128, 7,175,231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, 90,120,158,103,139,
+130,130,130,226,111, 7,186,168, 52, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,255, 44, 48,240, 62,
+114, 32,187, 9, 60, 87, 50,162, 33,155,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, 80,180,168, 0,163,
+156,148,147,114, 82, 78,202,249,207,230,100, 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,215, 36,254,170,206,
+240,226,141, 16,208, 48,228,147,226,239, 7,215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, 29, 27,254,134,117,
+137,171, 40, 16,174,242,185,212, 18,113,191,158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,177,235,116,186, 35,
+ 38,147,105, 62,128, 93, 87,121,205,175,162,163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,101,193,243,188,161,
+182,182, 86,115, 37,164,145, 93, 70,188,202, 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, 24,169, 84,122, 95,
+120,120,120,104, 69, 69, 5, 97,217,134,174,124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, 97,123,195,195,195,
+ 67,197,243, 25,134, 65, 85, 85, 85, 77,121,121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, 68, 2,137, 68, 2,
+189, 94, 95, 85, 85, 85,117, 11,189, 21,255, 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, 34, 8, 76,173,141,
+ 81,252,190,254,194, 87,103, 2, 57,127,212,168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,215,215,235, 25,134,
+ 33, 12,195,128, 97, 26,222,179,220, 63,237,118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,137, 25,163,215,235,
+245, 14, 62,143,188, 0, 96,181, 90,139, 43, 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, 29,195, 48,130,235,
+127,132, 16,215,135,249,217,202,202,202,126,254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,181,113,143,142,142,
+ 30,163,211,233, 2,226,244, 17,247,203, 56, 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,158, 14, 60,207, 3,
+ 0,140, 70, 99,215,185,115,231, 62,246,198, 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,114,216,149, 43, 87,
+178,189,122,245, 2,195, 48,176,219,237,176,219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,191, 65, 55, 14,121,
+242,133,114, 96,154,191,253,190, 4, 38,128,183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,182, 73,156,130, 32,
+228, 95,186,116,169,143, 15, 1,211,236,156, 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,161, 80, 64, 16, 4,
+216,237,118, 88,173, 86,220,112,195, 13, 77,114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, 31,126,192, 99,143,
+ 61,134,190,125,251,230,149,151,151, 3, 0, 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,182, 22,183,221,118,
+ 27,170,170,170,254,209,133,235,230,244,132,247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,188,225,225,225, 7,
+229,114,121,180, 95,181,236,242, 32, 51, 26,141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,227,184,142, 0,146,
+108, 54, 91, 52, 0, 72,165,210, 50,137, 68, 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,197, 63,209,142,177,
+233, 71,214,153,132,225,202,182, 89,169,250,179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, 72, 5,176, 12, 13,
+ 11, 74, 63,141,134,121,128,174, 6,241, 0,238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, 3,144, 24, 25, 25,
+185, 68, 16, 4, 83, 85, 85,213, 19,240,176, 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, 62, 80,220, 44, 15,
+ 40,150,101, 63,205,204,204,252,215,138, 21, 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,107, 23, 32, 57, 57,
+217,159,171,193,177, 44, 59,123,228,200,145, 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,108,137,136,139,139,
+ 11, 52,239,127, 53,116,232,208,209,139, 22, 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, 47, 59,246,150, 91,
+110, 17,252, 71,157,253,244,158,123,238, 25,253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, 85,199,125,196,136,
+ 17, 15,127,247,221,119,202, 35, 71,142, 40,219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,243,238,187,239,126,
+120,217,178,101,202,131, 7, 15, 42, 59,118,236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,139,197,130,173, 91,
+183,130,101, 89,132,135,135, 99,236,216,177,216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,226, 1,224,199, 71,
+ 71, 32,159, 7,198,149,155, 33,149, 74,113,246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,254,194, 62,185,193,
+ 96,133,177,100,191, 82,161, 80, 56, 31, 0,250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, 95,191,208, 27, 95,
+251,246,237,191, 61,118,236, 88, 39, 79, 5,215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, 60,207, 39,156, 59,
+119, 46, 74, 38,147,129, 16,226, 44,196,238,159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, 54, 27,130,130,130,
+ 32,186, 81,102,179, 25,245,245,245,254, 56, 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, 84, 84, 20, 84, 42,
+ 21, 20, 10,133,147, 51, 80, 72, 36, 18, 12, 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,104,121,158, 71,120,
+120, 56,214,173, 91, 7,141, 70,131,196,196, 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,237,183,118,226,110,
+238,206,125,238,120, 84,130,101, 1, 65,104,120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,174,176,176, 48, 42,
+208, 52,178,217,108,136,139,139,147,248, 57,108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, 42, 5,199,113,224,
+ 56, 78, 20,232,137,132,144, 68, 65, 16, 6,150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, 88,177, 16, 67,183,
+ 58,147, 48,124,219, 33,220, 52,114,200, 27, 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, 86,106, 90, 90,218,
+161, 61,123,246, 4, 89, 44, 22,244,238,221,123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,226,232,103,159,125,
+ 86, 18, 26, 26, 10,153, 76,134,186,186, 58,156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, 92, 88, 88,152,177,
+119,239, 94, 12, 26, 52,232, 69, 0, 47, 95,174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,147, 45,107,112,113,
+220,143, 38, 16,236, 66,241,222,195, 23, 2, 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,121,184,239,190,251,
+ 16, 30, 30, 14,165, 82, 9,169, 84, 10,158,231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,120,113, 48, 0, 44,
+ 94,188, 24, 35, 70,140, 64, 68, 68, 4,130,131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,189,233,166,199, 23,
+ 45, 90, 4, 0,120,235,165,151,112,199,205, 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,240,171, 47, 1,124,
+124,223,125,247, 61,240,253,247,223, 7, 3,192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, 50,103,156, 25,134,
+129, 66,161, 8, 40,238,247,221,119,223,200,239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,151,203, 33,149, 74,
+ 27,109,238,162,211, 19,231,189,247,222, 59,114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, 11,115,166,167,200,
+213,148,123,244, 55,231,188, 62,132,214,161, 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,184,245,227,143, 63,
+142, 7, 31,124, 16,155, 54,109,122,170,137, 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,169,201, 15,112, 7,
+ 38,237,127,234,169,152,172, 51,245,216,189,247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,222, 59, 91,215,176,
+223, 70,152,173,175,140,139,185,113,246,255, 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,138,138,138, 32, 8,
+130,201,151,187, 32,149, 74,113,244,232,209,203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,241,227,199,227,212,
+169, 83, 16,151, 42, 9,128,147, 9, 15, 15, 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,166, 61, 71,225, 10,
+ 72, 24,179, 44,139,111,191,253, 22, 31,124,240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,114, 28,180, 90, 45,
+194,194,194, 16, 22, 22,214, 72, 32,254,147,225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, 2, 2,129, 8, 40,
+187,112, 6,147,223,253, 40,224,167, 15,207,243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,164, 36,191,121, 73,
+ 42,149, 78,249,249,231,159,101,223,126,251, 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, 80, 68, 68, 68, 56,
+183,132,132, 4,230,127, 61,184,254,121, 0, 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, 90,237, 90,207,247,
+156,132, 40,219,102,165,142, 28,242, 6, 0, 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,181,107,215,174,219,
+119,238,220, 25,164,215,235, 33, 8, 2,214,174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, 73, 73,171,118,238,
+220,121, 75,100,100, 36,106,107,107,161,213,106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,231,158,123,158, 31,
+ 51,102,140, 81,161, 80,136,206, 70,146,231,188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,207,234,242, 66,188,
+244,202,228,128,194,216,186,117,235,167,127,248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,108,155, 54,109, 30,
+ 95,178,100,137,147,179, 85,171, 86,224, 56, 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, 8,139,140,195,156,
+207,230,249, 13,103,100,100,228,252, 97,195,134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,170,149, 6,173,194,
+130, 27,210, 73, 96,240,251,169, 2,191,207, 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,171,248,242, 44,186,
+248,102,179, 25, 61,123,246, 12, 40,238,174,156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, 23,133,176, 67,112,
+ 54,226,224,121, 30,203,215, 45,242,234,102, 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,165,205,181,171, 80,
+124,124, 60,230,204,153,227,183, 94,114, 43, 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,195,113,226,126,222,
+209, 98, 21,137,134,126, 99,117, 0, 66, 61,240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,245,234,213, 98, 41,
+ 30,152,153,153,185,213,241,189, 70, 46,151, 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,172,213,187, 67, 66,
+ 66,142,121,112,117, 14,153, 76,166, 55, 0,148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,123,135,194, 76,128,
+244, 73, 51, 48, 44, 51, 19,235,227,101,144, 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,244,221,202,118,203,
+ 80,146, 32,142, 67,239,237,107, 48,126,251, 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,106,133,215, 30,217,
+136, 62, 26, 57,100, 38, 29, 88,150,245,148,179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,104, 88,199, 9, 94,
+194, 9, 66, 8,186,117,235, 6,134, 97,156,110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, 4, 7,149, 74,133,
+223,126,251,205,121,204,224,193,131, 97, 52, 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, 94, 12,158,231, 17,
+ 17, 17, 1,165, 82,201, 44, 90,180,104,162, 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,142,227,116, 90,173,
+ 54,194, 27,167, 68, 34,193,179,207, 62,139, 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, 26,209,170, 85, 43,
+167,216,242, 80, 0, 91, 98,184,111,203,114, 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,118, 8, 54,224,192,
+198,221, 29, 46,230,151,196, 19,144,134,174,183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,246, 23, 78,142,227,
+ 96, 52, 26,241,243,207, 63,227,228,201,147, 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,243,205, 24, 51,102,
+ 12,146,146,146,252,198,157, 16,178,176,168,168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, 96,183,219, 97,179,
+217,192,113, 28,130,130,130,160, 80, 40, 16, 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,207, 78,200, 93,183,
+124,194, 77, 35,223, 32, 88,241, 1,131,118,109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, 90, 11,196,106, 23,
+ 42, 95,157,248,201,243,127,250, 61,186, 92,100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,209,234,174,187,238,
+202, 41, 41, 41,233,239, 67,108, 93,198, 25, 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,183,223, 80, 86, 86,
+118, 41, 46, 46, 46,100,224,192,129,236, 75, 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,204,219,134,194,211,
+219, 33, 8, 13,174,117,195,230,249, 59, 9, 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, 40, 36, 39, 39, 67,
+169, 84, 34, 40, 40,168,209, 67,214,245,193,235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, 68, 4,146,146,146,
+160, 84, 42, 33,147,201,192,113, 28, 24,134,193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,223,112, 42,149,202,
+ 71, 23, 46, 92,216,200, 2,137, 14, 11, 3,199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, 67,186,114, 50,117,
+117,117,198, 61,123,246,168,247,239,223, 15, 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, 27,113,207, 61,247,
+224,219,111,191, 69, 70, 70,134,223,184,215,215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,117,107,103,220,197,
+141,231,121, 72, 36, 18,164,164,164,160,182,182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, 11, 11, 67, 66, 66,
+130,211,113, 19,197,209, 7,159,191,219,136, 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,187,118,208,104, 52,
+ 80,169, 84, 78,110, 95,156, 94,180,136, 83,111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,142,175,253, 39, 78,
+156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,166,187, 30,239,225,
+ 58,222, 29,173,204,204, 76,198, 17, 73, 6, 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,249,243,231, 81, 83,
+ 83,131,224,224, 96,205,204,153, 51, 53, 3, 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, 45, 0,119,223, 86,
+ 96, 89, 22,125,250,244,193, 49, 71,107,199,176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,103,198,143, 31,207,
+137,110, 6, 33, 4, 6,131, 1,177,177,177, 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,112, 47,164, 50, 6,
+172,132, 65,119, 82,133, 95, 7,245, 7, 3,192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,103,206, 4,228,104,
+ 57,226,197, 92, 41,167,232,104,236,220,185, 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, 80, 40,160, 84, 42,
+153,239,190,251,238,237,228,228,228,216,241,227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,226, 76, 75, 75,243,
+ 27,151,173, 91,183,226,139, 47,190,192, 83, 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, 32, 0,176,216,172,
+208,215, 27,156, 77,186,118,187, 29, 71,182, 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,235,105,177,247,125,
+190, 44,117, 64, 24,191,103,235, 37,235, 30, 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,177,118,237, 90,188,
+243,206, 59,248,247,191,255,125,153,171,229,239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,223,120,227, 13, 86,
+116,180,148, 74, 37, 24,134,129,209,104,132,201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, 54,255,215,107,115,
+ 37,163,248, 93, 41,215,175,109,155,192,182,211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, 50,124,108, 82, 24,
+ 8, 1, 17, 0,129, 0, 38,147, 14,207, 63,255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, 26, 52, 8, 69, 69,
+ 69, 56,113,226, 4, 58,116,232,128, 69,139, 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, 57, 50,241,198, 27,
+111,252,180,190,190,190,186,190,190,254, 83, 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,190,223,228,201,147,
+ 37,110,125,116, 36,222,236, 81,171,213, 6,131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,199,142,184,235,174,
+187,192,243, 60,148, 74, 37,212,106,117,163,102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, 31, 62, 28, 82,169,
+180, 17,167,152, 15,135, 15, 31,142, 23,222,155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,122,189,190,126,243,
+230,205,138, 87,159,122, 10, 55,182,111,143, 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,157, 0, 16, 36, 18,
+ 9,186,116,233,130,178,178, 50, 20, 20, 20,160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,120,239,189,247, 96,
+ 50,153, 2,142,123,251,246,237,113,235,173,183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,237,218,181,195,202,
+149, 43,145,154,154,234,151,179, 83,167, 78, 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,157,215,136,143,143,
+111, 18,231,134,189,231,241,229,198,205, 48,153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,187,200,185, 96,193,
+ 2,212,212,212, 56,141, 3,241,165, 92, 52, 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, 51,192,231,173,120,
+156,152,185,228, 89, 89, 89,211,221,207,247,199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,254,230,230,205,155,
+195,107,107,107,113,250,244,105,176, 44,235,108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,203,203, 33,151,203,
+ 33,145, 72, 96, 54,155, 1,160,187,183, 7, 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, 26, 10,134,216, 33,
+254,135, 31,126,128, 90,173, 70,112,112,176,243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, 1,150, 1, 24, 9,
+192,178, 4, 44,195,128,221,149, 3,134, 1, 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,201,197,114,255,190,
+101,203, 22, 4,202,217,174, 93, 59,168,213,106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,156,164,193,141, 16,
+ 16, 21, 21, 5,158,231,153, 69,139, 22, 77, 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, 54, 61, 33, 33,148,
+ 0, 82, 34, 77,225,194,165,151, 0, 66,104, 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,147, 42,200, 37, 32,
+ 72,151, 46, 69,164,131, 5, 20, 36,129, 64, 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, 33,194, 5,231,125,
+158,121,118,167,189,115,206,156, 51,103,222,243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,215,175, 35, 33, 33,
+ 1,245,235,215,119,219,103,171,168,168, 40,235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,138,114,237,251, 53,
+ 26, 77,126,159, 62,125,202,248,109,228,229,229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, 82,235, 80,110,102,
+142,234,227, 15, 63, 16, 45,155,250, 6, 0,224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,220, 53, 19,192,224,
+202,248,117, 58, 29, 76, 38, 19, 34, 34, 34,112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,173, 6, 44, 25, 25,
+ 25,157,162,163,163,127, 93,177, 98, 69, 68,243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, 59,119,238, 76, 49,
+ 24, 12,255,182,153,206, 93,226, 68,198, 55,201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, 4,157,159, 33,213,
+107,140,119, 76, 12,151, 0,142, 1, 24,176,224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, 63,147,201,132,107,
+215,174, 97,204,152, 49,150,188,188, 60, 9, 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,182, 45,224,213, 87,
+ 95,221,163,215,235, 95,116,147,250,219,172,172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, 31,154,166, 75,147,
+227,242,193,100, 1,138,162, 96, 52,154, 81, 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,118, 84, 34, 22,122,
+181,125, 49, 88,199,113, 28, 72,130, 40,186,246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,179,204,252,252,252,
+ 32, 18,137,240,237,183,223,226,198,165, 19,144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,250, 3, 68, 53,243,
+114, 75, 16,250,251,251, 99, 64,199,142,136,238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, 5,128, 99, 72,119,
+131, 8,176,246,116, 6, 5, 5,225,183,223,126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,111,223,198,238,221,
+187, 17, 21, 21, 85,237,188,219, 45,120, 51,103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, 8, 69, 69, 69,248,
+247,191,255,141,156,156, 28,183, 56, 29,135,247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, 18,130, 67,151,118,
+130, 0,129,171, 59, 62, 40, 35, 10,215,239,186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,117,170,242, 56,130,
+ 32,174,217,141,173, 51,103,206,156, 69, 16,196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, 65, 28,181,137,176,
+ 1, 14,219,174, 85, 75,104, 41, 20,138,246,158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,137, 68, 77,242,242,
+242,164,185,185,185, 48, 24, 12,186,249,243,231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,194,246,237,219, 1,
+224,128,107,159, 13, 18, 44,203,150, 86, 10,231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,155, 55, 87,249,194,
+120,245,251,195,184,126,253, 58, 28,195, 3,216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,170, 28,224, 93,193,
+ 93,223, 47, 87, 51,115, 42, 66, 70, 70, 70,133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, 32,151,203, 9,177,
+ 88, 76,136,197,226, 48,187,200, 18, 8, 4,165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, 61, 50, 51, 51, 43,
+220,175, 86,171, 59,169,213,106, 60,143,176, 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, 51,128,159, 59,189,
+ 51, 13,147,251, 70,245,172,238, 48,181,253,126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,183, 55,250,246,237,
+ 11,165, 82,137,153, 51,103, 98,248,240,225,213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, 52,188,110,221,186,
+176, 88, 44,176, 90,173,176, 88, 44, 72, 78, 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,241, 77,242,254,243,
+ 31,102,246, 30,249,170,241,118,206, 15,200,206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,105, 6, 98,177, 64,
+185,244,139, 15, 78,177,224, 64,146,132, 5,192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, 19, 19,147,157,159,
+159,159, 8,160, 23, 0,228,231,231, 95, 28, 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,215,235,171,162,244,
+ 4, 48, 25, 64, 31,148,248,129,216, 81, 0, 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,248,217,117, 15,200,
+102,209, 50,153,160,206, 47,196,132,119,230,252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, 39, 25,111, 76,152,
+ 38,173,170, 67,224,234, 69, 88, 13, 31,157, 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,124, 7, 96,172,224,
+ 40, 35, 96, 53, 0, 86, 29, 88,139, 1,132, 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,224, 56, 14, 66,129,
+ 0, 34,145, 16, 44, 5, 16, 12, 81, 42, 72, 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,100, 88,173, 86, 12,
+ 25, 50, 4, 22,139, 5, 38,147, 9, 70,163, 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, 98,177, 24, 31,124,
+240, 1, 94,126,249,101,204,155, 55, 15,177,177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,178, 42, 94,206,177,
+140,236,247,211, 46,182, 28,135,248, 0, 84,187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,115,209,162, 69, 80,
+171,213,229, 44, 89,246,255,161,161,161, 88,183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, 56,142,107,103,243,
+157, 50,199,197,197,221,138,139,139,139, 38, 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,210, 18, 58,141,141,
+118,119,220,105,191,209,190,190,190,130,240,240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,169, 80, 40, 62,251,
+238,187,239, 26,233,116, 58,220,190,125, 27,171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,201,114, 92, 31, 56,
+112, 32, 26, 52,104, 80,198,154, 37,151,203, 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, 73, 73, 49,138,197,
+ 98,132,133,133,201,179,179,179,141, 98,177,184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, 93, 25, 11,150,227,
+175,227,255, 67,135, 14, 85, 57,116,104,231,108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, 31, 88,150,133,191,
+191,191, 91,156,118, 81,107,115,128,135,201,100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,250,234,200,100,178,
+ 82,107, 38, 15, 87, 13, 2, 11, 11, 69,193,104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,230,183, 55,176, 5,
+ 5, 5, 56,113,226, 4,126,248,225, 7,188,252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, 51,174, 46, 88,176,
+160,142,175,175, 47,172, 86, 43, 30, 62,124,136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,195,100, 48,163, 88,
+163,197,103, 95,108,173,176,234, 1, 64, 65,238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,157,191,208,106,181,
+ 69, 6,131, 97, 56,128,101,142,253,169,252,252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, 55, 40,103,166,166,
+166,206,170, 87,175, 94,153,141,102,179, 25,245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,195,110, 47, 0, 39,
+ 1,172,171,168, 46,217,135, 14,117, 58, 35,148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, 13,177,119,128, 43,
+ 90,170,152, 25, 87, 46,169,246, 99,237, 47,236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, 85, 0,228,190, 16,
+119,253, 24,132,202,118,143, 38, 31,118,139, 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, 10,184,156,144,128,
+ 93, 63,253,132,145, 61,122, 64, 33,147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, 53,107,134,123,247,
+238,149, 9, 67,193,113,156,187,249, 47,205,187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,177,117,235, 86,156,
+ 59,119, 14, 51,102,204,192,248,241,227,209,189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,185,213, 45, 35,103,
+ 78,231,247,126, 77,202,221,206,185, 96,193, 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,183, 60, 57, 10, 35,
+231,117, 0, 62,246,109, 51,103,206,156,229,238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,153,156, 23, 20, 20,
+ 92,189,122,245,106, 11, 15, 15, 15,220,185,115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,254,253,251,159, 90,
+182,108, 89, 24,203,178,200,201,201,193, 71, 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,135,203, 63,108, 7,
+ 15, 30,116,107, 8,196, 46,164,132, 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251,
+ 88, 49,137,191,102, 42, 84,101,125,170,202, 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, 90,158,154,154, 90,
+ 97, 67,114,238,220, 57,176,182,134,214, 93, 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,200,229,242, 50, 34,
+ 75, 42,149, 86,249,224, 84, 21,144, 84, 38,147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, 5, 5,237,159,233,
+161, 67,112,160,173, 52,140, 70, 19,116, 90, 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, 66,135, 14, 29,202,
+137,172, 26,154,231,211, 11, 10, 10,186,175, 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,214,233,116,221, 1,
+164, 87, 75,108,178, 28, 40,171, 21, 6,147, 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,222, 89,201,254,251,
+ 52, 77, 71,219,227,190,185,129,127,213,171, 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,100,189,233,104, 72,
+198, 95,209,179, 43,234,197,151, 88, 71,141,102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,147, 85,147, 58, 68,
+ 16, 68,169,211,247,212,169, 83,113,243,198, 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,212,114, 44, 91,113,
+172,218,220,187, 29, 92, 32,150,237,222,237,114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, 83,238,125, 83,221,
+252, 59, 10,152, 21, 43, 86, 96,198,140, 25,216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,205,205,197,141, 27,
+ 55, 96, 54,155,221, 78,167,163,223, 92, 82, 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,228,116, 22, 90,251,
+ 79,255,142, 97, 81,109,107,196,249,217,103,159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,156,144,231,228, 11,
+101, 95,183, 56,137, 30,231,117,231,227, 1, 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, 54, 94, 65, 85,254,
+ 89,101, 44, 90, 78, 88, 52,120,240,224, 65,171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,102, 32, 34, 34, 2,
+254,254,254,161, 42,149, 10,249,249,249, 88,188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, 11,137,228,175, 14,
+171,221,178, 5, 0,227,199,143, 47,103,209,178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, 24, 50,100,136,224,
+207, 63,255,100,250,246,237,139,161, 67,135, 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,236,223,191,255, 67,
+ 0, 95,186, 33,182,106,205, 49,222, 94,201,220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,194, 82, 71,121,119,
+ 56,237, 67,135,142, 15, 32, 73,146, 80,169, 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, 80, 40,239,220,185,
+211,200, 62,241, 34, 47, 47, 15, 61,123,246,188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, 25, 13,181, 70,107,
+127, 30, 54,110,220,136,196,196, 68,152, 76, 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, 92,206,246,235,215,
+ 15, 87,175, 94,133, 84, 42,165, 80,131,248, 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, 84, 85, 39, 38, 38,
+194, 98,177, 96,222,188,121,204,175,191,254,122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,161, 58,122,244,232,
+123, 0,182, 86,246,242,166,104,155,104,175,197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,203, 98,226, 91,111,
+161,119, 29, 13,134,190, 20, 0,125,214, 93, 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, 7, 0,253,186, 13,
+ 70,171,102,229,195,131,117,238, 85,210, 39,187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,106, 88,180, 74,159,
+ 57,251,253,107,211,166, 13,154, 52,105,130,179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,212, 84,220,188,121,
+ 19,133,133,133,213, 46,163,239, 79,238, 66,161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,199, 46,119, 59,154,
+ 14,248, 12, 0, 80, 39,192,187, 90, 66,203,145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,214,171,123,254,147,
+ 68, 69, 66,235,129, 90,173,238, 48,114,228,200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,129, 61, 58,118,236,
+ 40,148, 72, 36,184,124,249, 50,246,239,223,191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,162,253, 65, 84, 42,
+149,130,197,139, 23, 19,155, 55,111,174,208,202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, 21,253,250,245, 99,
+ 18, 19, 19, 33, 22,139, 49,104,208, 32, 38, 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, 63,244, 1,208,181,
+ 26,247,202,238, 24,239, 9, 55, 29,224, 43,234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, 98, 49,109,143,252,
+ 78,146, 36,172, 86, 43,218,182,109,139,220,220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, 42, 20, 10, 97,177,
+ 88,208,181,107, 87, 16, 4,129, 53,107,214, 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, 2,203,214,238, 87,
+101, 98, 99, 99,203,136, 41, 87,145,151,237,247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, 55, 61,115, 69, 24,
+ 24, 24,216, 33, 55, 55,247,160,211,230, 2, 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, 63,126, 92,112,224,
+192,129, 94,135, 14, 29, 74,184,123,247,238,163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, 30, 94,122,233,165,
+207, 51, 50, 50, 42, 17, 90,182,251,104, 50, 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,220,255, 67,239,144,
+ 34, 12,105,237,141,248, 35,151, 48,186,141, 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,126,169,178, 36,150,
+107,253,200, 14, 32, 31,221,171,118,222, 29,211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,127,140, 62,125,250,
+224,222,189,123, 56,127,254, 60,238,221,187,135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,123,161,209, 21,131,
+ 36, 72, 20, 20,231,195,100, 54, 34,118,210,220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, 57,123,246,108,100,
+103,103,151,177,100, 61,142, 95,214,179,142,202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,148,191,191, 63, 8,
+130,192,138, 21, 43,224,235,235,219, 9,192, 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,201,201,113, 57,111,
+ 95,175,215, 91,163,162,162, 68, 33, 33, 33,101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,177,177,177, 88,184,
+112, 33,194,195,195, 49, 96,192, 0, 68, 71, 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,196,199,143, 31,239,
+ 70,146,100,130,195, 11,164, 12,167, 43,216, 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, 11, 23, 46,196,172,
+ 89,149,187,122,108,216,176, 1, 40,239, 79,245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, 10, 31, 61,122, 84,
+ 70, 92, 57, 46, 46, 26,162, 50,156, 85, 5, 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,224, 96, 87,129,252,
+170, 44,163, 26,224,111,229,100, 56,246,218,210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, 20,150, 29, 78, 50,
+ 91,255,154, 74, 45,105,219, 11,150,235, 63,186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, 54,110,220,248,216,
+121,119, 83,108,149,231,100, 57, 66,225,225, 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,253,229,151, 95, 6,
+249,249,249, 33, 61, 61, 61, 64, 36, 18, 13, 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,156, 54,109,154,121,
+206,156, 57,210, 81,163, 70, 97,232,208,161, 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,233,248,241,199, 31,
+161, 86,171,111, 87,150, 78,150,227, 8,185, 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,184,163, 53,171,154,
+ 34,203,101,253, 4,128, 95,127, 60,136,185, 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,131, 85,223,198, 71,
+163, 95,198,178, 29,191, 1, 0,206,159,171,178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,227,134,143, 86, 57,
+ 78,123, 39, 81,171,213,162,168,168, 8,241,241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, 23,223,125,247, 29,
+ 20, 10, 69,141,202,232,195,183,102, 99,206,178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,177,203,221, 25,110,
+ 88,179, 42,228, 92,185,114,101, 77,235,210, 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, 32, 32, 0,169,169,
+169, 32, 73, 50, 2, 40, 25,194, 11, 13, 13,221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,190, 0,192,192,129,
+ 3,113,248,240,225, 42,123, 20,193,193,193,168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,114, 28, 61,122, 52,
+187,160,160,160,128,227,184,106, 77,115,179, 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,222, 13,217,184,113,
+163,160,146,151, 95, 41,206,159, 63, 79,163,138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, 4,170, 10, 72, 42,
+ 20, 10,145,148,148,132,185,115,231,130, 32, 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,129,175,116,110, 9,
+130,128,213, 82,126,164,218,179, 80, 87, 42,178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,239,198,141, 27,133,
+238,148,251,133, 11, 23,104,142,227,170, 61,236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,238,139, 57, 81,219,
+190, 61, 38, 34, 8, 11,174,156,219,135,226, 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, 46,186,181, 67,134,
+ 12, 25,245,213, 87, 95,181,112,181,211,141, 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, 19,235,177, 99,199,
+222,124,245,213, 87,209,186,117,107,132,132,132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, 23,192,148, 42,238,
+227,193, 69, 95,204,137,137,223,113, 76, 66, 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,238,183,138,197,162,
+ 59, 85, 89,139, 28,173, 89,181,249, 98, 28, 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,197,112, 44,239, 39,
+134,117,207,104,180,122,109, 27,118,206,235, 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,101, 54,113, 83, 61,
+171,169, 61,239,149, 89,174,170,107,209, 34, 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,162, 71,143, 30,184,
+113,227, 6,110,220,184,129,105,211,166, 85, 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,151,123,109,192,157,
+186, 52,121,242,100, 0,248, 71, 89,183,170, 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,251,210,210,210,192,
+178,172,161,186, 5, 99,177, 88,236,193, 49,203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, 91,183,110,232,210,
+165, 75,233,240,137,227,226, 32, 76,112,224,192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, 0,185,185,185,125,
+187,118,237,122, 74, 40, 20,186,245, 21, 77,150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, 69,150, 59, 13, 81,
+ 85, 1, 73,133, 66, 33, 60, 60, 60,240,253,247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,155,159,228, 28,128,
+128,161, 95,238,122,120, 46,223, 90,111,232,151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, 57,242,184,187,229,
+ 78,211,244,131,236,236,236,106,135, 75,224, 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,255, 51,231,174, 94,
+190,240,243,169,126,253,162, 58,180, 3, 9, 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,240,225,195,159,102,
+177,105,178,179,179, 59, 13, 27, 54,108, 10,254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, 69,129, 64, 32, 5,
+ 48, 23, 64,218,165, 75,151,214, 94,186,116,169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,254,168,186, 30,229,
+190, 13,142, 13,235,215,251, 95,125, 65, 16,156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,200,106, 85, 89, 71,
+202,225, 11, 28,181, 62,100, 63,101,202, 20, 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,165,195,252,117,103,
+ 16,202,112,183, 59,124, 0, 48,251,255, 38,212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, 16, 32, 47, 47, 15,
+ 73, 73, 73,200,201,201,129,193, 96, 64, 98, 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, 85, 70, 79,147,243,
+159, 56,124, 88,109,161,101,181, 90, 63,109,208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, 38,106,170, 61, 11,
+ 79, 36, 18,153,154, 52,105, 66,184,154,157, 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,130, 16, 84,212, 11,
+177,255,103, 89,150, 17, 10,133,113, 53,188, 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,242,209, 55,107,214,
+172,244,139,246,206, 49, 81,108, 31, 91,213, 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,119, 12,104,250, 92,
+131,224,210,250,143,122,179,222,185,124,107, 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,221, 73, 75, 73, 73,
+177,252,235, 95,255,250, 86,171,213, 78, 6, 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,158,155,150,159,159,
+223,211,105,219, 31,118, 65,101,143,107, 87,109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,203, 13, 69, 81,233,
+ 85,237,119,142, 17,230,136, 91,240,198,172,171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,213,204, 91,174,187,
+121, 15, 9, 9, 65,157, 58,117, 74,127,237,112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, 17,223,157,125,178,
+220,225,172,237, 50,170,140,179, 78,157,109,181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, 57, 5,252,253,228,
+ 57,121, 78,158,243, 9,114, 62,151,224,189,212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,168, 68,149, 86,103,
+166, 79, 77,148,237,105,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,231, 26,188, 89,149,
+231,228, 57,121, 78,158,147,231,228, 57,121,206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,104,241,224,193,131,
+ 7, 15, 30, 60,120,240, 66,139, 7, 15, 30, 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, 30, 60,120,161,197,
+131, 7, 15, 30, 60,120,240,224,193,131, 7, 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,233, 7, 1,163,163,
+163, 9,254,182,240,224,193,131, 7, 15, 30, 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, 7, 15, 94,139,212,
+ 14, 72, 94,108,241,224,193,131, 7, 15, 30, 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,103, 10,101, 44, 90,
+188,224,226,193,131, 7, 15, 30, 60,120, 60, 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, 30, 60,120,240,120,
+ 76,129, 85,217, 47, 15, 30, 60,120,240,224,193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, 57,121, 78,158,147,
+231,228, 57,121, 78,158,243, 31, 11, 33,127, 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, 23, 90, 60,120,240,
+224,193,131, 7, 15, 30,181, 39,178, 8, 87,235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,
+240,224,193,131, 7,143,199, 3, 1,126,232,144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, 52,115,224,116, 53,
+200,107, 50,251,224, 52,207,201,115,242,156, 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, 55, 0,103, 1,116,
+183,253, 86, 40,188,106, 27,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,148,119,134,231, 81,
+ 21,132,168,124,136,185,170,253, 60,120,240,224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, 68, 65, 84,113,142,
+ 47, 73, 87,104, 12, 96, 22, 0,111,135,109,191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,170, 76, 13,199,137,
+109,252, 82,219,194, 2, 48, 1, 48, 3,208, 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,170,185,255,185, 66,
+ 72, 72,136,220,199,199,167,207,245,235,215, 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,201,172,172, 44, 35,
+ 95, 93,158, 11,244, 5, 48,211,246,127, 17,128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, 29,154,166, 9,131,
+193,144,169,215,235, 79,209, 52,253,165,173,221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, 25,153,153,153, 59,
+ 0,236, 1, 48,188, 78,157, 58,163,235,215,175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,201,131,199, 63, 9,
+ 68,101,214, 8, 87,152,203,113,220,232, 50, 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, 23,185, 92, 78, 3,
+ 24, 87,133,200,242,187,124,249,114,189,201,147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,115, 96, 96,224,175,
+171, 86,173,250,142,227,184,116,130, 32,180,213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,199, 65, 36, 18, 93,
+ 47, 44, 44, 60, 65, 81,212, 55, 0,106, 34,222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,133, 55,205,102,243,
+ 9,154,166,215, 2,176,212,128, 83, 38,145, 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, 70,115,202, 98,177,
+172,181, 9,206,167, 13, 33,128,104,142,227, 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, 28,199,113,196,207,
+ 63,255,220,134, 97, 24,210, 86, 63,162, 1,252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,208,100,178,151,175,
+ 95,191,222,116,247,238,221,204,215, 95,127, 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, 43,235, 61,231,227,
+253,252,252,150,147, 36,233,239,206,245, 89,150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,143,151, 53, 2,144,
+ 94,195,250,253,247,113,154, 98, 56, 0,136,151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,173,237,202,113,192,
+148, 40, 47,242,113,133, 86,104,104,104,124, 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, 77,175, 92,185,210,
+125,223,190,125, 47,107,181,218,225,213,164,124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,213,104,247,238,221,
+109,223,126,251,237,247, 55,110,220, 88,119,196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,190,124, 10,233,228,
+193,227,159,134,110, 40,235,163,245, 57,128,207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, 57,115,230,144, 80,
+ 40,180, 91,180,218,235,245,250, 32, 39, 43,152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, 17,217, 10,133,162,
+201,171,175,190,170, 37, 8, 66,176,123,247,238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,199, 93, 32, 8, 66,
+237,102, 38, 91,248,250,250,238, 95,178,100, 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,143, 30, 61,218,239,
+243,207, 63,255,176,160,160, 96, 8,128,132,106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, 97,112,112, 48, 76,
+ 38, 19, 18, 19, 19,123,159, 56,113,162,235,198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,189,239,191, 31,127,
+ 28,212,225,141, 55,132,190,190,190,224, 56, 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,226, 97,174,238,247,
+211,132, 68, 34, 33,183,111,223,222, 90, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, 44, 51, 51,211, 91,
+ 44, 22,187,220,207, 48, 12,186,118,237,218, 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,215,119,238,220,233,
+191,118,237,218,215, 0,148, 19, 90, 36, 73,250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,177,160,121,243,230,
+ 79, 53,255,241,241,178, 48, 0,211, 99, 98, 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, 78,199,250,182,220,
+225,255, 99,167,213, 1,245, 0,224,216, 13, 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,106, 53, 68, 34, 17,
+172, 86, 43,178,179,179, 17, 25, 25, 41,248,246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,216,177, 99,214,237,
+219,183, 91,162,162,162, 68,227,199,143, 87,118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,168, 49, 99,198, 72,
+226,226,226, 2,142, 30, 61, 58, 48, 33, 33,225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, 43, 21, 90,112, 16,
+ 87,131, 1, 64, 36, 18,181, 9, 10, 10,138,167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,199, 30,100, 89,118,
+ 80, 85,150,172, 49, 99,198,116, 60,126,252,248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,135, 31,166, 2, 64,
+ 74, 74, 74,195,129, 3, 7,134, 78,157, 58, 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,208, 87, 37,178, 34,
+ 35, 35, 47,159, 63,127,222, 75,165, 82,149,217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,213,235, 82,114,114,
+114, 23, 0,127,186, 35,136, 26, 55,110,124,250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, 6, 3,148, 74, 37,
+ 70,140, 24, 33,238,214,185, 83,221,169,211,222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,198,197,121, 82, 15,
+ 31, 66, 46,151, 67,167,211, 1, 0,188,188,188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,164,164,222, 79, 73,
+108, 73,109,191,102, 0, 71, 4, 2,193, 96,137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,221,161, 7, 15, 30,
+ 12,185, 92, 14,139,197,194,162,100,232,144,126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,106, 53,242,243,243,
+ 97, 54,155, 81, 84, 84, 4,150,101, 9,185, 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, 74, 42,179,141,166,
+105,232,245,122,152,205,102, 88,173, 86,104,181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,190,204,201,201, 73,
+123,194,217,207,179, 11,162,248,120,217,125, 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, 15,143,252,110, 10,
+183, 89,199, 30,212, 2, 31, 11, 0, 23, 46, 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,227,170, 61, 28,151,
+156,156,188,238,197, 23, 95, 36,110,221,186,117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,223,165, 75,151, 22,
+196,198,198, 46, 2,176,117,247,238,221,239, 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,224, 56,174, 29,128,
+ 0,123,219, 98,107,119,253, 28,214,111, 16, 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,248,213,225, 60, 53,
+ 65, 16,191,214, 52,153, 78,191, 37,157,110, 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,158,203,174, 93,187,
+214, 60, 43, 43,203, 39, 43, 43,203,231,218,181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,245,180,195, 62,241,
+229,203,151,235,237,223,191,127,209,233,211,167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, 11,154,238,211,167,
+ 79,238, 79, 63,253,196,116,232,208, 65,126,252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,174, 56,109, 16,169,
+ 84,170,239,207,157, 59, 87, 78,100, 57,162,110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, 54,200,100, 50,217,
+190,159,126,250,201,211,203,203, 11,185,185,185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,247, 46, 72,139, 5,
+ 43,190,152,239, 37,151,203,247,186,104,236,203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,193, 2, 88,173,214,
+210, 33, 87,171,213,138, 75,147, 39, 67,253,227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, 3,142,156,147, 1,
+ 20,216,150,201, 0,174, 68, 70, 70, 94, 75, 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, 99,198,140,201,123,
+246,236,105,213,165, 75, 23, 36, 38, 38, 34, 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,179,176,236, 95,239,
+152, 58,117,234,228,238,223,191, 31, 35, 70,140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,211,237,116,154, 76,
+ 38, 24,141, 70,232,245,122,164,164,164,200,151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,102, 77, 10, 8, 8,
+184, 30, 20, 20, 84,239, 9,231,221,234,244,127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,173, 29, 26,216,234,
+242, 86,118, 63,179,109,105,213, 3, 72,123,156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,197, 77,193,138, 85,
+ 96,197, 42, 48,126,237,144, 44,121, 5,225,225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,173,167,156, 15, 96,
+ 89,108,108,236,231, 4, 65, 92,136,141,141,157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,243,153,120,222,121,
+206,255, 45,206, 42,180, 72, 0, 65, 16, 71, 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, 0, 72, 92,253,218,
+ 23,135,237, 1, 28,199, 13,112, 56, 47,160,134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,237, 59,126, 33, 8,
+226, 16,128, 95, 68, 34, 81,155,214,173, 91, 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,221,235,213,162, 69,
+139,193, 34,145,168, 13,128, 95,148, 74,229,161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, 54, 0, 80,148,144,
+144,160,232,208,161,131,158,166,105,130,166,105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,121,244,234,213, 43,
+117,250,244,233, 99, 92, 8, 14, 71,188,190,120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, 48,121,242,228, 96,
+145, 72,244,102,101,119, 75, 40, 20, 78, 89,188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,144,148,148, 4,147,
+ 94, 7, 74,171, 1,165, 41,130,250,254, 61,168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, 77,108,108,144, 37,
+ 53, 21, 41,123,246,128,161,203, 27,127,104,171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, 83,158,176, 37,107,
+ 41,199,113,114,142,227,228, 4, 65,172,234,216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, 59,127,254,124,119,
+154,166, 69, 52, 77,139, 46, 92,184,208,197,100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,177, 24,114,185, 28,
+157, 59,119,190,191,121,243,102, 42, 44, 44, 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,213, 46,118,151,207,
+106,181,194,108, 54,195,104, 52,194,100, 50,225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, 11, 40,138, 50,199,
+198,198, 42,125,125,125, 63,124,146,249,140,137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, 56, 1, 88,108, 62,
+ 89,118,248,219,184, 45,181,116, 43,104, 0, 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,227, 55,223,124, 19,
+ 70, 74, 85,184,104,233,143,239,216,207,113,210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,113,107,106, 33,205,
+ 95, 1,232, 10, 96, 85, 77, 78,126, 2,233,172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,103, 31, 7, 81,141,
+208,123, 80, 51, 50, 61, 42, 2,220,160,102,100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,209, 28,199, 69, 47,
+ 90,180,104,161,195,251,221,190, 46,119,211, 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, 41,209, 20,142, 74,
+210, 33,115,165,179, 11,131,130,130,226,227,227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,177, 99,199,190,151,
+158,158, 30, 83, 69, 34, 36,217,217,217,109, 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,237,205,216, 15,240,
+246,246,102,138,139,139, 69,122,189, 94,192, 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, 64, 64, 64, 84,255,
+254,253, 43, 28, 58,160, 40, 10,122,189, 30,122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,110,238,250, 10, 21,
+135, 84, 26, 21, 21, 21, 37, 42, 40, 40,128,183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, 88,117, 90,208, 90,
+ 13, 56, 77, 49,242,239,221, 65,135,102, 77,197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,184,113, 66, 15, 15,
+ 15,116, 31, 93, 50,207,224,120,179,102,224, 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,237, 10, 10,132,202,
+109,219,162,212,106,245,178,167, 81,217,165, 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,156, 60,121,242, 31,
+247,208, 75, 36, 18,200,100, 50, 88,173, 86,212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, 30, 98,177,248,135,
+252,252,252,133, 89, 89, 89, 41,238,242, 81, 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,104,208,128,152, 60,
+121, 50, 99, 48, 24, 26,174, 94,189, 58,249,228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, 83, 51, 0,205,226,
+227,101, 98,155,229,215,242, 63,198,201,161,196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,126, 66,189, 72, 0,
+ 29, 0, 47,155, 40,120,149, 32,136, 14,205,155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, 70,198,178, 44,193,
+178, 44,222,110, 95,132,201, 29, 5,160,168, 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, 62,155,111,122,122,
+122,246,145,201,100,245,105,154, 38,117, 58, 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, 29, 30, 30, 30, 75,
+102,205,154,213,201,219,219, 27,191,255,254,123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,150,175, 92, 19, 26,
+ 26,168,194,141,243,135, 67, 23,110,216,189, 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, 27, 64, 16,196, 17,
+103,161, 84, 45,179,211, 99,158, 95,133, 69,203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, 56,142, 67, 86, 86,
+ 22, 50, 50, 50,160, 86,171,225,227,227, 3,171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,145,217,104, 52, 66,
+161, 80,176, 34,145,136,179, 93,135,176,205, 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, 20,149,248,146,113,
+ 28,215,222,207,207,207,229, 62,179,217, 12,157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, 52,221,182,210, 46,
+ 45, 77,183, 12, 8, 8, 64,102,102, 38,228,114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,139,193,106, 52, 96,
+245, 26, 80, 22, 3, 66,155, 52,131,125, 70, 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,155,192,162,105, 26,
+180,205, 57,218, 62,156,232,239,239, 15,251,140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, 38, 33, 43, 43,171,
+ 76,157,152, 52,105, 82,169, 79, 86,215,174, 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, 32, 8, 16, 4, 81,
+ 82, 70, 52, 13,127,127,127,125, 94, 94,222,207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,112, 28,135,223,127,
+255, 29, 50,153, 76,196, 48,204, 45,154,166, 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, 54, 11,209,155, 40,
+113, 56,207,112,209,144,184,117,235,220,228,172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,170,146, 44,143,235,
+ 16,168,106, 61,208, 67,175,144, 8,244,108, 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,207,223,223, 95,150,
+156,156,108,154, 63,127,126,131,237,219,183, 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,253,251, 55,148, 74,
+165, 68,113,113, 49,212,106, 53,114,114,114,240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, 36, 36,100,243,235,
+175,191, 62,246,165,151, 94, 18,217, 45,164,122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,118,189,124,244,232,
+209,158,217,179,103,123,188,242,202, 43, 77,165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,250, 52, 84, 42, 21,
+ 72,146, 12,122,220,250,106,178,178,161,117,130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,252, 88,180, 42,120,
+215,183,179, 91,164,170, 16, 75,198,153, 51,103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,142,199, 57, 28,111,
+174,109,177, 85,173, 64,147, 44,203, 34, 35, 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,113,238,204, 62,227,
+ 8,130, 96, 79,157, 58,229,115,249,242,101,125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, 24, 34, 45, 45, 77,
+124,241,226, 69,213,237,219,183,131,108,189, 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, 50,247, 84,135,237,
+ 69,248,251,181,107, 37, 34, 75,167,181, 13, 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,220,190,127,142,176,
+139, 44,171, 77,104, 89, 44, 22, 80, 20, 5,150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, 96,124, 70, 70,249,
+119,225,144, 33, 67,240,238,187,239, 98,234,212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,150,109, 13,160, 24,
+192,241,231,237,161, 55,155,205,165, 22, 40,147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, 77,219,185,137, 3,
+ 7,246,227,194,133, 11,100, 66,194,173,176, 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, 40, 44, 40,241,127,
+170, 40,164, 66, 4, 42, 31,178,227, 42,227,124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,143,105,209,122, 69,
+ 66, 18, 95, 79,107,233, 43,251,176,149,159, 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, 97, 13, 84,117, 22,
+ 46,252, 34,228,246,237, 59,230, 57,115,230, 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,147,233, 27, 0, 69,
+ 21, 25, 93, 6, 13, 26,116, 53, 48, 48,176,193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,245,122,253, 3,163,
+209,120,218,106,181,158, 6,112,173, 58,137,245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, 86, 43,114,115,115,
+209,169, 83, 39,193,161, 67,135, 90,212,228, 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,169,124, 73, 42,149,
+ 6, 3, 96,180, 90,109,142, 94,175,255,163, 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, 62,124, 8,134, 97,
+114, 30,183, 14,200,196,228,163,155,231, 15,213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,247,176,251, 80,193,
+ 81, 64,185, 16, 72,151,227,226,226,228,139, 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,101, 63,206,225,248,
+243,143,145,198,138, 45, 90, 21, 41, 72,160,100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,153,153,144, 72, 36,
+ 72, 75, 75,131, 68, 34,201,114,167, 19, 34,151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,189,118,237,154,178,
+ 83,167, 78, 47,202,229,114,134,227, 56,152, 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,111,223,254,250,238,
+221,187,141,168, 36,254, 21, 65, 16,191,100,101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, 25,242, 20, 10,133,
+215, 43, 75,168, 80, 40,188,153,148,148,212, 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, 20, 23, 3,122, 13,
+ 36, 52, 13, 17, 67, 65, 46,147, 33, 35, 61, 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, 74, 85,250, 18,165,
+104,186,100, 97, 24, 88,104,186,212,162, 37, 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,216, 67, 56, 84,144,
+ 15, 4, 5, 5,177, 29, 58,116,192,148, 41, 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, 43,113,107,119, 90,
+ 55, 26,141,208,233,116, 40, 44, 44, 20,202,229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,224,129,166, 34, 78,
+155, 48, 43, 21, 93, 44,203,130,227, 56, 48, 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,223,178,157, 27, 52,
+104, 16,113,232,208, 33,176, 44,155,254,132,179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, 21,113, 58,246,254,
+ 28,183, 17, 46,142, 41,135, 15, 62,248,224, 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,104, 70,111, 62,183,
+ 83,247,237, 93,141,126,222,183, 43,127,179, 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,223,184, 42,127,199,
+246,189,201, 15, 31, 62,212,172, 93,187,182,227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,227, 55,223,124,115,
+ 92, 97, 97,161, 56, 62, 62,126,119, 86, 86,214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,107,231, 46, 2,152,
+ 95, 89,127,141, 32, 8,252,244,211, 79,229,102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, 39, 39,103,152,243,
+ 78,177, 88, 60,175, 73,147, 38,125,111,221,186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, 16, 8,234, 48, 12,
+147,105, 52, 26, 99, 31,219,162, 69,177, 19,226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,117,200,243,107,205,
+178, 65,237, 96,141, 82, 3, 32,156,214,255,176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, 87,251,212,143, 17,
+ 44,157,171,168,141,171,200,162,245, 9,128,246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,210,104, 52,200,201,
+201, 65,110,110, 46,132, 66, 33,148, 74, 37,214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,147,191,191,255,111,
+219,183,111, 15,254,250,235,175,133, 49, 49, 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, 67,152,205,102,226,
+237,183,223,142, 88,177, 98, 69,170, 64, 32, 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,167,190,255,254,251,
+161,211,167, 79,151, 90, 44, 22,151,150, 44,251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, 56,245,195,177,163,
+ 93,255, 51,114,164,152,210,106, 64,105, 53,160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19,
+ 71,127,253,131, 50,155,205,149, 6, 54,212,104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, 82, 20, 94, 73, 74,
+ 42, 21, 87, 86,171, 21, 7, 91,182, 4, 67, 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, 55,110,220,200, 29,
+ 61,122,244, 53,150,101,219,226, 9,125, 52,243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,201,209,163, 71,187,
+ 38, 38, 38,138,255,252,243, 79, 92,184,112,161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,196,155,171,160,191,
+176,249, 31,238,222,185, 7,239,188,243, 14,145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,117,
+225,228,247,228, 34,164,194,239,112, 51,164, 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, 56, 80, 22, 95,165,
+165, 12, 49,166, 24,141,205, 33, 62,171, 22, 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,243, 1,156,128,137,
+225,238, 93,231,110,188,244,146,143, 63, 0,152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,190,228,231,231,183,
+ 46, 63, 63,191,179,171, 50,141,142,142,238, 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,243, 65, 17, 17, 17,
+115,110,223,190,221, 78, 36, 18, 17, 85,212, 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,110, 4, 78, 80, 12,
+ 8,101, 96, 84,173,144, 38,110,142,176,176,171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,116,232,150,248,248,
+248,176,110,221,186,113,215,175, 95, 39,157, 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,215,174, 93,147, 81,
+118,166,109, 85, 72,179,197, 27,172, 53,156, 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,120,140,240, 12,143,
+149,196, 10, 13, 24, 21,108,111,111,139,137,213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,124,248,249,249,161,
+126,253,250, 32, 8, 2,235,214,173, 51, 62,120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,218,213,171, 87,239,
+218,182,109,155,234,218,181,107, 2,154,166,149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,189,118,237,154, 34,
+ 34, 34,194, 68, 16,132,244,199, 31,127,204,191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, 96,193,130,140,148,
+148, 20,152,205,102,104, 52, 26, 20, 23, 23,151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,239,223,159,101,139,
+ 18, 95,153,101, 99,237,154,117,235,213, 89, 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, 43, 60, 68, 12,234,
+ 54,146, 67,166, 80, 34, 71,163, 67,252,229, 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, 22,139, 81,111,248,
+112, 88,109, 67,133,142, 66,139, 33, 8,132,247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, 89, 86, 96,177, 88,
+ 42,203, 7, 88,150, 77, 79, 76, 76,220, 5,224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,162, 40,204,157, 59,
+ 23, 98,177, 24,115,231,206,197,167,159,126,138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, 6, 23, 47, 94, 20,
+159, 63,127,158,139,139,139,203,139,136,136, 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, 94, 94,136,141,141,
+197,146, 37, 75,176,121,243,102, 28, 60,120, 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, 87,175,206, 56,120,
+240,160,113,213,170, 85, 16, 10,133,196, 83,106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,181,111, 84, 69,156,
+144,197,199,215,181,137,163,100, 7, 65,116, 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,143,254,191, 68,213,
+166, 59,247,175,100, 25,103, 3,248,193,158, 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,148,228,253,253,247,
+223,203, 2, 3, 3,241,237,183,223,202,228,114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, 9,253,218,181,107,
+247,190,173, 35,218, 11, 64, 11,148,204, 94,140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, 32,173, 86,251,205,
+214,173, 91,235, 23, 48,190, 56,166, 31,138,120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,254,122, 29,134, 97,
+ 54, 85,179,220, 95, 31, 50,100,200,214,248,248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,142,203,237,219,183,
+243,198,142, 29,155,181,105,211,166,144, 17, 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, 29,186,120,225,150,
+254,207,205,205, 93, 93, 88, 88,120,233,222,189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,179,202, 33, 96,169,
+ 43,191,146,222,176,197,218, 32, 8,130,226, 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,186,119,239,142,189,
+123,247,250,247,232,209,195,192,178, 44,119,236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,155, 54,105,210,100,
+ 98,108,108,172,154, 32, 8,214, 21,167,253, 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, 84,160,105, 26, 6,
+131, 1, 6,131, 1, 28,199,193,219,219, 27,106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, 77, 38,147,105,216,
+228,247,167,159, 90,245,249, 92,175,240, 6, 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,114,220, 75,210,226,
+163, 93, 7,180, 70,147,233, 53, 23,189,229,114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, 4, 5, 65, 32, 16,
+192,108, 54,131, 97, 24,136, 68, 34, 68,198,196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,143, 51,103,109,192,
+145,115,242,141, 27, 55,198, 54,107,214, 12,147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,245, 48,155,205, 99,
+ 1, 92, 7,176, 14, 37, 67, 29,112, 18, 89,127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, 9,171,213,138,207,
+ 63,255, 28,118,193,105,175,215, 83,166, 76,169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, 37,103,182,111,223,
+238,255,205, 55,223,188, 14, 32,214,153,147,101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, 47, 47, 55, 60, 57,
+126,252,120, 88,173, 20, 4, 2,161,197,100, 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,159,161, 40, 9, 97,
+224,232,248,110,113,244,207, 66,197, 33, 21,170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, 49,123,237, 38,253,
+106,112,218, 5, 97, 77, 56, 79,217,150, 42, 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, 84,148, 78,179,217,
+252,231, 71, 31,125,116, 99,211,166, 77,189,175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,163, 41,138,226, 66,
+ 66, 66,132,157, 59,119,150,245,239,223,223, 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,205, 57,239, 2,130,
+ 32,240, 97, 87, 45, 98,123, 8, 96,177, 88, 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,142,172, 70,185,251,
+ 1,152,253,221,119,223,133, 74, 36, 18, 98,215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,239,222, 61,207, 54,
+122,145,254, 44, 62,239, 60,231,255, 44,231,179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,162,168, 95, 92,132,
+112,248, 4,192, 92, 7, 43, 88, 85,230, 60, 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,147,149,149,149,213,
+112,249,242,229, 97, 52, 77, 91, 19, 18, 18,200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,125,251, 28, 65, 16,
+ 86, 55, 50,152,144,156,156,220,169, 71,143, 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, 68, 74, 74, 10,254,
+248,227, 15,203,238,221,187,211,139,138,138,170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, 3,253,255,213,244,
+ 5, 73, 72, 72, 8, 96, 52,226,206,195,108, 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,231,151,223,238,221,
+235,221,115,198,140,125,243,254,243,159, 32,100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,189,120,227,198, 28,
+155,200,122,210, 81,225,165, 0,150,178, 44, 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, 61,140, 70, 35, 0,
+ 8, 9,130, 88, 10, 96,203,179,110,197,178,163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,227,227, 3,173, 86,
+ 11,154,166,153,140,140,140, 59, 62, 62, 62, 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, 11, 72,146,172,200,
+242, 1,165, 82,153,118,230,204,153,198,111,189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, 48, 28,199,237,127,
+210,247,160, 75,151,157,192,134,152,215, 0,188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, 3,254,226,116, 28,
+198,179, 11, 34,155, 21,170,185, 44, 62,126, 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,129,163,246,213,235,
+245, 96, 24,166, 50,107,222,239,123,247,238, 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,143, 30, 61, 60, 29,
+ 15, 48, 26,141,236,225,195,135,245,235,215,175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, 31, 30, 93,184,112,
+161,119,255,254,253,155, 0, 40,245,207, 82,171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, 75,249, 0,230,141,
+ 26, 53,106,233,182,109,219,234, 76,152, 48, 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,185,109,219,182,144,
+ 9, 19, 38,100,163,196,143, 44, 29, 60,120,240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,147,137, 51, 24, 12,
+156, 78,167,227,224,250, 43,240, 7, 51, 51, 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, 39,197,235,170,193,
+242,216,177, 99, 71,163,208,208,208,207, 21, 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 23, 47,
+ 14,229, 56, 78, 92,137,138,174, 8, 66,145, 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,192,192,131, 34,145,
+232, 29, 0,162, 42,148,121, 69,144, 9,133,194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,113, 74, 40, 20,126,
+132,202, 3,169, 86,202, 41,145, 72, 62, 10, 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, 68,242, 56,156,143,
+211, 43,177, 11, 45, 3,103, 3, 65, 16, 84,235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,234,107,155, 85,146,
+179, 89, 91, 12,168, 56,120,227,223,153,206,167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,154, 52, 41,152, 51,
+103,142,102,219,182,109,108,100,100,228,246,154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,148,196,109,218,180,
+137,142,140,140, 44,112,138, 12,255, 36,242, 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,140, 41,134,179,205,
+ 62, 60, 1,160, 79, 5,101,239, 46,103,152, 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,158, 4,167, 75,180,
+104,209,226, 30,231, 0,139,197,194,169,213,106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, 63, 0,111, 3, 56,
+ 28, 28, 28,124,187, 99,199,142, 15, 59,117,234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,150,165, 0,154, 84,
+193,217, 81,165, 82, 45, 12, 11, 11, 59,212,184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,194, 95,145,177,171,
+ 91,231,123, 12, 29, 58, 52, 77,167,211, 49, 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,142, 28,153, 14, 32,
+250,159,240,188,243,156, 79,133,243, 31,133,198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,110,149, 5,193,113,
+156,128,227, 56, 15,142,227,188, 57,142,243,229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,251, 56, 39,219, 4,
+148,193,246,223, 25, 85,237,127,174,239,103,104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,127,116,224,192,129,
+143,218,181,107, 55, 53, 52, 52,212,231,113,210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,243,230, 95, 57,137,
+172, 39,153,119,137, 77,196, 52,179, 45, 13,109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,105,231, 59, 4,160,
+175,109, 57,100,219, 22,246, 20, 56,203,161, 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,186,215,162, 69,139,
+123, 77,155, 54,189, 23, 17, 17,113,175,110,221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,192,158,118,157,239,
+ 30, 25, 25,121, 85, 38,147,185,140, 13, 38, 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, 11,173,255, 33,240,
+149,240,217,227,148,162,242,207,140, 84,181,159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,212, 2,167, 35,159,
+189, 78, 69, 56,136,166,167,193,201,215, 37,158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,126, 30,207,197,104,
+ 60,126, 0, 0, 32, 0, 73, 68, 65, 84, 54,170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, 81, 91,109,103,119,
+ 0,231,236,189,194,138, 84,105,117,102, 19,212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31,199,105,199,
+138, 10,182,223,113, 90,255,250, 25, 21, 94, 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, 78,158,179,166,152,
+248,140,138,172,110,246, 21,126,232,144, 7, 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, 8,236,255, 71,141,
+ 26, 53,158, 97,152,169,246,117,129, 64,176,230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, 85, 93,199, 21,103,
+139, 38,202, 73,126,222,138,247,138,138, 13, 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,101,203,221,218, 78,
+231,248,241,227,155, 56, 95,167,126,152,168,187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,169,192, 31, 64,180,
+151, 76, 60,168,133, 74,220,241,207,124,211,101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, 42,149,202, 49, 0,
+ 90, 24, 12,134, 64,133, 66,145, 11, 32, 65,163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, 91,125,120, 46, 21,
+245,220,217, 87, 21,250, 68,192,196, 1, 82,130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,105, 4, 11,199, 65,
+ 76, 0,230,147,247, 33,123,142,138, 74, 9, 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,174,224, 60, 84, 88,
+186, 46,172, 64, 76,116, 21, 11,137,175, 56,112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,190,246,237, 9,227,
+ 63, 7,137, 34,138,198,187, 91,182,108,169,241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,248, 99,159,174, 3,
+ 22, 47,178, 60,200,139,213,106,181,164, 84, 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,139, 88,236,113,121,
+197,138, 21,217, 53, 77,231, 7, 31,124, 16,108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, 88,124,246,240,199,
+138,110,209,139, 62, 7,120,161,245, 20, 32,169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, 76, 22,235,160,179,
+233,186, 65,159, 94,201,156,158,174,179,182, 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,110,220,184, 81,220,
+176, 97, 67,200,100, 50, 24,141,198,144,251,247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,238,125, 8, 46,252,
+236,214,255, 3, 0,116, 26, 51, 63, 28, 37, 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, 44,148,132, 80,112,
+213,234, 72,142,108, 91,134, 65, 99, 63, 18, 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, 9, 14,194,195,219,
+150, 33,122,236, 71, 21,126, 71,177,111, 99,130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,231,160, 36, 6, 88,
+ 57, 74,148,124,208,217,229,241, 3,154, 10,114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, 76, 27, 80, 20, 83,
+210,182,138,133, 96, 14,166,120,159,157, 61,123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,106,181, 63,218,238,
+ 91, 50,255,248,242,224,241, 92, 11, 46,215, 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, 98,231,206,157, 40,
+ 44, 44,132,143,143, 15, 36, 98,177,104,229,210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,169,230,117, 26, 59,
+159, 79,216, 62,165, 35, 20,144, 34,137, 68, 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, 69,159,200,149, 74,
+ 79,249,155,147,103,118, 70, 73,252,159, 26,193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,190,142, 88, 44,102,
+236, 47, 22,190,142, 61, 21,204,222,248,238,216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, 80, 0, 1,129,230,
+ 49, 39, 82,103, 1,248,244,121,201,108,195,134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, 78,175,215,195,104,
+ 52, 34, 52, 52, 20,103,207,158, 21,207,153, 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, 86,253,240,240,112,
+ 19, 0, 12,108,233,229,188,175,158,125, 31, 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,188, 41,189, 66,153,
+ 10,182,155, 0, 40, 42,227, 98, 89, 78,120,242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,108,104,116,220,238,
+233,233, 89,209, 41, 65, 58,157, 46,220,121,163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, 6,194, 29, 59,118,
+ 0, 0,190,252,104,180, 96,211,207,121, 66,161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,255,109,219,182,245,
+ 63,120,240,224,202,138,132, 42, 15, 30, 60,158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, 94,127, 27,199,143,
+255,128,174, 93,187,150,238,107,208,160, 1,134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,176, 88,255,105,191,
+145, 95,205,127,152,173,187,114,228,200, 17,116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,153,119, 11, 4, 71,
+138,189,148, 30, 24, 21,243, 14, 92, 93,103,226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, 30,141,130,253,250,
+180,108,214, 20,133,251,215,226,143, 34, 19,142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,168,103,182,158,122,
+ 46,132, 86,112,112,112,211,128,128,128, 50, 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,196,198,198,138,207,
+157, 59, 55, 50, 56, 56,248,180, 27,195,136, 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, 40, 20,156, 80, 44,
+213,118, 31, 55,223, 11, 0, 72,161, 88,187,114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,157, 52,155,205,102,
+206,145,211, 98, 49,151,110, 95,188,120,177, 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,144,138, 5,144,138,
+ 5,144, 73, 68,240,170,223, 14,210,194, 63, 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,145,136,167, 77,155,
+ 86,101, 58,199,143, 31,207,169, 84, 42,171, 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,160,144, 10,209,184,
+ 65, 24,164,156,209,237,180, 10, 4,101,189, 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,121,161,197,131,199,
+115,129, 10,103, 24, 10, 1,224,200,145, 35,221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,222, 28, 55, 10, 12,
+195,150,126,231,139, 32, 9, 76,126,163, 63, 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, 0,160, 81,189, 16,
+110,226,155,255, 1,195,178,127, 13,148, 8,128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,171,235, 52,109, 84,
+135,164,173, 38, 16,101, 63,246,248,119,124,108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, 59, 5,198, 83, 25,
+250, 64, 82,149,170, 94,245, 90, 7,153, 64,157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,113,227,198,114, 34,
+ 43, 39, 39,135,212,233,116,176, 90,173,172, 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,179,231,217, 53,143,
+ 43, 78,155,223,213,140, 91,183,110,213,155, 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, 9, 9, 89, 21, 21,
+ 21,229,187, 96,193, 2,107,255,254,253, 83, 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,119, 71,206, 45,103,
+214,112, 0, 64, 16, 4,162,162,162,210, 26, 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, 52, 9,245,182, 53,
+ 34, 4, 32,247, 44,245,196,139,138,138, 74,111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,142, 83, 46,151, 83,
+175,191,254,250,195, 59,119,238,184, 58, 30, 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, 18,128,158, 51,101,
+180, 80, 37, 3,164, 94,254,102,141, 70, 3,165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,246,236,217,115,142,
+127,222,121, 78,158,243, 47,184,210, 34,207,160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, 8, 15,194,226,255,
+ 27, 15,134, 97,193, 48, 12,104,219, 47,195, 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,119,125,122, 14, 89,
+218, 43,110,246,184, 83, 12, 3,176, 44, 5,138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,194,130, 17, 55,123,
+ 28,156,175,179,253,187, 61, 3,207, 28,138, 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, 82, 33, 39,148,193,
+ 98,161,161,181,176, 22, 0,122, 19,197, 90, 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,101, 68,214,178,101,
+203,252,215,173, 91, 23, 10, 0,195,134, 13,203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, 1, 0,222,179,157,
+ 59, 3,192,186, 10,120,245,225,225,225,166,128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, 96, 96,160,185,113,
+227,198,122,177, 88, 12,146, 36, 97, 23,122,110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, 16, 9,201,242,205,
+155, 3, 39, 73,146, 46,175, 87, 97, 29,146,201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, 67, 4,224, 44,199,
+113,184,126,253, 58, 82, 82, 82, 32, 22,139, 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, 6,224, 38,255, 4,
+243,224, 81,138,179,207,160,192,114,182,106, 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,236,184, 16, 63, 20,
+ 13,138,178, 2, 28, 87, 43, 66,171,162,235, 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, 77, 81,181,114,247,
+ 88,134, 2,203, 82,112,117, 29,130, 32, 25, 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,104, 19, 66,253,164,
+ 18,228, 25,209,240,133,102,130,223, 13, 20, 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,160,215,235, 75, 45,
+ 89,235,214,173, 11,181, 88, 44, 36, 0, 8,133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,142,227, 8,155,224,
+ 89, 10, 96, 11, 42,137,238, 47, 22,139, 75, 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,118,185,221,121,120,
+173, 42,136, 29,133, 22,184, 18,171,150,147,216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, 10, 28,174, 39,168,
+190, 43,166,213,106,133, 78,167, 67, 81, 81, 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, 49, 15, 30,174,181,
+200, 51, 44,182, 92, 11, 45,148,152,236, 8, 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, 23,112,213,140,122,
+ 58,114,228,200,173, 33, 33, 33, 29,236,235, 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,126,101, 68, 86,137,
+ 69,203, 82,225, 55, 65, 10,139,245,159,246, 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,198, 28, 70,146,191,
+162,144, 8, 97,134,191,253,217,120,135,198,253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,228,132,158,205, 21,
+164,246,252,199,227,254,117,192, 81,204,249,250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,183,138, 12,123,185,
+ 59, 94,126,239, 43,156,249,228, 99, 14, 40,132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, 5, 10,158,139,188,
+ 42, 20,138, 92,131,193, 16, 98, 52, 26,161,209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, 88, 2,202,106,193,
+241,237, 95, 84,201,105, 15,225, 48,176,165, 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,218,143,223,219,191,
+252, 93, 47, 0,184,113,100,173,102, 84,236,154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,205,102,147, 77,160,
+217,133, 31, 30, 60,120, 80,215,108, 54, 27, 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,169,169,117, 40,138,
+ 50, 8,133, 66, 88, 44, 22,183, 84, 17, 73,146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,150,128,196,219,237,
+ 60,115,110,116, 68,109, 98,235,137, 69,144,230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,253,200,145, 35,156,
+ 99, 15,145,166, 40,155,200,250, 75,244, 48, 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,247,130, 5, 11,164,
+115,230,204, 49,143, 28, 57,114, 57,203,178,173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,215, 26,218,215, 41,
+138,130,151,151, 23,188,188,188,208,180,113, 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, 40,138, 1,195,178,
+165,226,167, 80, 99, 14, 59,116,250,122, 35,135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,236, 90, 63,119,250,
+130,205,155,165,133, 76,192,180, 81,175,189, 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,177, 84,233,245, 64,
+130,131,179,143, 22,143, 39,132,228, 34, 61, 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,200, 32, 38, 5, 66,
+144, 66, 49, 18, 10, 77,212,115,148,221,132,228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, 97, 25, 66,161, 40,
+ 76, 40, 18, 17,209,163,166,178,217,217,153, 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, 66,163,100,232,208,
+149, 53,203, 49,132,131, 87, 84, 84,148,175,125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,179, 14,221,180, 22,
+ 17, 35, 71,142,148,135,135,135, 19, 0,240,235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,143,107,223,117,155,
+211, 95,193, 1,197, 15,128,226,212,114,150,172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,236, 46, 15, 33, 13,
+100, 95,119,139, 43,166, 13,168, 80, 79, 8,151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,135, 91,112,210, 34,
+207, 20,186,217, 4, 98,119,219,111,169,224, 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, 6, 34,194,140,149,
+ 43, 87,226,253,247,223, 7, 0,241,244,233,211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,101,189,198,179, 33,
+ 33, 33, 57, 28,199,137, 72,146,236,178,118,237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,195,194,106,181, 84,
+248,153, 91, 31,165,124,193, 15,123,166,249,244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, 41, 63, 55, 3, 39,
+143, 31,196,134,245, 27, 10, 65,112,183,193,129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,177, 96,243,102,233,
+173,107, 89, 7,166,126, 48, 43,114,248,168, 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,243, 6,254,196,251,
+104, 61, 45,248,158, 60,117,138, 24, 51,102, 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,247,223,127,159,204,
+206,206,134, 70,171, 19, 2,240,197,115, 96,214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,161,209,104,208,163,
+ 71,143, 60, 53, 27, 42,155,248,206, 84,255,204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, 71, 27, 71,141,127,
+191,206,251,179,227, 54,102, 93, 94,191,206,157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, 42,149, 74,198,141,
+ 27,231,214,248,161,197, 98,225, 22, 47, 94,108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,114,185,156,163,168,
+170,253, 62, 73,146,160,223, 90,176,131,166,105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,176, 48,139, 66,161,
+224,164, 82,169,216,157,116, 78,157, 58,149,243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, 64,184, 96,109,105,
+120, 7,169,151,151, 23,180, 90,109,105, 90, 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,189, 56, 90, 44,160,
+203,201,205, 11,244, 15,170, 15,154,166,109, 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,168,233,211,167, 31,
+ 0, 80,101, 99,182,107,215,174,249,211,167, 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,198, 12, 44, 93,186,
+ 20, 34,137, 12,190, 1,117, 75,175, 99,191,110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, 64, 61, 80, 12, 5,
+150,162, 64, 81, 20, 8, 65, 73,214, 78, 30, 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,144,161,115, 38, 76,
+ 48,187, 97, 4, 36,111, 93,203, 58, 48,245,253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, 8, 75,175, 67,177,
+ 44, 72, 82,192,251,104, 61, 37,145, 37,149, 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,144,151,151,135, 3,
+ 7, 14, 36,112, 28, 7, 31, 31, 31, 28, 59,118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,179,239,200,229,242,
+ 93,179,102,205, 26, 53,115,230, 76, 17,203,178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,197,197, 26, 86,225,
+169,202,178,114, 2,133, 72, 44, 1, 41, 16, 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,139,113,117,207, 50,
+ 77,247,113,243,149, 0, 32,150,202, 11,251,244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, 58, 63,159,244,144,
+113,177, 2,133, 92,166,143,138,138,122,104,231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,105,145,145,145,122,
+129, 64,128,196,131, 75, 52, 67,198,197,202,136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, 5,213,191,127,255,
+ 71,118,127,177,212,212,212, 58, 3, 6, 12,144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, 53,113,254,225,231,
+ 46,155,189, 71, 16, 68, 69, 81, 20,112,139, 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,221,168,117,214, 90,
+220, 84,171,162,214, 81, 23, 42, 46, 16, 7, 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, 65, 91,107,127,121,
+ 62,159,124,146,220,189,247,220,123,251,185,239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, 6, 70, 70, 70,138,
+ 9, 19, 38,188,123,254,252,121,109,163, 14,171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, 45, 3, 12,248,111,
+162, 98, 30,173,170, 51,195, 43,148,138,111,167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,127,255,157, 9, 0,
+ 35,141,216,154, 59,119,110,141,101, 78,180, 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,227,143,140,248, 87,
+137,242,177,211, 87, 20, 84, 88, 15,104,208,197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,101,150,220, 25, 59,
+109,105,217,221, 75, 5,160,144,224,171, 0, 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,219,130,206,172,193,
+129,154,197, 22, 77,120,124, 59,119,129,149, 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,122, 0,192,218, 12,
+103,124,191,218,208, 59, 43, 79,180,221,112,158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,230,230, 66,165, 42,
+ 61, 34,114,185, 28, 66,161, 16, 69, 69, 69,144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,150,201,100,211, 63,
+247,237,126,251,246,237,174,115,231,206,225,214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,133, 92, 6,128,166,
+179,179,179, 41, 99, 83, 75,129,173,131,243,187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,225,251, 23, 47, 94,
+212,219,180,105,147, 76, 59, 18,112,248,130,157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,121, 93, 23,103,248,
+ 43,111, 48,251,197,139,103,205, 42,114,250, 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,100,237,233,233,153,
+ 92, 29,111,131, 6, 13,196,124, 62, 95,214,164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, 57, 56, 56,200,154,
+ 54,109, 90,172,175,211,190,145,145, 17,173,177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,127,223,168,145, 96,
+212,168, 81,252,121,243,230,225,224,193,131,184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,135, 18,235, 26, 96,
+192,255, 25,170,207,163, 85, 17,135, 14,133,252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,156, 57, 16,139,197,
+ 86,149, 52,235, 1,117,174,141,202, 68, 86, 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,234, 86,213,250,134,
+ 12, 25,242, 30, 39, 77,144, 12,146, 36,138, 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, 60,221,185, 45, 72,
+ 12,160,103, 69,177,133,191,202,140,148,113,106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, 89, 58,113,117,165,
+226,108,245,138, 41, 38, 36, 73,116,172,224,163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,227, 67,106,139, 44,
+153, 76, 86,150,184, 83,227, 44,158,150,150,134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,206,233,115,221,118,
+213,219,183,111,119, 56, 58, 58, 94, 91,190,124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, 33,211,136,174,125,
+ 71,136,100, 52,147,151, 42,200,108,114,243,226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, 84,228, 44,209,164,
+113,104,210,164,137, 72, 91,168,212,173, 91, 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,174, 47,167,218,255,
+ 75, 84,211,254,212,136,182,138,105, 35,140,141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,135,101,156,234,244,
+ 14,229,116, 90, 72, 72, 72,143,144,144,144, 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,127, 12,215,187,129,
+243,255,149,243,115, 70, 87,252,229,155, 5,148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,185,249, 98,177,216,
+106,212,168, 81,213, 46,147,145,145,113,240,240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,202,170,213, 86, 89,
+153, 27,173,185,117,126,161, 85,215,126, 27,230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, 42,136,173, 95, 1,
+ 12,170, 74,149,246,250,114, 32,142, 30,218,169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,154,114, 87,169,251,
+ 49,207,224,163,245,207,128,205,102,251, 45, 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, 62,125,138,177, 99,
+199,114,163,163,163,253,228,114,249,141,255,194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,177, 71,140,159,227,
+ 92, 22,117,120, 98, 23,164, 18, 49, 0, 48,117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,231,106,166, 63,126,
+252,216, 85,147, 91, 75, 34,145,232, 28,117,248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,236,200,200, 72,103,
+ 13,167, 84, 42,213, 41,234,144,195,225,176,163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, 88,174,214,162,218,
+183,140, 32, 8,130, 54, 12, 27, 26, 96,192,103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,186,184,184,244, 26,
+ 62,124,120, 57,145,229,239,239,175, 58,125,250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,123,111,144, 32, 73,
+242,105,231,182, 77, 65,146,228,211,165, 19, 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, 75, 51, 0, 54,246,
+117, 16, 48,238, 91, 4,140,251,214, 10, 64, 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, 78,207, 37, 18, 9,
+ 8,130,128, 84, 42, 45, 19, 88, 69, 69, 69, 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, 4,241,159,246,163,
+147,203,229,202, 69, 43, 55, 29,102, 48,217, 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,226,123, 53,115,230,
+204, 74,167,127, 42,206, 37, 75,150, 84, 26, 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, 14,117,191,125, 25,
+ 96,128, 1,255, 49, 84, 26,186, 87, 43,161, 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,160,124,247,238,221,
+ 74, 75, 75,203, 41, 34,145,232,143, 65,131, 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,133, 95,255,141,243,
+ 10,138,165,193, 21,231, 85,180, 60,105,196,214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, 85, 37,168,170,138,
+ 86, 20, 22,138, 87,250,245,223, 56, 39,191, 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,202,218,214,171,194,
+194, 66,148,148,148, 64, 93,146, 6, 0, 80, 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,171,173, 85, 0, 48,
+ 63,241,230, 14,237,115,251,153,246,188,106,172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, 10, 68, 87,135, 76,
+ 61,249, 50, 1,128,205, 98,100, 85, 85, 60,154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,178, 13, 48,224,243,
+125,255,255, 84, 43,238, 97,224, 52,112, 26, 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,156,255, 54,206,202,
+ 48,249, 51, 17, 90,116, 37, 31, 0,181,180,104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,128, 15,199,123,197,
+164,181,103, 84,165, 74,245,137, 38,168,141,178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,255,142,179, 38,110,
+237,229, 39, 3,216,247,153,136,173, 79, 18,208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,172, 45, 12, 67,
+135, 6, 24, 96,128, 1, 6, 24, 96,128, 1,255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, 59,131,144,114, 54,
+240,191,182,137,254,254,254, 12,125,218, 39, 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, 43,130,107, 58, 17,
+109, 27,180, 26,109,204, 51,158, 46,147,201,234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,243, 7, 15, 30,240,
+125,124,124,210, 1, 20,105,189, 41, 24, 96,128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,142,129, 48,238, 80,
+185,118, 22, 30,227, 64, 18,205,180,166,136, 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,216, 48, 25, 64, 65,
+197,181, 87, 50,207,112,157, 27,240, 57,163, 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, 12,104,140, 4,129,
+104, 36,134, 14,174, 21,143,219, 55,117, 64, 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,211,163,241,230,228,
+ 19,189,249,234,251, 79, 67,213,229, 44, 86, 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, 52,108, 61,104, 1,
+202,103,112,174, 45, 56, 0,124, 73,146,108,102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,181,228, 36, 1, 76,
+ 48, 53, 49,233,227,106,198,105,245, 46, 71,152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,227,190, 57, 35,124,
+198, 6,205,234, 1, 75,191,141, 11, 74,128,234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,180,142,157, 41, 4,
+ 57, 34,155,159, 14,134,108, 10, 9, 57,218,111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, 48, 24,137,203,150,
+ 45,251,117,197,138, 21, 52, 81,117,165,114,190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, 40,159,101,188, 54,
+248, 44, 56,235,212,169,227, 68, 81,212, 68, 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, 83,222,117,104,154,
+222, 75, 16,196,100,154,166,247,233,241, 61, 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, 28,254,174,237,249,
+ 39,215,245, 15,189,127, 79,186,114,231, 69, 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,249,118,158,170, 42,
+238,129, 4, 77,211, 88,185,114, 37,177,106,213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,111, 42,206,211,186,
+206, 13, 98,203,128,207, 21,250, 21,149,174, 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,221,159,160, 25, 60,
+140,152,180, 80,169, 55,151,235, 88, 46, 24,226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, 22, 0,201,194,222,
+139, 73, 54,193, 65,203,118, 3,240,169, 69, 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, 40,150, 80,232,245,
+245,152, 21, 0,126,210,243,174, 68, 90, 26, 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, 61,123,182,137,167,
+167,167, 37,143,199,227, 72, 36, 18,135,132,132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,183,161,179,211,201,
+224,185, 19,218, 53,111,224, 10,150,172, 24,148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, 71, 45, 74, 38,228,
+228,228, 16, 0, 96,107,107, 75,151, 23, 89,237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,235,122, 45, 70,125,
+243,205, 64,191,181, 63,204, 52, 77,203,149, 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,255, 26, 50,121,231,
+134,133,251, 85, 42,213, 23, 0,218,168, 84,170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,232,163, 12, 6,227,
+106,183,110,221,234, 79,156, 56,145,104,221,186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, 42,213, 51, 0, 47,
+161, 46,123,162, 3, 88, 0, 26, 51, 24, 12,239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,236,216,209,187,127,
+255,254, 68,227,198,141, 17, 31, 31,223,250,210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, 5, 2,129,248, 31,
+127,142, 19,196,100, 0, 78,106,157,188, 82,135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, 67, 16,132,253,223,
+185, 61,122,174, 43,150, 32, 8,107,117, 91, 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,253, 34,165,179,214,
+ 5, 80, 93, 34,104, 35, 0,232,213,169, 89, 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,185, 27, 99, 93,206,
+ 10, 86,241, 45,118,229, 74, 98,197,138, 21, 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, 41,170,108,222,138,
+ 21, 43,182, 87,115,157, 27, 96,192,231, 2, 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,123,255, 89, 19,135,
+ 26,121,122, 52,132, 4,166, 72,202, 81,225, 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,112,126, 19,223,118,
+158,120,158,166,192,227, 52, 21, 74, 18, 21, 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,165, 12, 36, 1, 48,
+ 72,128, 36, 9, 48,200, 90,146, 81,178, 87,171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,187,251,168, 85,171,
+ 86, 89,102,100,100,152, 68, 70, 70,130,203,229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,214, 87,114,185, 60,
+ 9, 64,142,142,156, 30,125,219,120,223,219, 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,138,250, 70, 70,184,
+244, 77, 67,107,255,176,196,211, 15, 51, 69, 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,237, 89, 44,150, 3,
+207,170, 30,149,206,108,147,155, 77, 52,120,155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,176,237,216,253, 95,
+ 90, 33, 99,121,117,121,179,141,141, 77,167,204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,248,154, 97,238,151,
+ 22, 8, 24, 49,204,228,212,111,161, 83, 0,236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, 96,161, 76, 38, 35,
+217,108, 54,193,227,241, 70,173, 93,187, 86, 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, 69, 13,110,220,184,
+209, 32, 36, 36, 68, 25, 17, 17, 17, 11,224,108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,221,155,187,116,233,
+ 66,113,185,127,165,159,170, 13, 39, 0, 88, 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,171,119,165, 93,187,
+118,221,122,245,234,197,236,212,169, 19,156,156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, 30, 30,190,251,202,
+149, 43, 59,158, 60,121,114, 35, 41, 41,169,215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,116,239,222,189,246,
+154,154,140, 10,133, 2, 42,149,170,236, 91,243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,145, 72,235,173, 89,
+243,161, 42,251,230,112, 56,182,154,132,189, 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,209,194,242, 13, 74,
+223,159, 69, 34, 81,178, 64,106, 25, 3,160, 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, 61,100,200,144,138,
+101,175,188,213,223, 34,130, 32,110,146, 36,121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,157,214, 36, 25, 74,
+ 71,133,160,126, 78, 18, 0,108, 42, 76,215,110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,168,150, 93,188,133,
+ 42,252,180,152, 0, 16, 22, 22, 70,247,235,215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, 59,130,228, 89,225,
+ 85, 22, 16,241,142, 6,147, 84,128, 4,141, 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,188, 61, 61, 54, 30,
+ 8,154,205,136,205, 98,226, 80,120, 9,228,146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, 51,128, 88,161, 51,
+231,123, 7, 6, 80, 81,234,119, 64, 10,168, 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,139,226,116, 88,125,
+ 85,156, 94,141, 26, 53, 26,241,195, 15, 63, 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, 36,115, 62,159,159,
+ 55,109,218,180, 70, 78, 78, 78,230,131, 6, 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,150, 17, 7,119,108,
+ 53,201, 61, 21, 12, 89,194, 83, 92, 20,136,112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, 59, 57,153,246, 61,
+147,176, 81, 65, 81, 1,213,113,222,187,119,143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, 75,102,104, 68,174,
+197,194,221, 17, 78, 37, 82, 57, 99, 68,183,122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, 81, 81, 85,115, 42,
+228,242,250,206,246,230,136, 78, 18,227,208,237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,133, 82,174,104, 60,
+100,200,144,195,234,183,246, 71, 0,190, 30, 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,234, 41, 86, 86, 86,
+232,218,181, 43, 60, 60, 60,152, 93,186,116,241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,178,177,177,177, 50,
+ 51, 51,203,173,236, 65,165, 15, 39, 0, 88, 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, 70,140, 24,241,214,
+220,220,188,156,245,215,196,196, 4,141, 26, 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, 72, 72, 8, 8,130,
+ 40,123,104,191,103, 44,118,117,133,163,163, 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,122,224, 90, 37, 22,
+173,149, 21,142, 83,149,195,111,149,181,215,225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,199, 43,179, 66, 85,
+178,174,247, 56, 73,146,196,210,165, 75, 65, 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,133, 32, 8,146,205,
+102, 47,100, 50,153, 19,165, 82,169, 51,143,199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, 33,178, 42,229, 52,
+ 49, 49,113,125,245,234,149,123, 85, 29,145, 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,205,173, 49, 0, 77,
+137,182,219, 52, 77,119,209,250,175,141,219, 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,167,206, 79, 3,231,
+191,143,179, 6, 45, 98, 71, 16, 68,152,113, 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,127,209,162, 69, 75,
+214,175, 95,255,130, 32,136, 48,237,233,218,237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,134, 13,235, 52,109,
+255, 14,145,168,143, 69,203, 60, 91, 98,130,240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, 4, 20, 21, 22,220,
+ 65,226,233, 68,221, 44, 89,254,157, 90,180,240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,137, 71, 55,127,207,
+ 80, 41, 85,191,131,160, 31, 3,100, 36,222, 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,177,245,201,208,188,
+ 73,147, 38,195,150, 45, 91,102, 27, 21, 21,197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, 39, 39, 55,217,190,
+125, 59, 39, 40, 40,200,203,203,203,139,127,242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, 57,188,216,147,187,
+192,137,141,196,210,167, 57,170, 63, 5, 37, 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,102,108, 52,180,228,
+248,197,229, 73,170,181,100, 25, 27, 27,111, 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, 35,156, 46,175,239,
+ 68,116,106,102,131,172, 2, 41,102,239,138,198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, 21, 58,216,152,242,
+ 48,186,179, 41,186,175, 77,135,127, 27, 46,184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,100,181, 21, 8, 4,
+ 0,208, 6, 64, 98, 74, 74, 10,223,199,199, 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,219,104, 47, 47,175,
+ 98, 43, 43, 43,136,197, 98, 72,165, 82,176,217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,235, 64, 21, 23, 23,
+195,204,204, 12, 20, 69,125, 48,167, 74,165, 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,231,230, 54,109,218,
+244,241,176, 97,195, 94,219,219,219, 75,159, 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, 38,147,129,201,100,
+ 66, 44, 22,131,203,229,130,201,100, 66,169, 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,200,100,178, 79,241,
+ 6,250,158,133,170,186,225,183,218, 88,180,180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,150,150,150, 11, 1,
+ 8,106, 90, 23, 65, 16, 96, 48, 24, 96,179,217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, 36, 36,224,248,241,
+227,120,244,232, 17, 88, 44, 86, 89,123,157,199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, 7, 94,189,122,245,
+ 16, 27, 27, 91,119,195,134, 13, 11,175, 93,187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,135, 11,251, 74,165,
+ 82,196,198,198,234,179,204,123,104,216,176, 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, 46,161,212, 47, 81,
+ 27, 34,154,166,191, 36, 8,162, 16,192, 51,146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,255, 4, 65,132,173,
+ 95,191,190, 95,101,226,170,146,107,179,220,244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,167,182,114,253, 37,
+180,194,194,194,170, 87, 32, 20, 6,133,157, 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, 3, 64,255,162, 83,
+ 87,248,253,140, 72, 6,243,151, 61,235,102,146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,128,158,139,196,208,
+194, 15, 62, 18,245, 6,121,217,219,216, 90, 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, 71, 68, 68,216, 74,
+ 36, 18,222,157, 59,119, 74, 66, 66, 66, 50,228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,131,201,100,114,228,
+114,121,117,190, 11,173,230, 79, 28,115,103,227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,179,196, 95, 3,208,
+ 40,250,235, 81, 57,226, 52, 26,180, 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,196,200,145, 35,249,
+ 26,145, 5, 0, 57, 69, 10,102,137, 84,193,232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,118,198,183,235,155,
+ 20,232,180, 71,179,179, 4,123,182, 6,239,221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,220,152,133,181, 59,
+246, 43,162, 30,220,126,202,231,243,195, 0,124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,170, 50,167,238,229,
+ 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,159,127,254,137,248,
+248,120, 80, 20,133, 22, 45, 90,232,117,176,114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, 43,107, 27,209,157,
+240,219,155,106,195, 73, 81, 20, 1, 0,158,158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,179,230,157,171,171,
+235, 81,177, 88, 92,206,114,160,171,208,210,136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, 38,138,138, 74,131,
+ 54, 45, 45, 45, 63,137,208,170,194, 66,245,209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,184, 45, 80, 42,149,
+ 96,179,217,240,241,241, 65,112,112, 48, 30, 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, 36, 94,188,120,161,
+111, 23,169,136,136,136,133, 95,127,253,181,231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,131,131,185,147, 39,
+ 79,110,120,227,198,141,229, 40, 13,126,169, 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, 90, 92,190,124,217,
+190, 76,128, 85,140, 72,124, 31, 5,203,151, 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,208,208, 80, 2, 0,
+252,253,253,105,130, 32, 52, 15,164,103,167, 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,139, 76,214, 92,147,
+ 85, 9, 40,125,132,154,182,197, 75,131,197,139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,182,202, 30,166, 85,
+ 14, 25,150,217,190, 72,190,163,189,141,245,162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,127, 84, 2, 30, 17,
+170, 83,119,184,156,160, 53, 63,204,105, 16,157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, 53,254,227,136,172,
+161,222,142, 14,246,183,142,237, 93, 77, 62,122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,179, 11,184,127,255,
+190, 29,151,203,229,189,122,245,138, 58,117,234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,166,166,166, 16,137,
+ 68,114,185, 92, 46,169, 70,100, 57,251,181,106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, 69,145, 5, 0, 29,
+187,185,215,169, 67,240,204, 64, 3, 72, 42,148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,120,182,102, 44,165,
+ 49,151,165,186, 27,147, 67, 69,222, 56,133,240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, 99,246,252,126, 46,
+236,234,119,203,130,138, 75, 68, 69,112,115, 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,106,135, 83,167, 78,
+109, 64,169, 51, 56, 0,188, 60,117,234,212,152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,179,102,205,132, 30,
+ 30, 30,194,220,220, 92,196,196,196, 32, 63, 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, 23, 72,200,207,207,
+ 51,165,105, 26,249,121,185, 38, 63,252,240,131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, 26,187,164,164,196,
+242,221,187,119,230,218,243,116,229,148,201,100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,235,215,175,203, 68,
+150,122,253,159,204,162,165,249,205,227,241, 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, 46, 90,253, 91, 95,
+113, 88,227,246,232,120,220,193,102,179, 49, 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, 40, 41, 41, 65,207,
+158, 61,193,225,112,244,181,104,209,108, 54,123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,165, 82, 97,238,220,
+185, 70, 92, 46,119,164,190,166,123,129, 64,208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, 69,104,104, 40,225,
+239,239, 79,251,251,251,211, 26,193,101,128, 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, 80, 7,136,212, 2,
+ 26,145,213, 85, 75,120, 17, 26, 11,151,110, 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, 2,169, 41, 73,200,
+ 22, 36,163, 77, 7, 63,196, 62,143, 6,165, 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,181,131, 23,130,194,
+138,241, 42,242, 50, 10,178, 5, 59,145,116,234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,229,165, 24, 18, 41,
+ 41, 73, 56,251,235, 86, 90, 33,151, 22,160,124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, 60,178,132,167,231,
+ 32, 69, 6,128,240,173, 91,183,118,111,223,190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,185,187,187,247, 13,
+ 14, 14,118, 72, 73, 73,193,181,107,215, 50, 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, 53,104,130,237, 75,
+190, 83,134, 62,138, 25, 0,224,146, 86, 27,143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,222, 10,165,127, 86,
+ 69,152,147,147, 67,148,148,148,184, 90, 90, 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, 73, 34, 87,129,203,
+ 34,233,217, 3, 93,211, 31,158, 13,181,201,145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, 14, 11,187, 48, 93,
+ 46,149,120, 53,105,210,152,126, 28,113,227,233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,229, 4,186,182,133,
+ 72, 95, 75,145, 62,208,149,179,162,208,210, 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,193,248,119,108,191,
+ 62, 22, 42,237, 33, 67,141, 63,157, 68, 34,177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, 79,255, 72,146, 4,
+ 69, 81, 96,179,217,104,209,162, 5,194,194,194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, 54, 54,101, 66,139,
+ 36,117,142,210,161,165, 82,105,221,186,117,235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,136, 68,162, 58,248,
+148,182,123, 3, 12,248,123,239, 43, 97,218, 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, 84,102,225,250, 64,
+193, 85,206,186,197,212, 86,144,149, 42, 73,181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, 81,164,144,203,242,
+ 41, 74,225,250, 54, 62, 26, 32,241,139, 78, 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, 31, 95, 78,130,152,
+179,248,163,137, 44, 7,219, 27,135,119,173,180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, 32, 49,244,241,135,
+ 80,143,100,179, 7,178, 93,222,245,155,232,155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,200, 48,109,100,103,
+103,159,221,186,117, 43,241,227,143, 63,118,149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,159,117, 74, 74, 10,
+235,206,157, 59,162, 27, 55,110,208, 0,206,215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, 13, 0,240,135,214,
+108,207,126,173,155,221, 61,184,126,185,153,226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, 80, 64, 40, 20, 66,
+ 81,156,171,108,195, 23, 9, 3,135,216, 75, 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, 54, 54,214,107, 95,
+238, 90, 63, 63, 4, 64,200,144, 33, 67, 14, 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,195,170,176, 10,192,
+220,142, 29, 59, 18, 62, 62, 62, 15,182,109,219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,138,253, 75,212,150,
+ 83,219,162, 85,147,208,250,148, 22,173,202, 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,211,248,201,177,217,
+108, 68, 71, 71,195,197,197, 5,114,185, 28,102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,160,231, 54, 83, 60,
+ 30,239, 93, 76, 76, 76, 99, 59, 59, 59,168, 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,231,243, 47,171,163,
+ 14,203,193,209,209,209,226, 99,236, 87,109, 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, 43, 88,162,100, 90,
+255,179, 81,154,195,173,159,250, 55, 42,249, 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,104, 82, 60,148,139,
+112, 97,214,100,201,178,183,182,186,113, 96,123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, 23,160,104, 65,196,
+181,211,161, 32, 80,130,183,161,183,116,187, 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, 33,100,133,148,124,
+240,209,113, 27,212,194,222,218,246,198,161,224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,210, 29,137,167, 35,
+107, 75, 59, 1,176, 98,152,240,118, 15,246,107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,101, 84,201,239,225,
+ 60,225, 73,170,152,154,158,118, 95, 55, 7,186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,116,247,238,221,118,
+169,169,169,188,168,168, 40,241,222,189,123,179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,190,156,230,243,199,
+ 7, 68, 4,140,155,200, 75,188, 22, 2,171,196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,182,182,116, 78, 78,
+ 78,114, 65, 65, 65, 99, 19, 19, 19,228,230,230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, 40,243,192, 98,177,
+144,149,162,128, 74,165,202,208,213,154, 5,192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, 78,115, 62, 52, 30,
+ 50,100,200, 97,173,168, 67,109,103,120, 77,122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,202,196, 10,151,203,
+213,219, 81,186,170, 40,198,218,112, 86,101,209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, 12, 6, 40,138,130,
+ 14, 65, 21,127,171,104,209,142, 14,172,141,200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, 11, 54,155,141,115,
+231,206, 97,220,184,113, 80,169, 84, 48, 54, 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,163, 95, 21, 10,197,
+145,245,235,215, 47,217,179,103,143, 17, 77,211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,180, 52, 25,223, 41,
+ 58,198,196, 68, 89,109,212, 97,101,203, 84,225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,218,149, 75,253, 96,
+ 72,239, 96,128, 14,247,147, 71,255,226,238,105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,198,254,237,129,230,
+ 71, 31, 17, 72,124,251, 22, 55,127,219, 81, 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, 58,191, 61, 17, 68,
+ 43, 39,123, 75,228,137, 40, 20,230,188, 3,104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, 72, 36, 38, 38,226,
+234,201, 29, 66,165, 82,242,197,135,136,172,145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, 54,239,226,112,126,
+236, 80,172, 62,254, 13,204,236, 24,104,215,215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,218, 34,171, 85,253,
+250,245,135,222,191,127,223,214,219,219,155, 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, 78,109,145,213,106,
+209,228,177, 17, 27,247, 31,230,145,108, 14,130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, 82, 72,165,210,107,
+193,193,193, 82,146, 36,145,151,151,135,156,156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,235,178,194,194,194,
+251,186,118,240,222,189,123,245,211,210,210, 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, 4,130,174, 0, 30,
+105,166,167,166,166,214,123,240,224, 1,191, 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, 7, 40,149, 74,156,
+ 56,113, 2, 0,242,170,227, 96,179, 57, 2,146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,167, 26,169, 95,126,
+249,165, 36, 50, 50,178, 82,139, 86,109, 56,105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, 26, 65, 69,146, 36,
+184, 92, 46, 50, 50, 50, 48,101,202, 20,208, 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,208,123,126, 90,186,
+250, 64,105,134, 6,105,154,134, 70,112, 85,152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,180, 59,244,222, 10,
+223,251,244,120, 40,148, 9,173,216,216, 88, 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, 7, 17, 19, 19, 3,
+ 14,135, 3,205,190,208, 85,191,249,248,248,108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,209,209,209,232,221,
+187,183,228,238,221,187, 9, 98,177,120, 21,116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,244, 83,213, 50, 21,
+145,144,144,224,170, 82,169, 26,211, 52,237, 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, 52,237,171, 82,169,
+ 26, 37, 36, 36,184, 26,228,132, 1,159, 41,110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,172, 52, 63,242,144,
+ 68, 74,114, 2, 30, 95,220, 45, 84, 81,138, 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,206, 92,152,147, 2,
+208,140,218, 8,173,114,156,160,200,224,131, 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,210,238,120, 27, 26,
+ 85, 27,206,145,108,246, 50, 22,131, 88,218,171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,102,231, 37,228, 75,
+ 39,222, 37,228, 72,126, 35, 61,208,119,146,181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,201,105, 57,189, 94,
+112,183,172, 44, 69,249,126,190, 15, 71, 51, 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,238,221,155, 43, 22,
+139, 47, 2,136,208,105,219,223,135,115, 91,119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,171,206, 68, 60, 31,
+140,170, 19, 96,150,227,228,114,185,199,142, 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,139,139,203,156,171,
+237,236,236, 16, 27, 27, 75, 37, 38, 38,166,115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,209,226, 81, 33,186,
+ 80,171,105, 99,129, 64,208,150,207,231,223, 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,163,232,232,232,226,
+ 62,125,250,192,200,200, 8, 34,145, 8,117,235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, 86, 37,226,181, 92,
+ 63, 37, 18,113, 93, 0,164,184,164,164,197,152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,173,245,226, 4,128,
+188,188,188,166,127,252,241,199,156,232,232,232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,169,200,218,114,230,
+231,231, 91, 68, 69, 69,109,234,220,185,243,140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, 25, 25,161,176,176,
+ 16,171, 86,173,194,157, 59,119,148, 52, 77,239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,165,100,168,162,253,
+223,222,207, 10, 62, 93, 80,167,112, 88, 88, 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,238,221,251, 94, 30,
+ 45, 77,250,135, 42,184, 43,219,118,250,230,205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, 68, 34,103, 19, 19,
+147,116,133, 66,241,139, 88, 44, 94,139, 82,127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,101,181,156, 21,210,
+ 59,148, 75,225, 80, 97,153,114,169, 31, 42, 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, 44,125, 15,173, 38,
+179, 88, 98,133,119,120, 2,241, 33, 34,235,125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,151, 72, 58,145,245,
+ 65,155,165,238,231,237, 4, 2, 73,137,111,240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,161,108,194,194, 26,
+ 79,231,140, 67,122,129, 8,151,222,230,159,164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,118,251, 14,178, 24,
+106, 91,135,133, 45,243,127, 1,111,145, 13,187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,225,235,235,203, 29,
+ 50,100, 72,101, 14,242,250, 34,245,209,171, 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,226,121,197, 40,196,
+106,225,225,225,161,186,119,239,222,188, 41, 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,151,203,197,155, 55,
+111, 16, 30, 30, 46,123,251,246,109,122, 73, 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,235, 32,212,195,133,
+109,160,142, 46,212, 52, 82, 39, 45,109, 3,192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,154,166, 51, 66, 66,
+ 66, 58,156, 61,123,182,195,220,185,115,217,125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, 11, 87, 93, 75,229,
+ 80, 0,162,148, 74,229,243,160,160,160, 14, 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,128, 77,153,153,153,
+ 63,133,132,132, 44,191,118,237,218,248, 49, 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, 80, 40,156, 99,107,
+107,187,244,226,197,139,191, 92,185,114,229,235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, 74,165, 82,157,101,
+177, 88, 99,114,114,114, 68,159,226,174,163, 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, 74,160,217, 14, 63,
+ 63,191, 50, 43,163,198, 10,167,221,134, 32, 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, 89,225, 25,248, 43,
+115,188,174,140,205, 4, 82,203, 24, 72, 17, 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,197,138, 21, 91, 43,
+166,112,208,110, 84, 49,245,195,202,149, 43, 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, 75,182,175, 91,176,
+ 66,169,144, 9,105,200,253,241,230,116,244,135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,252,224,222,255, 77,
+253, 36, 44,172, 81,180,106, 26,126,123,145, 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, 55, 36,249, 39,172,
+156, 88,103,230,124, 97, 67, 92,200, 27,173,247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,146,146,138, 14,242,
+181,197,130,254, 51, 23, 49,218, 53,114,157,249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,197, 5, 92,185,114,
+101,196,237,219,183,123,136, 68, 34, 87,130, 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, 0,192,138, 21, 43,
+232,149, 43, 87, 18,113,113,113, 52,131,193,248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, 48, 80,151, 7,226,
+237,226,226,226,200, 85,171, 86,117, 89,181,106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,108, 78, 58, 65, 16,
+206,108, 14, 87,116,239,222,189,107, 31,200, 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,147,182, 49, 49, 49,
+127,126, 8,167, 90, 68, 13,182,182,182,118, 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, 34, 20, 10, 63,105,
+ 81,105,117,129,232,149,122,212, 58,212,137,247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, 69,225, 85,209,122,
+165,249,175, 78,229,162,203, 62,213, 39,138,178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, 6, 32,174,233, 58,
+ 39, 73,242, 44,128,151, 36, 73,190,174, 24,232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, 59, 91, 32, 9, 4,
+214,214,147,246, 31, 52, 87,126,156,126, 6,176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, 65,199,142, 88, 75,
+ 19,152,171,222,153,235, 50,238, 98, 77, 45,182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,127,127,127, 70, 21,
+ 15,243,114, 69,165,171, 66,104,104, 89, 22,255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,242, 78,255,149, 77,
+167,245,220,118, 6, 0,213, 71,222,159,159, 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, 87,114, 90, 54,117,
+ 1,129, 73,208,206, 29, 84,173, 69, 75, 75,160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,193,181, 97,195,134,
+201, 0, 10, 42,244,163,178,121,180,225, 24,253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,192,105,224, 52,112,
+ 26, 56, 13,156, 6, 78, 3,103,109,133,214,103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, 32,170, 81,165,250,
+152, 4,107,163,108,175, 25, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,207,117,232,240, 31,
+235,183,193,172,106,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, 0, 3, 12, 48,192,
+128,207, 6, 61,220,193,103,170, 64,254,241, 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, 15,224, 43,173,255,
+ 23,160,142,140, 55, 8,173,207, 23,141, 0, 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, 80,132,210, 58,129,
+175,245, 89, 25, 73,146,235,187,116,233, 50,253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, 36, 8,162, 53, 0,
+ 22, 65, 16,111, 50, 51, 51,215, 43,149,202, 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, 36,100,102,102,174,
+ 81, 42,149, 55, 63,128,211,204,193,193,161, 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, 91,201, 63, 48,150,
+ 93, 40, 82,178, 0,192,220,132,169, 8, 13,108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,229,208,219, 13,107,
+105, 37,190, 87, 1, 68,175,250,216,113, 57, 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, 75, 57,122,185, 97,
+211,229, 55,168, 54,210, 94, 23, 78, 13,246, 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, 21,150, 13, 29, 86,
+ 43,180,134,185,131,175, 98,130, 25, 26, 11, 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,206,125, 46,156,255,
+ 54, 44,167,105, 58,160,220,201, 90, 73, 30,162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,145,145,145, 18,192,
+ 88, 61,214,101, 63,108,216,176, 69, 7, 14, 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, 86, 86,254,150,150,
+150,193,251,247,239,183,107,223,190, 3,193,225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,101,101, 77,212,119,
+227,173,173,173, 71, 90, 90, 90,110,217,187,119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,211,226,221,187,119,
+199, 51, 51, 51,103,232,203,105, 99, 99,227,110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,116,116,180,233,212,
+169, 83, 29,211,210,210, 98, 51, 51, 51,111,233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,208,126, 75,196,249,
+103, 55,206,247,175,105,154,127, 96,236,239, 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,188,140, 4,128, 94,
+227, 87,207, 26,233,132,205, 71,210,171,174, 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, 0,114, 14,147, 57,
+171,157,143,143,237,183,119,239, 38,200,129, 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,106, 49, 33,250, 52,
+196,241,171,137,140,240, 47,190,248,162,225,132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, 93,184,112, 33, 65,
+165, 82, 69, 2,120, 1,221,179, 90,179, 0,120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, 37, 58,125, 47,225,
+233,245,235,215,207, 49,153, 76,141, 69,171,157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, 65,146, 36, 11, 64,
+125,188, 95, 82,163, 42, 56, 27, 27, 27,239,142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, 3,135, 66,172,231,
+205,158, 49,248,230,205,155,225, 69, 69, 69,191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, 12,138,162, 80, 84,
+ 84, 4, 71, 71, 71,236,223,191,223,114,222,188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,139,110,207,159, 63,
+ 55,210, 20,148,150,201,100,112,118,118,198,209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,234, 74, 88, 40, 82,
+178,148,114,105,208,225, 93,129, 46, 0, 48,102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, 66,203,128,127, 26,
+173,109,109,109, 67,115,114,114,110, 1,152,136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, 6, 35, 67, 36, 18,
+ 61, 5,240,170,182,132, 54,110,126,253,193, 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,234,230,249, 15,226,
+228, 24,141, 7,232, 22, 36, 64, 17, 36,249,148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,205, 81,247,194,152,
+ 31,131,111,120, 3,240, 73, 10,228,209, 36,221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,216,177,141,110,221,
+185, 67,116,213,167, 90,193,231,137, 42, 29,223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, 6, 49, 98,246,250,
+128,131,187, 54,145, 61,251, 15, 41, 27, 62,241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,116,244,232, 81,101,
+ 68, 68,196, 83, 0, 39,170, 90, 89,111, 55,136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, 46, 23, 31,194, 9,
+ 0, 61, 27,146,111, 89,214, 13,158,142,152,185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,109,229,226,226,210,
+ 73,169, 84,242, 0,128,201,100, 74, 82, 82, 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, 21, 3, 6, 12, 88,
+250,237,183,223,162,110,221,186,152, 53,107, 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,123,251,229,187,119,
+239,182,102,114, 76,208,106, 97, 34, 4, 5, 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,188, 70, 31,161,101,
+111,111,191,106,255,254,253,214,198,198,198,160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,243,216,216,216,141,
+250, 8, 45, 7, 7,135, 78, 59,119,238, 52,226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, 37,180, 76, 38,147,
+207,156, 57,147,251,226,197, 11, 63,129, 64,240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, 54,175, 95,191,126,
+162, 84, 42, 79, 3, 56,253, 17, 94,166,186, 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, 56,156,190,119,239,
+158,203,238,221,187,199,110,222,188,249, 34,128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, 49, 28, 7, 7, 7,
+ 72,165, 82, 36, 38, 38,154,159, 60,121,210, 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,154, 31,239,208,177,
+ 83,231,161,131,191, 49,115,176,177,128, 88,166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, 11,135,231,190,186,
+ 87,172, 47,103,183,110,221, 59,247,232,222,221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,203,100, 26,221,166,
+ 8,197,168,172,231, 87, 75, 62,229,177,153, 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, 77,131,164,177,163,
+162, 53,107, 22,192,220, 81, 90,246, 75, 47, 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, 65,130,232, 93,195,
+ 48,165, 6,189, 0,174,165,181,181,207,212,201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,125,155, 68,189,179,
+ 41,181, 23,219,255, 82,107, 86,165, 67,135, 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,245,235,215, 51, 1,
+180,174, 48,187,124,145, 85,128, 27,182,103, 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, 64, 83,245, 59,214,
+165,191,124,244,235,146,177,215,142,110,241, 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, 82,221, 56, 63, 28,
+255, 40,167,163,163, 99, 19, 95, 95,223,214,215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,217,161, 67,135,214,
+142,142,142, 77,202,118, 21, 77,235,211,207,213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,232,214,173, 27, 46,
+ 94,188,200,220,188,121,243, 58, 0, 75,107,234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,223, 4,209,155, 60,
+ 80, 36,161,145, 39, 44,132, 88, 44,129,177,177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,196, 85, 81, 81,233,
+167,184, 88, 4,153, 76, 14, 46,151,107, 6,128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, 55,188,130,130, 2,
+ 66, 40, 20, 66, 38,147,129,197, 98,177, 81,179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, 50,102, 70, 96, 10,
+147,205, 93, 32, 51, 43, 84,233, 50,205,220,132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,121, 24,128,227, 7,
+114,182, 5,176,206,200,200,232,154,135,135, 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,245,117,235,214,157,
+122,242,228,201,208, 63,255,252,179,254,179,103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,175,205,250,245,235,
+ 31,124,240,224, 65,219,142, 29, 59, 30, 0,192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, 86,173, 90,185,240,
+120, 60,244,232,209, 3, 0,252, 62,132,147,205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,175, 95,199,195,135,
+ 15,161, 84, 42, 49,109,218, 52,238,152, 49, 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, 51,127,214, 36,179,
+167,239,228, 56,116,237, 29,126,143, 16, 32,171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, 95,206, 69, 11, 23,
+246,153, 60, 62,192, 44, 70, 64,225,220,253, 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, 21, 19,172, 95, 62,
+245, 49,218, 15,180,159, 61,123,182,221,130, 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,105,109, 98,242, 77,
+124,215,174,147,140, 74,235,197, 86,203, 89,142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, 97, 69,198,149,159,
+151,145, 52,129, 89, 35,157,202,221, 7, 42,237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,164, 34, 81, 57,159,
+217,238, 46,232,115,205,152,153,218,192,195, 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,140,238,215,175, 31,
+ 1, 0,161,177,200, 31,220, 20, 27,135,125,187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,108, 80, 82, 82, 2,
+169, 84, 10, 54,155, 13,137, 68,130,119,239,222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, 53,133,169,169,233,
+ 71,225, 92, 60,182, 7,247, 77, 74, 54,247,242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,122,110,110,231, 36,
+121,246,236, 25,238,221,187,135,252,252,124,248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, 54,116,190,124,237,
+182, 85,177,132, 50, 79,202, 84,176, 40,138,130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, 22,128,135,106,113,
+ 91, 83, 77, 69, 30,128, 38,254,254,254,139,166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,142, 29, 59,218,236,
+223,191,223,104,222,188,121,184,117,235,214,138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,205,134, 82, 45, 27,
+228, 42,170, 76,223, 23, 22, 22,130, 22,231,131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, 76,100,189,203, 44,
+196,187,172, 18, 20, 22,203, 32, 22, 43, 33, 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, 0, 32, 0, 73, 68,
+ 65, 84,186, 90, 71,120, 60, 30,148, 74, 37,138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, 83, 0,230, 0,242,
+116, 33, 84, 59,185,255,174, 30, 6,196,163, 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,195,198,185,197,157,
+150, 67,127,241, 40,155,246,105,253,179,184,118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, 24, 50,100,136,143,
+ 64, 32,104, 9,253,107, 50, 26,147, 36,185,113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,169, 84, 58, 39, 36,
+ 36,116, 59,121,242,228,194,131, 7, 15,238, 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, 23, 31, 31, 31, 28,
+ 62,124, 24, 15, 31, 62,164,218,182,109, 75,142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,173,165,101,203,181,
+ 67,135, 14, 46, 12, 6, 3, 29, 59,118,100,223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,249,249,181,188,118,
+237, 90, 84, 70, 70,134,159, 30,219, 11, 0, 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,125, 15, 32, 84,199,
+ 69,218,183,110,221, 26,201,201,201,104,210,164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,213,163,191,238,221,
+187,119,119,241,243,243, 35, 66, 67, 67,203,252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,200,200, 58,143, 30,
+ 61,114,135, 14,195,136, 54,110,126,253, 59,118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, 18, 76,130, 2,165,
+224,130,203,102,192,221,179, 13, 35,254,197, 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,183,105, 19,119,114,
+251,239,111, 80,144, 22,171, 74,139,187,157, 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,244,196, 23,221, 36,
+146, 46, 61,242, 19,110, 95,251, 20, 23,228, 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,208,243,207, 75, 20,
+184, 15, 0,183, 0,162, 47,208,220,187, 93,187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, 69, 69,161,138,161,
+223,149, 0,195,214,209,177,199,212,169, 83, 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,238,236,209, 15,162,
+120,189,134, 41,251, 3, 28, 7, 71,199,166, 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,235, 28, 3, 59,155,
+185, 57,142, 91, 48,113, 0,225,194,183,197,212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,177,200,154, 92,169,
+208,170,136,223, 98,177,220,140,141,250, 39, 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,195,194,194, 2, 49,
+ 49, 49,184,126,253, 58, 94,190,124, 9,138,162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,202,234,163,113,186,
+185,216,225, 91, 23, 59,118,102,110, 33,251,218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, 38,147,225, 63,130,
+178,232, 66, 23, 23,151, 78,135, 14, 29, 98, 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, 20, 25,212,248,187,
+213,171, 87,139,198,143, 31,239,145,146,146,178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,108, 0,192,152, 49,
+ 99, 10,239,223,191,239, 14, 32,235,250,245,235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, 74,101, 12,147,201,
+164,195,194,194, 86, 1, 8,124,239,137, 72,146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, 75,111,112,198, 20,
+ 82,147,222, 32,238,217, 67, 56, 58, 58, 90,240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,134, 62, 70, 71, 70,
+ 70,242, 93, 93, 93, 81, 92, 92,140,212,236, 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, 51, 34,101, 15,179,
+178,178,228, 50,153,108,153, 80, 40, 60, 84, 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,232,188,188, 60, 66,
+ 36, 18,161,168,168,136,184,112,225,194,215, 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,150,150, 54, 73,151,
+161, 73,181, 96, 82, 49,153,204,205,147, 39, 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,122,122, 94,110,222,
+188,153, 83,200, 38,239, 29, 0,126,252, 23,156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,149, 43,177,124,249,
+242, 70, 83,167, 78,157, 12, 96,171, 30, 60, 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, 17,199,142, 29,195,
+219,183,111,149,245,235,215,103,250,248,248, 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,111,165,163,248, 24,
+191, 98,197,138,129,157, 59,119,198,216,177, 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, 86,232,145, 35, 71,
+140,214,173, 91,215, 99,222,188,121, 83, 1, 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, 20,212,251, 3,133,
+ 22,199,198,198,230,194,225,195,135, 91, 54,110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, 1,232,116, 67,170,
+ 83,167,206,198,179,103,207, 54,172,106,100,161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,235,232,209,163,248,
+254,251,239,209,162, 69,139,230,237,219,183,223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,114,141,224,241,120,
+205,135, 15, 31,206,121,240,224, 1, 0,192,211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, 10, 7, 7, 7, 12,
+ 26, 52,136,151,148,148,212, 60, 39, 39,167, 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, 18,109, 26,154,195,
+199,195, 30,241,169,133,136,140, 77,133, 74,198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,179,191, 22,215,120,
+220,160,129, 95,153,158,139, 72, 71, 65,122, 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, 71, 27,163,158,238,
+173,219, 48,252,122, 14,176, 58,125, 44, 99, 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, 1,190, 52,203,202,
+249,161,153, 66,177, 83, 51,175, 55,208,107,225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,105, 84, 84,252,100,
+128,154, 82, 5,223, 78,192,117,232,192,129, 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,159, 51,127,126,167,
+ 25, 51,102, 24,237, 89, 53,253,113,239, 9,107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, 64,152,153,155, 99,
+246,236,217, 32,228,242,203,101, 2,138,137, 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,201,217,207,110, 8,
+240,230,115, 85, 85, 21, 80,165,143, 86,181, 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, 70, 69,185,185,185,
+120,254,252, 57,242,243,243, 17, 28, 28,140,184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,216,152, 99, 84,223,
+118, 76,169, 68,196,203,206,206, 46, 55,124,244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,137,194, 52,227,104,
+ 23, 34,227,104, 23, 66, 88,162, 48,149,201,100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,255,204,153, 51,172,
+181,107,215,194,203,203, 11,114,185, 28,247,239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,191,126, 61, 78,159,
+ 62, 77,244,232,209, 99, 97,101,231,147, 64, 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,108,252, 60,240, 45,
+ 70,216,156, 66, 94,230, 59,236,219,183, 15, 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,181,163, 78,157, 58,
+ 97,213,117, 50, 61, 61,125,237,140, 25, 51, 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, 83, 60,219,210, 20,
+ 18,202, 8,187,118,238, 38,159, 61,123,102,251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, 75, 75,123,240,237,
+183,223, 74, 10, 11, 11, 33,147,201,228, 42,149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,197,139,172,171, 87,
+175, 49,111,222,188,197,190,126,253,186, 69,183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, 9, 9, 25,183,107,
+215, 46, 7, 31, 31,159,102, 21,134,162,248, 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,148, 79, 10, 91, 91,
+219,153, 3, 7, 14,196,174, 93,187,112,254,252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,251,176, 23, 0,252,
+184,117,235, 86, 15, 15, 15, 15,140, 25, 51, 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, 47,191,212,155, 58,
+117,234,236,128,128, 0, 73,131, 6, 13, 16, 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,129, 77,155, 54,225,
+230,205,155,131, 81,250, 64,149, 1,184,116,247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, 54,150,167,166, 77,
+155, 46,235,211,167, 15,194,195,195,209,170, 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,196,161, 67,135,124,
+235,213,171,135, 53,107,214,192,205,205, 13, 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,141,141,141,177,112,
+225, 66,122,240,224,193,121, 53,125,230,205,155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,122,121,121,225,254,
+253,251,184,122,245, 42,150, 46, 93,138,185,115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,219,217,217,161,176,
+176,180, 46,188,151,151, 23,158, 60,121,130,236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, 49, 40,138,178,215,
+141,146,246,178,181,182, 64, 86,190, 20, 76, 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,200,202, 70, 29, 27,
+ 30, 92, 92,234,130,166, 41, 47,157, 20, 48,131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, 74, 65,226,221,148,
+130,196,187, 41,114,169,100,202,227, 59, 87,115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,186,112, 49, 49, 98,
+142,185,250,243, 50, 34,108,255, 98, 66,154,251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,251,238, 59, 94,102,
+102, 38, 21, 48,108, 88,222,218,192,192,107,127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, 34,202, 0, 82, 1,
+192, 1,112, 25,240,205, 55, 93,150, 44, 90,100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,190, 46,254, 89, 42,
+192, 91,195,123,249,242,101, 90, 12, 60, 6, 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,236,181, 63, 99,207,
+201, 91,151, 45, 20,244, 23,255,161, 71,241,228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, 1,243,119,112, 86,
+134,255,162,208,210, 64,161, 40, 29, 37,145, 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, 31,158, 53,107, 22,
+182,108,217,130, 87,175, 94,129,205,102,195,203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,143,143,199,230,205,
+155, 49,126,252,120,250,222,189,123, 7, 81,121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, 10,113, 62,178,210,
+222, 64, 42, 42,192,154,245, 27, 81,162, 96, 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,109,218,135,193, 96,
+244,171,166,159,247, 51, 51, 51,247, 79,155, 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,216,216, 24,219,182,
+109,179,112,119,119, 31,200,100, 50,187, 85,195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, 16,231,206,157,235,
+ 95,175, 94, 61,171, 13, 63,110, 33, 68,114, 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, 27, 55, 14, 96, 50,
+153, 29,106, 18, 89, 71,142, 28, 25, 61,108,216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,248,109,219,182,157,
+ 60,113,226, 68,209,252,249,243,173,131,130,130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,167,158, 1,216,122,
+230,204,153, 71, 82,169, 20,195,135, 15,175,175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, 57,242,107,215,174,
+181, 6,176, 5,165, 67,185, 52,128,100, 0, 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,177,227, 1,248,214,
+192,219,113,196,136, 17, 30, 20, 69,225,248,241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,145, 35, 71, 54, 0,
+160,207,141,156,205,229,114, 79,173, 94,189,218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,200,194,194,226,162,
+214, 53,160, 51,184, 92,238,190,159,126,250,105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,167,203, 90,183,110,
+141, 93,187,118, 13,228,112, 56,122,149,232, 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,190,177,169,169,105,
+132,167,167,103,161,151,151, 87, 27,165, 82,137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, 4, 5, 5,161, 95,
+191,126, 96, 48, 24, 58, 11, 45, 6,131, 1,185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,108, 54, 27, 0, 96,
+ 98, 98, 2, 35, 35, 35,144, 36,169, 83, 52, 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, 87, 80,224,177, 25,
+ 96, 49, 9,128,166, 96,105,194, 2,143,195, 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, 84,170,140,202, 30,
+142, 76,149,145,145, 17,135,176, 53,231,130,199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,110,218,188,153, 83,
+ 88, 92,140,193,131, 7,231, 37, 61,122, 20, 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, 84, 20,138,242,243,
+ 95, 3,165,206,241, 28, 39,167, 97,219,182,109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, 17,118, 60,185, 84,
+136,213,120,220,217,108, 71, 13,175, 48, 63, 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,176, 96, 99, 8, 21,
+ 21, 39,248, 54, 60, 21, 95,157, 73,135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116,
+ 1,244,161,156,149,137,196, 15,229,252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245,198,223,177, 0,
+ 0,107, 83,166, 80,174, 82, 80,233,233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161,
+ 67, 68, 72, 72,136,213,136, 17, 35, 18, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209,
+ 27,165, 41, 51,170,204,227,146,153,153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,
+200,105,180, 93,146, 92, 22,137,104,110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5,
+ 5, 5,225,175, 94,189,218, 98,225,220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,
+236,108, 76,159, 62,221, 42, 33, 33, 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38,
+ 38, 38,109, 35, 34, 34, 8,137,140, 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,
+122,163, 64, 32,232, 92,233,205,140, 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17, 35, 71,142,124,
+ 14,192,107,254,252,249,214, 52, 77,207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,
+242,243,243,183, 1, 64, 97, 97,225,214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47,
+135, 15, 31,142, 75,151, 46,225,207, 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,136, 17, 35,240,243,
+207, 63,247, 1, 80,157,131,108,207,222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,
+187,119,111,172, 95,191,190, 39,128,235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,
+247,153, 63,127,254,249, 99,199,142,153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222,
+ 60,193,207,207, 15,243,230,205, 83, 94,190,124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,
+166, 9,179,103,207,206,166, 40,234, 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255,
+ 53, 34, 34,226,118,163, 70,141, 86,203,100,178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,
+159, 94,102, 98, 98,162,165,133,133, 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,
+205, 70,102,102, 38,180,172,229, 53,136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,
+200,200, 16,160,101, 19,103, 16, 4,129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251,
+ 94, 54, 17,127,100,135,152, 55,232, 52,153,201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, 76, 48, 73,242,225,
+167, 56, 64,167,222, 33,165,171, 27,239, 73,175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,
+218,216,218, 34, 32, 32,128,202, 77, 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226,
+ 32,224, 17,180, 96,129,141,189,163, 35,198, 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230,
+ 21, 48, 48,107,254, 0, 95,174,137, 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114,
+ 62, 43,117,170, 54,174, 86,172,240,120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56,
+ 37, 37, 37,110,194,132, 9,114,165, 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,
+209,142, 29, 59, 20, 41, 41, 41,113,218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,
+123,145, 72,212,234,249,243,231,214, 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,
+200,104,156,156,156,220,208,210,210, 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,
+226,252, 98, 70, 70,134, 59,101,213,164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,
+236,236,108,100,103,103,131, 32, 8, 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160,
+ 1,100, 20, 40, 16,189,201, 3,209,155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,
+244, 29, 54,108,152, 25, 0,168, 5, 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,
+231, 19, 3,192,140, 73,147, 38,181,225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60,
+ 1,204, 67, 21,153,160,203, 76, 67,108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,
+224,241,120,109,107,104, 91,223,197,197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,
+176, 87,175, 94,207,110,220,184,209,182, 99,199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, 73,183,145, 35, 71,
+138,220,221,221,113,235,214, 45,143,145, 35, 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,191,198,170, 85,171,
+232,147, 39, 79, 6, 0,184,162,158,119,249,248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, 12, 96, 90,117,100,
+ 34,145, 72,168, 82,169, 32, 18,137,116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159,
+ 63, 79, 3, 8, 3, 16, 46,147,201,186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,
+122,244,168,212,194,194, 2,174,174,174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7,
+ 14, 28,144, 20, 21, 21,233,148,147, 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,
+103,164,163,117,211,186,232,218,186, 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,
+173,204,216,104,220,196, 19, 35, 39,204,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,
+184, 20,118, 38, 95, 88, 88,120,232, 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,
+128,130,193,240,232,251,229,151, 72, 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,
+238,148, 64,147,175,190,250, 10,217, 57, 57, 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, 6, 65,161, 80, 8,
+ 2, 40, 4, 0,130,137,190,237,188, 26, 33, 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,124,237,124,180, 0,
+228,204,155, 55, 15, 92, 46, 23,124, 62,191, 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,199, 1, 32,167,218,
+ 55, 60, 64, 58, 96,218,122, 74,170,160, 75, 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,229, 65, 49,181,225,
+252, 12,208, 78,157, 19,171, 29,128,252,164,164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,185, 41,130,148,183,
+207, 51,150, 44,156, 39, 76, 77, 77, 77, 65,105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, 52,105,210, 36, 58,
+ 58, 58, 26, 0, 16, 25, 25,137,177, 99,199,210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, 33,114, 21, 85, 54,
+228, 87, 88, 88,136,244,244,116,200,100, 50,157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,213, 4, 30, 46,198,
+ 32,148,197,101, 34, 43, 59, 59, 91,243,230, 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,145,145,145, 1,149,
+ 74, 85,213,131,140, 74, 75, 75,187,124,226,196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, 42,249,236, 97, 50,
+153,119, 53,109, 55,109,218,148,135,247,135,196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,198,158, 61,123, 32,
+ 16, 8, 22,225,175, 92, 60, 84, 78, 78,206,130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, 21, 2, 24, 89, 21,
+161,157,157,157, 51,147,201, 68, 84, 84, 84, 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,183,234, 26, 90, 91,
+ 91, 55, 52, 51, 51, 67, 90, 90, 26,160,126, 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, 54,222,202,202,106,
+193,129, 3, 7,152, 47, 94,188, 64,247,238,221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, 91,183,110, 47,175,
+ 94,189,138,141, 27, 55, 18, 45, 90,180,152, 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,238,157, 6,224, 84,
+133, 38,199,118,237,218, 53,107,239,222,189,152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,126,126,145,175, 94,
+189,210,169,226,129,142,237,187,249,248,248, 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,212, 60,188,255,192,
+254,253,244,233,211, 24, 53,106, 20, 90,180,104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,108, 54, 27,174,174,
+174,232,215,175, 31, 2, 2, 2,208,188,121,115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, 41,151, 82,238,171,
+155,231, 19, 19,255,199,222,121,135, 71, 81,181, 81,252,204,246,190,155,222, 8, 9,161,165,210, 2,132, 94, 2, 33, 8,132,142,
+162, 82, 68, 20,144, 34, 10, 40, 22, 64, 69,154,244, 34, 82,196,130, 8, 8,136,180,208, 4,252, 64, 58, 9, 16, 18, 72, 66, 72,
+175,155, 94, 54,219,119,231,126,127, 36,193, 16, 83,118, 19, 84,208,249, 61,207, 60,155,220,217, 57,123,167,221, 61,251,222,123,
+223,137,191,114,251,198, 37, 35,135,205,130,135,171, 29, 70,135,116,194, 27,227,122,161,179,111, 51,164,230,106,112,225,194,175,
+198,228,228,196,107,150,204, 56,172,210,140,189, 31,117, 53,230,246,101, 19,151, 67,193,215,167, 45, 22,125,244,190,237,242, 79,
+ 22,218,180,109,229,129,168,164, 18,252,122,246,148, 49, 43, 35,253,183,127,106,198,225, 69,128, 39, 21, 80, 18, 54,139, 5, 51,
+ 75, 80,206,174,156, 72,211,206,223,223,219,217,197, 5,225,225,225, 96, 89, 49, 35,244, 34,192,147, 74, 43,122,193, 85, 42, 21,
+170,244, 90,251,248,248,120,120,122,226,100,120, 56,216, 52,253,160,159,149, 9, 70,227, 42,186,161, 31,235, 82,128,118,102,115,
+200, 90, 55,119,242,177, 85, 72,112, 35, 42, 1, 58, 35,185,249, 99, 17,254,209,124,100,127, 33,211,208,200,174,195, 53,219,183,
+111, 15,218,181,107,215,160,121,243,230, 73, 39, 79,158, 12,161, 80, 8,181, 90, 13,119,119,119,152,205,102,156, 62,125, 26, 17,
+ 17, 17, 42,154,166,127,197,159,211, 6,132,160,218, 44,141, 51,137, 16, 85,248, 45,117,208,209, 23, 95,124, 42,154, 0, 32, 77,
+160,229, 5, 45,244,123, 54, 31,188, 60,102,239,153,219,212, 59,175,244, 99,117,246,105, 14, 0,112,118,118,134, 92, 46,183, 90,
+243, 41,240,151,107, 86,239,214,205,201,201,137,203,201,201,201,125,243,205, 55,125,171, 6,190, 11, 4, 2,109,101, 36,171,168,
+182,109, 44,168,167, 1,192,204, 93,187,118, 29, 43, 41, 41, 57,243,222,123,239, 97,249,242,229, 56,126,252,120, 31, 0, 87, 26,
+185,239,230,162,162,162,226,155, 55,111, 58,183,241, 11, 68, 75, 39, 46,250, 46,126, 8, 66, 8,236,197, 4,101,197,133,184,115,
+231, 54,202,202,202,110, 88, 83, 79,131,193, 80,156,155,155,235,224,228,228,132,194,194, 66,228,231,231, 63, 54, 89, 69, 69, 69,
+ 40, 44, 44, 36, 20,245,167,156, 45,245,105,150,231,230,230,170, 99, 99, 99,249,206,205,219,160,149, 19, 15,221, 62,138, 3, 8,
+129,135, 29, 11,101,165,197,184,118,237, 26, 74, 74, 74,254, 87,151, 38, 77,211,243, 39, 76,152,192, 6, 48,233,189,247,222,179,
+ 3,208,241,253,247,223,255, 21, 53,102, 22,114, 56,156, 13,123,246,236,105, 87,213,197,184,112,225,194,245, 0,118,253, 93,215,
+146,189,189,253,252,240,240,112,153,193, 96,192,230,205,155,177,126,253,250,111,240,231, 68,149,225, 95,126,249,229, 86, 22,139,
+ 53,107,246,236,217,152, 62,125,186,184, 75,151, 46,243,178,179,179,127,172, 77, 51, 51, 51,115, 81,231,206,157,151,228,230,230,
+174,176,200, 44, 63,124, 56,173,115,231,206,139,114,115,115, 87,215,119,142, 36, 18,137,196,108, 54, 35, 57, 57,185, 8,168,115,
+124,135, 54, 57, 57, 57,211,108, 54,187,139,197, 98,187,134,174,207,162,162,162, 21, 93,186,116,249, 84,169, 84,158, 5,176,172,
+ 22, 67,126, 55, 59, 59, 59, 96,238,220,185,115, 86,173, 90, 53, 38, 39, 39,103,127, 67,154,169,169,169, 43,130,131,131, 23,199,
+199,199,127,143,186,187,128,191,252,236,179,207, 12,123,246,236,121, 43, 57, 57,121,101, 3,154, 39,242,243,243, 79, 88,113,126,
+235,122,255, 99, 77, 54,155,253,254,170, 85,171, 88,219,183,111, 7, 33,100,173,217,108,174,171,158, 81, 71,142, 28,217,221,171,
+ 87,175,201, 7, 15, 30, 20, 6, 4, 4, 76,215,233,116,251, 26,186, 62,213,106,245,225,131, 7, 15,142,137,138,138,114,159, 60,
+121,178,208,219,219, 27, 6,131, 1,217,217,217,216,190,125,187, 54, 58, 58, 58,163,184,184,248,176, 53,109,136, 73, 95,250,202,
+213, 11, 71,247,165, 60,140,238,209,255,133,145,182,122,131, 59, 4, 5,108, 20, 23,228,224,244,137,195, 69,201,201,137,215,212,
+234,226, 87,172,209, 52,232, 74, 94,190,246,219,177,253, 25,201,177,221,251, 6, 15,181,213,234, 61, 33,224,177, 80,160,204,196,
+233,240,163,133,201,201, 73,191,107,141,186,215,254,169,118,158,237,133,101,236,156,136, 55,103, 12,239, 4,145,173,251, 29, 46,
+176,185, 23, 32,114,112,118,230, 85,222, 59,144, 86,140,121,180, 72, 83, 9,240,219, 84,246, 82,169,213,106,112, 1,253, 20,128,
+235,232,232, 40, 2,128,248,248,120,136, 43,122, 53,172,170,167, 10,144,136,171,233,178, 0,117, 1, 7,205, 90,203, 37, 20, 0,
+100,228, 20, 64,111,172,247,123,227,121,103,103, 53,195,181,179, 49, 2, 60, 0, 33, 82,169,116,249,146, 37, 75,214,222,184,113,
+ 99,109, 88, 88,216, 90,129, 64,176,188,242, 96,243,234, 57, 17,127,155,102, 87, 55,216, 5,183,162, 46,133,182,166,232, 25,125,
+108,205,175,117,147,232, 7, 12, 24,176,181,137,245,108,202,205,242, 87,106, 30, 53, 26,141, 4, 21,221,118, 71, 81,119,151,224,
+135,213,214,231,164,165,165,145,202,191,173,169,167,195,248,241,227,233,178,178, 50,242,210, 75, 47, 17, 52,252, 8,159,122, 53,
+ 5, 2, 65,112,223,190,125,141,202,188, 66, 18,151,148, 73,174, 71,222, 39,103, 46, 92, 37,251, 15,135,147, 45, 91,119,144, 14,
+ 29, 58,232, 1,120, 90,163,201,225,112, 6, 4, 7, 7, 23, 40,149, 74, 18, 27, 27, 75, 46, 93,186, 68, 14, 29, 58, 68,118,236,
+216, 65,182,109,219, 70,154, 55,111,174, 4,224,108,141,166, 72, 36, 26, 57,100,200, 16, 99,113,169,154, 36,103, 22,144,123,177,
+201,228,202,205,123,228,244,133, 43,228,199,125, 7,137,191,191,191,214, 2, 77, 54,155,205,222,178,127,255,254, 82, 66, 8, 25,
+ 57,114,100, 6,158, 76,164,218,114,254,252,249,185,132, 16,178,122,245,234, 2,212, 62, 16,254,175,190,150, 94,104,214,172, 89,
+ 28,143,199, 11, 7, 48,169,129,237, 94,230,112, 56,199, 93, 92, 92,110, 1, 24,253, 15,220, 71, 97, 78, 78, 78,215, 1, 52,244,
+132,131,170,247,141,250,151,220,239,127,133,230, 0, 14,135,115, 9,168,255, 33,194,213,218,235,207,217,108,246, 73, 0, 3,173,
+172,103, 91, 7, 7,135,151,108,109,109,223,177,181,181,125,199,201,201,233, 37, 62,159,223,182, 41,251,110,223, 54,100,184, 71,
+224,136, 35,205, 59, 14, 75,245,232, 20,150,234,213,121,228, 17,251,182, 33,195,155,170,233,217,121,228, 81,143, 78, 97,105, 30,
+157,134,167,180,236, 58,242,136,131, 79,200,144,127,242, 28, 77,106, 6,183, 65, 45, 97, 34,151, 22, 19,114,105, 49, 9,105, 9,
+186,135, 13,252,131, 0,217,224,144,144,117,196,108, 94, 55,102,212,168,117,109, 0,123, 2,176,107, 46,181,105, 6, 2,242,199,
+219,142, 28,185,174, 21,224, 48, 8, 16,247,235,211,103, 45, 49,155,215, 77,120,249,229,117, 30,128, 75,109,122,117,105, 18,128,
+221, 12,112,171,174,235, 0,180, 30,231,133,128, 15,135,123, 17,114,105, 49,249,236, 69,111,210,217, 25,147, 26,208,172, 43, 82,
+244, 92, 71,180,172, 69, 82,217,184,174,172,124,149, 60,133,139,240,169,107,118,119,133,119, 72,107, 42,118,168, 15,167, 16, 21,
+ 83,146, 37,255,194, 70,242,123,189, 94, 79,180, 90, 45, 81,171,213, 68,165, 82,213, 52, 80,143, 13, 89, 86, 86, 22,201,200,200,
+ 32,105,105,105, 36, 37, 37,133,224,143,177, 55, 22,215, 83, 46,151,239,122,241,197, 23,205, 92, 46,119,203,211,216,119, 59, 59,
+187,149,221,186,117, 51,108,218,180,137, 28, 57,114,132,124,253,245,215,100,246,236,217,164, 93,187,118, 58, 27, 27,155, 87, 26,
+163,233,226,226,178,200,199,199,167,224,155,111,190, 33, 63,254,248, 35,217,184,113, 35,249,248,227,143,205,238,238,238, 57, 50,
+153,108,112, 99, 52,157,156,156,118,246,238,221,219,176,115,231, 78,242,235,175,191,146,189,123,247,146,249,243,231, 19, 95, 95,
+ 95,157, 68, 34, 25,107,161, 38,155,195,225,172,155, 49, 99, 70,142,155,155, 91,120,141,117, 98,127,127,255, 91, 19, 38, 76,200,
+ 2,176,240, 95,116,125, 50,154,140, 38,163,249, 23, 24,173, 87,221,208,140, 0,108, 49,143,247,114,191, 62,125,214,242,128,151,
+173, 53, 69, 66, 54,123, 92,175,110,221,214,242,128, 87,170,222, 43,100,179,199,245,235,211,103, 45,151,205,158, 88,151, 94,125,
+154, 4, 96,243, 56,156,133,189,122,244, 88,199, 1, 62,170, 42, 27,208,146,122, 48,255,133,230,164,143, 39,149, 48,209, 9,226,
+127,177,209,122,234,112,254,130,139,240,121,209,124, 86,110,234, 54,149,134,233,168, 21, 17,173,163,168,120,138,122,155, 70,214,
+ 83,244,148,247,189,189,131,131,195,169, 54,109,218,228,181,104,209, 34,203,214,214,118, 31, 0,247, 38,106, 6,184,184,184,252,
+224,236,236,252,208,213,213, 53,202,193,193, 97, 3, 42,178,206, 55, 90,147,203,229,118,115,118,118,254,159,151,151, 87,177,167,
+167,167,210,193,193, 97,127, 45,145, 44, 75, 52, 93, 81,123,163,194,171, 92,199,124,233, 48,154,140, 38,163,249,132,129, 9,109,
+133, 85,131, 90,194, 52,168, 37,204,161, 94,216, 80,221,160,132, 1,162,198,154,162,215, 0, 65,205,247, 55,164,215,144, 38, 1,
+216, 61, 1,105,205,109,134,186,195,223, 66,205,231, 61,162, 85,213,206, 91,151,222,161, 14, 76,127, 65, 37,159, 23,205,103,133,
+ 4,212, 51, 24,185, 26, 43,159,226,103,106,158,242, 62,220,203,207,207, 31,146,159,255, 84,231, 38,196,228,228,228, 76,122,154,
+130, 70,163,241,134, 82,169,236,255, 20,164,234,154,122,109,128,133,211,178, 25, 24, 24,254, 59, 80,128, 25,137,248, 32,164, 45,
+ 54,115,204, 96,157, 78, 66,102,141, 41,121, 26,170, 49,154, 21,152,191,175,165,141,167, 26, 91,207, 63, 80,253, 73, 35, 3,247,
+169,255,206,105,203, 70,197, 24,173, 38, 27, 45, 6, 6, 6, 6, 6, 6,134,191,129,115, 15,153, 31, 98,207, 1,225,120, 50,250,
+ 22, 94,205,136,214, 25,250,180,102, 38, 69, 99,194,167,231, 24, 77, 70,147,209,100, 52, 25, 77, 70,147,209,252,207,105, 86, 81,
+215,179, 83,227,106,252,223,168, 89,124,255, 21,152,126,118, 70,147,209,100, 52, 25, 77, 70,147,209,100, 52,255,237, 52, 58,143,
+ 22, 3, 3, 3, 3, 3, 3, 3, 3, 67,253,212, 25,117, 99,140, 22, 3, 3, 3, 3, 3, 3, 3, 67,211,112, 69,197, 35,170,194,
+241,199,163,170,118, 2, 13, 63,130,231, 9, 86,173, 90,197,106,211,166,141,148,207,231,183, 75, 76, 76,100,205,156, 57,179,201,
+ 19, 9,214,110,216,194,242,244,244,148, 2,104, 87, 80, 84,198,122,253,141,247, 40,230,124, 49, 48, 48, 48, 48, 48, 48, 60, 71,
+ 12,171, 52, 86, 85,175,143, 35, 92, 86, 69,180,150, 45, 91, 6,163,209, 40, 1, 48, 62, 32, 32,224,115,173, 86,171, 61,112,224,
+ 0, 85,153, 45,188, 81,124,180,112, 62, 12, 6,131, 4,192,120, 39, 7,155,207,205,102,179,246,224,241,203,212,139,195,123, 19,
+230,188, 49, 48, 48, 48, 48, 48, 48, 60, 39, 76,171,241,186,211,106,163,197,225,112,216, 44, 22,171,149,209,104, 28, 34, 20, 10,
+207,106,181,218, 75, 77, 49, 89, 85,154, 20,139,213,202,100, 52, 14, 17, 8,132,103,213,234,242, 75,140,201, 98, 96, 96, 96, 96,
+ 96, 96,120,142,176,108,102,228,137, 19, 39,234, 52, 56,124, 62,159, 21, 16, 16,208,219,211,211,243,138,159,159,159,222,221,221,
+253,144, 88, 44,150, 52,177, 98,172, 54,222,190,189,221, 92,157,175,116,106,229,170,119,114,114, 58,196,229,114, 37,204,249, 98,
+ 96, 96, 96, 96, 96,248,111, 82,159, 23,121,134,169,154,105,248,167,167,124, 88, 51, 70,171,163, 82,169,220, 58,106,212,168,238,
+115,231,206,229,177,217,236,230, 18,137,164,157,131,131,195, 19, 81,177, 41, 83,166, 80, 86,105,230,100,111, 93, 62,174, 99,247,
+ 43, 31,117,229,113,217,104, 46,145, 72,218,201,229,242, 39, 52, 39,188, 62,157, 25,183,197,192,192,192,192,192,192,240,172, 82,
+ 53, 46,107, 24,172, 73,239,208,181,107, 87, 65,122,122,122, 39,141, 70,227,196,227,241, 22,142, 24, 49, 34, 96,204,152, 49,184,
+115,231,142, 57, 32, 32,192,173,160,160, 96, 78, 81, 81,209,185,242,242,242, 59, 52, 77, 7, 8, 4,130, 11,251,246,237,147, 2,
+120, 88,151,102,251,142, 93, 4,233,169, 73,143, 53,103,140, 27, 16, 48,105,222, 16,208,167, 54,155, 7,116,240,112, 75,205, 87,
+207,201, 5,209,176,198, 0, 0, 32, 0, 73, 68, 65, 84, 45, 40, 57,167, 46, 87,221, 49,211, 36, 64, 32, 16, 92,248,241,219, 29,
+245,106, 50, 48, 48, 48, 48, 48, 48, 48,252,131, 84, 25,171,112,212,120,164, 26, 7,168, 8,211,133,133,133, 61, 17, 53,226,243,
+249, 95,197,199,199,247,178,179,179,107,197,229,114,205, 47,191,252,178, 96,194,132, 9,200,203,203,163, 85, 42, 21, 59, 48, 48,
+208,249,214,173, 91, 67, 76, 38, 83, 31, 27, 27, 27,117,113,113,177,131, 78,167, 75, 0, 48,167,158,138,124,245, 48, 46,186,151,
+189,173, 93, 43, 62,151,109,158, 61,117,130,224,163,133, 47,128,210, 69,210,230,220, 2,246,231,157,109,156, 55, 92, 45, 31, 18,
+111, 48,247, 41, 87, 8,213, 57, 37, 58, 75, 52, 25, 24, 24, 24, 24, 24, 24,158,115,106,243, 34,207, 17, 13,230,209,234, 95,217,
+ 39, 90,253,193,185,187, 29, 29, 29, 93,164, 82,169,223,180,105,211, 88, 14, 14, 14,136,136,136,160,203,203,203, 89, 92, 46, 23,
+ 92, 46,151, 61, 96,192, 0,169,201,100, 18,159, 60,121,146,122,244,232, 81,158,209,104,252,188,160,160,224, 86, 61, 21,217,221,
+218, 70,224, 34,178,225,251, 29,127,175, 47,203,177, 77, 1,112,230, 51,154,168,114, 89, 28,154,192, 65, 66,179,215,245,161,164,
+ 57, 10, 47,241,236,253,121,212,239,143,138,243,140, 70,227,231,101,101,101,183,152, 75,144,129,129,129,129,129,225, 95, 77,109,
+ 94,228,121,161,122, 30,173, 39, 34, 90,117, 58, 71,103,103,103, 74,171,213,186,120,121,121, 77,115,116,116,156, 40, 22,139,157,
+251,246,237, 43, 50,155,205, 32,132, 64,161, 80,208, 45, 90,180,160,247,237,219,103,186,124,249,114,198,219,111,191, 61,106,214,
+172, 89, 15,134, 14, 29,202, 58,121,242, 36, 93,155,166,141,173, 29,101, 82,151,186,120,180,242,155,214,222,145, 76,244, 82, 24,
+156, 23,143, 16,139, 56,201,249, 32, 14, 28,192,201,139,102,181, 11,165, 87,174, 59,107,250,250, 92, 82,198,251,139, 87,142,122,
+107,234,248, 7, 33,161, 67, 89,231,206,214,174,201,192,192,192,192,192,192,192,240, 15, 51, 13, 21, 81,173,170,215,134,141, 86,
+175, 94,189,168,152,152, 24,202,211,211, 83, 92, 80, 80,224, 15, 96,195,130, 5, 11,130, 8, 33,102,145, 72,196, 22,137, 68,230,
+223,126,251, 77,253,243,207, 63, 95, 54, 26,141,147,244,122,125,145,151,151, 23,149,156,156, 92,231,108,129,174,221,123, 80,247,
+163,238, 80, 30,158,173,196, 5,249, 74,127, 10,100, 67,230, 71,110, 65, 92, 85,145, 25,110,142,108,200,156,204,107, 15, 23,169,
+ 63,250,229,238,101,163,209, 48, 9, 64,145,187,155, 43,149,145,149,205,164,123, 96, 96, 96, 96, 96, 96, 96,120,150,141, 86, 77,
+234,207,163,117,229,202, 21, 2,128,100,102,102,154,141, 70,163,188, 95,191,126,182,108, 54, 27,246,246,246,108,181, 90, 77,151,
+151,151,179, 29, 28, 28,178,184, 92,238,143,229,229,229, 69,163, 70,141,162,142, 28, 57, 82,175, 33,186,117,253, 26, 1, 64, 50,
+ 50,210,205,180, 81, 43,159,217,187,133, 45,199,100, 0, 29,216,139,173, 42,163,104,169, 38,153,237,235, 42,200,226,241,184, 63,
+ 26,141,134,162,209, 97,195,168, 95, 78,132, 51, 38,139,129,129,129,129,129,129,225, 89,166,206, 49, 90, 13,166,119, 80,171,213,
+182, 60, 30, 47, 36, 40, 40,168, 69,121,121, 57,189,108,217,178,244, 77,155, 54,237, 73, 72, 72, 48,218,216,216,180, 18,137, 68,
+239,140, 31, 63,222,225,200,145, 35,164, 79,159, 62, 53, 35,100,181, 62,221, 91,163, 81,217, 10,120,220,144,119,186,201, 90,164,
+ 27,108,105,191,119,110,166,247, 91,114,117,207, 47, 49, 28, 99,123, 59, 77, 43, 59, 62,245,206,248,241, 47, 57,252,114, 34,156,
+244,232,209,221, 34,205, 38,194,104, 50,154,140, 38,163,201,104, 50,154,140,230, 63,171,249,188, 51, 13, 53, 82, 59, 0, 22,100,
+134, 23, 8, 4,125, 61, 60, 60,122,199,196,196,152,175, 93,187, 86,194, 98,177,182, 13, 29, 58,244,208,225,195,135,187,217,217,
+217, 57, 53,111,222,220,249,252,249,243,193, 0, 14,252,254,251,239, 22, 69,159, 68, 2, 94,223, 78,238,138,222, 59,239, 18,243,
+183, 17, 15, 75,204,108,193,182, 1, 99,199, 30,122,123,207,222,110,110, 14, 50,167, 78,174,114,231,147, 39, 79, 7, 3, 56,112,
+237,218,117, 38,162,197,192,192,192,192,192,192,240,172,155,172,157,181,253, 95,111, 68,139,207,231, 55, 99,179,217,254, 25, 25,
+ 25,169, 39, 79,158,140,233,218,181,235,144,212,212,212, 85,132,144, 20,177, 88, 60, 45, 61, 61,253, 97,122,122,186, 94,163,209,
+204,176,162, 50,205,192,226,249, 71,100,105, 82,191, 56,127, 63,166,125,143,193, 67,114,114,178, 86,153, 9, 73,225,139,229,211,
+226,211,242, 30, 94,207,213,233,181, 90,171, 52, 25, 24, 24, 24, 24, 24, 24, 24,158, 57, 26,138,104, 25,204,102,243, 26,157, 78,
+103,251,203, 47,191,100,134,134,134,234, 0,224,171,175,190,162,167, 78,157,122, 57, 49, 49,113,224,131, 7, 15,134,184,184,184,
+ 92, 0, 64, 37, 37, 37, 89, 18,125, 50,208,180,121,141, 94,175,179, 61,255, 91,100,102,223,222,237,117, 0,176,253,203,205,244,
+203,211,230, 94, 78,140,141, 25, 24, 31,125,123,136,139,139,203, 5,179,137, 67,101,231,164, 48, 17, 45, 6, 6, 6, 6, 6, 6,
+134,103,153,170, 25,135,213,255,111,216,104,233,245,250, 60,189, 94, 15, 0, 69,161,161,161, 79,172,251,230,155,111, 8,128,114,
+ 0, 7, 11, 10, 10,172,169, 76,158, 70,163, 1,128,162,190,189,219, 63,177, 98,255,206, 77,143, 53, 85,101,165,204,105, 99, 96,
+ 96, 96, 96, 96, 96,120,158,204,214,159, 96, 49,199,133,129,129,129,129,129,129,129,161, 73, 76,171,235,127, 10,117,207, 28, 56,
+103,197, 7, 52,102,246,193, 57, 70,147,209,100, 52, 25, 77, 70,147,209,100, 52,255,115,154, 13,105,159,195,243, 71,157,131,225,
+255,106,152,169,175,140, 38,163,201,104, 50,154,140, 38,163,201,104,254,219,113,197,147,233, 29, 92,171, 86,112,152, 99,195,192,
+240,124, 67, 14,130,141, 34, 31, 47, 16,226, 6, 54, 63, 27,217,247, 18,169, 79, 65, 55, 89, 83,233,239, 9,145,209, 25, 38, 97,
+ 30,148, 81, 73, 77,213,100, 96, 96,248,247,225,210,115,230,104,138,197,222, 70, 17, 26, 26,101,172,128,167, 73, 17,231,102,167,
+254, 23,189, 69, 54,234,136, 96, 49, 70,139,129,225,121, 39,207,215, 27, 28,172, 4, 11,174, 32,134, 71,112,244, 95, 9,220,143,
+110,178, 38,143, 94, 6, 51,203, 29,196, 16, 15, 39,159, 85, 64,220,125,230, 96,255,251,152, 51,251, 45,242, 32,250, 6,210,210,
+178,208,170,181, 43,188,125,123, 98,211,230,173, 20,115,100, 24, 44,251, 85, 70,237, 12, 25, 62,193, 78, 36,150, 1, 0,104,147,
+ 17,223,204,235,244,171,201,100,218, 13,224, 8, 0,205,127,253, 16,253,237,131,225,185, 92,174, 18, 0, 45, 20, 10, 15,163, 90,
+104,141,129,225, 47,192,181,242, 58,163, 43,175, 59,107,144,114, 56,156, 37, 98,177,248, 55,129, 64,144, 43, 16, 8,114, 37, 18,
+201,111, 28, 14,103, 9, 0,233, 51,211,198,253,208, 78, 12,150,121,136,222, 72, 55, 59,125,175,216, 73,173, 51,123,131,101, 26,
+ 74,190,105, 43,109,146, 38,135, 10,213, 26,104,143, 31,111,170,157,203,245, 38, 63, 16, 52, 73,179, 26, 54, 60, 30,239, 52, 0,
+ 7,230,242,124, 54, 72, 77,138,198,201, 19,235,176,108,233,100,124,183,115, 6,226, 30, 92,111,146,158, 31,208,165, 11,135,179,
+192, 23, 24,128,122,158,167,203,240, 47,129, 34,211,206, 29,255, 49,239,248,190, 47,243,126, 90, 55,131, 28, 93, 25,134,205,155,
+ 55,135, 76,158, 60,249, 71, 15, 15,143, 60, 0, 47, 50, 70,235,111,198,104, 52, 58,229,231,231, 83,187,119,239, 30,161, 80, 40,
+ 30,113, 56,156, 15, 1,240,254, 43, 7, 92, 42,149, 94,149,203,229, 74,133, 66,161,148,203,229,183, 27, 42,255,151,226,237,232,
+232,152,106,103,103, 23, 95,189,208,177,195,232,158,109,122, 77,250,196,222,127,100,191, 38,234,243, 56, 28,206,135, 10,133,226,
+209,238,221,187, 71,100,102,102, 82, 70,163,209,201,138,237,251,218,218,218, 62,184,113,227,198,226,252,252,252,126,233,215,191,
+113,204,185,177,195, 49,245,127,235,250, 71,156,220,178,216,198, 70,113, 31, 64,223,103,226, 72,106,105,103,176,216,193, 49,217,
+106,113,118,169,209, 57, 50, 69, 45, 3,216,253,161,111,194,143,152, 18,218, 25, 32, 3,238,102,104, 36, 87, 11, 29,157,127, 79,
+212,201,193, 98, 5, 67, 75,185, 52,185,193, 97,177,222,162,105,122, 16,143,199,123,135,249,134,122, 54, 16, 8,120, 0, 33,144,
+ 74,132, 0, 8, 88, 77,180, 70,124, 22,171,215,213, 17, 35,150, 45,236,208, 97,142, 47, 48,188, 14,179, 69, 1,120,219,215,215,
+247, 20,128,151,159,226,238,124,225,227,227,147, 9, 96,238,211,106,151, 58,119,238,220, 51, 56, 56,248,147, 78,157, 58,245,123,
+ 90,154,255, 38,114,174,126,245, 75,246,229, 45, 78, 89, 87,182, 58, 21, 39, 93,122,219,213,217,150, 78, 74, 74,194,176, 97,195,
+240,229,151, 95,138, 3, 2, 2,246, 0,112,251, 15,220, 74,129, 85, 63,240, 81, 99,140,150,197, 70,107,156, 23,122,189,210, 18,
+ 23, 95,242, 66,217,248,150, 80, 77,108,137,203, 99,189, 48,160, 49,181,177,183,183, 71,223,190,125,217,153,153,153,162,249,243,
+231,127, 34, 20, 10,147, 1, 12,110,140,150, 72, 36,138, 16,139,197,233, 28, 14,231,137,186,136,197,226, 8,137, 68,146,206,225,
+112, 6, 86, 47,151,201,100, 87,229,114,185, 82, 38,147,221,174,195, 8, 69,200,229,114,165, 84, 42,141,168, 94,206,225,112, 6,
+ 74,165,210, 12,153, 76, 86,179,124,128, 76, 38, 75,175, 89, 94, 23, 92, 46,215, 61, 61, 61,221, 41, 35, 35,195,137,207,231, 59,
+ 87, 47, 79, 75, 75,115, 74, 79, 79,127,162,220, 26, 56, 28,206, 0,137, 68,146, 46, 22,139, 35,106, 43,175,185, 79,117, 81,237,
+216, 13,176,164,220,218,134, 39, 52, 52,244,114,118,118,182,135,141,141,141, 77,245, 21,118, 10,155,193, 63,124,179,117,222,200,
+161,161,111, 57,250,141,106,223, 72,253,193, 66,161, 48,121,254,252,249,159,100,102,102,138,122,244,232,193,102,177,172,250, 61,
+ 17, 50,114,228,200,163, 74,165,178, 89,199,142, 29,217, 38,147, 9, 49,199,150, 64, 28,245, 14,132,201,219,209, 92,148,199,121,
+244,235, 42,247,208,254, 93,142,226, 31, 30, 12, 74, 14,250,241, 64,209,125,105, 66, 28, 31,100,106, 29,135,141,120,145,115, 39,
+ 93,227,104, 52,155,237, 0,118,127,242,157,167,160, 81,154, 28, 99, 31,154, 16,231,243, 41, 92,199,224,151,230,176, 47,164,112,
+ 28,141,102,179, 61, 88,232,215, 24,205,234,151, 63,155,205,158,183,110,221, 58, 22,128,217, 0,248,255, 37, 67, 19,228,134,102,
+ 3, 90,179,111, 6,186,162,215, 83,148, 13,168,188,223,189,155, 42,180,235,187, 83,152, 58,125, 39,218,250,118,111,146,142,158,
+166,227,246, 39, 37,157,153,216,186,117,216,194, 14, 29,166,212, 98,182, 40, 0, 11, 87,173, 90, 53, 41, 38, 38,198,177,101,203,
+150,211,159,210,143,254,141,171, 86,173,122, 63, 38, 38,198,205,203,203,235, 51, 43, 53,235,108,151,108,109,109, 7,239,218,181,
+107,222,176, 97,195,222,234,220,185,115,251,167,161,249, 47,230,203,187,119,239,122,172, 91,183,238,131,169, 83,167,150, 2,192,
+192,129, 3,121, 0,122, 52,185,189, 35,132, 79, 8, 9, 38,132, 12, 35,132, 12, 36,132, 4, 85,254,221,181,114, 25, 70, 8, 9,
+169,241,218,181,114,219,170,245,221,234,208, 24, 86,115,187,106,219,212,252,255,137,191,107, 49, 90,195, 80, 49, 86,107,216, 19,
+ 59,112,226,196, 9, 82,253,181, 38,227,189,240,233,156,158,205,212, 15,142,239, 37,170,244, 36, 82, 20,123,135,220,217,185,130,
+204,233,234,168,126,181, 37,190,176,254,120, 17,114,229,202, 21, 18, 19, 19, 67, 84, 42, 21,121,248,240, 33,233,214,173,155, 70,
+ 44, 22,159, 7,224,101,141,152, 76, 38, 83,158, 63,127,158,132,134,134,150, 72,165,210,181, 85, 55,151, 92, 46, 87, 94,185,114,
+133,132,134,134,150,200,100,178,141, 0,216, 0, 48,118,236,216, 92, 66, 8,113,116,116,204,170, 77,111,228,200,145, 69,132, 16,
+162, 80, 40,170,186,154,216, 50,153,108,227,172, 89,179, 84,183,110,221, 34,182,182,182, 85,229, 44,185, 92,190,118,246,236,217,
+170,200,200,200,234,229,245, 98,103,103,151,110, 54,155,201,241,227,199,137,147,147, 83, 86,181,155, 57,221,108, 54,147,163, 71,
+143,214, 89,183,250, 2, 5, 82,169,116,205,196,137, 19,203, 82, 82, 82,136,189,189,189,178, 90,249,218,201,147, 39,151,165,165,
+165, 17, 7, 7, 7,139,234,104,111,111,175,188,122,245, 42, 25, 51,102, 76,105,245, 99,106,111,111,175,188,118,237, 90, 85,249,
+ 26, 75, 26, 50, 55, 55,183,233, 78, 78, 78, 89, 78, 78, 78, 89, 54, 54, 54,203, 93, 93, 93,115,242,242,242, 8, 33,132,180,106,
+213, 42,183,122, 36,203, 41, 96,196,187,219, 15, 94,187,113, 41,186, 32,175,195,160,183,214, 40, 58,140, 84, 88,113, 12,188,196,
+ 98,241,249,126,253,250,105,210,211,211, 73,121,121, 57,137,138,138, 34, 87,174, 92, 33, 9, 9, 9, 4,128, 37, 79, 24,144, 73,
+165,210, 76,157, 78, 71,235,116, 58, 58, 47, 47,207,156,155,155,107,142, 93,235, 74,200,183,220,199, 75,241,209,225, 36,231,210,
+ 74, 90, 46, 21,103, 0,144,253, 99, 70,107,171,191, 59,217,225,179,255,254, 18,143,216, 75,171, 94, 48,146,148, 11,100,239, 20,
+ 71,227,197,119,155, 61, 34,219,124,127, 38, 59,252,154, 55, 74,115,155,223,222,168,143, 61,226,182,124,246,182, 49, 53, 53,149,
+ 44,152,252,130,233,236,156,102,137,100,187,239,193,198,104, 86,227,149,209,163, 71,171,210,210,210,136,191,191,127, 57,155,205,
+158,250, 95, 50, 89, 33,222,252,204,168, 31, 23,208,195, 3,196, 5, 79,201,108, 5, 56, 57, 57,229,127,255,253,247, 68, 38,147,
+229, 54,214,108,141, 27,213,159,104, 74,206,147, 81, 97, 65,245,222, 35, 47,189,244, 18, 9, 14, 14, 38,115,230,204,105,232, 94,
+162,124,129, 17,187, 59,116, 56, 74,143, 27,103,222,221,161,195, 81, 95, 96, 68,165,193,162, 0,124,176,122,245,234, 72,163,209,
+ 24,249,221,119,223, 69,142, 24, 49, 34, 18,192,130, 38, 30,139, 77, 95,124,241, 5, 49, 26,141,228,187,239,190, 35, 35, 70,140,
+ 32, 0, 54, 55,165, 93,170,138,100, 5, 6, 6,190,123,228,200,145, 27,113,113,113,121, 97, 97, 97,107, 58,116,232,160,104,172,
+230,179,136, 84, 42,109,211,190,125,251, 61,254,254,254,105, 29, 59,118,212,251,249,249,105,189,189,189, 83, 2, 2, 2,190, 23,
+ 8, 4, 94,141,148,237,222,171, 87, 47,243,197,139, 23,201,232,209,163, 73, 53, 19, 82, 47,245,121, 17, 66, 72,208, 7, 31,124,
+240, 33, 0,242,193, 7, 31,124, 72, 8, 25, 86,233, 39,134, 85,255,187,230,107,149,121,170,250,191, 54,141,170,165, 54,205,218,
+ 62,163,198,231,160,142, 72,214,180, 63,237,220,137, 19, 39,250,157, 56,113,226, 98,205,157,123,177, 37,122,206,233,217, 76,163,
+201,203, 38,209, 43,222, 33,191, 5,187,147, 43,253, 93, 72,252,188,209, 36,251,199,141,100,102, 39, 91,245,184,150, 8,182,214,
+104, 69, 70, 70,146,200,200, 72,114,251,246,109,146,156,156, 76, 74, 74, 74,200, 79, 63,253,100,182,183,183,215, 8, 4,130, 85,
+ 0, 68,150,136,201,229,114, 37, 33,132,232,116, 58,178,124,249,114,109,101,164,202, 89,161, 80, 40, 9, 33,164,184,184,152,172,
+ 90,181, 74,171, 80, 40,162, 0,184, 57, 56, 56,164, 39, 37, 37, 17,103,103,231, 90,205,140,173,173,173, 50, 46, 46,174,202, 56,
+ 53,179,181,181,141, 62,118,236,152,129, 16, 66, 50, 50, 50,136,157,157,157, 18,128,179,189,189,253,157, 19, 39, 78, 24, 8, 33,
+ 36, 43, 43,171,170,220, 34,163,165,209,104,200,217,179,103,159,168, 67, 85,249,169, 83,167,158, 48, 96, 22,224,172, 80, 40, 34,
+127,250,233, 39,189,217,108, 38,209,209,209, 85, 38,209,217,198,198,230,246,193,131, 7,245,102,179,153,196,198,198, 90,108, 6,
+ 91,180,104,145, 75, 8, 33, 38,147,137,108,223,190, 93, 87,117, 76,171,202,245,122, 61,249,234,171,175,116,114,185, 60, 18, 64,
+189,209, 55, 7, 7,135, 44,189, 94, 79,138,139,139, 73,183,110,221, 84, 87,174, 92, 33,165,165,165,132, 16, 66, 90,180,104,145,
+ 11, 0, 62,253,166,126,126,227,161,170,244,245,247,183, 30,240, 10,122,117,197,153,155,153, 25,187,142, 68, 68, 58, 4,140,124,
+193,146,160,166, 64, 32, 88,229,234,234,170,253,253,247,223,205, 6,131,129,164,165,165,145,219,183,111, 63,190,198,238,221,187,
+103,145,209,226,112, 56, 75,110,220,184, 97, 48,155,205,116,126,126,190, 57, 55, 55,215,156,155,155,107,170,105,180,200,183, 92,
+146,127,234, 77, 18,190,115,174,158,199,227, 45,249,103,162, 89, 96,147, 29, 62, 35,201, 14,159,200,239, 39, 58,228,151,221,222,
+ 71,200,175,115, 73,226,231, 45,201,146, 23,100,101,244, 14,159, 72,178,195,119, 28,249,180, 31,199, 42,205,157,126,195,201, 14,
+159,200, 47, 94,244, 44,184, 19,121,139, 92,188,120,145,124,181,113, 53,153, 19,210,172,156,222,225, 19, 73,182,249,141,177, 70,
+179, 58, 2,129,224,225,229,203,151,201,165, 75,151,200,103,159,125, 70,196, 98,113,218,211,136,234,145,109,222,158,228,107,239,
+126,228,155,182,174,228,127,253,158,185, 9, 62, 65,110,104, 54,200,155,159,145,127,231, 8, 33,133, 9, 36,103,173, 63,121,193,
+135,219, 84,179, 21,224,228,228,148,151,146,146, 66,114,114,114,200,250,245,235,137, 92, 46,111,148,217, 26, 55,170, 63,209, 20,
+159,171,215,104,141, 28, 57,146,108,216,176,129, 24,141, 70,210,189,123,119, 75,126,180,252,201,108,249, 0, 35, 1,124,184,102,
+205,154,199, 38,107,235,214,173,145,247,238,221,139,244,240,240, 56,217,132, 99,177,121,205,154, 53,143, 77,214,214,173, 91,201,
+189,123,247,136,167,167,103,122, 83,218,165, 65,131, 6,125,158,156,156, 92,186,104,209,162, 3,125,251,246, 93,113,231,206,157,
+140,240,240,240,200,192,192,192, 23, 26,171,249, 20,162, 58,156,202,200, 14,159, 16,194, 37,132, 84,153, 87, 14, 0,110, 85, 64,
+193, 18, 38, 78,156, 40,238,217,179,103,228,132, 9, 19,212,223,127,255, 61, 73, 73, 73, 33, 81, 81, 81,100,205,154, 53,228,147,
+ 79, 62, 33,223,126,251, 45, 25, 51,102, 76,121,183,110,221,110,140, 27, 55, 78,104, 69, 53,253,189,188,188, 74,142, 30, 61, 74,
+246,238,221, 75,120, 60, 94,184,165, 27,214,231, 69,234, 50, 83,117, 25,172,154,235,234, 49, 98,245, 26, 54, 11, 62,239,207,166,
+170,102, 36,164,218,223,255, 11, 11, 11,235,247,167, 47, 31,130,165,211,230,127, 46, 76,254,126, 61,148, 63,125, 9,118,177, 18,
+220,178, 2,232, 46,135,195,120,249, 24, 38,245,232, 33, 18, 81,212, 50,107, 47, 24, 62,159, 15, 62,159, 15, 30,143, 7,181, 90,
+141,172,172, 44,244,238,221,155,117,251,246,109,225,244,233,211,231,138, 68,162, 52, 0,163, 26,188,155,169,138,136,244,213,171,
+ 87,241,230,155,111, 10,246,236,217,211,209,209,209,241,174,217,108,230, 3, 64,108,108, 44,198,143, 31, 47,216,183,111, 95, 59,
+ 55, 55,183,219, 6,131, 65, 44, 16, 8,192,102,179,235,212,227,243,249, 48, 26,141,130,182,109,219, 70,221,189,123, 55, 32, 44,
+ 44,140,155,154,154,138,164,164, 36, 24,141, 70,190,183,183,247,189,219,183,111,119, 28, 54,108, 24, 55, 61, 61, 29,169,169,169,
+143,235, 97, 73,125,245,122, 61, 4, 2, 1,170,119,105, 81, 20, 5,157, 78, 7, 62,159,111,177, 22,135,195, 25,224,235,235,123,
+239,238,221,187,129, 35, 71,142,228,221,186,117, 11, 25, 25, 25, 48,155,205,124, 63, 63,191,123,119,239,222,237, 52, 98,196, 8,
+ 94, 84, 84, 20,148, 74, 37, 44,237, 66,171,122,223,221,187,119, 49, 97,194, 4,254,233,211,167, 59,185,186,186, 70,153, 76, 38,
+ 62, 0,220,187,119, 15,227,199,143,231,159, 57,115, 38,176,121,243,230, 81, 13,116, 37,178, 1,192,104, 52, 98,250,244,233, 18,
+185, 92,142,244,244,116,208, 52, 13,179,217, 12, 0, 40, 40, 42,184,119,247, 94,116,236,164, 87, 94,236,167, 49,232,116,215,110,
+ 70, 60,104,213,194,211,157,162, 72,139, 6,170, 58, 74, 34,145,164,173, 93,187,246,221,148,148, 20,129,175,175, 47, 43, 49, 49,
+ 17,101,101,101,224,241,120,143,175, 49, 75,247,155,207,231,247,247,247,247,231,104,181, 90,208, 52, 13, 0,132,197,170,125,196,
+138,176,248, 50,252,156, 77, 92,145, 72,212,255, 31,249,246, 46,245,183, 7,141, 65,169,121,122,129,192,198, 93, 38,117,245, 6,
+210, 46,161,165,163, 0,108, 22, 91,120, 43, 73, 45, 1,200, 32,120,228,219, 91,167, 73, 15, 74,202,213, 11,140,118,237,164,110,
+238, 30, 40, 40, 40, 64,243, 86,190,208,242, 29,249, 87, 19,202,165,160,172,212,252,131, 62,109,219,182,117,105,211,166, 13,242,
+243,243, 17, 24, 24, 8, 91, 91, 91, 91, 0,131, 26,253,165,243,157,167, 0,165,232, 5,176,214,194, 76,125, 6, 35,103, 37, 18,
+242, 2,201,142, 64,238,179,100,178,228, 82,254,245,125,251,127,106,102,239,225, 7,132,191, 14,103, 27, 1,190,121, 43,208,206,
+ 81, 33, 56,218, 72,179, 21,224,236,236,124,225,198,141, 27, 14, 66,161, 16,183,111,223,134,191,191, 63,214,175, 95,239,104,107,
+107,123,169,113,145, 45, 2, 66,213,109,178,250,246,237,139,217,179,103, 99,207,158, 61,176,179,179,195,132, 9, 19, 26, 50, 91,
+ 36, 22, 56,254, 69, 84,212,119,123, 30, 61, 58, 49,177,117,235,176, 9,222,222,203,103,188,252,242,212,183,223,126, 27,171, 87,
+175,198,209,163, 71,209,171, 87, 47, 76,155, 54,205,152,150,150,182,187,177, 93, 85,107,215,174,157, 51,119,238,220,154,154,134,
+212,212,212, 47,154,212, 46, 21, 20,220,139,138,138,138,125,229,149, 87,250,105,181, 90,221,205,155, 55, 31,120,121,121,185, 3,
+104,209, 88,205, 38, 24, 44,138, 16, 34, 4, 32,174, 92, 36, 0,196,251,246,237, 83,140, 28, 57, 82, 94, 89, 38,170, 92, 26,236,
+222,247,247,247,119,127,248,240, 97,230,188,121,243, 2,247,236,217, 35, 18,139,197, 40, 46, 46,198,215, 95,127,141, 15, 63,252,
+ 16, 20, 69,129, 16,130,111,191,253, 86, 60,101,202,148,160, 71,143, 30,101,122,122,122, 90, 50,164, 69, 32,149, 74, 15, 46, 95,
+190, 92, 78,211, 52, 22, 46, 92,152,111, 48, 24,102, 87,174, 91,100, 99, 99,115, 29, 21,134,187, 62,106,245, 34,213,190, 43, 79,
+212, 56, 54, 97, 53,203,106,174, 35,132,132,213,167, 97,229,185,168,237,243,194,235, 51, 91,213,191,129,250,215,234, 34,129, 14,
+ 46, 94, 62, 40,249,245, 32, 68, 28, 10, 34,118,229,194,161,192, 74,188,135,230, 66, 46,140,132, 4, 52,214,104, 85, 45, 92, 46,
+ 23,106,181, 26,102,179, 25, 31,126,248,161,224,236,217,179,246, 44, 22,235,231,134,116,170, 27,166,248,248,120,248,249,249, 81,
+199,143, 31,119,158, 61,123,182,168,234,115, 74, 74, 74,208,166, 77, 27,234,212,169, 83, 78, 31,127,252,177,180, 62, 51, 67, 81,
+ 20,120, 60, 30,230,206,157, 43,186,121,243,166,157,155,155, 27, 18, 19, 19, 81, 88, 88, 8,169, 84,138,185,115,231,138,110,220,
+184,225,232,230,230,134,148,148, 20,148,148,148, 64, 42,149, 90,109,180,120, 60,222, 19,219, 80, 20, 5,131,193, 96,149, 49, 80,
+ 40, 20,123, 35, 35, 35, 29, 21, 10, 5,162,162,162, 96, 50,153,160, 80, 40, 48,103,206, 28, 81,100,100,164,163,141,141, 13, 98,
+ 99, 99, 65, 8,129, 92, 46,183,170,142, 0, 64,211, 52, 98, 99, 99,209,162, 69, 11, 92,186,116,201,105,198,140, 25,194,170,242,
+132,132, 4,184,187,187,227,210,165, 75, 78, 18,137,100,111, 93, 90, 52, 77, 35, 59, 59, 27, 49, 49, 49, 72, 76, 76, 68, 94, 94,
+ 30,242,243,243, 81, 86, 86, 6,147,201, 4, 0, 16,151,149,134,239, 59,112,252,174, 72, 36, 18,251,123,183,245,184, 23,125, 63,
+ 87, 36, 18,137, 61, 61, 60,188,129, 79, 89,245, 24,194,159, 83, 83, 83,237,167, 76,153,194,203,201,201, 65, 81, 81, 17, 56, 28,
+206,159,174, 45, 62,223,178,161, 64, 38,147,201, 79, 40, 20, 82, 6,131,225,113, 4,140,207,231,227,221,189,106,248, 47,193, 19,
+203,203, 27,115, 65,204, 70,232,245,122,191,191, 61,154, 5, 80,160,244,109, 65, 81,129,215, 19,203,237,250,132,189,194, 67,210,
+105,128, 54, 2, 44, 14,250,119,112,231, 28,189, 87,238, 12,130, 14,208,193,151,144,134,103,126, 17,128, 2, 12,109, 0,170,203,
+217,135, 38,251, 94,163,223,226,101,102,102,130,199,227, 65, 32, 16, 32,112,192, 88,206,190,187, 70, 23, 80,232, 8, 3,124, 44,
+209,124, 34,236, 40, 18, 45,254,228,147, 79, 36,213, 53,167, 78,157, 42, 81, 40, 20,159, 52,218,100,149,139,123,192, 68,230,198,
+100,170, 91, 44, 15,207,241,123,148,171,241, 1, 33,243, 0, 99,167,167, 96,182,250, 11, 4,130, 36, 0,189,155,100,178,100,252,
+107,251,247,255,212,204,174,121,133,201,130, 73, 11,112, 69,112,113,180,193, 55,239, 6,219, 57,218,136,172, 53, 91, 1,206,206,
+206,231,175, 95,191,238, 32, 20, 10, 17, 25, 25, 9, 30,143, 7,161, 80,136,246,237,219, 99,199,142, 29,142,118,118,118, 86,155,
+ 45, 2, 82,107,204,119,212,168, 81,164,111,223,190,152, 53,107, 22,118,239,222, 13,189, 94,143,229,203,151, 35, 53, 53,213, 34,
+217, 88,224,248,170,168,168,239, 87,198,196,196,127, 16, 16,224, 59, 74, 34,177,155, 53, 97,130,226,227,143, 63, 62,113,236,216,
+177,239,134, 13, 27,150,127,243,230,205, 13, 0, 14, 90,121,120, 41, 0, 91,215,173, 91, 55,171,202,184,125,252,241,199,223, 30,
+ 59,118,108,229,176, 97,195,178,111,222,188, 57, 15,192,214,166,180, 75, 52, 77,135,255,252,243,207,119, 69, 34,145,216,199,199,
+199, 35, 58, 58, 58, 87, 36, 18,137, 61, 60, 60,188,251,245,235,199,106,140,102, 99,112,114,114, 26,120,253,250,117,127, 84, 76,
+ 26, 19, 84, 25,173,232,232,104,155,210,210, 82, 27,169, 84,106,227,234,234, 42,171, 50, 91,163, 71,143,182,225,112, 56,245, 94,
+183, 42,149,234,216,162, 69,139, 20,163, 71,143,174,250, 31,151, 47, 95,198,238,221,187, 33,145, 72,158,120,239,136, 17, 35,240,
+230,155,111,218,234,245,250,159, 45,168,238,228,233,211,167,251, 56, 59, 59, 99,241,226,197,186,204,204,204,129, 0, 82, 1, 40,
+ 66, 66, 66, 62,143,142,142,238, 22, 20, 20,116, 0, 64,231,250,238,189,218,188, 72,117,163, 99, 73, 89, 99,223,111,169,217,170,
+ 81, 84,103, 14,173, 39,140, 86, 88, 88,216, 69,212, 49,147,202, 80,168,132, 0,102,136,216, 20,196,236,106,102, 11, 52, 56, 37,
+185,160, 26, 49, 75,165,182, 47, 67, 62,159, 15, 54,155, 13,189, 94, 15, 75, 31, 84, 93,101, 10,228,114, 57,164, 82, 41, 52, 26,
+ 13, 76, 38, 19,132, 66, 97,149, 25,129, 92, 46, 7,151,203, 5,151,203,133, 80, 40,252, 83, 52,169,102, 52,135,199,227, 65, 34,
+145, 32, 59, 59, 27,169,169,169,160,105, 26, 82,169, 20, 18,137, 4,124, 62, 31, 89, 89, 89,200,202,202, 2, 33, 4, 18,137, 4,
+ 18,137, 4,214, 12,184, 54,155,205,181,126,249, 27,141, 70,171, 34, 90, 38,147, 9, 15, 30, 60, 64, 90, 90, 26,132, 66,225,227,
+125, 21, 8, 4, 72, 72, 72, 64, 78, 78, 14,196, 98, 49,228,114, 57, 20, 10,133,197,186, 85,251, 34,147,201, 32, 18,137, 80, 84,
+ 84, 4,181, 90,253,248,152,202,229,114, 72, 36, 18,148,148,148, 32, 55, 55,183,222,125, 55,155,205,200,202,202, 66, 94, 94, 30,
+210,211,211,145,159,159,255,184, 1,170,140, 26, 53, 45,176, 83, 90,138,130,130,130,199,145,200,186, 22, 75,160,105, 26,101,101,
+101,184,126,253, 58, 69,211, 52,138,139,139,233,188,156, 28,243,204, 44, 62,142,126,186,141,252,116,250,142,118,223,201, 72,205,
+225,243, 49,154,173,135,239,105,132,221, 62, 51,225,159,224,171, 0, 5,140,220,208,124,149, 81,144,103,224, 41,156, 3, 66,128,
+164, 83, 0,139, 3, 8,109,209,189, 93, 75,164, 22,153, 37,113, 74,189, 16, 20, 6, 99,171,183,173, 69,154,102,238,160,188, 50,
+163, 32,197,224, 40,247,235,208, 25, 74,165, 18, 2,129, 0, 2,129, 0, 93,122,133, 32,169,192, 44,190,159,169, 17,131, 32,212,
+ 34,205, 63,104, 37,149, 74,123,244,238,221,155,170,174, 57,116,232, 80, 80, 20,213, 30,128,175, 85,141,220,230, 86,124, 24,196,
+221,193, 33,115,239,103,171,221,142, 70,107,189,135,143, 26,107,183,233, 92,174,223,131, 28,157, 23,136,113, 62,136,161,115, 19,
+204, 86, 63,153, 76,118, 98,203,150, 45, 94, 66,161,240, 20,128, 62,141, 17,145,138,216,219, 23,207,122,165,153,109,149,201, 50,
+170, 1,142, 8,224,138, 0,142, 8, 46, 78, 14, 88,246,230, 32, 59,177,144,123,216, 10,195,186,111,235,214,173,142, 53, 77, 86,
+213, 18, 24, 24,136, 37, 75,150, 56,218,217,217,237,181, 68,111,237,154,213,164,184,164, 4, 32, 64,105,169, 10,107,215,172, 46,
+170, 90, 55,122,244,104,210,167, 79, 31,204,154, 53, 11, 43, 87,174,196,201,147, 39,209,189,123,119, 76,155, 54, 13, 65, 65, 65,
+ 13, 73,135, 42, 20,138, 61, 33, 33, 33,215,179,100,178, 55,179, 59,119,230,159, 87, 40, 74, 6,150,148, 40, 60,163,163, 13, 62,
+192, 61, 0, 95,101,100,100,188, 96,133,201,122, 89, 46,151, 71, 14, 28, 56,208, 32,147,201,210,214,175, 95, 63,115,246,236,217,
+ 88,189,122, 53, 22, 45, 90,244, 53,128, 55, 0,124,148,145,145,225, 86,159,201,250,171,218,165,191,170,173, 51,155,205,233, 7,
+ 15, 30, 12, 50, 24, 12,238,149,221,131,130,226,226, 98,121, 97, 97,161,204, 96, 48, 72,104,154,150,216,216,216, 72, 1,136, 39,
+ 77,154,196,185,127,255,190,159,201,100,202,172, 79, 51, 39, 39,231,213,133, 11, 23,230,231,231,231, 3, 0,218,183,111,143,226,
+226, 98, 44, 88,176, 0,239,188, 83, 49, 33,184, 83,167, 78, 32,132, 64,169, 84, 98,237,218,181,202,156,156,156,215, 44,168,110,
+235,182,109,219, 34, 58, 58, 26, 15, 30, 60, 56, 7,128, 70,197, 56,214,146, 59,119,238,220,205,203,203,195,222,189,123,121,205,
+154, 53, 59,134, 58, 82,188,212,231, 69, 26, 3, 69, 81,225,141,217,174, 42,114, 85, 91, 68,172, 14,234,143,104,133,133,133, 81,
+213, 95,159,136, 24, 81,136, 74,139,184, 4,187,128,206, 79, 68,179,196,108, 10, 34,185, 2, 73,233,169,224,129,138,121, 90, 70,
+171,168,168, 8, 51,103,206,212,188,250,234,171, 5, 52, 77,143,181,212, 20, 40, 20, 10, 40, 20, 10,220,191,127,159,140, 25, 51,
+ 70,185,126,253,122, 77,117,163, 21, 31, 31, 79, 66, 67, 67,115, 63,249,228, 19, 85,125, 70,171, 42,162,181,106,213, 42, 77,255,
+254,253,243, 98, 98, 98, 72,149,153,146, 74,165, 88,187,118,173, 38, 56, 56, 88,121,235,214, 45, 82, 85,102, 77, 68,139,197, 98,
+ 61, 54, 90,213,183, 97,177, 88,160,105,218, 42,163, 85, 94, 94,254,234,176, 97,195,148,177,177,177,164,106, 63, 21, 10, 5,214,
+175, 95,175, 25, 52,104,144, 50, 38, 38,134, 84,149,201,229,114,139,205, 96,213,231,203,100, 50,200,229,114,220,191,127,159,132,
+134,134, 42, 55,111,222,172,173, 94,254,224,193, 3, 50, 98,196, 8,101, 89, 89,217,171,245,153,151,170,238, 60,147,201, 4,173,
+ 86,139,252,252,124,164,167,167, 63, 14,167,107, 36,242, 23, 94,121,105,120, 71,141, 70,163,190, 31,255, 48,173,125, 59,127, 39,
+141, 70,163, 78, 77, 75,139, 7, 62,165,235,209, 30, 27, 16, 16, 80, 48,115,230, 76, 77, 81, 81, 81,147,141, 22,159,207,143,229,
+112, 56,164, 79,159, 62, 68,175,215,147,244,244,116, 99,126, 81,145,201,119,197, 10, 18,243,238,187,148, 40, 34, 66, 32,149, 74,
+169, 74, 77, 86, 98, 98, 34, 45, 18,137, 98,255,118,163,197,162, 93, 64,145,222,191, 63, 84,217, 12, 26, 62,158, 79,229,220, 4,
+ 12, 42, 64, 96, 11, 8,108,193,145,216, 99, 72,159, 78,236,239,175,151,186,128,208, 61,193, 19,184, 55,168,201, 37,206, 0,221,
+231,215,120,173,109,239,113,115,248,133,133,133, 96,179,217,143, 77,145, 88, 34,193,192, 81,147, 88,223,222,212,185, 0,164, 23,
+ 40,182,187, 21,247,250,251,139, 23, 47,230, 21, 21, 21,129,197, 98,253,161, 41, 22, 99,198,140, 25, 2,185, 92,190,200,226,198,
+239,160, 31, 15, 92, 65,119,128,188, 19,151,163,117, 59,118, 79,227, 51,127,213, 55,162,128, 78, 65,152,222,223, 73,180, 42, 60,
+ 55,224,110,186,166, 37, 96,126, 23, 38,125,151, 70,152,173, 62, 50,153, 44, 60, 34, 34, 66, 60,116,232, 80,172, 93,187, 86, 34,
+ 18,137, 78, 53,166,225, 47, 87,153,103, 47,221,252,131, 50,106,195, 96,192, 80, 94, 97,176,170, 45,185, 42, 26, 75,190,185, 80,
+ 98, 52,146, 87, 44,213,212,104, 52,147,223,120,227,141,130,195,135, 15,255,201,100, 9,133, 66, 36, 39, 39, 99,249,242,229,133,
+133,133,133, 13,126, 41,174, 95,183, 54, 50,250,238,111,248,246,235,165, 0, 8,182,172,127, 11,215,126,223,111,211,191, 95, 95,
+210,162, 69, 11, 18, 20, 20,132,153, 51,103, 98,217,178,101,136,139,139,131,131,131, 3,222,122,235, 45,244,235,215, 15,235,214,
+173,171,175,145, 10,157, 61,123,246,242,140,140, 12,159, 95,127,253,149,147,151,151,231,180,110,215,174,146, 67, 37, 37,133, 43,
+163,163,227, 62,106,215,174,237, 7, 29, 58,188, 86, 79,234,135, 90, 77,214,172, 89,179,246,101,100,100, 4,158, 59,119,142,155,
+151,151,231, 62,107,214, 44,172, 89,179, 6,139, 22, 45,218, 1, 96, 58, 44,155,240, 98,113,187,196,102,179, 95, 24, 59,118,108,
+ 71,141, 70,163,142,139,139, 75,107,215,174,157,147, 70,163, 81,167,165,165,197, 95,188,120,145,110,140,102, 99, 40, 40, 40,120,
+180,119,239,222,248, 57,115,230, 4,102,100,100,248, 1,176, 47, 43, 43,147,148,149,149, 9,244,122,189,200,214,214,214,182, 83,
+167, 78, 14,211,166, 77,147,222,185,115,199, 47, 35, 35, 67, 85, 25, 69,170, 19,131,193, 16, 87, 84, 84, 20, 54,120,240,224,226,
+162,162, 34,116,232,208, 1,195,135, 15,135,139,139, 11,220,220,220, 48,114,228, 72,120,123,123,163,160,160, 0,175,188,242, 74,
+ 97, 94, 94,222, 96, 0,137, 22, 84,247, 81, 78, 78, 14,122,246,236,137,165, 75,151,134,189,248,226,139, 49,125,250,244, 41,109,
+215,174,157,218,221,221,221,119,211,166, 77,104,214,172, 25, 14, 30, 60,232, 42, 16, 8,246,214, 98,178,234,244, 34, 0,242, 42,
+ 13,143,190,198,107, 94, 3,235, 44,221,182,214,191, 45,120, 95, 77,179, 85,125,249, 83,215, 97,237, 39, 4, 88,178,251,224,247,
+ 90,190, 71, 27, 40,124, 58, 66, 44, 20, 66,196,231, 67,100,107, 15, 29, 77, 99, 87,114,142,186,156,144, 69,214, 94, 60, 53,191,
+ 8, 41,138,194,151, 95,126,105,234,209,163,135,246,194,133, 11, 91, 52, 26,141, 7, 42,178,202, 90,108, 10, 54,111,222,172,158,
+ 59,119,238,221,220,220,220,142, 66,161, 80, 95, 85,190,101,203, 22,245,164, 73,147,162, 51, 50, 50, 2,197, 98,177,186,174,241,
+ 89,213,141,150, 64, 32,208,229,230,230, 6, 77,157, 58, 53,246,171,175,190, 42, 23,139,197,144, 72, 36, 16, 8, 4,250,220,220,
+220,142, 51,103,206,188,187,102,205, 26,181, 72, 36,130, 68, 34,177,170, 91,142, 16,242, 39, 67, 85,189,220, 82, 76, 38,211,133,
+220,220,220,142,115,231,206,189,179,105,211,166,242, 42, 3, 84,189,142,235,214,173, 83, 75,165, 82,171, 34, 90, 85,239,147, 72,
+ 36,216,184,113,163,122,206,156, 57,119,115,115,115, 59, 10, 4, 2,125,181,242,242,217,179,103,223,201,205,205,237,104, 50,153,
+ 46,212,243,107,204, 92, 90, 90, 10, 14,135,131,232,232,104, 29,143,199, 3,139,197, 66, 66, 66,194,227,198,199,206,206,206,191,
+ 99,251,118,190, 63,236, 59,120, 81,196, 19, 8,122, 4,117,241, 75, 76, 73,205, 32,132, 74,105,160,170, 71, 52, 26,141,199,133,
+ 11, 23,182,244,232,209, 67,251,229,151, 95,154,234,138,108, 89,130, 78,167,187,120,251,246,109,163, 80, 40,164,178,179,179, 77,
+108, 54, 27,102,179,153,232,130,130,116,237, 55,109, 34,247, 63,248,128,146, 75, 36, 28, 30,143, 7,177, 88, 76,157, 62,125, 90,
+175, 86,171, 47,254,253, 70, 11, 98, 80, 16, 61,204,213,201,132, 44, 19,133,248, 35, 21, 38, 75,104, 3, 8,109, 1,161, 45,154,
+ 53,115,199,205,100,181, 12, 44,240, 97,182, 32,135, 24, 33, 18, 80, 16, 71, 43, 33,227,242, 69, 84, 78, 78,206, 99, 67, 84,181,
+120,181,241,195,237, 84,149, 20, 20, 17,128, 13,107, 82,144,132,217,219,219,115,178,179,179,255,164,233,239,239,207, 54, 26,141,
+150,167,118,201, 50,187, 2,244,172,248, 28,173,235, 47,119,203,125,222, 93,249,173, 72,100, 46, 6, 34, 54, 35,160,149, 27,222,
+ 29,215,137,255,241,177,188,128, 91, 41,234, 86, 96,147,204, 47, 15,255, 0, 0, 32, 0, 73, 68, 65, 84,233,160, 85,142, 86,212,
+179,183, 76, 38, 59,117,235,214, 45,177, 76, 38, 67, 98, 98, 34,130,130,130,176,115,231, 78,177, 88, 44, 62, 9,192,170,241,120,
+ 55,148, 72, 85,149,153,123,188,127, 48, 45, 39, 42,219,244,132,201,202, 43, 39,120,227,139, 99,197, 69,165,218,177,215,211,235,
+190,127,106,225, 78,113,113,113,232,162, 69,139, 10,242,242,242,158, 48, 89,169,169,169, 85, 95,138,253, 1, 52,248,227,247,127,
+191,157, 9, 92,177,108, 46,110, 69,196, 96, 72,216, 59,184, 29,245, 8, 31, 45, 28, 5, 27,185, 8, 23, 46, 92,192,232,209,163,
+177,116,233, 82, 36, 36, 36,224,167,159,126,162,118,238,220, 73, 93,191,126,157,250,226,139, 47,168, 6,134, 52, 76, 88,185,114,
+ 37,110,221,186,133,161, 67,135,226,210,165, 75, 40, 44, 44,196,254, 83,167, 30,238,125,248,240,163,170, 49, 91,117,164,126,168,
+ 21,185, 92, 62,127,229,202,149,136,136,136,120,172, 89, 80, 80,128,149, 43, 87,102, 0,120,203, 26,147,101, 77,187,212,161, 67,
+ 7,223,125,251,246, 93, 20, 10,133,130,160,160, 32,191,228,228,228, 12, 0, 41,141,208, 44,109, 74, 79, 85,126,126,254,213,157,
+ 59,119, 94, 31, 48, 96,128,120,242,228,201,142, 71,143, 30,181, 87,171,213,110, 2,129,192, 73,175,215,243, 31, 60,120,192, 62,
+116,232,144,203,253,251,247,147,181, 90,237, 77, 75,142, 71,110,110,238,205,184,184,184,193, 29, 58,116,120,176,101,203,150, 12,
+ 87, 87, 87,122,218,180,105,120,227,141, 55,224,232,232,104,222,184,113, 99, 90,159, 62,125,162, 31, 61,122, 20,162, 86,171,239,
+ 89, 88,215,239, 86,172, 88,113,101,223,190,125, 24, 62,124, 56,190,248,226, 11,236,223,191, 31,191,253,246,155,232,247,223,127,
+231,239,220,185, 19, 60, 30, 15,221,187,119, 71,104,104,232,192,202,238, 78, 75,191,151,110, 81, 20, 21, 78, 81,212,185, 26,175,
+183,234, 91,103,197,182,117,253, 93,239,251,106, 84,115,103,141,197,114, 38,180,194,167, 51,218,201,212, 87, 39,118, 39, 57,211,
+122, 19,229,120, 63,114,185,159, 29,153,218,154, 42,159,220,200,244, 14, 26,141,230,241,114,248,240, 97,226,226,226, 82, 46,147,
+201,172, 78,239,224,226,226,162, 44, 45, 45, 37, 93,187,118, 45,116,116,116,124,156,138,192,213,213, 85, 89, 94, 94, 78,186,119,
+239, 94,232,228,228,244, 56,189,131,187,187,123, 58, 33,132,120,122,122,102,213,165,103, 50,153,136,139,139, 75,213, 12, 61,174,
+157,157,221,182,110,221,186, 21, 42,149, 74,226,234,234,250, 56,117,130,163,163,227,218,160,160,160,154,229, 13,213, 55, 61, 35,
+ 35,131,100,100,100,144,230,205,155,103, 85, 47, 79, 77, 77, 37,169,169,169,196,221,221,221,234,244, 14,142,142,142,107,106,169,
+ 75,163,234,232,225,225,161,212,104, 52,164,103,207,158, 79, 28, 83, 15, 15, 15,165, 86,171,173, 42,183, 40,189,131, 72, 36,154,
+ 46, 20, 10,179,132, 66, 97,150, 64, 32, 88,222,162, 69,139,220, 3, 7, 14,144,141, 27, 55, 86, 77, 73,135,163,255,136, 30,109,
+122,190,246,145,163,255,200,249, 77, 73,239, 32,147,201,206,187,184,184,148, 31, 62,124,248,137,235, 75,163,209, 88,156,222, 65,
+ 36, 18,101,168, 84, 42, 90,169, 84, 26,175, 92,185,162,142,136,136, 80, 71, 71, 71,171,147,147,147, 53, 5,185,185, 6,165, 82,
+169, 41, 41, 41,209,221,189,123, 87, 39, 22,255, 51,233, 29,200, 78,239, 54,100,155,239,177, 71, 75,189,238,207,237, 43,214,222,
+ 91,214,145,144,159, 71, 19,114,242, 13, 66, 46,188, 79,110,238,152, 70,122,122, 9,204, 87, 22, 52,143, 39,219,125,126,177, 36,
+ 37, 3,217,217,190, 13,217,230,123,242,225,103, 94,247, 39,247,113,211,238,250,106, 35,185,113,227, 6,137,142,142, 38,137,137,
+137,228,228,145, 3,164,103, 43,113,133,230, 54,223, 99, 86,166,121,232, 37, 16, 8, 84,235,215,175, 39,215,175, 95,127,172,121,
+236,216, 49, 34, 22,139,213,128,101,179,150, 9, 64,145,109,254,163, 76, 95,249,252,254,241, 32,105, 89,193,137,247, 9,185,247,
+ 61, 33, 59, 3, 8,249,174, 27, 33, 7,134, 17,114,252, 53,114,125,227, 56,210,203,139,103, 36,219,125, 46,145, 29,254, 22, 15,
+182,231,114,185,165,135, 15, 31, 38, 89, 89, 89,228,210,165, 75, 36, 34, 34,130,196,198,198,146,180,180, 52, 18, 30, 30, 78,184,
+ 92,174, 22,141,120,108, 89, 55,103,120,134,180,229,101,223, 93,213,139,144,163,175,144,188,189, 19, 72, 88, 59, 89, 97,247,230,
+ 77,202, 71,215,201,222,222, 62, 63, 60, 60,156, 36, 39, 39,147,139, 23, 47, 18, 39, 39,167,124, 0, 22,143,151, 13, 27,210,135,
+ 16,253, 93, 18,220,183, 29,233,208,161, 29,233,215,171, 45,201,124,180,153, 4,117,110, 65,182,109,219, 70,148, 74, 37,105,209,
+162, 5,177,182, 98, 33, 33, 33, 55, 8, 33,145, 67,135, 14,141, 4,112, 58, 36, 36, 36, 50, 41, 41, 41, 50, 40, 40,232, 58,234,
+ 79,253, 80, 39, 3, 7, 14, 52, 16, 66,200,208,161, 67, 9,128,172,144,144, 16,146,148,148, 68,130,130,130,244,141, 57,120,150,
+180, 75,129,129,129, 61, 6, 12, 24,240, 81, 96, 96,224,124, 75,210, 59, 52,160,249,180,146, 80,179, 81,145,252,211, 31, 64,151,
+202,197,175,178,140,221, 4,205,215,184, 92,238, 46, 59, 59,187,223,108,109,109, 47,176,217,236,157, 0, 38,162,113,249,205, 88,
+149, 17,198,179,142,142,142, 9, 29, 58,116,208, 12, 30, 60,152, 12, 25, 50,132,204,154, 53,139,208, 52, 77, 14, 28, 56, 64,150,
+ 46, 93, 74, 90,219,219,155, 54, 2,249,219,129, 41, 96,168, 72, 88, 58,165, 21,117,241,213,150, 40,123,165, 37, 84,175,183,166,
+ 44, 73, 88, 26, 82,151,209,162,105,154,196,199,199,147,224,224,224,114,137, 68,146, 9,203, 19,150, 62,161,233,224,224, 16,225,
+228,228,244,167, 36,154,213,202,159, 72, 88,234,228,228,116,213,213,213, 85,233,232,232,120,187, 54, 77, 7, 7,135, 8, 87, 87,
+ 87,165,131,131,195, 19,201, 61,217,108,246, 80, 7, 7,135,204,154,229, 28, 14,103,128,147,147, 83,122,205,242, 58,246, 29, 46,
+ 46, 46,233, 89, 89, 89, 36, 47, 47,143,120,120,120,100,213, 52, 96, 57, 57, 57, 79, 24, 48, 75, 52, 27,170, 75, 61,117,172, 85,
+211,130, 99,218,152,243, 94,133,119,179,102,205,114,215,173, 91, 71,164, 82,233, 19, 83,158,125,250,190,190,248,198, 67, 85,233,
+ 27, 11,183, 29,168, 37, 97,169,165,201, 65, 7, 75, 36,146,204,224,224,224,242,248,248,120, 66,211, 52,161,105,186, 46,163, 85,
+155,230, 11, 93,186,116, 41,200,207,207, 55,151,149,149,153,210,211,211,117, 73, 73, 73,154,101,203,150, 25,242,242,242,180, 42,
+149, 74, 31, 21, 21,165,115,117,117,205, 3,240,130,181,231,168,145,132,212,236, 62, 35, 59,252,122,145,237,126,225,177,159,120,
+ 62,120,173,155, 68, 23,185,110, 40, 33, 23,222, 39,215,183,189, 65,122,120,241, 43, 12,209, 14,223, 83,228, 91,239,190,100,115,
+ 43,190, 69,154,187, 90,247, 33, 59,124, 79,221, 95,226,249, 96,116,103, 71,253,190,239,119,144,132,132, 4,114,236,208, 94,210,
+189,101,165,201,218,238,119,150,108,243, 11,182, 68,179, 54,179,245,205, 55,223,144,132,132, 4,242,203, 47,191, 88,106,178, 66,
+106, 51, 90, 31,134, 72,139,223,232, 38,212,189,210,137,175, 31, 25,192, 51,132,182,225,153,122,122,114,204, 29, 93, 89,180,159,
+ 35, 72,168,143, 72, 71,182,251, 92, 34,219,253, 6, 91, 90, 79, 62,159,159,134,106, 57,117,106, 46, 2,129, 32,175, 30,163, 21,
+210,160,217,242, 22,100,159, 95, 58,128, 12,239, 32, 43,176,208,100, 53,116, 45,117,114,112,112,200,255,238,187,239,136,179,179,
+115,158,133, 38,235,177,230,136,176, 80,146,250,232, 36,249,229,192, 74, 18,220,215,143,236,249,102, 46,185,113,233, 19, 50,108,
+ 72, 48, 9, 9, 9, 33,249,249,249,100,192,128, 1,196,218,122, 42, 20,138, 61, 42,149, 42,242,204,153, 51,145, 33, 33, 33,145,
+123,246,236,137,188,124,249,114,164, 88, 44,222, 83, 21,156,168,105,182,252,254,220,254,135,212,136,104, 69,150,149,149,145, 51,
+103,206,144,144,144, 16,178,103,207, 30,114,249,242,101, 34, 22,139, 35, 27,123, 31, 89,218, 46, 13, 26, 52,104,113,114,114,114,
+233,146, 37, 75, 14,212,146,176,212, 82,205,132,167, 84,207,167,210,134,252, 3,154, 50,145, 72, 20,121,247,238, 93, 82, 84, 84,
+ 68,218, 57, 59,147, 21,108, 54,201,224,241, 72, 22,143, 71,182, 1,133,255, 2,155, 52,173,174,174,195,191,154, 90,141,150, 86,
+171, 37, 11, 22, 44,208, 11,133, 66, 53,143,199,179,246, 17, 60,207,245, 69,232,224,224,112,213,217,217, 89,233,236,236,252,132,
+217,171, 94,238,224,224,112,251, 95,126, 3,122,243,120,188, 84, 46,151,251,228, 35,120,252, 71,244,104,221,107,242, 34,231,128,
+ 17, 67,154, 88, 79, 30,143,199,251, 80, 40, 20,170, 23, 44, 88,160, 87,169, 84,214, 24, 45, 0, 24, 36, 22,139, 51,119,239,222,
+173,121,248,240,161,177,176,176,208,116,227,198, 13, 99, 68, 68,132,254,211, 79, 63, 45, 19,139,197,153,168, 59, 45,193,223,114,
+ 60,201,230, 86,252, 42,179,117,111,145,103,236,240,118, 98,195,206,121,161,164, 71,139, 26, 38,171,238, 76,238,181,107, 86,154,
+173, 59, 31,123,196, 6,123, 75, 77, 43, 23,189, 75,186,183, 20, 61,105,178,172,208,172,105,182,196, 98,113,217, 39,159,124, 98,
+ 77, 36,235, 73, 67,184,203,199,131,236,240,221, 83, 97,162, 26, 88,182,249,124, 77,190,244,241,120, 86,238,163,110,206,240, 28,
+232, 45,136,177, 34,146,101, 73, 61, 59,217,218,218, 62,176, 34,146,245, 88,243,203, 47,183,144, 9,227, 7,145, 71, 15, 14, 19,
+ 85,193, 73,114,251,218,122, 50,102, 68, 32,233,222, 61,136,236,216,177,131,196,197,197,145,174, 93,187,146, 70,212, 51,116,198,
+140, 25,145, 73, 73, 73,145,137,137,137,145,151, 47, 95,142, 28, 53,106, 84, 36,128,208,234, 61, 65, 85,102,203, 48,102,140,174,
+ 19,139,245,110, 3,154, 47,207,152, 49,131, 36, 37, 37,145,196,196, 68,114,249,242,101, 50,106,212, 40, 2,235, 30,223,211,168,
+118, 41, 48, 48,176, 71,112,112,240,162,206,157, 59, 15,121, 90,154,255, 65,163, 37, 25, 61,122, 52,109, 54,155,201,144, 33, 67,
+204,155,128,226,157, 20,165,220, 73, 81,202, 29, 64,222,191, 61,162,245, 87, 63,240, 51, 4,192,185,234, 5, 66,161, 80,169,213,
+106, 29,165, 82,233, 17,149, 74, 53, 7, 21,211, 34,155,164,249, 87,212,147,209,252, 87,104,186, 74,165,210, 45, 42,149,106,148,
+ 80, 40,204,211,106,181,206, 86,104,218, 8, 4,130,119,133, 66, 97,176, 90,173,246, 6, 0,137, 68, 18,175,211,233,126,211,104,
+ 52, 27, 0, 20,255,211,251, 78, 54,183,226,131,207,239, 2,130, 15, 34,211,202, 91,174, 60, 83,232, 57,111,128,109, 90,207,214,
+146,100,112,233, 47, 64,233,110, 82, 83, 82,117, 86,107,138,168, 32,152,185, 31,220, 76, 81,183,248,226,215, 50,207,249,193,210,
+180,158,173,164,105, 32,248, 2, 2,245, 53,107, 53,107,154, 45,137, 68,178,187,188,188,252, 77, 0,191, 89,187,239,228,160, 31,
+ 15,229,198,102, 48,178,219,129,212,243, 8, 31, 66,212, 96,177,163,145, 3, 37,245,233, 3, 3,115, 31,213,174,249,213, 87, 91,
+201,185, 95, 79, 66,167, 46, 68,118,110, 41, 38, 76,124, 29,157, 58, 5,194,193,193, 1, 43, 86,172, 64,155, 54,109,176,116,233,
+ 82,170, 17,245, 12,149, 74,165, 19,124,125,125, 91,221,191,127, 63, 81,173, 86,255, 8,224,108,205,239, 31, 95, 32, 88,204,225,
+116,212,152, 76,151, 30, 0, 17, 13,104,190, 44,149, 74,231,251,250,250, 6,220,191,127, 63, 70,173, 86,175, 3,176,159,105,235,
+158, 15, 77, 22,139,181,193,211,211,115, 76,114,114,242, 7, 0,246,225, 63,196,223,110,180, 24, 77, 70,243, 57,212,172,186, 79,
+200,179, 86,207, 63,204, 22, 61, 7, 20, 90,130, 80, 25,224,209, 27, 27, 48, 89, 13,107,138,168, 32,152, 56,239,128, 66,115, 16,
+228,128,176, 54, 52, 96,178,254, 94,147, 9, 80,248,180,158,246,235, 83, 16,170,238,243,197, 92,243,181,176,120,241, 98,114,250,
+244,105,136,197, 98,104, 52, 26, 12, 30, 60, 24,159,127,254, 57,197,180, 33,140,230,223,168,249,175,132,195, 28, 2, 6,134, 6,
+ 33,207,106,197,168,183, 19,245,228,160,223, 45,228,179, 23,128,133,150,128, 41, 21,229,166, 28,234,237, 84,125, 19, 53,111, 32,
+159,154, 11, 54,188,193, 55, 61,130, 74,159, 67,189,213,120,205,191,224, 23, 34,193,167,207,238,121,121, 30,169,105,170, 34, 34,
+ 34,152,131,194,192, 96, 57,211,240,228, 76,195,199,255, 51, 70,139,129,225, 57,135,122,241,129, 1, 64, 70,229,242,204,106, 50,
+ 48, 48, 48,252, 7, 13, 23, 40,212, 61,160,205,154,144, 96, 99, 6,218,157, 99, 52, 27,165,201, 6,160, 0, 96,131,138, 28, 36,
+ 85, 83,122, 27, 74,179, 49, 4,128,145, 57,158,140, 38,163,201,104, 50,154,140,230, 63,172,217,144,246,243,216, 37, 89,219, 44,
+195,157,127,199, 7,135, 48,154, 79,149,193,255,154,125, 39,232, 8,130,141,149, 75, 71,230,188, 51,154,140, 38,163,201,104,254,
+231, 53,255,149, 48, 93,135,207, 23,194,231,182,230,132,184, 2,168, 74,114, 25, 13, 45,229, 11, 33,230, 2, 0,202,112,155, 16,
+ 60, 4,208,174,114,125, 58, 69, 89, 61, 27,149,129,129,129,129,129,225,159, 34, 16,192,109, 0,174, 0,134, 1, 8, 71,101, 86,
+133,127,212,104,137,236,219,186,130,195,234, 64,209,196, 23, 0, 8,139,138,133,137,142,210, 20, 60,108,242,151,172,212,205,219,
+142,128,127,144,130,254, 69, 85, 86,124,147,147,161,181,243,150,143,113,118,144, 77,200, 41, 40,217, 29, 19,167, 58,106,205,182,
+ 10,133,167, 66,104,103, 59, 78,103, 48,182,227,243,120,105,134,226,210,157, 69, 69,137,101,141,168,134, 93,125, 43, 63,253,148,
+ 80, 39,178,111, 83, 60,177,129,101, 47,231, 81, 42,168,136, 42, 91, 74,123, 21, 39,147, 67,135, 94, 36,214,158, 27,138,133,254,
+ 18,153,172,179, 64, 40, 14, 18,203,108,219,210, 4, 40, 84,102,166,232,141,166,203,102,189, 58,146,208,248,159, 21,231,106, 18,
+128,149, 0,128, 1, 3,206,161, 29,228,216, 80, 85,113,188, 53,224, 30, 38, 93,184,128,170,228,178, 31, 2, 88,197,220,183, 12,
+ 12, 12, 12, 12,207,153,209, 26,134,138, 46,195,134, 7,195,123,250,247,190, 37, 20,138,188, 0,128, 38, 4, 52, 1,202, 75,139,
+ 35,115, 18, 35, 6, 3,128, 67,139,192, 51, 92,161,188, 51, 77, 42,214,155,105,192,100,208, 38,151,166,222,232,106, 73,141, 36,
+142,222,163, 7,132, 12, 28, 19, 22, 54,204,167,125,187,246,173, 1,224, 94,244,189, 71, 39, 78,132,199, 93, 56, 71, 29, 46,207,
+139,255,165, 73, 1, 20, 8, 63,239,210,165, 83,239,136,136,219, 75, 1,204,106,234, 17,180,183,151,206, 57,251,243,130,190, 3,
+199,172,149, 0,214, 25, 45,161,157,237,184,145,195, 95,232,244,222,219, 51, 88,111, 44, 88,225,117,235,202,255, 86, 75, 93, 3,
+138, 9,109, 60, 91,174, 28,255,123,125, 15, 78,174,233, 31,235, 50, 88, 63, 22,158,102,109,252,174,135,173,166,240,209,120, 66,
+155,199, 83, 20, 5, 54, 95,124,200,177, 85,239, 3, 54,253,231, 21, 1,176,120,198,152,220,213, 63,196,201,213,253,240,248,215,
+223, 21,138, 21,206, 28,176,121, 0, 40,100,165, 60,192,133,253, 43,109,223,249,236,155,192, 43, 81,169,166,243, 63,111,213, 82,
+ 60,238, 24,117,246,253,134,251,211, 83, 83,109,224,233, 89,241,247,215, 95, 47,134, 87,203,123,168, 24,107, 6,172, 71,201, 15,
+ 89,104, 7, 84, 24,173,148, 20,216, 50,247, 44, 3, 3, 3, 3,195,115, 68,120,165,185, 10,175,185,162, 78,163, 37, 20,138,188,
+174,255,239,132,221, 47,151,211, 1, 0, 33,129, 46,248,104,217,150,208, 61,155, 35,226, 0,160,199,128, 48,239,165, 31,190,141,
+171, 49,185, 32,132,160, 83, 27,123, 12, 25,249,162,101,198,195,217,175,235,184,113, 99, 95, 93,176, 96,254,136,132,132,132,148,
+125,251,246,253, 14, 0,125,250,246,109,179, 98,197,138,151,214,218,218, 9,126, 58,244,115,166, 86,249,224, 86, 99,246, 86,232,
+214,170,153, 79,219,150, 19,126,250,118, 11,171,255,224,177,175,164,160,124,165, 54, 43, 49,211,146,109, 29, 28, 28,230,114,185,
+ 92, 5, 80,241, 52,246, 42, 12, 6,226, 2, 0, 38, 51, 45,179,117,243, 41, 99,243,132,102,129,128,119,191, 76,165,218, 93,154,
+249, 96, 87,125,154, 58,163, 49,224,157,183,166,176,238, 36, 22,192, 43,160, 15,123,227,202,143, 65,155,141,182,239,126,184,108,
+ 92,196,141,159, 80,174,196, 69, 11,119,141, 91,179,160, 89,179,238,236,207, 87, 74, 7, 81, 20, 94,243,236,241,250,168,165,223,
+ 31,226,118,105, 35,135,206, 72,227, 84,100, 65,143,109, 27, 62, 95,115,101,219,176,227, 0,118, 0, 56, 15,160, 65, 83,103,103,
+111,247,227,220, 69, 27,164,229,250, 63,102,123, 87,154, 44,124,189,251, 32,238,166,211,240,245,241,229,184,204, 93, 45,221,177,
+108,218,247,234,138,231,108,213,102,119, 91, 1,232, 5,196,218, 97,250,103, 3,241,195,170,229,112,114, 42,135, 76,150, 6, 10,
+206, 0,218, 86,190,241, 33, 63, 31,233, 0, 62,204,205,133,100,233, 12, 12,190, 3, 44,236, 8,228, 2,184, 66, 89,246,212,120,
+ 6, 6, 6, 6, 6,134,127,138,108, 60, 57,248,125,103,131, 70, 11, 0,164, 34, 14,226,146,114, 0, 0, 54, 34, 96,206,244,201,
+ 40,200,207,243,214,155,104,188, 62,121, 34,110,199,102, 35, 46, 57, 15,132, 16,120,187, 91,252, 16,110,176, 65,119,121,125,234,
+235,253,206,156, 61,123,115,241,162,197, 63, 80, 20,174, 1,192,142,157, 95,247, 88,242,201,146, 55, 39, 78,158, 56,232,208,161,
+ 67, 49, 0, 26,101,180, 56,148,108,203,154, 85,203,249, 25,249, 90,237,220, 5, 31,208,243,231,205,221, 8, 96,172, 69, 78,134,
+203, 85,100,100,100, 72, 89,172, 39,159,165,249,197,242, 15, 46, 13, 26,179,246, 97, 74, 90,241,157, 51,199,142,117,245,247,247,
+ 71, 70,102, 78,175,213,155,182,119, 60,117, 70, 52,165,172, 84, 51, 70,157,255,160,214,135, 54, 11,184,220,152,207, 86,111,235,
+ 68,219,180, 97,125,244,230, 80, 4,180,118, 67,102,110, 49,250, 14, 30,193,137,188,117, 43, 20,176,216,104,213, 76, 30, 56, 78,
+ 79,231,118, 92,177,251,198,192, 81, 61,221,186,176, 88,108,168, 52, 70,228,149,232, 96,166,129, 62,126, 10,188,176,103, 19,167,
+176,220, 56,122,217,207,233,163,175,109, 14, 83,106, 75,178,102, 3, 56, 92,255,199, 16, 59,119, 39, 57,226,210,203,106, 53, 89,
+229, 90, 19, 0,128,199, 54,131, 2,177,175, 71,168, 23,128,239, 0, 95,224,215,217,175,194,217,121,159,179,179,243, 56, 39,103,
+151, 72,239, 87,167, 80,205,188,252,100, 42,141, 1,247, 99,238,149,249,119,142, 38,101,133,185,239,106,203,139, 14, 61, 0,162,
+125,129, 3,149, 26, 83,192, 24, 45, 6, 6, 6, 6,134,103,155, 58,103, 29,114, 0,224,196,137, 19, 36, 44, 44,236, 79, 25,128,
+205,102,130,184,228,138, 33, 56,108, 54, 27,195,122,183,193,198,213,159, 65,163, 55,225,110, 82, 9,126,185,154, 14,125,121, 49,
+ 8, 33,200, 15,112,170,237,131,159,232, 82, 90,187, 82, 20,200, 22,112,199, 95,185, 33,105, 97,103,107,107,251, 48,230,135,242,
+ 37,243,148,126, 28, 98,136, 92,246, 69,155, 36,158, 29,167,231,193,131, 7,252,135,135,133,241,165, 82,217,251,132,211,209,157,
+ 91, 78,230,151,148, 68,149,212,165, 89, 19,145,147,239,136, 17,195, 94, 24,224,226,226, 76,191,186,226, 70,236,150,217,129, 30,
+109,219,180,237, 21,103,212,140,208,228, 62, 60, 86,199,102,143, 53,105,154, 6,139,197,130, 82,169,132,217,108,134, 78,167,131,
+209,104, 68,122,122,138,146, 38,196,221, 12,154,229,234,234, 14, 14,135, 15,175, 22,158,216,182,113,165,120,207, 79,199,130, 22,
+ 46,254,252,168, 58, 31,221,241, 71,114,203,199,154,218,194,162, 67, 39, 79,159,117, 36,184,224,246,209,155, 67,217,185, 69, 42,
+ 92,184,149,128,219,247,211,173, 61,145, 53, 83, 56,180,200, 76, 77, 40, 93,187,118, 45,123,233,169,132,244, 1, 67,198,154, 61,
+ 91,119,104,161, 51, 19, 0, 20, 4, 60, 14,120, 28, 22, 60, 29,133, 56,242, 65, 59,220, 24, 25,229, 28, 26,232,184,129, 16,114,
+184,190,227,169,211, 25,205,189,125, 37,236,142,173, 20,136,122, 84,132,155,167,174, 97,238,162, 13,136, 72,210,161, 76,165, 6,
+101,214,129, 77,116,200, 79, 77,132,201,108, 38, 13,157,247, 10, 2,139, 0, 64, 32, 16,124,248,203,241,211,110, 58, 90,136,156,
+ 98, 29,148, 69, 58,180,233, 62, 70,146,154,153,135,239, 62,123,233, 67, 0,135,124,129, 50,203, 52,155, 12,163,201,104, 50,154,
+140, 38,163,249,140,104,214,229, 69,158, 19,234, 76,229,192,170,111,171, 71,233,133,136, 75,202, 65,103,223,102,104,221,194, 21,
+ 55,227,139,240,227,133,116,124,115, 38, 21, 23,238,230,129,230,200,144, 83, 10, 60, 76, 81,226, 97,106,126,131,249,179,217, 2,
+238,248,119,222, 41, 89,208,222,191,180,251,255, 78,205, 65, 51,199,135,254, 11, 23, 22,207, 97, 11,184,227,109,155,203,246,125,
+176,224,221, 9, 50,177,152,175,215,233,209,170,165,167,240,237,217,115,166, 80,182, 2,139,159,137, 36,107,230,103, 43, 16,137,
+118, 45,251,244,125,193,134, 95, 30,166,149,235, 81,126,248,154, 50,113,254, 7, 75, 10, 57, 92,225, 54, 89, 51, 63,139,199,254,
+ 24,141, 70,232,116, 58,232,245,122, 24, 12, 6,100,166, 63, 24,113,254,151,247, 6,183,108,110, 55, 88, 32, 20,130, 0, 40,213,
+152,144,148,173, 70,240,192, 65,236,206,129,129, 1, 82, 87,191,169,181,105,149,148,164,150,208,132, 45, 59,113,100, 47,251,192,
+175,119,240,195,137, 91, 56,250,219, 29,220,188,120,202, 68,104,227,227,231,127, 73, 93,219,120, 75, 93,219,167, 74,221, 58, 40,
+ 31, 47,205,218,213,155,158,153,205,102,145,224,129, 33,231,166,207,122,251,127,234,178,130,220, 93, 91, 62,203,204,203, 74,121,
+ 32,224, 81, 38,177,128, 13,149,214,132,239,207,103, 97,220,202,187,184,159,166, 2, 33,164,193, 7,120,211,192,188,241, 83,223,
+ 51, 27, 13, 6,248,120, 72,177,119,231, 42,140, 8,238,136, 1,237,109,209,181,181, 4, 98,142, 14, 49,177,113,216,191,247,123,
+ 19, 77,179,230, 55,112, 35,190, 80,185, 68, 2,128, 74,165,122,111,225,251,243,243,244, 38, 26, 6, 35, 13, 67,229,235,249,253,
+ 95,228,153,181,234,247, 42,183,139,172,182, 29,243,136, 7, 6, 6, 6, 6,134,231, 33,162, 85,181,184, 86, 95, 81,103,215,161,
+ 86,171, 73, 30, 59,126, 34, 92,157, 92,164, 35,251,191,198,139,124, 84,140,188,236, 84, 36,196, 71, 67,173, 53,130,103,219, 18,
+ 16,186,160,133,151, 39,162,226,142, 26, 54,175, 9, 87,209, 38, 93,114, 93,122, 35, 70,184,186, 39,196, 82,172, 53,171, 61,174,
+199,199, 21,117,222,187,232, 59,188,250,170,212, 97,205,106,143,235, 41,137, 18,150, 88, 72,122, 78,153,252, 10,197,162, 8, 22,
+ 46, 92,128,145, 97, 47,224,245, 41,147,168,221,187,191,239, 94,108,225, 94,210,224,126,249,225,199,159,241,149,197, 38,253,205,
+120,149, 78, 44, 17,137,174, 60, 84,149, 7,120,121,136,134,142,121, 45, 43,252,224,174, 13, 0, 38, 91,162, 85,101,176,140, 70,
+ 35, 12, 6, 3, 0,152, 1,128,197,170,120, 45, 40,211, 35,183, 88, 7,101,177, 14, 38, 51,141, 49,227, 39,139,110, 69,220,157,
+ 12,160,142,241, 90, 52,109, 52, 25,113,248,215,219,200,188,117,136,166, 88,236,146,106,131,225, 33,117,109,227,237,226,226,113,
+ 41,108,204, 36, 71,190,176,162, 27,182,172, 92,135,221,219, 87,215, 91, 79, 22, 69, 17,218,108, 42, 54, 25,141,229,173, 90,182,
+202,244,245,239, 40,188,252,191, 51, 35,174,156, 59,172, 50,181,154,100,243, 40, 37, 27,108,174, 0,108,158, 16, 58,131,101, 19,
+ 15,149, 9,215,183, 2,160,166,206, 92,176,241,221,247, 62, 98,207,219,252, 59,244, 90, 53,116,154,114,148,150, 20, 65,196, 49,
+ 34,230,234, 49, 19, 49, 27,223, 45,207,190,179,181,110, 37, 42, 11, 64, 86,245,146,194,194,194, 11, 87,127,191,116,252,198,213,
+223, 95,119,105,213,153,165, 55,210, 72,136,190, 65,103, 62,140, 56,174,211,149, 94, 0, 0, 10, 40, 0,112,134,185,111, 25, 24,
+ 24, 24, 24,158,195,136,214,180,234,101,117, 26,173,212,251,151,187, 2,128,119,151,208, 2,169,144, 99,199, 97, 81, 80,102, 60,
+194,238,181,115, 65,211, 4, 67,223, 92, 3,153,151, 11, 68, 60, 54,116,170, 2, 85,225,163,139,245,141,213, 1, 69, 25, 7,109,
+221,145,233, 53,243,173, 86,242,189,123, 85, 92, 0,216,187, 87,197,125,107, 70,115,249, 87, 59,146,189,186,245,238, 12, 98, 54,
+ 35,108,228, 88,140,127,121, 60, 82,114,212,248,249, 82, 26,202, 53,122,139,102,203,137, 28,124, 59, 58,216, 59,190,240,206,107,
+ 47, 72, 56,108,138,106,235,169, 96,167,231, 25, 77,108, 54,215,124,252, 86, 73,214,152, 49, 47, 59, 92, 56,121, 96,128,217,193,
+183,163, 38, 63,246,110, 67,122, 58,157,238,137,174, 67, 59,135,150, 39, 7,141, 93,155,145,157, 83, 22,158, 83,164,237, 86,110,
+ 52, 65, 89,172, 67,110,177, 14,197,229, 6,184,200,108, 97, 50,234,219,215,165, 71, 8,249, 97,212,216,137,147, 0,176, 40,150,
+233, 59, 85,118,108,124,197,154, 63, 76,214, 11, 35, 95,117,188, 20,249, 8, 9, 17,167,138, 8,109,170,200,226, 78,209, 25,245,
+ 31, 87, 16, 54, 5,154,199,161,140,108, 22,139, 54, 24, 84, 70, 39, 39,199, 11, 23, 47,156, 30,174, 53, 37,130,205, 19, 60,126,
+175, 70,111,182,248,138, 81, 38, 92,255, 18, 0, 54,109,222,184,174,231,160, 87,121, 23,111, 39, 67, 99, 4,122, 4,122,227,200,
+ 79, 95,235, 8, 49,190, 87,158,125,231, 75, 43, 46, 66,155,230,205,155,207,229,242,249, 3, 68, 98, 89,115, 71, 87, 15,150,193,
+100,134,193,104,134,196,190, 25, 75, 32,181, 27, 68,179,120,151, 77, 6,253, 5, 67,121,222, 38, 0,197,204,125,203,192,192,192,
+192,240,156, 69,181,128,106, 57,180,158, 48, 90, 39, 78,156, 32, 0, 80, 91,255,104,166,178, 16,246, 82, 14, 28,221,188, 48, 97,
+238, 58,252,176, 97, 30,204,102, 35, 8, 1, 76,102,203, 50, 19, 16,194,253,117,214, 91, 94,190, 45,188,216,142, 19, 94, 21,107,
+126,220,171, 22, 77,120, 85,172,105,215,222,190,100,214, 91, 94,201,101, 90,143, 94, 38,179, 25, 87, 98,114, 17,157, 92,130,232,
+148, 82, 72, 69,150,167,249, 98,243,121,111,173, 94,181,146,199, 97, 83, 84, 76,170, 74,149, 81, 96, 82,177,185, 92,131, 88,196,
+ 39,122,194,209,165,228,147,130,129,163,166,104,142,239,217, 52, 21,192,236, 58,163, 98,149, 51, 13,171, 34, 89, 85,175,132, 16,
+ 66, 1, 52, 77,153,205, 25,249, 90,168, 12, 70, 40,139,254, 48, 90,148,169,238,158, 83,169,107, 27,111,185, 76,122,154,205,102,
+ 11, 8, 1,140, 6,211, 75,112,109, 51, 88,149,157, 16, 95,221,100, 93,143,201,194,163, 59,231,148,102,131,122,162, 58, 55,238,
+188,165,251, 78, 81, 32,108, 54,104, 54,139,162, 41, 10, 52,151, 69,244, 32,132,174, 89, 35,181, 21, 70,171,202,108,241,185,236,
+ 69,103,247,111,112,122,125,152, 31,126,186, 84,225,249,180,101,121,165,229,153, 86,153, 44,216,219,219, 79,126,255,253,247, 63,
+ 25, 49,246, 85,148,104, 41, 40,139, 42,162,129,122, 35, 13,158,196, 1,131,102,125,219, 60, 59,175,180,121,194,205,227,189,242,
+239,236, 45, 49,106, 75, 54, 50,247, 44, 3, 3, 3,195,127,139,250,188,200,115, 20,213,250,115, 68,171,190, 29, 34, 4,120,152,
+154,143, 22,238,142,112,111,209, 26,241, 15,162,254, 88, 7,192,100,182,172, 59,234,216,177,236,140,117,235,228,244,188,121, 37,
+ 61, 86,175,246,184,246,214,140,230,138,118,237,237, 75,222,127, 63,173,199,250,245,138,107,191, 94,231,154, 73,101,190,174,170,
+220, 92,132, 88,147, 99,147, 21,212,209,191, 37,251,179,189, 15,211,206,223, 43,203,229,241,120, 70, 23, 91, 33, 37,147,242,217,
+108, 22,151,175, 51,178,116,222, 1,129,236,227, 44, 42,176, 62,149, 42,163, 85,179,235,176, 32,239,209,136,179, 63, 47,104,215,
+127,212, 26,187,204, 60, 13, 74,244,236,199, 93,135,108, 22,133,123, 15, 82, 1, 54, 47,186, 54, 77,185,204,238,204,190, 31,127,
+240, 88,191,122, 57, 12, 38, 51,102,205, 91,140, 41,147, 39,158,129,107,155,193, 30, 94, 62,145,191, 31,255, 78, 60,120,198, 54,
+164,198, 69,228,152,116,165,251,173, 49, 89,143,205, 22, 64,204,132,102, 21, 22,149, 74,117, 38, 8, 81,139,239,211, 25,232, 70,
+ 93, 57, 42,141, 9,199,111,228,224,196, 47,251,161,144, 73, 26,165,161, 80, 40,252,250,246,237, 7,138,195,135,222,168,131,222,
+ 68, 67, 95,109,140,150,193, 72,195, 72,184, 16,187,118, 64,225,253, 35,126,208,150, 48, 45, 14, 3, 3, 3,195,127,136,231,120,
+ 32,124,117,115, 85,119, 68,171, 62, 60,221,157,113, 35, 58, 25,237,125, 91, 66, 33,151,253,159,189,243, 14,143,162,106,219,248,
+ 61, 51,219, 75,122,178,105,132, 18, 74, 66,239, 16,122,135, 72, 21, 20, 41, 34, 40,210, 44, 40, 2,138,138, 74,135, 23,105,130,
+136,210, 68,122,239, 85, 8, 85,233, 53, 1, 18, 72, 37, 61,187,105,219,235,204,124,127,108, 2, 1, 82, 54,128,223,171,190,231,
+119, 93,123, 37,179,217,189,115,166,157,185,207,115,158,115, 14,238,199,167,129,161,133,160, 41,192,238,112,221, 12,241, 54,251,
+246, 37, 75, 60,144,146,164,160,127, 90,149, 84,227,195, 9, 53,146,150, 44,241,184,200,219,236,219, 1,140,224,121,192,105,182,
+156,134,139,173,132, 47,224, 57,123,136,191,183,156,185,150, 96,200,165,105,198,226,227, 33,229,124, 60, 36,180,143,155, 88, 40,
+ 18, 50,156,131,167,109, 85, 84, 53,204, 60,199,185,178,174,222, 83, 93,135, 44,203,130,162,104,182,200,136, 41, 82,115, 77, 40,
+ 52, 51,200, 46,176, 32, 95,103, 67,157, 96, 5, 78, 70,237, 50,178,118,211,150,210,180, 24,161,200,163, 86,141, 42,248,106,246,
+ 18,152, 44, 44, 30,164,235, 33,146, 72, 2,252, 3, 26,220, 26,241,193, 52,201,196,213,241, 24,221,213, 7,159,157,143, 79, 55,
+102, 75,167, 85,230,204,178, 44, 11,147,217, 42,202,214,228,123,105,117, 6,119,153, 84, 98,242,243,246,208,148,246, 89,115, 37,
+ 35, 90,197,200,165, 2,244,139, 8,128,217, 54, 12, 38,139, 3,127,158,218,243, 34, 50,161,254, 65, 85,160,183,150, 48, 87, 69,
+102,171,164,233, 18, 42,253, 0, 80,161,164,202, 33, 16, 8, 4,194, 63,136, 50, 71, 29,186,100,180,148,114, 41,120, 70,138,243,
+215,227, 17, 94,191, 49, 54, 28,184,130,218,141, 34,144,169,115,128, 7, 93,225,104,195, 98,166,124,105,186, 1,224, 70,255,254,
+242, 42, 3, 7, 6,247,224,121,225,239,171,126,209,166, 1, 64,104, 67,167, 12,199,241,224,121,128,231,156,134,203,245,144,142,
+ 32, 37, 41, 83, 91,189, 70,128, 2,119,211,108, 22,133, 68, 68,123, 41,196,140,159,135, 88, 36, 18, 8,192,242,148, 37, 51, 51,
+222, 66, 1,201,174,200, 61,219,117, 40, 87, 6, 30,233,246,250,247,234,228, 71,133,215,234,228, 25,155, 20,218,196,224,121,160,
+ 78,176, 2,209,151, 14,179,217,233, 15, 31,152,178, 99,127, 46, 77,139,227,192,216, 28, 28,110, 37, 20,162,192, 96, 71,129,222,
+134,118, 93,250,137,218,117,239,143,243,209, 26,112, 14, 59, 22,174, 57,172, 99,121,251, 16,224,158,189, 18, 59, 77, 95,190, 17,
+ 83, 69,157,111,144, 8, 5,130,130,186,181,171, 37,138, 69, 66,135, 86,171, 21, 63,253, 41, 6, 10,153, 24,121,122, 59, 0,216,
+ 43,123,245, 20, 26,236, 56,112, 41, 11, 7,247,108,133, 76, 38, 3,255, 2, 87,160, 72, 36,242, 20,138,164,176, 25,156,221,133,
+197, 47,219, 51, 47, 90, 32, 1,104,129, 39,185,103, 9, 4, 2,129,240, 15,162,228, 26,135,125, 74,154, 47,218,165,168, 9,199,
+195,215,199, 27, 82,133, 59,146,178,109,208, 81, 42,228, 27,121,176,172, 51,162, 85, 78,224,169,212,213,189, 15, 28,200, 76,219,
+191, 95,179,238,192,129,204, 18,137,222, 79, 34, 89,143,127,114,188,203,154, 20,207,158, 60,112,244, 76, 97,255,214,126, 94, 52,
+195,152, 68, 66,218, 34, 16, 49, 54,145,128,182,139, 4,180,213,223, 93,200,156, 57,184, 77,204, 83, 56, 83,145,166,217,108, 70,
+247,238,221,209,187,119,111, 12, 24, 48, 0,131, 7, 15, 70, 88, 88, 61, 21,205, 80, 86,158,226, 56, 63,177, 14,181,252, 40, 8,
+204,169, 56,181,237, 63,198,232, 63,246,221, 98, 45,230,126,120,218,114, 62,209,228,121, 46,175,208, 2,179,141, 69,190,222,134,
+124,131, 13, 14,191, 54,216,247,103, 6, 76, 86, 22, 41,215,119,153,212, 89,105,159, 88,114, 30, 38, 85,112, 42,190,120,122,147,
+ 79,123,255,189,145,106, 55, 41,253,176, 67,219,150,106, 95, 31,111, 7, 69, 61,137,188, 82, 20, 5,169,187, 10, 94,158,110, 72,
+186,113, 20, 39, 22,118, 51, 1,248,218,149,227, 89, 18,119,185, 0,253, 91, 7,160,223,160, 97,104, 20,209,203, 21, 99,253,156,
+166, 92, 46,151, 21, 71,175, 74, 78,235, 96, 45, 17,213, 98,139,206, 55, 45,144,200, 92, 61,239, 47, 9,209, 36,154, 68,147,104,
+ 18,205,191,143,230, 63,153,226, 53, 14,139,127,186, 54, 51,124,177, 1,170, 25,168, 64,237, 96, 5,204, 54, 21,204, 86, 22, 6,
+ 51, 11,173,209, 6,173,209,142,164, 44, 35,162, 15,188,124, 9,157, 81, 44,231,212,231,188,115,190, 77,176, 28,239,114,244, 68,
+108,179,206, 94,188,112,222, 91,219,154, 53,181, 78,236, 19, 24,114, 59,201,154, 65, 81,180,137,102, 4,118,111, 55,129,240,254,
+253,219,234,139,231,142,116,148, 58,216,119,140,229,232, 56, 28,142,194,224,224,224,162, 72,212, 19, 11, 89,175,150,108,192, 31,
+135,191, 8,237,212,127,161,223,210,185, 83,140, 52, 35,226, 40,129, 40,154,181,155,182,154,178, 99, 87,161, 28,251, 65,139,164,
+247, 46,223,188, 27,225,233, 29,130,135,233, 6, 24,204, 14,216, 28, 28,188,148, 34,164,221, 57,110, 75,186,127,109,135, 62,227,
+246,134, 23, 56,108, 91,226,238, 69, 87,137,140,236,245, 70, 68, 68, 27,230,219,111,191, 65,120,120, 56, 76, 38, 19,104,154, 70,
+ 72,245, 90, 72,138,187,137, 75,135,103,179,198,220,228,159, 1,204, 2,160,174,236, 63,209,104,173, 56,122, 45, 7,135,247,110,
+ 7, 35, 20,191,200,233,165,101, 50,153,180, 52,115, 85,210,116, 61,254,176, 80, 44, 45,106, 4,112,228,222, 37, 16, 8, 4,194,
+ 63,132,177,207,252, 92,237,146,209, 50,155,205, 73,237,187,247, 3,199,241, 96,121,128, 99,139, 34, 79,220,147,232, 19,107, 55,
+ 39,189,108,233, 56,142,189,242,227,234,117,189,155,181,234,196,212,175,170,132, 54, 55, 11,151,254, 56,237, 0,199, 95,116,229,
+251,185,185, 15,244, 50,255,218,111,188,245,230,192,157, 35,223, 27, 95,208,177, 75, 23,133, 74, 21, 96, 73, 75, 79, 51,174,223,
+180,217,126,252,200,254,142, 28, 28, 67,115,115, 31,234,203,211, 41, 44, 44,252,161,180,247, 37, 98,101, 59, 0,161,140,128,178,
+154,212, 15, 42,149, 17,174, 73, 79, 29, 52,111,246,140,228,225, 99, 38,137,107, 6,215, 66, 78, 33,131,164,180, 44,220, 63,183,
+223,146, 30,119,117,175, 54,237,198,104, 23,165, 50, 75,121, 47, 13,192,210, 75,151, 46, 54,136,140,140,236,213,181,107, 87,126,
+236,216,177,224,121,224,212,234, 9,124, 94,210,165, 93,112, 70,177, 18, 94,240,188,164,156,187,120,211,123,112,199, 22, 2, 31,
+183,209, 88,183,253,136, 29, 60,151, 82, 73, 25,255, 42, 85,171, 11,156,221,133,206, 41, 29,158,125, 89,237, 79,242,199, 68, 74,
+127,129, 17,209,254,101,236, 47,129, 64, 32, 16, 8,127, 55, 94, 60, 71, 43,245,158,115, 62,173,191, 26, 93, 86,206,136, 13, 27,
+ 54,206,217,184,105, 91, 59,179,213, 26,204, 67,148,202, 58,172,103,245, 44,190,117, 85,195,148,253,240,154,143, 79,157,134,235,
+215,252,248,245,250,117, 63,117, 2,199,214,165,128,100,158,194, 25,169,157, 29, 89,145,201, 42,215, 44,105,116,191,244,120, 99,
+145, 41, 55, 87,191,177,178,223, 53,229,198,102,209,140, 45,228,151,101,179,191,167,105,166, 39,203,114, 66,142,181, 63,100,109,
+230,255,152,212,177, 7,224,114,150, 27,242,202,249, 91, 12,128,152,168,168,168, 14, 81, 81, 81,173, 0,252, 0,231, 26,138,215,
+ 94,230,188, 88,114,117,221,166, 78,153,122,106, 50,168,106, 28,199,195,193,114, 41, 34,147,177, 91, 37,101, 66,106,214,172, 37,
+183,217,217,231, 18,224, 75, 38,194, 63, 54, 90, 30, 85,228, 0, 66,136,209, 34, 16, 8, 4,194, 63,132,177,120,126,210, 82,215,
+ 34, 90,255, 95,228,231, 39,232,144,143,137, 47,171,147,155,251, 64, 15,224,185,145,123,198,151,212,141, 59,240,254,158, 0, 0,
+ 32, 0, 73, 68, 65, 84,126,160,221,141, 7,218,221, 47,250,125, 67, 78,162, 26, 72, 28,249,146,197,112, 37,145,253,124,209,235,
+149,160,209,220, 51, 64,131,214, 47,123, 90,182,108,222,116,127,219,182,237, 66,158,102,132, 28,207,136, 28, 60, 37,116,112,148,
+208,110,231, 96,177,217,237, 54,135,195, 14,214, 97, 3,199,218,121,206,102,135,115,118,120, 2,129, 64, 32, 16,254,201,134,235,
+239, 99,180, 8,255,106, 18,226, 31,198, 69,144,195, 64, 32, 16, 8,132,127,185,201, 42,249, 19,128, 51,247,188,172,145, 3,149,
+ 89,204,247, 69, 70, 31,156, 36,154, 47,173, 41, 4, 32, 6,160, 4, 80, 81,151,102, 47, 20,173,215, 72,142, 39,209, 36,154, 68,
+147,104, 18,205,255,162,102, 69,218, 39, 65,248, 75, 13, 24,209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,247, 52,255,201,140,
+ 45,229, 5,128,116, 29, 18, 8, 4, 2,225,127, 16, 31,159, 58, 74,224,113, 94,111,133,200,125,235,249, 3,128, 81,115, 47,155,
+ 28, 61, 66, 41,148, 92,231,240,169, 28, 45,250, 5, 5,133,180, 64, 60, 85,238,230,115, 79,225,225,147,254, 63,126,112,169,176,
+234,138,143,123,116,172,177, 47, 60, 84, 54,160, 50, 95,148,251,133,253, 26, 80,171,245, 35,133, 42,236, 99, 4, 54,147,189, 76,
+ 33, 20,170, 80, 63,101, 72,139, 63,220,130, 27,188,246, 23,236,163,164,126,253,250,109,234,215,175,223, 6,128,228, 85, 8,202,
+ 85, 97,195,170,212,142, 56,167,170,217,244,180,194,191,206,155,175,186,192,202,192,218, 62,202,144,230,187,149, 65,141,243,149,
+129,141,181,202, 42,205,207,186,249,214,171, 89,209,247, 66,250,207,171, 59,115,107,244,214,144,254,243,234,150,246,119,175,200,
+229,110,223,109,123, 48,215,167,223,127,148,164, 94,121, 49, 66,218, 13,243, 12,236, 52,217,167,178,223, 11, 14,139,136,169,222,
+160, 67, 78, 80,157,214,209,174,126,167, 74,120,155, 27,213,234,183,203,174, 18,214,230, 26, 57,242,174, 33,245, 11,109, 35,245,
+170,122, 88,226, 85,245,136,196, 59,180,203,203,234, 5, 6, 6,202,234,214,173, 27, 25, 17, 17, 49,174, 91,183,110,159, 54,109,
+218,116,108,181,106,213,122,254, 55, 27,250,114, 85,216,151, 22, 33,165,177, 8, 41,141, 92, 21,246,101,197,245,107,248, 28,138,
+102, 51, 40,154,205, 80,168,194,231,252, 93,206,149,196, 63,172,154, 92, 21,182,196, 45,160,254, 21,153,170, 78,191,202,126,223,
+203,203,171,167,159,159,223,235,197, 47, 47, 47,175,158,228, 14,120, 97, 74, 70,177, 94, 58,162,197, 8, 37,242, 11,195,223,251,
+176,225,130, 25,211,164,203,214,237,195,178,185, 83,238, 90, 12, 5,245,255,142,123,238, 27,218,234, 26, 67, 51, 85, 74,190,199,
+114,108,154, 38,241, 74,139, 87,161, 31, 94, 93, 54,250,235,207, 71,124, 54,236,173,238,213,186,247,253,132,138, 77, 52,237,119,
+221,162,161,201,142,221,123, 67,206,157, 57,189,124,221,186,213,179,212,142,240, 37, 66,137,224, 71,109,106, 76, 65,101,202,224,
+238, 87, 51, 84,160,240, 61,215,126,192,135, 1,215, 79,110,222,192, 90,185, 30, 70, 77,137,213,191, 95, 28,191, 90,181,106,181,
+100, 24,198,231,227,143, 63, 22, 1,192,210,165, 75,107,179, 44,155, 27, 31, 31,127, 21, 47, 48,249,169,211, 96,134,143,248,225,
+251,153, 27, 95,123,173, 55, 50, 52, 6, 44, 92,178,178,243,177, 67, 59, 6, 27,178, 31,236,122, 21,231,196,211,179,134, 59, 68,
+110,119, 62,249,124,150, 42,178,115, 75, 70,111,118,224,216,185,155, 29, 54,175,156,117, 5,168,215, 74,167,185, 87,230,156, 98,
+156,177,112,186,191,146,143,228,140,133, 0, 48,236,185,135,189,210,222,221, 79,198, 70, 6, 74, 4, 55,115,129, 10, 23,125,244,
+172,222,238,184, 80, 34,169, 70,211, 52,104, 10,160,105, 10, 12, 69, 57,215, 9,181,153, 82,210,239,159,239,245,119,184, 79,220,
+170,182,202, 2, 35,240,161,169, 39,229,163,232,162,159, 60,175,205,122,112,193,231, 21,252, 27,143,134,181, 61, 27,180,171,109,
+ 88,127, 54, 49, 79, 33,232,248,233, 97,138,167,127,122,116,126,201, 45,151, 12,128, 84,234,117,240,224, 65,191,200,200, 72, 15,
+ 85,131, 1,103, 93,249,142,152,209,215, 63,116,232,128, 40, 50,178, 87, 37,174,207,176, 30,160,233, 77, 20, 32,228, 56,126, 41,
+195,241, 59,244,185,113,241, 64,229, 86,159,146,169,194, 71,211,224, 93,174,103, 56, 80,215, 76, 57,177,235, 94,244,224, 10, 36,
+238,221,132, 34,209,167,161, 97,141,154,165, 39, 63,188,102,208,235,150, 56, 44,133,103, 43, 45,100,119, 76, 61,121,254,250,107,
+ 2,161,144,138,236,214,154,177, 0,167, 95,230,164,251,251,251,191,190, 98,197,138,154,109,218,180, 1, 0, 56, 28, 14,247,157,
+ 59,119, 6,204,158, 61, 91, 17, 23, 23,183,231, 5,101,131,253,252,252,170,138,197,226, 96, 0,176, 90,173,233,106,181,250, 17,
+128, 10, 27,254, 10,255,154,190,224, 49,235,252,185,115, 2, 0,232,208,161,227,156,170,237, 63,242, 98, 68, 74, 83,169,135,195,
+170, 83, 20,196,159,158,116,233,242, 69, 10, 0, 34, 90,183,153, 38,247,173,247,227,127, 51,178, 37, 85,133,183,166,129,207, 34,
+ 58,116, 31, 52,100,232, 8,186, 65,157,170,232,217,163,235, 23, 38,224, 96,165,174, 25,129, 64,118,229,202,149, 90, 52, 77, 51,
+ 14,135,195, 28, 17, 17,241,232,101,202, 21, 20,214,230, 79, 10,116,136,205, 97, 93,163, 78,184, 54, 7,207, 79, 58,205,120,132,
+ 52,251, 26,140, 96, 12,199,113,169,186, 71,215,218,254, 11, 35, 90,207, 31,231,202, 42,209, 2,241,167,195,222,253,160,225,164,
+201, 95, 73, 63, 89, 22,133,195, 43,167,105,254,174, 38, 11, 0, 24,154,169,114,252,196,113,149, 92,204, 0, 0,244,102, 7, 94,
+139,140,172,248,137, 80,189,213, 25,154,162,194,139, 23,180, 97, 29, 54,169, 64, 40, 54, 83, 78,131, 4, 10,128,111, 80,245, 40,
+127,199, 5,249,176,183,186, 87,219,180,237,247,180, 71,105,185,149,174,212, 40, 70,132,136,142, 61,209,189, 71, 47,143, 43,151,
+255,156,181,250,231, 85, 95, 58,108,246, 85,156,157, 91, 98,206,123,152, 81, 97,101, 30, 80,167,185, 88,233,123,108,208,184,217,
+ 62,102,218, 27,223,206,253,193,247,220,209, 45,103,211, 83,155,112, 41, 41,169,102,158,162,238,230,231,101,126,106,200,138,143,
+117,245,144, 41,149,202,154, 74,165,178, 73,227,198,141,165, 83,166, 76, 17,118,238,220,249,137,101, 31, 59, 86,116,230,204,153,
+192, 69,139, 22,245,190,125,251,182, 89,175,215,223,210,235,245, 9,168, 68,162,125, 64,128,223, 71,111, 12,236,135,174,131, 62,
+ 4,203, 81, 24,251,193, 36, 28, 63,186,103, 60,128, 87, 98,180,236,114,247,217, 99,198, 77,241,139,104,217,148,153,181, 37, 22,
+ 50,177, 0,189, 90,132, 83,239,126, 60,221,115,221,242, 89,107,161, 65,167,210, 34, 89,156,177,112,122, 67, 95,235,208,254,109,
+ 66,113, 96,171,117, 40,186,125, 14, 90,238, 49, 39,245,192, 87,247, 1,160,102,228,199,110, 18, 86,189, 34,200,147, 81, 73, 88,
+245,138,154,145, 31,159, 76, 56,182, 66, 87, 94, 89,132, 18, 73,181,173, 91,182,212,241,114, 19, 65, 64, 83, 96, 24, 10, 2,134,
+134,217,202, 98,240, 91, 67, 95,217,101, 46, 83,213,233, 77, 3,239, 58, 31,216,248,213,148,243,224, 72,101,206, 9,197,136,124,
+ 14, 29,216, 43, 80,121, 72,192, 48, 20, 24, 26, 96,104, 10,201,217, 38,140, 30,253,174,199,203, 26,246,215,218,169, 90, 78, 29,
+ 18,222, 43,162,161,119,227,237, 23, 41,143,136,215,134,248,104,204,242, 81,219,246,159, 30,202,119,152,116,153,231,185,239,211,
+ 46,252,112,162, 60, 17,139,197,146,221, 43,242, 53,119, 74,160,144,159,220,183,161,163,128,166, 96,103,121, 56, 88, 30,108,209,
+218,168, 84, 81, 11,134,166, 41,240, 28,143, 49, 99, 70,163, 87,228,107, 70,206,193,165,185, 94,201,209,155,142,157,252,195,207,
+ 98,231,176,104,197,186, 89,134, 66,245,172,196,251, 62,201,250, 66,205, 36, 83,206, 3,151,215,193,160,193,183, 72, 77,136, 30,
+183,229,208, 37, 52,172, 95, 15, 44,231, 44,103,120, 21, 5,182, 28,190,132,186,225,117,157,229,230,120,132,133, 40,209,178, 69,
+ 75, 0,120, 33,163, 37,144,184,125,219,169,207,136,153,125, 7,191, 7,149,159, 31,104,222,222,247,228,225, 45,125,127,253,233,
+251,169, 14,179,118, 81,165,196,120,246,241,115,129,231,184,151,142, 58, 5, 5, 5,249,181,108,249,100, 58, 70,135,195,129, 26,
+ 53,106, 32, 61, 61, 61,252, 69,218,105,129,129,129,125,190,251,238, 59, 85,239,222,189,133, 1, 1, 1, 0,128,172,172,172,224,
+ 99,199,142, 53,251,238,187,239,114, 50, 51, 51, 15,163,156, 25,125, 88, 59, 45,162, 5, 96,164, 82,185,115, 31, 65,209, 83, 62,
+122,167,177,127, 96,144,165,180,207,171,213, 89,226,207, 63, 60, 77, 9, 4,162,162,207,131,230,121,142, 42, 39, 74,212, 93, 40,
+ 20,150,218, 67, 97, 99,220, 35,120,161,199,251, 52, 67, 59, 47, 86,135, 93,157,255,232, 70,189, 74, 68,226, 26, 8,197,162, 85,
+111, 12,121,175,237,155,131, 6, 32,208,207, 3, 39, 47,220,198,248,143, 62,179, 59,108,246, 37, 47, 84,121, 48,140, 32, 39, 39,
+ 39,217,203,203, 43,224,229,159,183, 84,232,239,199,143,170, 78,158,138,154,182,120,217,242, 9, 54,171,195,206,241,252,227,117,
+140,101, 50,137,176, 71,223,183,220, 85,181, 34,164,203,191,123, 95,248, 47,140,104,173,126, 37, 70, 75, 44,115,123,235,155,207,
+ 63,150,206,222,124, 9,135, 87,142,215, 24,181, 26,191,199, 45, 5,119,207, 27, 6,109, 65,179, 23, 41,161,210, 47,172, 13,197,
+ 8,198, 81, 12,163,160,104, 74,204,177, 92,170,195,106,157, 99,202,125,240,210,147, 86,114, 28,143,221,127,230, 84,206, 0,241,
+168,189,105,251, 94,149,191,167, 4,102, 27,139, 33,195, 70, 96,227,198,141,110,126, 30, 98,152,173, 14,124,191,120,177, 78,159,
+124, 88,149,156,154,159,222,189,223,103, 39, 18,146,114,162, 31,101,154,119, 84,182,108, 22, 27, 11,173,209, 1,163,133, 70,157,
+ 6, 45,241,253,146,186,210, 71, 41,137,159,109,248,117,237,196,187,119,153,141, 28, 67,207, 52,103,222, 75, 45,245,166, 11,104,
+216,203,221,203,103,235,192,113,115, 61, 31,228, 8,192,195,134,120,119, 41,222, 26, 53,209,189,102,128, 12, 10, 41,227,153,152,
+146, 30, 56,101,234,212, 11, 9, 44,223, 74,171, 78, 72,172,168, 60,213,171, 87, 31,212,183,111, 95,249,228,201,147,133, 33, 33,
+ 33,248,117,203,206,106, 29,122, 13,238,151,145,153, 29,194,243, 60,252, 85,170,212, 49,239, 14, 62,120,228,200,145,148,212,212,
+ 84,225,194,133, 11, 91,239,221,187,183,126, 86, 86,150,203, 45, 83,150,231, 97,182,176, 96,139, 30,144,234, 66, 75,165,253,105,
+112,112,176, 36, 61, 61,221, 82, 34,202, 64, 61, 9, 20, 82,189,186,117,106, 45,248,229,104, 18,244,102, 22, 10,169, 16, 73,217,
+ 70,180,104,218,136, 90,195, 58,154,148, 38, 56,250,173, 62,211,253,149,124,100,255, 54,161, 80,121,201,177,254,199,185, 56,112,
+ 49, 49, 50, 91, 79, 97, 5,207,140, 11,148, 8,122, 40,184,204, 21,157, 91,212, 10,232,218,188, 26,174,182,168, 21,112,238,122,
+108,156,108,240,226,143,211,245,194,147,249,199, 38,234, 74,175,120,104,120,187,137,176,238,120, 10,228, 82, 1, 20, 82, 1, 20,
+ 18,231, 79,154,166, 94,174, 85, 27, 88, 47,132,225,216,209, 12, 35, 24, 61,244,173,193, 65,195,135, 14,230,193,208,216,185,251,
+224,128,205,155, 55,101,218,109,214,181, 44,205,172, 43,235,250,121,234,128,210,128,202, 67,140,169,107,163,225, 46, 19,194, 77,
+ 46,132,187, 92,136,174,141,253,192,208, 47, 92, 68,175,241, 3,106,246, 30, 63,176,122,151,240,170,202, 58,183,226, 11,239,142,
+158,115,109,217,153,130, 46,159,254,184,180,190,143,190,192, 42,248,118,202, 24, 65, 90, 70, 70,151,157, 7,207,118,101,173,239,
+197, 58,108,134,175,212,183,119,150, 26, 21, 78,139,189,216, 44, 56,226, 77,169, 77,111,191,115, 43, 54,173, 86,190, 69,130,152,
+100, 45, 20, 82, 1,148,197,199, 86, 42,128, 66, 42,132, 82, 42, 64, 70, 90, 18,242, 12,204,133,116, 31,186, 11,206, 94,116, 84,
+166,224,102, 27,139,155,137,122, 84, 15,111,138,192,192, 32, 88,123,191, 93,253,114,212,238,253, 87,206,238,155,111,204,186,255,
+149,171, 58, 91, 14, 93,194,180, 73,227,174, 83,192,141,162,135,116,179,111, 23,172,108, 62,107,218,135, 79,189, 55,101,230,242,
+230, 47, 30,201,114,155,222,117,224, 7, 51, 59,244, 24, 8, 93, 94, 54,254, 60,177, 3,189,250,190,129,183,223,251, 4,158,158,
+190,223, 47,153,243,249, 45,135, 69, 27,245, 92,157, 27, 80,183,125,163,134,245, 54, 7, 7, 5,133,112,156,115,149, 15,158, 7,
+244,186, 66,124,254,233, 24,112, 60,143, 38,205, 90,117,149,118,232,193,243, 69,171,129,104,114, 53,134,216,251,119,187,155,115,
+ 98, 47,187,124, 44,205,102,187, 90,173,198,205,155, 55, 17, 23, 23,135,152,152, 24,228,230,230,194,195,195, 67,111, 48, 24, 42,
+ 21,188,111,220,184,241,240,168,168, 40,169,151,151,215,227, 55,173, 86, 43,220,220,220, 48,124,248,112, 97,207,158, 61,131,251,
+244,233, 51, 50, 58, 58,122, 11, 0,109,169,229,201,123,152,225,230, 31,254,115,167,206,157, 38, 0,128,204, 61, 48,113,197,175,
+ 7, 99,202,109,208,122, 4, 85,107,219,182, 93, 45,240, 60, 40,240, 63, 24,115,227,178,202,137, 18, 41, 46, 93,186, 84,147, 97,
+ 24,193,147,103, 16,135,159,214,111,175,251,251,249, 59,131, 22,124,191, 72,234,174,144, 64, 93,104,197,251,111, 15,116,249, 25,
+ 44,243, 15,239,221,182,109,199,253,179,102,126, 35, 80, 42, 20, 56,113, 57, 1, 31,127, 58,213,156,153, 28,189,136,231,132, 43,
+141,234,184,156,151,124, 84,242,120, 5,212,169,162,132, 91,255, 94,210,241,239,244,151, 90,237, 44, 10, 12,118, 88,108, 44, 88,
+142, 71,161,193,142,187,143,116,240,117,175,252, 82,110, 60,207,183, 4,224, 7, 64, 77, 81,212,213,146,219,197, 13,186, 98,111,
+252,204,182,166,232,249,224, 3,192, 10,231, 72,253,199,151, 79,209,118, 89,239, 23,127,255, 46,128,122, 69,154, 44,128, 43, 20,
+ 69,229,151, 97,182,158,139,114, 9, 14, 29, 58,196,247,237,219,247,113,141,255,236,246,179, 72, 68,194, 32,133,135, 31,120,254,
+ 30, 74, 46, 96,172, 10, 8,206, 93,180,100,153,247, 71, 31,140, 75,209, 22,228, 85, 43,122,251,164, 43, 15, 11, 1,197, 44,233,
+212, 46,162,231,132, 15, 62, 64,120,205, 42, 34,150,101,249,232,184, 68,251,134,117,235, 71,157,187, 40, 94,166, 77,139,158, 94,
+ 34, 4, 89,169, 97,159, 44,199,166, 61, 27,193, 98, 57,246,217,214,237,115,154, 20, 5,120, 42,197,248,249,104, 18,120, 30,160,
+192,195, 67, 33,196,182, 51,105, 72,188,190, 71,219,183,137,214, 48,124,193,140,174, 93,122, 79,140,186, 27,111,222,145,147, 99,
+ 62, 14, 32,171, 60,205,210, 43,116, 14, 22, 27, 11,187,195,129, 93, 7, 15, 34,178,107,107,180,109,219, 26, 29, 59,180, 21, 92,
+187,126,251,189, 15, 38,140, 9,193,147,209, 29,143, 53,165,254,181, 91, 42, 61,124,119, 12,154,176,208,237, 78,154, 3, 2, 6,
+ 8, 13,144,193,219, 77, 4,171,131, 66,178,218, 86,116,231,120,226,227, 41, 51,189,167,125, 54,225,136, 86, 45,110, 8,220,179,
+149,183,239, 70,163, 81, 60, 98,196, 8,161,221,110,183, 13,127,255,147,158, 89, 89,234, 1, 63,253,240, 31,137, 74,229, 15,163,
+217,129,235, 49, 15,235,205,154, 53, 51,244,224,177, 51,251,102, 76, 29,191, 63, 50, 50,210, 99,251,246,237, 92, 69,199,243,169,
+ 22, 98,182,230,199,245,155,119,109, 92,186,104, 30, 98, 83,242,177,238,151,149,224, 89,199,207, 21, 28,170,146,154,252,136, 17,
+ 35,100,251,246,237,171,146,150,150,166, 53, 26,141,234,167,226, 17, 52, 37,200,206, 51,194,215, 77, 12,145,128,134,191,151, 20,
+ 42, 15, 9,132, 12, 64, 83, 20, 91,154,230,186, 29,135,231,112,198, 66, 28,216,106, 29,186,254,199,185,120,239,163,175, 17,173,
+ 17, 31,163,229, 30,115, 62, 28, 58,104,154,159,140,141, 12,242,164, 85, 93,155, 87,135, 66, 42,194,151, 19, 71,160,213,245,100,
+ 85,122, 1,247,181,218,196, 52,157,121,236,241, 98,221, 39,159, 14,142, 56, 35, 88,110,114, 33,142,109,254, 62,199, 80,168, 46,
+ 44,238,146,179, 90,204, 41, 46, 94,198, 39, 75,105,217, 78,107,218,168,193,220, 9, 99, 71,211,237,218,180,226,105, 90, 8,141,
+206, 74,241, 60,240,233,199,227,241,225,248, 49, 1,169, 25, 57,223,174, 92,249,243,244,168,223,249,217, 6,245,253, 25,229,105,
+210,148, 51, 10,164,148, 10,160,148, 57,141,139, 82, 42,128,217,202,130,162,192,120, 86,109, 86, 72, 57, 35,185, 25,121, 41,101,
+182,192,159,210,244,174,218,224,212,239,137,110,117,243,119,228, 95, 76,202,136,153,115,253,118,246, 21, 0,121, 33, 29, 61, 71,
+218, 28, 60,244,102, 7,146,178,141,112,216,120,234,189,215,170,161,198,155, 84,248,188,245, 55, 54, 30,189, 13,247, 18,149,254,
+ 83,154,233,151,118,153,125, 26, 14, 28,178,116,249, 47, 87, 23,205,253,154,209, 20, 90,193,241, 60,164, 98, 6, 50,177,160,232,
+197,192,100, 40,196,202, 85,107,178, 28,160, 6,225,236, 89, 71,101,174, 79,112,252,219, 3,123,119,220, 70, 1, 98,138, 22,165,
+ 5, 85,171, 94,173, 91,191, 81,210,110,253, 71,128,117, 88,167, 93, 63,207,159, 54,230,196,158,114, 69,179, 97,253,122,160,128,
+ 27,134,156,184,241, 0,160, 80,133,253, 92, 55,188,110,243,103,223,171, 93, 59,188,185, 43,231,253,113,164, 84,234,246,145,151,
+183,223,215,225, 13,154,170,178,243, 45,148,155, 79, 21, 36, 61,184,137,173,171,190,221,196,153,173, 51, 79, 29,222, 49,119,217,
+186,189,111,117,139, 28,136,245, 63,253,231,203,220,204,199, 70,235,100,137,104,213,219, 27,214,174, 14, 17,138, 37,176, 59, 56,
+216, 89,222,249,211,193, 34, 47, 47, 31,118, 7, 7,169,220, 13, 14,142,130,157,229, 96,119,112,176, 88, 29,138,241, 35,250,124,
+ 96, 6, 46,151, 86,206,224,186,157,142,139, 36,146,106, 60,156,107,215,242, 60,143,164, 44, 19, 29, 24, 24,184, 5, 0, 36, 18,
+ 9, 36, 18, 9, 56,142,195,245, 88,245, 71,190,225, 97, 19, 80,100,240, 88,155, 53,165, 32,249,143, 94,101,237,123, 64, 64, 64,
+191,103, 77,150,217,108,134, 94,175,199,249,139, 87, 61,214,110,220, 21,153,148,146, 86,147,227, 61, 44,110,170,154,189,116, 57,
+ 9,253,202, 58,158,186,236,216, 15,220, 35,198,208,147, 63, 28, 89,123,249,134, 67, 87, 30, 30,159, 83,110,158, 86,141,110, 95,
+ 88, 39,143,123,163,197,130, 31,214, 61,200,255,227,231, 73, 21,157, 35,129, 64, 32, 84,171,213,143,239,239, 21,107,182,182,184,
+ 17,155,254,250,178,165,203,164,215, 19,116,184,147,148,129,145,221,171, 58, 91, 56, 46,156,119,133,127, 77,223,208, 90,181,182,
+172,252, 97,129,224, 65,134, 25, 63,238,185,130,168,253, 63,159,207,202,185, 28,137,236, 76,211,139,212, 33,175,192,104,149,169,
+121,250,182, 6,122,179, 3, 22,171, 3,118,142,135,214,104, 71, 78,129, 21, 90,163, 13,122,147, 3, 35,123, 84, 45,245,123, 21,
+248, 17, 63,138,162, 14,241, 60,223,151,231,249,238, 0,196,197,219,206,103, 54,117,168,200,144, 61,181, 61,109,218,180,175,230,
+207,159, 31, 83,252,217,226,247,139, 63, 91,222,251, 37,190,239,243,229,151, 95, 54, 92,176, 96,193,188, 54,109,218,108,251,243,
+207, 63, 19, 1,228,187,218,125, 40, 40,185, 51,135, 14, 29,170,232, 64,215,180,217,109, 18,119,153, 16,161, 53,170,226,221,175,
+214,251,254,182, 96,116,142, 84, 44, 96,142, 30, 61,234,157,107, 85,130,166, 25,151,155, 40, 74,191, 58,109, 69, 34,241,225,197,
+139, 23, 99,104,191, 14,178, 71, 26,187,254,246, 35, 83,182,193, 10,135,202, 47, 76, 60,103,222, 2,229,130,133,223,127,120,232,
+ 0, 87,160,207,190,251,125,233, 93,124, 45,174, 49, 84,137, 28, 44,138, 2,207,177,105,249,201, 87, 91, 0,192,203,228, 98,233,
+205,118, 48, 69,185, 53, 20, 5, 24,205, 14, 48, 12,149, 83, 16,187,227,238,240,217,115,186,110,218,246,123, 6, 79,123,234, 12,
+134, 36, 57,156,107, 14, 86, 26,179,149,133,197,206, 34,230,214,117,116,140,168,143,182, 45,234,194,104,102, 97,180, 56, 80,163,
+ 86, 56, 0,248,150,122,226, 24, 58,145,103,237,102,158,103,221,250,182,244,131,202, 83,140, 64, 47, 9, 36, 98, 1,236, 14,192,
+100,229, 96,182,178, 72,206, 49, 65,103,146,161, 81,167,193,161, 62,129,215, 44, 89,201,178,125,121,143,174, 13, 42,215,156,178,
+ 44, 54,108,217, 85, 59, 35, 35,123,192,145,125,155, 37,106,173, 29,183,147, 13,200, 41,176, 0,140, 31,190,155,247,163,228,139,
+ 73, 99, 95,223,176,117,119, 74,183, 14,173, 83, 42,187,207, 70,117,236,166, 29, 59,119,253,220,183,239,235,178,152,203, 71,240,
+224,230,169,185,134,156, 74,229,103,209, 77,154, 52,113,140, 29, 59, 86, 55,111,222,188,144, 3, 7, 14,212, 80,171,213, 55, 1,
+216, 61, 61, 61,235,134,213,174,118,235,196,177,163,193,125, 94, 31, 44, 76,211,152,224, 33, 23,161,154, 74,142,139,231,143,219,
+197, 98, 97,169,249, 38, 69,221,131,195,208,237,115, 28,184,152, 24, 25,147, 43, 61, 51,102,244,200,148, 19,231, 98,115, 87,108,
+ 60,241,159, 96,165,253,166,148, 83,175,184,214,162, 86,192,180,143, 71, 96,254,242, 77, 56,123, 61, 54,199, 64, 7,206,205,180,
+ 56,126, 47, 59,148, 14, 8, 24, 10,110, 50, 33, 12, 90,117, 97,252,141, 99, 97,175, 40, 76, 61,242,196,190, 77,116,158,206,142,
+ 84,141,153,202,200,211,129,229,120,120,202, 69,112,112, 60, 10,242, 52,212,230, 77, 27,113,245,234, 69, 26, 12,253, 62,128, 25,
+229, 30, 80,202,217, 85,168,148, 10,157, 17, 33,153,243,167,157,229, 16, 94,187, 22, 86,175, 88,226,238,171,242, 71,251,142,174,
+231, 70,187,249, 84,107,178,237,215, 21, 56,243,231,141,206,103,151,253,216, 82, 25,228,183,156,162,216, 69,224, 97,182,216, 88,
+ 20, 22,228, 67,108, 77, 69,171, 96, 53,188,229, 44,146,181,129,136,206,122,160,172,168,194,207,141,222,123,147,226, 95,159,190,
+235, 96,212,252, 94, 61, 58, 35, 58, 89, 11,153, 88, 0,169,152,129, 84,204, 64, 72,177, 88,178,234,103,123,126,161,174,111,110,
+204,126,205, 11, 92,159, 39,139, 90,191, 78,115,199,234,253, 54, 45,159,254,219,152,207, 23,246,138, 28, 56,138,138,190,122,250,
+ 43, 35,112,202,181,134, 30,239,210,123, 28,231,250, 51, 78,234,230,251,195,196, 47,230, 76,236,217,119, 48, 24, 70, 0,187,221,
+142,221,219, 55,225,215, 31,191,187,111,213,231,142, 2,192, 89,115,152,177, 59, 54,173, 26,252,249,183, 75,168,134, 77, 90,181,
+ 62,157,249,252,114,180, 28, 67,253,242,206,232,113, 67,252,253,253,221,158, 68,180,120,132,133,215, 71,239,254,111,224,248,254,
+189,184, 27,115, 27, 28,239, 52, 76, 28,199,163, 32, 63, 55,203, 97,183,110, 40,179,199, 67, 42,173,182,254,215,141,117,104,154,
+122,188,128,252,164, 15,222,181,142,255,244,171,246,189,123,118,138, 17, 51,208, 38, 63,202,244,188,120,227, 94, 35, 78,168, 12,
+ 25, 61,101,137,200,108, 97, 81,104,180,227,200,186,178,189,142,212,171,106,155,234,205,123,143, 30,255,205,106,137,132,161,109,
+ 13,194, 66, 18, 59, 69, 52, 72,173, 26,228,171,155,181,224,199, 86, 23, 46,223,232,253,214,240,209,210,145,117,155, 83, 65, 62,
+ 50,183,119,135, 15,108,204, 58,108,239, 24,243, 82,203,156, 95, 80, 40,247, 42,168, 90,163,182,241, 73,196, 40,108, 15,197, 35,
+244, 41,231, 65, 33,209,148, 29, 55, 8, 0, 2,131,170,154,133, 18,119, 93, 37, 34, 48, 60, 0, 44, 95,179,181,197,173,184,140,
+ 49, 75,151, 46,147, 95, 79,208,225,102, 66, 33, 36, 34, 26, 54, 59, 7,202,197,160, 54,199, 51,227,190,254,114,154,123,190,129,
+197,153,219,106,196, 92, 59,205, 91,245,230,225,114,135,251, 32,168,220,222, 1, 80, 11, 64, 60, 69,241,191, 24,178, 3,246, 3,
+103, 29,149,189,238, 57,206,217, 94,118,247,171, 25,202, 10, 36,189,133, 98, 69, 27,138,226, 27, 80, 60,188, 0, 62, 61,175,232,
+153,234,170, 83, 51,100,199, 97,225,188,111,241,195,218,189,200,200, 53,195,131, 77,197,254,117,115, 48,121,254, 22,152, 44,101,
+103, 53, 84,228, 71, 74, 51, 70,207, 26,174,226,223,139, 63, 55,127,254,252,190,207,156,155,190,101,156,179,231, 62, 87,252,253,
+ 5, 11, 22,204, 43,241,119,163,171, 38,235,177,209, 42,222,169, 10,204, 86,152, 95, 96,181, 63,247,239,219,227,149,175,183, 65,
+ 42, 98, 80,181, 70,109,204, 88,177,223,239,181, 22,190,208,216, 60,176,117,245,162, 60,179, 81,183,221,165,202, 66, 21,222, 90,
+166, 84, 28,217,179,123, 47,106, 86, 85,137, 54,159,207, 75,186,145,104,122, 28,234,213,170, 83,196, 53,220,141,130, 65, 3, 7,
+202, 79, 69,157,254, 84, 15,148,106,180, 24,138,169,178,102,227,110,149,155, 76, 8,138, 2,116, 38, 7,198,188,243,198,203, 63,
+198,120,142, 25, 61,106, 36,168, 34,147,165,205,205,194, 87, 95,124, 96, 86,216, 31,220,125,148,252, 40,189,123,191,201,167,180,
+122,202, 60,100,196, 7, 87,239,198,205,207, 55, 26, 95,108,145, 31,139,149,133,197,198, 33, 33, 33, 30,147, 70,246,128,144,161,
+193, 48,156, 51, 89,218, 81,246,197,168,207,136,203, 67,128,232,205, 77,139, 63, 90, 19,228,175,242, 81, 42,100,188, 82, 46,161,
+ 26,212,173, 35,138,136,104, 43,174, 17,222, 88,116,254,158, 9,143,212, 38, 36,102, 20, 66,226,223, 84, 48,180,235,107,216,180,
+108, 74,231,188, 71,215,104, 60,159,164,248, 20,191,159,185,212,111,237,170,165,146,236, 2, 27,238, 63,210, 35, 43,223,140,204,
+124, 11,178,242,204, 80,202,132,232,216,127,172,228,240,254, 95,250,117,235,208,122,249,139,236,119, 98, 98,210,225,228,244,204,
+193,141,155,181,194,166,223,126,237,224,233, 89,195,189,160, 32, 73,235,234,217,153, 51,103,142,120,193,130, 5,130, 21, 43, 86,
+104, 35, 34, 34, 2,190,252,242,203, 94, 57, 57, 57, 87,170, 87,175, 30,126,124,207,134,168,166, 29, 7,180, 4,103,243,235,208,
+169,139, 72,194, 9,112,226,208, 33,219,142,237,155,115, 77, 38,221,248,114, 13,135,220, 99, 78,182,158,130, 95,112,112,140, 82,
+204,246, 16,208, 5,113,249,199, 38,110,204, 7,246,212,140,252,248,228,233,107,177,113, 45,174, 39,171,162,174, 63,204,201, 51,
+218,194, 18,142, 77, 46,183,226,101, 40, 10, 66,134,134,155, 76, 0,186,168, 86, 85, 6, 53,126, 8,138,242, 43,142,156, 82,160,
+138,126, 2, 20,133,140,252, 71, 55, 93,200,217,160,120,142, 7, 98,211, 12,208,155,157,161,249, 42,190,114,168,179,211,240,211,
+242, 13,184,113,237, 42,122,190,214, 31, 43,215,108,198,152,119, 6,155, 43,106,253,208,116, 81, 68,171, 68, 52, 75, 41, 19, 0,
+160, 80, 96,176, 99,247,133, 84,212, 10,165, 93,126, 48, 0,128,155, 82,142, 66,157, 9,180,200, 13,241,215,143,200,143,158,190,
+252,229,244,217, 75,167,230,103,222,126,244,240,206,121,132,251, 22, 34, 52,216,134,152, 44,119, 92,203,173,129,240,218, 53, 65,
+139,174,186,164,173,137,105,180,112, 63,189,187,111,139,166,245,219, 84, 83,121,194,100,101,139,162, 90, 12,126, 93,191, 17,201,
+ 73,105,163,115,239,238,191,241, 42, 28,173, 33, 39, 81, 45, 81,213,254,240,206,229, 83,137, 3,135,127,136,192,224,170, 77, 10,
+ 30,221,116, 57,109,193,149,247, 88, 23,141,150, 72,238,249,229,164,175,255, 51,177,103,159, 55,113,233,252, 41,220,140,137, 71,
+235,214, 45,241,218,235, 67,161,211,230,213,221,185,113, 89, 15,135, 81,119, 92, 32,113, 76,108,213,182, 43,197,177, 44, 30,220,
+143,142, 47, 77,203,148, 25,123,243, 98,102,172,251, 83,221, 83,190,117,155, 40, 61,188,111, 90,108, 44,210,211,211,240,199,159,
+103,154,153, 50, 99,111, 86,230,120, 73, 68, 12, 78,220,200,129,173,104, 13,211,142,157,122, 88, 69,180,165,195,220,165,235, 35,
+ 50, 51, 50,105,133,187, 47,231, 29, 92, 79, 20, 40,177, 89,110, 37, 20,138,108,118, 14, 53,131, 20,229,106,250, 5,213,158, 55,
+101,202,164,122,140, 72, 6,157,193, 98,205,204, 72, 15, 88,189,245,180,254,222,253, 59,193, 85, 84, 30,238,255, 89,246,139, 72,
+107,166,144, 83,104, 65,158, 78, 75, 13, 31,247,121,208,218, 31,231,191, 93,158,209, 42, 37, 93, 36,244,240,137,243,117,189,220,
+ 68,148,222,236,224,114,181, 54,118,248,235, 47, 55,232,178,200,100,141, 93,186,100,153,252, 70,130, 14,183, 18, 10, 33, 21, 49,
+ 16,139,104, 88,237, 28, 92,188,157,232, 0, 85,192,248,182, 45, 26,225,248, 77, 13, 24,134,134, 73,151,111, 20, 32, 55,174, 69,
+231,158,242,230,173, 34,208,165,115, 39, 60,140,139,173,122,232,192,238,110, 23,255, 56,155,229,176,133,125,100, 80,199,237,173,
+ 84, 96,193,104,100,236,226,128,119, 3,131,171,183, 27, 52,244, 93,143,106, 85,131, 41,149,175, 15, 28,188, 0, 99,223,121,195,
+229, 59,223,105,204,129, 5,179,191,132,197, 98,133,159,167, 24, 60, 15,172, 95, 62, 3, 86,171, 21, 65, 62, 18, 20, 26,202, 94,
+ 77,174, 34, 63, 82, 86, 20,170, 82,185, 39, 37,204, 88,121,239, 83, 20,117,104,218,180,105, 95, 1,224,167, 77,155,246, 85,241,
+246,252,249,243, 77, 0, 50, 42,232, 58, 92,253,148,209, 42,222,185,178,239,110, 81,184,175, 79,224,197, 19,199,143,121,236,187,
+197,225,210,222,107,232,211, 58, 16, 34, 1, 13,185, 71, 16,110, 37, 21,226,240,158, 85, 5,251,183,253,146,110,177, 88,190,175,
+184,175,185,118, 11,165, 92,113,252,183, 77,219, 57, 95, 31, 31,250,167, 19,234,132, 92,157,227,113,151, 86,220,229, 3,220,181,
+227,171, 3,121, 80,199,164, 82,105,109,171,213,234, 85,209,137, 93,127, 34,165, 40,137,151,122, 21,117, 43, 40,134, 97, 55,109,
+222, 4, 95,119, 49, 44,118, 14,211,166,126, 98, 26,217, 83, 89, 48,252,173,161, 93,187,244,158, 24, 37, 84,212, 57,213,182, 89,
+ 29,190,105,211,166, 5, 12,195,184,148, 74,161, 82,169,102,208, 52, 61, 76, 44, 22,187, 89,173, 86,157,149, 51,203, 13,102, 43,
+204, 54,192,104, 52, 67, 40,114,154, 69, 33, 67,193,100,182,194,104,178,150,127, 99,100, 69, 95, 0, 16,166, 45, 17, 83, 58,117,
+175,166,120,203,206,253,159,188,249,214,144,233,193, 77, 94, 87, 38,101, 22, 66, 68,217,208,178, 94, 32, 78, 31,219,203,167, 37,
+199, 77,170,200,100, 1, 64,142, 58, 47,196,207,207, 31, 55, 18,245, 72,207, 53, 33,171,200,100,101,230, 91,160, 51,233,208,184,
+ 90, 16, 10, 10, 11, 67, 94,248,248, 2,123,143, 31, 63, 62,184,247,128, 33,152, 56,117,102,251,117,171, 22,221, 86,136,133,239,
+ 25,178, 31,156,113,197,104, 69, 71, 71,231,125,241,197, 23,181,214,172, 89, 67,191,253,246,219,166, 70,141, 26, 73, 71,140, 24,
+209,126,227,198,141, 82,185, 92,106,186,117,254,192,244,247, 63,158, 54, 96,245, 15,115,154,228,231,231, 83, 14,187,253,168, 45,
+ 63,127,154,190, 2, 51,151,122,224,171,251,223, 37,216, 70,245,232,224,119,192, 91, 78, 55,144,240,214,161,168, 55, 99, 59,238,
+205,176, 37, 28, 91,161,147, 13, 94,252,113, 70, 1,247,181,153, 86,205,173,200,100, 1, 0,205, 80,176, 58, 88,184,201,132,160,
+105,186,216,196, 7,254,186,253,168,220,207, 67, 12, 33, 67, 67,192, 80,208, 26,237,208,104,109,248,240, 93, 87,103, 8,225, 57,
+ 7,203,195,100,117,192, 88,212, 58,212,105, 53,248,114,234,103,120,173,223, 64,188, 63,254, 51,228,155,128,107,137, 58,216,236,
+246, 10,111, 10,154,162, 97,180, 56,240, 94,207,106,200,211,219, 96, 48, 57, 96,117,112,144,139, 5, 16, 10,104, 40,164, 2,184,
+203,133, 0,207,139,138, 43, 19,161, 80,104,182,219,237,155,202,105,209,163, 70,136, 63, 76,118, 26,173,134, 44, 66,247, 54, 97,
+136,185,176, 91,112,246,210,157,208, 79,167,126,141, 79,198,244,195,174,251,181,224,173,170, 6,165, 66, 6, 59, 79, 3,224, 93,
+ 76,216,155,193,209,182,129,195,126, 94,179, 62,118,214,183,211,164, 5, 6, 10, 18, 17,131,168, 83, 39,113,241,242,181, 31, 52,
+119,247,111,194, 43, 68,200,211,254,238,238,238,144,138, 25, 88,109, 22,171,235,169, 11, 60,120,160,153, 66, 21,246,115, 81,139,
+191, 25,203,161,148,247, 42, 54, 90, 2,169,251,180,143,166,206,154,215,179,207,155, 56,113,104, 23,118,238,218,206,182,137, 28,
+205,108,254,117, 21,218,119,239,143,246, 61,135,224,232,222,141,159, 25, 56,170,254,216,137,211,103,119,236,218, 27, 39, 14,239,
+ 66,118, 86,218, 98, 87,203,203, 8,169,137, 93,123,244,131,217,202,162, 67,183,190, 56,118,112,239,199, 40, 26,100,225,250, 67,
+236,153,250, 25,180,227,179, 73, 19,133, 57, 5, 86,161, 90,107, 69,154,218,136,164,108, 35,246,111, 91,199,187, 94, 95, 88, 91,
+118,108, 92, 69, 56,118, 97, 84,106, 72,149, 64,139,208, 98,146,197,197, 39,212,125,255,221,145,194,208,218,117,233,156, 66, 11,
+212,133, 22,104, 10, 45,208,155, 29,168, 93,165, 14,109,119, 80,109, 42,123,158,125, 61,196,194,149, 7, 19,225,174, 16,162,109,
+221, 23, 31,104,203,113,220, 19,147,181,212,105,178,110, 39, 22, 66, 34, 98, 32, 17,209,144,136, 24, 56, 88,222,165,134,139, 76,
+ 21,214,251,195,143, 62, 8,178, 58,128,220, 66, 43, 4, 12, 5,149,175,151,162,101,147, 97, 88,191,232, 99, 0,192,152, 47,126,
+194,251,239,141, 64,189, 6,141, 80,144,159, 31, 48,236,205,222, 75, 1,236,117,181,172, 71, 78,156,169,122,226,220,141, 47, 62,
+156,242,157,242,173,126, 93,152,155, 9,133,200,204,179, 32, 62, 78, 87,169,200, 27, 0, 56, 88, 14, 60,120,108,216,126, 8, 50,
+177, 0,234, 66, 27,120,158,199,156, 21, 59,224, 38, 19, 34, 51,223,217,221, 95, 30,229,250,145,114, 34, 82,149,136, 54,246,133,
+ 51,151,203,207,213,136,214,252,249,243, 99,230,207,159, 95,106,132,172,132,201,122,177, 69,165, 69, 34, 69, 93,119, 31,223, 75,
+ 39,142, 29,113,219,123,139,197,233, 91,185,120,179, 67, 21,232,243, 30,225,251,169,111,229, 81,224,173, 52,195, 20, 88, 76,198,
+ 61, 38,147, 97, 46, 0, 91,185, 23, 77, 64, 88, 51,133, 84,121,114,229,234,223, 28,190, 42, 21, 54,157,207, 75,203, 55, 56,236,
+ 79,186,173,236,212,181,227,171, 67, 29,156, 61,210,156,253,240,106, 69, 45,113,142,135,104,254,170,253, 0,120,112, 28, 7,158,
+227, 32,148, 42, 21,190, 53, 35,178,139, 42, 58,169,128,166,204, 37,107, 0,158,115,164,105, 18,203, 15,131, 82, 0, 60,228, 66,
+108, 63,155, 14, 0,217,140,238,250,189,225,111, 57,187, 11,205, 86,169,182, 65,173, 90,124,203,150, 45, 11,100, 50,151,166,191,
+ 98,252,253,253,175, 76,159, 62,189,238,251,239,191, 47, 17,139,197,112, 56, 28,222,191,172, 94,205,173,158, 59, 6,131, 62, 94,
+ 9,145, 88, 2,147,217, 6,161, 80,128,252, 66, 61, 10,180, 70,232,140,246,202, 95, 65, 9, 9, 86, 53,176,112,223, 94,241,192,
+ 94,202,198,173,196,180, 8,205,195, 3,113,250,248, 62,254,210,177,245, 99, 76, 57,113,191,185,120, 33, 66,111,182, 35, 35,215,
+140,244, 92, 51,178,242,205,200,202,179, 32, 43,223, 12,138,162, 96,182, 58, 94,234,193,101,200,137,221,185,233,183,181,253, 45,
+ 54, 12,237,216,115, 32, 62,251,110,101,181, 77, 63, 47, 56,153,200,211,237, 92, 76,180,101, 99, 98, 98,146,223,125,247,221, 38,
+ 91,183,110,101, 26, 54,108,104,186,119,239,158,188,200, 68,218,148, 74,185,108,221,143,243,143,183,106,213,106, 91,122,220,253,
+168,162,254,244, 10, 43,246,106,157, 70, 73,100,182, 27, 99,171, 42,218,246,170, 25, 32, 71, 85,133,174, 87, 93,229,173,239,115,
+187,126, 50, 79, 29,245, 67, 78,166,197,241,187,218,196, 52, 77,215, 11, 93,202,193,179, 91,204, 41,131,222, 28, 10,134,162, 97,
+ 51, 27, 83,138, 47, 46,149,135, 24, 51, 54,223,135, 82, 42,132,155, 76, 0,165, 76,136,246,245,189, 81,137,250,140,183,179, 28,
+140, 22, 22, 38,139, 3,102,171, 3,190, 33, 94, 88,179,105, 39, 30,229,152,176,255,170, 6,177, 41, 58,212,169,162, 0,207, 87,
+ 92, 77,114,172,221,208,239,141,183,221, 24,154, 2, 67, 83,116,253,186, 97,200,211,219, 32, 18,208, 16, 73,101, 80, 72, 4,112,
+151, 9, 33, 18, 9,145,147,147, 3,139,197,130,170, 85,171, 74,203,183,130, 60,220,148, 50,212, 9, 13,130,205,238,192,145,115,
+119, 49,119,210, 32,244,232,216, 2,148, 80,137,251,150,102,112,243,118, 3, 71,211,176, 57, 56, 88,109, 44, 0,218, 92,150, 94,
+ 72, 72, 72, 87,133, 66, 45,234, 42,153, 0, 0, 32, 0, 73, 68, 65, 84,161, 48, 26,141,186, 71,143, 30,157,201,138,221,251,136,
+101, 6,140, 61,118, 34,106, 83,223,215,122,224,198,237, 24,236,218,123,224,188,198,167,112, 74,241,119, 26, 52,104, 16,225,235,
+235,171,204,205,205,213, 70, 71, 71, 95,121,209,118, 1, 79,211,159,182,105,223, 25,250,130, 28,100,167, 38,185,220,138,174, 87,
+205, 13,223,204, 95,217, 60, 60, 44,188, 57,203, 59,141, 87,253,170,110,152,252,221,242,230,181,234,132, 53, 47, 30, 16, 82,175,
+106,249,211,178, 9,228,110, 61,223,121,255,179,249,253,223, 28,133,168, 19, 7,176,100,238,212, 77, 10, 15,191,122,222, 94, 30,
+ 77, 27, 70,244,196,249,147, 7, 32,117, 11,128,151, 79, 64,251,183,223,251,168,251,155,111,143,195,197,243, 39,241,195,130,175,
+ 54,178, 22,221, 22, 87,202,170, 80,133,250, 53,105,214,106,184,155,183, 63, 10, 10,117,112,243, 82,161, 94,227,150,195,239,222,
+178,124, 97,200, 73, 84,191,176,233,224,121, 88,108, 60,242,245, 54,164,170, 77, 72,206,114, 26, 45,142,171, 68, 78, 16,203, 81,
+ 74,169, 64,224,109,127, 88,245,206,201, 40,190, 90,136, 63,181,112,246, 84,198, 6, 41,212, 5, 78,147,165,214, 90,161, 46,180,
+ 66,111,182,195, 91, 33, 0,199,114,149,110,117,231,235,109,112,147, 11,225, 33, 23,185, 28,101, 44,141, 85,191,110, 15,191, 21,
+151,241,250,146, 37,203,228, 55, 19, 75,152, 44,161, 51,154, 37, 17, 49, 96, 57, 14,112,225,142, 23, 10,132, 19, 7,244,238,142,
+ 84,141,201, 57,106,153,166, 80,167, 81, 43,248,202, 56,116, 27, 50, 13, 0,208,175,183, 51,181, 45, 49,211,128,131,151,212,192,
+211,137,221,229,215,197, 38, 19,179,122,243,225, 79,119,238,216,230, 97,102, 5,248,229,104, 50,140, 22, 7,164, 34, 6, 18, 17,
+ 3,153,136,121, 42, 31,187, 98,163,229,204,185,123,164,177,195,104, 54, 67,107,178,131, 7,112,229,161, 30, 38,171, 3,133, 6,
+ 59, 34,234,122,189, 92, 32,132,162, 14,243, 60,223,231, 89, 67,244,172, 89, 42, 17,145, 42, 77,227,106, 73,141,226,207,151,101,
+228, 74,230,108, 1,168,212, 8, 46,193,179,206,177,228,182, 72,225, 85,207,195,205,227,210,177,163,135,148,123,111,113, 56,115,
+219,105,178,236, 38, 13, 22,127, 49, 44, 77, 91,160,233, 2, 32,193,213,127, 38,247,173,215, 88, 42,150, 68,253,103,217, 47, 54,
+149,127, 48,183,231, 82, 65, 78,161,145,125,202, 77,176, 22, 11,205,115,188,200,156,253,208,165, 62, 4,154,166,108,223,125, 60,
+ 16, 28,207, 99,198,178,157,152, 55,101, 8,148,178,183,229, 20, 69,201, 13,102, 7, 38,205, 92,139,197,223,140,118,147, 75, 4,
+160, 40,103, 78,212, 59, 67, 7,186,118, 1,154, 29,136,191,188, 85,175, 75, 60,116,175,100,119, 97,235,246,175, 93,107,221,186,
+117,129,151,151, 23,100, 50,217,147, 72, 69, 25,248,251,251,127,243,221,119,223,133,143, 31, 63,254,241,100,159, 2,129, 0, 31,
+126,240, 1,205,178, 60,142, 30, 93, 15,191,234,205,112,224,247, 75,136,236,218, 18,122,163, 25,121, 5, 58,112, 96, 94,248, 66,
+212, 21,104,162,178,146,239,180,106,215,165, 31,206, 28,223,199, 95, 58,186,110, 76,101,230,232,241,242,246, 74,189,126, 39,190,
+ 30, 69,121, 59, 35, 90, 69, 38,203,106,231, 80,205, 95,142,212,228,120,120,122,120,164,186,170, 39,243, 11, 31, 64,209,252,120,
+ 10,252,122, 67,246,131,157, 0,120, 67,230,189, 97, 59,183,172,190, 29, 19,125,115,110,223,225, 19, 5, 61,223,252,128,249,121,
+254, 71, 95, 1,112,117,226, 61, 91,108,108,236,221,209,163, 71,183,189,120,241, 34, 11,192, 72, 81,148,157, 97, 24,185,213,106,
+ 21,117,233,210,165,240,254,253,251,103, 81,122,210,226, 83,180,127,119,167, 47, 37,209,189, 38,230,108,195,170,185,233,122,116,
+233,208, 6,109, 26,132, 32,181, 67, 27, 0,152,152,162, 87,134,155,107,173,221,110,119,200,142,252,252,235,193,121, 99,134,116,
+159,180, 73, 48, 99, 73,230,161, 25,229, 38,162,166,222, 59,219,171, 52, 27, 47, 96,104,184,201,132, 80,202, 4,112,147, 9,225,
+ 38, 21,194,238,224, 43,211,114,228,237, 14,206, 25,209,178, 58,160, 55, 57, 16,117, 51, 27, 89,133, 86, 20,232,108, 48,217, 88,
+240,224,157,173, 81, 23,106,115,245,195, 63, 60,139,159,164,158, 85,155, 21,174, 94,177,200,125,247,133,180,199, 35,250, 60,228,
+ 98,184,201,157,163,177,207,157, 59, 7, 31,159,138, 91,251, 28,199, 97,215,177, 43, 88,178, 33, 10,199,214,127, 14,169,136, 65,
+227, 1, 51, 49,234,245,214,224,120, 14,241,177, 49,217,117,234, 55,241,167,105, 25,104,138,130,197,206, 1,224,203, 60,158, 86,
+171,213,231,209,163, 71,218,218,181,107, 7, 4, 5, 5,189,201, 48, 12, 15,221, 77,203,190,109,121,198, 83,135,182,200, 13, 38,
+ 11, 43,119, 20,174,175,157,105,234,131,218,181, 65, 81, 20,239,238,238, 46,138,138,138,210, 55,106,212,200,239, 5,111, 37, 90,
+166, 10,251,225,253, 9,159,190, 89,171,102, 77,236,220,178, 30, 60, 79,237,118,245,203,155, 15, 94,196,236, 47,159, 30, 97, 56,
+249,187,229,205, 23,207,156,248,212,123, 19,190, 92, 82,238,168, 67,153, 68, 57,101,208,176,177,184,118,229, 79,124, 63,115,242,
+ 54,139, 62,111,148,221, 97, 31,156,151,153,184, 45,180,126,107,240, 54, 29, 78,236, 88,132, 33, 35,198, 72,122,246,125, 19, 23,
+207,159,196,188,175, 38,108, 54, 22,228,188, 11, 23,147,156, 57, 94, 56,190, 75,175,215,133, 38,139, 13,203, 23,126,139,113, 83,
+230, 34,162,107, 63, 97,244,205, 75,227, 1,204,114, 57, 29,194,198,162, 75, 35, 95,167,121,182,115, 56,144,200, 8, 74,187, 2,
+ 5, 12, 69, 55,173,233, 9,147,213, 1,109, 5,141, 74,129, 72,152, 85, 80,168,173,254,227,188, 79, 25,131,217, 1,117,161, 21,
+ 57,133, 22,104, 10,158, 24, 44, 77,161, 5,234, 66, 43,132, 2, 10,113, 9, 41,160,133,130, 74,231,231,229,235,237,104, 21,230,
+229,188, 71, 95,176,119,196, 46,112,111,125,236,236,173, 65, 75,150, 44,149,222, 74,210,225,118,162,182, 40,146,197, 64, 34,164,
+ 33, 46,250,157,229,156,185,145,229,225,238, 87, 51,116,228, 59,111,119,115, 87,202,144,241, 32, 7, 2,198, 57, 69,140,135, 42,
+ 4, 30, 18, 51, 62,154, 48, 22,190, 62,158,120,164,177,224,135,189,113,184,125,247, 33, 56, 83,229,118,123,249, 47,219, 34,223,
+255,112,178, 39, 45, 20, 99,227,241, 36,103, 57, 25, 22,247, 47, 29, 52,103,196,223, 49,232,181,185, 60,120,214,197, 28,100,138,
+119,176,206,203,109,222,140,105,216,182,225, 39, 28,191,158,243,248, 10,188,176,123, 49, 62,253,114, 14, 52, 90, 43, 74,187, 46,
+203,243, 35, 0,212, 37, 34, 81,207,109,151, 48, 71,165,109, 83, 69,219,214, 50, 52,172,207,152, 43,235, 51,239, 91,159,209, 43,
+109,238,191,213, 21,118, 29, 62,103,138, 60,253, 26,202,165,138, 63,143, 30, 61,168,216,119,155,127,108,178,108, 70, 13, 63,119,
+ 98,191, 52,109,129,186,103,165, 76,150, 95,157,134, 18,185,228,236,244, 57, 63, 88,252,131,171, 59,142,220,212,230,234,204,172,
+227,249, 28, 4, 5,171,240,240, 51, 11,196,146, 37, 66,147,245, 91,141,230,158,161,162,200, 19,199,243, 56,116, 57, 11, 60,239,
+108, 34,237, 56,151,142,162,150, 57, 88,206,217,173,242,251,205, 28, 8,138,242, 80, 92, 13,127,175,250,229, 39,109,159, 70,133,
+134,225,243,102, 60,238, 46,140,104,226,140,100,185,187,187,195,211,211, 19, 74,165, 18, 21,117, 29, 82, 20,245,206,251,239,191,
+255, 92,235, 63, 39, 39, 7,221,187,117,193,138,159,214,160, 73,183,145,248,253,143,227,176,217, 57, 52,174, 95, 19,213,131,188,
+144,154,173,123,161, 27, 93,225, 31,254, 97,171, 46,175,127,213,190,107, 63, 68, 29,219,195, 95, 58,246,235,216,202, 78,132,216,
+167,123,219,131,179,103,207, 8,157, 62,247, 71,137,155, 84,128,123,122, 43,104,138, 66, 53,127, 57,124, 20, 52,206,236,219,104,
+ 30,210,175,173,203,147,227,133,132, 4,111, 90,188, 98,181, 98,241,130,153, 93,174, 93,167,162,244, 25,113,121, 0, 96,204,142,
+ 93,120, 31,184, 91,229,207, 19, 71,154,116, 26, 8,255,160,154, 61, 18,179,239,187,108, 54, 0, 24, 19, 18, 18, 18,167, 79,159,
+ 30,190, 96,193, 2,158, 97, 24, 14,128,100,217,178,101,198, 7, 15, 30,220,132,115,104, 46, 42,122,216,116,235,209, 96,146, 82,
+204, 70,120,203,233, 6, 53, 3,228,104,211,192,217, 43, 58,164, 79,123,132, 84,173,138,132, 44, 99,211, 60, 35, 39,212, 91,153,
+154, 43,127,185,125,181,134, 47, 51,198, 97,178,222, 5,176,191,178,231,135,194,147, 4,249,226,104,150,155, 76, 8,206,121,173,
+ 84,202,104, 89,108, 44, 76, 22, 22, 38,171, 3, 6, 43, 11,163,149, 5,199, 59,239, 9,138,162, 96,115,112,112,169,217,252,204,
+181,239,238,237,139,154, 53, 40,184,203,157,101,115, 47,154,238,129, 2,224,227,227, 3,149, 74,229, 82, 84,212,106,115,222,226,
+ 86, 59,247,184, 91,223,106,115,128,231,121,196,197,197,126,158,156,152, 56,160,118,157,218, 29,235, 55,110,226, 45,151,208, 0,
+ 80,166,209, 50, 26,141,172,155,155,155,202,219,219,155, 78, 79, 79,127,108,158,107, 55,237,226,216,187,103, 55, 6, 13, 26,168,
+191,119,229,214,227, 33,238, 38,147,137,106,215,174,157,123, 72, 72, 8,109,177, 88,180,149, 61, 77, 10,191,176,215,189,124,188,
+231,190,243,238,184,176, 46,221, 35,113,250,212, 9,236,223,179,245, 55,163, 58,238,132,171, 34,225,225,117,159, 27,117, 88,171,
+ 78,216,115,163, 14,171,135,214, 41,215,104,213,111,220,178, 53, 79, 9,112,252,208, 14,222, 76,219, 38, 0,224, 88,179,110,199,
+246, 85,223,204, 26, 54,254,203, 90,189,251, 15,195, 59, 35, 70, 65, 32, 96,112,230,247,131, 88, 60,243,179,195,250,194,156,145,
+174,164, 9, 56, 67,111,245, 68,193,178,144, 79,170,214,106,136,235,151,206, 35, 62, 46, 58,230,214,213,139, 13,106, 55,138,128,
+ 95, 80,181, 79, 82,124,153, 5,184,119,207, 86,145,140,213,108, 78, 25, 53,114, 4, 74,142, 58,108,211, 44,220,135,122,246, 6,
+ 0, 96,212,229,216,214, 45,154,244,160,120,212, 33,103,179,166,148,165, 91,152,175,222,117,230,143,203, 83, 6,244,137,164, 53,
+ 90,171, 51,130, 85,104, 45,122, 89,160, 41,254, 93,107, 65,157, 32, 37, 98, 99,174,115,230, 66,205,238, 74,222,151,230, 81,131,
+123,221, 45,190,118, 57,142, 7, 5,152, 43,221, 45, 37,116, 31,187,240,251, 37,210, 91,137,122,220, 78,210, 58,187, 10,133,140,
+211, 96, 9,233,199,166,203, 57,154,189,130,232, 16,197,204,123,111,228, 80,104,180, 54,112, 28, 32, 96,232,162,151, 8,143,116,
+ 20, 82,117, 70,104,242,213, 72, 76, 78, 65, 65, 86, 60,104,154,134,111, 80,152,203, 51, 73,179,188, 56,208,104,229, 27,189,217,
+167,163, 96,207,159,153,144, 75, 4,176,232,178,113,116,251, 34,181, 69,175,157,107, 50,234,247,184, 50,159,227,147, 20, 4, 74,
+173,213,155,253, 37, 66, 6, 59, 55,252,136,193,163, 38, 60, 85,251,126,254,245,108,128,166,144,151,175, 3, 69, 81,234,202,213,
+ 75,212,213,242,182, 95, 48, 50,246,210, 26,165,152,173,231, 27, 10,101,183, 70,249,163, 39,142, 29, 84, 92, 72,150,224, 74,108,
+102,145,201, 82,115,115, 62,238,147,166, 43,204,235, 5, 32,174,114,237, 66,186,215,144,247,166,196,212, 12,171,111, 57, 29,173,
+ 79, 42, 48,216,203,204,115,104,243,230,244,152,107,135, 87,244, 46,180, 39,124,160, 8,172,207,114, 14,199, 66,147, 58,110,102,
+ 25, 93,135,226,153, 63,236,124,220,109,248,197,130,141,206,223, 89, 22, 44,207,129,231,128,143,190, 89, 5, 7,199,130, 99, 89,
+112, 44, 15, 59,203,203, 43, 42,174, 42,168,250,158,252,251, 59,234, 14,159,245,124,119,161,167,167, 39,124,124,124,224,227,227,
+ 3,119,119,247, 10,141,150, 80, 40, 84, 10, 4, 79, 31,234,148,148, 20, 36, 39, 39,195,221,221, 29, 60,103,135,213, 14, 52,140,
+232,137, 59,241,209, 56,121,225, 38,120,142,133, 66, 89,249, 85, 94, 20,254,225, 31,180,236, 60,224,199,174,253, 71,227,247, 61,
+191,240, 87,207, 29, 28,103,202,137, 91,235,114,132,158,101, 41,187,221,142, 62, 61, 59,167,220,136,121,120,236,235, 41,227, 35,
+219,246, 29, 39,105, 19, 30, 12,179,149, 69, 90,114, 60,206,236,251,213, 28, 22, 26,120,188, 91,135,214, 41,118,187, 29, 44,203,
+ 86,248, 32, 55, 91,109, 26, 70, 40, 83, 12, 29, 58, 92,120,245,202,149,221, 10,191, 58, 59, 89,138,190, 69,241, 92, 99,138,231,
+ 7, 53,110, 92, 15, 54, 59, 7,163, 81,155, 95,217,125,214,233,116,137,235,215,175, 15, 29, 57,114,164,188,126,253,250,194,248,
+248,120, 44, 94,188, 56, 87,167,211, 37,186,170,113,226, 92,236, 50, 1,149,255,160, 56,162,245,168,125, 27, 12,237,219, 30,219,
+ 14, 95,192,153,243, 23,145,162, 87,222,212, 59, 4,251, 82, 83, 50, 44, 13,188,181,187,251,183,169,206,236,220,144,191, 59,166,
+243,180,183,120, 94,114, 66,115,118,134,193,245,155, 27,208,153,236,112,151, 59,231,123, 42,142,108, 49, 20,229,178, 35,162,128,
+196,243, 23,175, 55,108, 81,167, 62,110, 36, 22, 34,167,192, 2,147,197, 1,142,227,193,129,135,143,155, 24, 82, 17,141, 71,201,
+137,224,120, 91, 82, 37, 31, 21,234, 78, 29, 59, 9, 0, 10, 20,197, 11,132, 2, 1,120, 56,231, 87,148,201,100,122,149, 74,229,
+ 82, 68,203,230,112, 96, 80,100,107, 68,180,108,140, 1,227,156,115,102,158,250,109, 26,188,148, 66,108,219,180, 22,169,231,150,
+109, 10,109, 51,254, 68,244,157,152, 55, 98,110,252, 57,252,181,230,178,166, 1,130, 12, 81, 89, 97, 82,131,193,176, 27,128, 88,
+ 36, 18, 69,118,236,216,209,123,247,238,221, 5,190,190,190,156, 88, 36, 82,247,239,215,151, 19,138, 68,121,197,159,253,227,143,
+ 63,132,227,198,141,115,203,207,207,127,148,157,157,125, 17,128,189,252,134, 96,120,119,208,216, 10,138,146, 42,101,242,148, 26,
+ 53,106, 6,181,140,104,237,241,250,160,193,144,136, 37,248,253,196, 49, 44, 95,186, 96,135, 62,243,222,123,149, 57,146,175,106,
+212, 97,218,163,164, 68,163,201,210,168, 97,139,206,212,249, 19,251, 38,218,224,187,148,145,216, 22,117, 31, 52,161, 86, 98,134,
+ 30,203,231,127, 14, 47, 15, 5,146,226,239,155, 30,220,187,179,202,110,214,126,238,178,201, 2, 32,207,101,223,104, 51, 34,210,
+203, 98, 99,113, 46,234,176,153,115,112,145, 23,207, 30,137,175, 18,214, 82,218,176,101, 55, 47,205,254,181,131,140,192,182,138,
+116,210,239, 63, 31,193,229,173, 5, 73,167,162, 78,122,248, 87,107,192, 80,160, 96,179,152,161, 78,184,234, 48,102,223,215,106,
+211,163, 93, 26,133,155,155,138,111,190,252,238, 63, 31,180,108,209, 66,193, 67,250, 84, 4,171,216, 96,105,180, 86,248,186,137,
+ 97,210,170,241,224,234, 49,179, 81,205,148, 59,223,153,195,106,144,107,114,178,197, 79,210, 25,226, 34,202,251,188, 38, 39, 91,
+236,176, 26,228, 21, 63,234, 24,184, 43,196,184,147,148,254, 56,241, 93, 34,116,230,102,137,133,204,227, 60,173,226,186,160, 2,
+ 58,139,164,158, 72,207, 53,131, 2, 15,142,117,192, 97,183, 66,167,213, 34, 61, 35, 11,217, 89,217,208,233, 10, 32, 87,122,161,
+ 97,211, 86,112, 83, 72,113,235,204, 14,240, 60,239,210,188,134,118, 74, 24,222, 50,162,131, 36, 58,217,153,139, 37, 21,242, 56,
+184,117, 65,174, 94,155,211, 65,159,249,224, 65,101,235, 98, 7,203,158,188,125,247, 65,131, 42,129, 53,168,155,241,133,216,180,
+102, 5,172, 69,145, 77,187,157, 69,244, 35, 3, 50,243,140,120,148,112,143,231, 88,246, 36,254, 71, 16,148, 29, 0,132,160,113,
+195,122,232,249,246,235,248,233,167, 85, 72, 72, 76,230,230, 78,236,253, 72,175, 43,120,173, 18, 38,171, 59,138,230,218, 48,102,
+199, 46, 52,121,181, 76, 59,112, 35,143, 54, 89,249,114, 19,124,164,126,213,208,225,189,197,199, 77,186, 60, 49,107, 49, 10, 14,
+110,122,111,107,105,154, 78, 7, 13,235,220,201, 67,160,148, 9, 64, 81, 20,138,187, 11, 87,206, 30, 11,185,196,217,183,108,178,
+ 56,240,246,164, 37,216,180,228, 51,240, 0,134, 13,190, 96, 44,171,156,112,174, 93,248, 81, 32,174, 84, 73, 73,206, 73,239,222,
+111,242, 41,179, 77, 98,233, 59,112,228,181, 22, 45, 90, 20,200,100, 50,200,100, 50,184,187,187,195,203,203, 11,158,158,158, 21,
+238,187,221,110,215, 91,173, 86, 31,177, 88, 12,142,227,144,148,148,132,164,164, 36, 20, 22, 22, 66,173, 86,195,160,215, 58,174,
+156,218, 41,104,216,166, 55,130,106, 54, 66,181, 58, 77, 32,100, 40, 8, 4, 52,206, 28, 88, 83, 86, 57, 75, 55, 89,157,250,175,
+236, 54,224,125,252,190,103, 53,127,245,220,193,241,166,156,184, 53,174,158,163,162,238,158, 91,131, 6, 13,106, 52,110,220, 56,
+209,119, 83,198, 29, 63,124,226, 76,220,206, 67,171,251,229,231, 23,132,240, 60, 15, 79, 15,143,212, 33,253,218, 30,236,210,174,
+101,202,169, 83,167,184,173, 91,183, 90, 40,138,186, 83,158,166,179,146,202,249,237,212,201,168, 25, 29, 58,117,198,218, 13, 91,
+ 59,197,220,189,215, 41, 62,254, 1, 66,170,213, 68,141,208, 58, 48, 82, 94,136, 58,123, 30,250,130,156,223, 92, 41,231, 51, 81,
+ 45, 42, 63, 63,255,207, 33, 67,134,244,188,112,225, 2, 61,100,200, 16,163, 70,163,249,163, 68, 20,139,175, 72,243,226,207, 3,
+213, 0,126,171,214,105,212,142,116, 91,193, 39, 0, 22, 84,173, 86, 21,103,206, 95,196,197, 11,151, 87,105,228, 85,103,190,247,
+246,187, 99,171,247,103,222,239,223,166, 58,163,242,146, 99,203,234,197,204,129,139,201, 75,146,115,217,181, 11,206,206,152,237,
+202, 57,122,252,224,208,217,208,174,158, 55,236, 44, 15,142,119, 86,184,110, 82, 97, 89, 21,239,115,154, 2,171,228,189,241,227,
+198,197, 55,108,220,244,211,183,223, 29, 47,106, 90, 51, 4, 87, 30, 22, 0, 20, 5,239, 0, 5, 50, 51, 51,113,110,215,106, 71,
+126,250,253, 85, 12,195,205,170,196,241, 68,126,202,205,218, 37, 54,199,106, 52, 26,156, 57,115, 6,197, 6,203,207,207,175, 44,
+163,245,148,102,110,118,198, 31,179,191,255,165,221,152,119, 6,162,111,231, 6, 56,123, 53, 30,214,162,249,154,138,135,146, 39,
+ 94,252, 89,252,201,144,154,214, 15, 6,133,105, 77,118,113,242, 55, 73,133,231,224, 92,131,149, 43,163,156,214,188,188,188, 3,
+177,177,177,237,155, 52,105, 82,253,200,145, 35,121, 49,151,143, 79, 44, 89,136,201,147, 39, 43,127,250,233, 39, 57,207,243,127,
+ 88,173,214, 4,151,246,157,198,150,235,215,174,249,216,236, 28,206, 95,190, 85,175, 91,187,166,224,120,224,234,213,171, 88,187,
+110,173,249,206,237,155,139, 12,217, 1,179,202, 49, 47,165, 30, 79,246,229, 70, 29, 62,214,204, 76, 79, 94,244,251,225, 93,155,
+ 90,118,234,135,225, 31,205,154,117,230,240,214, 25,205, 59,244,165,235,181,236,137,235, 23,163,112,242,200,177,255,216,244,121,
+ 51, 80,113,238, 72,169,229,148,200,228, 31,215,111,222, 9,143, 82,146,145,244, 32,250, 55,115,222,195,140,148,120,230,183,140,
+180,148,241,161, 13,218,225,194,241,109, 19,203, 49, 90,229, 94,243, 33,126,178,213, 71, 14, 29, 24,154,150,246,115,128,193,100,
+150,240, 60,111,150,136, 5, 89, 74, 90,183, 93,235,114, 57,239,217,212, 25,213, 7, 13,126,123,252,225,229,203,151, 10,253, 61,
+229,200,202, 55, 67,107,178, 65,103,180,129,166, 40,212, 14, 82,192,168,203,195,217, 93,223,219,173,250,252, 33, 64,188,173, 44,
+ 77,133, 42,124, 78,254,195,168,143, 38, 79, 56, 13,177, 71, 72, 80,141,174, 95,150, 27,173,211,165,223,236, 55,121,194,193,112,
+158,231,187, 41, 84,225, 58, 67, 78,236,244,178,246,157,162,156,247,247,240, 46, 33,176, 57,156,243,143, 57, 56,128,229,184,162,
+ 40, 31,192, 63,238,207,167, 42,216,119,138,219,126,248, 15,100,100, 23,192,100,181,195, 98,117,192,102,103, 65, 51, 12, 60,189,
+ 60, 81,167, 70, 51,120,120,186, 35, 59, 43, 3, 23, 79, 29, 64,220,237,179,127, 80, 60,102,154,212, 15, 78,185,114,142, 68, 50,
+207,240,192,160, 0, 58, 83,107,133, 76,204,224,230,217, 35, 54,187,213,178,200, 69,147,245,156,102, 65,110,222,146, 79,167, 76,
+ 29,246,235,250, 13, 1,141, 66,221,145,166, 49, 33, 77,109,134,206,108, 47, 50, 98, 28, 44,122, 13,110, 71,109,200, 98,205,186,
+ 37,248, 31,161, 76,163,229,176,153,117,187,143, 93,241,153, 54,227,123,230, 97,124,130,125,206, 39,125,210, 76,122,109,239, 74,
+ 71,178, 74,240,235,135,161,219,254,138,157,120,174,187,144,231,192,241, 60, 14, 94,206,122,220, 93,200, 21,101, 94,222,136, 47,
+127, 25,193,146,107, 23,118,238, 61,241,247,219,177,186,205, 38, 83,182,199,253,135,139,242, 1,128, 97,152,199,175,226,220, 44,
+179,217,108,173,160, 11,101,227,154, 53,107,190, 24, 63,126,188, 36, 53, 53, 21,241,241,241, 40, 40, 40,128, 84, 42,197,177, 99,
+199,236,224, 28,139,110, 95,216,155, 20,123,253,196,183,225, 45,122, 86,105,212,166, 55,228,114, 5, 4,188,235,201,152,114, 85,
+216,208, 22,157,250,255,216,237,245, 49, 56,185,119, 13,127,245,236,129, 9, 38,117,220,234,202, 30,203,130,130,130, 24, 0, 15,
+ 22, 45, 90,212,116,237,218,181,161, 83,166, 76, 73,216,248,227,140,229, 0,144,155,155, 11, 0,184,113,227, 6, 63, 97,194, 4,
+139,217,108, 78,204,207,207,191,142, 10, 6, 64, 0,128, 73, 45,159,183,118,229,130,134,169,233,153, 3,107, 54,108, 5,191,208,
+ 86, 8,168,221, 26,249, 58, 27,174, 60,204, 64,194,189, 83,184,119,126,215, 17,163,210, 49, 3,149,156,223,184, 73,147, 38, 33,
+ 52, 77,215,208,235,245, 1,245,235,215,111,162, 80, 40,110, 52,105,210,164,153, 64, 32, 72,187,118,237, 90,114,101,180, 82,206,
+110,176, 84,235, 52,234,135, 20,157, 91,151,132, 44, 99,179, 20,157,219, 13,163,196,227, 51,117,212, 15,150, 95,153,224, 37,188,
+ 77, 19,179,115,131,118,247,150,213,139,153,183,199, 78,102,163, 11,189, 62, 17,200,196,191, 87, 46, 92, 77,103,126, 48,114,192,
+147,233, 29,138, 34, 89, 69,191,187, 20,166, 47, 44,188, 93, 8,224,139,219,119,133, 63, 70,127, 50,110,118,227,150,237, 70,116,
+124,109, 8,237, 16, 41,113,124,239,207,124,226,237,168,157, 2,158,253,218,228,194,106, 0, 21,118, 7, 89,173,174,152,172,231,
+203,152,170,232,188,115,235,186, 81,187,247,238,153,255,122,255, 1, 62, 43,191,121, 11,223,255,178, 15, 10,153, 4, 60,199,225,
+173, 46, 33,111,126,251,126,221,126, 33,254,210,224,221,167,211,206,125,180, 52,250, 11,163,209, 22,231, 66, 36,134,215,104, 52,
+231,149, 74,165,186,125,251,246, 17, 18,137,132,210,104, 52, 2,149, 74,229,240,240,240,176,166,165,165, 25, 45, 22,203,110, 0,
+149,154,118,220,102,231,144,148,109,198,254, 61,187,113,235,242, 41,220,187, 23,171,187,119,247,222, 10, 74,192, 47, 53,100, 63,
+200, 3, 42,221,192, 7, 87,234,168, 67,190,210,163, 14, 89,139,110,203,198, 85,115,186, 26,205,150, 81, 77,218,246, 65,245,122,
+237,104,155,157,197,157,171,167,113,122,215,210,239,109,250,188,105, 47,115,142,131,170,132,214,225, 25, 49,254, 60,115, 24, 60,
+199,173, 2, 0,158,227, 86,221,184,112,100,124,235,222,239,195, 91, 85,189, 73,193,163, 27, 20, 94, 96,246,112,145,128, 54, 28,
+221,253,235,222,164,164, 36,220,191,127, 31, 15, 31, 62, 68, 94, 94, 30,182,108, 73,170,212,249, 49,230, 39,255, 30,119,151,238,
+245,198, 91,195, 15,190, 57,244, 29,105,104,157, 70,116,120, 21, 47,248, 40, 5,136,125,152,140,184,107,183,185,216, 43, 71,204,
+ 54,109,206,235,166,252,228, 50,141,159,220,183,158, 63,192, 78, 43, 94,187,176, 77,155,118,225, 83,231,206,143,240,241, 83,149,
+ 90,143,231,170,115,196,159,127,116, 32,252,226,165, 63, 93, 90,235,144, 99,217,220,177,163,134,112,140,115,161, 80, 60,142, 83,
+ 23, 29, 61,103, 99,202,249, 62,207, 57, 42,140,224,191, 59,176, 3, 28, 28, 7,131,201, 6,173,193,130, 66,157, 25,153, 57,185,
+184,117,251, 54,206, 30, 60,128,248,216, 91,137,118,171,245, 4, 77, 83,187, 76,217,113,103, 43,215,211, 36, 8,245,241,246, 70,
+ 98,158, 30, 82,177, 0,201,113,215, 44, 6,109,225,230, 23,189,142, 76,185, 15, 50,115, 24,170,231,144, 33, 67,143,117,237,213,
+223,163,101,219,238,114, 95,119, 79,136, 4, 60, 30, 36,101,224,250, 31,199, 12, 9,183,206,105,237, 86,125,228,171, 88,245,229,
+111, 78,197,163, 14,109, 22, 67,191, 97, 3, 58,237, 97, 24,129,152,227, 28, 22,155,213,242,198,203,152,172,191, 10,158,103,211,
+ 70, 13, 27,248, 84,219,192,193,241,178, 97,131,143,155, 74,182, 21,236, 44, 47, 31, 54,248, 15,163,179, 2, 41, 59,177, 47, 48,
+208,187, 79,241,218,133, 41, 41,185, 87,243,242, 44,167, 1,164,153,205,230, 23, 46, 99,118,118,246,236,185,115,231,246, 53, 26,
+141,117, 59,119,238, 44,113,119,119, 71,110,110, 46, 78,156, 56, 97, 63,116,232,208,221,156,156,156,111,129, 28,135, 9,205,126,
+187,109,222, 59, 50,246,218,137,111,235,182,232, 85,165, 81,219,222,174, 87,102, 18,217,152,174,253, 71, 83, 39,247,173,225,175,
+156,217,247,129, 73,253,224,151,151, 56,172, 54,179,217,124,217,108, 54, 71,127,253,245,215, 45,253,253,253,253,191,253,246, 91,
+169, 86,171, 21,174, 92,185,210,172,209,104,178,180, 90,237, 69,148,147, 79,243, 60, 55,236,133,233, 24,116,116,247,154, 46,252,
+238, 53, 61, 60,125,131,123,122,248, 85,169, 85,160, 78, 79, 44, 84,103,156, 0,112,178,104,162,200, 74,209,180,105,211,154, 20,
+ 69, 13, 1,208, 80,161, 80,212, 86, 42,149, 18,158,231,235, 82, 20, 21,195,113,220,237,250,245,235, 31,186,123,247,110,165, 38,
+147, 77, 57,187,193, 18, 18,222,110,107,158,145, 19, 89,105,209,214,148,179, 27, 44, 0,144,243,251, 84, 35,128,253,119, 59,127,
+ 49,232,192,197,228,229, 49,249, 30, 19,213,103,230, 31,168,108,153, 11,211,110,213,126, 85,215,191, 57,243,110, 26,128, 81,183,
+175, 97,241,157, 27, 23,191,163,120, 8, 89, 56,230,152,114, 30, 94,123, 21,250, 66,161,208, 28, 28, 28, 92,234,232, 66,137, 68,
+ 98,182, 88,202, 11,160,156,117,232, 51,177, 22,232,180, 97,207,142, 13,163,246, 29,216, 63,191, 99,183,215,125,164, 85,170,160,
+134,138,194,134,105,205, 39,158,186,161,190,210,127,234,185,159, 18, 50,204,183, 81,201,124, 24,189, 94, 31, 7, 32, 95,175,215,
+ 15,224,121, 62,149,162,168,144,252,252,252,155,118,187,253, 78,165, 13, 1,135,225,109,218,180,218, 66, 81,148,128,119,112, 11,
+ 47, 10,153,173,230,204,123,105,120,201,101, 73, 26,213,112,199,164,111,127,104, 94,171,118, 88,243,226,181, 14, 27, 84,119,195,
+184, 47, 22, 55,175, 30, 90,167,249,147,245, 15, 43, 76, 19,224,237,198,252,247,246,172, 91,120,238,198,165,211, 95,249, 6, 86,
+175,158,149,150,112, 47,245,225,205,217,172, 89,187,231,101,207,115,210,195,152,165,107, 23,125, 49, 37, 51, 61,113,173, 81,253,
+ 32, 26, 0,140,234, 7,209,247,174,227, 27, 77, 86,218,148,220,156,132, 69, 47,122, 44, 12, 6, 67,198,230,205,155, 61,219,181,
+107, 71,251,251,251, 67,173, 86,227,244,233,211, 28,199,113,233,149,214,202, 75, 60,109,200,163,188,127,251,229,199,133, 34,133,
+ 91,111,135,195, 17,196,243,128, 64, 32,200,180, 26,181,199,116,180, 98, 42,242,147,205,229, 63, 51, 56, 10, 0, 93,188,118, 33,
+199,113,212,194,229, 27,146,133, 82,183, 82, 39, 67,180,155,117,114,142,227, 92, 94,235,176,224,209,245, 90,175,234,254,166,120,
+126,102,147, 22, 17, 95,217,237, 54,115,209,253, 97, 6, 96,230,121,228,210, 52,117,150,225,236,199,181, 47,209,152,162, 40,184,
+243,148, 0,110, 50, 1, 40, 80,208, 23,230,241,149,201,201, 42,213, 16,231,196,197, 24,115, 58, 85, 59,106,221, 49, 50,234,247,
+ 35,131, 89,150,173, 81, 20, 51, 72,178,152, 12, 59,245,153, 94,191, 1,215, 28,248,247,115,184,216,108, 81,127,241, 63,114,169,
+ 27,229,239,164, 25, 30, 42, 27, 80, 37,216,127,100, 82,114,206,149,132, 84,227,111,120,122, 89,157,151, 41, 39,227,239,239,255,
+ 13, 69, 81, 35,196, 98,177,210,106,181, 26,120,158,223,152,157,157, 61, 27,207, 45,254,219, 76, 40, 83,153, 70,138,165,242,233,
+ 54,179,225, 79, 99, 78,220,240,138,246, 93,238, 23,214, 83,170, 80,124, 97, 54, 25, 54, 26,179,227, 54,188,226,227,233, 33,145,
+ 72,154, 41,149, 74,161, 70,163,185, 12,160,240,239,116,222,155, 52,105, 82,149,166,233, 26, 28,199,249, 3,240,128,115, 84,136,
+ 70, 32, 16,164, 23, 69,180,248,202,106,182,127,119,167,111,183, 30, 13, 38,157, 56, 23,187,172,168, 91,241, 49,193,111, 46,145,
+142,232,221,101,242,111,123,246,151, 54,234,240, 31,119,205,255,255,105,118, 18, 40, 3, 53,163,104,177,199,156,110,225,102,163,
+ 38, 35,125,194,249, 59,234,203, 0,116, 47, 83, 78,145, 72,244,182,205,102,147,137, 68, 34,147,205,102,219,252,119,217,119,153,
+ 42,124, 52, 13,222,229,149, 41, 56, 80,215,158, 25,180,242,111,185,150,152, 70,141, 26,117, 16,137, 68, 85, 89,150,149, 91,173,
+ 86,163,201,100, 74, 74, 78, 78,254, 19,101, 47,124,254,151,150, 83,161,170,179, 84, 36,146,124, 2, 0, 54,155,229, 7, 67,206,
+131, 73,229,125,177,156,207,255,163,207,145,111,141, 22, 15, 4,140,208, 15, 69, 19,115,115, 14,135, 58, 59,241,106,157,255, 98,
+ 57, 9, 47,120,114,137, 38,209, 36,154, 68,243, 89,104,114, 60,137,230,127, 83, 83, 26, 88, 47, 68, 26, 88,207,229, 73,151,203,
+248, 60, 57,158,132, 98,198,150,242, 2,224,194,132,165, 4, 2,129,240, 23,192,145, 67, 64,248,111, 98,206,188,151,250, 87,126,
+158,240, 63, 71,153, 57,209, 84, 57,174,180, 50, 33,193, 23,113,182, 39,137, 38,209, 36,154, 68,147,104, 18, 77,162,249, 63,167,
+ 89,145,246, 63,177, 75,114,236, 51,219,135, 1,252,191, 36,252,147,176, 42,209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,215,
+120,108,188,104,114, 44, 8, 4, 2,129, 64, 32, 16,254, 26, 72,142, 22,129, 64, 32, 16, 8, 4,194,203, 81, 90,215, 33, 49, 90,
+ 4, 2,129, 64, 32, 16, 8,175,128, 50,147,225, 73,215, 33,129, 64, 32, 16, 8, 4,194,203, 81, 28,209, 10,196, 51,211, 59, 16,
+163, 69, 32, 16, 8, 4, 2,129,240,106,200, 68,105,209,173, 67,135, 14,241,165,253, 78, 32, 16, 8, 4, 2,129,240,255,193, 63,
+220,139,148,140,100,141, 45,218, 6, 80, 34,162, 69, 12, 22,129, 64, 32, 16, 8,132,191,139,217,250,135, 81, 28,201, 42,126,101,
+ 62,103,180,250,246,237, 75, 17,179, 69, 32, 16, 8, 4, 2,225,191,197,191,209,139,208,207,238, 32, 57,205, 4, 2,129, 64, 32,
+ 16,254,155,102,235,223,180, 63,100,122, 7, 2,129, 64, 32, 16, 8,132,151, 35, 16, 64,159, 18,219,255,111, 75,240, 16, 8, 4,
+ 2,129, 64, 32,252,219, 25, 91,214, 54,137,104, 17, 8, 4, 2,129, 64, 32,188,122,179, 69, 32, 16, 8, 4, 2,129, 64,248, 39,
+ 67, 86, 54, 39,154, 68,147,104, 18, 77,162, 73, 52,137,230,191,157,226,121,180,128,178,230,209, 34, 16, 8, 4, 2,129, 64, 32,
+188, 16,125,224,156, 63,107,108,209,207, 62,196,104, 17, 8, 4, 2,129, 64, 32,188, 90,158, 91,126,135, 24, 45, 2,129, 64, 32,
+ 16, 8,132, 87,107,176, 86, 19,163, 69, 32, 16, 8, 4, 2,129,240, 23, 67,140, 22,129, 64, 32, 16, 8, 4,194, 95, 4,133,178,
+ 71, 14,156,172,132,206,139,140, 62, 56, 73, 52,137, 38,209, 36,154, 68,147,104, 18,205,255, 57,205,138,180, 79,226,159, 71,241,
+204,240,135,241, 36, 17,126,245,255,199, 63, 38, 67, 95,137, 38,209, 36,154, 68,147,104, 18, 77,162,249,111,103,236, 51, 63, 31,
+ 67,186, 14, 9, 4, 2,129, 64, 32, 16, 94,173,217, 34, 75,240, 16, 8, 4, 2,129, 64, 32,188, 34,202,236, 38, 36, 17, 45, 2,
+129, 64, 32, 16, 8,132,151,163,204, 69,165,137,209, 34, 16, 8, 4, 2,129, 64,248,107, 12, 23, 49, 90, 4, 2,129, 64, 32, 16,
+ 8,175,208,100,141, 45,245,175,135, 14, 29,226,201, 49, 34, 16, 8, 4, 2,129,240,223,226, 95,235, 69,138,119,140,152, 45, 2,
+129, 64, 32, 16, 8,196,139, 84,154, 64, 60, 25,109, 56,182,104, 27, 0, 25,117, 72, 32, 16, 8, 4, 2,129,240,178,244,193,211,
+ 35, 15,199, 22,111, 19,163, 69, 32, 16, 8, 4, 2,129,240,242,140, 45,247,175,164,219,144, 64, 32, 16, 8, 4,194,127,147,127,
+163, 23,161,200,105, 37, 16, 8, 4, 2,129, 64,120, 41, 74,139,102,173, 38,135,133, 64, 32, 16, 8, 4, 2,225,175, 53, 92, 4,
+ 2,129, 64, 32, 16, 8,132,191,194,100,253,213, 19,150,146,149,205,137, 38,209, 36,154, 68,147,104, 18, 77,162,249,191, 98,178,
+ 74, 78,241, 0,128,140, 58, 36, 16, 8, 4, 2,129, 64,120, 89,200,162,210, 4, 2,129, 64, 32, 16, 8,127, 17,100, 81,105, 2,
+129, 64, 32, 16, 8,132,255,103,195, 69,140, 22,129, 64, 32, 16, 8, 4,194, 43, 52, 89, 79,153, 45,146,163, 69, 32, 16, 8, 4,
+ 2,129,240,114,148,153,163, 69,161,236,145, 3, 39, 43,241, 15, 94,100,244,193, 73,162, 73, 52,137, 38,209, 36,154, 68,147,104,
+254,207,105,254, 31,123,231, 29,214,212,217,254,241,111, 22, 25, 36,144,176,195, 86, 25,226, 2, 69,235, 22,247,170,184,169, 91,
+235,174,213,106,245,181,110, 5, 90,181,142,186,107, 91,251,186,234,168,187, 86,113, 83, 7,110, 37, 40,130, 34, 32,136,128,236,
+145, 9, 36, 33,201,243,251,131, 81,106,153,218,190,191,142,231,115, 93,185, 32,201,201, 55,207, 57,231, 57, 39,223,115,159,231,
+185,239,186,180,195,241,247,103, 6,254, 71, 9, 75,233,212, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,160,233, 29,
+ 40, 20, 10,133, 66,161, 80,254,104, 99,245, 38,212,104, 81, 40, 20, 10,133, 66,161,188, 27, 52,143, 22,133, 66,161, 80, 40, 20,
+202,159,132, 35,202,162, 90, 21,127,253,169,209,162, 80, 40, 20, 10,133, 66,249, 99, 24,132,178,168, 86,197, 95,106,180, 40, 20,
+ 10,133, 66,161, 80,254, 64,170,205,163,197, 0,128,176,176, 48, 82,254,188, 71, 96, 96,224, 13,186,173, 40, 20, 10,133, 66,161,
+252, 47,249,167,122,145,202,136, 86, 96, 96, 32, 3,192,117,186,171, 41, 20, 10,133, 66,161,252,127,240, 79,244, 34,204, 55,156,
+100, 15,186,155, 41, 20, 10,133, 66,161,252,127,240, 79,244, 34,236, 55, 92, 36,133, 66,161, 80, 40, 20,202,255, 11,127, 99, 47,
+226,136,178,129,240,231,202,255, 2,229, 41, 31,104, 30, 45, 10,133, 66,161, 80, 40,148,119,163, 98,182,225,239, 74,239,208, 40,
+ 22,133, 66,161, 80, 40, 20,202,187, 81, 93,102,248,239,233,102,161, 80, 40, 20, 10,133, 66,249, 19,161, 17, 45, 10,133, 66,161,
+ 80, 40,148,119,167,106, 84,235,127, 22,205,162,149,205,169, 38,213,164,154, 84,147,106, 82, 77,170,249,111, 50, 89,191,121, 78,
+ 51,195, 83, 40, 20, 10,133, 66,161,252, 73,208, 89,135, 20, 10,133, 66,161, 80, 40,239, 70,197,140,195,170,207,169,209,162, 80,
+ 40, 20, 10,133, 66,249, 3,205,214,239,160,183, 14, 41, 20, 10,133, 66,161, 80,222,141, 25, 53,189, 65,141, 22,133, 66,161, 80,
+ 40, 20,202,159,100,184, 24,168,121,230, 64,120, 3,132,223,102,246, 65, 56,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,117,
+154,117,105,135,227,239,199,255, 91,194, 82, 58,245,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 90,232,173, 67, 10,133,
+ 66,161, 80, 40,148,191,128,209,178, 99,179,217,203, 4, 2,193, 55, 2,129, 96, 23,155,205,254, 10,128, 85, 67,191, 80, 40, 20,
+206,149, 74,165,113, 82,169, 52,221,205,205,237,188,133,133,249,167, 30, 60, 4, 0,224,252, 65,235,227, 3,224, 83,129, 64,240,
+140,207,231,167, 0, 56, 8,224, 83, 0,182,239, 34,252,133, 19, 70,198,204, 27,122,250, 11, 39,140,124,227,173, 65, 14, 14, 14,
+ 55, 1,244,251,163,118,202, 24,115,244, 9, 18, 34, 53, 72,136,212, 49,230,111,127,213, 96, 97, 97, 49,193,209,209,241,174,141,
+141,205,107, 71, 71,199,219,124, 62, 63,168,129, 18,246, 14, 14, 14, 27, 93, 93, 93,227,157,156,156,182,162,172, 58,249, 95,150,
+110, 60,116,235,200, 67,110, 39, 46, 84, 93,184,248,166, 19, 23,125,251, 2,230,111, 41,215, 21,192, 9, 75, 75,203, 71,108, 54,
+ 59, 12,192,136,242,254, 53,130,205,102,135, 89, 90, 90, 62, 2,112,162,124,185,183,233,167, 27, 1,188, 6,176,182,252,249, 39,
+174,174,174, 42, 63, 63,191, 20, 63, 63,191,125, 94, 94, 94, 19,235, 43, 14,106,110, 21, 0, 0, 32, 0, 73, 68, 65, 84,102,110,
+110,222,215,213,213,245,164,155,155, 91, 74,167, 78,157, 10,156,157,157,159,187,184,184,236,231,241,120, 61,232, 41,142, 66,161,
+ 80,254,250, 12, 6,240, 37,128, 29,209,209,209, 50, 66,136,140, 16, 34,139,142,142,150, 1,248, 6,192, 58,212, 28, 66,252,205,
+235, 54, 54, 54,161,171, 87,175, 46,201,204,204, 36,185,185,185, 36, 62, 62,158,108, 89,177,216,212,223,154, 77, 60,236,172,138,
+ 28, 29, 29, 95,184,187,184, 28,105, 41, 98, 46, 6,224, 89, 31,205, 42, 88, 9, 4,130,251, 43, 86,172, 80,223,188,121, 83,173,
+211,233,212, 38,147, 73,157,145,145,161, 14, 15, 15, 87,119,233,210, 69, 13, 96, 62, 0, 86, 3, 52, 43,249,220, 9, 55,200,158,
+149,228,115, 39,220,168,250,122,179,102,205,158,154, 76, 38, 50,114,228, 72, 45, 0,231,134,104,190,137, 51,192,111,105, 9, 73,
+144, 8,217,134,253, 95, 16,178,115, 33, 9, 18, 34,245,109, 52,237,237,237,127,158, 59,119,174,242,245,235,215, 68,171,213,146,
+212,212, 84, 50,115,230, 76,133,189,189,253,161,122,174,187,141,175,175,111,246,221,187,119, 77,114,185,156, 92,191,126,221,212,
+170, 85,171,236,122,154,173, 62,111,180,229,123, 39, 39,167,243, 13,121,216,219,219,239,110,232, 62,234,192, 67,170, 94,118,141,
+144,135,151,201,153,145,157,200,150,118, 46,100,132, 53, 87,222,149,139, 79,186, 87,159,202,164, 38,205, 15,186,119,239,174,121,
+242,228,137, 49, 63, 63,159, 60,125,250,212, 52,125,250,244, 18, 0,177,211,167, 79, 47,121,250,244,169, 41, 63, 63,159, 60,121,
+242,196,216,189,123,119, 13,128,105, 13,104, 39, 19,192,222,144,144, 16, 66, 8, 33,171, 87,175, 38,126,126,126,164, 87,175, 94,
+ 68,173, 86, 19, 66, 72, 10, 33,100,159,193, 96,248,176, 62,154, 98,177,120,194,220,185,115,213, 69, 69, 69,164, 2,147,201, 68,
+228,114, 57,217,177, 99,135, 70, 42,149,158,175,225, 34,131,222,242,160,154, 84,147,106,254,213, 52,255,206, 56,162,108,156, 86,
+197,163,222,129,137,177,139, 23, 47,174, 48, 85, 23,186,118,237,250,224,195, 15, 63,148,125,248,225,135,178,174, 93,187, 94, 7,
+112, 41, 50, 50, 82,182,104,209, 34, 25,128,177,117,236, 8,171,206,157, 59,203,179,178,178,136,183,183, 55,105,212,168, 17,201,
+202,202, 34,132, 16,242,240,131,182,228,151,230, 32,105, 17, 23,200,229,159, 78,144,233,142,108,210,205, 81, 92,234, 40,149,230,
+219,218,218,174,193,111,107, 50, 86,183,115,135, 55,111,222, 92, 21, 27, 27,171, 78, 72, 72, 80,135,134,134,170,123,245,234,165,
+246,245,245, 85,143, 24, 49, 66,189,125,251,118,181, 94,175, 87,239,222,189, 91,109,105,105, 25, 91,141,217,122,107,163,197,102,
+179,183, 69, 71, 71,147, 23, 47, 94,144,242, 40, 69, 77,154, 98,137, 68, 50,192,202,202,106,190, 68, 34, 25, 0, 64, 12, 0,222,
+128,168,181, 24,110,159,180,246,104, 22, 54,182,143,231,142, 62,239,181, 13,178, 96,202, 75,191, 94, 72,200, 72,183,183, 50, 90,
+ 98,177,120,194,167,159,126,170,210,106,181,164,168,168,136,168,213,106, 82, 84, 84, 68, 84, 42, 21, 25, 59,118,172,146,207,231,
+ 15,175, 75,211,214,214,246,139,136,136, 8, 67, 86, 86, 22,137,136,136, 32,231,207,159, 39, 59,119,238, 52,217,219,219,111,110,
+232, 1, 40,149, 74,175, 92,190,124, 89, 22, 21, 21, 37,187,127,255,190,172,180,180, 84,166,215,235,101,122,189, 94, 22, 22, 22,
+ 38, 59,117,234,148,236,232,209,163, 50,157, 78, 39,211,233,116, 50,173, 86, 43,107,210,164,201,197,134,238,163,246, 60,164,233,
+110,158, 33,100,243,108,162, 88, 63,139,200, 23,188, 79,114,102, 6,144,111,222,115, 33, 1, 2,156,197,239,107,123, 86,171,201,
+225,112,110,164,164,164,152,150, 46, 93,170,107,209,162,133, 98,202,148, 41, 37, 90,173,150, 16, 66,136, 86,171, 37, 83,166, 76,
+ 41,105,209,162,133, 98,233,210,165,186,151, 47, 95,154,216,108,118,120, 3,218,185,174,194,100,221,184,113,131, 84, 69,173, 86,
+147, 94,189,122,165,248,249,249,237,107,220,184,241,184,186, 52, 69, 34,209,208, 37, 75,150,168, 73, 53,148,150,150, 18,149, 74,
+ 69, 94,190,124,105,106,212,168, 81, 6, 0, 27,122, 50,167,154, 84,147,106, 82,163,245,167, 49,163,142,231,213,111,196, 69,139,
+ 22,201, 8, 33,178,229,203,151,203,202, 35, 91,102, 0, 68,229, 15, 54,128, 49, 75,150, 44,145, 17, 66,100,139, 23, 47,174, 88,
+166,166, 29, 49,248,248,241,227,250,173, 91,183, 18, 7, 7, 7, 34,149, 74,201,182,109,219,136,201,100, 34, 89, 97,135,200, 47,
+205, 65,158, 45,155, 68, 8, 33, 36,126,205, 28,242, 75,115,144,164,111, 63, 39,227,199,143, 47, 50, 55, 55, 31, 91,203,206,181,
+110,219,182,173,170,184,184, 88,189,127,255,126,181,185,185,249, 67, 0, 45, 80,118, 43,146, 81,222,214,137, 45, 90,180, 80,198,
+196,196,168,127,252,241, 71, 53,128,208,122,118, 24, 79, 0, 61,133, 66,225,136, 37,206,156, 4,178,103, 37, 89,226,128, 39, 0,
+ 90, 1,176, 43, 95,198,105,241,226,197,132, 16, 66, 92, 93, 93, 35,106,208, 20,251,250,250, 46, 78, 72, 72, 8, 46, 45, 45, 13,
+142,138,138, 10,110,218,180,233,210, 33, 77, 28, 59,157, 30,219,215, 95,241,249, 44,127,178,105,129,239, 87, 3,219,247, 57, 50,
+186,199,216,201,141,109,111, 78,177,231, 23,141, 18,179, 84,111,220, 58,172, 87,199,118,118,118,190,159,154,154, 90,105,174, 84,
+ 42, 21,121,253,250, 53, 73, 78, 78, 38, 55,111,222, 36,142,142,142,191,212,165, 41,149, 74,159,166,166,166,146,111,183,108, 33,
+ 35, 91, 53, 35, 1, 18, 11,210,221,202,130,180, 19,241, 53,205,129,118, 13, 53, 90,143, 30, 61,146, 1,144, 1,144,229,231,231,
+203,242,243,243,101,133,133,133,149,175, 1,144, 41, 20, 10,153, 66,161,144,233,116, 58,153,135,135, 71,131,141, 86, 23, 62,186,
+116,224,163,160, 19, 15,197,131,157,109, 51,102, 53,177, 53,222, 27,219,137, 20,206,238, 69,182,250, 59,147,174, 92,124, 82, 79,
+205,193, 92, 46,247, 58,128,133,229,166,124,210,128, 1, 3,138, 8, 33,100,192,128, 1, 69, 0, 38,149,191,254,105,185,201, 26,
+ 80,207,118, 50,189,188,188, 52, 21,145, 44, 0,119,188,188,188, 52,126,126,126,196,207,207,143,184,186,186,170,202,181,235,117,
+ 66,243,244,244,140, 47, 46, 46,174, 52,128,114,185,156,100,100,100,144,164,164, 36, 18, 27, 27, 75, 30, 62,124, 72, 82, 82, 82,
+200,177, 99,199,140, 18,137,228, 28, 61,153, 83, 77,170, 73, 53,169,209,250, 83,141,214,155,143,223, 18, 22, 22, 70,222,120,105,
+125,100,100,164,108,201,146, 37,178, 58,156,217,140,229,203,151, 87, 68,189,190,172,229,199,127,119,124,124, 60,153, 52,105, 18,
+241,241,241, 33, 62, 62, 62,228,195, 15, 63, 36, 10,133,130,168, 19, 99,200, 47,205, 65, 30,142,106, 71, 8, 33, 68,245, 44,138,
+252,210, 28, 68, 54,190, 51,121,252,248, 49,113,113,113,185, 92,203,247,159,189,125,251,118,238,161, 67,135,178, 80, 54, 30,139,
+ 3,160, 35,128,109, 2,129, 96, 47,202,110, 23, 54, 2, 96,229,237,237, 93, 80, 84, 84,164, 30, 57,114,164, 26,128, 91, 45,154,
+221,125,124,124, 94,236,222,189,155,228,228,228,144,130,130, 2,178,161, 75, 83, 66,246,172, 36,171,219, 53, 50,125,251,237,183,
+218,133, 11, 23,106,172,173,173,195, 0, 56,141, 28, 57,210, 64, 8, 33, 1, 1, 1,217,213,137, 73, 36,146, 1, 9, 9, 9,193,
+ 37, 37, 37,193,114,185, 60,184,160,160, 32,248,204,233,211,193,253, 91, 53,157,164,248,124,150,255,233,177,125,253, 7, 58, 91,
+141,216,220,239,189,143, 94, 47,157, 54,114,121,231, 22,207, 74,214,205,187,246, 65, 19,135,141,111,179,183,237,236,236, 50,181,
+ 90, 45, 1,240,187,199,139, 23, 47,136,141,141, 77,106, 93, 26,214,214,214,203, 63, 29, 51,218, 56,188,145, 51,121,177,117, 5,
+ 41,189,242, 35, 41, 61,191,159, 36,174, 95, 64,134, 72,109,149, 29,205,152, 75,234,219, 30,169, 84,122,229,254,253,251,191, 49,
+ 90,133,133,133,213, 26, 45,165, 82, 41,211,233,116, 50, 47, 47,175,139,239,218,235, 59,114,225,209, 93,192,122, 24, 53,169, 27,
+201,157,213,139, 12, 16,115, 82,222, 65,110, 12,128,235, 0,198, 55,240,115, 76, 0,235, 42, 12,213,250,245,235, 9, 33,132,120,
+121,121,105,240,110,147, 81,196,205,154, 53, 75,158, 54,109,154,161,121,243,230, 57, 93,186,116,145, 63,120,240,128,220,184,113,
+131,156, 63,127,158,156, 56,113,130,196,196,196,144,215,175, 95,147,248,248,120, 50,104,208, 32, 57,128,238,244, 92, 72,161, 80,
+254,202, 84,227, 69,254,246, 48, 43, 86, 44, 48, 48,144, 81,101, 5,197, 0,248,237,218,181,203, 93,183,110,221, 38,148,229,130,
+ 96,248,178,240, 65, 47, 1,251,113, 47, 1,251,177, 47, 11, 31,148, 71,140,190, 95,179,102,205, 23,126,126,126,153, 0, 4, 0,
+164,213,125, 17, 33,164,155,141,141, 13, 82, 83, 83, 33, 22,139, 33, 22,139,145,154,154, 10, 66, 8, 12, 4, 40, 37,128, 86,175,
+ 71,113,113, 49, 74, 76, 4,197, 38, 64,169, 86, 67, 42,149, 66,175,215,123,212,208,254,214,163, 70,141,242,240,245,245,205, 93,
+180,104, 81, 6,202,198,202,236,157, 58,117,234,149, 59,119,238,248,170,213,234,130,216,216,216,146, 86,173, 90, 13, 0, 32, 77,
+ 72, 72,152,176, 99,199, 14, 76,154, 52, 9,181,252,232,180, 26, 52,104,208,249,152,152, 24,143,241,227,199,227,250,245,235,216,
+176, 97, 3,242,242,242, 8, 0,104,181, 90, 98, 52, 26,245,157, 59,119,214,111,221,186,181,125, 64, 64,192,253, 38, 77,154,176,
+ 0, 32, 57, 57, 57,177, 58, 65, 6,131,209,212,221,221, 29, 90,173, 22,185,185,185,136,137,137,129,133, 88,140,232,140, 60,135,
+ 30,155,191,205, 95,118,250, 10,103, 76,123, 95,235,249,125,187,104,215, 94,190,238,221,194,201,193, 65,167, 47,149,198,103,102,
+103,188,205, 78, 53, 51, 51, 75,205,203,203,131, 78,167, 67,113,113, 49,148, 74, 37,242,243,243,145,151,151,135,140,140, 12,152,
+153,153,189,168, 75,195,178,160, 32, 34,249,246, 13,198,177,239,214,195,195, 80, 0,246,201,109, 96,255,252, 13, 60,117,185,216,
+181, 98,166,133,206,198, 46,196,210,194,162, 80, 34,145,124, 15,192,171, 46, 61,127,127,127,228,231,231, 35, 63, 63, 31, 54, 54,
+ 54,176,178,178,130,149,149, 21,228,114, 57, 20, 10, 5,148, 74, 37,188,189,189,209,186,117,107, 28, 56,112,224, 15,233,220,247,
+116, 72, 50,192, 56,235,202,243, 12,152, 9,133,104, 98, 37,114,127, 79, 4,235, 90, 62,210,139,195,225, 28,183,182,182,190, 12,
+ 96, 54, 0, 33,128,217,214,214,214,151, 57, 28,206, 48, 0,171, 1, 28,106, 96, 51,214,134,132,132, 44, 78, 72, 72, 48,127,252,
+248, 49, 22, 45, 90,132,208,208, 80, 36, 38, 38,126, 13,192, 84,190,204,199, 54, 54, 54, 97, 76, 38,243,191, 0,222, 7, 48,192,
+209,209,177,119, 29,186,195, 22, 46, 92, 88,210,182,109,219,248,103,207,158, 13,187,125,251,118,187, 5, 11, 22, 40, 94,189,122,
+133,248,248,120, 56, 58, 58,194,213,213, 21,106,181, 26,133,133,133, 24, 54,108,152,216,210,210,114, 44, 61,141, 83, 40,148,191,
+178,201,122,195,139,252,221, 34, 90,213, 62,175,246,138,218,220,220, 60, 68, 38,147,117,242,243,243, 99, 3, 56, 6, 0,190, 44,
+ 4, 13,235,220,102,239,233,239,215,251,157,218,186,194,175,191,159,247, 94, 95, 22, 42,102,177,133,181,107,215,206, 74, 38,147,
+117,230,241,120,159,212,208, 8, 2, 0, 86, 86, 86, 16,139,197,144, 72, 36,176,178,178,130,201,100,130,186,168, 4, 26, 35,160,
+ 42,209, 65,161, 80, 64, 85,254, 92,173,213, 67,163,209, 84,126,182, 26,122, 76,155, 54, 45,119,199,142, 29, 57,153,153,153,235,
+ 1,180,154, 52,105,210,208,237,219,183,227,234,213,171, 37,239,251,120,218,172,233,214,230,139, 22,153,137,193, 62, 28, 76, 7,
+ 16, 17, 17, 17,129,206,157, 59,131,193, 96,140,174, 78, 80, 32, 16,124,115,228,200, 17, 65,108,108, 44, 60, 61, 61, 99, 71,143,
+ 30,253,193,250,245,235, 61,132,234,130, 91, 0, 96,200,207,138,157, 51,103,206,202, 53,107,214,228,230,230,230,234,139,138,138,
+236,135, 12, 25,130,212,212, 84,188,126,253,250, 78, 13, 38, 51, 62, 42, 42,138, 40, 20, 10, 36, 37, 37, 33, 42, 42, 74,176,114,
+229,202,246, 70, 38,115,104, 58, 44, 38, 79,234,210,174,253,248,142,109,112,232,238, 99,179,155,207,147, 37,237, 26, 57, 91, 61,
+ 74,203,108, 92,202,192,139,183,217,219, 42,149,106,219, 23, 95,124,161, 86,171,213, 72, 79, 79,199,147, 39, 79,240,236,217, 51,
+164,164,164, 96,195,134, 13,234,130,130,130,237,117,105, 56,241,217,255,217,184, 96, 42,131,253,244, 14,240,248, 6, 80,164, 2,
+138,213,208,198,201,176, 47, 46, 11, 59, 79,254,196,125,149,154, 42, 57,122,244,232, 52, 55, 55, 55, 25, 0,239,218,244, 8, 41,
+219,133, 76, 38,243, 77, 19, 10, 38,147,169, 2,144, 37, 20, 10,211, 44, 44, 44,210,152, 76,102, 22, 33, 68,243,135, 92, 73, 24,
+160, 7,139, 5,112, 5, 96,114,106, 45,237,249,193,232,209,163,143,164,165,165,245, 79, 74, 74,234,180,125,251,246, 47,248,124,
+126,244,246,237,219,191, 72, 74, 74,234,148,150,150,214,127,244,232,209, 71, 0, 76,108,200,247,123,121,121,205, 9, 14, 14,198,
+134, 13, 27,208,186,117,107,120,123,123, 23,133,132,132,108, 3,176, 2,192, 39, 94, 94, 94,183,230,204,153, 51, 37, 39, 39, 71,
+154,158,158,222,250,235,175,191,158,185,109,219,182,247, 50, 50, 50,248,117, 72,119,237,215,175, 31, 46, 92,184, 0, 0,153, 0,
+146,242,243,243, 13, 25, 25, 25,104,214,172, 25,218,183,111, 15,181, 90, 13,181, 90, 13,185, 92, 14,119,119,119,152, 76,166, 78,
+244, 84, 78,161, 80, 40,255, 83,195, 85,189,209,226,243,249, 86,254,254,254,104,210,164,137, 21,202,103,107,217,112,217, 75,231,
+ 79, 27, 99, 46,146, 93, 4, 35,234, 23,140,238,214,210,220,134,203, 94, 90,254, 17,182,187,187, 59,207,223,223, 31, 66,161,208,
+185,134, 47,191,158,149,149, 5,127,127,127, 72, 36, 18,136,197, 98,248,251,251, 67,175,215, 67,161, 82, 65, 99, 4,138, 74, 77,
+ 80, 40, 20, 40,200,205, 70,145, 17, 48, 88,216, 32, 37, 37, 5, 44, 22, 43,185, 6, 77, 71, 79, 79,207,220,232,232,232, 92, 0,
+ 17, 0, 62, 10, 13, 13,197,146, 37, 75,176,106,213,170, 35,230,153, 47,251, 29,185,240,179,205,225,144,143,237,188,185,140, 49,
+ 0,244,105,105,105,144, 72, 36, 16, 10,133,213, 26,131,128,128,128,182, 66,161, 16,251,247,239, 39,233,233,233, 93, 80, 54,133,
+ 63,153,193, 40, 51,123, 2, 38, 20, 0,182,201,100,178, 14, 43, 87,174,124,222,167, 79, 31, 78,199,142, 29,177,122,245,106, 0,
+ 8,171, 78, 83, 46,151,223,155, 56,113,162,238,218,181,107,136,139,139, 19,158, 62,125, 58,104,245,234,213, 45, 95,189,122,197,
+ 59,123,254,226,192,131,105,202,160,245,151,111,242,215, 92,186,126,207,214, 82,216,162,177,173, 53,162, 94,189, 54, 51,178,240,
+160,174, 61,218,129,195,154,214,131,207,142,234,198, 99,102,246,224,179,101,239,113, 88, 83, 85, 42,213,209, 51,103,206, 92, 90,
+176, 96,129, 58, 39, 39, 7, 22, 22, 22,200,207,207,199,218,181,107,213, 81, 81, 81, 39,117, 58,221,217,186,116,141, 38,210,214,
+181,145, 27,240, 34,186,242, 53,189,137,224,129,206, 12,129, 31,205,131, 79,179,102,208,233,116,104,213,170, 21, 35, 52, 52, 84,
+ 40, 22,139, 63,171,211,244, 48,127,215,221, 12, 12, 6, 35,139, 16,242, 90,173, 86,167, 11, 4,130, 87,102,102,102,175, 10, 10,
+ 10,210, 9, 33,217,127,132,207, 34, 76,252,167,115, 43, 47,128, 39,192,171,124,117,198, 67, 53, 10,170, 91,208,194,194, 98,234,
+206,157, 59,249,123,246,236, 41,157, 51,103,142,118,230,204,153,156,226,226, 98,251,153, 51,103,114,230,204,153,163,221,179,103,
+ 79,233,206,157, 59,249, 34,145,104,196,219, 52,164,180,180, 20,209,209,209,235, 19, 19, 19,133, 40, 75, 55, 50, 47, 36, 36,100,
+ 82, 66, 66, 2,127,199,142, 29, 56,113,226, 4, 78,156, 56,129,161, 67,135, 98,238,220,185, 8, 14, 14,174, 77,206,220,207,207,
+207,223,198,198, 6, 55,110,220,200, 0,240, 10, 64, 91,145, 72,100, 49,116,232, 80,244,239,223, 31, 37, 37, 37,208,235,245,149,
+ 70,139,197, 98, 65, 34,145,216,208,115, 32,133, 66,161,252,233, 38,235, 55,102,139, 13, 0, 21,161,186,192,192, 64, 70,109, 63,
+140,198,194, 28,200, 53, 69, 72, 81, 20, 33,181,208,244,155,247, 76, 38, 83,173,223,158,145,145,113,246,238,221,187, 83,253,253,
+253,217, 25, 25,101,119,196,252,253,253, 81, 84, 84,132,140,199,247,161, 49, 1, 66, 79, 95,104, 52, 26, 20, 62,123, 4,145, 95,
+ 39,216, 12, 26,143,205, 59,118,104,243,243,243,191,171, 78,147,203,229,114, 92, 92, 92,114,147,147,147, 13, 0, 10,196, 98,113,
+ 63, 55, 55, 55, 92,191,126, 29, 0, 14, 17, 96, 35,162,174, 1, 55, 78,129,148,133, 84, 68,238,238,238,200,201,201,129, 90,173,
+190, 94,157,230,221,187,119, 19, 74, 75, 75, 91, 13, 25, 50,132,241,195, 15, 63, 28, 83, 42,149,171, 0, 60,209,154,192,122,156,
+150, 13,141, 17,124, 0,125,173,172,172, 62, 13, 14, 14,238, 61,103,206, 28,156, 57,115, 6,151, 47, 95,214,163,108, 44,216,221,
+106,100, 21, 73, 73, 73,187, 22, 46, 92,216,145,201,100,126,116,229,202, 21,131,183,183,183, 82,175,215, 27,155,250,248, 48, 87,
+133,126,110, 54,251,163, 25,146,252, 34, 60,237,223,212,177, 51,131, 1, 60,125,157,243, 42, 81,141,252,218,182,105, 0,151, 21,
+ 54,172,139, 95,192,212,209,131, 69, 66,207, 22,208,196,220,151,238, 58,126,126,179, 32, 42, 33,240, 70, 78,206,208, 51,103,206,
+ 4, 93,191,126,125,182, 78,167,107,194,227,241, 94,200,229,242,173,106,181,186, 78,147,197, 98,177, 6,105, 29, 93,172,228, 5,
+ 5,224,151, 71,162,148,165, 38,228,105, 13,136,147,120, 99,172,139,107,229,109,208,172,172, 44, 72,165, 82,134,209,104, 28, 92,
+155,230,229,203,151, 17, 24, 24, 88, 97, 60,193, 96, 48,192, 96, 48,242,124,124,124,178,121, 60, 94,190,153,153,153,114,227,198,
+141, 37, 37, 37, 37, 96,179,217,124,163,209,200,122,151,222,222,222, 28,246, 60,194,248,102,230,144,158,125, 90,183,104, 70, 34,
+ 30, 62,102, 20, 22,149,236,171, 37, 10,248,181,151,151, 23,187,160,160,224, 44,128,184,210,210,210,195,199,142, 29,227, 79,152,
+ 48,161,228,248,241,227,227, 0,120,108,218,180, 41, 72,173, 86, 55,168,164, 66, 98, 98,226,215,107,214,172, 89,188,124,249,114,
+ 28, 56,112, 96, 78, 98, 98,226,146,242, 72,215,208,224,224, 96,108,220,184, 17, 7, 14, 28, 48,197,197,197,157, 55,153, 76,137,
+ 11, 22, 44,240,115,112,112,200,203,204,204, 76,172, 69,182,221,128, 1, 3,180,183,110,221,226,170, 84,170,155, 0, 62,157, 53,
+107,214,180, 14, 29, 58, 40, 71,143, 30, 45, 42, 40, 40,144,155,155,155,115,119,239,222,109,197,102,179,161,209,104,192, 96, 48,
+160, 82,169,116,244, 60, 72,161, 80,254,170,212,228, 69,254, 38,212,248,219,192,174,110, 5,139,138,138,178, 83, 83, 83,155,189,
+126,253,218, 0,192, 0, 0,249, 58,195,151,107,118,159,218, 51,162,163,151, 48,179,180, 20,167, 31,198, 22,229,235, 12, 21,131,
+223, 13,175, 95,191, 86,189,122,245,202,162,184,184, 88, 93,195,119,221,249,230,155,111,138,175, 93,187,102,145,148,148, 4,163,
+209,136,182,109,219, 34, 62, 62, 30,133,113,209, 16, 54,107, 11, 97,247, 64,196,202, 30, 34,234,114, 56, 94,170,117,134,231, 43,
+214, 40,212, 26, 77,176, 94,175, 63, 93,157, 32,135,195, 41, 0, 64, 8, 33, 70, 0, 80, 42,149, 79,212,106,117, 55, 7, 7, 7,
+ 60,125,250, 84,168, 49, 98,110,208,210,205,219, 9, 33, 70,179,178,217, 92,243, 71,143, 30,141,200,200, 72, 0,136,172, 78, 83,
+169, 84,206,153, 62,125,250,181,253,251,247,179,147,146,146,250,239,217,179,167,255,243,231,207, 9,163, 32,213,120,171,136, 3,
+143, 73,115,223,251,214,221,231,114, 96, 96, 32, 28, 29, 29,177,123,247,110,108,221,186,181,244,227,143, 63, 78,216,186,117,235,
+123, 57, 57, 57,135,107, 88,127,133, 92, 46,191,104, 99, 99, 51,187,101,203,150, 42,141, 70,131,252,252,124,100,100,100,192,218,
+198,134,105, 0,179,179,157, 68,114,248,108,150, 74,200,190,120, 15,247,211, 51,107,141,102,117,228,176, 38,142, 8,104, 19,240,
+201,242,165, 34,220, 58, 13,198,244, 96,144, 61, 95, 96,222,135, 65, 22, 37,218,195,221, 53,143, 83, 38,200,148,202,131, 74,165,
+242, 68, 3, 59,203,128,206,157, 59, 31, 89,179,102,141, 96,217,134, 53,216,212,204, 25,134,252,124,228,106,141,200,211, 26,160,
+ 44,140,195,211,167,177,176,177,177,197,203,151, 47, 81, 82, 82,130,103,207,158, 17, 22,139,117,182,174,136, 78, 5, 85,110, 23,
+202,121, 60, 94, 62,135,195,201,102,179,217, 5, 73, 73, 73,154,146,146, 18, 48,153, 76,161,209,104, 20,212,163,173, 46,182,182,
+182, 11, 80,150, 76,244,140, 42, 47,111,155, 63, 7, 18,176,209,195,221,214,102,224,138,153, 19,108,221,156,236,229, 73, 9, 47,
+ 74,191,187,116, 59,175, 68, 91,243,100, 13, 0, 97, 5, 5, 5,149, 17,201,227,199,143,207, 59,126,252,248, 52, 0,123, 81, 86,
+119, 43, 92, 46,151,127,251, 22, 7,223,138,147, 39, 79, 46, 94,190,124, 57, 4, 2, 65,101,242, 84,129, 64,192, 7,128, 31,127,
+252, 17, 79,159, 62,237,128,242,241, 90, 38,147,233, 72,102,102,102, 93,154, 30,190,190,190, 73,167, 78,157,226, 2,112,154, 53,
+107, 86,167,237,219,183,227,195, 15, 63,204,141,141,141,237, 8, 32, 25,128,199, 71, 31,125,244,224,192,129, 3, 86, 38,147, 9,
+133,133,133,208,233,116,201,244, 84, 78,161, 80,168,217,250, 83,240, 7, 16,133,178,252, 89,131, 0,156, 67,217,176,142, 26,113,
+ 45,119,103,151, 0, 12,169,248,125,172, 97, 48, 60, 80, 54, 35,235, 34,128,255, 2,112,168, 73,212,198,198,230,179, 73,147, 38,
+149,166,167,167,147,172,172, 44,114,226,196, 9, 50,127,234, 36, 99, 95, 79, 39,147,167,147,131,198,206,206, 46,222,209,214,122,
+ 95, 27,115,204, 7,224, 82,143, 21,155,244,252,249,243, 25,147, 38, 77,154, 90,254,189, 83,143, 28, 57,162,190,114,229,138,154,
+197, 98,133,161, 44,181, 67,133,161,156, 56,120,240, 96,181, 86,171, 85,251,248,248, 20,160,108,224,126, 77, 4,245,232,209,163,
+240,194,133, 11,196,104, 52,254, 46, 71, 81,110,110, 46,185,124,249, 50,233,210,165,139, 28,192,132,222,189,123, 95,191,125,251,
+246,245,174, 93,187,158,172,171,193,182,182,182, 75, 31, 63,126, 28,153,146,146, 34, 59,119,238,156,236,240,225,195,178,143, 62,
+250,232,137,159,159, 95,113, 66, 66,130,201, 96, 48,144,199,143, 30, 17,159,166, 77, 53, 0,220,107,210,233, 37, 96, 63, 80,238,
+254,130,148,172,254,144,148, 12,115, 37, 0,136,106,243,103, 36,123, 78, 31, 18, 63,123, 32,233,201,103,221,125,155,158, 98,109,
+109,125, 41, 50, 50,146,168, 84, 42, 18, 19, 19, 67, 38, 6,246, 39,119,167,245, 33, 23,251,123,145, 3,221, 27,147,205,253,252,
+ 72,255,238,221,200, 55,223,124, 67, 78,157, 58, 69,150, 46, 93,106,178,181,181, 85,161,150, 49, 90, 82,169,244,202,177, 99,199,
+100, 0,100, 44, 22, 75,166, 84, 42,101, 42,149,234,108, 90, 90,218, 78, 31, 31,159,197, 45, 91,182, 28,215,172, 89,179, 94, 61,
+ 27,187, 47,238,109,193,139,239, 99,201,127,209, 84,100,190, 25,191,207,123, 85,137, 24,112,247,244,240, 80,221,184,113,195,164,
+213,106,201,205,155, 55, 77,205,155,122,151,108, 26, 53,224,228,203,221,235, 78,150, 92,248,225, 82,209,207,223,223, 62, 62, 57,
+ 48,186,135, 57,243,135, 78,194,202,116, 28,111,203, 24, 0,167,241,235,172,195, 73, 0,126, 70,237,179, 16,153, 0,246,174, 94,
+189,186,234, 76, 67, 0, 96,250,249,249,201, 8, 33, 50, 63, 63, 63, 89, 67, 27, 98,110,110,190,224,204,153, 51, 33,110,110,110,
+ 27, 70,143, 30,189, 91, 46,151,159, 27, 55,110, 92, 52,202, 38,131, 48, 80, 86, 29, 97,176,139,139, 75,110, 84, 84, 20,185,126,
+253, 58, 25, 57,114,164,202,204,204,108, 60, 61,141, 83, 40, 20,202,159,194,140, 26,254,214,202,154,232,232,232,138, 28, 90,179,
+106, 19, 95,178,100,137, 44, 50, 50, 82,134,178, 44,241,181,194,102,179,127,250,248,227,143,137,131,131,131,218,222,222,254, 39,
+ 14,139, 53,205, 85, 0,127,188,221, 84,247,110, 7, 15, 30, 28,250,245,215, 95, 15, 2,208, 1, 0,199,217,217, 57, 35, 43, 43,
+ 75,125,251,246,109,117,151, 46, 93,212,182,182,182, 57,190,190,190,234, 77,155, 54,169, 75, 75, 75,213, 11, 22, 44, 80,227,247,
+249,190,170,131, 15, 96, 54,151,203,253,169,121,243,230,209, 43,134,244, 42,221, 48,119, 26,153,228,101,167, 6,240, 53,128,143,
+ 1, 72, 0,112,130,130,130,126,121,246,236,217, 37, 95, 95,223, 93,245,208,117,106,217,178,229,213, 35, 71,142, 68,158, 58,117,
+ 74,246,217,103,159, 69,218,216,216,164, 39, 36, 36,152, 74, 74, 74, 72, 97, 97, 33,145,203,229,228,220,185,115, 70,107,107,235,
+ 29, 53,174, 56,143,149, 73, 46, 31,170, 54,133, 67,218,242,241,164, 11,151,249,250,109,122,138, 80, 40, 44,200,207,207, 39, 89,
+ 89, 89, 36, 41, 41,137,156, 60,121,146, 12,232,220,158, 28,253,104, 4, 57, 52,117, 40,217, 56,160, 61,233, 96,193,215, 72, 45,
+ 68,145, 22, 22, 22, 57,245,153,117, 40,149, 74,175,104,181,218,202,244, 13, 46, 46, 46, 50, 31, 31,159, 83,190,190,190,155,207,
+156, 57, 51,111,203,150, 45, 67,123, 54,118, 95,188,182,127,231,226,162,240,227, 68,117,236,107,178,164,173,119, 73,185,153,175,
+ 22,103, 27,235,131, 55,174, 95, 55, 85,152, 95,131,193, 64, 78,255,244, 19, 25, 53,176,111,180,226,226,143,255,189, 25, 60,231,
+200,130,182,222,167,187,240, 49,166, 54,195, 86,121, 41, 34,130, 77,128, 37,115,231,251,110,214,153,221,196,204,175, 59, 90,252,
+166,188,212, 40,111,111,239, 36, 66, 72,102,179,102,205,146, 0, 28,106,214,172, 89,213,231,147,107,144,173, 76, 78, 26, 18, 18,
+ 66,202,143, 15, 38,128, 85,107,214,172,145, 17, 66,100, 94, 94, 94,183, 0,160,181, 16,182,221,197,204,255, 14,241,112,200,239,
+ 46,102,254,183,181,176,250,146, 81,238,102,104,218,205,206,252,230, 80, 47, 71, 85, 15,103,113,196,161,125,123, 54,188,255,254,
+251,187, 1,236, 0,240,133,141,141,205,205, 49, 99,198, 60, 61,112,224,192,211, 77,155, 54,233, 19, 18, 18,200,148, 41, 83, 52,
+ 60, 30,239, 11,122, 30,164, 80, 40,148, 63,141,138,204,240,142, 13, 49, 90,131, 23, 47, 94, 44, 35,132, 84,228,210,154, 80,205,
+ 50, 67,150, 47, 95, 46, 35,132, 84,100,135,127, 51,129, 89,117, 9,205, 66,118,238,220, 73,120, 60,222,127,223,114,101,170,106,
+ 74,135, 13, 27,214, 81,169, 84,190,231,224,224,240, 94,121,228,202,213,214,214, 54,233,240,225,195,234,226,226, 98, 53, 33, 68,
+109, 48, 24,212,145,145,145,234, 30, 61,122,168,171, 92,245,215,213,206,223,176, 76,138, 91, 15, 87, 76, 37,203,164,184,245,198,
+ 91,227,247,238,221,123, 33, 57, 57,249,172,165,165,229,162,122,106,186,218,217,217,173,178,182,182,190,100,107,107,187,204,218,
+218, 58, 83,175,215,147,194,194, 66, 18, 31, 31, 79,174, 95,191, 78,238,222,189, 75,172,173,173,211,107,106,103,111, 1,251, 94,
+225,134,217,196,180,119, 13,209,109, 95, 74, 0, 16,249,150, 37, 36,239,155, 80,242,112,122,127,210,131,207,186,243, 22,219, 19,
+ 18,137,228,251,159,126,250,201,148,152,152, 72,194,194,194,200,185,115,231,200,220,185,115, 73, 83, 39, 71,109, 71, 46, 51,187,
+ 27,143,125,233,109, 18,150,106,181, 90,153, 82,169,148,169,213,106, 89,243,230,205,101,237,219,183, 63,213,177, 99,199,205,199,
+143, 31,159,183,118,237,218,161,189, 45,120,241, 69,225,199, 9,249,108, 32, 33,179,187,146, 23,211,122,144, 94, 2,246,227, 26,
+ 53, 29, 28,210, 43,178,181,107, 52, 26, 18, 17, 17, 65,174, 94,189, 74,164,182,182,202, 0, 1,107, 70, 23, 30,186,119,177,132,
+164,190,237,236, 41,102,238,187,247,205,151,198,226, 11, 7,200,143,147, 6, 26,122, 72,152, 59,171, 44,119,148, 16,146, 57,114,
+228,200,151,132,144,204,147, 39, 79,166, 17, 66, 50, 71,140, 24,241,146, 16,146, 9,224, 72,117,154,111, 36, 39,221, 91,110,178,
+102,135,132,132,200, 8, 33,178,144,144, 16, 25, 80,150, 68,181,187,152,185,255,254,174,141, 38,237,185,253,228,248,148, 65,198,
+238, 98,230,254,106,219, 41, 97,159,141,218,187,133,232, 46, 29, 34, 63,205, 29,103,236, 42,181,188,225,237,237,189,113,222,188,
+121,167,238,222,189,251,196,104, 52, 62, 77, 74, 74,122,186, 99,199,142,167,157, 58,117,186,101, 99, 99, 19,205,229,114, 63,174,
+107, 31,253, 65, 80, 77,170, 73, 53,169, 38,229,205, 0, 83, 45,239,157, 93,191,126,189,144, 16,178, 32, 40, 40, 8,235,214,173,
+ 27,213,178,101,203, 49,206,206,206,118, 0,144,145,145, 81, 20, 19, 19,163, 12, 10, 10,194,170, 85,171,176, 97,195,134,205, 40,
+ 27,203,242,191, 36,235,244,233,211, 46,115,230,204,201, 89,187,118,173,105,202,148, 41,205, 0,196,228,229,229, 53, 29, 55,110,
+220,108, 54,155, 29,228,238,238,238,155,153,153,153, 91, 92, 92,124, 8,192, 46,212,113,207,180, 38,120, 76, 24,219, 53,114,196,
+ 37, 38,140, 85, 94, 30,184,106,213,170,209, 35, 70,140,208,111,217,178,197,160, 84, 42,207,212, 83, 46, 45, 55, 55,247,243,138,
+ 39,214,214,214,210,199,143, 31,127,108,111,111,207, 76, 74, 74,130, 86,171, 69, 98, 98,162, 9,101,183,166,170, 69,109, 32,219,
+190, 61,121,197,103,193,248, 64,203,162,184, 71, 48, 99,177, 80,202,225, 34,235,222, 37,236,141,136, 83,106,244,216,254, 54,235,
+ 41,151,203,191,154, 59,119,238,184, 69,139, 22,241,221,221,221, 25,119,238,220,193,177, 99,199,180, 57, 57, 57, 3, 0,220,248,
+ 53,245, 83,195, 48,153, 76,224,114,185, 0,128, 37, 75,150,128,201,100,114,114,114,114,184, 12, 6,131,199, 96, 48,204, 25, 12,
+ 6,171, 52,249, 41, 76,202, 66,100, 23,202,145,150, 45,175, 85,207,104, 50, 29,187,127,255,254,252, 54,109,218, 48, 31, 62,124,
+136,220,220, 92, 36, 38, 38, 18, 35, 33, 71, 34,138,141,101,131, 18,181,245,111,159,185,181,205,176,214, 86, 60, 38,119,223, 42,
+ 4,232,152,172,239, 76, 24,137,178, 92, 90, 0,176,151,193, 96,152, 1,200,111,222,188,121,207,103,207,158, 9,154, 55,111, 94,
+ 28, 23, 23,119,129,193, 96, 56, 3,216, 95,157,166, 64, 32,200, 3,144,119,242,228, 73, 0,152,142,178,141,215, 54, 56, 56, 56,
+ 51, 34, 34, 2, 33, 33, 33,217, 0,118, 2,128,200,202,102,136,175,216,140,193,253, 33, 4,157,180, 96,110, 55,145,106,163,174,
+ 34,123,135, 94, 45,133, 76,112,246,172,196,123, 82, 31, 38,215,160,111, 21, 26, 26, 26,161, 86,171,181, 71,143, 30,213, 77,158,
+ 60,153,149,144,144,240, 0,192, 77, 0, 39, 81, 62,198,146, 66,161, 80, 40,127, 42,111, 70,176,234, 28,163,245,166,107, 93, 7,
+224,219,231,207,159, 87, 22,149,126,254,252,185, 12,192,119, 40,203, 6, 63,184, 1,142,119, 69,121, 68,107,215, 91,174,204,155,
+154,124,127,127,127,193,179,103,207,204, 80,125, 17, 71,198, 91,104,254,142,234,106, 29,122,123,123,111, 45, 45, 45, 61,245,221,
+119,223, 29,103,177, 88,227,222,193,237,187,123,121,121, 21, 30, 62,124,216, 20, 22, 22, 70, 86,172, 88, 97,116,116,116, 44,196,
+239,199,104,253, 70, 51,128,203, 58,177,176,153,179, 50,114, 66, 87,242, 98,222, 16,114,115,124, 15, 50,195, 89,164, 12,224,179,
+142,189,227, 85,137,151, 88, 44,222, 43, 16, 8,148,150,150,150, 87, 0,116,126,151,125,100, 99, 99,115, 64, 42,149, 94,169,250,
+112,112,112, 56,101,103,103,247,181,173,173,237, 10,137, 68, 50,211,131,207,221, 50,175,169, 83, 73,244,176,230, 36,188,139, 29,
+ 25,111,203,125,243,214,225,155,237,116,244,240,240,200, 63,120,240,160,233,236,217,179,100,233,210,165,166, 70,141, 26, 41, 81,
+203,184,182, 90, 35, 90, 18,214,177, 19, 35, 58,154,178, 7, 57,147,117,205, 44, 76, 61,173, 88, 53,205, 80, 28, 95,110,128, 39,
+213,165,233,233,233,249, 29, 33,100,223,234,213,171,247,225,215, 90,160,125, 67, 67, 67,131, 9, 33,193,161,161,161,193, 0,250,
+ 3, 64,128,152,121,240,208,208,118,198,140,247,157,200,151,205, 68,198, 0, 49,243, 96,181,145, 76,107,246,233,159,167, 13, 50,
+101, 78,235, 66, 86,121, 9,141, 29,173,121,191,112,185,220,121, 40,139, 56,183, 7,192,165, 87,205, 84,147,106, 82, 77, 26,209,
+250,203, 25,175,122, 33,181,182,182,222,219,164, 73,147,227,238,238,238,199, 69, 34,209,102,148, 13,154,111,232,142,240, 88,179,
+102,141, 82, 44, 22,183,254, 3,119,174, 61, 0,103,252,190,112,238, 31,214, 97, 62,119,196,156,132, 69,163, 30,127,238,136, 57,
+ 85, 94,110,223,172, 89,179, 47, 81,150,205,251, 93, 59,161,187,181,181,245, 14,107,107,235,244,242,177, 89,238,245,209,108,199,
+ 98,141,235,201,103,221,233,204,101,102,245,228,179,111,191,199, 98,141,253,155, 30,128,181, 77,182,168, 73,211,197,214,214,118,
+139,181,181,117,134,173,173,237,142, 6,154,172,223,104,182, 22,192,177,151,132,117,186,179, 5, 67,211, 75,204, 58,217,206,188,
+230, 73, 29, 13, 88,119,255,144,144,144, 15, 9, 33, 31, 58, 57, 57, 5, 85, 49,254,190,171, 86,173, 10, 36,132, 4, 86,100,128,
+111,111, 14,251, 30, 18,214,225, 46,150, 12,121, 15, 9,235,112,123,115,216,215,212,206,158, 18,214,177, 46,150, 12,121,128, 37,
+243,176, 27, 15,141,232,201,156,106, 82, 77,170, 73,141,214, 63,195,104,209, 14, 67, 53,169, 38,213,164,154, 84,147,106, 82, 77,
+106,180,170, 55, 86, 85, 31,149,119,216,216,116,219, 80, 40, 20, 10,133, 66,161,188, 19, 53, 38, 44,101,212,226, 74, 27, 50,176,
+253,109,156,109, 56,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,117,154,117,105,255,175, 39,214,253,173,161, 97, 85,170, 73,
+ 53,169, 38,213,164,154, 84,147,106,254,107, 97,210, 77, 64,161, 80, 40, 20, 10,133,242, 78,248,151,255,125, 51,113,105,245, 99,
+180,216,237, 87,103, 27, 12, 6,123, 0, 96,179,217, 57,165, 15, 86, 56,214,166,206, 1,122, 27,202,202,239,128, 13, 76, 55, 0,
+ 87,170,209,188, 98, 48, 24,172,202, 53, 11, 75, 31,172,232, 95,171,102,251,213,151,170, 46,111,120,176,162,239,155,203, 16,128,
+197,105,191, 58,227,141,182, 58,213,119,171, 48,240,155,156, 88,127, 90, 59,255, 46,154,255,102, 56, 29, 86,103,151,150,150,245,
+ 35, 14,135,157,163,191, 95,123, 63, 50,235,176, 58,163,234,242,165,247, 87, 56,212,166,105, 46,224,229,123, 58,219,109,174, 77,
+ 51, 41, 35,111,129,166,168,196,166, 54,205,134, 30,155,174,142,142,189,141,229,199, 38, 11,152,158,158,153,121,229, 47,214,151,
+218, 1, 88, 1,192,178,202,107,209, 0, 62,165,189,146, 66,161,252,205,140, 86, 20,202,234, 28,126, 95,110,182,190,175,209,104,
+ 25, 12, 6,123,217, 79,193,208,104,129,222, 19, 87,219,123, 12,219,245,187, 66,201,134,146, 66,174, 60,246,168, 47,171, 84,105,
+101,199,214, 91,102,100,100, 48, 0,128,193, 96,252, 23,128, 91, 53,154, 86,178,159,130, 81,164, 3, 2,198,132, 90,185, 1,150,
+185,102,102,255, 17, 8,133, 61,139,139,139, 91, 2,128, 64, 32,136, 45,214,104,174,217,233,245,155,222, 92,190,166, 53,171,218,
+214, 94, 19, 86,219, 55, 27,182,107,174,209,100,226,190,126,248, 93, 64, 73, 94, 2,155, 99,208,238, 92, 6, 92, 8,174,198, 84,
+213,160,247,235,247,126,176,212,134, 3,244,226,242,249,173, 37, 86, 86,221, 76,132, 52, 55,153, 76, 12,163,193,240, 84,169, 80,
+220, 52, 25, 12,143, 13, 58,141,141,236,204,151,166,218,218,249,230,186,124, 0,176,127, 2,130,132, 34, 81, 79, 22,135,211, 25,
+ 0,140,165,165,119, 52,106,245,181,225,192,137,250,172,123,125,183,207,219, 46,255,111,163,180,212, 96,159,124, 41, 24,218, 82,
+192,127,228,151,246,126,227,126, 56, 12, 0,186,156,199, 14,234,132, 51, 29, 0, 64,232, 25,120,159, 39,245,207, 6, 0,246,171,
+ 76,251,248,176,229,208,150, 2,205, 3, 67,237,235,210,156,188,234,152,205,162, 25, 35,120, 0,112,249,228,215, 77,175,158,250,
+118, 32, 0,244, 26, 49,235, 66,191,145,115,226, 1, 96,195,247,167,108,142,124, 57,170, 86,205,250, 29,155, 10, 51, 69, 79,238,
+ 8,153, 0, 0, 32, 0, 73, 68, 65, 84, 66,152,151, 78,153, 41,113, 21,178,165, 9, 9, 9, 76, 0,112,114,114,170,215,177,233,
+ 2,136, 51,129,217, 76, 22,171,155,167,151,151, 63, 0,146,244,226, 69,148,209, 96,184,229, 8,236,252,131,251,210, 92, 66,126,
+155,156,149,193, 96,208, 14, 73,161, 80,254,110,156, 43, 55, 87,231,126,119, 49, 91,211, 39, 52, 90,224, 70, 34,208,189,163, 31,
+102,140,123, 95, 84,245,189, 19,187, 66,221, 18, 30,254,220,108,207, 15,155,152,126,126,126, 72, 78, 78,174, 87, 43,138,116,192,
+245, 4, 0,242,103, 22,133, 66,225,139, 45, 27, 55, 90,246,237,219,151,237,228,228, 4, 6,131,129,172,172,172,142,225,225,225,
+237,230,207,159,255, 17,228,207, 10,139,116, 80, 93, 79,168, 91,183,162,173, 45,155, 54,194,138, 57,163,196, 0,176,108,226,206,
+118, 15,159,103, 91,191,120,241,162,247,226,197,139,243, 89,215,174,125,107, 11,236,203, 6,210,234,211,206, 3,103,239,243,197,
+153, 63,122,140,159, 51,231,164,151,151,151,200,221,221,157, 97, 97, 97, 1, 22,139,133,194,194, 66,183,152,152,152,129, 15, 30,
+ 60,208,132,223,248, 47, 55,242,193,144,164, 28,126,135,146,122,173,123,113, 6,255,178,133, 69,236,132,225,195, 93, 70,141, 26,
+197,247,244,244, 4, 0,188,120,241,194,251,196,137, 19, 99, 78,158, 60,185, 10,197, 25,134, 34, 29, 74,234, 90,247, 74, 77, 0,
+124,160,179,196,222,126, 60,139,195,105,105, 48, 24,156,203,163, 13,175,141,165,165,177,242,156,156, 67,111, 46, 79,249, 61,218,
+ 82,224, 89, 38,208,167,155, 63, 38,140,232, 35, 4,128,197,163,215,116,124,245, 50,209, 76,167,211,161,169, 79,243, 46, 95,124,
+185,249, 18,152, 76, 28, 60, 21, 94,185,124,125, 52,163,159, 37, 35,248,139, 45,200,120,114,162,163, 81,145,216, 83,165, 84,176,
+ 0,192, 82, 44, 30,113,226,232,143,215,156,124,131,238, 37,230,233,235,165, 89,219,177,121,241,232, 14,199,244,152,107, 45,190,
+185,188,151,227,230,230,134, 39, 79,158, 52,236,216, 84, 60,183, 48, 57, 58, 62,221,244,217,103,210,128,128, 0,136, 68, 34,176,
+217,108, 24, 12,134, 62,183,110,221,234, 19, 28, 28, 60, 11,138,231,154,250, 30,155,245, 96, 19,131,193,232, 57,121,198, 92,199,
+247,135, 6, 97,196,128, 46,180, 35, 82, 40,148,191, 27, 21,209,171,170, 51, 15,191,175,213,104,177,217,236,156,190,147,214,218,
+119,235,208, 10, 15, 31,199, 43, 82, 82, 51,213, 21,239, 21,196,158,104, 58,180,139,115,139,136,136, 27,208,106,181,184,115,231,
+ 14, 30, 63,126,140,151, 47, 95, 98,230,204,153,218,242, 91,135,213,105, 22, 6,140, 9,181,130, 34, 65,228,205,125,222, 56, 60,
+ 46,142, 85, 82, 82,130,136,136, 8, 20, 22, 22,130,203,229,194,197,197, 5,253,250,245, 99,199,197,197, 89,247,238, 59, 64, 28,
+ 48, 96,108, 50,196,222,106, 54,155, 93, 88, 83, 29, 17, 54,155,157,211,123,226,106,251, 22,222,141,240, 34, 37, 67,177,226,203,
+ 61,106,147,137,176,147, 94,190,210,223,184,113, 3,254,254,254,184,114,229,138, 77, 65, 65,193,202,157, 59,119,174,224,172,255,
+102, 91,169, 46,127, 33,106,214, 43, 12, 24, 19,106,101,147,115,220,253,234,197,211,102,177,177,177,102,223,125,247, 29,242,243,
+243,193,229,114, 33,145, 72, 32,149, 74,209,180,105, 83,198,178,101,203, 68,129,129,177,248,100,122,144,187,222, 99,218,243,154,
+218, 89,185,238,234, 87,230,182,202,203,158,167,206,157, 99,118,237,218,245, 55,151,237, 77,154, 52, 65,255,254,253,249,227,199,
+143,247, 28, 53,102,156, 41, 96,208,228, 23, 16,185, 23,213,169,169, 73, 19,216, 20,221,117,234, 51,102,204,153,208,208, 80,137,
+ 84, 42,133, 80, 40, 4, 0, 40, 20, 10,151,148,148,148,142,171, 86,173, 26,121, 63,250, 40, 59, 32, 48, 45, 3, 66,215,226,218,
+182,231,191, 21, 14,135,157, 83, 17, 69,178, 16, 10, 10,211,210,179, 53, 0,160,211,233,160,211,233,160,213,106,241,241,172,153,
+172,233, 35,219,123,185,119,155,251,232,229,235,236,130,230,225,247,172, 43, 62, 91, 90,135, 38,187,232,165, 92,158,250,203,244,
+224,207, 62,147, 58, 56,252,122, 71,240,224,129, 3,172,130,130,130, 62,193,193,193, 45,136,121, 15,121,243,192, 80, 73,109,154,
+181, 29,155,242,248,115,141,191,152,211,191,245,174, 47,195, 96, 52, 26,113,247,238, 93, 68, 68, 68, 96,243,230,205,228,194,133,
+ 11, 10, 75,161,112, 58,106, 61, 54,159, 91,116,117,204,242, 88,191,254, 36,131,199,227,225,231,159,127, 70, 92, 92, 28,152, 76,
+ 38,252,252,252, 48, 97,194, 4,244,233,211, 71, 58, 99,198, 76, 18, 48, 96,116, 18,196, 62,170,119,236, 75, 76, 0,115,151, 6,
+175,119,156, 56,109, 54, 54,124,177,140, 26, 45, 10,133,242,119,142,102,213,152,226, 1, 97, 97, 97,164,252,209, 29, 0, 8,192,
+108, 50,108,215,145,227,145,166,115, 77,134,237, 58, 66, 0, 38, 1,152,150, 64,163, 54,109,218,148,202,229,114,242,224,193, 3,
+242,241,199, 31,107,182,109,219,118,237,220,185,115, 39, 12,122,253,110, 39, 71,199,175, 72, 13, 3,236, 9,192,116, 7,196,230,
+230,230,185,169,169,169,228,252,249,243, 36, 36, 36,132, 28, 58,116,136, 92,184,112,129,132,135,135,147, 11, 23, 46,144, 35, 71,
+142,144,232,232,104, 18, 31, 31, 79,132, 66, 97,174, 59, 32,174, 69,147, 69, 0, 86,211, 97,223, 45, 60,249,176, 52,212,103,216,
+174,249, 4, 96, 89, 1,205,218,180,105, 99, 60,113,226, 4, 57,120,240, 32,249,225,135, 31, 72,116,116, 52,201,203,203, 35,108,
+158, 48,183,226,115, 53,181,147, 0, 76,103,103,231, 92,185, 92, 78, 92, 93, 93, 9,151,203, 37, 14, 14, 14,164,105,211,166,164,
+ 99,199,142,100,224,192,129,100,220,184,113,100,229,202,149, 68, 46,151, 19, 62,159,159, 93,241,185,154, 52,253, 1,129, 80, 40,
+ 76,149,201,100,164, 38,138,139,139, 73, 94, 94, 30,185,116,233, 18, 17, 10,133,169,254,128,160, 54, 77, 1,208,214,215,215, 55,
+ 55, 47, 47,143,232,245,122,146,154,154, 74, 98, 98, 98, 72, 92, 92, 28, 73, 77, 77, 37,197,197,197,149,218,241,241,241,196,195,
+195, 35, 87, 0,180, 37,116, 18, 68,141,125,233,205,135,155,131,195, 64,169, 84, 90,124,242,228, 73,242,250,245,107,178,127,255,
+126,194, 4,214,188,185, 92,109,154, 92,160, 95,215,174, 93,141,119,239,222, 37,143, 30, 61, 34, 75,150, 44, 33,253,251,247, 39,
+ 3, 6, 12, 32,193,193,193, 36, 61, 61,157,164,167,167,147,129, 3, 7, 26,185, 64,191,186,250,103,117,199,166, 24,112, 11, 12,
+ 12, 44,214,235,245, 36, 41, 41,137,180,108,217, 50,157, 5,140, 23, 2, 45,186, 3,188,186,250,167, 51, 96,229,232,232,152,121,
+247,238, 93,114,234,212, 41,226,238,238,158,203, 2, 38, 91, 2, 77, 44,129, 38, 44, 96,114,147, 38, 77,114,239,222,189, 75,242,
+243,243,137,155,155, 91,166, 51, 96,245, 14,125,137, 9, 96,239,210,224,245,228,121,186,134, 44, 13, 94, 79, 0,164, 18, 66, 8,
+170, 25,227, 73,161, 80,254,249,188,233, 69,254, 41, 84,158, 36, 3, 3, 3, 25, 0,174,215,182,112, 49,139,181,118,195,134, 13,
+236,146,146, 18,236,217,179, 71,245,193,200,145,199,187,119,235,150,212,216,221, 93,206, 96, 50,235,172, 54,156,203,227,205,219,
+176, 97,131, 68,167,211, 33, 50, 50, 18,237,218,181,131, 84, 42,133, 72, 36,130, 72, 36,130,189,189, 61,124,124,124,144,147,147,
+ 3, 11, 11, 11, 44, 90,180, 72,156,203,227,205,171, 75,215,100, 34,108, 0, 48,154, 76, 92, 51, 96,134,199,123,239, 69,174, 90,
+181,138,105, 99, 99, 3,107,107,107,136, 68, 34,196,197,197, 65,167,211,193, 92, 96, 94,175, 36,173, 76, 38,147, 41, 18,137,112,
+245,234, 85,204,157, 59, 23,157, 59,119,134, 68, 34,129,133,133, 5, 90,182,108,137,126,253,250, 97,250,244,233, 72, 74, 74, 2,
+163, 30,131, 74,158,178,217,179,167, 79,159,110,239,239,239, 95,237,251, 37, 37, 37,144,203,229,200,205,205,133,139,139, 11,130,
+130,130,236,159,178,217,179,107,210,179, 1,164, 46,222,222,103, 30, 60,120, 96, 43, 20, 10,113,240,224, 65,156, 62,125, 26, 23,
+ 47, 94,196,249,243,231, 17, 22, 22,134,159,127,254, 25,185,185,185, 0, 0,111,111,111, 28, 59,118,204, 86,100,111, 31,102, 3,
+ 72,233, 33, 93, 63, 94,101,103, 95,110,153,149,101, 59,126,220,184,155,106,181, 26,227,199,143,199,218,117,235,150,113,128,249,
+245,249,188, 15, 32,182,118,116,220,183,126,253,122,102, 86, 86, 22,134, 15, 31,158,183,105,221,186,169, 81,151, 46,121,202, 46,
+ 94,244, 92, 27, 26, 58,181,123,247,238,121,233,233,233, 56,112,224, 0,211,193,205,109,159, 15, 32,110,104, 59, 85,192,220,173,
+ 91,183,242, 75, 74, 74,208,183,111,223, 36, 83,108,172,143, 1,248, 81, 13,196, 93, 7,244,117,125, 62, 19,152,189,104,209, 34,
+ 41,143,199,195,127,254,243,159,188,162, 87,175, 90, 25,128, 31, 20, 64,138, 2, 72, 49, 0, 63,168,146,147, 91, 77,156, 56, 49,
+143,199,227, 97,203,150, 45,210,204, 95,139,110,215,151,118, 0,206, 0,184, 1, 32, 99,242,140,185,147,253,219,119,194,129,221,
+ 59,241,101,232,226,125, 0, 62, 96, 48, 24,135, 0, 44,164, 61,143, 66,249,119, 82, 31, 47,242, 23,165,198,146, 59,236,170, 78,
+ 18, 64,143,218, 84,172,108,108,218,181,106,213, 10, 17, 17, 17,240,245,245,125, 32,145, 72, 12,102, 60, 30, 56, 28, 14,136,169,
+ 78,159, 5,129, 80,216,187, 79,159, 62,236,123,247,238,193,195,195, 3, 2,129, 0, 28, 14,231, 55, 15, 51, 51, 51, 56, 58, 58,
+ 66,169, 84,162,119,239,222,156,237,219,183,247,134, 86,251, 69,157, 63,136, 9, 49,162,220,123,235,199,253,119,255,190, 38, 1,
+ 1, 1, 80, 40,148, 48,153, 76, 48, 55, 55,135, 78,167, 3,155,205, 46,187, 5, 84, 74,148,245,217, 98, 70,163,209,200, 98,177,
+224,225,225,129,181,107,215,162,164,164, 4,102,102,102, 0, 0,165, 82, 9,185, 92,142,152,152, 24,164,164,164,160,252, 42,188,
+ 86, 44,196,226,247, 71,141, 26, 85,109,193, 95,173, 86, 11,133, 66, 1,133, 66, 1,185, 92,142,146,146, 18,116,234,212,137,123,
+ 46, 44,236,125,228,231,111,170,246, 51,124,254,200, 3, 7, 14,216,115,185, 92, 20, 23, 23, 67,165, 82, 33, 45, 45, 13,175, 94,
+189, 42,201,201,201, 49, 88, 88, 88, 48,221,221,221,153, 60, 30,143, 55,108,216, 48,134, 82,169, 4,131,193, 64, 96, 96,160,205,
+225,131, 7, 71, 65,167,219, 76, 15,233,250,113, 25,208,182,213,233, 6,119,104,223,254,234,131,135, 15,253,231,205,155,135,232,
+232,232,245,230, 71,143,222, 40, 2, 30,215,246,217, 36, 96,246, 87, 85, 12, 12,121,245,202, 87, 15,228, 86, 89, 36,197, 61, 57,
+249,226,196,137, 19,159, 68, 71, 71,219,110,217,178, 69,250,193,240,225,179, 1,172,105, 72, 27, 45,196,226,247, 28, 29, 29,113,
+225,194, 5,164,190,124,185,216, 0, 20, 55,232,138,139,197,234, 26, 16, 16,128,159,127,254, 25,233,175, 94, 45, 54,252,182,141,
+101, 23, 74, 64, 46, 59, 41,105,241,190,125,251,246, 78,153, 50, 5, 44, 54,187, 43, 12, 13,186,113,248,187,129,239, 83,102,206,
+195,190,239,183,239, 3, 48, 13,128, 9,192, 3,218,227, 40,148,127,119, 84,171, 46, 47,242, 55, 50, 91,223, 55, 56,162,101,111,
+111,239, 44, 18,137,144,145,145,129,230,205,154,229,240,120, 60,112, 57, 28,240,185,220,122,181,160,168,168,200,215,201,201, 9,
+ 10,133, 2,182,182,182, 48, 51, 51,171,124,112,185,220,202,255, 45, 44, 44,192,100, 50,225,230,230,134,162,162, 34,223, 58,117,
+179, 99,236,143,110,159,245,241,221, 27, 23,154, 12, 31, 62, 2, 86, 86,214,112,117,117,129,189,189, 61, 4, 2, 1, 92, 93, 93,
+225,233,233, 73, 54,109,218, 4,115,123,191,122,157,200,171,154, 39, 54,155, 13,163,209,136,236,236,108, 60,127,254, 28,209,209,
+209,184,123,247, 46, 30, 61,122, 4,149, 74,133,122,248, 44, 20, 21, 23,183,102,179,217,213,154, 44,185, 92, 14,185, 92, 94,105,
+180,114,115,115,145,146,146, 2,181, 70,211,166, 22,211, 59,162, 85,171, 86, 44, 0, 16, 8, 4,104,211,166, 13,118,237,218,101,
+ 56,123,250,244,232, 22,119,239, 90,187, 94,186, 36,249,239,119,223,141, 14, 10, 10, 50,222,187,119, 15, 74,165, 18,207,158, 61,
+131,157,157, 29,155,203,231,143,162,135,115,195,144, 1, 26, 91,149,106, 64,231,206,157,147, 21, 10, 5, 54,110,220,200,228, 88,
+ 88,124, 31, 90,195, 45,190, 74, 88,172, 46, 1, 1, 1, 56,115,230, 12, 50, 94,189, 90,242,170, 26, 3,243, 10,200, 77, 77, 74,
+ 90,178,111,223, 62,244,235,215, 15, 12, 54,187,193, 3,149, 58,118,236,216,202,100, 50,225,201,147, 39,144, 0,247, 27,250,121,
+ 79, 47, 47,255,138,200,175, 16,184, 89,211,114, 66,224,102, 84, 84, 20, 4, 2, 1,154,183,104,209,182,129, 95,179,137,193, 96,
+100, 78,153, 57, 15,167, 46,222, 6, 0,236,251,126,123,118, 21,147, 69,161, 80,104, 68,235,239, 26,209,170, 48, 86, 85, 31,248,
+141,209,170,167,249, 0, 0,112, 56, 28,112,121, 60,112,185,220, 50,131,196,227,213, 91,131,193, 96,128,207,231, 87, 26,171,170,
+ 6,171,234,255,230,230,230,245, 50, 48, 0, 80,152,120,177,219,180,169, 83,184, 60, 30, 15, 58,157, 22,132, 16,240,120,124, 72,
+ 36, 18,120,120,120, 64,169, 84,162,115,151,238,218, 52,185, 89,152, 77,243, 97,209,111,179,245, 12, 6, 3, 52, 26, 13, 10, 11,
+ 11, 81, 80, 80, 0,165, 82,137,226,226,226,122, 79, 69, 55,153, 76,172,180,180, 52,252,248,227,143,200,207,207, 7, 80, 54,208,
+186,194, 92, 85,252, 77, 78, 78,198,193,131, 7,241,242,229,203, 6,237,159,110,221,186, 33, 44, 44,140,213,163,119,239,221, 87,
+220,221, 51,174,184,187,103,244,232,221,123,247,153, 51,103, 88,206,206,206, 72, 73, 73, 65,100,100, 36, 10, 11, 11, 65, 8,161,
+243,231,223,130, 23, 64, 97, 81, 65,193,148,101,203,150, 17,145, 72,132,141, 95,125,213,122, 13, 48,182,190, 6, 70, 92,139,129,
+ 17,191,155,129, 1, 33, 4, 38,147, 9, 70,163,241,173,214,141,193, 96, 48, 56, 28, 78, 67, 83, 43, 52,100,225,202,129,239,139,
+ 86,174,197,249,159, 79, 84,188,158, 64, 77, 22,133, 66,249, 7, 80,227, 64,120,118, 21, 7, 89,249,183, 38,178,179,179, 95,107,
+ 52,154, 38,238,238,238, 72, 79, 79,183,119,115,115,123,197,229,112, 96,198,229,130,193,172,219, 19,152,155,155, 63,201,200,200,
+232,226,236,236, 12,131,193, 80,105,170,222,188,117, 88, 17,165,121,244,232, 17,204,205,205,159,160,164,214,204, 9, 48,234, 10,
+ 27,181,109,219,182, 50, 50, 36,145, 72, 32,145,136,193,227,241,177,124,249,114,211,150, 77,155,118,186,245, 10, 85,124, 56,127,
+ 25, 89,182,102,247, 31,186,101,235,251,195,100,110,110,254,196,213,213,181,147, 88, 44,198,169, 83,167,144,146,146,130,194,194,
+ 66, 20, 21, 21, 65,171,213,162,168,168, 8, 58,157, 14,124, 62, 31, 45, 90,180,128,165,165, 37,194,195,195,159, 64,171,173,222,
+ 92,230,231,159,122,242,228, 73,167,246,237,219, 87, 70, 84,122,246,236,201,232,217,179,167,109,101, 20,173,168, 8,121,121,121,
+120,240,224, 1,194,195,195,193, 96, 48,144,144,144, 96,212, 22, 23, 31,161,199,196,219, 81, 2,220, 97,237,219,183,247,163,143,
+ 62,154,218,165, 75, 23, 24,129,129, 0, 14,254, 63, 26, 24, 0,192,221,187,119, 99,140, 70, 99,151,166, 77,155, 66, 14,116, 0,
+240,115,131, 76,100, 98, 98,148,193, 96,232,221,186,117,107,156, 58,126,188, 27,128,148,234,150,211, 0,221,252,253,253, 81, 92,
+ 92,140,103, 79,159,202, 26, 96,178,118, 47, 13, 94, 63,121,226,180,217, 56,176,123, 39,246,125,191, 61,109,239,174,109,174,168,
+199,248, 49, 10,133,242,175,138,102,213,233, 69,254,162,204,168,201,124,177, 27,162,162, 40, 44,148, 69, 69, 69, 53,105,219,182,
+ 45,118,239,222,221,190,115,167, 78,175,205,184, 92, 3,215,204, 12,204,122,252,144, 20,107, 52,191,252,242,203, 47, 29,134, 13,
+ 27,198,190,119,239, 30,164, 82,105,165,209,170,248,203,102,179, 65, 8,129,185,185, 57,126,250,233, 39,125,177, 70,243, 75,157,
+209, 34,163,201,200, 44, 55,122,132, 16,200,229,114,152,153,153, 97,243,230, 45,216,177,105,211, 56, 35,112,194, 91,104,247, 25,
+ 0,254,255,219, 15,116, 81,209,213,243,231,207,183, 91,181,106, 21,199,197,197, 5,114,185, 28,133,133,133,200,207,207,135, 82,
+169,132, 82,169, 68, 97, 97, 33,228,114, 57,248,124, 62,162,163,163, 75, 75,138,138,174,214,164,199, 43, 41, 57, 57,105,210,164,
+ 69, 81, 81, 81,142,108, 54, 27,165,165,165, 48,153, 76, 48,153, 76,208,235,245, 72, 76, 76, 68,108,108, 44,226,226,226, 80, 80,
+ 80, 0, 14,135, 3, 22,139,133, 71,143, 30, 21, 10, 75, 75,143,235,232, 49,253,214,112,128, 83,183,110,221,154, 58, 97,194, 4,
+ 56,185,184,116, 71,122,122,189, 12,204,233, 90, 12,140,226,237, 12,204,175, 6, 72,165,122,152,156,156,220,165, 71,143, 30,112,
+116,113, 89,223, 34, 61,253,202,211, 6,140,211, 50, 26, 12, 55,111,221,186,213,123,226,196,137,216,189,123,247,122,187,228,228,
+139,185,111,220,230,180, 3,236, 26,123,122,174,159, 60,121, 50, 46, 95,190, 12,163,193,112,179, 22,201,170, 25,223, 27, 77,158,
+ 49,215,245,141,129,239,187, 24, 12,198, 28, 0, 27,105,143,162, 80, 40,255,228,136, 86,131,110, 29, 10,140,198,165, 11, 23, 46,
+ 44,101, 50,153, 24, 49, 98,132,197,207,103,206, 4, 61,122,252,216, 35, 39, 39, 71, 98, 52, 26,235,212,178,211,106,183, 45, 92,
+184, 80,174,211,233,224,227,227,131,130,130, 2, 24,141, 70,176,217,108,176,217,108, 48, 24, 12, 48,153, 76,136, 68, 34, 68, 69,
+ 69, 97,239,222,189, 74, 59,173,118, 91,157, 63, 18, 70,227,147,131, 7, 15,130,197, 98, 17, 62,159, 15, 6,131, 1, 54,155,141,
+ 45, 91,182,228,236, 0, 78, 1, 0,139,201,212, 1, 0,147,201,168,239,232,221, 58,239, 91,114,185, 92,152,202, 38, 1,212,185,
+172,149, 86,187,117,195,134, 13,170,103,207,158, 65,163,209, 84, 70,223,212,106,117,229,224,122,185, 92, 14, 6,131, 1,141, 70,
+131, 51,103,206,168,172,180,218,173, 53,233,229, 3, 89,233, 9, 9, 67,218,183,111,159,159,156,156, 12,133, 66,129, 39, 79,158,
+ 32, 60, 60, 28,199,142, 29,195,229,203,151,145,152,152, 8,131,193, 0,103,103,103, 16, 66,112,250,244,105,133, 65,165, 26,152,
+ 15,100,209, 99,162,102, 26, 73,165,189, 29,236,237, 83,237,108,109,211, 27, 73,165,189,223,124, 95, 12,196,199,199,199,195, 96,
+ 48,192,195,195,195,186,182,113, 90,196, 96,184,117,235,214, 45, 76,156, 56, 17,174, 77,154,172,115, 7,236,222, 92,198, 29,176,
+115,247,244, 92, 87, 97, 96,136,193,112,171,161,109,182, 0,182,127,246,217,103,197,102,102,102, 56,122,244,168, 71,169,151, 87,
+ 28, 27, 24, 43, 2,154,245, 0,204,234,250,188, 35,176,115,229,202,149, 89, 12, 6, 3,135, 14, 29,178, 21,123,122,198,176,129,
+ 73, 98,160,145, 24,104,196, 6, 38,137, 61, 61, 99,142, 30, 61,106,107, 48, 24, 48,127,254,252, 44, 71, 96,103, 45,146,115, 9,
+ 33,131, 9, 33, 1,132, 16,215,189,187,182,225,252,207, 39, 42, 76,214, 52,148, 13,122,159, 0, 32,134,246, 56, 10,133,242, 79,
+166,218, 48, 20,187,253,234,108,128,216,119,239,232,135,135,143,159, 43,108,173, 44, 47, 85,188, 87, 16,123,162,105, 47, 95, 75,
+191,111,190,249, 6, 28, 14, 7,105,105,105,120,250,244, 41, 44, 45, 45, 49,110,220, 56,109,177, 74, 53,164, 74,173,195, 62, 0,
+194,203, 53,203,234,169, 41, 18, 68,158,236,232, 38, 23,207,135,177,196, 98, 49,212,106, 53,152, 76, 38,248,124, 62,204,205,205,
+ 33, 16, 8, 16, 25, 25,137, 65,131,135, 26,115,205, 3,126, 77, 88,250,107, 61,181, 74,205,138, 92, 67, 29, 0,243, 40,224, 63,
+246, 78, 78, 11, 87,172, 88, 33,232,223,191, 63,204,204,204,224,210,200, 59,203, 99,192,198,237, 76, 38,195,144,158,175, 92,238,
+217,200, 73,252, 52, 33, 5, 0, 35,167,244,193, 10,167, 42,181, 14,127,215, 78, 55,221, 13,143,159,126,216,100,217,166, 77,217,
+120,116,185, 92,142,236,236,108,228,228,228, 64, 46,151, 67,163,209, 0, 0,194,194,194,112, 62, 34, 78, 89,236, 18,148, 84, 83,
+ 59,127, 93,247,231, 22, 78,250,251,141, 15, 31,252,129,101,103,103,135,236,236,108,228,230,230, 66, 46,151,163,184,184, 24, 70,
+163, 17, 5, 5, 5,216,179,239, 7, 99,190, 40,224,101,101, 66,200,218, 52, 53,105, 2,107,245,109,103,255, 22,238,100,234,212,
+169, 22,150,150,150, 48,153, 76, 40, 44, 44, 68,106,106, 42,146,147,147, 17, 17, 17,161,201,145,235,160,177,237,155, 94,153,176,
+180, 26,205, 63,144,191,157,102,213,188, 85, 78,142,142, 25,175, 94,189,178, 55, 26,141,112,118,118, 54,200, 11, 10,214,113,129,
+203, 22, 64, 38, 0,146, 7,172,216,186,125,251,148,161, 67,135,226,189,247,222, 75,203,202,206,110, 92, 93, 95, 34, 0,203, 7,
+ 16, 23,185,184,196, 62,120,240, 64,154,154,154,138,137, 19, 39,230,189,122,241, 98, 73,197,120, 45, 5,208,205,221,211,115,221,
+209,163, 71,109,155, 52,105, 2, 95, 95,223, 44,126,106,106,203,231,128,162,134,254, 89,227,177, 41,143, 63,215,120,214,240, 86,
+239,125,252,241,199, 48, 24, 12,136,136,136,192,253,251,247,241,234,213, 43,220,190,125, 91,110, 41, 20,142,174, 82,235,176,218,
+254, 57,208, 91,227,113,232,208, 65,134,153,153, 25,246,237,219,135,168,168, 40, 0,128,191,191, 63, 38, 79,158, 12,131,193,128,
+241,227, 39,144,115,207, 5, 73,181,245, 79, 0,173, 0,124,133, 50,147,247, 30, 33,132,207, 96, 48, 50, 0,184,162, 97, 99,178,
+104,255,164,154, 84,243,223,163,249,143,164,206, 90,135,171,191,133,248,183,101, 62,166,103,156,216, 21,202,238,218, 45,160, 89,
+104, 72, 48,179,125,251,246,112,117,117,133,191,191, 63, 82, 83, 83,121, 18,137,164,174,122,106,234,128, 1, 99,147,253,252,252,
+ 36, 75,150, 44, 17,247,235,215,143,227,234,234, 10, 66, 8,162,162,162,112,234,212, 41,253,238,221,187,149, 69, 14,131,229,178,
+107, 63,170,235, 83, 79,237, 62, 80, 4,224,115,151,140,140,239,103,207,154, 21,220,166,109,219,169, 33, 33, 33, 76,145,185,128,
+179,118,249, 52, 62, 0,172,254,250,152,120,104,208, 56,108,245, 2,186,143,173,190,142, 92,213,118,166,166, 79,127,245,254,240,
+222, 94,255,153, 51,197, 56,106,212, 40,161,165,165, 37, 92, 93, 93, 97,101,101,133,164,164, 36,164,167,167,147,179,103,207,170,
+239, 62,138,231,156,190,252,240, 21, 95,236, 88,159,186,132,170,128,254, 31,188,124,255,253,247,173, 38, 77,154,100,209,174, 93,
+ 59, 14,143,199, 3,143,199, 67,118,118, 54, 18, 19, 19,245,103,207,158, 85, 23,217, 15, 44,148, 93, 59,170,170,103,173,195,226,
+128, 49,161,137, 55,175,132,204,143,125,242,100,130, 9,104,173,215,235,157,141, 70, 35,131,201,100,102,154, 76,166, 39,122,149,
+106,175,214, 63,100, 11,173,117, 88, 63,140, 70,163,153,209,104,132, 92, 46,199,149, 43, 87,216, 47, 94,188, 88,241,248,241,227,
+ 21, 25, 25, 25, 40, 45, 45,197,200,145, 35,225,239,239,143,107,215,174, 33, 55, 59,251,108,109, 90,207, 1, 5, 47, 61,125,242,
+244,233,211, 47, 28, 60,120,144,249,248,241, 99,219,125,251,246,237,169,206,192, 76,152, 48,193,148,157,154, 58, 89, 11, 40,106,
+233,159,181, 29,155,121, 23,143,238,120, 60,108, 68, 80,139,144, 85, 43, 56,157, 59,119,134,173,173, 45,186,117,235, 6,189, 94,
+ 47,105,222,188,121, 93,199,166, 42, 96,192,232,164,214,173, 91, 11,183,108,217, 34,157, 50,101, 10,230,204,153, 3, 0, 40, 46,
+ 46,198,229,203,151, 49,127,254,252,172, 84,118, 7, 77, 93,253,179, 60, 82, 85, 97,192,110, 0, 8, 0,144, 4, 58,240,157, 66,
+161,252, 51,169, 40, 42,237,136,178,194,210,231, 80,118,113, 94,119,173,195,155,247, 99, 80,181,204, 71, 25,142, 79, 13,110,147,
+ 94,204, 92,184,206,151, 85,170,180,226, 48, 74, 44, 19,226,227, 25,117,213, 60,172,172,167, 38,246, 86,219, 36, 31,105,191,118,
+245,234,121, 91,183,110,237, 93,145,194,193,220,220,252, 73,177, 70,243,139,157, 86,187,173, 72,236,253, 75, 67,107,243,165, 3,
+217, 0,102, 89,201,100,219, 3,135,142,220,192,183,246,224, 44, 91,179,187,132,197,100,234, 18, 51,114,177,213, 11, 16,214, 99,
+130,100,145, 14,136,149, 59, 26,178,109,130,158,175,252,236,179,255,172,254,252,243,246, 34,145,168,187,222, 96,240, 54,153, 76,
+128,201,148, 80,164,209,220, 32,122,253, 3,173,255,170, 77,124,177, 35,169,119, 93, 66, 73,115,149,245,203, 19,237,247,239,221,
+ 59,247,248,241,227,191, 91,119, 27,173,118,123,145,164,121,120,125,214,189,234, 50, 37,192, 29,228,228,220,169, 45,116, 73,107,
+ 29,214,243,234,195,100,154, 97,101,101,117,160,119,239,222,252, 62,125,250, 96,208,160, 65,232,220,185, 51, 76, 38, 19, 8, 33,
+ 80,169, 84, 56,118,236, 24, 54,108,216,144,208, 24,248,188, 46, 61, 45,240, 11,239,252,249,129,173, 91,183,222, 87,155,129, 41,
+ 55, 89,117,142, 73,172,253,216,228, 37, 24,196, 67, 82,198,204, 94,235,165, 83,102, 74,108,204, 13,210,216,152, 39,204,250, 31,
+155, 62, 42, 99,212,177, 14, 35,135, 15,159,205, 98,179,187,149,207,128, 36,207,158, 62,149, 85, 20,149,134,255,228, 43, 13,236,
+ 75, 21,185,235,232,192,119, 10,133,242, 79, 55, 90,131, 80, 54, 94,171,178, 36, 79,141,181, 14, 43,162, 62,108, 54, 59, 39,233,
+244,204,113,181,169,115,128,222,229,145, 44,212, 89,235,176,252,255, 20, 64, 5,173,246,139,223, 36, 35,173, 50,187,144,243,198,
+242, 13, 73,139, 88, 8, 60,135, 65, 27,136,156,167,192,153, 89,101,122,237, 87, 47,174,186, 78, 53,254,200,254,230,123,205, 10,
+ 74,128,155, 80,171,111, 66,173,174,118,208, 46,135,109, 86, 80, 87, 59,223, 92,247, 84, 64,249,174,235,254,166,102,157,230,225,
+ 29,182,231,191,141,215,121,121,167, 1,136, 92,194,194, 28, 46,134,133,141,250,207,130, 5, 35, 29,157,156, 60,109,109,109,173,
+ 44, 44, 44,152,247,238,221, 75, 54,148,148,108,111, 3,236, 47,143,166,214,137, 22,248,197, 39, 53,181,229, 7,195,135,207,102,
+176,217, 93,171, 26, 24, 98, 48,220,246, 0,118,214, 22,201,122,219, 99,211,149,231,216,187, 60,146, 5, 22, 48,189, 62,125, 35,
+189,172, 29,107, 96, 48,172, 65,116,116, 53,125,190,193,125,105, 53,131,193, 80,129, 14,124,167, 80, 40,255, 92, 42,234, 29,158,
+251, 95,127,113, 31,170, 73, 53,255, 65,154, 44,148,205,162,163,219,147,106, 82, 77,170, 73, 53, 41,245,130, 77, 55, 1,133, 82,
+111,140,248,245, 54, 24,133, 66,161, 80, 40, 21, 84,140,205,170,202,247, 64,217,208,157,154, 92,105, 67,102, 19,188,141,179, 13,
+167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191, 78,179, 46,237,191,227,108,198,138, 49, 89,149, 99,179,254, 87,208,176, 42,
+213,164,154, 84,147,106, 82, 77,170, 73, 53,255,233, 56,150,155,172,170, 15, 0, 13, 76, 88, 74,161, 80, 40,255, 84, 66, 66,192,
+ 36, 4, 12, 66, 66,152,132, 28,103, 17, 18,196, 34, 4,239, 84, 10, 36, 40,168,250,100,182,159,140,179,178,160, 91,156, 66,249,
+ 71,145,137, 26,138, 74,211, 49, 90,255,191,184, 73,165,210, 93, 0, 24, 89, 89, 89, 51, 0,164,210, 77,242,215,195,218,218,186,
+183,193, 96,128, 82,169,252,229,159,184,126, 45, 60, 49,156, 48,209,188,242, 5,130,212,103,137, 56, 80,221,178,205,189, 48, 17,
+140, 95,115,113, 49, 76,120,246,244, 5,126,106,192,215, 49, 7,246,113,221, 9, 0, 23,194,211,102,227,207,201,171,213,212,206,
+206,238, 18,155,205,102, 27,141,198, 89, 57, 57, 57, 97, 53, 27,161, 32, 22, 0,112,200,181,165,242, 44,251, 37,159,126,196,224,
+ 20,105,247,202,181,197, 26, 5,139,195,122,201,227, 72,111,205,156,194,188, 80,168,238,244,180,186,207,159, 56,113,162,198, 42,
+222, 45,189, 48,144,105,108, 49,216,191, 85,114,210, 87,219,218,111,237,238, 97,203, 73, 78,123, 36, 90,255,157, 98, 23, 87,226,
+ 62,120,226, 40, 70, 24,219,156, 49, 97,239,222,124, 53, 61,202,234,207, 90,192, 90, 15,248,114,120, 60, 87,163,193,224,192, 0,
+ 8,139,205,206, 46,213,106,211,204,128,232,165,128,252,159,174,105,198,227,185, 24, 13, 6, 7, 0,248, 43,182,147,242, 91,106,
+ 52, 90, 34,145, 40,146,201,100,186, 84, 45,134, 91, 81, 79,176,226,181,170,239, 49, 24, 12, 24,141,198,244,194,194,194,118, 13,
+248,126, 75, 0,163, 0, 84, 76, 81, 63, 12,224, 24,222,126,192,177,165,153,153,217, 66,161, 80,216,171,184,184,184, 37, 0, 8,
+ 4,130, 88,141, 70,115, 85,175,215,127,245,150,186,108, 0, 31,136, 68,162,158, 76, 38,179, 39, 33,132, 65, 8,185,166, 86,171,
+175, 2, 56, 14,224,109, 50, 37, 8,236,237,237,215, 88, 91, 91,143, 93,186,116,105,190,141,141,141,207,252,249,243, 31, 22, 20,
+ 20,252,152,151,151,183, 28, 13,168, 81,247, 39,227, 41,149, 74, 15,115, 56, 28, 86, 90, 90, 90, 79, 0,112,117,117,189,166,211,
+233,140, 57, 57, 57,227, 0,188,104,160,158, 16, 64, 71,145, 72,212, 78, 36, 18, 5, 24,141,198,230,229,245, 25,159,169,213,234,
+ 8,189, 94, 31, 9,224, 30, 0,205, 95,232, 24,177, 96,179,217, 7,203,251,186, 55, 0,213, 63,237, 36, 64,152,104,254, 52, 54,
+206,167,210,120,181,108, 86,243,194, 12,184, 85,179,108,189,141, 86,175,238,142,131,135, 12,233,203, 4, 0, 93,233,133,193, 87,
+111,100,254,252, 7,175, 78,211, 17, 35, 70,220, 57,120,240,160,149, 86,171,197,140, 25, 51, 14,135,135,135,239, 84, 42,149, 75,
+107, 61,113,136,172,230,111,220,114,217,156,193, 96, 2,128,189,201,100,180,127,253,250,133,247,211,152, 59, 3, 98, 99,239,174,
+ 45,142,187,122,207,196,224,204,212,163, 91, 92,125, 26,209,220, 3,129,131, 71, 14, 31,244,249,231, 33, 24, 59,122,108,163,216,
+216, 18,129,179,101, 18,183,160, 88,232,101, 99,103, 63,228,243,213, 39, 24,183,110,158, 30,114,112, 95,232,213, 41, 83,108,122,
+ 81,179, 85, 47, 24,171,217,236,142, 98, 47,175,128,209,167, 79, 67,228,234,202,102,243,120, 76, 0, 48,104,181,174,234,180, 52,
+199,163, 67,134,116, 8,137,143,191, 30, 2,220,167,154,255, 47,154,148,134, 24, 45, 38,147,233,242,250,245,107,123,161, 80, 88,
+118, 50, 38, 4, 70,163, 17, 70,163,177,178,120, 49, 33,164,242,175,193, 96, 64,179,102,205,234,117, 69, 11,160, 23,128, 15,123,
+244,232, 17,244,213, 87, 95,113,124,125,125, 43, 74,134,116, 91,182,108,217,215, 81, 81, 81, 39, 1,236, 71, 89,242,198,250, 94,
+241,246, 23, 10,133,135, 54,110,220,104,217,183,111, 95,182,147,147, 19, 24, 12, 6,178,178,178, 58,134,135,135,183,155, 63,127,
+254, 44,141, 70, 51, 30,192,165, 6,108,159, 86, 22, 22, 22, 39,134, 15, 31,238,210,189,123,119,126,139, 22, 45, 96, 52, 26,241,
+232,209,163, 41,145,145,145, 99, 78,158, 60, 25,172, 82,169,130, 80,255,122,109, 12,145, 72, 52,201,210,210,114,205,170, 85,171,
+172,199,143, 31,207,141,137,137, 41,244,240,240, 96,220,186,117,203,238,216,177, 99,179,214,173, 91,247,129, 82,169, 92,174, 86,
+171,127, 64, 61,106, 40, 90, 88, 88, 68, 50,153, 76,151,250, 24, 97, 0, 13, 49,195,109, 26, 55,110,124,236,230,205,155,141, 83,
+ 82, 82,140,195,134, 13, 59, 0, 0, 87,175, 94,245, 45, 45, 45,101,244,235,215,239, 66,122,122,250, 40, 0,143,234,185,238,126,
+214,214,214, 63,143, 29, 59,214,218,211,211,211,188,113,227,198, 12,161, 80, 8, 22,139, 5,133, 66,225, 20, 19, 19,211,231,254,
+253,251,197,225,225,225, 5, 90,173,118, 8,128,232, 6,236,167,206,246,246,246, 19, 56, 28, 78, 43,131,193,224, 12, 0,108, 54,
+251,117,105,105,105, 76, 78, 78,206, 65, 0,119,222,246, 0,113,112,112,216,177,102,205, 26,219,156,156, 28,178,110,221,186, 29,
+ 42,149,106,210, 63,245,100,112,248,199,227,136,124,120, 31, 40, 43,155,195,168,166,255, 49, 0,152,125,250,233, 2,180,123,175,
+ 3,198,141,253,160, 78,205,247,123,187,108,228,112,205,108, 74, 74, 74,238, 40,138,180,199,133,230,252, 81, 99,199, 4, 38, 0,
+192,133,139,215, 71,181,111,111,117, 77,108,206,251,128,207,231,119, 46,213,233,243,207,255,146,254, 89, 67, 76,149,179,179,243,
+ 37, 43, 43, 43,243,130,130,130,172,220,220,220,111, 7, 15, 30,188,122,255,254,253, 86,201,201,201, 72, 75, 75,195,188,121,243,
+ 68,233,233,233,179,163,163,163,239,234,116,186, 26, 35, 91, 42, 85,193,182,101, 75,134,174, 18,139,109, 89, 66,115, 75, 88,136,
+173,225,225,217, 26, 29, 59, 15,198,192, 65, 83,145,152, 16,213,113,255,190,207,163, 94,191, 14,255, 82,100,221,100,181, 92,222,
+184,198,243, 82,139,166,232, 62,100,120,153,201, 90,181, 42, 4,241,113,113,170,148,151,204, 79,206,157,102,155, 15,236,221,140,
+103,208,101,165,220,186,121,186,113,215,110,195, 0,160,221,193,125,161, 87, 63, 25,103,213,123,199,225, 66, 21,253, 73,170,249,
+220,249, 57,135, 51,169,255,150, 45,246,254,179,102,153,169, 95,190,212, 39,125,247, 93, 81,118, 68,132,145,205,227, 17,215, 1,
+ 3, 24,118, 61,123,242,103, 61,123,102,118,123,221,186, 0, 78,104,168,199,114,189,254, 16,213,252,159,106,254,219,169, 24, 4,
+ 95,117,246,225,247,181, 26, 45, 6,131, 1,161, 80,136,163, 71,143,130,195,225,128,205,102,131,195,225,212,248,191,155,155, 91,
+125, 26, 50, 66, 42,149,126,189,115,231, 78,135,254,253,251,131,207,231, 87,190,193, 98,177,208,183,111, 95,244,233,211,135,147,
+145,145, 49,230,232,209,163, 99,214,174, 93,155, 45,151,203,231,160,188, 48,116, 45,244,244,241,241, 57,117,249,242,101, 65, 73,
+ 73, 9, 34, 34, 34, 80, 88, 88, 8, 46,151, 11, 23, 23, 23,244,235,215,143, 29, 23, 23,103,221,183,111,223, 83,241,241,241,129,
+ 0,174,213,163,173,237,236,237,237,111, 28, 63,126,156,223,186,117,107, 70, 98, 98, 34,252,253,253, 1, 0, 10,133, 2,195,134,
+ 13,227,143, 31, 63,222,115,204,152, 49,247,114,114,114,186, 3,136,172, 67,175,173, 84, 42,253, 97,248,240,225, 78,107,215,174,
+181,180,176,176, 64, 74, 74, 74,166, 84, 42,245,174,216,222, 99,198,140,225, 14, 30, 60,216,113,195,134, 13,219, 78,156, 56,241,
+ 89, 78, 78,206, 36, 0,178, 90, 93,107,185, 33, 54, 55, 55, 71,118,118, 54, 14, 31, 62,140,217,179,103,131,197, 98, 33, 39, 39,
+ 7,199,142, 29,195, 39,159,124, 82, 97,104,234,101,134,205,205,205,251,120,121,121,237,185,122,245,170,139, 68, 34,129,147,147,
+ 19,115,229,202,149,173, 60, 60, 60, 4,141, 26, 53, 98,101,102,102,226,212,169, 83, 30, 19, 38, 76,248, 57, 53, 53,117,138, 86,
+171,173,243,150,154,131,131,195,222,115,231,206,185,197,198,198,226,187,239,190, 67, 65, 65, 1,184, 92, 46, 36, 18, 9,164, 82,
+ 41,188,189,189, 25, 75,150, 44, 49, 31, 60,120,176,249,156, 57,115,246,234,116,186, 54,245,216, 71,173,237,237,237,119,245,236,
+217,211, 35, 52, 52, 84, 34,149, 74, 81,113, 97,160, 80, 40, 92, 82, 82, 82, 58,174, 90,181, 42, 40, 50, 50, 50, 57, 39, 39,103,
+ 38,128,199, 13, 60,112,218,180,104,209, 34,112,216,176, 97,172,204,204, 76, 28, 60,120, 48, 80,165, 82,181,105,128,185,252, 91,
+ 17,249,240, 62,102,124, 60, 79,237,228,234,106,118,249,210,158, 17, 39,126,106,250, 80, 34, 40, 43, 72, 45, 47,134, 62,104,120,
+252,123,253,250, 79, 53,123,127,208, 48,245,247,223,108, 19,213,199,104,113,184,102, 54,135, 15,109, 78,189,121, 43,178,213,149,
+240,251, 3, 70, 12, 25, 66,204,204, 36, 30, 0,240,217,252, 79, 57,167,206,156,217,215,183, 79,135,140,110, 93,219,165,142, 27,
+191,192,173, 1,205,109,218,180,105,211,235, 81, 81, 81, 14, 60, 30, 15, 5, 5, 5, 54,223,127,255,253,230,174, 93,187, 50,147,
+146,146, 16, 23, 23,135,151, 47, 95, 66,161, 80,160,111,223,190, 34,153, 76,246, 45,128, 26,141,150,158,217,107,141, 83,163,210,
+237, 54, 2, 97, 99,189, 81,105, 79, 74, 51, 91, 92, 57,119,197,239,200,193, 98,127, 7,199,102,222, 31, 78, 14,198,231,171, 79,
+114,126, 60,188,126,213,255,177,119,221, 97, 81, 92,237,247,204,246, 70,135,165, 10, 22,164, 23, 27,106,108,177, 87, 48, 26, 91,
+138, 70, 19, 53,150,152, 88, 99, 52, 26, 53,166,104,140,198, 22,141, 45,137, 5, 19, 99, 55, 88, 81, 17,236, 5, 81,233, 40,210,
+100, 23,118,105,187,203,246, 50,243,251,154, 58,214, 45, 0, 0, 32, 0, 73, 68, 65, 84, 67,150, 15, 9,176,139,229,251, 37,249,
+246, 60,207, 62, 59, 59, 59,115,246,222,185,119,239,156,121,239,123,223,247,194,249,223, 1, 90,235,198, 51, 2, 80,232,254,249,
+146,197,144, 43,180, 24,255,206, 84, 76,120,103,170, 43, 5,157, 23,101,210, 8,116,234, 74, 39,123, 86, 70,220,150, 93, 63,188,
+ 9,160, 69, 29,177,117,193, 38,182, 26,199, 74, 6,163,107,204,143, 63, 10, 35,166, 76,225,220,251,242, 75,101, 89, 82,146, 58,
+ 96,216,176,202,142,211,167,107, 1, 64,145,151,199,202, 94,190,156, 47,124,253,117, 94,183, 5, 11,156, 77, 58,157,231,202,149,
+ 43,187, 44,123,154,188,188, 89,156,126,227,198,153,150,253,250,107,231,164,121,243,250, 16, 6, 3,125, 72,183,110, 41,171,247,
+237, 43,126, 17,206,151, 89, 78, 81, 98,162,182,194,223, 31, 29, 71,142, 44,247,115,119,215,190,204,186,191, 72, 57,109,168,133,
+217, 87,235,195,186, 79,168,136,139,139,235, 13,224, 18,128, 47, 99, 98, 98, 86, 0,128,163,163, 99,105, 85, 85,149,251,145, 35,
+ 71, 44,138, 44, 38,147, 9, 47, 47, 47, 4, 6, 6, 74, 36, 18,137, 71, 19, 5, 40, 34, 73,178, 5, 69, 81,181,214,151,198,160,
+213,106,145,147,147,131,118,237,218, 61,193,211, 68,180,141, 26,117,248,124,126,110,102,102,166, 91,122,122, 58,238,220,185, 3,
+127,127,127, 56, 59, 59,131,201,100,194, 96, 48, 64, 46,151, 35, 56, 56, 24, 28, 14, 7,157, 58,117, 42, 83, 42,149,254, 22,166,
+128, 56, 2,129, 32, 39, 49, 49,209,183, 99,199,142,184,117,235, 22,124,125,125,225,233,233, 9, 0,200,203,203,195,149, 43, 87,
+ 48,108,216, 48,220,189,123, 23,163, 71,143, 46, 82, 42,149,129, 0,180,141, 17,186,184,184,136, 47, 94,188,248, 36, 50, 50, 82,
+163, 84, 42,105,165,165,165,204,164,164, 36,163, 66,161,176,147,201,100,204,170,170, 42,166, 92, 46,103, 40,149, 74, 38,141, 70,
+ 99,169,213,106,230,133, 11, 23,232,122,189,190,201, 0,153,230,118, 58,113,226, 4, 34, 35, 35,113,228,200, 17,204,159, 63, 31,
+ 87,175, 94,133,175,175, 47, 14, 30, 60,136, 5, 11, 22, 32, 43, 43, 11,110,110,110, 8, 11, 11,179,212, 70,104,219,182,237,195,
+ 7, 15, 30,180,101,177, 88,230,188,142,230,124,121,144, 74,165,120,244,232, 17,138,139,139, 17, 16, 16,128,119,222,121,231, 81,
+113,113,113,128,165,158,231,227,227, 35, 77, 75, 75,115,107,215,174, 29, 74, 75, 75,225,228,228, 4, 71, 71, 71, 56, 57, 57,213,
+110,251,251,251, 99,222,188,121,240,244,244,148,104, 52, 26, 15, 75, 34, 40, 50, 50,242,236,133, 11, 23,220, 28, 28, 28, 80, 82,
+ 82, 2,185, 92, 14, 6,131, 1, 62,159, 15, 55, 55,183, 90, 33,159,147,147,131,232,232,232,178,220,220,220,193,205, 16, 73, 52,
+ 15, 15,143,204,251,247,239, 7, 82, 20,133,194,194, 66,100,101,101, 97,230,204,153, 57, 26,141, 38, 4,255,162,156,125,117,252,
+174, 88, 19,223,255,144,245,230,136,238,186,140,180, 56,130, 67,102,161, 67,132,131, 12, 0, 82, 82,229,142, 90, 90, 48, 66,195,
+ 99,168,163,199,175,177,247,236,222,193, 4, 9, 15, 16,200,202,200,193, 87,141,113, 15,234,235, 53,101,206,156, 15, 34,250,244,
+236, 77, 83, 40,149,238, 63,253,180,190, 83,110,110,134, 59, 0,248,251,135, 74,102,204,152,155,108, 47, 16, 72, 46, 93, 73, 36,
+ 55,108,248, 37,245, 92,130,120,151, 21, 69,246, 15, 12, 12,188,126,226,196, 9, 55,119,119,119, 56, 58, 58, 66,169, 84, 66,175,
+215, 35, 61, 61, 93,115,224,192, 1,131,131,131,131,125, 73, 73, 9,170,170,170, 64, 16, 4, 78,156, 56, 81, 8,160,101,125, 34,
+179,143, 22, 0,204, 28, 26,202, 12,235, 23,232,204,226, 24,121, 60,102,182, 23, 8, 19,135,160,236, 60, 78,159, 77,105,119, 58,
+254,214,187,111,142,154, 47,236,213,251, 77, 44, 91, 58,198, 32, 18, 21,118,212,163, 87,102, 67, 62, 90, 33, 1,232, 55,114,244,
+155, 99, 87,174, 92,129, 21,203,190, 68,220,137, 99, 50, 59, 1, 77,235,224,196,116,124,253,181, 30,154,121, 31,141, 40,170,174,
+ 22,249,174, 92,115,224,157,232, 17,243, 90,244,236, 53, 18, 87, 46, 31,195,190, 95,191,188, 67,240, 40,219, 52, 98, 61,172, 0,
+156,157,252,253,167,125,146,147,195,186,183, 98, 69,181, 81, 36,170,140,154, 59,183,172,161, 99,159,196,199, 11,216,222,222, 14,
+206,111,188,225,178,177,101, 75,202, 32,145,108,111,200,199,168, 33,206,243,118,118, 78,191,159, 62,221,159, 98, 50,123, 47,252,
+236, 51, 94, 76, 76, 12,228,114, 57, 14, 31, 62,140,237,219,182,105,189,188,188, 30,120,167,166,222,141,144,203,151, 90,203, 25,
+ 53,119,110,153,201,100, 34,198, 46, 88, 48, 48, 45, 47,175, 95,137, 68,210, 10, 0,188, 92, 92,138,162,252,253,239,252, 18, 23,
+151,181,185,117,107,210,218,114,238, 60,115,198,227, 80,126,254, 20, 23, 23, 23, 94,169, 68,194,224,176,217,229,175,133,133, 29,
+220,186,100,201, 37,227,253,251, 44,110,139, 22, 14,142, 49, 49,205,174,123,212,220,185,101, 21, 10, 5,227,147,175,191,238, 81,
+ 80, 90,218,170, 90,171, 13,168, 82, 40, 60, 77, 6, 3,205,129,207, 47,111, 19, 28, 44, 81, 39, 37,137,219,168, 84,179,119, 1,
+146, 87,213,214, 13,105,145,127, 16,234,199,209,250, 75,174,195, 75, 49, 49, 49,127, 89, 93, 67, 81,148, 85,214, 44, 38,147,249,
+204, 52, 85, 19, 96, 17, 4,129,228,228,100,184,186,186,194,211,211, 19, 28,206,179,201, 7,165, 82, 41,174, 94,189,138,140,140,
+ 12,180,111,223,222, 60,141,209,184, 34,226,112,230,172, 89,179,198, 73,167,211,225,206,157, 59,136,138,138, 2,135,195, 1,139,
+197,122, 70, 4, 74, 36, 18,132,135,135, 99,225,194,133,142,223,126,251,237, 28,173, 86,219,232, 19, 41,131,193,152, 53,117,234,
+ 84,119,179, 5,171,168,168, 8,157, 58,117,170,253, 94, 40, 20, 34, 37, 37, 5, 81, 81, 81,104,209,162, 5,198,140, 25,227,190,
+111,223,190, 89, 70,163,113,109, 99,156,108, 54,155, 22, 25, 25,217, 25, 0, 4, 2, 1,104, 52, 90,182,131,131,131,208,195,195,
+ 67,224,224,224,240,151, 58,254,250,235,175, 85, 52, 26,205, 96, 81, 13,208,104, 40, 41, 41, 65, 68, 68, 4,100,178,167, 25, 92,
+148, 74, 37, 2, 2, 2, 32,151,203,107, 69,171,183,183, 55,212,234,166, 93,191,218,181,107,183, 34, 36, 36,100,144, 64, 32,224,
+ 48,153, 76,220,187,119, 15, 29, 59,118,196,129, 3, 7,224,231,231, 7, 62,159,143,156,156, 28, 68, 70, 70, 34, 49, 49, 17, 66,
+161, 16,225,225,225, 28,119,119,247,203, 21, 21, 21, 9, 5, 5, 5, 43,154, 40, 39,205,206,206, 14,137,137,137,248,229,151, 95,
+144,151,151, 7,145, 72, 4,123,123,123,116,232,208, 1, 97, 97, 97,232,222,189, 59,114,114,114, 64, 88,238, 76,158,129,129,129,
+113,183,110,221,114,163, 40, 10,251,246,237, 67,117,117, 53,116, 58, 29,104, 52, 26,184, 92, 46,156,157,157,209,175, 95, 63, 8,
+133, 66, 4, 6, 6,226,143, 63,254,112, 27, 58,116,232, 41,137, 68,210, 1, 64,137,165,235,234,236,236, 60,123,249,242,229,190,
+238,238,238,200,207,207,135, 76, 38,131,135,135, 7,250,244,233,227,115,254,252,249,217, 6,131, 97,253,191,229, 70, 86,199,241,
+157, 56,119,246,231, 81,129,109, 42, 35,219, 7,243,125,143,196,121,248, 30,136,147,132, 3, 64, 68,168, 71,218,168, 24,126,209,
+189,180,184,162,115,103,143,221,201,200,198, 17, 88, 49,181, 45, 83,105, 15,198,159,191, 57,164, 99,251, 78,228,154,239, 22, 68,
+127, 52,115, 10,199,221, 99, 50, 74, 11,143,225,252,197,100,191, 5,243,167, 10,215,174,219,121, 58,254,252, 77,154, 76,165, 93,
+106,157, 41,203,111,243,238,173,221,221, 20,101,135,240, 48,147, 13,158,125, 4,252,253,131, 32,151,203,193,229,114,185,239,188,
+243,142,105,241,226,197, 42, 7, 7, 7, 62, 65, 16, 72, 72, 72,144, 0, 24,108,137, 87,227,238, 76,153,244, 6, 35,197,166,147,
+ 20, 97,175, 38, 76, 21,236,212,244,199, 24, 52,160,111,105,207,174, 17,223, 46, 94,185,238,243,192,160,142,194, 15,166,124,201,
+252,122,197,187,219, 64,160, 87, 67, 60,153, 15,113,145, 56,120,148, 7, 32,122,229, 87, 43,144,155,155,227,252,225,164,170, 47,
+ 25, 28,158,119, 72,203, 30,246,219,126, 73, 24, 18, 16,208,186,213,188, 89, 99, 78,254,240,227, 15,209,117, 45, 91,187,127, 93,
+126, 28, 64,127,107,174,237,255, 16,218, 77,136,139, 67,117, 97,161,161,226,242,101, 77,255, 31,127, 44,243, 29, 60,120,189, 78,
+175,119, 51, 15, 21, 52,130, 0, 97,118,157, 32, 73,130,177,112, 33,141, 98, 48, 96,112,118,158,132,202,202, 32, 75,156,243,197,
+226, 81,239, 78,153, 18,125,252,204, 25,180,110,221,186,246,126,230,228,228,132, 5, 11, 22, 96,238,220,185,156,148,148,148, 46,
+135, 14, 29,234,178,246,251,239, 61, 0,140,178,166,156,231,110,220,112,158,190,114,229,146,246, 81, 81,126,123,247,239,231,180,
+109,219, 22, 0,240,232,209,163,192,239, 86,175,110, 25, 17, 25, 89,250,237,156, 57,187,211, 22, 47, 14, 7,112,185, 41,206,146,
+164, 36,221,161,252,252, 41, 23, 19, 18,156, 34, 34, 34, 0, 0, 89, 89, 89,238, 27, 55,110,156, 26, 62,102,204,248,149, 51,102,
+ 44,141,209,104,170, 28,164, 82, 78,204,230,205,140,223,199,142,181,200,105, 46, 39, 0,244,249,224,131, 57,189,250,246, 13, 27,
+ 53,101,138,139,159,159, 31, 97,103,103, 7,189, 94, 15,145, 72,228,156,150,150,214, 54, 78,161,144, 31,189,113, 99, 31, 76,166,
+129,175,176,173, 27,212, 34,255, 48, 75,214, 95, 53, 69,205,123,159,184,184, 56, 10, 64,159,152,152,152, 68,243, 13,220,100, 50,
+ 89, 37,178, 24, 12, 6, 8,130,176, 86,108,129,162, 40,148,149,149,161,172,172,172,118,234, 72, 34,145,224,226,197,139,200,201,
+201, 1,147,201, 4,139,197,130, 94,111, 57, 7,173, 64, 32, 24, 48, 96,192, 0,198,141, 27, 55,224,239,239, 15, 30,143, 87, 91,
+ 46,243,139,197, 98,193,203,203, 11,114,185, 28,253,251,247,103,110,218,180,105, 64, 83, 66,203,209,209,113,216,184,113,227,216,
+230,207,213,213,213,160,211,233,181,162,165,186,186, 26, 21, 21, 21,168,170,170,130, 70,163, 65,183,110,221,216,113,113,113,195,
+202,203,203,215, 90, 83,127,149, 74, 85, 45,145, 72,156,122,245,234,229,188,123,247,238,172,110,221,186, 5, 63,211,211, 46, 93,
+210,104, 52, 26, 38,141, 70,179, 42,143, 94,108,108,108,237,181, 47, 46, 46,198,182,109,219,106,191,203,201,201,193,166, 77,155,
+ 64, 81, 20, 40,138,106,178,141, 66, 66, 66,134,238,219,183, 47,106,239,222,189,149,116, 58, 29, 89, 89, 89,216,191,127, 63, 40,
+138,130, 80, 40,132, 74,165, 66,105,105, 41, 18, 18, 18, 96, 52, 26, 97,103,103, 7, 31, 31, 31,238,172, 89,179,122,126,249,229,
+151,204,166,132,150,201,100, 50,209,233,116,180,108,217, 18,203,150, 45,131, 70,163, 1,139,245, 84, 95,202,229,114, 84, 85, 85,
+225,238,221,187,200,207,207, 7, 69, 81, 77,222,100,184, 92,238,152,189,123,247,186,179,217,108,168,213,106, 40, 20, 10, 20, 21,
+ 21,161,160,160, 64, 35,145, 72,140,246,246,246,180,150, 45, 91,210, 56, 28, 14,103,228,200,145,132, 89,112,198,196,196,184,238,
+219,183,239, 45,157, 78,103, 73, 36, 9, 61, 61, 61, 63,159, 58,117, 42,183,110,159, 45, 41, 41,193,168, 81,163,248,215,174, 93,
+ 91, 44,151,203,247, 3,144,254,203,110,104,212,161,163, 65,183,239,156,207,138, 60, 18,231,225, 91,240,196,212, 99,193,167,235,
+ 24, 0,176, 99,251,170, 30, 71,226,138,175,134,180, 46, 45, 58,116, 52,232,182,179,115,134, 37, 33, 64,235,215,219,107,184,128,
+207, 29, 55,234,141, 55,168,159,126, 90,223,233,163,153, 83, 56, 45,131, 22, 60,181,112, 50,221,209,223,248, 21,161, 82, 63,226,
+254,244,211,250, 78,163,222, 24,125, 55, 47, 47,127,123,191,222,156, 63, 46, 38,138,255,108,202, 98,232,238,202,245,225,115,148,
+240,241, 15, 67,112,168, 0, 41,247,178,112,248,224,117,132,134,191, 6,173, 86, 11,163,209, 40, 24, 62,124,184,234,192,129, 3,
+154,236,236,108,133, 90,173,238, 13, 32,219, 82,229,159, 60, 73, 39,131, 61, 95,211,179,120, 28,163, 66,198, 82, 45, 90,122,104,
+108,167,174,131,162,156,189,124,152, 66, 1,249,231,208,129, 93,246,255,178,107,217,220,165,203,247,163,115,151, 65,221, 50,178,
+ 46,135, 1,120,208,160,120,205, 69, 28,237,240, 81, 99,238,195,135,209, 5,249,249, 79,130, 60, 60,117,143,170, 40,195,236, 69,
+ 59, 7,246,234, 61,166, 93,219,208,215,217, 25,233,137,196,178,133,111,253,182,114,205, 15,239,152,197,214,133,248,223,122, 79,
+154,116,157,189,123,119,227,214,241,255, 53,176, 56,156, 22,118, 45, 91, 50,242,118,239, 86,251, 15, 31, 94, 9, 0, 58,189,222,
+ 45, 47, 63,223,145,207,231,131,162, 40, 24, 12,134,103,124,136,205,126,195, 17,193,193, 30,214,112,230,125,241, 69,187,133, 11,
+ 23,162,164,164, 4, 70,163, 17, 76, 38,179,254,152, 13,165, 82,137, 73,147, 38, 97,243,247,223,191,102, 13,167,201,100, 34,166,
+175, 92,185,228,179, 37, 75,218, 78,155, 54,141, 86,119,236,117,113,113,193,161,195,135,217, 91,182,108,105,241,249,230,205,147,
+222,229,112,114,161,213, 54,201, 89, 22, 16, 0,151,210, 82,158, 89,100, 1, 64,112,112, 48,182,109,219,198,153, 60,121, 50,123,
+248,240,225,235, 82,218,183,223,184,190,103,207,135,174, 65, 65, 14,108, 14,167,133, 37, 78,243,245, 4, 0,133, 70, 19,177,126,
+227, 70,231,155, 55,111,162,180,180, 20, 37, 37, 79,159, 71, 9,130, 64,231,206,157,137, 9, 19, 38, 56,182,241,245,237, 2,147,
+233, 85, 54,247, 95,180,200, 63, 8, 31, 54,176,239, 63, 62, 90, 53, 21, 34,106, 42, 72,212,185, 57, 62, 35, 88, 44, 9,173,231,
+ 65, 85, 85, 21,170,170,170,176,107,215, 46,176, 88,172,218,155, 47, 0,232,116, 58,107, 68, 75,164,183,183, 55,100, 50, 25,130,
+130,130,158,177,100,177, 88, 44, 48, 24, 12,176, 88, 44,112, 56, 28,104,181, 90,248,249,249, 65,165, 82, 69, 54,197,169, 86,171,
+ 59,184,184,184,212,222, 96,181, 53,157, 85,171,213,214,150, 87,167,211,161,178,178, 18,213,213,213, 80, 40, 20, 80, 42,149, 29,
+173,169, 47, 73,146, 72, 77, 77,125, 20, 28, 28,220,129, 78,167,195,206,206, 78,160, 84, 42,107,125,139, 42, 42, 42,176,103,207,
+ 30,229,123,239,189,231,118,226,196, 9,139, 66,139, 32, 8,124,252,241,199,224,112, 56, 80,169, 84,248,233,167,159,240,201, 39,
+159,128,197, 98, 65,161, 80, 96,219,182,109,152, 55,111, 30, 24, 12, 6,116, 58, 29, 54,110,220,216, 40, 87,122,122,122,222,141,
+ 27, 55, 58,118,234,212,201,249,232,209,163,210,129, 3, 7, 10, 7, 15, 30, 12, 30,143, 7,181, 90, 13,131,193,128,215, 94,123,
+ 13, 33, 33, 33,144, 72, 36, 56,125,250,116, 89, 96, 96,160,219,205,155, 55,201,146,146,146, 2, 11,226,154,170, 99, 49,132,201,
+100, 66,105,105, 41,170,170,170, 32,149, 74, 33, 18,137,240,228,201, 19, 48, 24, 12, 88,208, 89,112,117,117, 29, 29, 17, 17, 65,
+ 7, 0, 30,143,135, 14, 29, 58, 96,201,146, 37, 70,181, 90, 61, 14,192,233,154,195,134,238,220,185,243,232,149, 43, 87, 24,222,
+222,222,200,204,204,132, 80, 40,100,112,185, 92,139, 66,203,211,211,243,215, 63,255,252,211,197, 44,174,205,215, 89,165,122,218,
+ 28,163, 70,141,114,217,187,119,239,175, 70,163,113,216,191,237,166,230,196, 3,171, 67,132,131,236, 64,156, 36,124,193,167,235,
+ 24, 33, 17, 79, 31, 94, 63,156, 6,198,218,239,231,135,143, 31,225,112,210,137, 39,103, 89,226, 25, 58,192,119,203, 27,111, 12,
+164,189,243,118, 76, 14,139,229,228,191,125,199,151,238,238, 30,147,235,200, 48, 7,184,186, 57,192,191, 37,155, 56,116, 50,195,
+125,209,226,175,180,177,123,127,200,253,237,247,184, 33,108,102,252,160,211,231,139,102, 52,198,157,253,168,234,132, 74,203, 13,
+149,151,223, 39, 92, 60,122,160, 67,251, 96,184, 11, 43,177,243,215, 3,104,221,166, 51,180, 90, 45, 28, 28, 28,248, 38,147, 73,
+ 79,167,211, 99,173, 17, 89, 0,112,225, 66, 21, 25, 30, 94,165,163, 43, 72,227, 71,159,172,125,115,224,208, 55,194,250,245, 27,
+ 64,158,139, 63,167,239,209, 81, 47, 30, 58,184, 67,233,153,248, 45, 57, 98,209,227,192,240,200,158, 72, 79, 75, 24, 66, 81, 72,
+ 37,136,134,173, 79,105, 15,113, 70, 67,166, 39, 28, 56,240, 33,169, 38,239,242,190,254,230,193,208,232,232,137, 17,175,247,122,
+157,140, 63,127, 81,199, 70, 89,134, 67,207,238,197, 31, 77, 25,122,244,231,216,141,131,206,156,254, 53, 64, 38, 47,136,179,137,
+172,122, 15,105, 70,163, 7,131,195,161, 73, 19, 18,140,145,147, 39,107,205,255, 71, 62,159,143,227,199,143,131,205,102,215,190,
+ 88, 44, 86,237,182,135,135, 7,136,154,101,164,214,112, 2,128, 88, 44, 70, 73, 73, 9, 28, 29, 29, 33, 20, 10, 81, 82, 82,130,
+107,215,174, 33, 59, 59, 27, 76, 38, 19, 67,134, 12, 1,173, 17,223,230,250,156, 99, 23, 44, 24, 24, 26, 25,233, 87, 95,100, 1,
+128, 94,175, 71, 69, 69, 5, 70,140, 24, 65, 59,125,250,180,231,153,194,194, 55, 0,196, 54,197,217, 49, 58,186,188,244,208,161,
+ 6,127,187, 83,167, 78,196,213,171, 87, 57, 67, 6, 15,158, 59,255,155,111,182,108,222,187,183,200,100, 52,122, 54,167,238, 52,
+ 26,141, 70, 16, 4,124,125,125, 81, 81, 81,129,234,234,167, 51,216,118,118,118,112,118,118,134,193, 96, 0, 73, 81,204, 87,217,
+214,141,105,145,127, 8,118,212, 17, 92, 59,254, 98,209,170,169, 20, 0,244,169,123, 99, 33, 73,210, 42,145,197,100, 50, 45,250,
+ 92, 89, 99,229,170, 15,107,132,150,185,172, 92, 46,183,246,143, 86, 87, 96,153,203, 73,163,209, 64,167,211, 45,222,196,107,196,
+ 16, 93,161, 80,224,240,225,195,232,221,187,119,237,180,148, 76, 38, 67, 85, 85, 21,100, 50, 25, 52, 26, 13,242,242,242,112,225,
+194, 5, 4, 4, 4, 0, 86, 6,127,205,205,205,189,211,186,117,235, 40,243, 77,188,111,223,190, 45,118,239,222, 45, 26, 54,108,
+152, 55, 69, 81, 88,186,116,105,217,107,175,189,230, 86,247, 38,111, 9,116, 58, 29,215,174, 93, 67, 64, 64, 0, 40,138, 2,139,
+197, 66, 86, 86, 22,220,221,221, 65,146, 36, 24, 12, 6,164, 82, 41,236,237,155,142,145,152,154,154,250,254, 7, 31,124, 32,114,
+116,116,108, 87, 94, 94, 46,230,112, 56,189,146,146,146,124,245,122, 61, 28, 28, 28,224,224,224,128, 83,167, 78,193,201,201, 9,
+115,230,204, 41, 84,171,213,215, 4, 2,129,135, 90,173,190, 95, 82, 82,178,180, 57,237,109, 52, 26,161, 84, 42, 81, 89, 89,137,
+138,138, 10,200,229,114,104, 52, 26,139,101,108, 8,189,122,245, 66, 92, 92, 28,125,213,170, 85, 63,231,230,230, 2, 0,252,253,
+253, 49,103,206, 28,186,143,143, 15,242,242,242,112,231,206, 29,232,245,122, 80, 20,213,228,159,151,193, 96,244,125,239,189,247,
+122,250,249,249, 17,122,189, 30, 36, 73, 66,171,213,194,188, 93, 88, 88,136,208,208, 80, 90,203,150, 45,187,229,230,230,246,133,
+117, 11, 43,108, 0, 80, 90,120, 12, 62, 76,119,128,230, 0, 74,125, 12,229,101,207, 23,197, 69, 34,145,124,179,240,139,171,147,
+ 55,175,209,123, 60, 17, 3,193, 17, 35, 17, 24,214, 31,239, 79, 48, 98,213,247,135,225,215, 50, 24, 5, 5, 5,232,219,183, 47,
+ 75, 36, 18,125, 80, 93, 93,189,192, 90,238,248,248, 27,166,115,167, 78,143, 25,251,214,196,168, 1, 3,134, 25,207,158, 61,133,
+212,251,103,211, 62,120,107,180,132, 34,171, 9, 23, 39,222,221,172,204,219,129,237, 58,244,129,206,104,234, 5,172, 88, 3,172,
+160, 26,255,191, 67,119,242,164, 23,237,228,177, 95, 39,188, 51,126, 82,251,254,253, 7, 25,206,198,255,137, 59,215,227,239,173,
+ 91, 51, 53,113,213,198, 63,250, 14, 28, 50, 58, 92,232,113,237, 84, 68,144,118,138,175,171,227,163,157,187, 43,108,157,165,161,
+255, 38,151, 75,162,102, 92,164, 17, 4, 40,138,122, 70,100,213, 23, 90, 52, 26,205,162, 1,160, 46,103,221,123,145,249,129,122,
+251,246,237,224,112, 56, 96,179,217, 96, 50,153, 22,221, 47,234,114,166,229,229,245,219, 19, 27,203,105, 72,100,149,151,151,163,
+188,188, 28,213,213,213,120,251,237,183, 89, 95,222,190,221, 9, 53,174, 31,141,113,250,121,121,105, 5, 60, 94,105,122,122,186,
+119, 88, 88,216, 51,229,149,203,229,224,241,120,136,221,191,159, 21, 19, 29, 61,179,255,169, 83,235, 96, 33,254, 85, 67,117, 39,
+ 8, 2,238,238,238,112,118,118, 6, 65, 16, 48, 26,141, 40, 41, 41, 65, 90, 90, 26,110,223,190, 13, 58, 65, 24, 95,101, 27, 55,
+164, 69,254,129, 86,173, 29, 13, 78, 29, 54, 54, 39,218, 28,161, 69,167,211,159,219,170,213, 24,172,153, 58,228,243,249, 15, 68,
+ 34, 81, 15, 31, 31, 31, 24,141,198, 90,161, 85,127,234,208,108,253, 72, 73, 73, 1,159,207,127,160,209,104,154,228,164, 40,170,
+ 91,151, 46, 93,112,228,200, 17, 36, 36, 36,224,241,227,199, 80,169, 84,208,106,181, 80,171,213, 72, 75, 75, 3, 73,146,136,136,
+136,128, 64, 32, 0,159,207,127,160,213, 54,253, 32,170, 84, 42,197, 76, 38, 51,152,199,227,213,238,243,242,242, 66,121,121, 57,
+105, 48, 24,176,103,207, 30,185,167,167,167,128,199,227, 89, 45, 92, 9,130,128, 68, 34, 65,139, 22, 45,106,125,180, 20, 10, 5,
+220,221,221,205,194, 2, 90,173, 22,246,246,246, 22,167, 14, 1,104, 30, 62,124, 56,191,206,231,206, 99,199,142,253,237,192,129,
+ 3,109,206,159, 63,143,155, 55,111, 66, 40, 20,226,219,111,191,125,156,159,159,255, 14,128,219, 18,201,203,245,139,180,166, 15,
+149,151,151, 31,126,240,224, 65,183, 46, 93,186,212,142, 18,125,251,246, 37,250,246,237,235, 86,215,212, 47,149, 74,113,235,214,
+ 45,156, 63,127, 30, 4, 65, 32, 39, 39,199,164, 86,171,127,107,106,150,194,199,199,103,247,146, 37, 75,236,140, 70, 99,109,223,
+230,241,120,224,114,185, 96,177, 88,160,211,233,200,207,207,199,136, 17, 35, 28,127,252,241,199, 95,181, 90,109, 91, 0,122,252,
+ 75, 80,165,134, 62, 37, 85,238, 24, 17,234,145,182, 99,251,170, 30, 31, 78,131,121,234,208, 24, 17,234,158,150,146, 90,234, 24,
+229,110,185,190,167,207, 23,125,164, 51,156, 30,126,250,204,165,113,159,206,157,195,244,247, 15,149,156,191,152,236,215,223,248,
+ 21,225,234,230,128,242, 50, 57,242, 11, 75,145, 91,160,163,252,253, 67, 37,119,110, 61,224,124,191,126, 67,160, 82,165, 49, 79,
+ 29, 54,217, 79, 47, 95,123, 60,114,221, 38, 78,226,196, 15, 58,179,121, 60,111, 84,148, 61,128,159,159, 16, 35, 98,218,225,151,
+189,215,224,232,232, 2, 15, 15, 15,208,104, 52,129,181,117, 47, 43, 43, 35, 14,255,126,121,242,123,147,166,190, 54,120, 80,180,
+241,204,217,147,140,132,115, 39,174,253,186,227,243,163, 20, 93,201, 39, 40, 5,175, 85,107,207,251,143, 30,166,188,211,111,192,
+219,224,177,236, 3,128,144, 6, 59,108,237, 2, 3, 10,133, 71, 14,172,224,190, 55,233,195,238,131, 7,191, 97, 60,123,246, 24,
+206,158,218,123, 99,249,242, 86,167, 30, 23,239,103, 93,191,253,132, 59,114,204,140,202,184,211, 25,186,209,195, 91,103,123, 11,
+ 58,168,129,199, 54, 85, 85,247, 65,146,193, 40, 53,106,181,190, 45, 6, 15,166,171, 10, 10,152,118, 30, 30, 70, 0, 48, 24, 12,
+ 22,133, 22, 26,153,130,174,207,105,109, 89, 84, 42, 21,200, 70, 98, 39,214,231, 44,145, 72, 90,213, 60,132,215,194, 96, 48,212,
+138,172,242,242,114, 84, 85, 85, 65, 32, 16, 64,170,213,122, 88,195, 57,168,107,215, 61, 95,174, 88,177,224,208,225,195,172,186,
+ 34,203,252, 98, 50,153,248,110,205, 26,214, 39,159,126, 58, 99, 38,131, 49, 27, 70,163,213,215,211,252,208, 78,167,211,193, 96,
+ 48, 80, 80, 80,128,194,194, 66, 20, 20, 20,160,160,160, 0, 60, 30, 15,212, 43, 94, 4,244, 15,246,207, 50,139,172,186,239,181,
+ 86,174, 38,195, 59, 52,199, 25,222, 90, 97, 96,106,198,252,174, 53, 66, 75,169, 84,158,191,112,225, 66,215,145, 35, 71, 50,110,
+220,184, 1, 79, 79,207, 90,161,101,126, 55, 79, 71,241,249,124, 28, 61,122, 84,175, 84, 42,207, 91,248, 51, 93, 56,117,234, 84,
+212,178,101,203,152,239,191,255, 62,210,211,211, 49,109,218, 52, 84, 85, 85, 65, 46,151,163,188,188, 28, 42,149, 10, 93,187,118,
+ 5,151,203,197,253,251,247, 13, 42,149,234,130, 5,139, 29, 37,145, 72,170,133, 66,161, 87,253,239,198,140, 25,227,177,117,235,
+ 86, 85,102,102,166,161, 71,143, 30, 14,214, 10, 14, 51,126,255,253,247, 90, 75, 93,118,118, 54,182,110,221, 90,235,147,149,156,
+156,140,181,107,215,214,198, 62,107, 38,110,151,149,149, 25, 13, 6, 3, 2, 2, 2,224,227,227, 3,141, 70,131, 13, 27, 54, 24,
+ 1,220,254,255,234,205, 26,141,230,208,196,137, 19, 63,187,123,247,174, 23,131,193,120,106,210,174,169,159, 94,175,199,195,135,
+ 15,145,150,150,134,204,204, 76, 84, 84, 84,212, 62, 8,164,164,164, 84, 26, 12,134, 63, 26,227, 21, 10,133, 75,127,249,229, 23,
+ 79, 62,159,255, 76,127, 54, 91, 67,205, 86, 82,169, 84, 10, 39, 39, 39,244,239,223,223,253,194,133, 11, 75,181, 90,237,178,127,
+201, 61,141, 24,243,102,118,231, 79, 62, 26,137, 81, 49,252,162, 35,113,197, 87,215,126, 63,191,198, 25,222, 61,109, 84,140, 79,
+209,189, 44, 39,140,121,243, 88,103, 0, 79,208,180,195, 54,121, 49, 81,124,188, 75, 23,231,132, 35, 39, 78,252,186,120,225,220,
+228, 5,243,167, 10, 85,234, 71, 92,255,150,108, 2, 0,114, 11,116,212,253,116, 82,179,118,221,220,228, 85,107,126,164,149,150,
+ 87, 77,187,117,171,241,240, 6,117,197, 11,141, 6,174,127, 72,111, 81, 96, 80,207,214, 55,174,197,194,142,175, 70,112, 72,103,
+ 12, 30,212, 13, 9,151, 82, 80, 34,213, 64, 44, 22, 67,171,213, 54, 25, 46, 33,243,254,209, 9, 20, 65,249, 17, 20, 81, 72,208,
+ 40,238,132,137, 83,122, 69, 71,191, 65,197,197,157, 48, 30, 59, 26,123,229,143,125,155, 14,209, 88, 76,134, 90,231,168, 35, 8,
+141, 12,180,212,244,106,229,211, 7, 26, 38,135,213,184,249,181, 38,176,107, 88,120,136,231,132,137,211, 28,135, 13, 29, 65,157,
+ 58,117,140,252,227,192,158,132, 63,118, 69,198,146, 52, 57, 75, 92,164,226,200,228, 6, 25, 69,176,157,170,229,164,170, 52,183,
+173,198, 59,122,140, 30, 56,100, 83, 87,117,239, 3, 90,237,147,234,162, 34, 47,151,222,189, 57, 15, 87,172,224,123,116,237,170,
+ 33,106,124,136,155, 18, 90,116, 58, 29,160,209, 72,107, 56,173, 45,139, 90,173, 6, 9, 24,158,135,211,104, 52, 62, 35,178,204,
+ 66,203,252,127,177,134,115,199,242,229, 55,252, 6, 15,174,184,116,233,146, 71,159, 62,125, 8,133, 66, 1,133, 66,241,140,216,
+242,246,246, 38,194, 34, 34,248,191, 39, 36,248, 91,123, 61,173,169, 59,141, 70,123,229, 66,235, 31,142, 70, 19, 73, 55,153,130,
+199,108,209,178, 70,104, 89,105,209, 50, 24, 12, 6,184,187,187,163,172,172,172,209, 27, 63,141, 70, 3,143,199, 51,207, 17, 55,
+185,242, 78,171,213,110, 88,176, 96,193,172,161, 67,135,186, 5, 7, 7, 67, 42,149,194,195,195, 3, 92, 46,183,214,119,204,204,
+151,156,156,140, 95,126,249, 69,174,213,106, 55, 88,224, 92,191,102,205,154,143, 70,141, 26,229,226,233,233, 9,103,103,103,220,
+191,127, 31,206,206,206,144,203,229,200,202,202,130,189,189,125,173,223,206,137, 19, 39, 20, 90,173,118,189, 5,241, 70, 37, 37,
+ 37,233,237,237,237,239, 75,165, 82,122, 69, 69, 5,163,178,178,146, 33,151,203,153, 50,153,140,121,230,204, 25, 55, 71, 71, 71,
+213,197,139, 23,165,126,126,126,244,199,143, 31,211, 13, 6,131, 69,245, 74, 16, 4,102,207,158, 13, 22,139, 5,173, 86,139, 13,
+ 27, 54, 96,193,130, 5,181, 62, 89,107,214,172,193,146, 37, 75,106,133,243,206,157, 59,155,213,115, 40,138,130, 94,175,135,193,
+ 96,128,193, 96,176, 74,252,190, 8,172, 20,236, 37, 57, 57, 57, 49, 93,186,116, 57,119,240,224, 65,215,154,152,100, 40, 45, 45,
+ 69,105,105, 41,164, 82, 41,170,171,171, 97, 52, 26,225,227,227,131,210,210, 82, 28, 59,118, 76,166, 80, 40, 6,163,137, 21,135,
+116, 58,125, 98,175, 94,189, 24,245,203, 96,126,202, 51,139,119, 14,135, 3,145, 72,132,190,125,251,178, 47, 93,186, 52, 17,192,
+ 63, 90,104,213, 13,239, 48,104,240,100, 86,104,120,119,221,189,180,184,162,144,214,165, 69,227, 71, 56,156, 4,128,148,212, 82,
+199,123, 89, 78, 8, 13,143,161, 6, 13,118,142, 42, 45,217, 17, 9, 64,223, 84,186, 30, 0,112,228,115,198, 14, 28,208, 85,100,
+ 47, 16,208,214,174,219,121,250,167,159,214,119, 58,116,242, 63,225, 29,214,174,123, 26,222, 97,224,128,174,100,102, 70,230, 88,
+ 0,187,172, 21, 47, 49, 49,195,239,254,178,251, 23,100,166, 93,244,254,108,118, 59,118, 69,169, 1, 60, 59, 95, 68,117,240,192,
+142,221, 15,112,239,222,189, 18,157, 78,215,183,201,254, 77, 80,126,105,233,169, 65,145,225, 97,158, 19, 38,126,232, 16, 19, 51,
+ 2,113,113,199,177,111,207,174,164,209,111,143,250,185,184, 82, 78,119,103,242, 89,124,138,100,211, 89,142, 12, 22,135, 39,209,
+233,158,174,129, 96, 50,185, 14,192,216, 38,111, 60,211, 63, 28,239,216,111,192, 8,156, 60,117, 28,251,246,236, 72,252, 34,124,
+204,174,214, 29, 67,137,174,157,190,159,209,186, 77,235,150,202,234, 82, 57,141, 96,235, 53, 26,210,254,251, 61,249, 63,228, 46,
+153,152, 11, 96, 29,108,171, 14,235,226,254,190, 97,195,186,124,242,232, 17, 75,216,179, 39, 79,148,144,192,175,201, 68,210,164,
+208, 98, 48, 24,160, 26,159,234,122,134,147,216,187,151, 6,160,201, 69, 88, 44, 22, 11, 42,149, 10,134,198, 45,216,207,112,122,
+157, 61, 91,244,232,209,163, 64, 23, 23,151,103, 68, 86, 69, 69, 69,237,182, 70,163,129, 74,165, 2,143,199, 75, 83, 55, 60, 35,
+242, 12,103,105, 82,146,102,245,236,217,203,222,121,251,237, 77,231, 47, 92,224,186,186,186, 66, 38,147, 61, 35,180,116, 58, 29,
+250,245,239,207, 90,115,247,238, 4,200,229,203,173,185,158, 30,125,251, 90,244, 7,166,211,233, 32, 95,241,212,225,191, 0, 31,
+ 54, 36,188,104,150,166,112,172, 93,117,216,200, 13,178,126,118,239, 37, 81, 81, 81,154,236,236,108,248,249,249,213,138,149,186,
+191,233,224,224, 0, 39, 39, 39, 36, 39, 39,227,155,111,190, 81, 3, 88, 98,129, 83,161, 82,169,222, 26, 56,112,160,154,193, 96,
+ 32, 36, 36,164, 54,126, 22, 73,146, 96,179,217, 16, 8, 4,184,123,247, 46,134, 15, 31,174, 82,169, 84,111,225,175, 49,180,234,
+115,202, 84, 42,213,187,131, 6, 13, 82,165,167,167,163, 87,175, 94,184,119,239, 30,170,171,171, 81, 93, 93,141,188,188, 60,132,
+133,133, 65,165, 82, 97,235,214,173,106,149, 74,245, 46, 0, 89, 83,156, 10,133, 98,248,130, 5, 11,232,191,253,246, 91,107, 31,
+ 31,159,240,206,157, 59, 7,247,239,223,191,237,155,111,190,217,114,216,176, 97, 94,129,129,129,154,193,131, 7, 11,135, 14, 29,
+ 42, 84,169, 84,204,171, 87,175,138, 13, 6,195, 80, 11,229,172, 21, 39,217,217,217,181, 83,133, 12, 6, 3,101,101,101,181,145,
+251,205,131, 82, 35, 66,120,128, 37,177,109, 22, 88,102,193,101,133,159, 91, 67,156, 22, 79, 98,179,217,102,139, 39,101, 5,103,
+ 74, 70, 70,198,192,222,189,123,167, 76,158, 60, 89, 81, 82, 82, 2,123,123,123,248,251,251, 35, 40, 40, 8,110,110,110,208,235,
+245, 56,122,244,168,242,216,177, 99, 15,100, 50, 89, 95,252, 53,134,214,128,122,215, 49,175,161, 65,214,108,205, 50, 11, 45, 46,
+151, 11, 31, 31, 31,243,181,205,107,206,245,124, 78,188, 90,206, 26, 1,211,191,223,224, 54,195,162, 71, 58, 30, 61,126,141,189,
+105,203,177, 7, 81, 3,176,211,181,149,252,132,107, 43,249,137,168, 1,216,185,105,203,177, 7, 71,143, 95, 99, 15,139, 30,233,
+216,191,223,224, 54,233,105,153,193,117,243, 30, 54, 84, 78, 46,151,219,189, 87,207,168,202, 75, 87, 18,201, 85,107,126,164,245,
+235, 59,250,238,174,159,143, 30,221,245,243,209,163,253,250,142,190,187,106,205,143,180, 75, 87, 18,201, 94, 61,163, 42,185, 92,
+110,119,107,234, 62,253,195,241,142,209,195, 70, 32, 46,238,168,241,208,239, 91,215, 28, 56,156,211,123,202,172,164,210,236,236,
+123,148,228,201, 89, 48,105, 5,200,200,200,144,213,136,172,108,107, 56,167, 77, 29, 95, 87,100, 93,118,245,236,181, 51, 35, 3,
+166,248,248, 63, 13, 23, 46,220, 85, 95, 78,145,200,238,164,151, 85,136,164, 21,143,229,242,114, 29, 73,154, 96, 50,153,232, 95,
+126, 89,235,176,219, 96, 27,245,232,209, 7, 23,207,239,199,158,221,219,101, 36, 9,205,216, 67,135, 76, 99,199,174,160, 90,182,
+106,213, 50,246,247,253, 68,204, 27, 35, 29, 41,128, 28, 62,106,132,211,111, 7,126, 35,218, 4,180,105,229,239, 95, 27,210,230,
+159,215,151, 94, 1,231, 10,160, 82, 94, 80,144,152,252,227,143, 90,143,183,222,114, 97,123,120, 56,192,100, 34,204,227,123, 99,
+ 47, 6,131, 81,223, 2,211, 40,167,143,155, 91,241,137, 19, 39, 16, 20, 20, 4, 31, 31, 31,212,245,145, 53, 7,228,118,117,117,
+197,225,195,135, 65, 61, 27,156,186, 81,206,142,173, 91, 39,127,183,122,181,142, 36, 73, 84, 86, 86,254,197,154, 85, 89, 89, 9,
+146, 36,113,234,228, 73,157,252,105, 38, 16,171,234,222,151, 78,175,126,231,245,215, 87, 69, 71, 71,235, 31, 61,122, 4,146, 36,
+ 81,215,178, 37,145, 72, 96,103,103, 7,141, 86,235, 11,128,111, 13,167,228,204, 25, 1, 44,140,235, 13, 88,180, 94, 69,187,255,
+211, 69, 86,221,132,210, 31, 90,101,209, 50, 26,141,240,245,245,125, 38,165, 11,141, 70,123,230,213,204, 21,135,123,211,211,211,
+207, 14, 30, 60,120,217,107,175,189, 54,125,217,178,101,244,224,224, 96,200,100, 50, 56, 59, 59,195,221,221, 29, 89, 89, 89, 56,
+113,226,132,169,172,172,108, 27,128,149,176,110, 9,125, 66, 78, 78, 78, 76,187,118,237, 14, 44, 90,180,200,113,208,160, 65, 76,
+ 95, 95, 95, 80, 20,133,187,119,239,226,200,145, 35,250, 93,187,118,201,107, 68,150,181,206,203,231, 68, 34,209,232,161, 67,135,
+198, 78,156, 56,209,222,100, 50, 49,243,242,242,160,213,106, 97, 48, 24, 80, 88, 88,168,143,139,139,171, 86,169, 84,227, 1,156,
+179,130, 47,185,170,170, 42, 44, 62, 62,126,226,213,171, 87,191,153, 60,121,178,107,255,254,253, 89, 70,163, 17, 87,174, 92,145,
+118,236,216,209, 93, 34,145,232, 15, 31, 62, 92,174,209,104,150,152, 76, 38,171, 82,240, 16, 4, 1,185, 92, 14, 55, 55, 55,104,
+181, 90,144, 36, 9,157, 78, 7, 59, 59,187,218,180, 73, 20, 69,161, 57,206,245,245,250, 0, 93,175,215,227,237,183,223, 6, 73,
+146,216,176, 97, 3,140, 70, 99,179,201, 28, 29, 29,239,164,164,164,196,116,232,208,161, 86,188,152,251, 16,135,195,129,155,155,
+ 27, 92, 93, 93, 17, 23, 23, 7, 38,147,121,199,146,191, 91, 13,238,149,149,149,117,140,143,143,239,254,224,193,131,247, 0,116,
+208,235,245, 62, 38,147,137,160,209,104, 98,138,162,238,203,229,242,159, 97,101, 10, 30,137, 68,242,205,164, 73,147, 58,238,223,
+191,223,142,193,248,207, 95,131,193, 96,128,195,225,192, 28, 28,147,162, 40,232,116, 58, 44, 93,186, 84,174, 84, 42,191,249,183,
+140, 18, 81,157,187, 98,199,214,141,118, 23, 46,158,149,102,228,224, 72, 3, 33, 28,158,148,150,236,136, 20, 21, 21,217, 69,117,
+238,106, 21,167, 65,167, 47,127,119,252, 60,191,154, 20, 60, 75,243,242,242,183,199,238,253, 33, 23, 0,190, 95,191, 33,176,180,
+188,106, 90,102, 70,230,216,237,219,127,239,110,208,233,203,173,225,252,143,120,137,149,129,130, 6,192,205,187, 15, 74, 91, 15,
+127,235,204,146,128, 54, 14,111, 72,202,213,197,213,213,170,143, 1,228, 90, 91,247,158, 61,122,227,226,185,223,176,111, 79,172,
+156, 34,233, 26, 55, 55, 55, 10, 0, 50, 50,220,168,140,140, 42,234, 63,126,197, 78, 74, 38,117,111,229,188,143,251,207,147,201,
+ 43,214,111,216,218,244, 84, 74,187,246,175,161, 93,251,215, 48,235,227,207, 29,195,194, 67,252, 0,224,208, 33,152,194, 3,210,
+255, 92,246,197,138, 55, 86,174, 92, 1,185, 66, 11,115,186,158,172,212,244,147,185,185,208,217,238, 89,207, 98,153,209,120, 19,
+243,230, 5,170, 42, 42,132, 61, 63,251,204,141,241,233,167,180,166,156,225,235,254,127,173,225,188,125,255,254,201,105, 83,166,
+ 20, 47, 95,182,108,240,182,237,219,121,145,145,145, 40, 41, 41, 65, 72, 72, 8,124,124,169, 74,126, 90, 0, 0, 32, 0, 73, 68,
+ 65, 84,124, 16, 31, 31,143,195,127,252,161,172, 82, 40,150, 0,248,201, 26,206,189,167, 78,101, 5,135,135,151,109,223,190,221,
+ 59, 58, 58,154, 80, 42,149,144,201,100,144,201,100,208,106,181,168, 9, 8, 77,101,231,228,100, 24, 12,134,109,214,214,221, 36,
+149,114, 87,118,237,250,132, 69,146,223,141, 30, 53,106,193,202,175,190,226,180,105,211,134,208,106,181,181, 86, 45,189, 94, 15,
+ 59, 59, 59,189, 78,167,115, 5,160,178,134,147,179,107,151, 81, 42,149, 66, 40, 20,214,134,107,170, 27,151, 80,161, 80,128,162,
+ 40, 91, 48,221,231, 64,163, 10,201,217,217,249, 14,131,193,104, 81,215,186,213, 80,238,188,186,251, 12, 6,195,147,178,178,178,
+168,122,138,183, 49,127, 40,127, 0,223,246,235,215,111,244,252,249,243,137, 75,151, 46,225,216,177, 99, 84,110,110,238,161, 26,
+ 43, 86,110, 19, 79, 58,141,113,218,115, 56,156, 57, 2,129, 96,128, 57,132, 3,159,207,127,160, 84, 42,207,215, 76, 23, 42,158,
+131,211,129,195,225,204, 22, 8, 4, 3,107,210,175,192,222,222, 62, 69,169, 84,198,107,181,218,141,104, 60, 81,117, 83,156, 60,
+ 71, 71,199,111,220,220,220,222,253,244,211, 79, 93,147,146,146,196, 23, 47, 94,100, 85, 85, 85,237,215,233,116, 77, 37,149,254,
+ 11,167,139,139,203, 29, 58,157,222,226, 21,181, 17,218,181,107, 23, 55,124,248,240,232,241,227,199,195, 96, 48,224,167,159,126,
+ 66,124,124,252,201,135, 15, 31,198, 88,120, 26,173,207,233,214,162, 69,139, 75,211,167, 79,111,249,246,219,111,243,157,157,157,
+193, 96, 48,160, 84, 42,241,240,225, 67,220,189,123,151, 58,126,252,120,117,114,114,242, 19,149, 74,213, 7, 64, 89, 51,174,231,
+139, 60, 53, 63,195,201, 96, 48,122,251,250,250,254,190,124,249,114,251,129, 3, 7,242, 92, 93, 93, 65,167,211, 97, 48, 24, 32,
+ 22,139,145,154,154,138,179,103,207, 42, 15, 29, 58,164, 44, 47, 47,127, 27, 64,226,255, 71, 57, 95, 38,103,104, 32,190,168,151,
+ 40,186,209,104,239, 22,142,181, 88,206,126,189,189, 70,140, 29, 61,116, 8, 0, 28, 60,124,250,140, 21, 73,165, 27, 45,167,165,
+178, 90,195, 25, 18, 64, 91,158,150,158,250, 76, 64,203,240,176,136,236,208,200, 81, 95, 91, 67, 84, 39, 50,252, 51,117,175, 51,
+ 29, 91,215,166,251,204, 52,107,168, 63, 98, 70,140,125, 51,250,243, 37,139,241,237, 55,171,112,252,224,209,147, 25,185,207,164,
+ 9,250,199,245,165, 87,204, 73,124,205, 96,188,198,247,242,122,125, 3, 73, 46,190,151,154,106, 87,247,129,205,108,121,174,251,
+ 80,233,237,237, 45, 17,139,197, 30,214,112,198,108,222,172, 87, 9, 4,156,197,223,125,215,187, 90,163,233,189,114,229, 74,198,
+237,219,183,177,245,199, 31,141,154, 39, 79, 98,165,192,236, 70,102, 67, 26,229,108, 57,123, 54,119,225,214,173,239,251, 7, 4,
+184,191,247,222,123, 76, 38,147, 9,165, 82,137,162,162, 34,156, 59,123, 86,151,158,145,145, 46,151,203,223, 0, 32,178,150, 51,
+102,243,102,189,147,191, 63,248, 66, 33,117, 33, 33,193,113,218,156, 57,211, 91,181,110,237, 56,120,200, 16,166,131,131, 3, 42,
+ 43, 43,145,151,151,135,163, 71,143, 74,170,171,171,189, 1,152,172,225,140,189,122,181,221,169,196,196, 49, 95,127,253, 53, 59,
+ 34, 34, 2,142,142,142, 80, 40, 20, 72, 77, 77, 69, 98, 98,162,118,219,182,109, 50,153, 76, 54,221,100, 50,157,120,133,237,254,
+111,176,106,153,177,195,162,208,250, 47,254, 1,163, 0,124, 81,179,253, 21, 44,231, 12,252, 55, 13, 62,126, 46, 46, 46, 59, 52,
+ 26, 13,165, 86,171,167, 1, 40,252, 27,150,147, 17, 21, 21,181, 85, 34,145,116,167, 40, 10,142,142,142,215,210,210,210,102,162,
+145,149, 55, 22, 56,233, 0,186,219,217,217,117,181,183,183,239,173,213,106, 67,107,166,223, 50,148, 74,101,162, 94,175,191, 89,
+ 99,125, 50,253, 63,215,157, 14, 96,160,183,183,247, 20,146, 36, 3, 8,130,112, 50,153, 76, 48, 24, 12, 85, 36, 73, 62,148,201,
+100,187, 0,196,255, 13,202,249, 82, 56,195,218,226, 77,138,134,208,198, 4,193, 51, 66,171,158,128, 32, 72,100,164, 63,194,209,
+102,148,147, 54,116,128,239, 22,224,233,202, 68, 88,118,174,253,143,208,178, 66,188, 52, 91,100,182,165, 79,162, 8,234, 25, 78,
+130, 34, 10, 67,218,189,185,239, 69,132,150,181, 8, 11, 66,111, 80,232, 78, 82,184,153,249, 16, 23,255,197, 99,221, 75,227,252,
+ 22,112,249,209,217,249, 26,141,193,240, 4, 64,171,177,190,144, 36, 65,152, 40,130, 48,214,157,222,170,247, 96,217, 36,167, 30,
+136,100,114, 56,190, 38,163,209,163, 4,176, 59,101, 50,117,210, 80, 84,117, 11,224,139, 20, 32,235,121,202,169, 7, 34,233, 28,
+142,223, 41,138, 26, 33, 21, 8,218, 73,212,106, 33, 0,202, 78, 32,200,144, 43,149,123, 52, 26,205, 22,252,117,230,194, 34, 39,
+139,195,105, 97, 50, 26, 61, 0,128,198, 96, 72, 14,104,181,190, 79, 28, 28,222,211,104,181, 45,237,236,236, 12, 58,157, 78,174,
+209,104,198, 27,141,198, 11,205,169,251, 67,163, 49,236, 42,141,214, 75, 47, 16,184,234, 9, 66,160, 51, 26,245, 58,189,190, 72,
+163,209, 60, 0,240, 3,128, 71,175,184,221,109,120,206, 63,139,141,211,198,105,227,180,113,218, 56,109,156, 54,206, 87,207,201,
+ 7,224, 87,243,176,248, 79,172,251,191, 9,214,249,104,217, 96,131, 13, 54,216, 96,131, 13,255, 24,168,208,128, 79,150, 13,255,
+191, 32,154, 80,165,205, 49, 9, 62,143,178, 61,111,227,180,113,218, 56,109,156, 54, 78, 27,167,141,243,127,142,211, 18,247, 63,
+113, 74,178,209, 92,135,175, 26, 54,243,175,141,211,198,105,227,180,113,218, 56,109,156, 54,206,255, 89,208,108,151,160, 81,120,
+212,188, 94,246,177, 54,252,187,251,194,127, 3, 62, 53,175,230, 28,239,101,107, 70, 27,108,176,193,134,255, 13,161,101,237, 77,
+235, 69,110,110, 47,122, 99, 92, 69, 16, 16, 17, 4, 68, 0, 86,189,196, 99, 45,193,219,205,205,237,147,176,176,176, 88, 15, 15,
+143, 89, 0,220,155,121,126, 32,159,207,223, 40, 16, 8, 46, 9, 4,130, 75,124, 62,127, 35,128,192,151,212,110, 4,128,105, 28,
+ 14, 39,193,203,203,171,152,205,102, 39, 0,152,142,231, 95,185, 26,140,167,113,210,190, 2,208,174, 57, 39,186,135,143,248, 67,
+ 24, 62,226,190, 48,124, 68,170,107,196,240, 64, 97,248,136, 84, 97,248,136,251,238,225, 35,254,120, 5,253,245,101,182,239,203,
+ 42, 79, 33, 65,160,208,202,242,252, 64, 0, 69, 4,129, 39,127,147,242,219, 96,131, 13, 54,216,208,168, 10,240,246, 30,237,229,
+229,117,222,203,203, 43,222,219,219,123,180, 21,167, 12,104,224, 38, 97, 34, 8,152, 44, 12,250, 77, 29,103,201, 92, 89,247,220,
+181, 86, 86,173, 46,167, 7, 65,192, 68,213,128, 32, 64,186,187,187,111,242,242,242, 90, 85,255,229,238,238,190,137, 32, 64,214,
+ 57,214, 84, 71,224, 53,215,172,234, 49, 97,194,132,131,149,149,149,113, 58,157, 46, 46, 39, 39, 39,174, 79,159, 62, 7,234, 89,
+ 34, 26,229,228,114,185,239,116,233,218, 61, 57,241,202,205,156,236,135,249,162,244,172,199,249,127,158,185,112, 59, 34,178,221,
+ 45, 46,151,251, 78, 51,218,136, 0, 48,141,193, 96, 36,216,217,217, 61, 97, 48, 24, 9, 0,102,208,233,244, 19,171, 87,175,206,
+ 79, 75, 75, 43,189,122,245,106, 85, 98, 98, 98,241,228,201,147, 31, 18, 4,241,103, 3,130,125,128, 21, 22,152,101, 5, 5, 5,
+103,196, 98,241, 89, 30,143,247,141, 21,199,215,114, 10,195, 71,220,151,200,244,148, 68,166,167,132,225, 35,168, 58,219,247,155,
+121,205, 45,181,209, 95,250, 2,135,195,241,179, 32,232, 95,165,137,254, 47,229, 1,224, 89,243, 93, 20,128,205, 53, 47,243,114,
+118, 79, 46,135,243,178,250,231,203,184,158, 54, 78, 27,167,141,211,198,249,111, 69,199,154,119, 47, 60,245,215,170,189,119, 55,
+119,213,225, 71, 57, 57, 57,118, 0, 16, 20, 20, 52, 19,192,225,230, 8, 9,130,192, 66,146,164,104, 0, 64,163, 17,159,245,237,
+219,175, 35,143,199,123, 38, 10,178, 90,173,102, 39, 36, 92,236, 79,146, 20, 81,115,220, 66,138,194, 70, 0,165,214,254,134, 78,
+167,165, 49,153,108,208,104,196,188,136,136,200, 86,101,101,101, 73, 52, 26, 45,182,184,184,184,178,217,102, 28,130,192,206,157,
+ 59,131,188,188,188,254, 18,173, 89, 44, 22,179, 71,140,120,163, 89,124,147, 0,142,150,195,233,202, 34, 8, 47,147,209,232, 4,
+ 0, 12, 6,163,242, 54,155, 29,245,237,215, 95,243, 9,130, 32,203,203,203,161, 86,171, 49,119,238, 92, 94,122,122,250,200,178,
+178,178, 45, 22,104,131,218,181,239, 56,247,236,217, 51,161,242,138, 74,205,206,245,219,147,213, 12,150,170,117, 88, 8,107,235,
+142, 61,206, 31,190, 63,254,227,204,204,180, 20, 52,156,142,164, 46,104, 0,142,206,153, 51, 39, 60, 38, 38,134,173, 80, 40,184,
+106,181,186, 85,108,108,236,210,168,168, 40,187, 14, 29, 58,176,127,255,253,119, 66, 38,147,129,162, 40,126, 72, 72, 8, 53,110,
+220, 56,205,129, 3, 7,102, 1,216,212,132,240, 93,248,244, 90,210, 54, 4, 7, 7, 47, 7,128,156,156, 28, 86,157,107,204, 12,
+ 13, 13, 21, 0, 64, 86, 86,214,151, 20, 69,206, 1, 0,138,194, 26, 0,139, 27, 48,173,229,132,247, 28, 11, 16, 8, 72,187,114,
+144, 27,222,107,172, 6, 20, 30, 18, 64, 78,205, 3,193, 74,160, 78, 92,168,103,145, 33, 18,137,158, 43, 55, 97,116,116, 12, 65,
+ 16,196,161,228,228,228,195, 18,137,164, 53, 73,154,166, 54, 85,206,198,218, 74, 40, 20,158, 53,153, 76,218,138,138,138,218, 64,
+153,194,118,111,118,119,181, 23,244,151, 86, 42,146,202,211,143, 39, 90,217, 55, 9, 87, 87,215, 73,101,101,101,171, 0, 76,201,
+200,200,232, 8, 0,161,161,161, 44, 0,119, 28, 28, 28,122,232,117, 58,194, 54,254,217, 96,131, 13, 54,252, 87,132,214, 93, 0,
+209,248, 79, 10,158, 29,207, 35,180,216, 0,144,148,148, 4, 0,156,231, 40, 8, 81, 87,192,204,158, 61, 27, 94, 94, 94,245,197,
+ 11, 46, 93, 74,120,145,202, 62,243, 27, 95,125,245,149, 93, 85, 85,213,128,159,127,254,249,117,138,162,214,138, 68,162, 27, 22,
+206, 47,165, 40,172,161,209,136,207, 8,130, 0,135,195,205,158, 62,125,250,221,154,239, 90,253,249,231,159,252,225,195,135,171,
+ 0,228, 3, 0,135,195,245,161,211,105, 65, 20, 69,153,111,184,141, 10,194, 49,128,191,145,205,238, 55,109,243,102, 99,167,225,
+195, 25, 2,161,144, 0,128,252,204, 76,215, 53,223,127,223,163, 50, 55,151,173,118,117, 45, 47, 87, 42,213,217,217,217,224,112,
+ 56, 4,157, 78,239,100,169,194, 2,129,224,147,175,191,253, 78, 32,175,168, 82,107,228, 10, 29,221,104,208,218,243,248,166,210,
+ 18, 73,185, 29, 79,160,250,236,139, 21,236,143,166, 78,252, 68,169, 84,206,180, 64, 53,107,222,188,121,161, 93,186,116,241,249,
+227,143, 63, 8,153, 76, 6, 6,131, 97,215,161, 67, 7, 68, 69, 69,153, 46, 94,188, 72,180,110,221, 26, 17, 17, 17,184,114,229,
+ 10,174, 93,187, 70,116,236,216,145,127,228,200,145, 9, 6,131, 97,147, 37,113, 77,167,211,230,134,132,132,116, 16, 8, 4,186,
+160,160, 32, 76,157, 58, 21, 20, 69, 97,192,128, 1, 17,118,118,118,135,149, 74, 37, 59, 43, 43,243,117, 75, 34, 91,146,118,124,
+156,217,178, 5, 32, 18, 20, 30, 74,211,142,215,157,126, 12,205,202,202,122,173,178,178, 18, 79,219,133,170, 77, 96,254,250,235,
+175, 55,167, 47,149, 82, 20,214, 12, 31, 30,243, 25, 64, 16, 3, 6, 12,168,154, 53,107, 22, 45, 51, 51,243,221, 55,223, 28, 25,
+145,147,243, 16,205,124, 24, 8, 26, 52,104,208,149, 83,167, 78,185, 6, 5, 5, 73, 43, 42, 42,106,191,240,116,117, 26,156,120,
+100,195, 39,223,108,140, 13,217, 75, 17, 85,210,140, 99, 15, 44,244, 77, 98,210,164,247, 75,237,236,236, 70, 29, 58,116, 40, 75,
+ 44, 22, 51, 88,172, 90,237, 74,119,119,119, 23, 6, 5, 5,205,112,113,113,145,208,105, 52,119, 10, 20,101,169,127,218, 96,131,
+ 13, 54,216,240,220, 56, 89, 35,174, 78,214,255,130, 1, 0,113,113,113,181,145,105, 99, 98, 98, 26,125, 2,166, 40,170,244,222,
+189,123,190, 42,149, 10, 20, 69, 89, 51, 96,215, 93,162, 89, 74, 16,180,173, 52, 26, 49,147, 32, 8, 68, 68, 68, 62,222,176, 97,
+ 67, 67, 57,189,116, 17, 17,145,143,233,116, 90, 27,138,162, 64, 16,180,159, 40,138, 44,109,132,179,193, 27, 17,155,205, 89, 8,
+ 0,158,158, 94,185,167, 79,159,214,141, 25, 51, 6,223,127,255, 61,107,209,162, 69, 11, 24, 12,198,172,194,194,194,146, 38,202,
+ 9, 0,139,133, 66,119,254,206,157, 59,131,166, 79,159,126, 87, 44, 22, 47, 6, 0, 47, 47,175, 85, 0,194, 0,228,215,217,135,
+109,219, 14, 20, 79,157, 58, 53, 91, 34,145, 44,110,140,115, 20,208,214, 55, 36,164,223,202,164, 36,138,166,213, 18,101,151, 47,
+203,165,165,165,134, 71, 82, 41,127,247,157, 59, 49, 75, 87,173, 98,250,250,249,225,210,137, 19,110,101, 42,149, 84,166,213,106,
+ 74, 75, 75, 41,163,209,120,205,138,186,135,187, 11,221,249,219,127,248,233,182, 61,147, 78,186,183,240, 33,152, 46, 46, 12, 26,
+223,129, 77,103,208,180,109, 90, 5,178, 1,132, 91,106, 35, 22,139, 53, 97,208,160, 65,252, 3, 7, 14, 16, 17, 17, 17,112,114,
+114,194,229,203,151,145,146,146,130,202,202, 74,154,193, 96, 64,231,206,157,241,221,119,223,193,207,207, 15, 85, 85, 85, 40, 44,
+ 44,116, 99,179,217, 66,131,193,208,216,245,124,166, 63, 45, 92,184, 16, 94, 94, 94, 48, 26,141,168,168,168,128,209,104,132,157,
+157, 29, 0,224,201,147, 39, 56,113,226,184, 53,125,201, 34, 40,138, 66,183,110,221, 20, 4, 65,100,212,183,104, 53,135,211,199,
+199,231,119,169,180,108,104,191,126,253, 80, 89, 89,105, 88,177, 98, 5,218,181,107,135,160,160, 32,139,229,244,246,246,158,102,
+ 52, 26,151, 1,128, 94,175,223,205,229,114, 63,216,183,111,159,107,221, 20, 33,102, 75, 86,169,164,188,242,218,237,180,172,121,
+211,198,244, 73,186,145, 90,164,103,142, 40,148,221, 63, 46,107,160,156,139, 89, 44,246,207, 45, 91,182,252, 97,246,236,217, 94,
+ 46, 46, 46,208,106,181, 75, 75, 74, 74, 48, 99,198, 12, 0,192,176, 97,195,218, 49,153,204,211,147, 39, 79, 70,235,214,173,139,
+ 43, 42, 42, 10,147,147,147,167,170, 84,170,212,231,189,158, 86,194,198,105,227,180,113,218, 56,159, 27,214,106,145,191, 41,196,
+120, 54,156,195,142,103,132, 86, 76, 76, 12, 17, 23, 23, 71, 89, 81,177,242, 22, 45, 90,248,242,120, 60, 0, 40,111,110, 41, 72,
+146,156,229,234,234, 42, 89,188,120,113,207,160,160, 32,221,172, 89,179, 82,243,243,243,151,212, 61,166, 85,171, 86,223,252,248,
+227,143,200,206,206,206, 95,181,106,213,149,242,242,242,230,230, 49, 91, 68, 81,216, 80, 99, 29, 43, 59,113,226, 68,187,164,164,
+164,153,235,215,175, 23,126,244,209, 71,172, 79, 62,249,100, 60,128,239, 45,145,208,233,116, 85, 67,211,133, 13,193,203,203, 75,
+ 71,167,211, 27, 13, 18, 23, 3,240,184,108,118,223,149, 73, 73,148, 46, 63, 95,245,203,186,117,246,219,111,221, 90,110,160, 40,
+ 15,119,119,119,244,234,209,163,154, 75,167,151, 73, 74, 74, 72,247,182,109,233,121,167, 79,187,169,217,108,209,129, 3, 7,100,
+229,229,229,199, 44,154,240, 8, 66, 78, 82,148,206,174,133,159, 97,204,200,129, 17,183,111,166,100,218,187,187,209, 58,118,136,
+104,151,153,157,159, 12,146,212, 19, 4, 33,183,196,227,232,232, 24, 84, 94, 94, 14,185, 92, 14,161, 80,136, 13, 27, 54,192,211,
+211, 19, 42,149, 10,105,105,105, 84,139, 22, 45,136,164,164, 36,180,104,209, 2, 82,169, 20, 58,157, 14, 10,133, 66,162,213,106,
+ 27,203,205, 88, 74,163,209,127,165,209,136,247, 9,130, 64,155, 54,254, 5, 91,182,108,209,145, 36,137,208,208, 80,188,249,230,
+155, 56,114,228, 8,210,210,210,204,150, 39, 93,203,150,173, 10,104, 52,162,101,141, 86,122,110, 11,140, 57,181,143, 72, 36, 26,
+245,156,127, 26,154,183,183,247,248,128,128,128,153,239,188,243,142,129,205,102, 67,169, 84,154,175,133, 97,232,208, 97, 85,195,
+135,199, 56,158, 60,121,178,209,114,234,245,250,101,197,197,197, 94,106,181, 26, 67,134, 12,249,100,237,218,181, 2, 54,155, 13,
+ 0, 48,153, 76,207, 88,178,190, 94,191,247,236,156,101, 91, 18,206,254,254,157,247,215,139, 62,232, 51,126,214, 55, 9, 0,206,
+ 52, 84, 48,157, 78,151, 43,147,201,166,204,155, 55, 47,118,219,182,109,206, 75,150, 44, 1, 73,146,160, 40, 10, 70,163,177, 54,
+145, 56, 73,146, 56,122,244, 40, 30, 61,122,244, 77, 61,145,101,131, 13, 54,216,240,183, 67, 51,180,200,223, 17, 94,120, 58,109,
+136,250, 98,235,191, 30, 25,158, 78,167,111, 63,119,238, 92,135,215, 95,127,157,209,191,127,255,136, 51,103,206, 68, 20, 23, 23,
+167,214, 88, 15, 34,250,247,239, 31,225,238,238,142,141, 27, 55,170,232,116,250,246,231,252,153,218,155, 94, 73, 73,201, 93, 0,
+107,143, 28, 57,178,102,218,180,105,240,244,244, 12, 19,139,197,255,213, 58, 59,112, 56, 29, 39,111,216, 96,100, 26, 12,180,205,
+107,215, 58,172, 75, 72, 88,243,199,193,131,140,110,221,186, 17, 20, 69,225,193,253,251,188,239, 54,109,226,191, 61,114,100,126,
+ 86,110,174,241,248,217,179,134,210,226,226,138, 98,169,116, 25,128, 10, 75,252, 6,131,225,122, 78, 78,142,119,175,222,221,124,
+ 18,111,165,166,140, 25, 57,172, 31,147, 65, 35, 30,230, 63,185,227,229,233,230,120, 41,225,188,218, 96, 48, 92,183,196,163, 84,
+ 42,243,140, 70,163, 11, 69, 81,194, 75,151, 46, 65, 40, 20,162,178,178, 18, 6,131, 1, 58,157, 78,167, 82,169,184,229,229,229,
+208,104, 52,208,106,181,112,112,112,192,131, 7, 15, 74,141, 70,227,197,198, 56, 77, 38,211,100, 14,135,243, 21,147,201,100,179,
+ 88, 44,209,157, 59,119, 32,151,203, 91, 57, 57, 57,125,111, 52, 26, 33, 18,137,144,148,148,244,169,131,131, 67, 62, 0,112,185,
+ 92,176,217, 28, 87,173, 86,107, 4, 80,252,188,215,156,162,168,231,110, 47, 79, 79, 79, 63, 30,143,183,242,179,207, 22,134,182,
+111,223, 1, 82,169, 20, 36, 73, 66, 32, 16, 64,165, 82,193,193,193, 1,221,187,119,207, 91,185,114,165,152,162,240, 97, 19, 98,
+144, 94,211, 62,152, 54,109,154,192,193,193, 1, 69, 69, 69, 8, 9, 9,169, 21, 90, 98,105,249,131,171,183, 83, 51,231, 77, 31,
+219,123,255,137,132,140,179,151,238,100,140, 28,210,163, 61, 65, 80,173,154, 42,163, 68, 34,145, 50, 24,140, 89,211,166, 77,251,
+ 42, 40, 40,168, 13, 69, 81, 8, 12, 12,196,160, 65,131,112,250,244,105,100,103,103, 67,169, 84,154,110,220,184,241,155, 88, 44,
+254,211, 54,132,219, 96,131, 13, 54,188, 82,252,197, 55,235, 25,139,214,127, 19, 18,137, 68,154,153,153,121, 38, 57, 57, 57,102,
+220,184,113,184,116,233,210, 36, 0,243, 0,128,195,225, 76, 26, 55,110, 28,146,147,147,145,153,153,121, 70, 34,145, 72, 95,198,
+111,178,217,108,141, 78,247,212, 56,197,229,114,185,205, 60,189, 85,205,148, 33, 0,180,106, 98, 95,227,166, 17, 6,195, 43,114,
+200, 16, 70,101, 74,138,124,231,205,155, 95,197,198,198, 50,122,246,236, 73, 24,244,122,152, 72, 18,254,254,254, 68,255, 1, 3,
+ 4,191,198,198,186,152,148,202,164,175, 63,251,236,242,142,201,147,171,115,106,252,192, 44, 65,171,213,110,154, 57, 99,202,128,
+132, 75,151,125,194, 66,218,186,156, 57,151,112,215,213,213,145, 31, 20, 16, 32, 40,175,172, 48, 45, 89,244, 41, 67,171,213,110,
+182,196,163, 86,171,143,158, 63,127,126,164,175,175,175, 48, 53, 53, 21, 58,157, 14, 38,147, 9,253,251,247, 7, 69, 81, 28, 0,
+ 36,131,193, 64,102,102, 38,244,122,189, 36, 39, 39, 71,244,240,225, 67, 14,128,213, 22,202, 87,160,213,106,145,145,241,116,214,
+174, 69,139, 22, 3,163,163,163, 97, 52, 26, 49,100,200, 16, 28, 63,126,124, 96, 70, 70,198,186,186,154,239, 69,219,188,198, 66,
+ 22,234,237,237,125,164,102,151, 85, 78,240, 62, 62, 62, 17,254,254,254,219, 86,175, 94,205,106,209,162, 5, 40,138,130,179,179,
+ 19, 84, 42, 21,202,202,202, 17, 22, 22, 6, 95, 95, 95,172, 94,189, 26, 0,126,107,202,226, 70,146, 36,196, 98, 49,242,242,242,
+144,155,155, 11, 95, 95, 95, 16, 4, 1,133, 66, 1,163,241,105, 78,110,190, 66,126,242,199, 95,255,236,123,112,219,178,240,174,
+145,129,126, 55,239,166, 75, 38,140, 26,200, 15,108,237, 23, 36, 77, 93, 65, 3, 86, 52,154,116, 89, 36, 18, 61, 20,137, 68,227,
+ 36, 18, 9,171,170,170, 42,106,224,192,129, 27, 7, 12, 24,128,187,119,239,226,242,229,203,111,115, 56, 28,137, 94,175, 55,122,
+122,122,126, 72, 16,132,131, 94,175,223, 95, 94, 94, 46,182,141,135, 54,216, 96,131, 13, 47, 29,102, 31, 45,212,121,111,158, 69,
+ 43, 52, 52, 84,144,159,159,255, 94,171, 86,173,216, 0,192,227,241,194,252,253,253, 23,228,230,230, 42,154, 91, 26,149, 74,245,
+ 71,108,108,236,160, 31,126,248,129, 53,108,216,176,182, 71,142, 28,233, 2, 0,195,134, 13,107,107,111,111,143,216,216, 88,189,
+ 74,165,122,105, 49,145, 12, 6,195,235,157, 59,119, 70, 69, 69, 5,242,243,243,155, 53,133,242,231,159,127,242,241,212, 47,171,
+201,125, 77,193,168,211, 57, 59,249,248,208,138, 19, 18,244, 21,114,185,215,235,189,123, 19, 6,189, 30, 52, 26, 13,229,229,229,
+ 40, 44, 44,132,163,147, 19,145,153,147, 99,183,107,225,194, 63, 91,181,111,207, 54,233,116,174,205, 40,166,178, 76, 82,250,254,
+199,179, 62, 58,186,127,255,111,194, 42,185,252, 17,143,199,215,114, 56, 44,207,217, 31,127,108,170,168,168,152, 8,160,218, 10,
+158,213,251,247,239, 31, 50,100,200,144,251,126,126,126,238, 82,169,212,179,170,170,202, 84, 81, 81, 65,199, 83, 95, 43, 2, 0,
+ 18, 18, 18, 32,151,203,141, 38,147, 41, 9, 79, 99, 97,233,172, 45,104,203,150, 45, 29,163,162,162,250, 8,133, 66,200,100, 50,
+184,186,186,162, 67,135, 14,125,232,116,250,207, 5, 5, 5,178,151,217,235,227,227,227,237, 41,138,122,141,162, 40, 12, 25, 50,
+196,170,115, 76, 38,211, 7,209,209,209, 44,130, 32,160, 86,171,192,229,242, 32, 16,216,193,222,222, 1, 65, 65,193, 16,137, 68,
+ 24, 60,120,176,238,209,163, 71, 91,197, 98,241, 31, 22,184, 32, 18,137, 32,149, 74, 81, 88, 88,136,178,178, 50, 0, 64, 89, 89,
+ 89,173,115,254,203,128, 76, 38, 27,209,189,123,247,249, 51,102,204,128,209,104,196,136, 17, 35, 80, 84, 84,180, 46, 47, 47,239,
+128,183,183,247,248, 15, 62,248, 64,232,234,234,138,249,243,231,243, 0,124,105, 27, 15,109,176,193, 6, 27, 94, 58,234,251,104,
+253,213,162,213,212,156,168,167,167,103, 47,130, 32,150,170,213,106,182,121, 74,134, 32, 8,182, 80, 40, 60,174, 86,171, 87,137,
+197,226,102, 57,197, 85, 85, 85,201, 31, 63,126,124,252,250,245,235, 99, 71,141, 26,133,248,248,248,137, 0, 48,106,212, 40, 92,
+191,126, 29,143, 31, 63, 62, 94, 85, 85, 37,127, 25, 53,247,241,241, 25,218,187,119,239, 81,157, 59,119, 70, 92, 92, 28, 76, 38,
+211,181,230,156, 95,119,133, 33, 26, 88,117,104,222,103, 21, 25,157, 14,130, 32,106,173, 25,101, 82, 41,178,179,178, 80, 81, 89,
+ 9,173, 70, 3,165, 74,101, 10,106,221, 90, 45,211,233,152, 4,208,220,185,175,130,228,219, 55, 10, 85, 74,165,187,171,179,139,
+154,207,231,160, 74, 46, 99,221,185,125,163, 26,192, 35, 43, 57,116, 20, 69,245, 62,125,250,244, 50, 58,157, 62,206,206,206, 14,
+ 51,103,206,164,247,233,211, 7, 44, 22, 11, 90,173, 22, 85, 85, 85,136,141,141,149,154, 76,166, 54, 53,231,216,241,249,252, 61,
+116, 58,253,137, 66,161, 88,106,241, 7,116,186, 97, 49, 49, 49, 12,157, 78,135,175,191,254, 26,203,151, 47,199,144, 33, 67, 24,
+183,111,223, 30, 6, 96,255,203,234,241, 36, 73, 98,224,192,129,117,157,225, 51,172, 57,143,201,100, 70, 4, 4, 4, 64, 42,149,
+ 66, 42,149, 66, 40, 20,194,219,219, 27,158,158,158, 88,183,110, 29,181,113,227,198, 51,122,189,126,107, 89, 89, 89,169, 53,101,
+200,205,205,173,181, 12,106, 52, 26, 40,149, 74, 20, 21, 21,213, 78, 29,170, 5, 14, 67,102,189, 63,188,189, 82,173, 86,221,124,
+144, 83,184,244,147,241,221,148,106,181, 42, 39,175, 48, 27,216, 68, 90,209,191, 63,156, 56,113,226,135, 99,199,142, 69,117,117,
+ 53,174, 95,191,142, 30, 61,122, 96,205,154, 53, 94, 73, 73, 73,243, 58,119,238, 12, 38,147,137, 75,151, 46,193,104, 52, 22,217,
+198, 66, 27,108,176,225,239,140,127,168,127, 86,147,104,210,162,229,235,235,235,100, 50,153, 62,141,142,142, 30, 56,114,228, 72,
+ 12, 30, 60,248,153,239,247,239,223,111,127,248,240,225, 85,155, 54,109, 26,162,215,235, 87, 55,103,170,143, 36,201,163,251,247,
+239, 31,214,173, 91, 55,126,223,190,125,253, 1,128,195,225,232,246,239,223,175, 34, 73,242,232,115,212,197, 28,136,177, 20, 0,
+188,189,189,219, 49, 24,140, 81, 67,135, 14,109,247,254,251,239, 35, 45, 45, 13,177,177,177, 15,131,130,130,174,148,150, 54,203,
+191, 58,223,194,170,195, 85,150,172, 91,116, 54,187,188,170,164,196,201,206,207,143,233,108,111, 47,142,139,139,243, 29, 48, 96,
+ 0, 81, 84, 84,132,202,202, 74,104, 52, 26,220,190,125,155,100, 0, 5, 12,103,103,162,224,250,117,130,206,102,151,227,217,149,
+124, 22,225,235,229, 28,248,197,162,233,173, 52, 90, 77,184, 76, 38, 51, 50,152, 76,102, 11, 79,167,162,172, 71,205,154,137,211,
+242,249,252, 40, 0, 12,146, 36, 85, 46, 46, 46,252,115,231,206,129,205,102,131, 32, 8, 68, 70, 70,130,203,229,178, 40,138, 42,
+ 4, 0,123,123,123,246,246,237,219, 29,199,143, 31,127,217, 18,113,199,142, 29,153, 28, 14,231,141,160,160, 32, 92,191,126, 29,
+169,169,169, 5,215,175, 95,111,217,177, 99, 71,248,249,249,189,225,229,229,117,240,238,221,187,134,151,209,177,159,174, 88,109,
+190, 51,188,201,100, 34, 9,130, 0,141, 70, 3, 73,146,144, 74,165,104,211,166, 13,182,108,217,130, 13, 27, 54,124, 45, 22,139,
+ 79, 52,131,203, 36,151,203, 33, 16, 8,144,154,154,170,141,142,142,230,208,104, 52, 60,124,248,176, 86,104,185,187,185,132,245,
+232, 28, 17,242,245,250,189,103, 5, 28, 14,103,112,159,168,208,244,156,130, 39, 20, 69, 88,156, 54, 14, 13, 13,101,181,105,211,
+102,226,216,177, 99,145,155,155,139, 85,171, 86,149,137,197,226,132,179,103,207,142,158, 49, 99, 6,189, 71,143, 30, 40, 47, 47,
+199,175,191,254,106,188,115,231,206, 47, 37, 37, 37,123,109,195,184, 13, 54,216, 96,195,223, 68,104,249,250,250,142,101,177, 88,
+243,223,122,235, 45,122,112,112, 48, 74, 75, 75,225,224,224, 96, 32, 8,130, 9, 0, 78, 78, 78, 6, 30,143,135,233,211,167,163,
+125,251,246,189, 22, 46, 92,216,131,193, 96,108, 17,137, 68,123,172,249, 97,137, 68,162,162,209,104,135,102,206,156,185, 58, 37,
+229,110, 27, 0,184,117,235,214, 99,145, 72,180, 72, 34,145,168,154, 89, 15,115, 80, 76,130,195,225,222, 12, 12, 12,204,139,138,
+138,114, 24, 57,114, 36,132, 66, 33,146,147,147,241,221,119,223,229,232,116,186,101,137,137,137,198,255,246, 69, 54,106,181, 37,
+119,142, 29,179,239,243,238,187, 14,179,163,163,215,126, 52,115,230, 15, 95,124,241, 5, 35, 56, 56,152, 80,169, 84,184,121,243,
+ 38,117,248,240, 97,195,175, 95,125,181, 1, 2, 1,243,250,225,195,108,157, 78, 87,208, 76,203, 93,239,158,175,247, 10, 94,251,
+195, 38,104,212,213,184,121,237, 36, 42, 43,165,216,190,227, 72,176,143, 15,213,187,184,184, 56,209, 90, 46,130, 32,130,226,227,
+227,221, 41,138, 2,155,205,198,202,149, 43,225,237,237, 13, 7, 7, 7, 40, 20, 10,204,155, 55,207,113,206,156, 57,142, 0,144,
+150,150, 86, 27,158,193, 18, 68, 34, 81,247,233,211,167,219, 27,141, 70,156, 57,115, 70, 71, 16,196,210,243,231,207,255, 28, 25,
+ 25,201,238,213,171,151,253,222,189,123,123, 0,184,244,178,132,214,115,158,247,240,220,185,115,157,199,141, 27, 71, 49,153, 76,
+162,170,170, 10, 78, 78, 78,216,178,101,139, 82, 44, 22,159,108, 38,215,202, 69,139, 22, 45,171,217,222,189,116,233,210, 41,171,
+ 87,175, 22,150,148,148,212, 90, 53, 37,101, 21, 23,187, 71,127,108, 42,175,146,233,126, 89,191,112, 12,143,203, 97, 47, 93,253,
+203, 37, 3, 29, 55, 44,246, 43,163,145,205,231,243,217, 20, 69,225,208,161, 67, 40, 40, 40,248,160,188,188,188,196,100, 50, 29,
+249,244,211, 79, 23, 4, 7, 7,183,206,202,202, 42, 80, 40, 20,107, 36, 18, 73,158,109,184,179,193, 6, 27,108,120,101, 48, 59,
+193,155, 87, 31,158,196,211,233,196,198,133,150,201,100,154,126,246,236, 89, 58, 73,146,216,177, 99, 7,238,220,185, 67,241,249,
+252,165,124, 62,255, 71, 30,143,103, 82,171,213,211,166, 78,157, 58,126,249,242,229,180, 94,189,122,225,250,245,235,180, 54,109,
+218, 76, 4, 80, 87,104, 13, 64, 19,177, 54,100, 50,217,237,210,210,146, 54,117, 2, 84,182,225,112,184,183, 45, 84,166, 62,103,
+253,160,152, 93, 87,174, 92,169,244,242,242,210,165,166,166, 98,219,182,109,228,157, 59,119, 18,216,108,246,118,177, 88,172,181,
+146,243,101,160,150,147,109, 52, 38,239, 91,176, 32,180,211,136, 17,228,148,249,243,171, 89, 60,222, 39,107, 55,109, 90, 88,165,
+ 80,120,131, 32, 40, 87, 71,199,130, 29, 43, 87,174, 26,242,198, 27,213,105,137,137,220,148,248,120,166,208, 96,184,215,156,114,
+ 22, 23, 23, 39, 94,186,116, 25,187,119,254, 0,189, 94, 11,113,241, 83,157, 86, 86, 46,131, 5,145,245, 23, 78,163,209, 40, 27,
+ 61,122, 52, 11, 0,111,194,132, 9,108,137, 68,130,182,109,219, 2, 0,228,114, 57, 78,158, 60,137,144,144, 16, 0,192,131, 7,
+ 15,106,183, 45,149, 83, 32, 16,188,209,163, 71, 15, 20, 20, 20, 32, 45, 45,237,130, 88, 44, 46, 7,112,161,168,168,104, 88,231,
+206,157,113,244,232,209,225, 77, 8,173,102,181,145,149, 66,235, 47,156, 60, 30,111,209,145, 35, 71, 62,184,118,237,218,184, 5,
+ 11, 22, 48,251,247,239, 15, 0, 80, 40, 20, 42, 0,166,230,112,170,213,234,237, 0,106, 87,206,230,231,231,239,155, 63,127,126,
+210,220,185,115,133,230,242, 73,211, 79, 92,151, 2,215,195,251,124,240, 69,247,206,225,193,223,108,140, 61, 91, 88, 84, 26, 43,
+203, 56, 46,179,166,238, 20, 69,193, 96, 48,128, 36, 73,184,184,184, 40,203,203,203, 33,145, 72,242, 36, 18,201,204, 71,143, 30,
+ 53,171,238, 47,179,207,219, 56,109,156, 54, 78, 27,231,255, 40,172,143, 12, 79, 81,148,145, 36, 73, 92,186,116, 9, 71,142, 28,
+ 49,233,245,250, 15,197, 98,113,221,104,213,155,146,147,147,227, 71,143, 30,189, 39, 43, 43,139,158,158,158, 14,138,162, 76,205,
+ 41,141, 70,163, 49, 16,196, 95,247,189,104, 45,119,239,222,141,146,146, 18,125, 81, 81,209,121,163,209,120,244, 5, 87, 47,190,
+240,170,195,221,128,246, 29,157,238,252,242,158, 61, 7, 46,139,143,231, 76,249,252,115,237,164,247,223,255,212,164,211, 25,232,
+ 44, 22,201, 22, 8,104, 38, 14,135,153,150,152,200,221, 56, 99,134,139, 90,171, 61, 19,219, 12, 7,115,179, 69,171, 79,159, 94,
+152, 52,101, 46,212,117, 44, 90,215,111,103, 67,171, 71,179, 44, 90, 90,173, 54, 92, 44, 22,131,203,229, 22, 2,240,124,239,189,
+247, 64,146, 36,212,106, 53, 20, 10, 5, 68, 34,145,236,253,247,223, 55,213,136, 39,198,168, 81,163, 28,172,225,245,247,247,247,
+102, 50,153, 56,115,230, 12,152, 76,230, 73, 0, 96, 50,153, 39,227,227,227,135,189,253,246,219,240,241,241,241,207,205,205, 37,
+ 96,193, 63,205, 61,124,196, 31, 20, 16, 8, 2, 1, 79, 77,112, 8, 16,134,143,184, 79, 0, 57, 53, 81,227, 51, 58,118,236, 8,
+ 88,233,151, 85, 23, 53,139, 59, 54, 24, 12,134,131, 11, 23, 46,156,217,181,107,215, 65,203,151, 47, 39, 80, 19,170,225, 5,145,
+ 93, 92, 92,252,250,226,197,139,207, 82, 20,245,140,232,151,148, 85, 92,236, 22, 51,139,170,170,146,165, 72, 51, 78, 60,104,150,
+197,212,104,124,161,112, 22, 54,216, 96,131, 13, 54,188, 52,171,214, 95,208,168,208, 34, 8, 98, 71,239,222,189, 63, 4, 64, 39,
+ 8, 98,155, 72, 36,250,203,224, 47, 22,139,179,189,189,189,191,111,221,186,245, 52, 0, 20, 65, 16, 59,154, 89,168, 82,138,194,
+119, 52, 26,177,240,169,184,123,174, 0,149,230,180, 36, 11, 1, 16, 52, 26,125,207,221,187,119, 63, 47, 44, 44,148, 90,105,129,
+104, 18, 47, 99,213, 33, 0,252, 6,228,189, 85, 80,112,118,126, 68,196,128, 33, 51,102,160,221,144, 33, 14,222, 45, 91,154,212,
+122, 61,249,224,202, 21,226,218,161, 67,172,148,248,120,166, 90,171, 61,115, 20, 40,108,110, 57,139,139,139, 19, 47, 38, 36,158,
+ 27, 51,106,216, 32,255,214,222, 79, 69, 67,158, 8,101, 21,178,115,205, 17, 89,245, 68,239,136, 45, 91,182,156, 96,177, 88,140,
+186,169,108,244,122,125,133, 86,171, 13, 7,128,202,202, 74,239, 29, 59,118,252, 78,163,209, 10, 44,241,165,167,167, 31, 95,182,
+108,217,168,252,252,252,115, 69, 69, 69,249, 0, 80, 88, 88,152,111, 48, 24,246,136,197,226, 81, 5, 5, 5,135, 97,197, 34, 0,
+ 10, 8, 76,187,114, 48, 18, 0,194,123,142, 69,218,149,131, 92, 0,145,225, 61,199, 2, 0,158, 55,151, 97, 93,212,132, 65, 88,
+122,253,250,245,253,131, 6, 13,154,138, 23,136,233, 85, 95,108,233,245,250,150,245,119,154, 45, 91,205, 33,210,233,116, 6,181,
+ 90,109, 52,153, 76, 12,189, 94, 79,233,116, 58,131,109,156,179,193, 6, 27,254,173,160, 40,170, 51, 0,161,121,216,172,121, 23,
+214,219,214,161, 38, 93,160,121,168,172,249, 44, 37, 8,226,118, 29,142,218,253, 86,156, 11, 0,101, 0,238, 19, 4,209,152, 17,
+100, 71, 99,159, 27, 21, 90, 34,145,232, 48,172, 72, 26,109,237,113, 77, 96,113, 77,158, 56,224,249,243,176,213,114,152, 76,166,
+210,194,194,194, 23,110, 80, 26,141,150, 55,124,248,240,102, 29,111,233,152, 3, 64,193,199, 90,237,222,184,205,155, 59,156,217,
+182,205,199,100, 52,186, 18, 0, 69,103,179,203,117, 58, 93,190,208, 96,184,215, 92, 75,214, 51,214,152,199,197,131,115, 31, 23,
+ 35, 32, 32,128,122,248,240,225, 83, 91,207,139,225,158, 82,169,244,181,212, 5, 84, 42, 85, 47, 43,197,224,111,197,197,197,191,
+ 53, 32,216,127, 23,139,197,191, 91, 91,168,218,164,210, 0,141, 36,200, 49,225, 61,199, 30, 2, 64,154,147, 74,191, 76,148,148,
+148,100,161, 38,206,219,223, 13, 5, 5, 5, 90,130, 32,246,125,247,221,119, 19, 82, 82, 82, 14,136, 68, 34,173,109, 40,182,193,
+ 6, 27,254,205, 34,139, 32,136,184,154,207, 49, 53, 70,161,184,250,219,230, 99,204,199,213, 61,198,204, 81,127,127, 83,231, 2,
+192,162, 69,139, 62, 95,181,106, 21, 31,128,181,201,152,159, 59,169,244,171, 66,233,223,132,163,174, 40,216,249, 42, 42,186, 25,
+208,193,104,188, 1, 99, 29,159,124,195,203, 53, 68, 60,124,248,144,248, 55,255,225,204, 73,165,235, 32,226,127,117,240,201,207,
+207,223,226,231,231,183, 93, 36, 18, 25, 97,131, 13, 54,216,240,239,133,176, 33, 97,212,136, 40,139,105,234,251,103, 30,220, 27,
+ 56,174,161,207, 4, 65,196,173, 90,181, 42,166, 25,229,173,181,104,209,108,109,103,131, 13,255,108,252,127,172,164,181,193, 6,
+ 27,108,248, 55,160,190, 21,203, 44,190,234,127, 94,180,104,209,231,104,122,198,201, 11, 79,173, 88, 94, 53,159,107,253,181, 8,
+ 60, 93, 57,208, 16,154,179,154, 96,192,115,212,239,188,141,211,198,105,227,180,113,218, 56,109,156, 54,206,255, 57, 78, 75,220,
+231, 27, 16, 68,209,141, 77,245, 53, 53,141, 88,127,219,210,185,150,142, 37, 8,162,177, 48, 63,230,169,194,250,239,175, 28, 3,
+108,156, 54, 78, 27,167,141,211,198,105,227,180,113,218, 56, 95, 4, 20, 69,117,166, 40, 42, 26, 79, 23, 76, 81, 20, 69, 69, 83,
+ 20, 53,100,209,162, 69,139,205,251, 22, 45, 90,180,152,162,168,254,230,227,106,142,169, 61,199,188,175,254,123,253,125, 77, 29,
+219, 68, 17, 63,172,183, 93,251,249,239,226,163,101,131, 13, 54,216, 96,131, 13, 54,216,208, 32,204, 43, 6,235, 88,155,164, 0,
+ 30,172, 90,181,170,178,142,239,148, 20,192, 61, 0,237,107,142,147,214,136,180,186,190, 85,186,154,207,186, 6,142,209, 89,115,
+108, 35,216,209,200,182, 77,104, 53,134,246,158,180,175,252, 90,184, 71,213, 52, 0,168,154, 36,192,100, 77,188, 34,202, 28,184,
+136, 36, 81, 60,222,237, 0, 0, 32, 0, 73, 68, 65, 84, 65, 81, 20, 68,146,170,228, 7, 18,124,241,188,191, 23,228, 13, 23,119,
+ 46,119, 3, 73, 81, 61,107,118, 37,202,202,181,115,211,228,168,178,150, 35,196, 3,161, 92, 26, 62, 37, 41,180, 3, 0, 26,129,
+251, 26, 18,223,103,150, 54, 63,158, 84, 67,253, 60, 92,136, 15,217, 60,254, 91,142, 78,206, 1,149,149,101, 57,122,141,246, 96,
+186, 20,219,209,252,188,140,240,119,198,107, 36,133,207, 1,208,152, 52,172,203,169,176,122, 37,135, 13, 54,216, 96,195,139, 90,
+ 71, 94, 40, 46, 30, 65, 16,166, 6, 56,137, 23,228,180, 5,195,179, 66,108, 53,176,251, 86, 3,251,110,255,157,202,221, 44,161,
+ 21, 38,196, 12, 16, 88, 1,128, 2,133, 47,211,165,248,169, 89,231,123, 97, 0,151, 78,223, 5,128,174,209,155,230, 83, 36,146,
+ 26,188,152, 52,188,206,101,209,215, 1, 32, 53, 38,211,228,116,177,245,254, 98,225, 62, 24,194, 32,105,251, 72,138, 98,154, 72,
+106, 15, 40,196,217,177,112,245, 70, 49, 52,205, 41,171, 95, 11,247,168, 99,183,196,131, 18,126,154,141,174,237,218,130, 50, 25,
+ 1,210, 0,126,175, 79,113, 97,253,123,232, 26,234, 7,138, 52, 0,164, 17,118, 67,215, 98,104,132, 35,245, 64,242,124,121,176,
+131,188,225,210,210,205, 61,117,231,206, 93,158,222,254, 97, 4,105,212, 35,235,214,185,241,115, 22, 46,235, 23, 14, 89,132, 53,
+ 98,171,157, 23,166,248,181, 10,254,116,238,138, 31,232, 94,222,190, 2,210,160, 53,150,228,101,116,220,180,102,217, 97, 22,173,
+ 96,221,125, 49,118, 89,219,151,195,132,152,198,224,176,199,242,184,130, 0,149, 74,241,208,164, 55, 28,164, 49, 25, 67,190, 95,
+187,161, 67,159,129,195,236, 76,138, 18,154,129, 68,216, 31, 7,126,111,185,121,203,214, 97,169, 98,211, 27, 0,200,230,212,153,
+164,176, 48,123,239,135,195,152, 12, 58, 17,250,193, 78, 58, 96,124, 46,161, 21,234,142,119, 8, 10, 22,195, 75, 80, 4, 46,103,
+ 72,240,219,243,252, 70,136, 59,126, 38, 40, 4,129,192, 33,130,194,239,233, 82, 72,108, 67,158, 13, 54,252,187, 64,163,209, 18,
+ 72,146,236,251,146,133,193,107, 20, 69,221,176, 93,221,255,109, 52,207,162, 69,224,235,180, 71, 69,206, 48,233, 17, 30,228,255,
+ 21,208, 60,161,197,165,211,247,220,206, 41,245,132, 81,143,157,223,204, 60,160, 51, 0, 70,131, 30, 38,163, 1, 38,163, 1, 70,
+163, 30, 38,131, 1,148, 65,139,101,191, 36, 0, 58, 5,162, 34, 2,247, 0, 38, 47,107,127,131, 73,209,246, 37, 95, 57,231, 66,
+232,100,248,237,167, 85, 31, 23, 73,171, 63, 62,127, 95, 84, 22,230,174, 94,156, 46,193,175,205, 17, 4, 9,219,102, 35,246,232,
+201, 39, 27,127, 86,102,146, 20, 5, 23, 7, 94,240,248,152, 52,223,189,199, 19,138, 54,236,209,100, 2,128,163,128, 29, 60,241,
+126,142,223,139, 52,130, 59,151,187, 97,251,214,205,158, 94,174, 60,194,120,109, 53,140, 38, 19,124, 91, 70,211, 23,207, 26,239,
+245,245,250, 93,235, 33,215, 78,106,234,252, 96,119,132,181,106, 29, 58,127,207,201,107,126, 74,185, 68,119,110,255,231,143,160,
+133,193,211, 39,148,249,213,170, 31,232, 75, 62,155, 61, 79,103,122,114, 51, 75,130,116, 75, 99, 77,168, 59,142,175, 90,189,182,
+ 93,191,161, 49,118,100,181,148,174, 81, 86, 7,237,252,101,215,138,144,118, 93,248,189, 34, 90,176, 36, 7,167, 19,106, 69, 5,
+244, 52, 46,167, 95,248, 0, 7,245,132,183, 13, 59,119,199,206, 74,151, 96, 83,115,234,108,162,254,211,247, 72,242,249,163,174,
+ 19, 20,122,165,220, 72,152,102, 18,221, 6,101, 50, 0, 38,125,237, 59, 76, 6, 80,228,211,247,174,211,127, 1,240,124, 66,139,
+ 70, 97,208,249, 43,183,189, 74, 75,196,157,215,175,253,118, 49,117,251,246,105,152,176, 47,163, 2,137,205, 21,152, 0,130,218,
+184,210,207, 26, 76,208, 22, 85,153,130,204, 59,251, 5,113,186,123,217, 17,253, 11,101, 68,210,229, 71,234, 68,219,208,100,131,
+ 13,255, 47, 22, 19, 35, 69, 81,140,151,204, 57,140,162,168, 83, 47, 72,243, 41,128, 41, 53,219,187, 0,124,255, 18,138,214, 2,
+128,103,205,118, 9,128, 39,182, 30,240, 66,168,239,252,254,220,113,180,184,160, 72,224,208, 72, 0,224, 53,183, 20, 20,192, 5,
+ 65, 7, 12, 74,140, 24, 58, 16,110,238,158,128, 65, 5,232, 85,248, 63,246,206, 59, 60,138,170,109,227,247,204,108, 75, 54,189,
+108,122, 33,180,132, 64, 32, 32, 16, 58, 65, 65, 4,194, 71, 17,164, 9, 8, 47, 69, 68, 17, 65, 84, 80, 64, 68,138,138,128,210,
+ 65,165, 73, 71, 74, 64, 74,148, 94,162,212,132, 36, 4,146,144,222,123,178,217, 54,229,124,127,164,152, 64,202,110, 64,125,225,
+157,223,117,205, 53, 91,239,157,153, 51, 59,115,207,115,158,231, 12, 88, 13,192,170, 1, 86,131,220,140, 36,192,160, 6,226,127,
+ 5, 71,136,194,228,213,213, 21, 1,177, 7,240, 74, 7, 47,168,108,204, 48,107, 72,107,199, 45,167, 98,183,109, 59,115,191,111,
+ 84, 54, 70, 25,181,172,132, 32,168,109, 11,172,221,166,142, 57,126, 43,167, 63, 0, 12, 12,116, 56, 21,212,218,219,115,205, 14,
+109,204,201,136,130,215, 0,224,181, 54,214,191,118,246,115,245, 18,208,248,168,175, 64, 72, 79,183, 38, 45, 40,254,246,102, 8,
+197,169, 40, 46,214, 32,245,209, 78,216,185,191, 68,243, 2,122, 55,244,125,115, 6, 31,191,183, 96,165,180,172, 56, 75, 47, 24,
+114,120, 21, 83,192, 72,228, 2,133,180, 11,186, 82,161,144,159, 61,117, 60, 55,231,179, 47, 63, 6, 48,174, 62,157,214, 78,152,
+185,106,213,154,182,221, 59,182,114,202, 60, 52,139, 42, 45,200, 2,199, 40, 21, 67,186,118,135,109,203,214, 66,214,249, 85,148,
+188, 89, 95,216, 58, 52, 67,218,213,159,145,120,253, 48,213,163,195,112,197, 79,123,100,111, 2,134, 90,141, 86, 11, 71,244,232,
+223,171,243,190,102, 94,110,174,132, 8, 16, 4, 2, 34,240, 40,213,178,248,100,127, 60,120,158,199,235,253,123,188, 98, 33,167,
+136, 32, 8, 32, 68, 64, 74,102, 94,217,239,225, 49,175,196, 23, 32,220,152, 72, 85, 96,151, 62, 61,238,222,188,222,138,141, 61,
+142,142,227,150,199, 80,192,229,106,251, 92,143, 91,167,127,106, 5,252,216,120, 47, 71,129, 79, 60,181, 2, 94,189,166, 50,155,
+247,156, 82, 21,229,164, 77, 56,180,115,195,136,141,155, 55,239,142,201,198,116, 83, 76,214,251,189,228,151, 87,255, 94,236,208,
+181,153, 69, 78, 74,181, 56,101, 83, 59,186,255,166,147, 81,239, 93, 91, 18,212,106,193, 9, 82,120, 49, 78, 27, 33, 30,183, 68,
+ 68,254, 89, 8, 33,207,220,108, 37, 37, 37,165, 63,141,217,114,119,119,239,149,150,150,246, 85,101,182, 10, 69, 81, 95, 53,105,
+210,100,225, 95, 23,170, 53,174,245,138,120,158, 31,151,150,150,118,177, 62,205, 65,131, 6,185,157, 56,113,194,167,154,166, 15,
+ 0,159,218, 62,107,107,107,203,119,235,214, 45,241,196,137, 19,233,226, 30,210, 40,195,101,178,209,138, 73, 62, 48,171,131, 46,
+163, 20, 0, 98,140,248,124,141, 46, 63, 45,203,175,216,190,120,252,138, 54, 77,236, 81,162,214,227,204,141, 68,240, 60, 11,158,
+227, 42, 34, 91, 28,120,142, 69,255, 64, 71,116,211, 78,199,119,161,247,193,241,194,242,250, 52, 31,199, 64,132, 49,237,251,190,
+177, 95, 16,136, 92, 33,165,139,124, 61, 29,156,230,188, 30, 72,207, 26,210, 6, 26, 3,247,198,207,231,227,126,143,206,198, 86,
+163, 52,133, 39,135, 39, 34,181,189,198,115, 13,174,123, 61,209,168,160,190,193, 61,173,137,174, 8,108,110, 60, 74,202, 88,196,
+231,177,200,212, 22, 66, 65,101, 24,165, 41, 16,180,243,112,119, 85, 94,217,247,209, 35, 7,166, 88,226,196,112, 50, 57,205,129,
+ 23, 8, 67, 10,163,116,246,173,250, 73, 43,243,182,234, 91, 78,115,165,213,248, 94,175, 14,178, 73,254,121, 42,101,238,219, 31,
+ 78, 29, 60,241,232,226,118,100,223, 8, 69, 94,122, 34,101,173, 45,132,179, 67,115, 12, 24, 55, 10, 95,143,234,132,146,226, 18,
+ 48, 25,113, 54,114,169,194, 22, 48,212,170, 73,120,140, 91,181,242, 75, 87, 9, 67,151,111,207,202,137,103,161,209,233, 0,158,
+131,153, 68, 0, 69, 42,223, 99,193,179, 6,101,187,225, 31,205, 0,248,240,134,214, 61, 58, 27,123, 90,171,208, 19, 2,219,138,
+176, 26, 80,192,229,168,156,191,204,143,191, 19,198,188,212,255,173,158,132,194,165,198,180, 81,128, 3, 66, 58,250, 88, 90, 88,
+ 20,199, 32,245,224,187,136,131, 25,113,238,254, 31,140,153, 52, 83,185,101,203,150,193, 0,121, 27, 53,115,212,170, 52, 91, 57,
+ 51,211, 88, 30, 11, 1, 64,195,146,237, 86,114,106,210,170,189,215, 28,192,252,117,135,135,202, 72, 86, 92,158, 80, 96, 56,247,
+233,253, 46,115, 66,131,219,222, 14, 78,161, 40, 69,242,133,135,186, 34, 83,246, 37, 19, 17, 53, 69,205,191, 93,211,218,218,186,
+105,147, 38, 77, 22,178, 44,219, 75, 38,147, 57, 27, 12, 6, 8,130,144, 41,151,203, 47, 37, 38, 38, 46, 41, 46, 46, 78,248,111,
+ 91,247,187,119,239,154, 98,182, 26,212,148, 74,165,184,127,255,254, 67, 19,204, 86,216, 99,223,223,117,249,242,101,236,223,191,
+ 31, 0, 16, 27, 27,139,150, 45, 91, 90,212,246,197, 71,143, 30, 89, 4, 7, 7,239, 2,224, 89,159,102, 68, 68, 68,211,227,199,
+143,227,224,193,131, 0,128,251,247,239,195,215,215,183,214,133,185,124,249, 50, 51,118,236,216,166, 0,210,255,129, 54,122, 17,
+ 76, 86,245,249, 95, 70, 43, 52, 52,148,132,132,132, 80,143, 63,174,133,120, 47, 59,121, 7,104,121, 0,136, 55,117, 9,162,179,
+176,114,237,206,211,175,253,118,112,125, 47, 51, 25,141, 69, 91,231,164,228,228,151,116,145, 80,229,221, 47, 28, 1,109,103, 41,
+191,182,124, 66,160, 87, 65,169, 22,199,254, 72,187, 24,149,109, 90,136, 52, 42, 3,103, 1,193,182,252, 25, 15,173, 38,219,119,
+194,215,103,247,238,253,248,181,118,179,135,180,195,209,171,137,179, 1,174,193, 81,223,137, 32,128, 8, 92, 85,242,123,197,165,
+ 3, 32,212,188,129,175, 0, 82,254,154, 96, 90, 68,171, 55, 32, 41,112,194, 0, 43,165,124,221,180,105, 83,172,217,156, 7,200,
+215,203,144, 82,160, 69,166, 70,138, 82,137, 19,210, 98, 34,120,154,194,217, 6, 67, 46, 20,138, 9,167,181,181,147, 91,210, 1,
+253,102,184, 23,159,154, 95, 32,167, 56,198,122,216, 82,219,220,223,190, 77,228,212, 57,106,138, 66,131,195,207,219,216,216,182,
+212,230, 37, 50, 69, 5,185,176,117,105,131,215,222, 8,193,231,131, 90,163,164, 88,141,156,252,107,164,133,171, 53,149,116,105,
+ 55, 22, 12,240, 71, 94, 86, 6,116, 44, 64,169,117,249, 90,189,182,180,206,237, 72, 99,243,251,115,231,141,241,118, 85, 89, 84,
+ 22, 21, 16,129, 71,160,127, 51,244,235, 21,132,179,151,175,224,207,136, 88, 8, 21, 69, 5, 68, 16,144,154, 93,144,165, 53,240,
+219, 77,218,160, 60, 7,194,106,107, 53, 98,104, 68,151, 97,128, 19,148, 60,240, 89,167,166, 86,147, 63, 14,241,182,178, 80, 80,
+208,178, 60,180,122, 22, 37, 87,214,193,161, 73, 91, 40,205,204,168, 14,208, 72,110,161,246,109,171,101,177, 48, 33,163,208, 21,
+165,153, 24,219,175,205,123, 59,150,191, 99, 65,153,149,239,154, 44, 95, 51,146,117,101,113,167,211, 99,191, 56,114,110,255,129,
+209,110, 95,127, 56, 62,184,255, 7,219,207, 1, 56, 37, 30,183, 68,158, 71, 70,140, 24, 97,150,149,149,117,222,211,211,179,117,
+191,126,253,148, 61,123,246,132, 90,173,198,153, 51,103,160, 86,171,189, 61, 61, 61,189,207,156, 57, 51, 60, 57, 57, 57,202,195,
+195, 35,248,224,193,131, 70,231,208, 86, 24, 32,166,234, 16, 12,112, 20, 69,161,226, 53,170,226,181, 70,223,231, 86, 46,151, 35,
+ 41, 41,233,153, 71,182,210,210,210, 30, 54, 38,178, 85, 90, 90, 42,115,119,119,135, 74,165, 2,207,243, 80,171,213, 56,114,228,
+ 8,138,138,138, 32, 8, 2,204,205,205,177,116,213, 86,196,220, 58,143,240,240,112, 20, 21, 21,201, 26,210, 76, 77, 77,165, 2,
+ 3, 3,161,211,233,192,113, 28,180, 90, 45,194,194,194,170,158, 75, 36, 18,204,251, 98, 53, 98,111,156,199,237,219,183,145,154,
+154,250,143,220,109,196, 4, 47,242,223, 72,157, 99,102,253,227, 85,135, 60,207,125,178,101,199,222,107,159, 76, 31,133,153,163,
+251,122, 46, 89,127,184,111,116, 46,118, 0,128,191, 35, 38,188,217,167,133,151,173, 82,138,207,127,190, 1, 16,242,201,211,254,
+222,189,124,196,182,118, 22,102,255, 18,158,116,126,254,168, 14,104,230,106,221,178, 64,158, 47,143,143, 55,226,158,130, 2, 7,
+ 59, 75,133,223,192, 64,135, 83, 16, 4,216, 90, 41, 90,129,231, 96,107,169,240,123,173,141,245,175, 0, 96,173,148,182,170, 45,
+242, 85, 23, 29, 61,165, 83,149, 10,201, 84, 11, 43, 91,175,137,131,251,153, 15, 28, 60,220,220, 82,202, 33, 47,252, 12,138,165,
+ 30, 96,237,189,161, 99,243,145,154, 16,199,255,118, 61, 58, 45,183, 68, 55,167,193,197, 36,184,152,150,112, 95,213,180, 93, 63,
+187,220,208, 5,217, 77,223,250,217,135,134, 64,151,236, 30,150,101,225,212,217,252,143,248,132, 82,129,212, 26,209,169, 65,113,
+ 81, 81, 34,203,195, 85,195, 75,172,226,206,253,132,143, 7,180, 69, 65,126, 54,180, 6, 14, 69, 26,206,224, 98,107,166,208, 37,
+ 68, 66,103,224,160,103, 5, 72,109,221,113,230, 90, 68,174,192,178,191,214,165, 25,159,135,219,241, 71,110, 91, 86,127,173,153,
+ 35, 2, 63,178, 54,191, 13, 86,131,164,212,116,236, 56,113,173, 67,124, 30,110, 63, 77, 59, 19,129, 43,239,126,174, 22,201,162,
+ 8,122, 54, 38, 9,190,149, 19, 58,203,204,100,223,127, 53,123,108,235,174,190,246, 10, 33,245, 26, 40,193, 0, 11, 94, 2,141,
+156,135,141,103, 51, 8,250, 18, 82,166,213, 22,222, 3,234,107,124, 6, 0,136, 65,141,175,199,183,177,160,236,154,129,143, 63,
+ 5, 73,251,169, 96, 43,162,253,113,121, 66,132,225,220,167, 49,221,230, 30,239,253,197,217, 62,209,233, 39, 22, 69,187,143, 88,
+ 23, 8,108,111, 34,158,174, 69,158, 71,252,252,252, 92,210,210,210,238,205,157, 59,215,126,216,176, 97,248,229,151, 95, 80, 92,
+ 92,140,237,219,183, 99,205,154, 53, 88,188,120, 49, 88,150,197,150, 45, 91,148,135, 14, 29,234,188, 97,195,134, 84, 47, 47,175,
+ 54,201,201,201,153, 13, 24, 44, 10,128, 2,128,180,226,220, 69, 1, 16, 78,158, 60,137,129, 3, 7,226,228,201,147, 66,197,107,
+ 60,202, 47,126, 26,117,239, 79,185, 92, 14,185, 92,142,162,162,162,103, 98,182,164, 82, 41, 44, 45, 45, 33,151,203, 81, 82, 82,
+ 98,178,217,226, 56,142, 73, 77, 77, 69, 81, 81, 17,250, 13, 30,140,213,203,151,163, 79,159, 62,232,215,175, 31, 8, 33, 8, 11,
+ 11, 67,223,238, 1, 24,245,127,193,136,142,142, 6,199,113, 70, 45,111,102,102, 38,178,178,178,240,218,224,193,216,186, 97, 3,
+130,130,130,224,231,231, 7,142,227,112,254,252,121,140,232,223, 29,102, 67,251, 34, 54, 54, 86,220,169,141,143,102, 61,147, 28,
+173,167,230, 94, 14,174, 11, 71, 47,132,142,238,223, 57,100,112,143,214,216,186,239,183, 47,161, 42,222, 11, 0, 14, 58,197,210,
+241,125,154, 33, 42,185, 0,191,221, 78, 15,141,206,197, 51,169,214, 16,120, 56, 58, 88, 43, 1, 70, 14,141, 65,224,172,227, 27,
+ 78, 96, 22, 8,129,178,215, 71,120,115,112,148,103, 80,107, 79,207,202,170, 67,203,129,223, 98, 66,196, 67,175, 78,126, 46, 94,
+224, 89,128,103, 97, 61,234,103,224, 11,139, 6,151,163,187,143,252,236,251,179,102,117, 27, 48,244, 13,115,185,210, 6,124,113,
+ 10,216,204, 8,228, 61,184, 8,181,178, 37, 50,147,226,177,255,116,120,209,131,212,188, 98,154,198,153,172, 34,221,135,241, 5,
+ 40,109, 72, 87,203, 98,249,194, 5,115, 6,237,223,187,207, 74,209,172, 7, 21,183,110, 96,145, 92,194, 41, 84, 62, 47,209,101,
+102,142,100,217,246,125,214,106, 61, 86, 52,164, 83,166, 46, 62, 28,118,230,212,168, 22, 77,123, 88, 61,250,243, 4, 52, 90, 29,
+116, 44,208,166,115, 48,120,158,200, 41,154, 18,172, 25,134,202,206, 43, 0,197,242, 89,151,238, 60,202,184,124, 39,158,209, 89,
+ 97, 69,189,163,139, 60,238,238, 41,230,189,193,193,237, 1, 86,131,255,235,213, 22,171,119,255,246, 46,192,191,245,116,141, 92,
+ 30,209, 34, 64,143,214, 42,108, 34, 4, 61,110, 28, 89,211,170,227,208,247, 97, 74, 68,171,141, 35, 6,248, 55,117,251,105,245,
+210,143,236, 29, 60, 90, 50,148,192,130,184,180, 3,138, 83, 9,149,122, 13, 54,238, 65,224,221,186, 99,203,119,223,148, 10, 2,
+217,139,122,134,182,224, 5, 64, 72,190, 0, 62,230, 23,196,199,199,195,209,251, 6, 64,209, 32, 77, 30,193,192,149,127, 77,103,
+ 32, 39,214,110, 63,222,231,195,151,151,183, 25,220, 74,226,117,237, 78, 92,246, 27,147,220,148, 93,188, 24,223,168, 12, 11, 58,
+ 87,173, 22,196,227,151,200,243,132, 86,171, 61,188,114,229, 74,251,144,144,144,202,136, 12,174, 93,187,134,109,219,182,193,194,
+162,230,113,114,224,192,129, 32,132,216, 47, 90,180,232, 48,128,174,117,105,118,235,214,109,240,237,219,183,211,219,183,111, 31,
+ 95, 97,182,100, 0,232,200,200, 72, 58, 37, 37,133,178,179,179, 35,110,110,110,108,122,122,186, 0,128,159, 52,105, 18,115,224,
+192,129, 22,106,181,250, 66, 99,141,150, 92, 46,127, 38, 57, 91, 82,169, 20, 20, 69, 65, 46,151, 67, 38,147,129, 16, 98,146,217,
+226,121, 94,114,242,228, 73,220,184,113, 3,139,219,183,199,108,119,119,216,219,219,227,252,249,243, 32,132,192,194,194, 2,249,
+249,249,216,187,119, 47, 94,126,249,101,112, 28, 39, 51, 70,247,224,193,131,184,121,243, 38,190,232,216, 17,179,109,108, 96,105,
+105,137,176,176,242,222, 64,133, 66,129,164,164, 36,132,133,133, 33, 56, 56, 88,220,169,159, 18,163,119,158,222,128, 36,159,130,
+139, 65,175, 1,225, 8, 64,193,205,223, 31,178,232,232,154,201, 57,198, 64,211, 88,240,221,142,208, 65,223,190, 63,152,154, 58,
+164,131,219,146,159,206,189, 13, 0,147, 95,247,117, 87, 42, 36, 88,123, 52,138,208, 52, 22, 60,139, 21,244,247,135,140,202,195,
+219,253,130,252,144, 94,168, 71, 92,122,225,239,209,128, 81,119,113,254,237,219, 55,177,243,216,249,148, 53, 59,181, 49,132, 16,
+216, 90, 42,252, 38,220,141,243,250,233,228,205,228, 85,251,181, 49, 68, 32,176, 85, 74, 91,189, 21,221,189,193,170,195,142,158,
+210,169, 31,204,153,211,125,200, 91,115,205,184,152, 3,208,199,157,134, 96,208,160,216, 32, 67, 33,227,130,212,228,100, 44,219,
+ 18,154, 82,172,214,143,186,151, 99,154,193,124,144,135, 82, 9, 85, 60,108,217,231,243,207, 46, 95,186,200, 82, 19,127,190,148,
+161, 56, 13,211,164,183,100,233,226,111,169, 18,157,254,141,248, 2,148, 52,164,163,179,194,138,149,171,190, 27, 52,101,220,240,
+ 24,223,150,189, 29,248,244, 4, 7,109,113,113,246,207,167,110,186, 84, 92, 41, 82, 0, 16,151,154,135,156, 34, 53,199,115,236,
+ 5, 43, 41,150, 68, 25, 19, 29,172,160,169, 19, 84, 33, 61,218,140, 85, 89,201,160, 41, 45,132,147,149, 20,253,131,154,143,101,
+255,136,253, 40, 33,219, 20,187,246,184,209, 98, 65, 88, 13,174,175,120,185, 21,225,217, 86,224, 89, 24,238,238, 50, 61, 50, 70,
+ 97,246,204, 94,150,214,118,250, 71, 52,212, 22,128,185, 35, 40,107,111,192,198,135,146,250,191,129,244,248,123,220,187, 99,199,
+229, 37, 36,166,254,224,104, 94,127,183, 54, 43, 16, 8,137,231, 81,154, 21,135,200,116, 3,218,100,151,247,182, 91,103,221, 2,
+ 47,142,152, 35,242,130,146,148,148, 52,254,147, 79, 62,185, 28, 20, 20,228,236,232,232,136,182,109,219,226,216,177, 99,152, 59,
+119,110,213,103,218,183,111, 15, 66, 8,242,243,243,177,114,229,202,204,244,244,244,241,245, 94,160,223,187, 23,179,115,231,206,
+ 94,173, 91,183, 54,200,100,178, 66, 0,138,194,194, 66,179,252,252,124, 74,171,213, 66, 16, 4,193,198,198,134, 79, 79, 79,103,
+ 71,141, 26,165,187,122,245,106,115,181, 90,157,244, 52, 17, 45, 79, 79,207,200,188,188,188, 34,138,162,158,122,232,135, 74,147,
+229,232,232,168, 42, 45, 45, 21, 0, 20, 52,102,232, 7,142,227,208,177, 99, 71,156,190,120, 11, 39,127,187,138,226,244,251,120,
+123,202,120,180,109,219, 22,167, 79,159,110,116,155, 5, 6, 6,226, 84,216,101, 92,190,113, 7, 73,177,119,241,238,219, 83,208,
+166, 77, 27,156, 58, 37,102, 47,152,192, 9,212,204,205, 58,241,184,209, 10, 14, 13, 13,173, 60,244, 63, 97, 95, 91, 57, 34, 80,
+106, 43,223,181,104, 64,115,127,105,191, 69,160,164,230, 56,208,242, 84,247, 5,203,214,197, 48, 78, 73,227, 34,179, 27,174, 14,
+171,241,167,201,198, 61, 18, 30,179,231, 78,116,171,177,255, 23,228,137,173,199,148,159, 1,192, 27, 61,155,226,143, 7, 57, 8,
+143,205,222, 19,149,131,123, 79,187,214, 1, 78, 80,242,185,216,179,242,189, 33,193,222, 30, 46,216,246,203,101, 80, 20, 14, 27,
+117,194, 37,132, 4,181,246,198,154,157,143, 87, 24,186,120,173,218,175,141, 57,115,175,100, 0, 0,244,107,165,252,181, 83,115,
+ 59, 47, 82, 61,113,171, 22,204,229,146,105, 3,134,191,105,198,197, 30, 3, 18,195, 64,113, 58,104, 12, 2, 50,114, 75, 80,102,
+227,137,243,215,238,104,138,180,250,247,163,114, 26, 23,197,139,206, 69,188,236,207, 59,201,165,106,141,171, 82,213, 92,203,208,
+130, 80,170, 35,248, 35, 42,177, 56, 42, 19,247,141,209,136,143,135,190,139, 59,215,115,211,142,253, 11,165, 50,249, 27, 12, 5,
+202,201,214, 66,181,233,219, 47, 96,101,101, 9, 65, 95, 10,168,115, 48,236,157,101, 57,145,233,108, 83, 0,104,233, 0,203,158,
+ 77,165, 59, 36, 52,149,122, 46,206,240,105, 67,191, 65,177,152, 62,174,127,123,169,160, 87,227,189,149,251,176,249,163, 33,120,
+243, 21,127,233,137, 43,177,211, 1, 44,105,108, 91, 19,158, 3, 97, 53,232, 58,255, 98, 12, 5, 92, 38, 64,143, 27,251,151,182,
+ 2,110, 25,173,209, 1,144,242, 18,202,191,157,151,133, 76, 72,189, 2, 33,245, 10, 97, 60,187,131,242,234, 69, 81, 46, 29,201,
+247, 95, 45, 86,111,221,186,237,140, 64,227,115, 35,134,202, 0, 47, 0,185,177,151,161,215,235,193,242,128, 86,171,133, 90,173,
+134, 69,220,169,170, 28, 45,153,148,122,109,214,196,193,129,164, 52,189,236,120, 12,151,188,109, 74,171,174,164, 52,189,236,122,
+ 50, 31,155,171,214,137,209, 44,145,231,145,248,244,244,244,215, 6, 14, 28,248,219,233,211,167,237, 3, 2, 2, 0, 0, 55,110,
+220, 40,191,232,236,216, 17,190,190,190,200,202,202,194,232,209,163,115, 51, 50, 50, 94, 67, 3, 57,191, 37, 37, 37, 9, 7, 15,
+ 30,116, 86,171,213,237, 63,253,244,211,108,111,111,239, 98,173, 86, 75, 21, 22, 22, 10, 28,199,193,206,206, 78,222,190,125,123,
+116,235,214,173,244,218,181,107, 77, 82, 82, 82, 74, 0, 36, 54,102,225,135, 12, 25,130,139, 23,203,139,246,158,197,184, 90, 50,
+153, 12, 1, 1, 1,238,241,241,241,105, 21,231, 22,147,143,241,213, 79, 47,119,238,220,193,133, 91,169,144,232, 53,144,231,164,
+227,250, 47, 7, 49,120,218, 12,112, 92,227,239, 45,127,231,206, 29, 28, 9,187, 14, 11,133, 4,247,239,223,195,193,131, 7,241,
+246,219,111, 63,149,102, 35,169,215,139,252,151,147,129, 58,242,180, 36, 0, 16, 18, 18,114,161, 50, 90, 81,157,102,205, 32, 87,
+148, 98, 81,191, 14,238,243,222,232,209,156, 97,139,211, 33,240, 2, 24, 41,224,228,104,141, 93,187,246, 52,221,179,111,223,181,
+ 13,235, 55,124, 39,112,220,130,200,108,148,153,176, 80,139,190,221,119,249,141, 93,115,130, 37,111, 15,104,101, 15, 0, 50, 9,
+141,181,199,238,113, 0, 22, 61,205,218,118,113,135, 89, 41,139,169, 78, 14, 54,159,125,242,159, 65,246,193, 29,125,113, 33, 60,
+ 18,223, 29,188,118, 81,158,141,157, 70,239,220, 2,139,199,253, 83,109, 85,135, 16, 26,206,187,228,121,226, 34,179,176,131, 33,
+241, 28, 96,208, 66,171, 51, 32, 37,143, 71, 74,190, 22, 18,165, 12, 55, 98, 83, 53, 14,153, 8,125,138,213,166, 44,148,102,110,
+ 11,191, 92,229,161,213,148,114,197, 5,185,156, 76,126, 93,170, 52, 87,100,152,146,170,112, 61, 13,218, 94, 62,210,151, 0,129,
+145,155,145,178,249, 31, 76,180, 72,139, 58,141, 22,116, 58, 40, 66, 96,238, 63, 8, 86,230,140,172, 71, 19,105, 50, 0, 88, 88,
+ 40,229, 43, 63,159,107,243,254, 71,159, 55,152, 3,230, 15,200,124,155,185,188, 31,224,109,135,139, 55, 99,112, 49, 34,233,222,
+197, 27,247,219,244,105,235, 6, 95, 15,219, 89,242,130,194, 21,209, 48, 61, 66, 90,222, 48, 28,192,106,171,170, 14,253,157, 48,
+166,211, 27,159,214, 85,109, 88, 43, 62,128, 16,203, 19, 80, 12, 3, 80,116,121, 5,100,202, 21, 72,108,155,145, 61,251,143,148,
+109,219,182,243,139,232, 92,227,139, 51, 88, 30,124,113,113, 49, 44, 44, 44,112, 42,150,211,189,217, 95,166,160,105, 26, 41,177,
+183,254, 74,134,183,167, 91,203,250, 44,109,117,101,113,167,211, 86,114, 74,225, 54,232,115,127, 46, 98,103,106, 99, 79, 18, 34,
+ 34,255, 13, 20, 21, 21,221,141,142,142,238,223,174, 93,187,237,239,189,247,158,213,184,113,227,220,166, 76,153, 66, 3, 64, 86,
+ 86,150,176,102,205,154,244,239,191,255,190, 40, 55, 55,247, 45,150,101,141, 25,202,132,100,100,100, 92,253,225,135, 31,114, 46,
+ 93,186,212,166,115,231,206,138,151, 94,122, 73,176,179,179,147, 40, 20, 10, 94,175,215,107, 99, 99, 99,249,248,248,120,215,194,
+194,194,135, 0,226,208,136, 59, 86, 84, 68,175,150, 48, 12,179,144, 16, 18,240, 44,114,180,148, 74,165, 27,128,135, 20, 69,181,
+ 48,181,219,240,137, 19,182, 68,130,130,130, 2,148,101,222,131, 89,234, 3,180,179,160,209,218,206, 18,214,214,214, 79,101,138,
+138,138,138, 0,117, 26, 46, 95,190, 3,112, 28,108,108,108, 96, 99, 99,243,143, 27,173,186,188,200,115,194,212, 90, 94,171, 63,
+ 71,171,181, 10,111,155,235,177,102,218,160,230, 50, 31, 47, 15,232, 82,111,224, 78, 74, 41, 22,116,233, 28,197, 40,172,180,211,
+198, 15,233, 56,124, 68, 19, 4,119,235, 68,249,184,218,204, 90,241,237,198,119, 90, 35,119,110, 84, 54,214, 26,179, 68, 81, 57,
+ 72, 16,144,189,237,220,221,212,233, 30, 74, 13, 4,129,224, 92, 68, 6, 34, 18, 11,182,197,228, 32,193,148,181,107,237,138,190,
+ 18,208,251, 8, 33,102, 54, 22, 22, 37,173,125, 61, 28,251,118, 13,164, 95,235,221, 17, 50, 6,184,252,199, 29,204,254,246,240,
+117, 65, 32,131,110, 25,217,109, 88, 94, 97, 88,211, 64,149, 87, 24,178, 53, 42, 12, 9, 33,164,188,234,176,254,224, 3,195, 80,
+153,101, 73,127,186, 72, 29, 90, 66, 19,119, 14,137, 5, 2,146,178, 75, 80, 44,113,129, 46, 45, 13, 32, 66,242,133,250, 19,171,
+235,197,209,209,209,169,105,107,223,230,235,118, 28,132,161,172, 8, 9,231,183,163,180, 32, 3, 75, 55, 29,107,238,238,238,208,
+ 59, 45, 45,237,130, 9, 7, 27,223,223, 66,247, 56,129, 0,140, 84,129, 19, 27,246, 35,215,193, 28,142, 74, 25, 4, 77, 14,166,
+189, 63,206,102, 64,191,113, 54, 0,144,116,255, 54,188,149, 26,163,116, 13, 14, 24,254, 70, 31, 63, 91,176, 26,236, 56,117, 91,
+ 75, 3,175,237, 60,115, 47,174, 79, 43, 91,179, 55,122,120,219, 45, 73, 47,124, 29,121,141, 27, 84,180, 50,162, 85, 21,225,107,
+ 68,181,225, 65,128,111, 37, 32,110,223,213,108,139, 17,253, 94, 82,202, 36, 20, 69, 74,211, 64,204, 29,177,113,199,129, 82, 57,
+107,218,157,216, 5, 96, 73,208,242,132,133,229,251, 9,182, 15, 88,126,227, 63,103, 63,235,162,202,204,204,132,161,162,239, 48,
+ 33, 95,248,125,124,191,214,124,106,145,160, 63,179, 98,216, 8,202, 92, 37,255,240,235,157,231, 9, 32,142, 38, 45,242, 92,163,
+209,104,110,106, 52,154,182, 31,126,248,225,152,249,243,231,247,178,176,176,104, 10, 0,106,181, 58,129,101,217,139, 21,255, 79,
+ 83,170, 3, 9,128,135,113,113,113, 9,113,113,113,206,187,119,239,182, 5, 96, 86,241,158, 22, 64, 33,128, 44, 60, 69,197, 97,
+165,169,162, 40,106,225,179,218, 14,149,166,138,162,168, 22,141,249, 62, 77,211, 60, 69, 81,160, 40, 10, 10,133, 2,151, 46, 93,
+194,200, 65,253, 16,125,162, 16, 1,182,150,232,252,214, 52,236, 59,123, 22, 12,195,128,162, 40, 48, 12, 99,210,121, 68, 34,145,
+224,242,229,203,120,115,244, 8, 40, 36,128,141,141, 13, 62,252,240, 67, 28, 61,122, 20, 18,137,120,151, 62, 19,216, 82,205,112,
+ 25, 57,142, 22,133, 37,103,183, 47,147,129,103,113,124,251, 55, 8,141, 44,213,223,207,193, 2,191, 28,172, 57,136, 18, 33,231,
+219,157,211,207, 94,142,252,122,210,168, 16,229,203,125,250,225,229,224, 62,146, 54,157,122,127, 6,212, 48, 90,125, 81,207, 88,
+ 27,188,128, 47,182,156,138,153,182,239,124, 44, 5, 67, 9, 70,189,218,137,240, 2,190,104, 96,101,158,208,180, 49,183,220,119,
+249,218, 53, 59, 24, 74,145,120,251,119,179, 38, 77,155, 3,188, 1, 15, 31, 62,192,247, 59,126, 17,206,255,113,127,151,158,195,
+123,241, 5, 80, 27,171, 89,126,166,228, 96, 99, 33,247,123,173,141,245,175, 2, 8,108,149,178, 86, 68,224, 97,171,148,182,234,
+215, 74,249, 43, 33,132, 88,153, 75, 91, 17,158,109, 80, 83,163,231, 54,239,248,113,219,170,201,147, 39, 91,228,166,102, 34,189,
+ 56, 18,165,114,119,176, 74, 79,196,221,190,168, 41,211,113,198,156,196,235,220,158,185,185,185,217, 55,195,243,177,111,211,114,
+176,122, 29,178, 83,203,189,106,122,110, 49,172, 29,221,175,165,165,165, 25,173,105,224,132,162,225,227,166,202,204,173, 96,254,
+230,240, 16,121, 92,158, 14, 29,220,172,202, 15, 26,165, 57,136, 14,187,140,224,138, 28,211,248, 20, 26,222,129,110, 70, 45,167,
+149,153,236,189, 1, 47,185, 35, 33, 57, 3,151,238,165,237, 72,200, 71, 58, 31,147,177, 35, 46,189,112,250,144, 46, 94, 88,125,
+ 52,234, 93,128,221, 99,202,186,251, 59, 97, 12, 33,232, 81,158, 12,175, 1, 1,122,248, 59, 97,140,145,149,134, 79,104, 74,100,
+ 24,187,234,215,164, 79, 15,252,153, 59,100,222,216,158,214,221,186, 13,148,131,211,163, 68,163, 99,163, 11, 81,108,138,102,177,
+ 70,216, 12, 96,115,229, 27, 55, 83,133, 93, 61, 23, 93,187,184,103,138,167,170,210,171, 95,140,211, 93, 3,112,109, 82,144,249,
+103,178, 62, 75,253,174, 45, 9, 58, 29,145, 33,236,190, 24, 87, 53,134, 86,131,255,163, 70, 34,106,138,154,255,132, 38, 15, 96,
+ 23,203,178,187, 10, 11, 11,159,165,102, 58,158, 28,215,233,169,214,189,122, 55, 33, 33, 68, 82, 17,205,106, 40, 25,190, 94,205,
+234,221,132,132,144,147, 21,209,172,134,162, 90, 53, 52, 5, 65, 72,239,216,177,163,253,224,193,131,193,243, 60, 30, 60,120,128,
+164,148, 20,244,157,254, 46,108,109,109,113,241,238, 93,220,191,127, 31, 11, 23, 46, 4,203,178, 56,114,228, 72,106, 67,154, 18,
+137,196,208,188,121,115,217,208,161, 67,193,113, 28,226,227,227,145,150,150,134,217,179,103,195,198,198, 6, 55,111,222,172,210,
+204,205,205,133, 68, 34, 49,212, 18,221,250, 59,246,165,231,157, 39, 76, 86,253, 70, 11,224,193,179, 40, 58,187, 8,107, 47,193,
+ 96, 96,209, 42, 42, 7,143,162,254,138, 72,109,100,194,239, 30,191, 27, 25,147,112,243,202,203,114,100, 71,192,212, 43,137, 7,
+121,200,176, 50, 43, 41,129,161,196, 26,241,191,226, 81, 86, 73,233,131, 60,100,152,124,197, 32,240, 20, 12,101, 64,198, 13, 92,
+189,120, 1,231,175,223,193,159, 17, 49,252,213,155,177,251,104, 1, 95, 68,231,225, 65, 35,174, 66, 96, 57,104, 53, 38, 70, 60,
+244,234,228,235,236, 5,158, 3, 17, 88,216,140,218,131,183,162,186,121,117,106,102,235, 85, 30,201, 98, 97,247,159,223,129, 85,
+102,245,234,221, 72, 97,183,200,143,158,126,189,164, 48,175,203, 43,189,187, 90,216,248, 15, 64,238,195, 88, 60,184,115, 89,115,
+ 51, 50,238,234,141, 20,118,203,211,180,174,187,187,123,175, 87,122,251, 97,212,180, 79, 96, 40, 43, 66,252,249, 31, 81,154,159,
+137, 75,215, 44, 17, 83, 92,220, 21,128,209, 17,173,107,201, 92, 27, 36, 23,160,123, 19,105,178, 21,116, 46,227, 67, 6, 67, 65,
+105, 33,232,138, 65,149,229, 34, 46, 77, 95,244,250,166, 20, 30, 0,148, 10, 74, 98, 65,138,172,141,138, 60,122, 59,180, 84, 50,
+ 44,118,158,189, 7, 65, 40,191,125,147, 32, 96,227,206,223,227,166,127,241,102, 7,180,246,178, 11,188,157,150, 77,193,132,144,
+ 63, 69,208,243,207,125,159,183,210,254,246, 25, 32, 24,112,121,150,125,171,158,107,243,123,162,145,183,219,137, 76, 71, 26,128,
+233,144,148,109,158,181,246,212,103, 29,207, 70,245,152,243,159, 33,214, 32,207,164, 66, 55, 54, 42,147,239, 21,180, 34,233,180,
+ 64,106,246,231,150, 71,182,252, 73,122, 49,185,125, 49, 78, 39,142, 10, 47, 34, 34, 2, 0, 40, 45, 45,157,246,214, 91,111,109,
+150, 74,165, 42, 0,148, 32, 8, 16, 4, 65,242,245,215, 95, 75,121,158,167,105,154,230, 25,134,225, 78,158, 60,201,242, 60,159,
+163,213,106,167, 53,164,201,113, 92,220,140, 25, 51,154, 55, 84,161,184,119,239,222, 74,147, 21, 39,182,132, 81, 38,171,250,188,
+ 42,202, 37,169, 39, 72,251,121,247, 55, 23, 45, 2, 64,129, 96,113, 84, 14, 30, 61,254,145,136,124,164,183,102, 12,179,219,116,
+234,189,168,242, 59,166, 46,153,150,231, 71,116,106,235,187, 23, 0,116,132,127,179, 49,107, 87,172,211,188,209,190, 83,215,125,
+ 2, 33, 18,142,144,109,180,128, 67, 90, 14,209,198, 84,218,213, 69,122,118,225,205, 1, 1, 54, 4, 40,239, 50,172,234, 46,172,
+ 24,198,129, 16, 66,170,186, 11,191, 49, 67,110,145,174,193,113,160,174, 60,210,247,211,115,127, 78, 61,115,229,246, 52,158, 39,
+ 46, 12, 67,101,106,244,220,230,167, 53, 89, 0,144,150,150,118, 33,236,108,218,153,187,129,206,175, 58, 42, 43,162, 92,101, 64,
+110, 25,206,164,229,148, 94,104,140,102,129,154, 29, 50,127,205,209, 99,114, 41, 35, 1, 33,229, 3,138, 18, 2,173,129,207,191,
+150,204,181, 1,128,182,246,112,251,240, 8,183,151, 97,168,164,134,244,194,239,103,172, 30,181, 34,108,238,189,196,130,109,137,
+133,136, 4,128,196, 66, 68,238,191,252,232,179,184,204,146,185,145, 73, 5,223,192,196,188, 10, 66,225, 82,167, 81,139,158,120,
+237,105,183,103, 76, 6,238, 0, 24, 6,164,246, 27, 53,231,251, 57, 20,133,103,117,251,137, 88,141,129,120, 63,254, 98,101,100,
+ 75, 60, 86,137,136,252,119, 80, 25,213,162,105,122,201, 51,212, 60, 73, 81,212, 64, 0, 15, 77,248, 90,120,105,105,105,219,103,
+188,122,121, 28,199,229, 25,243,193,127, 33, 33,254,121,101,203,191,245,195,125, 69,205,127, 94,179, 69,139, 22,196, 4,195, 34,
+110, 79, 81, 83,212, 20, 53,255,167, 52, 9, 33,204,211, 76,117,104, 82, 79, 51,137,109,244,220, 51,181,174,231, 98,166,219, 11,
+200,195,135, 15, 41,113, 43,136,136,136,136,212, 14, 69, 81,252,223,160, 41,142,142, 39, 82,105,176,106, 68,183,104,113,155,136,
+136,136,136,136,136,136,136, 60, 19,147, 85,125, 94,110,194, 81,119,248,207,148,106,130,198,132, 16,195, 68, 77, 81, 83,212, 20,
+ 53, 69, 77, 81, 83,212,252,159,211,108, 72, 91,172,102,252,155, 13,152,168, 41,106,138,154,162,166,168, 41,106,138,154,255,123,
+154,207, 51,117,230,104,137, 93,135, 34, 34, 34, 34, 34, 34, 34, 34,127, 19, 98, 50,188,136,136,136,136,136,136,136,200,211,209,
+224, 77,165, 69, 68, 68, 68, 68, 68, 68, 68, 68, 26, 71,253, 55,149, 22, 17, 17, 17, 17, 17, 17, 17, 17,105, 52,166,223, 84, 90,
+ 68, 68, 68, 68, 68, 68, 68, 68,196, 40,182,136,155, 64, 68, 68, 68, 68, 68, 68, 68,228,159,161,102,213, 97,104,104, 40,169, 62,
+ 23, 17, 17, 17, 17, 17, 17, 17,249, 39,121, 81,189,136,216,117, 40, 34, 34, 34, 34, 34, 34, 34,242,116, 76, 21,141,150,136,136,
+136,136,136,136,136,200,223, 67,157, 57, 90,149, 3,150, 6, 87,132,234,130,197,109, 37, 34, 34, 34, 34, 34, 34,242, 47,240, 98,
+123, 17, 49, 63, 75, 68, 68, 68, 68, 68, 68, 68,244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,255, 77,136,247, 58, 20, 17, 17, 17,
+ 17, 17, 17, 17,249,135, 13,215,223,110,180,196, 59,155,139,154,162,166,168, 41,106,138,154,162,166,168,249,191,100,178,106,152,
+ 45,177,234, 80, 68, 68, 68, 68, 68, 68, 68,228,233,104,176,234, 80, 68, 68, 68, 68, 68, 68, 68, 68,164,113, 76, 5, 16, 82,241,
+ 56, 4,213,162, 90, 98, 68, 75, 68, 68, 68, 68, 68, 68,135,111, 75, 20, 0, 0, 32, 0, 73, 68, 65, 84, 68,228,233,216, 2,192,
+181,194, 96,157, 0,144, 33, 26, 45, 17, 17, 17, 17, 17, 17, 17,145,103, 67,245,188,172, 65,213,204,151,104,180, 68, 68, 68, 68,
+ 68, 68, 68, 68,158,146, 58,115,180, 40,212, 93, 57, 16,102,194, 15, 52,166,250, 32, 76,212, 20, 53, 69, 77, 81, 83,212, 20, 53,
+ 69,205,255, 57,205,134,180,195,240,252, 49,213, 20,243,245, 44, 17, 75, 95, 69, 77, 81, 83,212, 20, 53, 69, 77, 81, 83,212,252,
+159,229,153, 87, 29,118, 0,204,197,205,250, 66,226, 92, 49,137,136,136,136,136,136,136,212,207,223, 83,117,232, 15,252,103, 92,
+128,106, 19, 27,153, 99, 29, 9,148,213,247, 89,149, 74,181, 89,169, 84,142, 43, 43, 43, 83, 83, 20, 37, 84,190, 78, 8, 1,128,
+234,247, 58,138,207,201,201,233,217,208,111,203,229,242, 53,206,206,206,255, 41, 45, 45, 45,163, 40,138, 80, 20, 5,138,162, 0,
+224,137, 57,207,243,169,121,121,121, 29,159,235, 38, 36,132,113,116,118,254, 67,202, 48,238,166,126,149, 23,132, 71,217, 89, 89,
+ 93, 77,248,202,114,138,194,188,242,159,197, 87, 0, 62,121,209,254, 17, 4, 96,140,249, 92, 0, 96, 21, 11,140,226,105,250, 93,
+ 41,176, 94, 39, 8,155, 0,128, 2,248,198,254,182, 46, 28,205, 41,130, 64,138,130, 13, 33, 40, 34, 20,238, 40,130, 16,247, 47,
+109,138,225, 82,169,116,136,181,181,181,101, 94, 94,222, 5, 0,123, 1,140,118,112,112,232, 93, 92, 92, 92,202,178,236, 81, 0,
+135, 27, 35,220, 51, 16, 31,201,101,210, 73, 90, 3,187,242,202, 29,252,216,187, 3, 28, 56, 1, 43,204,100,146,158, 58, 61,247,
+213,229,187,216,102,162, 36, 85, 49, 85, 30, 51, 76,190, 71,218, 1, 35,219, 29, 0,142,216,217,249, 42, 84,214,191, 73,229,204,
+163,194,172,210,113, 35,178,179, 83, 70, 62, 69,187,255, 55,226,232,232, 56,145,166,233, 47, 9, 33,224,121,126, 65,126,126,254,
+246,103, 36,189, 0,128,109,197,227, 66, 0, 95, 62,165, 94, 18, 0,175,138,199,201, 0,188,197,243,122,163,217,248,203, 47,191,
+ 76,239,211,167, 15, 86,175, 94,141,141, 27, 55, 38,230,228,228,172, 0,176, 3,128,254, 95,208, 17,169,139,214,192,192,175,251,
+ 7,241,236, 79, 95, 8,213, 94,238, 91,199,159,249,135,241,227,199, 27, 8, 33,228,254,253,251, 68,175,215, 19,150,101, 9,199,
+113,132,227, 56,194,178,108,213,228,238,238,158,246,216,215,159,208,164,105,122,237,235,175,191, 94, 66, 8, 33, 55,110,220, 32,
+ 26,141,134,232,116, 58,162,215,235,137, 86,171, 37, 26,141,166,198,228,236,236,156, 85,159,166,181,181,245, 13, 59, 59,187, 44,
+ 59, 59,187, 44,123,123,251, 44,123,123,251, 44, 7, 7,135,170,201,209,209,177,106, 82,169, 84, 89, 42,149, 42,203,222,222,254,
+ 70, 67,203, 89, 65,127, 0, 23,140,152,250,215,242,221,190,213,141,150,171,171,107, 22,105, 4, 30, 30, 30, 41, 70, 44,103, 37,
+206, 20, 5,190,242,187, 20, 5, 65,161, 80,120, 85,127, 31, 79, 70,186, 26, 12, 41,187,185,185,189,238,234,234, 26,230,234,234,
+122,214,205,205,237,117, 35,118,177, 26,154, 86, 86, 86, 55, 28, 29, 29,179, 92, 92, 92,178, 43, 39, 87, 87,215, 26,147,155,155,
+ 91,213,228,236,236,156,101,103,103, 87,103, 27, 17,128,169,107, 58, 15, 72, 20,192,203, 18,134, 9,117,118,118, 46,142,136,136,
+224, 9, 33,132,166,233,180,202,207,152,178,238,143,155,172,178,203, 88,144,123, 78, 17, 94,250,104, 69, 81,238, 57, 69,120,217,
+101, 44,208,133,163,121, 99, 53,141,164, 54,205, 9, 19, 38, 76,184,147,149,149,149, 86, 88, 88,152,177,105,211,166, 88, 51, 51,
+179,203,155, 54,109,138, 45, 44, 44,204,200,202,202, 74,155, 48, 97,194, 29, 0, 51, 76,208, 4, 0,116, 13, 68,151,201,195, 93,
+203,238, 28,121,179,236,229, 78,146,219,221, 3, 16,210,175,171, 44,109,221,199,254,101, 23,183,246, 40,235,243, 18, 29,105,162,
+ 38, 37,145, 72,186,121,121,121, 77, 82,169, 84,227, 43,166, 55, 43, 39, 23, 23,151, 55, 93, 92, 92,222,180,179,179, 27, 89,159,
+230, 1,128, 49,102,242, 52, 51,235, 54,178,169, 87, 89,210,146,197, 36,226,253,119,201,164,102,158,197, 35,156,156,154,252, 11,
+109,244,183,106, 58, 57, 57,165,179, 44, 75, 12, 6, 3,113,112,112, 72,127,134,203,249, 13, 33,228, 27, 66,200, 55, 0,190,121,
+ 6,154, 85,199, 51, 19, 12,118,125,154,102, 18,154,158,163,148,203,207, 42, 36,146,108,133, 68,146,173,148,203,207, 74,104,122,
+ 46, 0,179,255,166, 54,250, 27, 52, 45, 85, 42, 85,194,154, 53,107, 72, 89, 89, 25, 41, 43, 43, 35,107,214,172, 33, 42,149, 42,
+ 1,128,165, 9,154,141,213,121,145, 34, 88,143, 79,207, 46,162,229, 15,116,124, 57,176,197,161, 89, 19, 71, 65, 56,184,134,106,
+224,138,233,135,174, 29, 59, 78,218,177, 99, 7, 0, 96,220,144, 33,120,181,115,103, 88, 89, 90, 64, 46, 47, 95, 28,138, 80,144,
+ 73,101, 24, 58,251, 3, 99,126,254,171,161, 67,135,142, 61,120,240,160, 37, 0,108,220,184, 17,195,135, 15,135,189,189, 61,148,
+ 74, 37,100, 50, 25,164, 82,105,141,121, 67, 48, 12,227,145,150,150,230,100,102,102, 86, 21,101, 19, 4,161,198, 68, 8,169,140,
+190,129,227, 56,180,108,217,210,216,205,245,113, 81, 81, 81, 47,181, 90, 93,165, 81,219,212,180,105, 83, 0, 56,109,140,224,151,
+ 75,191,128,192,169, 33,145, 0, 28, 7,232, 12, 52, 4, 82,171,185,193,140, 25, 51,170,150,187, 49, 12, 26, 20, 66, 81, 20,117,
+240,230,205,155,135,178,179,179,125, 4,129,159,210,200, 72,215, 59, 15, 30, 60,176, 4, 0, 95, 95,223, 25, 0, 14,153,178, 28,
+ 18,137,196,227,238,221,187, 78, 10,133,162,206,200,101,181, 8, 38, 12, 6, 3, 58,116,232,192,153,242, 27,206,128, 87, 62, 77,
+ 79,105,255,210, 75, 83, 23, 13, 29,106,246,199, 31,127,152,209, 52, 13,142,227,240,245,215, 95,115,132, 16,219,214,128,117, 20,
+ 80, 92,143,204,124, 0, 19, 43, 78, 6,219, 0,124, 93,195, 45, 16, 4,106, 88, 69, 72,124,233,208,206, 65, 77, 62, 66,212,189,
+136,206,205, 44,143,192, 74,162,139, 3,254,217,168,150,181,181,245,144,213,171, 87,171,182,109,219, 86,124,255,254,125,195,166,
+ 77,155, 84,211,166, 77,179, 50, 24, 12,152, 62,125,122,142,159,159,159,108,245,234,213,170,195,135, 15,191,172, 86,171, 55,152,
+212, 94, 20,190, 24, 61,228, 85,104, 89, 26, 44,203,169, 92, 85, 86,187,102, 77, 8,150, 18,162,199,206,163, 55,193,114,194,143,
+ 38, 70,178,186,142, 24, 49,162,217,158, 61,123, 36, 49, 49, 49,146, 86,173, 90, 65, 16, 4,240, 60, 15,150,101, 1, 0,130, 32,
+160, 69,139, 22, 79,189, 93, 38, 1,190,142,206,246,103,187, 14, 28, 96,238,106,166,128,125, 65, 14, 38,203, 36, 86,219,149,186,
+221, 0,186,189, 80,145, 93, 66, 32,145, 72,144,146,146, 2, 39, 39, 39,115, 65, 16, 50, 0, 44, 46, 40, 40,216,130, 23,151,206,
+114,137,228,208,206, 31,215,186, 4,117,235,198, 56,187, 58, 33,246, 65, 50, 36, 20,223,247,238,159, 55,131, 39,189, 61,103,150,
+158,227, 94, 7,240,199,139,182,226, 46,221,102, 12,163,104,102, 35, 69, 4,124,190,238, 88,201,242,175,214, 40,167, 79,153,192,
+204,158, 61, 27,158,158,158, 62,195,134, 13,251, 10,192,219, 13,234, 4,205, 24, 6,134,222, 8, 66,176,232,251, 99, 37,203,190,
+ 90,163,124,187, 17, 58,207, 57,117,254, 71,158,218,104,249, 3,205,218,120, 58,157, 89, 62,239,109, 41,249,245, 39,186, 44, 47,
+187,206,207,170, 84,170,205,175,189,246,218,184,237,219,255,138, 70,119, 13, 8,192,176,151,123,192,201,193, 6, 74, 11,121,249,
+233, 72,160,112,231,254, 35,163, 12,129,167,167,231,244, 67,135, 14, 89, 86, 55, 19, 50,153,172,106,170,110,178, 42,167,202, 19,
+112,125,152,153,153, 33, 44, 44, 12, 18,137, 4, 12,195, 64, 34,145, 84, 77,213,159, 51, 12, 3,103,103,147, 82,151, 86,216,216,
+216,180, 43, 41, 41,177, 46, 44, 44,132,151,151, 87, 49,128,187,213,222,111,151,147,147, 99,109,138,160,192,169, 49,123,178, 63,
+164,250,235,208, 75, 59, 67, 35,233,142,171,127, 70, 35,244,244, 5,164,165,103,162, 71,151,246, 24, 63,102, 4,206,158, 61, 11,
+158, 55,185,167, 35,139, 16,124, 53,120,112,200, 71, 0, 69,245,237,219,183,112,230,204,153,116, 76, 76,204,216, 97,195,134, 6,
+ 60,120,240,176, 34,170, 72,205, 35, 4,107, 1,100, 25,169, 43, 7,128,139, 23, 47, 2,128,162, 49,251,158, 66,161,192,181,107,
+215, 80,217, 77, 76,211, 52,104,154, 6,195, 48, 56,254,208, 17,106, 61,141,178,172, 72,188, 27,226,133,166, 77,155,130,166, 27,
+ 78, 73, 12, 6,204,174, 2,195, 40,169,116,182,171,155,155, 79,239,102,205,148, 97, 97, 97, 12, 0,120,123,123,147,140,140,140,
+194,163, 71,143,150, 72,128,141,222,132,236,168,207,100,121,122,122,118, 79, 75, 75,251,178,114,155, 83, 20,245, 85,147, 38, 77,
+ 22, 86,181,155, 32, 96,241,143,106,233,172, 89,239,203,130,130, 63, 5, 0, 4, 13,222,131,226,248,229,254, 84,254,124,155,127,
+250, 40, 81, 92, 92,188,175, 69,139, 22, 76, 94, 94,222, 85, 0, 73, 44,203,126,188,107,215, 46,167,201,147, 39,103,239,222,189,
+123, 5, 0,183,149, 43, 87, 6,171,213,234,253,166,232,246,104,135,129, 47,181, 11,232,226,229,233,137, 11, 87,255,128, 76, 46,
+181,157, 49, 49, 4,150,150, 18,124,179,237,132,144,148,154, 63,243,242, 93,236, 48,193,100,117, 30, 49, 98,132,207,158, 61,123,
+228, 0,112,247,238, 93,100,102,102, 66,165, 82,193,220,220, 28, 82,169, 20, 12,195, 64, 42,149, 62, 19,147,101,227,233, 16,126,
+228,200, 81,115,123,123, 91,172,251, 96, 22,198,103,103,193,214,202, 18,108,169,218,231, 5, 59, 81,248,246,236,217,211,140,231,
+121,168,213,106,156, 63,127,222,198,220,220,220,198,195,195, 99, 17, 76,168,158, 50, 51, 51,203,210,106,181, 78, 21,143,179,181,
+ 90,173, 51,128, 98,133, 66, 81,121,156, 46,173,152, 27,219,157,152,132, 39,187, 9,147, 41,138,170,254, 90, 99,233,212,185, 83,
+187,176,195, 7,127,182, 44, 42,201,132,173, 93, 54,104, 20, 97,203,150,245, 48, 55,183,198,162, 69,243, 37,143,250,190,236,222,
+127,224,235, 97,247,162, 99,251,190,112,102,139, 80, 91,250, 14, 30,103,111,174,180,170, 56,151,176,216,190,117, 22,104,154,198,
+194,133, 11,209,166, 77,155,169,247,238,221,251, 20, 64,126,253, 50,216,210,182,215, 27,246,114,179,242, 38, 22,120, 22,155,246,
+206, 45,215,249,100, 26, 70, 15,110, 58,245,195, 17, 9,167,218, 52, 67, 73,197,133,185, 70, 74, 35,153, 10, 66,149, 97, 8, 13,
+ 13,237, 29, 18, 18,114,161,174,231,207, 1,174,248,107,252,172, 26,230, 75, 18, 26, 26, 74, 66, 66, 66,168,106, 43, 87,227,121,
+125, 4, 2,142,118, 54,202,176,141,139,103, 89, 74,174,159, 96, 52,201, 15,145,174,173,113, 34,175, 81,162,169, 84, 42,199,109,
+223,190,189, 70, 72,201,203,217, 9, 50,153, 20, 82, 25, 5,219,158,229,163,215, 23, 94, 10, 5, 69,213,105,178,106,104,170,213,
+106,237,237,219,183, 45,183,109,219, 6, 39, 39, 39,248,248,248, 64,169, 84,194,204,204,172,134,185,170,110,184,106, 49, 90, 53,
+ 52, 43,223,151, 72, 36,160,105, 26,103,207,158, 5,199,113, 24, 49, 98,196, 19, 38, 75, 34,145,212,101,220,234, 42, 79, 61, 13,
+224, 46, 33,164, 87,197, 9,248, 46,128,222,213,222,239,175, 82,169, 62, 6,176,194, 88, 77,134, 33, 96,180, 87, 33,120,172,129,
+ 36,101, 22,244,210, 64,156,187,124, 19,219, 55,175, 6, 0,248,180,234,132,145,195, 66,170,162,113, 70, 46,103, 21,238,238,238,
+123,115,114,114, 7,188,252,242,203, 40, 40, 40, 96, 23, 47, 94,140,118,237,218,193,215,215,215,168, 54,170,227,202, 57,235,238,
+221,187,158, 26,141, 6,132, 16, 99,204,217, 19,154, 20, 69, 97,215,174, 93,208,106,181, 79,124,216,174,247, 50,204, 29,238,141,
+183,222,221,129,175,238,239,199,134, 13, 27,234, 93,119, 37,208, 78,107,211, 98,173,156,225,218,173,152,255,142, 98,252,248,241,
+204, 91,111,189,133,228,228,100, 76,158, 60, 89,123,246,236, 89,125,102, 70,198, 81,185, 32,172, 51,212, 52,198,117,106, 42, 20,
+138,157,167, 79,159,198,254,253,229,190, 36, 54, 54, 22, 45, 91,182,180,168, 97,146,243, 15,160, 36,105, 29,194,143,199, 32,104,
+240, 30,132, 31, 31, 3,190,240,132,180, 99, 75, 20,153,178, 61, 27, 65,109,154,251,243,242,242,170, 76,212,238,221,187,205,119,
+239,222, 61, 20,192, 49, 0,251, 1, 32, 63, 63,255, 91, 19, 53, 1, 10,111,189, 49,124, 40, 36, 50, 43,196, 60, 76, 69,239,174,
+ 29,224,236,228,132,187,209,113, 72, 74,203,207,162, 40, 76,236,223, 77,190, 66,163,209,127,122,233, 14,126,104, 64,147,242,240,
+240,240, 61,112,224,128,172, 90, 4,186,234, 63,206, 48, 76,213,243, 74,227,221,152,253,179,210,100, 89,121, 88,134,127,177,190,
+187, 69,120,196,110,180,244, 30, 8,187,129, 33,248,225,204, 25, 60,184, 23,165,213,151,113,175,252, 11,109,244,119,105,250, 14,
+ 31, 62,252,234,207, 63,255,108,155,146,146,130,139, 23, 47,194,199,199, 7,101,101,101,198, 92,240,214,208,212,106,181, 78,149,
+223,161, 40,202,169, 50,240,174,215,235, 43, 27,163,242,143,104, 91,237,115,182,245,104,122, 85,251, 92,165,185,242,126, 6,235,
+ 46, 55,147,201, 14, 28, 57,188,215, 50, 42,230, 34,218, 7,118,129,165, 77,107, 8,124, 38,242,242, 75, 81,240, 48, 29, 75,151,
+126,133, 69,139, 23,224,216, 47, 7, 45,253,252, 3, 15,233, 57,174, 5, 0,237, 11,211,238, 20,153, 26,118,124,247, 70,138, 8,
+208,100,197, 40,164,234, 4,229,184, 49,175, 51,163, 70,141,194,177, 99,199,112,239,222,189,141,245,152,172,176,106,145,249,169,
+145, 23,247,111, 4, 33,208,100,199, 40,100,154, 4,229,132,177, 35,153,241,163, 95,197,245,223,215,226,213,246, 9,145,110, 78,
+ 24, 86, 80, 97,177, 37, 12,242, 20,102,184, 66,194,113,189,154,217, 58, 15,128,170,102,176,206,227,175, 28,204,231,129, 65, 21,
+198,106,234,227, 23, 38,146,198, 24, 44, 0,104, 9, 88, 82,114, 89,248,246, 69,239,184, 41,147,239, 73,116,145,215,144,174, 19,
+200,166, 68, 78,232, 0,152,223, 2, 52,143,127,167,172,172, 76, 29, 23, 23,103, 62,113,216, 48,116, 11, 8,128,171,131, 3, 90,
+120,120,192, 92, 33,135, 92, 38,173,113,201,106,116, 31, 2, 69, 17, 63, 63, 63, 12, 30, 60, 24, 82,169, 20, 74,165, 18,150,150,
+150,144,203,229,181, 70,179,140,189,202, 37,132,128, 97, 24, 68, 70, 70, 34, 41, 41, 9,182,182,182,184,114,229, 10, 94,121,229,
+149, 39,162, 90,213,205,153, 41, 33,250, 90, 78,252,149, 70,236,180, 41, 90, 60, 79,161,148, 4,194, 44,113, 38,202,168, 14,208,
+233, 56,232,116, 58,252,112,217,128, 63,226,212, 48, 24,244,208,233,116,245,253,102, 93,208,110,110,110,227, 90,180,104, 49, 99,
+204,152, 49,172, 92, 46,135, 90,173, 70, 89, 89, 25,238,221,187,199, 14, 24, 48,176,112,240,224, 16,155, 19, 39, 78,144,138,174,
+195, 44, 19,180,243,220,221,221, 61, 43,186,103,243, 26,179, 87, 83, 20, 85,101, 98, 30,103,226,183, 81,144, 48,229,109,178,113,
+227, 70,240, 60, 15, 66, 72,157,141,164,165,168,223, 22, 47, 91,101,179,114,205,143,176,177,119,198,133, 11, 23,248, 83,167, 78,
+149, 80, 64,236,131,123,247,190,253, 63,224,228, 1,192, 96,202,242, 21, 20, 20,152,251,248,248,192,195,195, 3,130, 32,128,101,
+217,170,232, 75, 94, 94, 30, 52, 26, 13,236, 45, 10,209,220,193, 3, 92,201,121,100, 68,126, 14, 87,203, 24,236, 56,173,103, 95,
+242,197,157,255,130, 3,199, 79, 21,211, 83, 94, 53,195,221,201,197, 19, 52, 97,145,158,157,135,161,131, 94, 5, 35,179,196,163,
+148, 92, 4,182,110,230, 58,246,255,186,187, 50, 20,135,121, 43,246,204, 0,132, 31, 26,146, 43, 45, 45,229, 99, 98, 98,112,247,
+110,185,223,181,182,182,134,133,133, 69,141,255, 56, 77,211, 79, 21,209,170, 52, 89,203, 54,190, 98, 65, 75,213, 40,230,195,176,
+109,215, 77, 4,250,133, 96, 83,248,159, 90, 62, 43,191,239, 55, 90,109,236,222,231, 56,152,225,226,226, 50, 77, 16,132, 69,132,
+144,194, 30, 61,122, 56,239,217,179,199, 46, 45, 45, 13, 55,111,222,196,194,133, 11,115,120,158,231, 8, 33, 20, 33,228,243,103,
+240,115, 66, 53,131,245, 44,145, 42,205,240,174,163, 53, 53, 68, 66, 91,251,112,197,165,143,114,245,228,104, 25, 39,124, 15,128,
+173,247,224, 70,211,255, 57,184,111,163,155,163, 74, 64,176,234,101,100,100, 25,176,236,131, 9,200,203, 43,193, 15, 91,151, 3,
+144,195,192, 49,232, 21,252, 58,156,156,220, 49,117,202, 84,151,141,155, 55,189,195, 9,194, 55,120, 65,200,188,186,225, 23, 0,
+ 97, 42,149,234,222, 59, 83,167,170,124,124,222,132,153,153, 25,246,238,221,139, 61,235,214,241,107,128,145, 10,224,220,116,224,
+151,122,117,194,255,210,153, 53,125,186,202,223,127, 58, 20, 10, 5,126, 63,245, 19,180,153,187, 74, 6,117,131,161, 76,139, 65,
+ 77, 6, 19,251,196,227, 84,190, 84,138,135, 0, 32, 53, 67, 6,128,199,187,193,158, 55,131, 85,201, 9,252,149,151, 53,181, 70,
+ 68,171,209,199, 78,169, 60, 98,235,251,163,189,157,161,163,244,151,143, 35, 77, 39,240, 43, 31, 24,152, 91, 69,100,110,116, 45,
+ 38,171, 98,199, 22,188,188,188,240,114,199,142, 24,214,179, 39, 36, 18, 9,204,228, 50, 88,153,153,131,240,229,145,172,202,174,
+195,122,206,137,168, 45,250,228,224,224, 0,153, 76, 86,101,176, 76,136,102,213,170, 41, 8, 2, 36, 18, 9,238,222,189,139, 30,
+ 61,122,192,211,211, 19,251,247,239, 71,255,254,253,159,232, 74, 52,213,100, 85, 26,173,199,186,241,250, 3,168,140,100,153,100,
+180,180,122, 10,185,250, 64, 80, 84, 0, 56, 14,224, 9,160,211,106, 65, 8, 64, 8,192, 26,244,208,106,181, 85,191,105, 76,151,
+172,139,139,139,151,185,185,249,146,143, 62,154,231, 31, 24,216, 30, 57, 57, 57, 16, 4, 1, 22, 22, 22, 40, 43, 43,131,181,181,
+ 53,186,117,235,246,104,201,146, 37, 25,132, 96,170,137, 38,235,169,169,220,230,103,206,156,169,209,109, 88, 57,169, 51, 82,241,
+214,123,187, 33,151,148,119, 45, 85,230,240,212,119,220,237,211,171, 59,174,222,138,229,254, 51,111,173, 78,154,119,115,133,139,
+ 32,108, 79,125,138,245, 34,132, 32, 55, 55, 23, 89, 89, 89, 24, 50,116, 40,246,252,252, 51, 18, 19, 19,209,186,117,107,244,233,
+211, 7, 78, 78, 78, 72, 76, 76,196, 31,151,116,208, 21,228, 35, 95,127, 19, 74,171, 32, 28,185, 16,167, 91,184,209, 16,247, 47,
+ 30, 48,134, 0,152, 96,109,109,221,180,172,172, 44,131,227,184, 3, 0, 14, 0, 24, 41,145, 72, 70, 42,149, 74,215,226,226,226,
+ 4,148, 87, 19, 29,109, 72,204,220,204,204, 65, 97,102, 13,129,211, 65, 34,145,192,211,211, 7,132,215,163,160, 88,131,137,163,
+ 6,227,214,221,104,156, 58,119,157, 99, 89,225, 59, 99, 54, 43,195, 48,196,215,215, 23,217,217,217,144, 74,165, 48, 55, 55,135,
+165,165, 37, 62,249,228, 19,172, 91,183,174,202,100, 53,214,104, 77, 2,124,173,189, 44,175,127,185,190,220,100,101,166,103, 32,
+ 43, 85, 10,149,131, 51,190, 91,183, 70, 93,144,152, 25,244, 35, 16,251,188,159,100, 5, 65,248, 60, 45, 45,205, 73, 34,145,184,
+112, 28,135,148,148, 20,220,184,113, 3, 51,103,206,204,202,203,203, 11, 70, 35,215,209,204,204, 44,187, 50,146, 85,209,117, 88,
+ 87,119, 98, 97,181, 72, 86, 97, 61,146,117,117, 19, 54,243,241,176, 58,187,117,245,108,175, 78, 65,221,104,165,196,186,160,244,
+ 97,102,143,203, 23, 47,116,155,185,250,135,119,146, 10, 74, 95, 5, 16, 95,151,168, 66, 42, 29,208,165,123,119, 9, 72, 22, 36,
+242, 30,248,106,229, 40,228,228, 22,163, 32,191, 4, 50,153, 5,244, 44, 3, 94,160,208,173, 71, 79,252,180, 99, 31,218, 76,153,
+204,200,165,210,126,156, 94,255,194, 24,173, 10,150,127,255,253,247, 94,126,126,126,216,190,125, 59,206,237,220,137,241, 69, 69,
+184, 64,211, 12, 43,149, 58,158,100,217, 45,104,192,104, 85,215,105,211,166, 13,126,252,241, 71,236,218,181, 43,121,220, 43,217,
+135,102,143,131,147,193,128,215,110,222,135,125,147,193,192,205,251,176,127,201, 15, 45, 56, 9, 30, 82, 84,205,225,160, 66, 67,
+ 67,123, 87,159, 63,103,100,160,142, 46,118, 9,128,224,208,208, 80, 82,125,222,224,129, 83,213,114,250,242, 87,155,122, 7, 52,
+247,162,216,253,107,145,162,230,244,159,222, 55,200, 31,148,146,217,209,192,154,122,174, 32, 8,195, 48,176, 50, 55,135,202,214,
+182, 60,204, 79,211,128, 0, 8, 44, 64,241,229, 6,128, 8, 20, 8,111,210, 1, 3,114,185,188,214,196,119, 83,115,179,170,107,
+150,148,148,224,209,163, 71,152, 58,117, 42,148, 74,101,185,115,207,204,132,183,183, 55, 36, 18, 9,210,210,210,240,251,239,191,
+163,105,211,166, 80, 40, 20, 38,185,173,106,209,165,118, 40,175, 50,108,151,145,145, 97,237,234,234, 10,147, 35, 90, 2, 65,153,
+142,130, 94,207,227,193,131, 7, 72, 79, 79,199,163,132,135,232,164, 46, 6, 1, 3, 66,136, 73, 17, 45,119,119,247,128,102,205,
+154,109, 90,177, 98,133,204,195,195, 3,132, 16,216,217,217,162,172,172, 12,185,185,121,104,221,186, 53, 60, 61, 61,177, 98,197,
+ 10, 0,216,243, 79,155,172,199,246,169, 42,163, 85,221,112,189,247,127, 94,200,207,183, 4,195,208, 85,198,185,129, 28, 45, 25,
+ 0, 4,191, 58, 92,114,246,212, 73, 11, 14, 88,146,201, 48, 75, 36, 13,183, 35,203, 11,130,178,174,247, 83, 82, 82, 32,149, 74,
+113,240,192, 1,228,103,101, 33, 48, 48, 16,157, 59,119,198,195,135, 15,113,235,214, 45, 56, 56, 56, 64,229,209, 21, 23, 18, 12,
+136, 74,215,192,198,198, 6,113,169,244,191, 57,100,192,148,190,125,251, 46,252,246,219,111,157, 92, 92, 92,164, 57, 57, 57,126,
+235,215,175, 15, 92,191,126,253,172,119,222,121,199,249,157,119,222,177, 83,169, 84,146,204,204, 76,223, 15, 62,248,224,165,176,
+176,176,166, 0, 86,213, 39,104, 97, 97,101,207,200, 44, 64, 81, 18,216,218,216, 65, 34,183,128,192, 73,192, 11,128,181,141, 10,
+ 87,111, 29,196,149,136,146,105,217,121, 56, 96, 84,124,172,162,221, 29, 28, 28,158,136, 84,207,156, 57, 19, 91,183,110,173,234,
+ 70,108,172,201, 90,182,254, 21, 75,170,194,100,101,166, 72, 64,233,154,226,248, 47,215, 10, 11, 18, 51,123,188, 8, 38,171,242,
+ 24, 71, 8, 65, 66, 66, 2,202,202,202,112,233,210, 37,124,254,249,231, 57,143,155, 44, 39, 39,167, 41,214,214,214,139, 75, 75,
+ 75,191,202,204,204, 92,219,224,133, 95,185,137,170,124, 92, 57,175,181, 59,209,200, 69,245,174, 45,146,229,233,106,118,250,214,
+165,221,222, 54,228, 14,133,164,169,192,131,226,123, 86,225, 78,189, 6,118, 26, 68,119,216,240, 69,147,206,211, 62, 57,157, 82,
+172,245,171, 43,178, 37,240,124, 7, 11, 75, 43, 0,217,184,121,227,124,149,201,202,203, 47,130,206,192, 64,167,167,160, 53,208,
+120,185,239,107, 88,183,105, 23,210,178,243,193,243,124,219, 23,204,100,217, 7, 4, 4, 76, 31, 57,114, 36,150, 44, 89,130,176,
+111,191,213,191, 77, 81,197, 18,128,156,224,121, 8,132, 80,180,113, 73,236, 53,116,190,249,230,155, 95, 0,140, 94, 49, 19, 93,
+ 11, 74, 49,209,109, 48,177,111, 50,184,252,131, 35, 62, 34, 0, 96,159, 19, 86,243,148, 25, 18, 18, 66, 85,246,172,153,218,195,
+246,223,142, 36, 36, 36,228, 66,104,104, 40,170,207,235,251,130,149,179,223,192, 15,231,204, 88,217,169,127, 79, 42, 99, 78, 63,
+228, 23,107,185,249, 81, 6,121,170,166,126,147, 85,157, 15,215,175,199,173,216,242,255,177,135,147, 19,230,141, 29, 11,194, 1,
+ 87,238, 69, 97, 95, 88, 24, 70,245,237, 11, 11, 51, 51,163, 35, 27,130, 32,212, 26,197,170, 30,205, 50, 53,234, 84, 88, 88,136,
+ 3, 7, 14,160,115,231,206, 80, 42,149,144, 72, 36,104,215,174, 29,162,163,163,209,172, 89, 51, 80, 20,133, 35, 71,142, 96,216,
+176, 97,136,143,143, 71,215,174, 93, 45,147,146,146, 76, 54, 90, 81, 81, 81,214,132,144, 94,149,209,143,198,162,211,233, 16, 19,
+ 19,131,193,131, 7,195,206,206, 14,238,238,123, 16,118,122, 55,148, 1,227, 65, 81, 48,201,104,241, 60, 63,105,208,160, 65, 50,
+138,162,160,209,148,193,204,204, 28, 22, 22,150,176,178,178,134,175,175, 31,210,211,211,209,191,127,127,125, 92, 92,220,134,140,
+140,140,253,166, 46,171,191,191,191, 69, 98, 98,226,248, 38, 77,154,200, 1,192,220,220,188,117,179,102,205,230,198,199,199,151,
+152, 26,213,170, 52, 88, 20, 69,129, 97,152, 42,163, 37,161,105,184,186, 56, 85, 61,175,200, 79,163,234,209, 42, 78,203,211, 41,
+ 0,192,203,203, 11,235, 54, 31,163, 7, 13, 26,132, 89,179,102,129,101, 89,108,216, 80, 94,100, 55,102,204, 24, 24, 12, 6, 28,
+ 58, 84, 94, 36, 41,145, 72,234, 13,155,220,184,113, 3, 55,111,222, 4,203,178, 40, 42, 42,194,175,191,254,138, 11, 23, 47, 98,
+239,145,223,144,152,240, 16,237,252,188, 49,121,242, 36, 72,165, 82,236,216,177, 3, 61,122,244,248, 87, 15, 8, 82,169,116,220,
+214,173, 91, 93,183,111,223, 94,120,228,200, 17,117,151, 46, 93, 20,107,214,172,113, 90,183,110,157, 74,175,215,227,253,247,223,
+207,190,126,253,186,110,232,208,161, 22, 91,182,108,113,109,222,188,121, 63,142,227,106, 51, 90, 22, 0, 70, 1,120,179,160, 68,
+ 47, 41, 44,209, 64,224,244, 72, 72,124,132,162, 82, 61, 4,222,128,228,212,116,148,106,121,228,229,151,160, 93,135, 87,191, 63,
+127,254,252, 2,131,193, 48, 31, 64,104, 67,203,121,239,222, 61, 92,191,126, 29,137,137,137, 72, 72, 72,168,233, 20,167, 76,193,
+174, 93,187, 76,142,104,213,110,178, 24, 80,186,102, 8, 61, 18, 94,152,253, 48,227,133, 49, 89, 21,199,160, 69,174,174,174,139,
+ 92, 93, 93,205,206,156, 57, 99,211,164, 73, 19,112, 28,167,127, 60,146, 21, 28, 28,252,233,214,173, 91, 93,155, 53,107, 54, 19,
+192,218,255,134,101,167,105, 76,249,106,227,116, 71, 43,121,114, 58, 30,172,170, 24, 75,144, 1,202,138,129,243, 63, 67,210,253,
+179, 71, 51,135,126,100,247,241,246, 37, 83, 4, 8,117, 86,200,198,197,167, 96,227,198,117,152,253,254, 68,252,244,195, 87, 16,
+ 4, 9,116, 44, 3, 47,159, 46,208, 25, 4, 80,180, 4,129, 29, 58,226,220,249, 75,144,210,192,129,237, 27, 95, 48,159,133,252,
+200,200,200, 13, 71,142, 28,121,119,214,172, 89, 16, 4, 65,190,120,227, 70, 77, 78, 78,206,114,152, 54,254,213,227, 58,195, 54,
+110,220, 24,251,241,186,156, 95,102,143, 3,147,120,156,202,191,121, 31,246, 35, 62, 34, 56,184,146,194, 75,126,200, 87,214,126,
+138,191,248,216,252,197, 48, 90,149, 78,178,250,188, 54, 58,180,108,250,133,141,189,221, 36,218,202,221,113,222,172,183, 37,241,
+153, 90, 28,106, 50,182,244,247,157,223, 89,100,114,138,239,227,160, 93, 99,202, 15,239,251,253,247,170,199, 95,239,217, 83,235,
+123, 25, 35, 70, 24,125,101, 86, 87, 20,203,212, 72, 22, 0, 40,149, 74,219,126,253,250,225,149, 87, 94,193,235,175,191, 94,149,
+147,213,190,125,123,236,221,187, 23,195,135, 15,199,237,219,183,225,234,234,138, 86,173, 90,161, 85,171, 86, 56,121,242,164,169,
+ 7, 57,240, 60,143,128,128,128,202,170,195,118,169,169,169,214,141,109, 72,157, 78,135,188,188, 60,216,219,219, 67, 46,151, 35,
+ 40,168, 51,222,125, 47, 8,142,174, 63, 34,192,223, 15,106,181,186,170,252,221,136,147,109, 64,139, 22, 45,144,147,147,131,156,
+156, 28,168, 84, 42,184,185,185,193,197,197, 5,171, 86,173, 34,107,215,174, 61,101, 48, 24, 54,228,230,230,154, 28,201,114,113,
+113,233, 73, 81,212,167, 26,141, 70, 94,237, 10, 87,174, 82,169,142,106, 52,154,229, 25, 25, 25, 70, 39,130, 82, 20, 5,131,193,
+ 0,138,162,112, 34,193, 13,106, 61,133,226,212,155,152,245,127,222, 53,140,151, 84, 42,109,176,187,148, 16,162, 30, 61,122,180,
+147,167,167, 7, 82,226,238,225,224, 65,130,111,191,253,182,178, 42, 18,177, 21, 23, 6,149,207,251,244,233, 3, 31, 31, 31, 16,
+ 19,198,202, 16, 4, 1,119,239,222,197,158,163, 23,224,234,237,143,228, 7, 49,184,117,242, 56,154,168,236,209,166, 67, 71,176,
+ 44,251, 84, 67,111, 60, 11, 88,150,221,214,178,101, 75,162,215,235, 47, 0, 88, 23, 17, 17, 49, 49, 35, 35,227,253, 99,199,142,
+185,141, 28, 57, 50,253,248,241,227,107, 0,108,143,136,136,152,190,116,233,210, 87, 56,142,171,181, 90,144, 97,152,159, 62,248,
+224,131,224,145, 35, 71, 82, 50,154,213,159, 57,189, 67,194,113, 44,245,225,252,109,252,249,203, 23,104,142, 99,169,215, 71,127,
+ 32,156,252, 61,130,158,246,222,215,124,251, 46,131, 16, 25, 25,233, 18, 18, 18,178,148,101,217,122,141, 86,101,164,170,174, 8,
+ 37,195, 48,152, 56,113, 34,246,238, 53, 62,131,106, 50,208,204,218,219,242,250,178,245,125, 45, 41, 73,105, 53,147,213, 28,161,
+ 71,194, 11,179, 30,164,191, 80, 38, 11, 0,242,242,242, 54, 3,216, 44, 8, 66,150,133,133, 5, 74, 74, 74,106,219,255,204, 34,
+ 34, 34,204,228,114, 57, 94,125,245, 85,251,176,176,176, 88,154,166,215,166,167,167,215,233, 56,106,235, 38,172,173, 59, 17, 79,
+ 81,117,104,167, 66, 72, 80,207, 14, 86,247,109,150, 88,153, 73,180,183,155,196,154, 89, 83, 0,138,116,206, 9, 87,147, 70, 21,
+ 83,217,138,246, 29,251,188, 4,107,137, 69, 72, 33, 87, 82,171,209,162, 25,230, 86, 81, 65,225,128,226, 18, 61, 46, 95,137,196,
+232, 81, 45,160, 51, 80, 16, 4, 26,165,106, 29,192, 72, 65, 3, 24, 51,118, 2, 8, 37, 65,126, 86, 58, 24,134,137, 0,199,225,
+ 5,227,147,233,211,167, 15,152, 63,127,126,211,121,243,230, 97,222,188,121,222, 91,183,110,221,188,108,217,178,121, 57, 57, 57,
+109,209,192,224,227,245,232, 52, 57,190,247,179, 57, 71, 47,109, 42, 26,212, 77,243,224, 37,191,242,200,215, 75,126,200,151, 74,
+241, 80,194, 32,143,144,154,105, 70, 33, 33, 33,189,171,207,159, 51, 30, 79,130,175,122,110, 84,142, 86,139,166,238,175,117,104,
+ 31,240,222,130,249, 11,172,162,175,158,199,199, 95,172, 35, 45, 59,246, 43,217,124,233,150,190,212,194,103, 64,105,238,195, 43,
+198,250, 11, 0,120,237,229,225,104,215,186,243, 19,111,246,232, 83, 62, 88,251,229,115, 55,144,149,147,102,244,201,182,194, 28,
+212,154,147,101, 76, 73,255,227,104, 52,154,194,200,200, 72,167,212,212,212, 26,137,239, 62, 62, 62,160, 40, 10,225,225,225,184,
+126,253, 58, 70,143, 30, 13,137, 68, 2,169, 84,138, 11, 23, 46,152, 20,141,169, 22, 93,170,172, 58,236,239,225,225, 81, 87,181,
+ 97,131, 90, 26,141, 6, 69, 69, 69, 56,125,250, 52, 90,180,104,129,101,203,150,193,205,213, 25, 11, 22,204,129, 32, 8, 40, 46,
+ 46, 6,207,243,198, 70,180,132,202,104,145, 32, 8,200,201,201, 65,211,166, 77,177,126,253,122,172, 89,179,102,105, 70, 70,198,
+ 49, 83,151,209,211,211,211,150,231,249, 15, 7, 13, 26,212,111,232,208,161,232,223,191,230,120,172, 63,255,252,179,213,161, 67,
+135,150,127,247,221,119,175, 25, 12,134, 21,217,217,217, 57,198,232,254,248, 99,249,240, 75,202, 46,139,240,241,200, 38,120,115,
+198, 14,172, 90,117, 24, 10,133,162,198,137,119,201,146, 37,245,154, 24,129,144,150,178,220,171,233,115, 62,250,198,105,249,242,
+ 48,132,133,101,131,166,105,184,186,186,130,166,105, 60,122,244, 8, 52, 77,195,219,219, 27, 52, 77, 35, 45, 45,173, 50, 39,176,
+ 0,181, 84, 61,214,126, 21, 78, 67,171,213, 34, 37, 57, 17,169,113,177,176, 44,206,132,202, 90,137,130,123,119,209,110,242,148,
+170,241,159,254,101,118,233,245,250, 93,213,158,127,115,252,248,113, 61, 69, 81,175,163, 60, 79,163, 50,162,177,148,227,184,165,
+117,137,116,233,210,165,253,252,249,243,165,149,195,109,184,121,125,201, 25, 12, 6, 1, 0,252,218,245,170,225,246, 31, 62,124,
+136, 85,171, 86, 65,173, 86, 67, 38,147,201,140,217, 14,130, 32, 84, 85, 24,214,102,194, 76, 49, 89, 0,224,224,237,241,125,248,
+205, 11,252,157,184, 77,154,136,251,191,154,103, 36,211,160,245, 47,174,201,122, 60,178,229,225,225,177, 72, 16, 4, 66, 8,249,
+172,218, 91, 10, 47, 47,175, 75,103,206,156,113,224, 56, 14,223,125,247,157,109,102,102,166,109,175, 94,189, 62, 6, 80,167,209,
+170,173,155,176,182,238, 68, 84,171, 58, 84, 40, 20,246,122,125,157,193,147, 39,170, 14,121, 30,190,214, 86,182, 40, 64, 42,116,
+142,108,251, 66, 7, 46,255,108,198,148,219,110, 73, 29, 90, 91,240,108, 83,186, 88, 15,119,165, 45, 4, 66,234, 44,141,214,177,
+236,175,183,111,222,122,213,203,179, 5,115, 44,244, 34,134, 12, 27, 9,157,142,134,150,165, 64, 49, 82, 80,140, 12,109,219,117,
+ 64,171, 54,237, 64, 0,220,248,227, 42,167,103,217,179, 47, 82,219,187,118,127,119, 52, 69, 97, 45,136, 64,106, 25, 71,171,233,
+176, 97,195,150, 3,120,175, 33, 29,167, 46,239,142,166,233,114,157,234,227,104,125,240,238,116,220,251, 67,106,115,241,230, 74,
+ 89,255, 46, 56,145, 19, 70, 65,105,246, 87,213,161,148,126,170,161, 57,158, 23,195,213,176,209,242,244,244,180,181, 86,152,253,
+248,206,228, 73, 86, 73,119,174, 33, 51, 42, 28, 87, 46,198, 22,236, 59,116, 56, 95,157,151, 61,217, 4,147, 85,213,205,231,224,
+210, 4, 62,254, 79, 26, 45, 51, 75, 21, 0,192,199,191, 51, 24, 11,211,134, 17,170, 45,154,213, 24,147, 85,253,128, 93,219, 24,
+ 90,211,166, 77,195,214,173, 91,209,189,123,119,180,108,217,178,234, 96,111,106,212,172,150,232,146,201,213,134,213, 41, 41, 41,
+129,183,183, 55,182,108,217,130,136,136, 8, 88, 89, 89, 97,244,232,209, 40, 41, 41,169, 50, 88,198, 38,195, 19, 66, 30,158, 57,
+115,166,211, 27,111,188, 65,164, 82, 41, 85, 88, 88, 8, 91, 91, 91,172, 95,191, 94,157,145,145,113,162, 17, 38,107,164, 76, 38,
+155, 51,106,212, 40,198,207,207, 15, 89, 89, 89,176,182,182,102, 41,138,146, 2,128,173,173, 45,107,110,110,142,233,211,167, 35,
+ 48, 48,176,231,188,121,243,186, 75, 36,146,245,233,233,233, 59,234,219,151, 40,138,170, 58,161, 78, 94, 27, 3,189,190,252, 4,
+189, 97,195, 6, 84,228,186,253,213, 69, 16, 23, 7, 24, 81,201, 98,105,105,137,150, 45, 91,214,218,246, 61,123,246,196,141, 27,
+ 55,202,187, 38, 37, 18, 56, 57, 57,225,202,149, 43, 70, 85, 82, 85, 14, 4, 25, 25, 25, 9,127, 31, 71, 68,132,157,129,163, 82,
+138, 64, 55, 23,120,244,236,141,216,216,216,127, 51,154, 69,161, 60, 15,163,111,197, 62,184, 13,192,180,106,207,215, 3,248,222,
+ 20, 65,142,227, 8, 77,211, 84, 74, 74,138, 65,169, 84, 82,246,246,246, 18,133, 66, 1,157, 78, 87,101,184, 30, 62,124,136,208,
+208, 80,164,166,166,194,222,222,158,182,177,177,129,193, 96, 40, 48, 70,223,215,215, 23, 46, 46, 46, 53, 18,223, 39, 79,158,220,
+ 40,147, 53, 17, 8,216,250,229,138, 38, 10,154,177,241,119,124, 13, 9, 49,143,180,180, 30,102,255, 11, 38, 11, 0, 10, 11, 11,
+ 55, 3,216, 92,249,220,209,209,241, 45,134, 97, 22,232,116, 58,155, 11, 23, 46,216,170, 84, 42,106,199,142, 29,236,103,159,125,
+ 86,200, 48, 76, 1, 69, 81,171,255,125,115,136,168,220,162, 56,111,169,157,155,112, 71, 75,174,190,159,242,113,171, 2,105, 11,
+ 21,213, 38, 0,195,178,163, 47,191,197,197,117,203,202,200,164, 9,132,168,122,142,193,219, 62,158,191,228,195,216,152, 91, 94,
+102,214,102,152, 54,125, 62, 78,156, 58, 7,138,150,226,210,213,112,232, 13, 60,114,243,139, 48,106,204, 56,120,184, 58, 34,234,
+250,233, 28, 78, 16,214,191, 88, 38, 91, 88,247,234,144,183,236, 20,230,202,138,109,194, 99,215, 15,115, 64,211,107,177,112,225,
+ 66, 4, 4, 4,204,136,140,140,252, 28, 13,140,163, 69, 81,194,186,182,189,199,216,201, 20,229, 58, 68,224,177,229,192,199, 21,
+227,104,205,198,250,205,135,218,182,241, 73, 88, 92,223, 56, 90, 47,144,201,170, 62,175,223,104,121,123,123, 43, 44,164,152, 42,
+101, 36,243,222, 25, 59, 84,149, 29,119, 15,169,209,183,202,187, 23, 12, 26, 67,230,131,104, 99,134, 66,239,139,154,227,119,144,
+250,186,174,180, 90,163,174,232,107,104, 86,158,112, 31,143,102,153,104,178,158,208,172,110,182,170,143,155,229,233,233,137,229,
+203,151, 27, 51,142,214,227,235, 94, 73,127,148, 39,192, 87, 79,134,239,111,164,201,170, 85, 83,165, 82, 6,231,135, 96, 0, 0,
+ 32, 0, 73, 68, 65, 84, 33, 47,175,124,132,132,224,224, 96, 4, 7,255, 85,207, 96, 48, 24,170,162, 88, 86, 86, 86,181, 69,180,
+158,208, 52, 55, 55,255,248,240,225,195,147,174, 94,189,250,198,220,185,115,165,175,188,242, 74,165,153, 43,131,113,247,118,171,
+161,201,243,252,244,211,167, 79, 51,130, 32, 96,203,150, 45,184,113,227, 6, 81, 42,149,159, 42,149,202,117,230,230,230,188, 70,
+163,153, 54,101,202,148,113,139, 23, 47,166,123,246,236,137,107,215,174,209, 77,155, 54,157, 0,212, 24,196,178,214,117, 15, 15,
+ 15, 7, 77,211,224,242,147, 49,227,227,125,176, 48,151, 32, 38, 38, 6,249,249,249, 79, 12, 98,106,204,246,172, 30, 41,169,156,
+122,246,236, 89,213, 13, 25, 20, 20, 4,134, 97,112,251,246,237,186,186, 97,171,107, 18, 7, 7,135,170,253, 67, 38,147,225,220,
+185,115,248,226,139, 47,224,101,111,139,130,232, 8,184, 4,191,140,126,147,166, 96,244,232,209, 96, 24, 6,246,246,246, 85,145,
+ 95, 35,246,165,167,161,186,230, 36,127,127,255, 9, 81, 81, 81, 30,109,219,182,117,141,140,140,236, 19, 16, 16,224, 29, 17, 17,
+ 81,249, 92, 1,227,114,115,170, 52,255,252,243,207,131,235,214,173,155, 62,113,226, 68,153, 32, 8,124, 82, 82, 18, 11,128,114,
+113,113, 97,254,252,243, 79,225,216,177, 99,208,104, 52,240,240,240,160,221,221,221,169,179,103,207, 10,209,209,209,225,132,144,
+249,198,172, 59,207,243, 53,134,113,168,124,252,243,207, 63,155,252,127,111,210,202,119,217, 43,189,252, 60,115,211,111, 35, 35,
+ 45, 14,124,145,202, 16,122,228,184,206, 68,147,245,119,183,209, 63,169,185,228,193,131, 7,238, 58,157, 14,114,185, 28, 27, 54,
+108, 48, 44, 95,190, 60, 42, 55, 55,183, 7,106,175, 40,175,161,217,200,170,195,252,122, 52,159,168, 58, 44,202,195,137, 35, 71,
+255,236,100, 57,108, 27,102,164,231, 84, 37, 54, 18,138,178, 63,236,220,186,135,178,115,219, 52,250,228, 34,186,132, 47, 59, 81,
+207,186,235, 53,122,253,200, 97,195,199,252,182,119,239, 30,203,207, 22, 45,194,149,240, 8,228, 21,150, 66, 32, 12, 4,138,194,
+130, 5,159,193,197,209, 30,197,233, 15,202,116, 6,195, 48,212, 28, 67,235,185,111,119,138,162,103,158, 61,182, 99, 45, 77, 65,
+ 80,103,221, 87, 48, 37,113,202, 55, 71, 15,147,140, 28, 57, 18,135, 15, 31, 70,100,100,228,166,122, 76, 86,149, 38, 33,244,204,
+136, 11,251,214, 82,128,160,201,185,175,144,148, 38, 40, 39,140, 29, 38, 25, 61,122, 52,126, 9,189,138,189,199, 19, 54,238, 61,
+142,227,120,177, 49,125,100,120, 43, 9, 34,123,180,110,230,222,179, 67, 27, 51, 9,175, 65,106,116, 28,242,213, 90,156,189,151,
+ 84, 72, 19,186,209, 99,235,148, 31, 32,101, 72, 78,126, 80,203,149,149, 89,197, 9, 93,107,146, 38, 77,211, 53,162, 89, 79, 19,
+201,170,190,156,206,206,206, 53,110,231, 82,253,196, 93,153, 3,212,136,161, 29, 62, 78, 78, 78,182, 78, 78, 78, 6, 33, 4,225,
+225,225,214, 65, 65, 65, 31, 63, 77, 52,107,206,156, 57, 85, 81,171,199,231,181,189,214, 16, 21, 73,233,107, 88,150, 61, 48,111,
+222,188, 25, 65, 65, 65,175, 46, 90,180,136,130, 9, 55,224,125, 44,154,195, 9,130,128,243,231,207,227,240,225,195,188,193, 96,
+152,154,145,145, 17, 81,237, 35,223,221,188,121,243,236,240,225,195,119,220,191,127,159,137,138,138, 2, 33, 13,215,157,106, 52,
+ 26,180,108,217, 18, 28,199, 97,229, 12, 79,148,148,180, 5,199,113,224,121, 30, 22, 22, 22, 85, 81,188,234,230,185,161,253,136,
+231,249, 39,140, 86,120,120, 56, 24,134, 65,143, 30, 61,112,235,214,173,170,136, 86, 67, 17, 40,131,193,144,236,236,236,236,188,
+100,201,146,170,229,202,201,201,193,153, 51,103,208,165,107, 55,180,158, 58, 13,233,233,233, 88,189,122, 53,220,220,220,176,108,
+217, 50,228,231,231,131,227,184,127, 58,156, 62, 32, 42, 42,202, 99,236,216,177,217, 17, 17, 17, 30,161,161,161,182, 33, 33, 33,
+ 22, 99,198,140,201,142,136,136,240,160, 40,170, 27, 76, 76,130, 22, 4,225,147, 5, 11, 22,156, 90,182,108,217,199,239,189,247,
+ 94,208,196,137, 19,165, 82,169, 84, 72, 75, 75,227,246,236,217, 67,181,108,217,146,150,201,100,212,233,211,167,133, 63,254,248,
+227, 58,199,113, 43, 1, 92, 50, 37,226, 92,221,100, 49, 12, 99,172,201,170,193,251, 78,138, 9, 86,116, 78,143,117, 27,150,211,
+126, 62, 30,134,157,123,206,164, 92,186,246, 32,158,209,113,239,255, 88,207,208, 0, 47, 50, 12,195,236,247,247,247,127,107,230,
+204,153,230,253,251,247, 87, 44, 94,188,184,168,164,164,164, 46,147, 85,203, 5,243, 63, 82,117,248,195, 39,115, 67,223,255,160,
+237, 91,205,254,227,210, 4, 97,234,108, 20, 72, 24,218,218,150, 70, 7,111, 6, 37,185, 15, 85,199,127,219,254, 8, 64, 67,227,
+178,253,121,243,110,100,223, 54,109,219, 31, 90,185,108,165,211,167, 31,205,147, 30, 10,253, 21,132, 51, 32,252,194, 5, 88,202,
+120, 18,125, 51, 44, 75,103,208, 15,197, 11,120, 11,158,140, 43,223,239, 5,112,212,222,222,254,206,164,137, 19, 91,250,251,143,
+129, 82,169,196,193,131, 7,177,235,187,239,248, 53,192, 27, 10,224,214,244, 6,198,211,203,190, 94,165,115,123,202,164, 73,190,
+ 29, 58,252, 7, 74,165, 18, 7, 14, 28,192,142, 53,107,140,214,121,206,169, 28, 25,254, 4,254, 26, 33,190,129, 28, 45,154, 42,
+185,254, 32,169, 52,252, 65, 82, 41, 4, 66, 4, 66,116, 52,141, 20,181,193,176,236, 65, 66, 90,163, 76, 65,101,215,225,210, 47,
+103, 62,187, 62,143,106,230,167,177, 37,221,181,152,172,212,234,247, 72,171,126,146,174,235, 49,203,178,169, 70,202,175,240,242,
+242,122,226,181,198,135,126,137, 73, 38,203,216,113,180, 0, 32, 47, 47, 47, 3,192,167,215,174, 93,251,249,213, 87, 95,157, 2,
+ 32,173,145,109,180,165,119,239,222, 83, 1, 48, 20, 69,109, 74, 79, 79,143,120,226, 15,159,145, 17,235,230,230,246,181,143,143,
+207,180,242, 11, 83,106, 75, 3, 39,242,132,182,109,219, 26,106,107,139,186,158, 11,130,208, 96, 27, 21, 22, 22,162,115,231,206,
+ 79,220,211,146, 16,130,164,164,164,202,136, 83,213,182,175,207,192,149,150,150, 78,123,247,221,119, 55, 75,165, 82, 47, 0, 84,
+165,201,229,121,158,249,254,251,239,205,120,158,103, 0, 80, 52, 77,115, 82,169, 84,123,248,240, 97,142,227,184,100,157, 78, 55,
+237, 31, 62, 64, 28,160,202,111,197,160,142,138,138,242,171,136,100,165, 70, 70, 70,222,222,187,119,175, 10,192,190, 70,234, 94,
+ 42, 43, 43,187,180,124,249,242,158, 27, 54,108,248,100,218,180,105,157, 71,143, 30, 45, 9, 14, 14,198,137, 19, 39,248,243,231,
+207,135,107, 52,154, 21,166, 24,172,138,182, 44,242,244,244,172, 50, 92, 13,252,151,235, 77,228,117,240, 86,172, 27,247,182,155,
+217,150, 21,103, 74,115,211,245, 87,217, 82,253,252,237, 64, 36,254,135,201,202,202,154, 11,224,179,213,171, 87,167, 7, 6, 6,
+ 42,100, 50,153,222, 88,147,245, 15,194, 9,133,165, 3,191,237, 55,226,104,239, 5,239,250,244,235,211, 67,233,217,196,201, 61,
+ 58, 46, 11, 15,175,157, 80,223, 57,254,101, 34,209, 21, 12, 1, 96, 76,230,250, 31, 58,131,161,197,156,121,115,102,200,165,210,
+ 87,121,158,111,247,202,217, 35,132, 97,152, 8, 61,203,158,173,232, 46,212,190,192, 77,190,244,235,175,191,110,233,239,239,143,
+131, 7, 15,226,236,238,221, 24,149,155,139,115, 12,195,208, 50,153,195,113,131,225, 27, 24,103,144,150,174, 90,181,202, 55, 32,
+ 32, 0,251,247,239,199,233, 29, 59,240,255,236, 93,103, 88, 20,201,218, 61, 61, 57,146, 36, 11,136, 24,128, 69, 49, 98, 90,113,
+ 49, 99,118,205,113,205, 57,103, 92,117, 13,107, 14,107, 90,149, 85,215,128, 57,187, 98, 22,179,152, 5, 65, 17, 84, 50,195,144,
+135, 48,121,166,167,251,251, 65,184,168,132, 1,221,187,247,126,119,206,243,244, 51, 51, 29,206, 84, 87, 85, 87,157,126,171,234,
+125, 7, 87,143,167,188,190,174, 5, 0,219,162,159, 89, 0,162, 1, 52, 7, 32, 0,160, 65, 97,104, 39,155,210, 93, 88,209,177,
+226,227,247, 9,130,248, 59, 39,194, 86,238, 25,254,115, 68,126, 72,104,254,173, 83,161, 82,169,114,220,221,221,171,180,230, 90,
+175,215, 87, 56,134, 75,146,100, 74,221,186,117,141,182, 90, 24, 35,138,114,114,114,124,254,198,194,248,170,185, 88,159,116, 34,
+ 20,149,224,232,232, 72, 21,119,250,101,137,176,178,246,209, 64,124, 85,254, 39, 45, 45, 45, 26,192,220,234,166, 51, 53, 53,245,
+ 44,140, 8, 26,109,236,121, 0, 32,147,201,190,121, 48, 95,130,166, 37, 43, 86,172,168,146,192, 6, 77, 87, 36, 62, 35,228,114,
+121, 43, 99,254, 91,167,211,225, 31,196,169,162,141, 17, 25, 25, 57,129, 32, 8,127, 20, 14, 9, 4,226,219,120,243,126,144,159,
+159,255, 96,227,198,141,237,246,238,221, 59,155,166,105,228,231,231,111,171,170,192, 42,121,123,206,200,184,252,173,110, 60, 39,
+ 93,123,251,120, 96, 74, 71, 85,174,110,246, 62,185,246, 48, 76, 40, 49, 70,209, 52,125,112,228,200,145,173, 1, 28,250, 90,178,
+114, 86, 29,126, 45,226, 41, 89, 94,147, 59,243,126, 29,123,199,210,172, 39, 12, 44, 79,104, 25,151,160,205,190, 12,224, 0,140,
+155,230, 80,114,191, 36, 69,109, 33,181,218, 45,165, 58,151,255,133,114,174,225,237,237, 61,123,204,152, 49, 88,182,108, 25,174,
+111,222,172,155, 66, 16,121,108,128,190, 86,248,162,201, 32,128, 69,198,242,140, 26, 53, 10,203,150, 45,195,149, 13, 27,170,203,
+ 83, 17,108, 9,130, 8, 6,128,128,128,128,159,215,173, 91,103,181,120,241,226,198,235,215,175, 95, 91,244,251, 77,241,241,162,
+190,174,215,226,197,139, 27,150, 58, 94, 0,224,249,223,156,159,101,122,134,255,187,209,217,196,105,226, 52,113,154, 56, 77,156,
+ 38, 78, 19,167,137,243,107, 64,211,116,207,194,143,242, 63,203,251, 94,234,243, 31, 1, 11, 38,152, 96,130, 9, 38,152, 96,130,
+ 9,255,133, 40,109,197,170,206,241,111,136,226, 57, 90,165,177, 23, 40, 92,214, 93,158, 42,173,202,170,135,234, 40,219, 91, 38,
+ 78, 19,167,137,211,196,105,226, 52,113,154, 56,255,231, 56, 43,227,254,226,122,154,166,123, 18, 4, 17, 76,211,116,175,242, 62,
+139,133,213,231,223, 75,125,126,179,105, 7,101,160,120,110,214, 23,115,180,254,110,152,204,170, 38, 78, 19,167,137,211,196,105,
+226, 52,113,154, 56,191, 10,197, 67,128, 0,232,128,128,128,197,255,129, 67,135,142, 69, 34,171,244, 6,160,130,161, 67,154, 62,
+205,148, 72, 96,206,229, 10, 57, 0,160,213, 42,117, 78, 78,200, 39,136, 65,255,100,192, 91, 19,254, 59, 81,188,220, 59,253, 27,
+159,107,130, 9, 38,152, 96,194,255, 6, 50,139, 45, 85, 0, 50, 1, 16, 69,191,181, 69,159,153, 69,130,236,243,239,159, 28,255,
+ 27, 33, 69, 57,150, 44, 86,121, 34, 43, 43, 75,104,195, 98,201, 60, 12, 6,245,119, 0,192, 98, 49,222,101,101, 89,197,208,244,
+233,172,234,136, 45, 27, 59,187,151,108, 38,211,201,152,115,245, 6,131, 36, 43, 61,253, 83,215,241, 4,241,255, 65,224, 25, 43,
+ 34,190, 70,108,252,237, 66,197,198,198,198,222,222,222,190,143,185,185,121,155,220,220,220,103,153,153,153,231, 43,136,123,184,
+142, 32,176,176,176, 94, 97, 35,128,197, 21, 80, 87,229,220,207,225, 46, 20, 10,167, 18, 4,225, 93,244,128, 69, 42,149,202,221,
+ 0,222,255, 15, 54, 72, 2, 0, 63,178, 88,172, 81, 54, 54, 54, 45,211,210,210, 86, 0,168,174, 55,111, 22,128,121,150,150,150,
+ 67, 44, 45, 45,235,230,228,228,196,230,231,231,159, 2,176, 5, 64,165, 75,165, 87,204,116,108,211,222,191,253,210,187,215,239,
+174, 94,177, 67,250,248,139,227,243, 28,173,187,118,105,187,236,238,165,208, 85, 63,239, 74,205,169, 98,218, 24, 69, 27, 80,184,
+ 58,146,198,151,206, 94,191, 22,108, 0,189, 1,180, 7,112, 23,192, 37, 99,238,187, 28,180, 6,240,115, 81,154,183, 0,184,243,
+ 31, 94,143, 68,246,246,246, 27, 0,244,102,177, 88,111, 37, 18,201, 68, 0, 41,255,112,154, 88, 0, 90, 0,240, 70,161, 27,142,
+231, 48,206,133, 67,165,176,182,182,238,197, 98,177,166, 22,185,118,217,157,157,157, 29,252,159, 90, 48, 92, 46,119,155,131,131,
+195,120,149, 74,165, 36, 8,130, 46,237,239,145, 36,201,148,172,172, 44,159,255,111,141, 26, 65, 16,207,255,195,147, 56,177,140,
+125,229,251,209,146, 72, 96,206, 98,201, 60, 50,210, 34,134,164, 74, 95, 15, 6,128,154,142,141, 79,217, 57, 52, 58, 41,145,112,
+117, 14,158,253,196,108, 33,107, 55,147,201,110,170,214,106,108,216, 44,118,150,142,212,135, 49,180,244,212,180,232,243,101, 58,
+ 91,100, 51,153, 78, 9, 49,119,236, 72, 93, 14,216,252,154, 96, 11,106,149,155,218,154, 53,107, 86,235, 46,173,172,234,154,233,
+120,252,217,108, 54,179, 11, 69,147,222, 52, 5, 48, 8,118, 36,105,208,135,112, 52,154,223,100,178,216,130,234,230,160,167, 53,
+ 28,104, 96, 40, 8,116, 1,141,155, 4,112, 34, 58, 27,105, 85,160, 48, 86, 68,124,141,216, 40,125,237, 86, 0,243,191,117, 77,
+114,114,114,178,234,213,171,215,182, 95,127,253, 85, 32, 22,139,137,164,164, 36,255, 69,139, 22,253,240,226,197,139,185, 18,137,
+ 36,245,115,209, 71, 16, 88, 72, 81, 52, 3, 0, 24, 12, 98,145,173,173,157,144,201,100,126,225,219,200, 96, 48, 8, 51, 51, 51,
+166, 83, 20, 77, 20,157,187,144,166,177,221, 24,193,200,231,243,135,121, 55,106, 58,119,195,166, 45, 98,123, 59, 59, 17,105,160,
+116,241,137, 9,194,165, 1,243, 91,125,252,240,126,187, 90,173, 62, 94,157,231,154,201,100, 14,225,241,120,189, 0,120, 21,237,
+139,210,104, 52,193, 6,131,225,164,177, 29,186,189,189,253,125, 38,147, 89,187, 42,127,108, 48, 24,146,210,211,211,125,171, 89,
+ 68,131,106,213,170,117,192,207,207, 79,216,178,101, 75,112,185, 92, 44, 91,182,108,158, 84, 42,173, 76,104,177, 0,204, 19, 10,
+133, 67, 68, 34, 81, 93,185, 92,254, 81,165, 82,157,229,114,185,157,183,111,223,238,210,182,109, 91,179,244,244,116,130,201,100,
+218, 95,185,114,229,167,109,219,182,249,147, 36,217,169,178, 78, 46,239, 35,189,148,215,219,171, 93,222,199, 59, 75, 1,116,255,
+252, 56,169,230,143,162,153, 46,189, 84,244,171,228, 34,241, 97,180,200, 98,179,217,219, 29, 28, 28,198,168, 11,125, 5,208,159,
+119, 56, 0,160,213,106,101,185,185,185,158,213,121,228, 1,140,179,180,180, 28,179, 96,193, 2,171,238,221,187,227,232,209,163,
+211,246,237,219, 39,203,207,207, 63,136, 66, 71,152,209, 85,228, 92,152,150,150,214,131,205,102, 19, 46, 46, 46, 76,149, 74, 85,
+ 21,161,229,129,194, 32,204,207, 1,236, 70,161,235,130, 14, 64,225,243, 14, 96, 99,177,112, 99, 48, 24,187, 61, 61, 61,251, 68,
+ 69, 69,237, 1,176,186,186,207,186,131,131,195, 31,187,118,237, 26,220,183,111, 95,102,102,102,166, 83,147, 38, 77,142,165,165,
+165,181,251, 6,205,200, 88, 30,143, 55,167,113,227,198, 13,162,163,163, 99,242,243,243,183, 20,229,103, 69,207,148, 51,128,206,
+150,150,150,157,150, 44, 89, 34,238,213,171, 23,246,238,221,219, 99,223,190,125,242,130,130,130, 16, 20,206,233,249, 42, 17,200,
+ 98,177,166,166,164,164,216,208, 52, 13, 71, 71,199,169, 0,254, 35,133, 22,131,193,216,222,191,127,255, 49,199,142, 29, 19, 38,
+ 36, 36, 8,157,156,156, 74,156,103, 19, 4, 81,237,254,211,132,175,198,222, 82,130,171,114, 63, 90, 92,174,144, 99, 48,168,191,
+ 75,149,190, 30,252,131,223, 78, 11, 0,184,127,111,198, 96, 59,135,134,145, 92,174, 48,134,103,206, 63,215,191,119,231,166, 3,
+123,249, 17,206,142,118, 72,145,102,216,255,121,226,122,183,224,235,119,206,161,208,129, 88,153, 32,117, 57, 16,232,110, 33,250,
+225, 14,216,180, 79,197,239, 87, 82,240, 56, 60, 30,202,188, 44,212,118, 16, 96,211,236,174,112,176, 18, 86,239,213,203,206,189,
+ 3,201,226,157, 28, 62,108,164, 69,159, 31,189,216,174, 14, 14,160,105, 30, 98, 62,202,191,191,122,227, 78,139,179,167,143, 79,
+ 21,177,221,135, 40, 50,222, 27,221,184, 53,115,132, 64,161,195,143, 44, 38,241, 83, 91,159, 6,157,134,245,104,199,104,224, 85,
+ 31,111,223, 68,117,189,120,251,233, 38, 70,232,155, 16,210, 64, 7,137, 56,184,240, 74, 90,161, 67,191, 47, 4, 71,167, 78,157,
+219,241,120,188, 79,156, 39,105, 52, 26, 78, 72,200,173,214,213, 17, 27,197,255,161,213,106, 24,108, 54, 23, 12, 6, 49,215,219,
+187,145, 87, 86, 86,214, 29,130, 32, 14,164,166, 86,205, 90, 48, 3,224,202, 88,172,230, 12, 30,207,209,160,213, 90, 3, 0,193,
+229,202,226, 25,140, 70, 75,126,254, 89,204,100, 50,169,236,236,108, 40,149, 74, 98,194,132, 9,252,143, 31, 63,246,151, 72, 36,
+ 59, 42,121, 35,193,190,125,251, 60, 28, 29, 29,191,136, 30, 43,149, 74,185,125,251,246,169, 78,209,123, 52,110,210,108,206,245,
+235,215,188,242,115,100,234,125, 91,255,120,169,231, 11, 53,117,188, 60,217,187,247, 30,182,152, 56,102,196,140,119,239,222,132,
+161,106,241,234,106, 9, 4,130,115,155, 55,111,246,238,208,161, 3,219,206,206, 14,233,233,233,136,138,138,242,190,125,251,246,
+143,135, 15, 31,158,167, 82,169,250, 3, 70, 5, 68,117, 15, 9, 58, 96, 39,170, 97, 13,131, 94,143,154,141,155,149,248, 55,251,
+112,251, 6, 72,157, 14,148, 94, 15,175, 94, 63, 22, 89,147,105,120,121,121, 85,215,235,110,205,134, 13, 27, 30, 89,187,118, 45,
+ 71,163,209,224,233,211,167,184,115,231, 14, 37,149, 74, 43,115,136,203, 34, 8,226,198,242,229,203,157,125,125,125,205,178,178,
+178, 96, 48, 24,108, 46, 92,184, 48,181,105,211,166,230, 46, 46, 46,220,160,160, 32,200,229,114,144, 36, 89,163,110,221,186, 53,
+134, 13, 27,166, 13, 10, 10,154, 7, 96, 67,121,150,172,252,143,244, 82, 41, 81,183,155,103,243, 81, 72, 35,174,117,155,211, 13,
+ 87,205,235, 17, 37,150,173,110,117,235,154,229, 75,132,139,196,230,141,106,228, 75,110, 45,234, 86,183,238,190,107,177, 70,189,
+ 12, 49,138, 58,155,225, 39, 78,156, 16, 70, 69, 69, 9,189,188,188, 64, 81, 84,137, 7,254, 98,135,179,238,238,238,213,201,199,
+245,147, 39, 79, 94, 52,120,240, 96, 52,110,220,184,196, 41,234, 47,191,252,130, 69,139, 22, 89,221,191,127,127,222,241,227,199,
+231,157, 63,127,126, 3,128,128, 42, 90, 99,138, 81,213, 50, 94, 25, 23, 23, 55,232,220,185,115, 35, 22, 46, 92,232, 14, 96, 58,
+128,101,217,217,217,126, 69,214, 24,110,145,208, 26, 59,111,222,188, 41, 1, 1, 1,232,209,163,199,178,167, 79,159,174,169,166,
+149,143, 73,146,100,143,190,125,251, 50,245,122, 61, 68, 34, 17,244,122,125,189,175, 53, 74, 0,216, 53,105,210,164, 41,147, 39,
+ 79,134,149,149, 21,244,122,189,199,137, 19, 39,246, 45, 91,182,172, 13,128,113,229,164,117,212,148, 41, 83, 6,140, 28, 57, 18,
+ 62, 62, 62, 96,177, 10,179,113,243,230,205, 88,181,106,149,248,198,141, 27, 63, 6, 5, 5,253,120,241,226,197,179,248, 52,108,
+ 87,149, 64, 81, 20, 88, 44, 22,146,147,147, 97,103,103,199,163, 40,234, 58, 65, 16,123,115,114,114,206,255, 7,117,230, 27, 7,
+ 13, 26, 52,252,216,177, 99, 98, 0,216,180,105, 19,230,204,153, 3,123,123,123,136,197, 98,147,212,249,207,177,104, 77,172,212,
+162, 85, 25,148, 74,101,179,197, 51,127, 2,131, 81,248,214, 88,191, 78, 45,172,251,121, 34,113, 49,248,122,179, 10,109,240,252,
+154,136,126,184, 3, 60,151,217,208,232, 73, 60, 9,143,195,205, 77,254,133,189,101,247, 37,208,232, 58, 21,119, 54, 53,184, 2,
+193, 70,173,193,240, 8, 14, 14, 79,145,152,152, 89,153,200,178,117,176, 15, 14, 12,220, 32,240,174,231, 9, 29,169,135, 36, 67,
+ 2,130,224,193,217,201, 12, 99, 71,117,103,251,249,213,180, 89,185,242,143,203,105, 20,250, 41,179,222, 87,234, 48,212,195, 6,
+135,154,121,187, 15, 30,214,211,151,215,200,187, 33, 56, 60, 65,201,177,230, 62, 62,104,238,227,195, 8,144, 23,116,121,246,252,
+101,151, 51, 55,158,104,148,250,196, 83, 49, 89, 24, 93, 73, 35, 83, 34, 56,102,205,154, 5,123,123,251, 79, 78, 72, 79, 79,199,
+237,219, 33,101, 94, 83,133,134,172,228, 63,214,172, 89, 99, 38,147,201,186,239,223,191,191, 35, 69, 81,107,210,210,210, 30, 26,
+ 67, 50, 18,168,157,199,227,117, 26,179,101, 11,213,180, 79, 31,166,165,131, 3,131, 50, 24,136,212,216, 88,235,173, 59,118,180,
+207,249,240, 65,160,168, 81, 35, 71,166, 82, 41, 99, 98, 98,192,231,243, 9, 22,139,213,162, 12,170,116,154,198, 70, 6,131, 88,
+ 68, 16, 4,120, 60,126,204,228,201,147, 95, 21, 29,171,125,233,210, 37, 97,239,222,189,149, 0, 18, 0,128,199,227, 59, 49,153,
+ 12,143, 66, 79,236,216,104,140,192, 20,137, 68, 51, 87,175,221, 32,202,207,201, 85,233, 20, 10,189,173,185,152, 32,196,102,204,
+252,188,130, 2,137, 52, 83,179,100,197, 42,230,164,177, 35,103, 42, 20,138,169,198,138,172, 38, 77,154, 60, 59,119,238,156,157,
+181,181, 53,114,115,115,145,157,157,141,103,207,158,129,162, 40,244,239,223,159,247,125,171,150,205,126, 94,178,244,113,178, 68,
+210,198, 24,177, 37,170, 97,131, 77,190, 77, 11, 59,235,132,236,146,242,217, 59,168, 87,201, 57,171, 82,242,138,173,115, 95, 19,
+ 66,170, 77,167, 78,157, 56, 0, 48,110,220,184,252,130,130,130,117, 0,142,161,114,143,254,243,150, 46, 93,234, 84,167, 78, 29,
+215, 99,199,142, 65, 46,151, 3,128, 93,157, 58,117,224,225,225, 97,184,123,247, 46, 60, 60, 60, 96,102,102,134,251,247,239,227,
+241,227,199,240,241,241, 49,227,112, 56,131,117, 58, 93,153, 66,171,189,127,251,165,188,222, 94,237, 60,155,143,130,216,220, 17,
+251,142,159, 68,244,203,195,237, 52,186,168,165, 28,195,189,145, 42,154, 55, 58, 51, 73, 28, 80,219,199,207,186,126,195, 62,112,
+109,254,202, 70,109,120, 16,183,180, 75,157,245, 44,190,250,240,138, 45,210,236,242, 68, 22,128, 77,253,251,247, 31,116,226,196,
+ 9, 75, 0,136,136,136, 64,122,122, 58,108,109,109,193,231,243,193,102,179, 75,226,147, 86, 19,163,119,239,222, 93, 34,218, 72,
+146, 44,137, 2, 32, 20, 10,241,195, 15, 63,160,105,211,166, 56,127,254,252,232,114,132,150,111,171, 86,173,142,186,186,186,186,
+148,222,169, 80, 40, 48,116,232, 80, 0,128,159,159, 95, 39,129, 64, 64, 23, 11, 66,169, 84, 42,127,254,252,121, 23, 0, 79,203,
+ 81,150, 42,137, 68,130, 5, 11, 22, 32, 62, 62,126, 90, 96, 96, 96, 34, 0, 62,151,203, 45,121, 63, 6,224,209,176, 97,195,237,
+115,230,204,193,199,143, 31,241,246,237,219,103,168,254, 80,170, 65, 36, 18,125,208,235,245, 62, 36, 73, 66,165, 82,161, 95,191,
+126,252,179,103,207,166, 51,153,204,119, 89, 89, 89, 35, 80, 56, 39,197, 88,240, 1,108,153, 60,121,242,148,133, 11, 23, 34, 36,
+ 36, 4, 23, 47, 94,196,200,145, 35, 49,123,246,108,136,197,226, 49,179,103,207,126,140,194,128,230,159,163,211,238,221,187, 97,
+ 48, 24,190,120, 54,248,124, 62,124,125,125,209,160, 65, 3, 92,188,120,177,211, 87, 8, 45, 87, 95, 95, 95, 46, 69, 81, 80, 40,
+ 20,184,123,247,174, 88, 32, 16,136,157,157,157, 39, 0,248,143, 17, 90,174,174,174,147, 79,156, 56, 33, 46, 61,250,195,227,241,
+ 80,170, 30,152,240,207, 91,180, 42,124,195, 42,129, 86,171,212,177, 88,140,119, 53, 29, 27,159,186,127,111, 70,201,208, 33,192,
+120,167,213, 42,117, 0, 96,160,104,228, 43, 73, 8,120, 12, 36,164, 21,224, 77,108, 86, 89, 84,159, 44,209,100, 11,106,129,215,
+ 50, 1, 52, 77, 67,171, 51, 64,147,151,134,117,151,149,136, 74, 81, 67,171,144, 65,171, 43,156,134,101, 99, 99,195,186,126,253,
+234,156, 91,183,110, 79, 57,120,240, 32, 51,197,194,226,109, 1,208,172, 44, 78, 43,171,186,102, 20,151,123,106, 79,224, 50, 1,
+205,140, 69, 76,146, 2,245,157, 91,194,198,210, 5,105, 89, 10, 60,122,123, 5,239,222, 7,163,142,163, 43,102,207,236,198, 95,
+189,246,216, 73, 14,233, 86, 43, 55, 55, 62,191,188,116, 22,191, 69,253,113, 45, 6,100, 78, 44, 12,217, 31, 97, 40, 72,253,226,
+ 4,177,109, 45, 52,239,224, 4, 91,151,122,188,209,179, 87,141, 2, 62, 17, 90,165, 57,211, 9,130,177,135,193, 32,166, 16, 4,
+129,198,141,155,164,108,217,178,165, 44, 87,224,186,198,141,155,164, 48,153, 12,231,194,134,157,177,155,166,169,244, 74,210,249,
+137,168,225,114,121, 11, 11,205,254,142,201,151, 47, 95,214, 13, 26, 52, 8,155, 55,111,230, 46, 90,180,104, 9,147,201, 28, 87,
+198,240,222, 39,156,253,128, 90,150,245,234,117, 93,243,232, 17,205,214,235,137,156,103,207,242,115,165, 82, 50,173,160,128,123,
+250,221,187, 30,227,231,207,231,186,184,184,224, 97,112,176,117,166, 66, 65,231,106, 52,170,220,220, 92,154, 36,201,103,229,112,
+ 46,182,181,181, 19,238,219,183,207, 99,242,228,201,175,164, 82,233, 98, 0,112,116,116, 92, 7,160, 1,128,132, 82,251, 16, 24,
+120, 82, 50, 97,194,132,152,140,140,140,197, 21,165,179, 20, 26,218,217,218, 9,143,255, 17,244,186,134,153,128, 97,235, 92,147,
+193,182,180,100,145, 92, 1,135, 2, 84,117, 92,234,137, 0, 52, 44,231,218,207, 57, 9,129, 64,112,238,175,191,254,178, 99,179,
+217, 48, 24, 12,176,181,181, 69,124,124, 60,114,115,115, 81, 80, 80,128,184,119, 81,112,115,113,193,202,128, 69,142,211, 23, 5,
+156, 83, 42,149, 62,159,117,102, 95, 6, 64,214,235,190,176,236,149, 21,197,224,243, 97, 47, 35,203,189, 52,226,147,146,146, 32,
+ 22,139,225,237,237, 45,126,244,232,209,131, 10, 68, 86,233, 32,192,131,219,182,109,107,118,236,216, 49,248,248,248,192,194,194,
+ 2,119,239,222, 69, 68, 68, 4,116, 58, 29, 67, 46,151, 67, 44, 22, 99,253,250,245,168, 85,171, 22, 10, 10, 10,144,144,144, 96,
+205,102,179,109, 62,243,104, 95,194,121,247,250,221,213,121, 31,239, 44, 77, 35,174,117,219,119,252, 36, 38, 12, 27, 2, 7, 58,
+246,129, 69, 61, 98,117,215,222,109,127,161,153, 46,189, 68,102,141,173,220,189,123,131,195, 21, 99,250,194, 85,136,137,188,100,
+165, 44,120, 61,141, 48, 36,187,172,216,114,122, 86, 25,247, 78, 0, 96,184,184,184,140, 63,125,250,180, 89,137,233,133,201, 44,
+137,121, 88, 58, 8,124, 5, 1,223, 43,205, 79,130, 32, 16, 31, 31, 15, 59, 59, 59,136,197,226,146, 0,226, 81, 81, 81,120,242,
+228, 9,138,163, 81,148,195, 57,226,214,173, 91, 46, 34,145,232,147, 19,104,154, 70, 86, 86, 22, 72,146,132, 80, 40,132,193, 96,
+128, 78,167,131, 94,175,135, 90,173, 22, 55,104,208, 96,170, 94,175,127, 90, 22, 39, 69, 81,115, 7, 15, 30,220,246,233,211,167,
+117,119,236,216, 1,173, 86,187, 41, 45, 45, 13, 3, 6, 12, 0, 69, 81,232,212,169, 83,107,154,166,163,151, 44, 89, 2, 0,152,
+ 51,103,142, 94,161, 80, 76,174,206,189, 23,161, 65,243,230,205,235,134,132,132,160, 93,187,118,208,104, 52,216,188,121,179,121,
+ 96, 96,160,121, 80, 80,144,237,194,133, 11, 15,100,102,102,250, 87,194, 73, 0,216,228,224,224, 48,165,125,251,246,130,162, 24,
+166, 56,124,248, 48, 86,174, 92,121, 2,192,146,171, 87,175, 46,191,120,241,226,168,241,227,199, 99,229,202,149,179,115,115,115,
+247,151,199, 25, 23, 23, 7, 91, 91, 91,152,155,155, 23, 54,150, 58, 29,194,194,194,112,243,230, 77,124,247,221,119,198,220, 83,
+121,233,116,237,223,191,255,129,227,199,143,155, 37, 39, 39,227,254,253,251,112,115,115,131, 82,169, 52, 38, 54,236,173,191,161,
+195, 46,151, 83,165, 82,169,147,146,146,196, 27, 54,108,128,163,163, 35, 92, 93, 93,193,231,243, 65, 16, 4,244,122,125, 69,225,
+213, 42, 77,167,159, 31, 88, 89, 18,171,190, 22,150, 86,211,104,154,102,229,229,201,254,208, 33,247, 76,108, 44,180,255,198,123,
+255,111, 70, 51, 0,175,240,105,204, 67,105,137,208, 10, 14, 14,166,123,245,234, 69, 20,127, 58, 57, 33, 63, 43,203, 42,198,206,
+161,209, 73, 59,135,134, 69,113,191, 24,239,152, 76,171, 24,123,123,101, 62, 0,232, 72, 26,161,239,114,241,250, 67, 26, 34, 62,
+164, 65,196, 51,206,248,162,209,145,133, 51, 86,105, 26,106,249,191, 94, 90,117, 74, 25, 52,186,194,233, 30, 90,141, 18,121,153,
+111,137, 65,253,186,240,167, 76,153, 4, 71, 71, 39,219,242,248,116, 60,254,236,233,115,122, 88,214,176,100, 35,248,209, 53,180,
+254,174, 31,248, 60, 54,178,243,212, 0, 1,188,143,189, 9, 80,102,136,140, 73, 66,171,134, 66,248,119,245, 18,159, 63, 19, 61,
+ 31,192, 50, 99,210, 75,166, 60, 3,199,189, 59,216, 6, 61,244, 89,209,160,114, 19, 1,145, 3, 84,132, 24,217,210, 68,188,123,
+112,214,168,119, 70,138,162,166,217,216,216,228, 46, 89,178,164,125,253,250,245,117, 83,167, 78, 13, 79, 76, 76,156,251,217,219,
+202,111,187,119,239,198,135, 15, 31, 36,107,214,172,185,155,149,149,181,180,138, 5, 29, 64,211,216, 86, 52, 20,151,117,225,194,
+133,230,247,238,221,155,189,109,219, 54,251, 25, 51,102,112,103,204,152, 49, 22,192,175, 21, 13, 23,230,243,120,157,215,220,191,
+ 79,147, 41, 41,154, 35, 59,119,114,119,133,134, 46,209, 81, 84, 77, 27, 59, 59,226,251, 86,173, 20, 66, 6, 35, 43, 59, 61,157,
+180,173, 91,151, 25,127,243,166, 53, 45, 16,164, 94,189,122, 53, 95, 46,151,151, 27, 58,135,201,100, 42,203, 26, 46, 44, 11,142,
+142,142,218,178,230,112, 85,208, 33,230, 83, 52,173,179,172, 83,135,238,218,169, 77,253, 15,209,177,177,124, 75, 75,166,123,125,
+ 55,207, 55,239,226,159,209, 6,131,154, 32,136,124,163,198, 74,152,204, 33,219,182,109,107,100,110,110, 14,138,162, 96, 97, 97,
+129,204,204, 76,104,181, 90,228,231,231, 67, 91,144, 7,109, 94, 30, 34, 18,227,209,182,125,123, 12,234,214,213, 43,232,194, 95,
+ 67, 12, 6,195,137, 10,199,243, 26, 55, 43,177,100,173,170,109,253,175,177,160,228,220, 18,209,181,161,153, 59, 56, 98, 49,186,
+204, 13,248,154, 7,253,213,229,203,151,175,244,239,223,191,199,252,249,243, 25, 82,169,244, 90,124,124,124, 91, 0,111, 43,186,
+ 72, 44, 22,215,203,202,202,130, 92, 46,135,133,133, 5,182,109,219, 6,123,123,123, 40,149, 74, 60,127,254,156,118,118,118, 38,
+238,222,189, 11,103,103,103,100,103,103, 67,167,211, 65,165, 82,165,105,181,218,114,135,203,139,134, 7,187,207,233,134,171,209,
+ 47, 15,183,115, 34,226,158, 15,158,231,247, 33, 58,226, 93,210,141,155,143,126, 37,213,252,228,220,148, 91,139,234,180,120,101,
+ 51,109,193, 74,252,190,105, 57,162,159,222,207,177,175,149,191, 75, 64,104, 14, 85,148, 94,133, 66,161,126,247,238,157, 89,120,
+120, 56, 8,130,128,133,133, 5,132, 66, 97,153, 98,171, 26, 96,148,182, 64, 41, 20, 10,112, 56, 28, 88, 91, 91, 99,255,254,253,
+ 37, 29,175,155,155, 91, 69, 28,127,116,233,210,101, 72,173, 90,181,204, 74,239,108,209,162, 5, 38, 77,154,132, 61,123,246, 32,
+ 52, 52,244,147,120,154,105,105,105, 82,189, 94, 95,209,125,231,166,167,167,119,235,215,175,223,203, 7, 15, 30,152,239,223,191,
+ 31, 36, 73,150,185,237,219,183, 15, 79,158, 60, 89, 6,224, 93, 53,235,209,119, 3, 6, 12,184,127,244,232, 81,203,204,204, 76,
+ 20,215, 13,133, 66, 1,131,193, 0, 79, 79, 79,130, 36,201,202,230,189, 49,152, 76,230,133,157, 59,119,246,158, 48, 97, 2, 88,
+ 44, 22,180, 90, 45,118,238,220,137, 69,139, 22,165, 23,189,148,234, 0, 44, 57,116,232,208,168, 62,125,250,160, 73,147, 38, 94,
+119,238,148, 63,179, 67, 46,151, 67, 46,151,131,205,102,195,193,193, 1,171, 87,175,134, 86, 91,216,172,120,120,120,148, 60,198,
+ 0,254,240,240,240,232, 29, 19, 19,179, 25,133,115,215,190,128,131,131, 67, 63,154,166, 39, 26, 12,134,130,118,237,218, 89, 31,
+ 63,126,220, 76, 34,145,224,229,203,151, 88,182,108,153,140,162, 40, 3, 69, 81,132, 74,165,138,179,179,179,123,201,227,241, 4,
+ 74,165, 50, 39, 59, 59,123, 45,128,107,255, 84, 79, 78, 16, 4,193,102,179, 49,110,220, 56,176, 88, 44, 8, 4, 2,168,213,106,
+232,245,250, 18, 49,143, 42, 14, 75,215,175, 47,182,102,129, 51,193,202,172,193,236, 65,179,122,217, 58,214,116,130,165, 57, 15,
+ 81, 81,111,219,222, 14,185,185,147,203,138, 14,164,180,250,192,232,132,188,191, 61,216,253,231, 90,228,191, 84,104,125, 17,243,
+144, 85,118, 97, 14, 50,208,244,233, 44,137,132,171,227,114,133, 49,197, 86, 46,123,123,101, 62, 65, 12, 50,216, 54,236, 11, 82,
+167, 47,106, 40,232,162,205, 72,161,165, 55,224, 67,116, 36, 30,220,248, 11, 54, 74, 9,178,226,154, 2,156, 70,208,170,242,160,
+214,234,138, 68,137, 1,225, 47, 67,144,159,151, 3,111,159, 94, 0,131,241,164, 60, 62, 11,107,162,215,247,205, 27, 51, 63, 36,
+ 69,162,133,199, 64,212,117,110,135, 68,105, 62,114,229, 26,200,242,213,104,234, 29,128, 76,153, 10,249, 74, 53,222,126, 8,130,
+ 83,205,186, 12,130, 21,219,201, 88,161,165,121,123, 14,154,119, 23,193,113,109, 11,174,103, 31, 48, 93,125,145,244,250, 14,194,
+175,110, 69,202,155,135,160, 41, 3, 28, 61, 90, 26,251,144,236,188,118,237, 90,203,182,109,219,178, 58,119,238,220,228,202,149,
+ 43, 77,164, 82,105,120,145,192,104,210,185,115,231, 38,182,182,182,216,190,125,187,138, 32,136,157,213, 44,236, 18, 11, 88, 70,
+ 70,198, 51, 0,107,206,157, 59,183,115,210,164, 73,176,179,179,107,148,154,154, 90,238,133,153,108,118,147,209,107,215,210,108,
+ 38,147, 62,241,251,239,156,149,215,174,109, 57,120,232, 16,167, 99,135, 14, 4, 77,211, 8, 11, 11, 19,110,248,253,119,225,240,
+190,125, 19, 18, 51, 50,200,123,161,161, 58,105, 74, 74, 65,134, 66,177, 82, 42,149,166,253, 19, 53, 91,175,215, 63,142,139,143,
+115,242,105,213,212,246, 85, 84,220, 27,255,142,223,127,207, 96, 48, 24,209,177,137,161,182,182,230,194,155, 55,110,234,244,122,
+253, 99, 99,184,120, 60, 94,175,142, 29, 59,178,100, 50, 25,106,214,172,137,204,204, 76, 72, 36,146, 66,139, 67,158, 12,186,188,
+ 60,232,243,115, 97, 80,200, 17,247,252, 25,154,214,173,195, 59,205,227,245, 82, 42,149, 21, 10,173,226,183,204,178, 2, 93, 23,
+239,227,154,153,129, 43, 22,131,168,250,176, 97, 95, 75, 75,203, 69,185,185,185, 87, 0,172,214,233,116,211, 23, 45, 90,212, 98,
+199,142, 29, 54,107,214,172, 49,159, 56,113,226,105,185, 92,222, 20,133, 65, 85,203,235,192, 62,146, 36,105, 13,192, 62, 36, 36,
+ 4,118,118,118,200,203,203, 43,182,180,104,149, 74, 37, 63, 59, 59, 27, 26,141, 6, 90,173, 22,230,230,230,120,241,226, 69, 14,
+ 73,146,151, 42, 75,156,121, 61, 98,181, 70, 23,181,212,218, 75,148,170, 35,173,252, 50,114, 40,217,138, 45,210, 85, 0,182,116,
+171, 91,119,159,142,186, 31,247, 62,242,146, 85,252,243,187, 57,169,239, 21,117,247, 95,137,171,104,142, 22, 13,128, 34, 8,130,
+246,240,240, 64,102,102, 38,152, 76, 38,132, 66, 33,196, 98, 49, 22, 47, 94,140,157, 59,119, 86, 71,104,241, 69, 34,209, 90, 6,
+131, 49,132,193, 96,216, 26, 12, 6, 4, 4, 4,160,119,239,222,224,114,185,208,233,116, 37, 22,205, 98, 43, 85, 37,150,142,176,
+ 39, 79,158,152, 63,121,242, 73,179,213,193,198,198,230,182, 70,163, 65,108,108, 44, 46, 92,184,208, 30,192,189, 42,150,117,108,
+ 88, 88, 88, 55, 95, 95,223,195,205,155, 55,175, 71,211, 52, 26, 53,106,132,161, 67,135, 34, 40, 40, 8,225,225,225,200,203,203,
+163,110,222,188,121, 16,192,230,170,246,225, 69,249,235, 57, 96,192,128,135,199,142, 29,179,202,206,206,134, 74,165,130, 66,161,
+192,233,211,167,209,182,109, 91,216,216,216,224,232,209,163, 36, 77,211, 21,149, 61,131,193, 96,236, 15, 12, 12,236, 61,126,252,
+120,236,218,181, 11, 39, 78,156, 64,159, 62,125, 48,100,200, 16,100,102,102,218,111,218,180,105, 84,209, 48,225,242,161, 67,135,
+ 66, 46,151,227,249,243,231, 81, 70, 62,243,200,205,205, 69,110,110, 46, 4, 2, 65,233,103,140, 0, 16,180,117,235,214, 97,179,
+103,207, 70,221,186,117,151,199,197,197,109, 69, 25,171, 68, 41,138,154, 44,145, 72,172, 88, 44,150, 53, 73,146, 72, 78, 78,198,
+139, 23, 47, 48,109,218,180,156,156,156,156, 73, 0, 18, 1, 44, 25, 55,110,220,234,185,115,231,150,212,165,185,115,231, 6, 95,
+185,114,165,219,191,219, 24, 35, 46,110, 0, 0, 32, 0, 73, 68, 65, 84,154,227,225, 97,217,144,203,228,205,146, 21, 48,173,101,
+ 50, 89, 73,219,161,213,106,161,209,104, 62,177,100,113, 56,108,235, 22, 77,107, 93, 86, 41, 11,126,126,251, 62,183,220, 0,233,
+ 94,245, 44, 26, 11, 69, 22,179,219,182,235, 56,162,107,183, 31,153,164, 94,143,235,215, 47,225,207, 63,119,163,131,175, 7,234,
+214,111,132, 25, 51,103, 89,104,180,100,192,205,155,215, 22, 89, 62,121,112,173, 32, 63,119,113, 69,156,255,227,184, 92, 36,174,
+ 46,151, 57,116, 88,150,130, 44,114,225, 32, 43,250,105, 99,101,101,245,187,193, 96,232, 96,110,110, 14, 42, 55, 6,111, 95, 60,
+ 69,142,140, 13,141,202, 0,138, 46, 20, 91, 70, 9, 23,141, 22,247,175, 95,196,182,173, 91,144,157,157, 13,223, 31,218, 67,206,
+114, 65, 45,151, 90, 80,171,148, 69, 15, 13,160,211,234, 97,107,239,138, 87,175,194,245,249, 10, 69,185, 13, 18,135,175,243,170,
+101,239, 1,141,174, 13,248, 92, 46,242, 10,180,144, 21,137,172,163,103, 6, 67,163, 84,129,212,234, 64,106,245,176,173, 53, 0,
+223,217,119, 4,101,184,212,176, 74,217, 71, 25,160,139,191, 15, 93,252,125, 8,218,204,196, 95,235,134,125,214,145, 26, 23,119,
+ 55, 51, 51, 51,227,205,155, 55,151,194,194,194,250, 13, 30, 60, 24,119,238,220,153, 8, 96, 74,209,240,205,196,193,131, 7, 35,
+ 44, 44, 12,111,222,188,185,148,153,153,153,241, 45, 74,158,203,229,170, 52,154,194, 62, 86, 40, 20,242, 43, 57,215,169, 69,255,
+254,140,188, 87,175,242,183, 62,122,180,124,223,254,253,156,206,157, 58, 17,122,146, 4,101, 48,160,190,187, 59,209,181,107, 87,
+ 81,208,169, 83,214, 76,189,254,201,130,233,211, 67,246,140, 28, 89,240, 76,161, 48,118,162,121,237,162, 33, 67, 0,168, 93,193,
+ 62,163,161,209,104,118, 76,158, 48,166,243,189,251, 15, 93,106,185, 56,153, 95,191,121, 47,156, 39,224, 50,234,186,213, 99,202,
+242,114, 88,171,150,255, 44,208,104, 52,198,138, 86, 47, 27, 27, 27,164,165,165,225,195,135, 15,208,104, 52,208,235,245,160,148,
+ 10,104,101,185,208,230,229,128, 80,171,192, 51, 24,160,206, 74, 71,237,186,117,128,127,173, 72,172,116, 40,170, 44,161, 85,252,
+201, 55, 55, 7, 71, 36, 6,131,205, 54, 58, 56, 58,128,230, 45, 91,182, 60,117,246,236, 89,206,216,177, 99, 91,221,186,117,235,
+119, 0,137, 18,137,164,211,178,101,203,158,253,254,251,239,188, 73,147, 38,121,110,222,188,121, 20,128, 63,202, 35, 81,171,213,
+167, 46, 95,190, 60,220,213,213,213, 62, 34, 34, 2,106,181, 26, 20, 69,161,123,247,238, 64,225,220, 26, 0, 64,116,116,180, 74,
+173, 86,103, 68, 70, 70,230, 39, 38, 38,234, 96,196, 42,193, 21, 59,164,143,243,211,238,247,183,119,112,122,194, 23,212,118,163,
+229,175,250,205, 25,232,180,105,235, 25,137,250, 90,108,108,193,210, 46,117,214, 43, 10, 94, 79,179,116,150,239,186, 22, 28,103,
+204, 68,248,146,213,133,214,214,214, 96,177, 88, 96,179,217,224,112, 56, 32, 8, 2, 51,103,206,196,222,189,123, 43, 27, 58,252,
+ 68,100,153,153,153,189, 89,185,114,165,243,164, 73,147, 56,124, 62, 31, 50,153, 12, 71,143, 30,197,184,113,227,240,231,159,127,
+150, 57,255,197,136, 33,165,207,173,165,179, 71,142, 28, 9,173, 86,139,161, 67,135, 98,223,190,125,179, 13, 6,195,189,106, 60,
+210, 79,194,195,195,221,195,195,195,205, 1,244, 25, 50,100,200,161, 1, 3, 6,224,222,189,123,184,116,233, 82,123, 20, 46,250,
+ 80, 1, 88, 7,192,174,232,179,162,231, 83,100,111,111,191,155,162,168, 62,182,182,182,225, 30, 30, 30,222,199,142, 29,179,204,
+200,200, 40, 94,252,128,248,248,120, 28, 56,112, 64,186,127,255,254,124,131,193, 96,205, 96, 48, 46,231,230,230, 46,174, 64,176,
+237,223,186,117,235,152,162,225, 64,156, 61,123,150,222,178,101, 11,177,108,217, 50,200,100, 50,116,232,208, 1,129,129,129,179,
+228,114,121,147, 45, 91,182, 76, 24, 52,104, 16, 86,173, 90, 5,133, 66,177,181,178,151,149, 10,196, 23, 1,224,251,173, 91,183,
+186,206,158, 61, 27,103,207,158, 69,243,230,205, 5,113,113,113,123, 0,140, 47,171,252,104,154, 70, 92, 92, 28,148, 74, 37, 30,
+ 62,124,136,229,203,151,203, 74,137,172, 89, 83,166, 76, 89, 61,107,214, 44,172, 93,187,150,142,136,136,200, 24, 48, 96,128,253,
+222,189,123,153,245,235,215,159,165, 84, 42,255,109, 66,203,179,126,141,245, 45,154,183, 91,228,232, 84, 31, 71,143, 29, 71, 78,
+ 78, 78, 73,158, 20,231, 11, 77,211, 40, 40, 40, 64, 90, 90, 26, 44,204,205,176,105,243,234, 30, 83, 39,142,113, 65,161, 27,140,
+ 47, 77,150,117,173, 54, 15, 24, 50,118,222,208,225, 99, 16, 17,254, 18, 65,135,254, 64,100, 68, 88, 9, 31,169,215, 33, 38,234,
+ 5, 98,162, 94,192,222,193, 21, 93, 59,183, 39,134, 13, 27,214,125,228,240, 33,182, 0,254, 54,215, 17,255,197,214, 44,224, 75,
+ 63, 90,123, 63, 17, 90,149,152,235,108,172,172,172,222,156, 60,121,210,218,215,215,151, 73,146, 36,174, 93,191,142,105, 83,126,
+194,168,145, 1,208,193, 10,164,150, 3,138,195, 55, 42, 37, 42,149, 18, 52,104, 40, 20, 10,132,134,134,130,166, 72, 4,237,221,
+ 2,154,166, 74,132, 22, 64, 67,171,211,193,169,150, 39,118,239, 91, 67,130,205,126, 6,125,217,174,107,242,179,153, 6, 61, 73,
+ 67,146,145,132, 36,105, 36, 44,204,106,129,197,174,133,236, 92, 37, 88, 12, 7,232,213,209, 48, 20, 93,171, 84,164, 64,165,251,
+186,242, 51,148, 97, 61,165,171,208,232,170, 84,170, 35, 71,142, 28,233,241,219,111,191,113,123,246,236,233,113,230,204,153,239,
+ 1,160,103,207,158, 30,230,230,230, 56,114,228,136, 86,165, 82, 29,249,134, 22,159,142, 45, 91,182,132, 76, 38, 67,124,124,124,
+120,133,247,166,213, 90,139,237,236,152, 25,119,238,232, 51,101, 50,151,142, 29, 59, 18,122,146, 4,131, 32,144,147,151,135,196,
+132, 4, 88, 90, 90, 18,111,162,163,197, 59,103,204, 56,239,225,237,205, 42, 94,145,104, 12, 46, 93,186, 36, 68,225,188,172, 10,
+247, 85, 17,138,140,244,180, 49,211,167, 79, 63,127,228,200, 81,139,244,140,244, 24, 30,151, 75,138,197,252,154, 35, 71, 76,101,
+229,230,230, 14, 7, 32, 55,150, 76, 38,147, 33, 46, 46, 14, 2,129, 0, 28, 54, 27,148, 74, 9,131, 66, 14,117, 78, 38,152, 58,
+ 45,184, 6, 3,106, 8,121,112,177,183, 71, 45, 91, 27,163, 56, 63,220,190, 81, 50,241,189,244,112,225,166,150, 94,224,138,196,
+224,154,137, 49, 53,248,110,209,219, 40, 7, 88,246,171, 49,180, 54, 78, 78, 78,127, 29, 59,118,140,147,153,153,137,176,176,176,
+112, 0,121, 0,204, 0, 80, 81, 81, 81,183, 34, 35, 35,123, 21,173,186,171,108,181,216,150,115,231,206,117,241,245,245, 37,221,
+220,220, 68, 25, 25, 25, 46, 50,153,140,146, 74,165,159,152,132,110,220,184,193, 43, 40, 40, 80, 80, 20,117,190, 72,100, 85,234,
+191,104,206, 64, 39,126,232, 43,204,244,243,175,221,200,220,166, 49,114,200, 87,141,158,132, 75,103,206, 25,232,180, 99,235, 25,
+137, 90, 64,104, 14, 17,134,100, 23, 22, 95,109,236, 36,102, 26, 40,156, 43, 21, 26, 26,138,196,196, 68,196,197,197,125, 34,168,
+ 38, 78,156,136,160,160, 32,163, 44, 90, 34,145,104,237,138, 21, 43,156,103,207,158,205, 41, 37,138, 48,125,250,116,228,229,229,
+ 97,223,190,125,152, 62,125,122,149, 59,254,207, 80,167, 99,199,142, 61, 29, 29, 29,145,157,157, 13, 7, 7, 7,248,250,250,246,
+190,119,239,158, 27,128,248,106,214,251,169,254,254,254,171, 87,174, 92, 9,189, 94,143,113,227,198,225,253,251,247,167,222,191,
+127,191,173, 86,173, 90, 51, 23, 46, 92,104,111,111,111,143,193,131, 7,139, 72,146,236, 95, 30, 73,141, 26, 53,214,253,241,199,
+ 31,195,123,246,236,201,208,233,116, 63,220,190,125, 27, 9, 9, 9,208,106,181, 32, 73, 18, 31, 63,126,196,244,233,211,165, 69,
+171, 27, 63, 26,145,174,177, 75,150, 44, 25, 51,115,230, 76,108,216,176, 1, 43, 86,172, 56,104, 97, 97,225,221,180,105,211,102,
+ 43, 86,172,192,130, 5, 11,224,234,234, 10,107,107,235,239,150, 45, 91,230, 53,119,238, 92,236,216,177, 3,203,151, 47, 63, 8,
+224, 64,117, 50,130,162, 40, 98,253,250,245, 77,182,110,221,234, 88, 44,178, 24, 12, 6, 78,158, 60,137, 87,175, 94,245,142,141,
+141, 45,235,154, 64, 7, 7,135,137,142,142,142,220,155, 55,111,138, 93, 93, 93, 65,146,164,190, 72,100,237,172, 85,171,214,180,
+143, 31, 63,162,103,207,158,136,141,141, 61, 2, 96,148,133,133,133, 98,238,220,185, 66,129, 64, 96,161, 84, 42,255, 93,157, 55,
+152, 12, 98,244,218, 85, 11,240,252, 85, 52,206,157,227,224,249,243,231,176,183,183, 7,143,199, 3, 77,211,208,104, 52,200,204,
+204,132, 94,167, 65,163,134,117,112,120,255,122,100,100,100, 2, 12,162,220, 41, 55, 4,131, 24, 49,230,167,126,120,240,240, 58,
+246,236,249, 3,114,185,162,156,151,111, 62,234,123,120,193,169,166, 29,146, 83,146, 65, 48, 96,243,119,222,235,127,249,208, 97,
+ 73, 19, 4, 99,220, 59,148,134,165,165,229,182, 19, 39, 78, 88,119,232,208,129,169, 80, 40, 64, 81, 20,218,249,250, 98,230,236,
+217,184,116,236, 24,220, 91, 13, 5,161, 21,131, 20, 26,183,234, 65,173, 82,162, 65,179,239, 49,104,240, 16, 36, 37, 38,194,191,
+215, 0,168,213,202,146, 55,140, 98,139,150, 86,171,131,141,157, 11,110,220,184,193,196,184,113,111,177,179,108,163,132, 65,199,
+125, 29,243, 81,221, 54, 87,245, 10,161,207,131,160,211,232,208,168,209, 50,232, 40,107,216, 57, 79,132, 94,127, 1,249,153,183,
+ 11,135, 49,172, 59, 32, 37, 41, 9, 12, 38,231, 77,117,115,144, 82,100,126, 85,163,155,151,151,151, 23, 23, 23,119, 38, 52, 52,
+116, 68,255,254,253,113,227,198,141, 9, 0,208,191,127,127,132,134,134, 34, 46, 46,238, 76, 94, 94, 94,222,183, 40,109, 71, 71,
+199, 62,237,219,183, 31,218,162, 69, 11, 4, 7, 7,131,166,233, 7, 70, 61,216,108, 54,205, 96, 48, 64, 81, 20, 8, 0,217,185,
+185,120,255,254, 61,178,179,178,160,215,235,161,144,203, 41, 47, 15, 15, 57, 77, 81,102, 85, 73, 79,233, 21,134, 40, 99,213, 97,
+241,190,106,220,106,226,179, 39,143,146, 10,228,114, 91, 43, 75,171, 2, 46,151,107,144,229,230,230,189,125, 19,161, 53,178,115,
+ 40, 70, 84,100,100,164,119,106,106, 42,146,146,146, 64, 42, 10,192,212,104,193,208, 40,209,233,251, 54, 16,128, 6, 31, 20,216,
+148, 30,108, 38, 27, 5,133,171,243, 42, 29,238, 48,148,122, 73, 40, 22, 89, 4, 65, 20, 14, 23,138, 68,224,138,205, 62,177,112,
+ 25, 83,159,120, 60,222,177,211,167, 79, 59, 58, 57, 57, 97,213,170, 85,112,118,118,254,174,102,205,154, 74, 11, 11, 11,129,189,
+189, 61, 26, 52,104,128,239,191,255, 30, 87,175, 94,133, 17,121, 64,210, 52,221,245,193,131, 7,243, 30, 61,122, 52, 72, 36, 18,
+ 17, 51,102,204, 96,117,239,222, 29, 60, 30, 15, 74,165, 18, 50,153, 12,199,143, 31,207,162, 40,170,120, 81,138,181, 80, 40, 60,
+ 64, 16, 68,188, 66,161,152,253, 57,225,225,223, 26,213,204,200,161,198,209,114, 97, 63, 63,255,218,141, 58,250,119, 70, 29,247,
+142,232,232,159, 4, 0,235,107,176, 18,134,110, 92, 98,121,222,210,140, 56,112,227,218,205,229,190,126, 29,151, 44,146,223, 89,
+189, 97,111,110,165,243,233, 8,130, 0, 69, 81,159,248, 14,250,252,248,168, 81,163,112,242,228,201, 74,243,145,193, 96, 12,153,
+ 52,105, 18,231, 51,203, 51, 36, 18, 9,122,245,234,133,254,253,251,127, 34,180,108,108,108,224,224,224,128,132,132, 4, 0,200,
+ 54,178, 94,205, 28, 59,118, 44,161, 82,169, 48,126,252,120,236,219,183, 15, 67,135, 14, 37,238,221,187, 55, 19,192,236,170, 86,
+118, 6,131,177,105,225,194,133,243,166, 79,159,142,156,156, 28, 92,185,114, 5,221,187,119,199,201,147, 39,109,175, 92,185,178,
+182, 67,135, 14, 96, 50,153, 8, 14, 14, 6, 73,146, 21,250,250,226,112, 56,125,122,246,236,201, 72, 78, 78, 6,135,195,129,143,
+143, 15, 82, 82, 82,160, 84, 42, 33,145, 72, 48,107,214,172,180,236,236,236,246,198, 62, 71, 28, 14,103,246,204,153, 51,113,226,
+196, 9, 4, 4, 4, 28, 2, 48, 62, 47, 47,111,208,163, 71,143, 78,244,237,219, 23, 18,137, 4,231,207,159,199,242,229,203,137,
+ 81,163, 70, 97,215,174, 93,152, 53,107,214,193, 34,171, 83,121, 21,191, 32, 35, 35,195,162, 94,189,122, 72, 79, 79,135, 92, 46,
+199,249,243,231,237,174, 94,189,234,230,228,228,100, 30, 23, 23,103,248,245,215, 95,185,179,103,207,198,182,109,219, 16, 22, 22,
+134,160,160, 32,116,236,216,145,140,141,141, 45,211, 74, 86,228,178,225, 60, 77,211, 55, 69, 34, 17, 10, 10, 10,138,159,187,249,
+ 1, 1, 1,211,215,173, 43, 52,178,167,166,166, 98,244,232,209, 35, 67, 66, 66,168, 14, 29, 58, 8, 57, 28, 14,212,106,181,226,
+223,217,107, 83, 6, 10, 0, 5, 55, 23, 49,174, 95,218,143,151,225,177,120, 25, 30, 9, 46,175,112, 18,188, 74,165, 68,179, 70,
+245,209,202,167, 37, 82,165, 18, 28, 9,218,143, 26, 54, 78, 21,182, 35, 52, 77,131,195, 50,192,203,195, 1,199,130,254, 64,240,
+149, 16, 4, 29, 57, 94, 50,231,141,197, 98,163,105,179, 86,240,241,241, 69,108,220, 71,236,223,191, 7,182,118, 46,166,193,193,
+106,162,100,232,176,244,231,103,202,191,163,175,175, 47, 83, 46,151, 67,173, 86, 35, 45, 45, 13, 9, 9, 9,176,180,178, 68,108,
+106, 60,218, 11,117, 72,163,242, 17, 21,254,198, 64, 48,217, 97,149,253, 97, 79,191,166,128, 95, 83, 76, 27, 59,180,130, 87, 86,
+ 26, 34,115,155,194,161, 27,146,252,128, 29, 59,200,242,132, 22,105,208,223,186,126,243,118,203,177,163,250,176,111,220,222, 7,
+189,150,130, 74,111, 1,133, 90, 11,133,142, 13,134, 69,119, 32,235, 30,152, 44, 30, 90, 55,169,143,243,231,174,234,104, 82, 31,
+ 98,116, 6,217,123,131, 76,143, 44, 37,180, 50, 62, 27,119,168, 97,244,208, 97, 73,199,107, 48,156, 60,122,244,232,143,109,218,
+180, 17,118,232,208,161, 94, 81,199,169, 59,122,244,168,178,200, 25,102, 85,241,137, 55,120, 7, 7,135,102, 28, 14,103,104,247,
+238,221,155,141, 25, 51, 6,111,223,190,197,145, 35, 71, 98,234,215,175,127, 71, 42, 45,127, 69, 54,147,203,205,150,103,100, 88,
+138,221,220, 88, 86,102,102,169, 87,175, 92,113,237,220,165, 11,145,148,148,132,236,236,108,168,213,106,132,133,135,211,108, 38,
+ 51,133, 48, 55,103, 68,191,122,197, 96,114,185,217,229, 89, 27,203, 64, 66, 37,171, 14,215, 85,215,186,229,226,104, 85,111,121,
+192,228, 58,106,141,218, 59, 63, 63,159,100,177,217,108,103, 7,203,196,232,143,198,183,137, 26,141, 38,248,214,173, 91, 63,118,
+238,220,153, 23,243, 58, 12,100, 94, 30,180,121, 50,112, 40, 3,106, 52,107, 2,166, 78, 3,104,245,112,242,162,161,206, 21,226,
+222,211,104,189, 70,163,169,212,169, 97,177,208, 98,124, 38, 12,184, 98, 49,120,102,230,224,137,197,159, 11,134,202,222,228,132,
+ 93,187,118,237,212,186,117,107,208, 52,141,189,123,247, 66,167,211,113,117, 58, 29,180, 90, 45,116, 58, 29,242,243,243, 17, 20,
+ 20,132,221,187,119, 63, 2,112,208,136,219, 39, 5, 2, 65, 95,130, 32,236, 88, 44,150,210,214,214, 86,116,242,228,201, 18,119,
+ 19, 77,155, 54,133,153,153, 25, 7, 69, 78, 33,237,236,236,216,127,254,249,167,101,239,222,189,239,151, 57,220,209,232,187, 5,
+117, 72, 43, 63,190,160,182,155,185, 77, 99,212,113,239, 8, 0,232,210,107, 44,234,212,175,133,252,172,215,110,106, 85, 66, 63,
+ 14, 75,102,245,102,135,228,173,160,167,247, 24, 69,198,221,247, 40,123,121,127,153, 29, 5,131,193, 40,119, 56,214, 24,145, 85,
+168, 89, 24,182,197,243,124, 0, 32, 59, 59, 27, 82,169, 20, 81, 81, 81,240,244,244, 68, 78, 78, 14,156,156,156,160,213,106,209,
+162, 69, 11,168, 84, 42,108,221,186, 21, 15, 31, 62,124, 4, 96,150, 17,255, 33,112,119,119, 31,221,172, 89, 51, 92,185,114, 5,
+207,159, 63,151, 92,191,126,221,201,215,215, 23,110,110,110, 99,226,227,227,127, 46, 26,234, 51, 22, 34, 95, 95,223, 25,211,167,
+ 79, 71,100,100, 36, 38, 79,158,156,157,156,156,124,254,212,169, 83,227,151, 47, 95,206,240,247,247,135, 84, 42,197,166, 77,155,
+ 12, 15, 31, 62,220, 12, 96, 85, 37,249,248, 46, 57, 57,217, 89,173, 86, 35, 39, 39, 7, 36, 73, 66,169, 84,226,234,213,171, 8,
+ 10, 10, 74, 47, 18, 89, 31,140, 77, 92,147, 38, 77, 26, 48, 24, 12,156, 56,113, 2, 0,150,162,208, 99,255,249,126,253,250, 73,
+126,253,245, 87,167,197,139, 23, 99,194,132, 9,208,233,116,216,176, 97, 3, 22, 47, 94,124,185, 72,100, 85,212,136,254,230,224,
+224, 48,113,242,228,201,223,205,157, 59, 23,161,161,161,118, 47, 94,188,240, 9, 11, 11,131,139,139, 11,178,179,179, 89,214,214,
+214,216,182,109, 27,230,204,153,115, 22, 64,214,227,199,143,135,196,197,197,173, 3,176,169, 18,209, 30,232,228,228, 52,145,166,
+105, 90,169, 84, 38, 4, 4, 4,108, 90,179,102, 13,230,204,153,131, 55,111,222, 32, 47, 47, 15,102,102,102,196,194,133, 11, 71,
+ 47, 93,186, 20,227,198,141,163, 21, 10,197,238,127,119, 71, 77,211, 6, 40,101,145, 48,104,172,208,180,145, 39,154,122,215,198,
+245,219, 47, 1, 0,157, 6,248, 66,169, 40,192,161, 67,123,241,225,195,123,176,216,108, 88,214,112, 48,198, 18, 8,109,254, 59,
+228,234,164,232,220,193, 7,221,253,219,227,224,225,147, 32,245, 58,140, 31, 59, 28,178,220, 92, 28, 62,188, 31,177,113, 31,193,
+ 98,179, 97,109,243,247, 59, 66,173, 72,139,252,215, 11, 45, 35,134,159, 64, 81, 20, 36, 18, 9, 94,188,120,129,248,248,120, 8,
+133, 66,168, 72, 3,181,231,214, 67,138, 32, 56, 41, 20, 77, 63,162,201, 18, 47,197, 95,114, 24, 12,146, 82, 30,107, 45,172,172,
+172,184, 26,141, 10, 36,169, 47,213,171, 16, 0, 1,112, 88,128, 99,205, 58, 72, 78, 74,166,213,106,245,221, 10,223,160, 52,234,
+109, 23,207,159,158,254,125, 91, 95,155,238,157, 86,226,252,133,101,144,229,231, 67,173, 99, 67,161,214, 65,169, 6, 44,107,120,
+160, 69,163,198, 72, 77,205,198,235,231,247,228, 44,141,210,152,137,162,239,119, 46, 25,235, 62,118,218, 2, 8, 92,219, 66, 19,
+117, 30,148, 60,189,196,162,197, 23, 91,161, 70, 45, 47,228, 42, 52, 56, 29,242, 18,168, 66,168,151,140,140, 12, 37,147,201, 60,
+ 58,125,250,244, 13, 47, 95,190,112, 6,128,151, 47, 95,166, 72,165,210, 69, 25, 25, 25, 85,181, 73, 23,123,131, 39,248,124,193,
+203,250,245,235,167,250,248,248, 88,244,235,215, 15, 54, 54, 54, 8, 11, 11,195,186,117,235,222,233,116,186, 5,247,238,221,171,
+112,168, 71,171,213, 74, 94, 94,184, 96,222,254,167,159, 44, 23,244,238,189,105,250,244,233,219, 86,173, 90,197,118,119,119, 39,
+244, 58, 29, 34, 34, 34,232, 99, 71,143,234,119, 47, 94,188,149, 43, 18,177,158, 93,188,200, 38, 53, 26,201, 63, 93,137,157,156,
+156,252,124,127,104,231,181,249,183, 29, 80,171,228,120, 26,122, 25, 50, 89, 38,254,216,123,206,203,201,137,246,147, 72, 36,247,
+140, 21,192, 7, 14, 28,152,215,170, 89,179,102,117, 93, 92, 16,145, 24, 15, 46,101, 0,135, 36,193,212,105,192, 32,213,112,241,
+166, 65, 48,204, 32, 77,203,199,154, 19,103, 34,141, 17,198,223,245,232,131, 85, 41,121, 32, 8, 2, 91,218,120,131,107, 38, 6,
+ 71, 36,198,212,191,110,151, 8,131,224, 85,139,193, 21,139, 81,175,149, 81, 14,225,149,119,238,220,121, 17, 17, 17,209,194,219,
+219, 27,243,230,205, 67, 66, 66, 2, 40,138, 66,122,122,186, 90, 42,149, 74, 50, 51, 51, 19, 80,232,255,103, 95, 37,157, 88,105,
+213,225,116,239,222,189,146,225,134,144,144, 16,212,172, 89, 19, 22, 22, 22,200,207,207,199,164, 73,147, 44,127,249,229, 23, 0,
+192,139, 23, 47, 80, 90,160,124,142,136,151, 81,155,115, 11,104, 25, 45,127,213, 47,135,124,213,168,163,127, 50,186,244, 26,131,
+155,193, 7,113,251,250, 45,212, 96, 37,196, 67, 84,112, 53, 43, 62, 43, 63, 69,225, 30,232,213,124, 60, 83,170,184, 30, 56,163,
+ 79, 12,211,209,145, 58,189,120, 79,126,110, 69,105,117,119,119,135,189,189,125,201, 28, 45, 22,139,133,113,227,198,129,166,105,
+ 99, 69, 86, 81, 95, 67,101,170,213,106,123, 62,159,143,180,180, 52,124,252,248, 17,177,177,177, 37,174, 3, 40,138,210,207,159,
+ 63,159, 61, 99,198, 12,236,217,179, 7,119,239,222,125, 4, 96, 37, 0, 99, 95,214,134, 15, 30, 60,216, 76,171,213,226,248,241,
+227, 36,128, 94,167, 79,159,126,209,162, 69, 11, 86,183,110,221,204,118,237,218, 53,188,168,140,140, 22, 90,230,230,230, 28,157,
+ 78,135, 93,187,118, 33, 57, 57,217, 15, 64,212,179,103,207, 2, 7, 15, 30,188,219,219,219,187,126,100,100,228,123,185, 92, 62,
+ 21,192,235,202,200,210,211,211,199,250,248,248,156,166, 40,202,181,115,231,206,162,223,126,251,205, 60, 58, 58, 26,206,206,206,
+160, 40, 42, 2, 85, 12, 97,245,254,253,251, 40,169, 84,234,213,190,125,123, 92,189,122,117,189,193, 96, 88, 11, 96,195,148, 41,
+ 83,156, 18, 19, 19,209,172, 89, 51,212,168, 81, 3,209,209,209, 5, 82,169,116, 55, 10, 67, 18, 85,102,194,141, 3,176, 40, 48,
+ 48,176,113, 96, 96,224,208, 26, 53,106,180, 14, 11, 11,195,131, 7, 15,176,121,243,102,252,242,203, 47,104,215,174, 29,230,205,
+155,151, 5, 96, 40, 0, 50, 46, 46,206, 40,191,121,197,150, 45, 0,104,222,188,121,234,186,117,235, 48,126,252,120,250,207, 63,
+255,220,126,244,232,209,217,195,135, 15, 47,233, 3, 71,143, 30, 77, 31, 57,114,100, 52, 10,195, 48,253, 59,161,215,233,180, 48,
+175, 81, 7,242,220, 36,100, 38,135, 66,104,230, 0,255,142, 77,160, 84,105,113,233,226, 89,188,142, 8, 7,131,193,128,189,131,
+ 11, 44,173,108, 16, 19,243, 30,168,120,181,177, 94,167,211,193,204,170, 54,228,121,201,208,102,188,132, 64,108,135, 49, 63,245,
+131, 82,165,195,185,243,103, 17, 25,249, 26, 76, 38, 19, 14,142, 46,176,176, 44,228, 36,232,138, 87, 48,155, 0,160, 12,127, 90,
+149, 10, 45, 38,147,121,231,218,181,107, 3, 91,181,106,197,250,240,225, 3, 62,124, 40,124,185,145,201,100, 36, 1,195,153,140,
+136,139,195, 42,184,188, 51,138, 86,103,148,142, 93, 40, 54, 51,147, 68,191,139,178,151,229,164, 35,252,213, 67,124,136,137, 64,
+124,108, 20,116, 58, 53,152, 12, 6, 24, 76, 6,106,215,105,136,135,143, 66,181,106,146, 12, 45,143,179, 48, 29,177, 5, 34, 59,
+247, 33,171, 87,253, 28, 60,103,193, 10,193,160,129,123,240, 58,250, 45,228,164, 3,104, 26,112,176, 22,161,105,221,133,144,164,
+102,226,196,193, 93, 74, 74,167, 27,241,153, 15,173, 47, 56, 1,192, 62, 11, 13,118,239, 61, 56,110, 95,208,177, 21, 11,102, 76,
+178,239,219,127, 4,184, 57,111,161, 79,125,137, 58, 45,186,131,224, 89,226,202,141,219,184,247,226,109, 58,101,160, 87,216,103,
+227,207,152, 74, 56, 75, 35, 55, 55,247,113, 90,154,212,185,148, 23,120,103, 30,143, 95,217,234,184,207, 57, 63,241, 56,207,100,
+ 50,154,175, 94,189, 90,111,111,111,175,139,140,140,196,158, 61,123,168,151, 47, 95,222, 96, 48, 24, 59,165, 82,169,186, 50, 78,
+ 91,189, 62,252, 88, 64, 64,131,150,253,251,211,195,102,204, 80,130,199,155,185,105,203,150,128, 76,153,172, 38, 77, 81,176,173,
+ 81, 35,101,211,226,197,235, 6, 14, 30, 44,123,243,240,161, 32,244,194, 5, 1,151, 36, 95, 26,145,206,111,129,114, 57, 37, 18,
+201,189,187,119, 31,224,208,190,223,160,211,105, 32,149, 36, 2, 0,178,178,243, 80,137,200,250,156,147, 86, 42,149,253,151,254,
+242,203,147,165,115,102, 59,252,208,169, 51,146,194,195,160,203,201, 4,161, 39,193, 38, 88, 80,100, 8,145,145, 46,199,162, 35,
+167, 50,228, 74,101,255, 50, 58,137, 50,211, 89,108,177,226,153,155,129, 35, 18,131, 43, 54,251,196,138,197, 55, 55, 7, 87, 36,
+ 6,139,203, 45,107, 2,247, 23,156,114,185,124,192,192,129, 3, 95, 63,123,246,204,106,252,248,241,248,254,251,239, 95,169, 84,
+170, 14, 0, 10,170,155,159, 20, 69, 73,126,248,225, 7, 6, 65, 16,226, 17, 35, 70,240, 50, 51, 51, 75, 60,171,203,229,114, 92,
+189,122, 21,158,158,133,171,250,223,188,121,131,134, 13, 27,150,203, 57, 97, 81,164, 4,192,170, 57, 3,157, 54, 61, 9,151,206,
+ 4,176,190, 78,125, 23,220,190,126, 11, 15,110,135, 6,180,246,166,118,244, 24,209,226, 87, 97,135,193, 11,188,154,143,103,138,
+205, 29,113,248,220, 89,102,212,203,253,107,148,202,136,122,216,115,126,126,121,233, 36, 8, 2, 52, 77,127,225,202,129,201,100,
+226,232,209,163, 85,189,247, 83,251,246,237,155, 50,121,242,100,142, 84, 42,197,187,119,239,160, 80, 40,192,231,243,113,253,250,
+117, 18,192,174,163, 71,143, 94, 63,122,244,104, 55, 20,174, 38, 10,169, 74,253, 20,137, 68,211,253,253,253,241,238,221, 59, 60,
+127,254,252, 44,128,215,175, 94,189, 58,251,225,195,135, 33,237,218,181,195,193,131, 7,167,171, 84,170,125, 85,225,164, 40,170,
+180,207,164,226,136, 15,225,114,185,188,117,104,104,104, 85,203, 93,154,157,157,221,182, 72, 88, 39,219,219,219,155,135,135,135,
+163, 86,173, 90,208,233,116,173,170, 90,151,242,242,242,126,219,185,115,231,159, 99,199,142,197,175,191,254, 58,226,212,169, 83,
+ 35,122,244,232,129,158, 61,123,226,192,129, 3,120,253,250,245,122, 24, 23, 86,172,172,123,127, 13,224,181,189,189,253, 52, 23,
+ 23, 23,108,222,188, 25, 17, 17, 17,235, 86,173, 90,181,248,245,235,215,240,244,244,228, 69, 69, 69,145,213,105, 67, 0,192,220,
+220,220, 92,175,215,227,194,133, 11, 79, 1,204, 25, 49, 98,132,221,182,109,219,134,138,197, 98,228,228,228,168, 34, 35, 35,135,
+ 3,184,248,239,110,235,104,130, 88, 50,126,194,204,192, 9,227,135,243,125,154, 55,133, 50, 63, 5, 42,121, 58,148, 5,105,216,
+185,239, 6, 8,130, 1, 91, 91, 71,216, 57, 56, 35, 49, 49, 9,143, 46, 95,209, 42,148,170,109, 92, 61,181,190, 98,206, 25,133,
+156,205, 10, 57,149,138, 12,168,228, 25, 37,156,118,118, 53,139, 56, 19,241, 48,244,138, 90,165, 80,252,166,165,137,141,127,243,
+189,255, 55,163,106,177, 14, 75, 67, 38,147,205,154, 52,105, 82,135, 69,139, 22, 89,147, 36,201,172, 81,163, 6, 18, 19, 19,201,
+ 51,103,206,228,200,229,242, 89,213, 73, 13,139,205,126,237,238,225,217,161,111,223,190,100,159, 62,189, 57, 35,199,118, 99,217,
+218,217, 33, 47, 55, 27, 49,239,194, 16,253,246, 37,220, 61,155, 96,249,170,173,128,165,101,165,129, 36,139,194,234,244, 90,185,
+116,254,201,182,126, 93,205, 61, 27, 54,225, 52,173,103, 1,157,158, 68, 74, 74, 10, 46, 94, 8,215, 69,190,120,144, 79,145,218,
+ 33,202, 44,227, 66,240,220, 3, 72,100,227, 15,111, 59,221,209,181,155,118,206,219,245,199,161, 5,139,102,142, 23,181,243,237,
+130,136, 91, 7,113, 54,248,164, 66,173,209,110,226, 48,177, 37, 50, 27,202,152, 42,230,129, 90,173,214,125,222,159,170,213,106,
+221,215,150,244,129, 3, 7,144,158,158,174, 77, 72, 72,184, 70,146,228,169, 10,130, 61,127,129,157,128,182,159, 70,115,107,169,
+175,111,183,165,215,175,243, 71, 47, 92,168, 29, 49,114,228,124,104, 52, 58,112,185, 52, 75, 36, 98,128,199, 99,191,121,248, 80,
+176,125,202,148, 26,132, 86,123,243, 80, 5,110, 3,202,192, 55, 95,117, 88,108,209,106,223,190, 29, 70,143,159, 3, 85, 41,139,
+214,227,231, 49,208,232, 96,180, 69,171, 8, 73, 9,201,201,173,103, 46, 89,122,110,136,127, 39, 47,111,215,218, 60, 91,183,218,
+ 16, 59, 56, 32, 59, 51, 19, 15,159, 71,235, 87,157, 60, 23, 89, 36,178,140,242, 43, 67, 81, 84,225, 36,119, 0,157,102, 45, 2,
+193,100, 2, 69,110, 28,138, 87, 14,185,181,248, 30, 4,139, 5, 3, 77, 65,163,209, 24, 51,233, 47,229,227,199,143, 3, 70,140,
+ 24, 17, 18, 28, 28,204,240,247,247,111,122,254,252,121,234,107,234,142, 74,165,106, 13, 0,124, 62, 63,222,210,210,210,105,236,
+216,177,208,235,245, 80, 42,149,200,203,203, 67, 74, 74, 74,238,216,177, 99,117, 0, 32, 16, 8,184, 3, 7, 14, 52,175,140,115,
+235, 25,137,122,206, 64,167, 29, 53, 88, 9, 67,243,179, 94,187,213, 96, 37,196,183,246,166,118,108, 61, 35, 81,155,215, 84,172,
+206, 74,184, 23, 35, 85, 92, 15, 60,124,238, 44,115, 84,191, 1, 6,103,241,251, 0,190, 29,125,166, 50, 94,130, 32,190,112, 78,
+106,164,200,250, 4, 5, 5, 5,139,151, 45, 91,214, 83, 38,147, 57,119,235,214,141,227,229,229,133, 39, 79,158, 32, 56, 56,152,
+124,252,248,113,178, 66,161,248, 25,128, 26,192,141,234,228,169,135,135,135, 27,139,197, 42, 30, 74,251,189,104,247,239,231,207,
+159, 31, 50,126,252,120,212,174, 93,187, 65, 84, 84, 20, 15, 85,120,142,104,154, 46, 25,101,248,150, 32, 8, 34,118,251,246,237,
+ 78, 14, 14, 14,196,213,171, 87, 73, 38,147, 89, 29,203,205,129,253,251,247,183,210,235,245, 19, 38, 78,156, 8, 63, 63, 63,144,
+ 36,137, 35, 71,142, 96,255,254,253,198,138,172, 10, 17, 19, 19,243, 50, 57, 57,249,135,249,243,231, 99,243,230,205,139,231,207,
+159,143,228,228,100,196,196,196,132,125, 13,111,126,126,190, 42, 41, 41, 73,216,166, 77, 27,159,200,200,200,200, 14, 29, 58, 52,
+ 28, 63,126, 60,214,175, 95, 79,223,189,123,119, 32,128,171,255, 68,239, 29,253, 33, 39,136,109, 96, 93, 95,181,250,183, 95,234,
+213,117,155, 60,110,204, 96,166,135,123, 67, 40,242, 82, 96,109, 99, 15,103,151, 58,200,204,200,194,181,107, 87, 13, 89, 89,185,
+ 7, 12, 12, 98,229,135, 15, 57,169, 95,195,233,228, 92, 7, 25, 25, 25,184,114,229,138, 33, 87,150,191, 23,122,198,170,168,196,
+220,116,152, 96,140, 37,107, 34, 42,240, 18, 95, 17,108,172,172,172,142,155,155,155,167,155,155,155,167, 91, 89, 89, 29, 7,140,
+ 90,125,208,185, 84,235,192,252,100, 27, 56,144, 15, 62,191, 53, 88,172,185,150, 86, 86, 87, 45, 44, 44,178,219,183,111,175, 13,
+ 12, 12, 84, 71, 69,189,161, 36,146,100,218,194,194, 34,175,228,252,178, 56, 63,131,149, 85, 93, 51,145, 99,195, 95, 44,156,155,
+ 62, 20, 59, 54, 40, 16, 59, 54, 40,176,112,110,242, 72,228,216, 96,133,149, 85, 93, 51,163,210, 89, 14,234,216,193,214,221, 6,
+187, 60,109, 9,149,187, 13,118,213,177,131,173,209,247, 94,241,176,159,129, 32, 96, 64,225, 50,108, 84,131,179,152,131, 98, 50,
+153,135,156,157,157, 29, 81, 53,135,117, 95,112,142, 4,106,143,228,241, 38,156, 14, 8, 24, 29,127,247,238,136,252,184,184, 97,
+121,177,177,131,195, 78,158, 28,242,251,144, 33, 35,135,241,120, 19, 7, 2,117,141,229,116,116,116, 92,247,242,229,203, 96, 99,
+183, 82,194,203,232,252,172, 91,199,233,186,127,231, 86,244,244, 73,253,233,233,147,250,211,254,157, 91,209,117,235, 56, 93,255,
+138, 50, 34,152, 76,230, 80,161, 80,120, 92, 36, 20, 70,136,132,194, 8,161, 80,120,156,201,100, 14, 69,197,115,168, 62,225,180,
+182,182,126, 97,111,111,159, 94,149,205,198,198,230, 85, 21,210, 57,204,205,205, 45,153,193, 96,108,173,226, 51, 93, 17,167,187,
+ 64, 32,136, 21,137, 68, 41,165, 55,129, 64, 80,218, 49,148,181, 80, 40,188, 36, 18,137,182, 25,195,185,113, 73,195, 95, 30,221,
+152,246,122,227,146,134,191,124,126,108,198,143, 86, 99,159,132,172,204,158,241,163,213, 88, 99,210,105,103,103,119,215,206,206,
+ 78,106,103,103, 39,181,183,183,175,112,179,177,177,121, 97, 4, 39,223,204,204,108,155,153,153, 89,186, 72, 36, 50,136,197,226,
+116,145, 72,180, 21,165, 92, 91, 84, 55, 63, 25, 12,198,250, 6, 13, 26,168,153, 76,230,159,159, 29,218, 92,175, 94, 61, 53,139,
+197,218, 84, 69, 78,243,118,237,218, 25,194,195,195,105, 63, 63, 63, 26,128,213, 55, 44,119, 7, 43, 43,171,171,230,230,230, 73,
+102,102,102, 59, 1,136,170,201, 73, 0, 24,234,228,228, 20,214,177, 99, 71,165,147,147, 83, 40,128,190,223, 48,157, 61,127,252,
+241, 71, 42, 41, 41,137,166,105,154, 78, 74, 74,162,127,252,241, 71, 10,133,142, 34,191,166, 77, 94, 50,101,202, 20,250,241,227,
+199,244,227,199,143,233,208,208, 80,186,103,207,158, 20,128,159,190,178,157,199,183,186,119,175, 58, 54,117,191,171,111,117,106,
+248, 0, 95,234,198,197,173,244,242,159, 39,211, 93,252, 26,210,158,245,172,206,185,187, 91,187,127, 11,206, 95,126,158, 68,119,
+254,161, 1,229, 85,215,234,164, 87, 29,155,186,255,230,123,255,255,104,213,194,223, 61,225,236, 95,166,197, 79,197, 82,217,168,
+ 89,179, 38,178,179, 91,241, 89, 44, 95, 30,143,215,129,193,100,222,201,201,204,156, 93,244,186,101,248,119,153,106, 43,236,208,
+235,130, 91, 65, 72,130,234,112,126, 50,145,189,154,156, 85,225, 48,138,179,188,160,210,148, 70,147,106, 77,146, 47,118,162,194,
+ 60,248,132,211,201,201,105, 2, 69, 81,110,198, 38,136,193, 96,196, 75, 36,146,125,213,201,207,250,245,235,211, 69,195,219,196,
+183, 44,247,191,163, 46,253, 47,113, 30,254,173, 81, 77,207, 70,223, 45,136,120, 25,181,185,104, 88,177, 4, 43,102, 88,153,249,
+118,108,191,236,225,237,187,191,174,216, 41, 43,248,135,239,157, 1, 35,231,180,125, 3,206, 98, 39,161, 85,226,100,179,217,129,
+ 45, 91,182,156,240,228,201,147, 63, 13, 6,195,196,255,209,250,217,147,201,100,206,247,240,240,104, 26, 19, 19, 19,102, 48, 24,
+ 54,163, 12, 71,145,213, 72,231,207,110,110,110, 83, 57, 28, 14, 79, 46,151,203, 82, 83, 83,151, 1, 56,245,159,150,159, 94,245,
+107,248,208,116,137,211,237, 53,239, 62,230, 60,251,102,156, 52,101,160,104,230,234,152,184,236, 87,255, 64,185,255,127, 19, 89,
+123,255, 29,127,220,217,196,105,226, 52,113,154, 56, 77,156,223,156, 83, 96,202, 79, 19,231,255, 67,206,255,151, 96,153,178,192,
+ 4, 19, 76, 48,225,191, 14, 42, 83, 22,152, 96,194,127, 28, 74, 91,181, 74,172, 89, 68, 5,170,180, 42, 38,193,234, 40,219, 91,
+ 38, 78, 19,167,137,211,196,105,226, 52,113,154, 56,255,231, 56,255,191,138,172,189, 21,252,254,219, 96, 50,171,154, 56, 77,156,
+ 38, 78, 19,167,137,211,196,105,226,252, 95, 16, 90,101,254, 54, 13, 29,154,240,183, 99, 71, 63, 56, 1,192,204,243,144,252, 29,
+231,155, 96,130, 9, 38,152, 96,194, 63,140,189, 40,103,232,240, 63, 65,104,213, 4,208, 26,133,129,111,163, 1, 60, 0, 32,251,
+ 10, 62, 27, 0,131, 9,130, 24, 4, 0, 52, 77,159, 70,225,170,145, 44, 99, 46,230,243,249,233,106,181,218,174,232,123,134, 90,
+173, 46, 29,203,128,192,151,171,217,232, 82, 91,153,112,115,115, 75,215,104, 52,118, 70,252,125, 30, 77,211,175, 25, 12, 70,132,
+ 88, 44,190, 29, 19, 19, 19, 92,149, 27,239,208,161,195,104, 38,147,185, 6, 0, 12, 6,195,146, 59,119,238, 28,250, 27,203,173,
+149, 75, 77,135,131, 58,189,142, 76,207,204, 89,134, 47, 29,249, 1, 0,118,245,194, 58,130,196,130,162,239,155,166, 5, 87,236,
+ 71,167,170,231, 87, 0, 31, 54,155, 61,221,222,222,190,123, 74, 74,202, 11, 0, 11,129,202,189, 26,187,184,184,252,196, 98,177,
+ 70, 24, 12,134,186, 76, 38, 51,150, 36,201,163,201,201,201, 65,166, 54,196, 4, 19, 76, 48,193, 4, 35,196,214, 23,168,146,208,
+242,180,134, 3, 13, 12, 5,129, 46,160,113,147, 0, 78, 68,103, 35,205,216,235,123,120, 66,175, 39, 11,255,147,195,128,225,234,
+ 71,198,222,238,221,187, 59,207,152, 49, 3,223,127,255, 61,158, 60,121,210,230,192,129, 3, 99, 79,157, 58,245,154,162,168, 59,
+ 0,158, 0, 70,185, 82, 16,161,208, 79,203,240,238,221,187,119, 94,179,102, 13,179, 97,195,134, 80,169, 84,184,123,247,174,239,
+166, 77,155,182, 61,122,244,232, 22,128, 99, 69,130,160,220, 0,120,106,181,218,174, 56, 24, 39, 65, 16,118, 3, 7, 14,124, 86,
+ 90, 92, 21,197, 87, 35,104,154,126, 76, 16, 68,168,193, 96,120,114,230,204,153,100, 79,160,213, 36, 55,206,153,217,241, 58,231,
+207, 57, 53, 26,141,221,133,141,107,193,226,241,160, 41,200, 71,155, 49,255, 18,189, 55,127, 89, 0,130, 34,193, 4, 45,235,176,
+122,219,107, 0, 17,169,169,169,175,253,252,252,226,171, 90,194, 76, 38,115,205,181,107,215, 28,105,154,134,191,191,255, 26, 0,
+127,151,208,226,181,246,105,114,231,210,217,227,124,121, 78, 58,186,245,123,156,100,255, 0, 0, 32, 0, 73, 68, 65, 84, 29,114,
+244,125,114,198,104, 0,103, 63, 17, 77,221, 97, 79, 16, 88, 48,101,237, 49, 38, 0,236,254,121,248,194,173, 93,177, 99,206, 13,
+164, 1,232, 80, 36,126, 0, 96, 35,128, 59,187,186,195, 30,192,162, 41,107,143, 17, 0,176,231,231,225, 11,118,117,199,246,105,
+ 87,171,236,182, 98,234,232,209,163,119,172, 89,179,134,233,232,232, 8,137, 68,210,173, 65,131, 6, 30,249,249,249, 13, 80,193,
+ 36,226,218,181,107,159,108,215,177,119,157,254,131,134, 10,109,109,172,144, 42,205, 50, 63,121,252,207, 73,204,199,119,187, 39,
+ 36, 36, 12, 49,181, 33, 38,152, 96,130, 9, 38,148,131,234,123,134,111,230, 8,129, 66,135, 31, 89, 76,226,167,182, 62, 13, 58,
+ 13,235,209,142,209,192,171, 62,222,190,137,234,122,241,246,211, 77,140,208, 55, 33,164,129, 14, 18,113,112,225,149,180,226,149,
+ 48,122, 18,172, 27, 23,142, 21,246,132, 99,135, 51,159, 61,123, 86,191,121,243,230, 37,161, 97, 58,117,234,132, 78,157, 58, 17,
+187,119,239,110,114,227,198,141, 38,251,247,239,215,133,132,132, 28, 68,197,254, 81,166,215,171, 87,111,211,142, 29, 59,120,126,
+126,126,224,241,120, 37, 7,196, 98, 49,122,247,238,141,222,189,123, 51, 83, 83, 83,253, 47, 93,186,228,191,113,227, 70,109, 98,
+ 98,226,124,252,203, 75,115,133, 88,182,108,153, 79, 25,187,175, 17, 4,241,145, 36,201,176, 38, 77,154, 36,123, 0,245, 39,245,
+248,254,230,212,182,238,162,217,139, 15,148,201,195,226,114,113,120,116, 97, 95, 93, 90,104,197,223,190, 10,177,185, 89,182,208,
+204,236, 53,128, 8, 0,175,105,154,142,136,141,141,141,250, 14,104,210,218,138,113,240, 79, 25,213,184, 10, 98, 11,201,201,201,
+176,176,176, 16,248,249,249, 73, 9,130, 88,113,247,238,221,111, 61, 33,175,213,138, 5, 83, 57,178,132,215, 72,123,247, 24,115,
+ 7,249, 10,103,239,252,235, 87,181, 86,127,182,162,139, 8,130,193,216, 24, 74, 5,160, 48, 24,239,178,236,236,108, 63, 0,176,
+182,182,230, 2,184,179,245, 41,122,204,105, 75,124,141,111, 55, 14,147,201,220,117,224,192,129,241, 63,253,244, 83, 97,232,136,
+135, 15, 33, 22,139,177,106,213,170,218,243,230,205, 91, 71,146,228,172,242, 44, 89,237, 58,246,174,179,125,243,175, 13, 10,114,
+242, 52,127,236, 58,245,188,166,183, 39, 99,202,244,121,102,219,117, 26, 7,131,193,240,147,201,178,101,130, 9, 38,152, 96, 66,
+ 85,172, 89,149, 10, 45, 15, 27, 28,106,230,237, 62,120, 88, 79, 95, 94, 35,239,134,224,240,254,229,186,165,185,143, 15,154,251,
+248, 48, 2,228, 5, 93,158, 61,127,217,229,204,141, 39, 26,165, 62,241, 84, 76, 22, 70, 27,155,170,226,160,180,107,250,218,119,
+ 84,228,102,240, 1, 64,100,105,167,254,249, 66,218,237,182,109,219,194,217,217,153, 19, 18, 18, 50,174, 18,161,245,115,116,116,
+ 52,143,201,172,216, 31,106,205,154, 53, 49,112,224, 64,120,122,122,114,219,183,111,255,115,121, 66,139,207,231,103, 16, 4, 97,
+ 7, 0, 53,106,212, 48,172, 88,177, 34,140, 46, 4, 0,208, 52, 77, 63,102, 48, 24, 79, 40,138,122,250,215, 95,127,165, 52, 0,
+236,186, 53,247,124, 48,117,228, 64, 33,125,102, 91,185, 34, 65,157,159, 95,230,126,161, 88,148, 41, 16,137, 94,243,132,252, 8,
+ 20,198,242,138,112,118,118,142,106, 0, 56,183,244,116,187,177,123,206,112,179, 63, 39,254, 90,105, 94, 54,107,214,204,163,113,
+227,198,124,131,193, 0,133, 66,129, 61,123,246, 88, 8, 4, 2,139,238,221,187, 47, 47, 93, 1,188,128, 70, 3,106, 50, 39,174,
+ 76, 53, 76,171, 70, 69,178,108,215,198, 39, 97, 96,239,238,230, 62,173,219,225,253,157, 35,200,201, 41, 64, 94,174, 28, 20, 69,
+125,225,215,103,218, 85,164,239,234,133, 77,187, 23, 15, 95, 68, 48, 24, 68,147,126, 11,209,199, 33,111,102, 96, 96,224, 27, 0,
+108, 46,151, 91,186, 30,214, 20, 56,121,111,170,223,181, 29,246, 44, 25, 9,154,162,104, 0,155,170, 96,205,178, 51, 51, 51,187,
+120,227,198,141, 86, 45, 90,180,192,147, 39, 79, 16, 23, 23,135,169, 83,167,106,167, 77,155,198, 25, 53,106, 20, 49,119,238,220,
+ 25, 27, 55,110, 60, 3,224,209, 23, 15, 2,139, 53,162,111,255, 33, 92,121,110,190, 90,171,209,105,107,216, 88, 82, 26,133, 90,
+153, 37,203, 87, 15, 25, 62, 65,251,230,213,211, 17, 0,190, 16, 90, 95,153,159, 38,152, 96,130, 9, 38, 24, 1,154,166, 91, 0,
+176, 5,144, 73, 16,196,243,210,191,139, 78, 41,142,214,242,249,239, 44, 20,142, 74, 89,151,162,203, 66,225,116, 31, 91, 0, 6,
+ 0,207, 8,130,144,125,101, 18, 43, 94,101, 24, 28, 28, 76,151,254, 44, 37,180,104,154,166,105,125,246, 71, 90, 19,115,149, 86,
+ 62,223,247,197,166,122,115,150,150, 62, 59, 69, 63, 61,246, 11,237, 97, 83,113, 20,246, 30,158,208, 15,111, 12,122, 74, 11,208,
+179,218, 91,170,159, 61,123, 22, 66, 81, 84,112, 64, 59,208,244,219, 99, 52,253,246, 24, 61,167, 13,232, 51,103,206, 92, 91,183,
+110, 93,112, 80, 80, 80, 48,128,202,230, 41,165, 23, 60, 15,165,159,218,129, 46, 15,209,209,209,116, 96, 96, 32,189,120,241, 98,
+250,207, 63,255,164, 81,137, 7,117,127,127,255,187,145,145,145,244,168, 81,163,194, 80,129, 99, 64, 47, 64, 52,162,182,195, 59,
+205,201,109, 58,237, 79,141,104,217, 15,252, 50,239,223,209,209,241,147,244,172,119,119,160,127,111,233, 78, 31,234,210, 60,141,
+166,233,107, 52, 77,175,167,105,122, 8, 77,211,158, 0,208, 12, 48,239,235,104,253, 65,125,106,187, 74, 59,177,117,165,113,239,
+154, 53,107,230, 49,127,254,252, 28,173, 86, 75,199,199,199,211,127,252,241, 7,125,243,230, 77,250,194,133, 11,180,175,175,111,
+106,169,244,218,143,245,116, 77,215,238, 95,169,169, 78, 45, 98, 51,153,191, 63,191,121,134,254,240,224, 52,253,236,196, 58,250,
+232,210, 97,244,140,190,173,116,230, 2,158, 26, 64,199,242,174,155,214, 22,245, 61,107,219,198, 36, 38, 38,210, 58,157,142, 30,
+ 51,102, 12,237,239,239, 79,119,237,218,149,238,220,185, 51,221,169, 83, 39,186, 99,199,142,244,237,219,183,233,212,212, 84,186,
+115,187,230,138, 94, 94,240,169, 66,210,188, 93, 93, 93,211,226,227,227,105,157, 78, 71,135,132,132,208, 71,142, 28,161, 67, 66,
+ 66,232,128,128, 0, 26,192,161, 41, 83,166,168,100, 50, 25,237,239,239,159,130, 50,188,198,187,186,186, 70, 69,198, 36, 39,111,
+ 93,187,239,246,225,223,143,223, 62,119,230,230,237,139,215,159, 93,190,112,253,249,169,167,225,177, 23, 92, 93, 93,163,202, 40,
+255,175,202, 79, 19, 76, 48,193, 4, 19, 42,215, 34, 69, 66,171,103,145,177,163, 39, 77,211,157, 63,251,221,179, 72, 56,125,241,
+ 59, 32, 32, 96,113,233,223,197,231, 4, 4, 4, 44, 6, 64,183,105,211,230, 56, 77,211,245,191, 65,242, 39,150,177, 85,110,209,
+ 42, 6,153,242, 12, 28,247,238, 96, 27,244,208,103, 69,131,202, 77, 4, 68, 14, 80, 17, 98,100, 75, 19,241,238,193,217,138, 3,
+ 73, 20,225, 74, 52,216, 0, 66,162,162,162,240,238,221, 59, 36, 39, 39, 67, 40, 20,126,113,222,195,135, 15, 33, 16, 8,224,232,
+232,104,156,210,213,126,218,207,189,110,238, 10,113, 27, 63,100, 13,155,140,144,144, 16,100,100,100,128,195,225,128,203,229,130,
+ 36,201, 74,249, 24,140,194,136,191,197, 86,172,178,206,241, 3, 88,188, 26,226, 75,187,151,207,114, 99, 60, 14,102,171,146, 62,
+ 32, 85,109, 48,206,146, 39, 22, 65, 40, 18, 74, 5, 2, 97,201,112, 33,128, 8,130, 32,222, 55, 3,216, 34, 49,255,210,193,213,
+115, 29,152,175, 66,248,170, 15,175,203,228,232,220,185,243, 36, 0,203,105,154,206,109,220,184,177,253,154, 53,107,172, 36, 18,
+ 9,222,190,125,139, 83,167, 78,101,146,133, 55, 74,208, 52,189, 18, 0, 90, 3,124, 75, 91,203,235,191,255, 50,203, 12,119, 78,
+114,171, 83,139, 44,188,122, 95, 30, 48,106,202,180, 29,179,122, 67, 81,160,194,177,155,175,112,237,229,199, 62, 0, 30,162,130,
+121,111,187, 30,225, 3,144,217,169,127,255,254, 97,247,239,223,183,217,191,127, 63, 72,146, 44,115,219,191,127, 63,110, 61,120,
+ 57, 19,192, 11, 35,147, 85,211,205,205,237,214,211,167, 79,109,133, 66, 33,110,222,188,137,220,220,220, 18, 75,214,232,209,163,
+137,220,220,220,161,123,246,236, 25,144,144,144,176,249,193,131, 7,217, 40,140, 5,249, 73, 69, 96, 50,153, 31, 73, 82,247,157,
+163, 87,125,214,160,222,237,218,201,179, 95, 67,108,221, 24,143,195, 63, 94,202,149,101,171,152, 76,230,199,210,231,127,139,252,
+ 52,193, 4, 19, 76, 48,161,106, 32, 8, 34,152,166,233, 94, 4, 65, 4,127,190,239,243,239,197,231,173, 91,183,174,228,119,241,
+ 53,235,215,175, 95, 91,234,183,242, 27, 37,175,194,201,240,237,139, 20,100,251,178, 78,210,188, 61, 7,205,187,139,224,184,182,
+ 5,215,179, 15,152,174,190, 72,122,125, 7,225, 87,183, 34,229,205, 67,208,148, 1,142, 30, 45,141, 77,136,250,187,239,190,131,
+ 90, 93, 56, 53, 75,163,209,128, 35,178, 82,207,157, 56,156, 15, 0, 20,139,175, 41,165, 96,141, 34, 52,107,219, 1, 45,211,105,
+ 60,179, 47, 52, 84,180, 76, 47,188,110,245,152, 49,224,112, 56,224,112, 56, 32,138,166,254, 24, 35,180,136,162,147,169,194,225,
+171,178, 18, 65, 40,121,236, 99, 39,150, 79,111,201, 75,136,224,106, 34, 31, 35, 85, 67,209,151,210, 13,151,141, 73,175, 80, 36,
+148, 8,132,194, 8,129, 88, 84, 34,180, 8,130,248, 8, 0, 52,155, 29,116,100,229,244,198,162,244, 88,145,250,121, 8,164,106,
+ 74, 87, 14,205,202,171, 87,175,218,177, 88, 44, 7,131,193,128,164,164, 36,188,121,243, 6,219,183,111, 79, 47, 40, 40,104,255,
+234,213,171,152,210,218,209, 32,224,158, 10, 90, 53,171, 14,235,245, 61,190,230, 99,100,149,107,143,141,247,143,254,125,218, 55,
+185, 60,105,228, 18,252,216,163, 43, 70,181,111, 64,199,167,230,168, 1,220, 44, 50,189, 86, 6,201,171, 87,175,186,252,240,195,
+ 15, 71,155, 54,109,234, 69,211, 52, 26, 53,106,132,161, 67,135, 34, 40, 40, 8,225,225,225,200,207,207,215,221,184,113, 99, 27,
+128, 3, 70, 38, 75,104,101,101,117,237,246,237,219,182, 66,161, 16, 55,110,220,128, 74,165,130,163,163, 35,166, 77,155,198, 93,
+191,126,253,225,252,252,252, 65,235,214,173,227,199,199,199,255,126,253,250,245,218, 40,140, 59,247, 69, 37,208,106,181,123,143,
+ 5, 29,218, 49,109,250, 12,167,219, 79,222,134,104,228, 5, 22,174,174,201,249,182, 86, 98,179,109, 27, 86,214,210,106,181,147,
+202,206,207,187,213,202, 79, 19, 76, 48,193, 4, 19,190, 64,133, 90,164,180,120,250, 92,108, 85, 69,164, 1, 80, 5, 4, 4,252,
+ 76, 16, 68,112, 64, 64,192,207,235,214,173, 83, 1, 72,253, 59, 68, 86,137,208,234,213,171,215,189,224,224, 96,244,234,213,235,
+ 94,185, 20,148, 1,186,248,251,208,197,223,135,160,205, 76,252,181,110,216,103, 55, 79, 85, 59,117,189, 87,221,188,173,209,104,
+ 88,135, 14, 29, 42,153,183, 5, 0, 6,131,225,155,151, 98, 85,132, 86,145,208,251, 34, 17,110, 60,241,189,189,115, 6,181,182,
+ 54, 40,217,218,135,151, 32,209, 80,228,230, 15, 58,229,243, 92,122, 99,121,156, 23,102, 79, 66,242,131, 91, 16,138,197,201,227,
+239, 71,148, 88,177,138, 68, 86, 28, 0,212,230,153,133, 4,206,250,209,215,129, 3,142,246,242,105,164,106, 40, 77, 96,130,254,
+ 64, 57,149, 13, 52, 77,255, 31,123,223, 29, 22,197,213,120,125,102,182, 47, 75,239,160,128,138,162, 52, 65, 81, 20, 27, 98,137,
+ 26, 49,177,247,146,152,232,107, 55,150,136, 26, 99, 73, 20, 18, 99, 47, 81,147, 24,203, 27, 11,177, 69, 68,141, 45,104,196,134,
+ 40, 93, 80, 68,154, 75,111, 11,108,159,153,239, 15, 96, 69,100,217, 5,205,247,203,155,236,121,158,125,102,103,103,230,236,157,
+123,103,238, 61,247,220,134,231,207,159,163,186,186, 26,209,209,209, 56,117,234, 84, 97, 35, 34, 11,109,249,198,127,252,244,249,
+148, 30,166,146, 60,174,226,193, 85,188,148,211,122, 53,117, 89,119, 30,217,155, 75, 18,191, 19, 36, 75, 56,176,103, 71, 44,254,
+116, 20,182,253,244,155, 90, 97,219, 55,120,231,185,200,241,149,114,229, 42, 61, 69,150,198,108,140,141,141,245,140,141,141,229,
+ 3, 8,154, 56,113, 98,228,152, 49, 99, 16, 21, 21,133,243,231,207,187, 1, 16,215,158,183, 1, 53, 11,101,127, 11, 32, 93,155,
+241,200,229,114,143, 95,189,122,213,203,209,209, 17, 87,175, 94,133, 84, 42,197,156, 57,115, 20,243,231,207,231,206,152, 49,131,
+ 40, 47, 47,215, 56, 89,209,209,209,197,218, 68, 22, 0,228,230,230, 94, 60,117,242,104,175,126,253,250,141,106,231,214,201, 52,
+ 93, 82, 81, 96,100, 36, 16,222,138,186,193,125,112,239,246,238,220,220,220,251,141,199,231, 53,189,227,211, 0, 3, 12, 48,192,
+ 0,237,208, 75,139, 52,112,166,154,131,122,215,113, 66, 67, 67, 19, 67, 67, 67, 95,115,188,222, 18, 13, 71, 29, 94,168, 43,211,
+ 90, 52,143, 22, 85,158,245,230, 13,208,116,115,110,246,141,223, 44, 44, 44,212, 66,161,240, 53,161, 69,235,201, 89,114,230, 24,
+210,231, 78,214, 56, 89,117,206, 22,134,206,120, 43,161, 69,211,116, 52,128,215, 2, 97,100,219,113,210,246, 17, 30,189, 61,219,
+181, 34, 85, 39,119, 32,167, 90, 45, 91,251, 68, 41, 75,145, 48, 31, 36, 55,210,201, 90,195,169, 86, 65, 32, 18,102, 10,141, 69,
+ 13, 69,214, 11, 0, 16,217,185,141,249,110, 88,167,254,190,157,218,147,234, 19, 91,145, 91,173,170, 12, 73, 86, 42,211,171,152,
+211, 90,226,112,237,123,239,189,183,214,202,202, 74,176,115,231, 78, 51, 23, 23, 23,168,213,106, 69, 67,145,101,100,219,113,210,
+142,145,222,189, 59,218, 91,144,170, 95,119, 33, 91, 74, 85,239, 72, 87, 29,214, 71,100, 89,155, 25, 95,222,183,105,174,208,136,
+207,129, 76, 38, 67,216,222, 95,241,251,237,132,224,162,132,179,151, 1, 92,126,139, 7,242,147,224,224,224,109, 27, 54,108,128,
+ 74,165,194,204,153, 51,241,236,217,179,223,159, 60,121,178,195,217,217,121,217,231,159,127,238,104,111,111,143,241,227,199,115,
+ 85, 42,213, 12, 45, 28,223,252,242,203, 47,193,190,190,190,136,138,138, 66, 89, 89, 25, 28, 28, 28, 48,127,254,124, 94,104,104,
+232,225,138,138,138,113,155, 54,109, 18, 60,127,254,188, 73, 39,235,181,231,154,162,190,222,191,109,238,178,238, 61,251,144, 79,
+159,166,170,179,252, 3,201, 27, 87,207,223,180,178,178, 58,156,149,149,245, 42, 62, 71,117,110,118,124, 26, 96,128, 1, 6, 24,
+240,110, 64, 16,196,133,218,126, 87,175,185, 92, 13, 69, 88,157, 99, 85,127,191,225,249,181,199,223, 69,101,249, 64, 35,194,235,
+245,233, 29,130,131,131,245, 30, 86, 79, 87, 21,234, 37,158, 26,226,253, 78, 80,181, 50, 6,123, 85, 32, 9,174,200, 66, 54, 98,
+195,149,235,218,206, 21,137, 68,122, 59, 90,180, 92,166, 43, 81,154, 37,180,106,251,104, 93, 98, 24,230, 53,161,101,102,215, 49,
+112,197,231,139,182,247, 25, 51,148,204,255, 52, 0,101,149,114,249,231, 73,106, 58,167,186,105,145, 85, 83,138,171, 50,140, 68,
+198,241, 2,145, 81,125,145,149, 5, 0, 2,219,246,254,203, 23,207,219, 59, 96,210, 8,162,112, 78, 31,148,150, 73,229,203, 18,
+213, 68,174,148, 25,151, 12,220,104,140,238,250,245,235,251, 1,236, 15, 12, 12,204, 23,137, 68,168,172,172,124, 35, 13,234,194,
+219,123,204, 80, 50,255,147, 30, 40,169, 82,202, 63, 79, 84,227,165,148, 62,174, 75,100,217,152,155, 92,222,183,113,174,209,203,
+156, 23,224,114,185, 48, 54, 54,198,149, 63,227, 81,148,120,238,109, 4, 22, 72,146, 92, 23, 18, 18,178,118,222,188,121, 40, 46,
+ 46,198,249,243,231,241,254,251,239,227,216,177, 99, 46,145,145,145,219,130,130,130,192, 98,177, 16, 17, 17, 1,149, 74,149,166,
+133,102,212,172, 89,179,150,141, 25, 51, 6,247,239,223,135, 88, 44,126,205,201, 42, 43, 43,155,184,119,239,222, 49, 25, 25, 25,
+ 58,157,172, 6,240,111,219,190, 43,119,229,154, 45,144, 87, 23,176, 11,115,239, 70, 93,187, 66,222, 41, 41, 41, 49, 2, 80,222,
+210,248, 52,192, 0, 3, 12, 48, 64,111, 87, 75,155, 22, 41,172, 21, 81,133,141,237,215, 19, 88,141,237, 19, 13, 92, 48, 69,131,
+227,143,255,202,123,210,203,209, 98,219,121, 67,157,159, 80, 79,104, 21,188,118, 92, 96, 98,169, 87,211,161, 74, 13,246,190,131,
+154,121,180, 4,197,197,197, 2,107,107,107, 89,125,129, 96,100,100, 4, 71, 71, 71,148,150,150,226,192,129, 3,128,238, 78,209,
+106,211, 49, 83,225, 63,105, 38, 30,180,230,129, 81, 41, 53,206,214,190,143, 62,122, 77,108,113,185,220,186,190, 97,186, 10,221,
+123,181, 78,211, 29, 0, 76, 87,183,118, 95, 9, 68,162,143, 4,214, 78,214,139,231,126,194,201, 40,144,227,122,159,149,101,191,
+126,179,194, 56,155, 49,158,151,133,242,219, 58,248,210, 63,252,254,104, 67, 39, 43,167,139, 91,187,213, 2, 35,193,167, 60,203,
+ 54,246, 33, 75,230,114, 50,242,229,196,117,255,207, 43, 78,125,251,185,209,115,152, 44,203, 65,217, 13, 61,146,103,237,251,239,
+191,191,150, 97, 24,134,166,233, 53, 0, 80, 63,188, 75,230,127,202, 73,207,147,225, 90,159,213,165,167,190, 89, 97,146,141,166,
+195,107,221,121,100,111, 59, 11,211,203,251, 54,205, 51, 18,231,102,130,207,231,195,196,196, 4,217,249,229,224,176, 89,210,183,
+124,222,248,125,251,246, 93, 49,119,238, 92,196,199,199, 99,206,156, 57,226,172,172,172,211, 39, 78,156,152,243,229,151, 95,178,
+135, 12, 25, 2,177, 88,140,205,155, 55,171,254,252,243,207, 77, 0, 54, 55,250, 60,178,217,159,124,245,213, 87,204,203,151, 47,
+137,231,207,159,195,193,193, 1, 11, 22, 44,224,109,218,180, 73,211, 39,171, 57, 78, 86, 29,114,115,115,163,126,191,122, 7, 31,
+ 92,220, 14,181, 74, 30, 85, 86,156,117, 51, 37,189, 52,202,146,199, 91,218,170,107,231, 22,197,167, 1, 6, 24, 96,128, 1,239,
+196,197,122,208,212,254,223, 0,141, 53, 29,234, 37,180,210,118,173,254,216,237,227,121,203, 33,116,233, 13,121,242, 25,208,149,
+249, 26, 71, 75, 96,108, 1, 75,103, 15,148, 85,201, 17,126,237, 33, 0,164, 53, 39, 84, 18,137, 4,126,126,126,216, 51,163,227,
+ 0,153,164, 88, 32, 4, 32,231,155,202,206,242,250, 94,143,140,140,172,166,105,250, 56,128, 72, 29, 52,235,188,188,188,118,111,
+217,178,133,231, 49,233, 99, 84,222,189,213,208, 65,129, 80, 40, 4,159,207, 71, 92, 92, 28,174, 95,191,174, 0,176, 78, 71,130,
+222, 83,171,213,143, 79,156, 56,145,211,161, 93,171,161,126, 93,124, 22,174, 90, 25, 98,146,116,235,119,172,217,180,155,238,208,
+109, 72,121,216,177,179,146,114, 99,231,129, 82,241,147, 71,122,220,234,227, 6, 34,235,165,123, 91,167, 1, 93,188,189,150,175,
+ 89,179,218, 52,241,214, 21,124,249,237, 62,198,205,119, 80,249,183,167,206, 85, 20, 25,181,121, 79, 86,144,114, 95,159, 56,140,
+138,138,218, 15, 96,127,221,126,195,240,134,108,216, 65,119,236, 62,180, 52,236,216,169,170, 10, 19,231, 65, 77,133,215,198, 99,
+ 84,175,214, 54, 22,151,119,125,253, 31,163,188,220, 44,240,249,124, 24, 27, 27, 35, 75, 92,134,181,219, 79, 86, 41,105,122,232,
+219, 10, 45, 19, 19, 19,190, 82,169,196,158, 61,123,144,149,149, 21, 0, 32, 43, 38, 38,102,223,132, 9, 19,118,118,238,220,217,
+ 61, 49, 49, 49,173,178,178,114, 30,128, 20,109, 36,230,230,230, 1, 54, 54, 54,196,157, 59,119,240,159,255,252, 71,177, 96,193,
+ 2,238,244,233,211,137,210,210,210,150, 58, 89, 0,128, 86,173, 90, 5, 14, 30,216, 19,189, 7,207,137, 82,200,202,110,102,164,
+ 28,142, 34,153,219,130,150,198,167, 1, 6, 24, 96,128, 1,255, 26,180,108, 98,240, 64,128,221,209, 10,179,189, 90,113,243,142,
+124,179,128,145,164, 71, 51,210,251,251,153,138, 51,159, 50, 23, 54, 79,103, 34,119, 45,102,230, 12,247, 98,220,109,137,188,142,
+ 86,152, 29,248,166,112,123,109,117,239,247, 59, 65, 53,184, 61,152,193,237,193, 12,239, 8, 21,128, 85, 93,187,118, 61, 59,223,
+255,213, 60, 90,243,253,193, 0,248, 15, 0, 99, 45,193,106,108,197,112, 7, 0, 7,252,252,252,212, 55,110,220, 96,158,140, 27,
+196,196,186, 91, 51,243,230,205, 99,190,252,242, 75,102,242,228,201,140,141,141,141,186, 54, 34, 28,116,113,126,240,193, 7,173,
+ 1,192,201,201,201,188,155, 71,135,188,184,107,231,153,155, 71,118, 50, 63,205, 31,205,244,232,236, 81,100,239,222,239,177,208,
+161, 83, 23, 29,209,167,225,180,183,183, 95,201, 48,204, 80,134, 97, 28, 0,192,205,205,202,184,171,123,135,151,143,175,158,103,
+110, 29,221,205,252, 52,127, 52,211,211,199,179,184,181, 71, 80,138,192,214,221, 95, 31,206,198,208,104,120,189,221,139,236, 58,
+244,122,212, 68,120, 53,156,237,252,199,159,203,121,153,207,220,187,119,143,137,140,140,100,110,221,186,197, 28, 57,113,142,113,
+238, 62,174,210,186,243,200,222,205,120,116,180,133,211,108,248,240,225, 76, 90, 90, 26, 51,108,216, 48, 6,128, 89, 11, 57,207,
+102,100,100, 48, 9, 9, 9,204,170, 85,171, 24, 0,135,230,206,157, 43, 45, 47, 47,103, 6, 13, 26,148, 85, 43,176,216, 45, 9,
+167,107,219, 86, 97,163, 70,244, 93, 55,255, 63, 99, 2,223, 54, 62,223, 33, 12,156, 6, 78, 3,167,129,243,223,192,249,191, 12,
+135, 90, 87,171,110,219, 85, 47, 71, 43, 10, 80,163, 24,251,189,109,149,255,221,180,121,215,210, 61,251, 15, 45, 95,177,240, 19,
+ 81,223, 62,131, 17,127,245,103,156,138, 56, 81, 37,147, 43, 54,115, 89,216,146, 80,140,234, 84, 29,161,168,157, 71,235, 53,196,
+198,198, 26, 89,182,127, 53, 7,211,211,154,185, 89,247, 53,243, 6,197, 0,102, 61,124,248,112, 75, 80, 80,208,198, 79,123,251,
+143,158,223,107, 0, 84, 42, 21,142, 28, 57,130,204,204,204,211, 0, 86,235,235,184,197,199,199, 23,121,182,119, 89,196, 97,177,
+151,207,155, 60,202,166,240, 89, 18,114,146, 99, 1, 0,114,185, 84,149,151,118,211,183, 57,129, 19, 10,133,247,108,108,108,158,
+216,216,216,148,118,108,231, 52,139, 15,206,154, 57, 19, 63,180, 45,206, 72, 65,118, 98, 77,203,168, 92, 86,173,204, 73,187,225,
+222,146,212,117,113,113,225,139, 56,152,221,104,120, 21, 50, 85,254,211,148, 46,250,240, 84,203, 21,155,214,111, 59,242,222,215,
+203, 63,226,155,154,154,226, 97,194, 83,172,217,122,172, 74,170, 80, 13, 45,138, 63,251, 78,154,199, 24,134,129, 74,165,210,123,
+160,131, 22,172,240,245,245,237,180,113,227, 70,183, 25, 51,102,224,109,157,172,250, 72,207,200, 13,105,229,228,234,249,244,201,
+195, 32, 75, 33,247,191,111, 19,159, 6, 24, 96,128, 1, 6,252,107, 48,188,214,204,153, 85,111, 27,171, 83,104,213, 33,161, 0,
+213, 0, 54,180, 99, 85,238, 91,185,113,219, 90,146,216,254, 17,205, 48, 63,171, 73,172,127, 94,140,194,183, 12, 92, 53,135, 13,
+245,123, 35, 39,179, 1,128,195,110, 89, 1, 89,139, 52, 0, 99,126,184,125,191,251, 15,183,239,127, 81,251,219,215, 0,154,213,
+150,107,194, 70, 66, 31, 79,215, 86,125,187,122, 9, 88,148, 20, 57,201,207, 80, 82, 37,195,149,196,204, 50,146, 33,127,110,110,
+160,158, 63,127,254, 7, 0,216,153, 25, 37,247,245,108,239,220,207,207,203,136, 67, 40,144,147,244, 16,229, 82, 5,126, 79,204,
+ 44, 7, 65,180,184, 67,245,187, 10,111,126,252,185, 7,191,129, 24, 68, 16,196,213, 85,243, 39,241,215,110, 61,254, 78, 69, 22,
+128,234,220,220,220,226,234,234,106,171,151, 47, 95, 42,208,242, 73,226,158, 86, 84, 84,116, 94,188,120,241,134,101,203,150, 45,
+255,230,155,111,184, 45,233,147,165, 13,165,185,153,103,250,121,189,187,244, 55,192, 0, 3, 12, 48,224, 95,129, 89, 13,182,208,
+ 91,104,105, 4, 67, 1, 10, 1,204,115,117,101,150,164,167, 67,241,174, 66,214,152,211,245,150,120, 0, 96, 68,139,175, 38, 9,
+201,221,180,204,202,123,105,153,149,160, 25,134,102, 24, 57, 73, 34,187, 74,169,220,148,246, 60,183,229,163,238, 8,130,122,240,
+ 52, 75, 26,243, 44, 91,198,208, 52, 67, 51,140,130, 32,144,167, 82,209,155, 18,159,103,158,251, 59,132,183, 40,254,236,237, 8,
+ 53,209,247,246,189,132, 37, 85, 85,202,221, 69,201,103,163,223, 97,186,168,226,227,227,167, 4, 4, 4,124, 76, 81,212, 62, 0,
+170,183,224, 82,168,213,234, 21, 97, 97, 97,167,227,227,227, 79, 70, 71, 71,139,223,133,200,250, 75,211,223, 0, 3, 12, 48,192,
+128,127, 42, 90,182,168,180, 54,188, 75,145,245,119, 68,194,211, 23,126,127, 5,111,226,211, 23,222,255, 11,225,205, 79, 62, 19,
+147, 15, 76,252,139,162,247,119,138,162,126,127,151,162,250,210,165, 75,109,209,200,178, 58,127,183,244, 55,192, 0, 3, 12, 48,
+224, 31,139, 89,218,196, 23,219, 16, 55, 6,252, 3,192,188, 43,145,101,128, 1, 6, 24, 96,128, 1, 45,128, 86, 71,139,128,246,
+145, 3, 87,155,241, 7, 45, 25,125,112,213,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,231,191,142,243,159, 8, 7,212,116,
+136,191, 80,187,109, 82,124,189, 75, 24,134,190, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,167,163,209,142,240, 64,
+ 77,231, 97, 3, 12, 48,192, 0, 3, 12,248,171,192,175,253,180,244,184, 1, 6,252, 47,138, 45,141,224,106, 73, 31,173, 14,181,
+219,167,127, 97, 96,231, 59, 56, 56,204,242,241,241,241,224,114,185,164, 68, 34, 89,127,227,198,141,117, 13, 79,234,235,201,142,
+ 97,145,104,253,234, 23, 2, 32, 88, 0, 73,130, 98,144,115, 43, 78,218,205,144,238,127,107,184, 8, 77,109,126, 35, 72, 22,143,
+ 82, 43, 65,169,148,168,233,110, 85, 3,154, 86,103, 82, 74,249, 16,109, 23,219,251,142,114, 86, 83,244, 55, 0,179, 7, 32,231,
+ 2,244, 94, 2,236, 57, 12,212,223, 19, 96,253, 7, 44,230, 91, 80,196,231,108, 14,107,165, 56,246,215,236,127, 66,132,133,135,
+135,179,222,230,250,113,227,198, 53,186,128,168,163,163, 99,132,145,145, 81,123,109,215, 85, 85, 85,137,197, 98,113,208, 63,252,
+121,236, 7, 96, 23, 0,175, 6,191,167, 0, 88, 4,224,218,219,254, 65, 32,192,182, 3,102,115,129,207, 1, 64, 9,124,155, 15,
+236,143,250, 27,245, 49,180,177,177,185,201,102,179,221,170,170,170,170, 36, 18,137,171,137,137, 73,186, 72, 36, 18,169,213,234,
+180,194,194,194,126,205,164,155,139, 87, 75,105, 45, 7,176,183,153,199, 13, 48,224,127, 5,111, 53,234,176, 99, 77,254,128, 64,
+ 0,253,186,119,239,110, 87, 85, 85,133,148,148,148,124, 0, 55, 1, 68,213,126, 82,223, 69, 72, 73,146,252,110,219,182,109, 75,
+ 23, 44, 88,160, 89, 12, 58, 46, 46, 14,190,190,111,206, 17,202, 34,209,250,198,249,171,182, 15,226, 83,209,125,208,216, 90,161,
+ 69, 2, 85, 98, 4, 13,246,111,105, 16, 76, 44, 44, 44,214, 19, 4, 49,142, 36, 73,157,133, 26, 77,211, 20,195, 48,225,165,165,
+165,107, 1, 72,154,243, 71, 34, 35,190, 74, 77, 81,141,254, 7,155,197,162,170,170,229, 90,167,189,176,180,180,140, 38, 73,178,
+ 93,253, 5,179,129,215, 23,208,214,118, 76,173, 86,231, 20, 21, 21,233, 35, 66, 5, 36,155,187,136, 32,184,131, 65,210, 29, 1,
+ 2, 4,200, 84,154, 82, 92,161,213,202, 29, 0,100,111, 35,178, 28,156, 92,111,125,182, 58,172,117, 66,114, 10, 86,205,159,140,
+111,118, 29,194,202, 69, 31, 99,199,129, 99, 88, 52,107, 18, 60, 61,189,208,212,178,226, 52,184,155, 86, 47, 28, 55, 40,116,207,
+201, 62, 43,231,141,227,135,238, 9,239,187,106,254, 4,222,166,221, 39,251,174,154, 63,158, 31,186,251,100,159,149, 11,199, 9,
+ 55,237,253,149, 6, 48,181, 37,129,156,228,230, 88, 69,168,213,141,214,182, 25, 54, 91,126, 44,237,165,232,255,226,141,158, 49,
+ 99,134,143, 84, 42,125, 56,121,112,215,176, 46, 29, 91,229, 54,118, 78,113, 94,110,171,244, 39,177, 33, 28,174,208,239,195,144,
+ 67,113, 77, 90, 14,124,126,187,148,148, 20, 55,154,166, 65, 81, 20,212,106,181,102,171, 80, 40,208,175, 95,191,119, 53,112,102,
+ 4,128,245, 53, 47, 43, 66, 1,156,124, 11, 46, 99, 54,155,253, 25,143,199, 11, 84,171,213, 30, 0,192,225,112,146,229,114,121,
+148, 90,173,222, 6,160,178,153,124,219,115,115,115, 61,141,141,141,161, 84, 42, 53, 11,208,179, 88, 44,119,103,103,231, 61, 50,
+153,204,237,109,111,222, 14,152,221,171, 79,159, 29,211,151, 46,101, 73,111,222,196,142,131, 7,183,163,162, 2, 0,246,232,186,
+150,199,227, 93, 38, 73,210,165, 57,255, 71,211,116,166, 66,161, 24,210,156,107,216,108,182,219,203,151, 47,109, 29, 29, 29, 33,
+145, 72, 32, 18,137, 68,117,251, 45,112,178, 54, 51, 12, 35,172,205,219,119,244,236,217, 51,128, 32, 8, 53, 0,134,166,105,242,
+222,189,123,147,104,154,102,215,230, 79,155, 1, 28, 4, 32, 55,148,217, 6,252,143,186, 89, 7,154, 43,180, 34, 1, 4,118,239,
+222, 93, 56,113,226, 68, 4, 6, 6,194,205,205, 13, 2,129,160, 38, 19, 47, 46,182,123,244,232,209,248,155, 55,111,142, 63,127,
+254, 60,146,146,146,164, 0,254, 4,208,232, 75, 61, 48,184,207, 2,129, 49,127, 39, 0, 20,230, 20,139,115,158, 23,236, 20,139,
+197,155, 1,212,159, 34,220,117,234,212,169, 75, 22, 46, 92,136,136,136, 8, 28, 59,118, 12,114,185, 28, 18, 73, 19,250,165,186,
+ 0,165,215,195, 0, 81, 6,144, 21, 5, 24,217, 2, 34,187, 22,199,148,133,133,197,250, 69,139, 22, 45,246,244,244,212,204, 98,
+174, 82,169,160, 86,171,161, 82,169, 80, 90, 90,138, 37, 75,150,212, 20,180, 12, 3,154,166,113,241,226,197, 5,179,102,205, 66,
+105,105,233,103,141,113,246,244,115,138, 33, 9,178,117,157, 87,195, 80, 84,206,221, 71, 57,221,212, 20,197,146,201,148,141,174,
+ 84, 46, 16,112,155, 20,121, 28, 14,167,117,210,111,191,217,146, 60, 30, 24,138, 2,104, 26, 12, 77,215, 70,103,237,135,169,249,
+141,161,104, 48, 42, 10,180,154,134, 90, 42,135,255,220,185,250, 68, 69, 47, 14, 79,120,108,202,167, 75,237,123,244,236,201,105,
+227,228, 8, 53, 69,227, 89, 70,142,253,195,152,187,189,195, 15,239,153,163,144, 74, 38, 1,104,209, 60, 91, 60, 35,211,223,119,
+127,255, 67,235, 7,143, 18,112,237,198, 77, 92,189, 30, 5, 0,184,124, 35,186, 78,112,235, 76, 42,168, 43, 59, 47,154, 57,146,
+ 31,182,251, 56,103,209,204, 81,172,111,118,159,224, 44,252,248, 67, 86,216,206, 99,220,133, 31,127,200, 10,219,117,140,187,112,
+230, 72, 86,232,142,159,124, 0, 88, 0, 40,213, 70,166, 45,141, 8,181,154,255,223,244,124, 22, 0, 20,238,219, 7, 85, 65, 1,
+ 28,215,174, 5, 0, 76,113,181,211,187,185,195,218,218, 58,134,195,225,180,214,117,158, 74,165,210, 41,130,103,204,152,225, 43,
+149, 74, 99,212,106, 53,195,102,179, 67, 38,143,122,239,236,208,190,190,197,245,207,137,139,123,108,181,105,211,111, 35, 79, 62,
+148, 48,227,253, 76, 30, 70,124, 55,163, 91,240,178, 67,143,155, 40,144, 73,185, 92,142,180,180, 52,212, 95,228,189, 30,168,150,
+214,157, 0,236,176,178,178,234, 81, 92, 92, 60, 5,192,170,138,138, 10, 31, 22,139, 5, 75, 75,203, 85, 10,133,226,153,153,153,
+217,143,229,229,229,209,181,174,145,190, 75, 6,244, 51, 53, 53, 61,114,230,204, 25,139,174, 93,187,146, 69, 69, 69,104,219,182,
+ 45, 74, 74, 74,252,111,222,188,233, 55,115,230,204,153, 18,137,100, 90,109,101, 80, 95,116, 50, 50, 50, 98,166, 79,159, 78, 80,
+212,171,219,253,233,167,159, 48,196, 91,221,222,198,220,168, 90,166, 96,202,175,165,153,253,135,203,229,254,153,153,153, 89,222,
+220,200,224, 2,159, 79, 95,186,148,101,252,226, 5,140, 31, 63,198,148,138, 10,246, 55, 53,238,150, 78,161, 69,146,164,203,145,
+ 99, 63,187,241,120, 60,168,213,106,141, 24,172,203,163, 84, 42, 21,148, 74, 37, 84, 42, 21, 40,138,130, 74,169, 66,232,215,223,
+182, 56, 47, 52, 50, 50, 50,114,112,112,200, 55, 50, 50, 50,122, 23,165, 16,159,207,103, 31, 62,124,120, 18,143,199, 3, 0, 40,
+ 20, 10,120,123,123, 19,134,242,217,128,127,152,216,122,195,229,106, 74,104, 13,171,168,168, 0, 69, 81, 48, 49, 49, 1,139,245,
+122,185,111,101,101,133,193,131, 7,163, 95,191,126,152, 56,113, 34,146,146,146,132, 19, 39, 78, 28,172,141,108,242,210, 96, 56,
+185,217,213, 22, 38,180,195,237, 11,143,194,126,250,234, 87,155,188,188,188,165,245, 78,155, 57,123,246,108,162,184,184, 24,227,
+198,141,187, 41,151,203, 63, 0, 80,161,141,147,162,145, 19, 52,113, 10,104,134, 16,110,187,247, 3,161,144, 73, 25,146, 36,165,
+117, 77,135, 45,137, 37,130, 32,198, 57, 58, 58,226,248,241,227, 80, 40,222,156, 46,204,212,212, 20,137,137,137,175, 92, 53, 22,
+ 11, 61,123,246,100, 17, 4, 49, 14,192,103,141,115,146,173,111, 63,120, 97, 91,183, 31, 60,216,139,219,211,143,204,127,153, 95,
+197, 0, 32, 86,175, 94,173, 17,110, 0,176,126,253,122,125,194, 9,146,195, 65, 97, 84,212,171,140,152, 77,130,228, 18, 32, 56,
+ 0,201,174,105, 69, 5, 3, 48, 20, 64,171, 1, 90, 5, 8, 28,156,244,137, 6,255, 86,206,110, 17,155,182,238, 53,151,171, 24,
+ 28, 63,119, 13, 25, 25,207,193, 34, 73,184,182,119,195,123,253,251,114,252,186, 7, 56,125,187,110,233,249,151, 89, 79,135, 1,
+184,223,236,136,166, 25, 65,123,103,107,252,248,211, 67,216, 88, 24, 99,220,200,247, 33, 20,240,241,205,174,159,241,245,202,249,
+112,115,117,193,254,237, 27,181, 94,110,102,102,182,193,195,173,189,203,222,195, 23,224,225,238,206,218,123,228, 2, 60, 60,107,
+183, 94, 30,172,189, 71, 46,192,211,203,147,181,247,200, 5,248,120,117,106, 19, 35,190,183,161,164,164,100,190,246,248,108,144,
+ 70,239,213,164, 17,167,146,214, 20, 4, 47,230,204, 1, 0,141,208,106, 14, 56, 28, 78,235,151, 47, 95,218,234, 58, 79,151,107,
+ 80,235,100,197,168,213,106, 20, 20, 20, 16,101,101,101,140,185,185,249,200, 75,251, 87,157, 25,210,199,183, 4, 0, 30, 63,126,
+108, 25, 26,186,105,228,137,152, 10, 72,239,238, 38,254,251, 91, 20, 61,229,131,192,152,115, 97, 51,252, 80,187, 36, 68, 67,200,
+229,242,140, 46, 93,186, 48,181,223, 91,241,249,124,110,131,231,205,177, 67,135, 14,111,184,214,122, 52, 41,238,184,115,231,206,
+124, 79, 79, 79,184,187,187, 71,247,232,209,195, 84, 36, 18,225,210,165, 75,240,240,240,240, 50, 53, 53,189, 23, 30, 30,206, 89,
+177, 98,133,239,193,131, 7, 1, 96,129, 30,209, 57, 40, 40, 40,232,120, 68, 68,132,128,203,229, 66, 42,149, 34, 49, 49, 17,102,
+102,102,224,241,120,248,240,195, 15, 89,189,123,247,182,234,223,191,255,169,212,212,212, 73,104,198, 8, 40,153, 76,198,172, 90,
+181, 10, 70, 70, 70, 48, 50, 50,130, 72, 36,130, 72, 36,130,177, 0,196,190, 69,206,194,133, 7,202,132,159,173,221, 23,118,100,
+239,186, 27, 78, 78,244,151,217,217,217,101,205,125, 22,164, 55,111,194,248,241, 99,160,222,187,171, 47,204, 68,150, 8, 9, 9,
+209,229, 72,129,203,229,162, 87,175, 94, 58,249, 44, 45, 45, 79,179,217,236,215,106,166,106,181, 90, 16, 18, 18, 66,165,166,166,
+138, 72,146, 20,209, 52,141,144,144, 16, 74,173, 86, 11,108,109,109,163,105,154,206, 47, 42, 42, 26,173, 71,112,229, 0,150,147,
+ 36,185,131,207,231,179,219,180,105,147,185,102,205,154, 59,181,110, 38, 24,134, 33,219,180,105,227, 47, 20, 10, 93,228,114,185,
+ 26, 53, 77,135, 6, 55,203,128, 70,193, 48,140, 95,141, 41,172,129, 2, 0,175,246,123,113, 77,105, 7,235, 6,191, 3, 64, 81,
+109, 69,209, 78,203,126, 49,128, 36, 0,157, 0,216,214, 30,123, 64, 16, 68, 73, 11,130,169,221,209,138,136,136,208, 84, 97,131,
+131,131, 53, 5,139,137,137, 9, 30, 60,120, 0,130, 32, 96, 98, 98, 2, 83, 83, 83,152,153,153,161,162,162, 2, 73, 73, 73, 72,
+ 73, 73,193,139, 23, 47, 64, 16, 4, 92, 93, 93, 81,247, 2,213,131, 38,131,251,101, 75, 4, 4,198,124, 16, 4,208,117,128, 15,
+124,250,121,163,251,253,244, 69, 49, 87,137, 3, 98,177, 56, 13, 0,219,219,219,123,102,207,158, 61,177,117,235, 86,200,229,242,
+173, 90, 68,150,134,243, 86,146,186, 27, 0, 56, 56, 56, 44, 59,122,233,153,209,212,161,237,171,197, 98,241,119, 45,136,156,215,
+ 50,226,162,162, 34,189,215,226,163,105, 26,165,165,165, 77,114, 54,116, 8,182,237,216,109, 46, 41,207,199, 87,223, 28, 63, 96,
+234, 77, 0, 0, 32, 0, 73, 68, 65, 84,133, 74,165,194,210,165, 75, 65,211,180,230, 83, 86, 86,166, 87, 56, 25,138,122,211, 59,
+ 32,107, 90, 79, 9, 54,224, 60,161, 70, 87,100, 29,223, 13,130, 1, 8, 10,192,155,247,213,176, 16, 18,176,184,194, 19,235,190,
+217,105, 30,155,146,131,115,215, 98,161,172,200,133,248,241,153, 26,203,177,215, 36,156,148,179,208,195,167, 61, 22,175,254,214,
+226,139,197,211, 78, 40,164, 18,119,188,222,140,120, 85,247, 75, 67,225,171, 13, 27,112, 96,231, 86,124,187,117, 39, 42,202,203,
+192,225, 88,215,102,244, 20, 40,138,106,250,222, 25,102,104,200,162,143,136,111,190, 63, 13,127, 79, 7,156,186,116, 31,125,186,
+184,224,204,239, 49,232,231,215, 22,231,174,198, 98, 64,143,246,136,140, 74,192,226,217,147,136, 73,151, 15, 14,109, 78, 26,109,
+223,190,219, 92, 82,145,143,136,141,135, 81,176,103, 15, 50,231,207,135,127,237, 57,247, 9, 2,220,214,173, 1,174,238, 52,106,
+136,228,228,100,200,229,242,198,106,251,240,240,240,208,153,238, 82,169,244,161, 90,173,102,242,243,243,137,252,252,124,136, 68,
+ 34, 34, 49, 49,129,242,242,242, 30,197,164,252,250, 3, 0,132,134,110, 26,117,242, 97, 5,170,163,119, 66,122,103, 23,184,109,
+227,200, 3,235,103, 43,103,173,221,255,176,222, 59,250, 90, 56,243,242,242,134,229,229,229, 1, 0,218,181,107,151,146,154,154,
+218,169,174,169,185,182, 9,145,171, 86,171,221,234,154, 19,213,106, 53,228,114, 57, 6, 13, 26,196,106,234,222, 45, 44, 44,122,
+122,120,120, 32, 54, 54, 22, 59,119,238,180, 12, 10, 10,194,211,167, 79, 65, 16, 4, 54,109,218, 68,120,122,122,114,138,138,138,
+ 48,100,200, 16,156, 62,125,186, 87, 69, 69,133,174,248, 52, 17,137, 68, 7,207,159, 63, 47, 32, 73, 18, 18,137, 4, 52, 77,163,
+119,239,222, 32, 73, 18, 9, 9, 9, 88,189,122, 53, 78,159, 62,141,179,103,207, 10,253,252,252, 14, 86, 87, 87,123,224,245,102,
+125,109,105,196,200,100, 50,134,207,231,131,207,231, 67, 32, 16, 64, 32, 16,128,199,227,161, 82, 6,204,218,150, 41,103, 9,172,
+105,175, 46,125,218,127,180,112, 19,249,221,154,143,175, 3, 56,167,239, 51, 15,212,244,201,218,241,243,207, 59,167,148,151,147,
+ 0,240, 35, 65,208, 74,134,249, 86,159,247, 29, 0, 42,101,229,112,113,109,141, 83, 39,206, 98,204,132,145,141,138, 44, 14,135,
+ 11, 46,135, 3, 83, 75,145, 78, 78, 46,151,107,151,146,146, 98,197,225,112,192, 48, 12, 40,138,130, 82,169,204,255,226,139, 47,
+108,134, 15, 31,110,114,241,226, 69,114,248,240,225,180,133,133, 69,213,253,251,247, 11,212,106,181, 85,223,190,125,155,243,204,
+239,245,241,241,233,122,230,204,153,143, 67, 66, 66, 98,150, 45, 91,246, 85,253,131,155, 55,111,222, 16, 25, 25,233, 50,106,212,
+168, 35,143, 31, 63,222,219,156, 60,228,109,243,121, 3,231,223,143, 83,155, 22,169,133, 29, 65, 16, 17,245,242,236,224,186,253,
+144,144,144, 85,161,161,161,137, 4, 65, 68,212,255,189,238,188,218,202, 98, 68, 99,251,181,215, 90,174, 92,185,210, 59, 44, 44,
+108, 83, 64, 64,192,241,232,232,232,231, 0,154, 43,180,154,238,163, 85,119, 67,245,111,178, 65,161,134,138,138, 10, 84, 84, 84,
+ 32, 59, 59, 27,251,246,237,171,125,161, 57, 96,179,217, 96,179,217,154,254, 12,218,112, 45,226,207, 93, 0,118,117,237,218,149,
+ 19,127, 39,252,226,231, 7, 22, 14,236, 54,168, 43,235,225,181,248,177,168, 89,143,112,216,244,233,211,173, 1,224,240,225,195,
+ 69, 0, 46,254, 31,169,230,240,180,180,180,197, 14, 14, 14,154, 62, 42,245,155, 15,213,106, 53, 4, 2, 1,234,250,178,200,100,
+ 50,236,219,183, 79,205, 48, 76,120, 19,156, 72, 77,188,142,180,196, 27, 53,215,209, 52,104,234,213,245,235,214,173, 3,195, 48,
+154,194,126, 78,173,115,162, 83,228, 53, 22,231, 76,131,109,131,223, 25,138,210,209, 60,193, 93, 56,118,218,124, 7,154, 96,227,
+183,235,143,192,225,112, 64,215,115, 51, 57,172,154,218,114,226,211,151,112,180,243,194, 7,147,102,219,159, 57,178,123,161, 90,
+ 41,251,166,185,113,237,238, 19,128, 69,139, 23,227,135, 3, 7,176,122,237, 6,141, 2, 80, 83, 20,212, 58,195, 73,146,131,122,
+123, 67, 93,249, 18, 44, 22, 11, 3,252,219,131,197, 98, 97,112, 64, 71,176, 88, 44, 12,233,237, 14, 54,155,141,161,125, 60,209,
+161, 67, 7,176,217,108, 82, 71,186, 35, 53,241, 26,210, 18,255,168, 39,122, 25, 48, 0,148, 98,241, 27,231,171,196, 98, 48,206,
+ 86,205,125,182, 48,115,230,204,178,236,236,108,101,195, 99, 78, 78, 78,220,155, 55,111,154,107,105,182,211, 64, 40, 20,250,177,
+217,236,135, 37, 37, 37,180,145,145, 17, 73,211, 20,237,229,229,205,186,180,127,213,153,186,115, 86,174, 92,117,102,188,159,233,
+168,163,225, 17, 12,183, 77, 31,130,224,240,213,159,174,221,207,229,112,133,126,128, 84,159,202, 3, 41,151,203,241,228,201, 19,
+232, 10, 15,195, 48, 77, 54,253,148,150,150, 78,247,240,240,184,185,107,215, 46, 75,130, 32,112,235,214, 45,176, 88, 44,205, 39,
+ 61, 61, 29, 36, 73,226,243,207, 63, 87, 86, 84, 84,124,162, 43,108,108, 54,123,241,169, 83,167,204,120, 60, 30, 36, 18,137,230,
+189, 97,177, 88, 72, 73, 73,193,119,223,125,135,233,211,167, 35, 43, 43, 11,142,142,142, 88,186,116,169,113, 88, 88,216, 98,165,
+ 82,185, 65,143, 36,138, 83, 40, 20,221,140,140,140, 32, 16, 8, 80, 39,184, 0,224,247, 68, 78,130, 84, 42,237,108,101, 85,109,
+111, 19, 21,241, 91,175,160, 15,124,173,108, 28, 2,196, 98,113,179,150,206,122, 6, 28,200,160,168, 47,134,157, 57, 99,123,251,
+204, 25,250,238,249,243, 57,124,137,100,191,222,207,144,138, 68,102,122, 14,252,252,252,240,240,225, 67,248,249,249,213, 23, 77,
+224,241,120,224,114,185,224,114,185,176,182,208,171, 11, 5, 67,146, 36,110,223,190, 13,138,162,160, 80, 40,160, 80, 40,224,233,
+233, 89,114,227,198, 13, 99, 0, 72, 79, 79,103,166, 78,157, 90,118,239,222, 61,116,233,210,244,122,234,118,118,118, 55, 89, 44,
+ 86,155,250,191, 21, 23, 23, 91,140, 30, 61, 26,165,165,165,239,143, 30, 61,186, 79,237,251,155,251,235,175,191, 78, 5, 0, 30,
+143, 7,146, 36, 41, 24,240,175,135, 46, 45, 82, 95, 40, 53, 20, 92,161,161,161,193, 13,127,171, 47,170, 26,251, 94,255,218,176,
+176,176, 77,245,184,165, 45, 8,190,238, 62, 90, 17, 17, 17, 76, 35, 10, 82,111,232, 18, 90,117,136,141,141, 85, 57, 58, 58,254,
+144,246,232,197,192,246, 62,174, 16,138,248,239, 1,216,197,231,243,151, 76,155, 54, 13,119,239,222, 69, 66, 66,194, 79,120,203,
+ 81, 56,222,222,222,151,249,124,190,139,150,102,146,204,132,132,132, 33, 90, 10,134,181,231,207,159, 71, 83,157,225,175, 95,191,
+ 94,191, 80,170,223, 25,190,241, 7,131,102,160, 82,170, 80, 85, 45,125, 85,136,215, 10,173,170,170, 42, 76,152, 48,225, 53, 71,
+171,160,160, 64,231,253, 17, 4,129,239,206,157,195,149,240,112,188,239,235,139,211,247,239, 35,108,218,100,184,187,180, 2, 67,
+ 17, 96, 8, 32,235,216,110, 20, 87, 84,226,151,107,183, 81, 34,169,198,148,190,125,225,102,106,221, 52, 47,135, 59,216,191,103,
+ 0,247,106,116, 18, 56, 28, 54, 72,208, 96, 84,213,112,244,232, 15, 22, 73,194,204,174, 45,184, 28, 14, 56, 28, 54,210,179,139,
+224,225,221,157, 23,193, 19, 12,110,137,208,114,114,105, 11,138,162, 48,125,250,116, 28, 63,126, 28, 86,246, 46, 48,115,242,198,
+215, 91, 15,224,253, 65,125,117,222,127, 93, 13,158,205,102,131,197, 98,189,177,173,251,174,143, 59,201,208, 12,148, 13,211,136,
+102, 0,134, 65,235,141, 27,209,122,227, 70,220,175,253, 79,207,170, 42, 72,165, 82,160,135, 87,179, 68,150, 66,161, 64,118,118,
+182, 50, 47, 47,207,174,145,227,249, 10,133, 66,167,176, 57,116,232, 80,220,140, 25, 51,186, 89, 90, 90,198,196, 61,126,172,242,
+241,245,229, 92,220,183,234,108, 93,179, 33, 0,248,250,250,150,172, 90,181,234,236,212,113,193, 35,247,134, 76,164,230,110, 56,
+194,230, 11,133,221,130,151, 29,138, 59, 54,110,156,238,246, 30,185, 60,195,199,199,135,209,231,190,170,171,171,243,154, 56, 60,
+ 2,192,250,174, 93,187,154, 6, 5, 5,225,230,205,155, 24, 51,102,140, 92,169, 84,166, 1,192,240,225,195, 59,254,242,203, 47,
+188,164,164, 36,216,216,216,112, 50, 51, 51, 15, 66, 71, 7,121, 30,143,215,191,123,247,238,164, 92, 46,127, 67,100,133,133,133,
+ 97,210,164, 73,232,216,177, 35,104,154, 70,101,101, 37,130,130,130, 56, 59,119,238,236,175,167,208, 90,228,238,238,254, 29,106,
+ 70, 29,214,207, 11,147, 81,211,172,133,226,226,226,188, 71,247,174, 37,246, 29, 52,186, 91,155, 14,222, 14, 9,113, 15,155, 36,
+180,181,181, 93, 73,146,228,120,154,166, 89, 21, 21, 21,217,143, 20,138, 14,158, 46, 46,118,189, 71,142, 68, 57,135,195,218,113,
+237, 26,153, 47,145, 24, 3,208,171, 9, 82,166,170,130,139,107, 77, 87,191, 49, 19, 70,226,225,195,135, 24, 59,113, 20,184, 92,
+ 46,216,108, 78,205,187,201,173,113,180,204,173, 77,245,122, 54, 85, 42,149, 38, 15,175,235,231,165, 84, 42, 81,215, 53,203,200,
+200, 72,115, 76, 46,151,131, 32,136,166,158, 13,183,147, 27,214,216, 10, 77,205, 64,169, 84,240, 26, 57, 86,243, 76,223,251,113,
+175, 16, 52, 45, 44,203,204,192,130,240,243, 28, 24, 96,128, 22, 87,171, 41, 45, 82, 95, 40,189, 45, 8,130,136, 8, 9, 9, 89,
+ 5,128, 9, 9, 9, 89, 85,183, 31, 26, 26, 42, 5,144,219, 66,177,245,134,203,197,126, 23, 34,171,174,121,161, 41, 4, 5, 5,
+ 45, 48, 49, 49,217, 89,183,159,125, 55, 23,217,119,115,225,209,201,171,119, 87,223,110,229,147, 38, 77,130,149,149, 21,150, 45,
+ 91,198, 0,248,169,185,255,159,158,154,104, 12,128,113,112,112, 88, 86,155, 33,251,222,191,127,223,230,193,131, 7,232,222,189,
+251, 43,235, 94,169, 68,159, 62,125,154,162,146,212,118,106,255,236,221,185,100, 52,148, 74, 37,170,171,165, 80, 40,148, 80,171,
+104,168,213,106,248,121,153,224,200,129,144,154,223,212,117,238, 89,141,107,214,218,222, 4, 38,198, 28, 21, 73, 18,210,152,184,
+188, 70,115, 76,133, 66,129,184,204, 76, 60,126,241, 2, 0,240, 65,104,211, 29, 95,143, 92,187, 9, 79, 79, 79, 93,161,109,223,
+218,209, 30, 47,175,196,213,100,222,210,108, 60,248,243, 36, 76, 76,140, 1, 0, 94,129, 83,192,229,214, 8,173, 42,169, 18,214,
+157,156, 64, 48,140,214,105, 1,140, 44,236, 47,179,185, 2, 23,134,162,193, 48, 52, 24,154, 2,195,208, 96,113,184, 70, 11,230,
+124, 12,154,166,224,239,239, 15,130,197, 2,165,146, 99,220,136,193, 40, 45,151,192,202, 92,191, 66,130,203,229, 34, 48, 48, 80,
+168,237,248,211,167, 79,165,245,133, 89,211,105,164, 66, 85,149, 20,114,185, 28, 74,133, 26, 74,149, 26, 84, 59, 46,190,250, 98,
+ 50,212, 74, 53,170, 39, 6, 64,169, 82,131, 94, 60, 10, 74,133, 10, 89, 70, 36,233,227, 97,173, 34, 65, 72, 31, 37, 23,154,234,
+ 18, 90,117,226, 64, 27, 26,235, 19,168, 69,108, 61,158, 49, 99,134,159,143,175,239,195,241,131,124,183,196, 39, 36,190,140, 79,
+ 72,124,227, 60,151,142,190, 25,115,195,142, 47,229,112,133,126,193,203,154, 30,117, 88, 31,245,155, 17,223, 18,171, 36, 18,137,
+143,177,177, 49, 82, 83, 83,193, 98,177, 64, 16,196, 83, 0, 62, 0,224,224,224,240,140,205,102,187,178, 88, 44,236,217,179,135,
+ 96,179,217,157, 3, 2, 2, 86,201,100,178,147, 77, 84,232, 60, 76, 76, 76, 94,115,179,184, 92, 46, 66, 66, 66, 48,117,234, 84,
+141,200,226,114,185, 56,116,232, 16,186,117,235, 6,133, 66,225,161,103,120, 31, 0,232,171,135,227, 71,212,138,115,157, 98, 84,
+173, 86,207, 40, 30, 63,190, 3,162,162,208,219,213,213,211,207,207, 15, 74,229, 43, 67,211,213,213,213, 73, 34,145,228, 73,165,
+210,255,162,102,106,131, 71, 77,138, 34, 25,141,204,244,154,238,167, 15, 31, 62,132,191,191,191,198,193,170,239,102,113,185, 92,
+ 8,121,198,205, 18, 90, 52, 93,147, 47, 73, 36, 18, 50, 42, 42,202,218,221,221,157, 0, 0,119,119,119,226,209,163, 71,150, 70,
+ 70, 70, 69,237,219,183,215, 89, 1, 22,154,154,225,208,140, 9, 0,128, 47, 7, 13,213, 84,140, 46,173, 95, 5, 14,135,131,129,
+203, 86,189,241,220,211, 52,205,130, 1, 6,145,165,135, 22,121, 87, 34,171,161,163, 21, 26, 26,154, 24, 26, 26,250,134, 59,214,
+ 76,232,118,180,234, 91,119,205, 69,221,203,170, 13, 91,183,110, 69,231,206,157,155, 44,136,118,238,220,137,163, 71,143,110, 5,
+144,222,108,203,113, 96, 87, 47,108, 59,147,232,218,209,139, 0,128, 13,139, 71,144, 85, 85, 85,184,125,251, 54,204,204,204,240,
+244,169,222,211,126,153,152,153,153,173, 39, 73,114, 28,171,225, 8,128,198, 5, 38, 69,211,116,120,121,121,185,214,233, 29, 24,
+ 6, 80,170,212,168,170,150, 65,161, 80, 96,241,231,187,117, 6, 34, 20, 32,148, 10, 9, 59,176, 95,128, 80,155,163,227,223,185,
+ 63,230, 77, 51,126,163,240,102,145, 0, 73, 2, 93,252,107, 28,151, 71,247, 19, 65,211, 0, 69, 3,214,182, 22,248,233,216,150,
+ 38, 69,190,154,162,107,107,199, 20, 42,229, 20, 60,122, 6, 35, 39, 57, 74,227, 32,241,184, 53, 77,198, 92, 14, 7, 52, 67,212,
+204,250,160, 77, 8,241,132, 46,165,226,116,183, 3, 17,241,152, 21,220, 25,191, 94,141,195,216, 65, 62,184,113, 47, 9, 65, 61,
+ 60,145,152,246, 2, 94,110,109,176,231, 96, 56, 24, 6,146,239,183,125,157,247,170, 64, 83,103,234,227,104,221,189,123, 87,218,
+208,197,170,191,101,116,151,135, 96,152, 87,142,150, 84, 38,199,178,149,122, 77,231, 83,147, 70,125,123, 10,245, 57,185, 41,199,
+ 74, 31, 33,214,208,217,130,142,233, 89,218, 1,232, 6,172,248,191,204, 56, 41,138,194,133, 11, 23, 52,233,209, 88, 58,214, 79,
+ 59, 61, 68, 14, 50, 51, 51,145,152,152,136,158, 61,123,162,188,188, 28, 28,146,196,210,248,120,120, 78,155, 6, 5,151, 11,154,
+166,193,227,241, 48,123,246,108,189,227,179,153,185,115,109,103,110, 74, 23,249,150,128,128,128, 14,169, 85, 85, 72, 76, 73,193,
+160,117,235, 0, 0,145,145,145,175, 61, 19, 75,150, 44,225, 37, 37, 37,205,140,137,137,153,249,242,229,203,173, 0,150,106,205,
+103, 25,185,166,143,214,248,201, 99,208,193,189, 29,142,254,124, 76,115,124,201,242, 69,224,112,184,224,112, 57, 48, 55, 51,215,
+235,110, 84, 42,149, 70,180, 86, 87, 87,147,145,145,145,173, 7, 15, 30,204, 93,180,104, 17, 1, 0, 71,143, 30, 37,119,237,218,
+ 37,186,114,229, 10,183, 85,171, 86, 98,157,226, 82,169,124, 35,141, 9,130, 0,135,195, 1,151,199, 5,104, 26, 4, 65,136, 54,
+111,222,188, 33, 49, 49,177,187,187,187, 59,228,114,249, 52,212, 12,212, 48,204,163,101, 16, 91, 77,106,145,198,250, 90,213,186,
+ 82,218, 80, 88,191,223,150, 54,161, 86,191,207, 22, 90, 54, 40, 67,191, 62, 90,141,129,197, 98,233,116,171, 72,146,212,217,116,
+184,100,201, 18,152,152,152,104, 43,128,152,248,248,248, 36,177, 88,124, 0,192,238, 22, 37,206,181,216,196,245,159,141,146,160,
+182,109,213,220,220,188,104,192,128, 1,149, 0,148, 39, 79,190, 94, 65,150,203,229, 90, 11,112, 51, 51,179,245, 63,254,248,227,
+194,145, 35, 71,146, 13,167, 24,168,223,188, 87,247, 81,169, 84, 56,121,242,228,194, 21, 43, 86,160,188,188,252,179,166, 10,241,
+234, 42, 41,164,181, 29,161,159, 37,252,170,111,166,174,245,144,177,185, 3, 90,183,243,209, 90,152,144,220,154, 62, 68,118,206,
+175, 10, 48, 19, 19, 1,168, 38, 56, 9,130, 76,127,145,245,178,149,147,189, 37,158,101, 23,194,174, 77,103,148,230,190,138, 7,
+ 54,155, 5, 78,109,211,161,185,169, 8,133, 5, 5, 32, 73, 86,147,194,248,235, 95, 98,113, 47,225, 5, 78, 93,125, 4,165,172,
+ 10,219, 14, 95,130, 82, 94, 9,165,172, 10, 74, 89,205,118,211,138, 79, 65, 16,200, 83,201,171, 58, 54, 39,221,217,108, 54,122,
+244,232,161, 85,232,228,230,230,234,233,104, 49, 26, 71, 75, 42,107,102, 26,233, 87,115,106,210,177,170, 59,222, 82, 97, 80, 55,
+229,131, 80, 40,236,118,232,144,246,105, 28, 26,131,189,189,253, 69, 99, 99,227,182,250,158,223,140,201, 75, 55,153,155,155,175,
+119,119,119,247,216,182,109, 27,135,197, 98, 97,224,192,129, 29,237,237,237, 51, 1,192,203,203,203,177, 46,143,153, 59,119, 46,
+115,247,238,221,132,154, 58,134,118,240,120,188, 20, 51, 51,179,110, 65, 65, 65, 40, 47, 47, 71,118,118, 54, 68, 34, 17, 60,183,
+108, 65,252,220,185,240,221,183, 15,228,128, 1, 32, 8, 2, 60, 30, 15,241,241,241, 16, 10,133, 41, 50,153,214, 41,223,122, 0,
+248, 22, 64,111,188,106, 46,100, 0,220, 70,205,180, 11,247, 26,201,239, 72, 0,160,104, 90, 87, 98, 77, 94,182,108, 25,202, 56,
+ 28, 96,248,112,112,211,211,161, 84, 42,209,179,103, 79,141,203,222,179,103, 79,176,217,108,248,248,248,192,209,209, 17,123,246,
+236,153,220,148,208,146, 85, 42,145,153,158,131,128,128, 0,141,115, 53,124,248,112,141,163,197,225,112, 52,206, 22, 65,233, 22,
+174, 4, 65, 48,245, 43,201, 20, 69, 17,108, 54,155,253,217,103,159, 17, 99,198,140, 97, 20, 10, 5,205,227,241,200, 83,167, 78,
+ 17, 55,110,220, 96, 87, 85, 85,233,172,136,123,143, 26,135, 47, 7, 15,171,121,247,219,218,128,195,229,128,199,229, 98, 89, 74,
+142, 38, 93, 76, 15, 29,231,133,133,133,141,117,119,119,175,105,134, 7,216,134,121,180, 12,208, 97,244, 20, 54, 16, 73,138,122,
+251,133, 0,136,218,253,194,122,130,170,144, 32,136, 7, 12,195,116,111,112,110,221,113, 69,131,109,221,241,199, 45, 8,126,221,
+ 90,135,111,136,175,166,106,196,105,119,238,220,113,243,243,243, 67, 86, 86,214, 27, 35,225,234, 10, 46,145, 72, 4,161, 80,136,
+232,232,104, 0, 72,211, 70,118,227,198,141, 93,168,153,117,185, 38, 68, 14, 14, 1, 65,227,251, 71,251, 15,237,142, 95, 66,143,
+149,139,197, 98, 31,188,154, 67,135,112,116,116,156,202,225,177, 39,184,122, 59, 7,130,166,191,189,118,254,246,186,166,238,208,
+181,163, 87, 37, 0,105,221,168,195, 22,142, 62, 4, 73,146,227, 70,142, 28, 73, 38, 37, 37, 97,194,132, 9, 56,122,244,168,214,
+115,167, 78,157,138,227,199,143, 99,228,200,145,228,202,149, 43,181, 78,239,240,186, 91,162,120,103, 15,101,234,211,199, 56,114,
+252, 71,173,125,144,108,109,107,250, 99, 21, 20, 20,105,126,235,238,215,116,203, 8,173, 86, 92,137,141,185, 31,208,171,223, 64,
+110,118,126, 25,104,181, 28, 50,201,171,235,171,203,242,193,168,101,224, 26, 89,194,222,218, 12, 15,239,252,174, 80, 42,100, 87,
+154,226, 92, 56,210, 11,115, 71,120, 0, 12,141, 81, 75,127, 66,196,238, 5,154, 26,116,159, 49,139,112,237,228, 14,189,251,248,
+ 53, 4,135,195, 65,124,124,188, 84,155,155,197, 98,177,244,153,147,171,214,117, 84,161,186, 90,138,106,169,236, 93,230, 29, 54,
+118,118,118,223, 91, 88, 88, 8,180, 8, 41, 27, 27, 27,155,239,173,172,172, 4,250, 54, 29,106, 19, 89,181,243,106,197,204,152,
+ 49,163, 89, 98,139,207,231,183, 77, 75, 75,211, 76, 86,218,212, 86,161, 80, 32, 40, 40, 72,223,201, 75,207, 3,120,238,224,224,
+112,219,211,211,211,236,217,179,103, 56,118,236, 24,151,195,225, 56,215,229, 31, 18,137, 4, 44, 22, 11, 5, 5, 5, 42, 0, 31,
+ 67, 71,211,153, 92, 46,143,138,138,138,234, 50, 98,196, 8, 86, 74, 74, 10, 88, 44, 86, 77,184, 2, 2,224,187,111, 31, 18, 62,
+251, 12,129, 47, 94, 64,166, 84, 66, 32, 16,224,242,229,203,202,234,234,234, 40,109,124, 66,161,240, 64, 70, 70,134,151, 64, 32,
+128, 82,169, 4, 77,211, 32, 73,146, 96,179,217,125,204,205,205,119, 2,232,222, 32,177,108,125,187, 7,117,162,212,106, 74,156,
+245,172, 80, 87, 4, 20, 23, 23,227,252,249,243,232,217,179, 39, 2, 3, 3,145,155,155,139,244,244,116,188,255,254,251,154,115,
+ 30, 63,126,140,216,216, 88,180,111,223, 94,183,163, 71,170,208,190, 83, 91,112,185,220, 26,135,136,195,173,173,248,112, 52, 78,
+ 22,151,195, 5,135,205,129, 64, 40,208,219,209, 34, 8, 2, 36, 73,130, 32, 8, 8,133,194,186, 74, 54,221,186,117,107,113, 73,
+ 73,137, 3, 0,150, 80, 40, 4, 69, 81,122, 85, 90,234,202,136, 58,145,197,229,113, 53,206, 22, 0,148,149,149,201, 70,142, 28,
+249, 95,185, 92,254, 17, 90,182, 66,137, 1,255, 50, 16, 4,241,224,255,226,218,102, 96,120,173,176,122,163, 83,124, 83, 15,248,
+251,189,122,245,218, 55,105,210,164,129,219,183,111,135,177,177, 49,196, 98,177,166, 64,228,241,120,112,114,114, 66, 73, 73, 9,
+246,239,223,143,156,156,156,235, 0,102,235, 27, 34,177, 88,124,247,233,163,180,226,160,177,189,172,188,122,117, 50,207, 78,203,
+233, 41, 22,139,163,107, 69,214, 79,147,150,188,255, 81,208,104,127,112,121, 28,100, 63,205,195,181,243,183,255,191, 36, 38,139,
+197, 98, 17, 4,129, 9, 19, 38,232,117,254,196,137, 19, 17, 21, 21,133,166,154, 25,233, 58, 71,171, 90,134, 42,233,187,171,172,
+205, 91, 48, 21,243, 22, 76,213,136, 9,125,154, 94, 0,192,209,241, 68, 19, 66, 75,185, 61,226,196,254, 89, 93,253, 3, 92,186,
+121,181,197,189,152, 71,248,101,223, 43,147,225,224,174, 13,248,230,224,117, 56,217, 89, 64, 41,175,194,197, 95,127,200, 83,202,
+171,183,183,208,148,171, 17,183, 4, 1,134,161,155,117,239,117,226,137,195,225,192,219,219, 91,171,163, 85, 82, 82, 34,213, 85,
+ 48,104,210, 72,161, 66,101,149, 20,210,234,119, 38,180,124,251,244,233,115, 37, 60, 60,220,202,214,214, 22, 47, 95,190,108, 40,
+180,124,123,247,238,125, 37, 60, 60,220,202,206,206, 14,217,217,217,122, 79, 43,210,136,200, 66, 97, 97, 33, 81, 90, 90, 74, 91,
+ 88, 88, 52, 75,108,145, 36, 9,185, 92,142,228,228,100,125,255, 86,239, 17, 98,102,102,102,135,142, 31, 63,110, 86, 84, 84, 4,
+ 22,139,133,228,228,228,215, 70, 29,214,125,126,250,233, 39,238,168, 81,163,126, 44, 43, 43,107,114, 88,155, 90,173,222, 58,117,
+234,212,153,185,185,185, 22,182,182,182, 16,139,197,224,241,120, 96, 24, 6, 68, 80, 16,250, 62,127, 14, 37, 69, 65, 40, 20, 34,
+ 53, 53, 21, 7, 14, 28,168,170,157, 42,166, 81,131,140, 32, 8, 55, 46,151,139, 41, 83,166,188,118,224,240,225,195,248,160, 27,
+171,155,141, 25,187, 82, 13,129, 60, 95, 56,236, 34,139,197, 34,124,123, 12,232,216,163,223,112,239, 39, 9,247,158, 21,230,231,
+232,202,148, 84, 10,133, 2,238,238,238,120,240,224, 1,174, 94,189,138, 1, 3, 6, 32, 48, 48, 16,113,113,113,248,253,247,223,
+ 17, 27, 27, 11,130, 32, 96,101,101, 85,215,253,162,201, 62, 24,138,106, 53, 10, 94, 22,191,225, 94, 53,220,231,114,185,144, 75,
+149,122,165, 81, 74, 74, 10, 30, 60,120,160,153, 90,134,197, 98,169,167, 77,155, 6,134, 97,152,140,140, 12,152,152,152, 48, 51,
+102,204,160,216,108,182, 58, 55, 87,191,254,193,117,162,170, 78,100,177,185,156,215, 4, 26, 77,211,146,184,184,184, 89, 0,226,
+106,157, 44,192, 48,143,150, 1,255,219,184,128, 55, 23,150,214,233,104, 61, 7, 48,232,216,177, 99,147,207,158, 61,187,117,231,
+206,157, 54,193,193,193, 40, 45, 45,133,139,139, 11, 28, 28, 28, 16, 17, 17,129,200,200,200, 34,138,162,150, 2,104,204,250, 25,
+132, 38,230,172,201,125, 38, 14,151, 87, 86,206,245, 11,244,192,245,147,183, 66,237,237,237,103,179, 88,172,197, 51, 86,125,248,
+ 81,255,145,221,145, 26,155,129,187,191,199, 35, 63,171, 72, 39,103,195,206,240,230,230,230, 51,141,140,140,120, 0,148,141,212,
+138, 27,142, 58,212,112, 82, 20, 69, 41, 20, 10,156, 56,113, 66, 47,177,117,236,216, 49,200,100, 50, 80,111,182,175,106, 56, 25,
+154, 33,216, 28, 62, 28,157,220,161, 84, 86,129,166, 91, 60,160, 82,195, 89, 87, 3,125,198,227,193,182,168, 8,247,238,221,211,
+ 79,114, 15, 31,174, 43,141,100, 10,153,100,202,142,141,203, 34,230,135,124,107, 62,160, 87, 23,124,185,229, 48,148,202,131, 32,
+ 89, 36,132,124, 46,252,252,123,131, 5, 57,190, 15, 91, 94, 86, 93, 81, 58, 5,111, 46,197,243, 26, 39,211, 84, 11, 11, 3, 80,
+ 52,141,171, 55,239,235,125,239,154,210,158,162,192,102,179,241,244,233, 83,105, 99,163, 13, 89,172,154,102,206,186,154,122, 83,
+156, 12, 77, 19, 28,174, 0, 78, 46,158, 80,200, 43,223, 73, 26,217,218,218, 46, 63,115,230,140, 85,221, 84, 9,113,113,113, 32,
+ 8, 34,249,149,227, 88,115, 92, 42,149, 34, 33, 33, 1,113,113,113, 64,205, 8, 55,189,223,163, 58, 39,171,176,176,144, 16,139,
+197, 48, 50, 50, 34,227,226,226,228, 62, 62, 62, 49, 58,222,111, 13,167, 76, 38,123,161,173,255,164, 76, 38,107, 37, 16, 8, 56,
+ 13, 10, 81,199, 14, 29, 58,164, 54,210,132,248, 70, 56,203,203,203,239,173, 88,177,194,111,232,208,161, 88,190,124,121,137,133,
+133,133,201,247,223,127,207,102,177, 88,196,252,249,243,169,130,130,130,202, 31,126,248,193,236,236,217,179, 40, 43, 43,139,214,
+227,222, 37, 50,153,108, 86,175, 94,189, 14, 95,186,116,201,200,205,205, 13, 21, 21, 21, 96, 24, 6,135, 14, 29,194,252,249,243,
+ 33, 16, 8,144,154,154,138, 15, 62,248,160,186,186,186,122, 22,222,236, 59, 89,199, 73, 16, 4,193,208, 52,141, 53,107,214,104,
+ 38, 39,173,155,172,212, 68, 72,224,192,146,118,162, 69, 63,148,139, 38,127,249,195, 52, 0,160,212,106,234, 73,194,189,103,135,
+118,127,121,131,203,229,222,212,145, 70,171, 23, 45, 90,244,253,240,225,195,133,198,198,198, 40, 41, 41,193,237,219,183,113,231,
+206, 29,220,189,123, 23, 10,133, 2, 86, 86, 86,176,176,176,128, 88, 44, 70, 74, 74,138, 20,192,234,166, 56,121, 70, 28,184,118,
+172, 27,249, 91,227, 96,113,234,141, 54,172,239,110,113, 57, 28,189,222,163,126,253,250,161, 71,143, 30,117, 2,136,202,204,204,
+ 20,203,229,114,162,158,232,207,173, 19,228,206,206,206,234,163, 71,143, 50, 77,113,222, 61,176, 7,151,190, 90, 13, 30,151,139,
+165,201,217, 26,209,117,120, 64, 87,112,120, 92,120,140, 24, 83,255,218,189,168,105, 46, 68, 3,145,213, 84,217,241,214,239,166,
+129,243,111,203,249,191, 12, 49, 90,176, 4, 79, 29,126,145,201,100, 23, 63,253,244,211, 48, 95, 95,223, 79,183,109,219, 70,112,
+185, 92,172, 91,183,142,121,249,242,229,207,181,181,144,210,150,132,138, 97,152,159,255, 56, 29, 61,103,122,200, 72, 98,201,246,
+ 25,125, 98,174, 37,164,116,238,229,134,206,189,220, 16,115, 61, 9,187, 87, 29, 59, 74,169,168, 53,121,121,121, 89, 58,168,228,
+131,122,119,106,216, 25,222, 42,234,198, 53,171,230,142, 58,164,105, 58,252,216,177, 99, 11, 71,143, 30, 77,222,191,127,255,141,
+ 62, 89,117,203,238,208, 52,141, 43, 87,174, 64,169, 84,226,231,159,127,166,105,154,214, 62,143, 22,152,115, 59,182,135, 77,255,
+249,200, 57, 30,143, 75,224,206,205, 83, 40, 47,109,122, 84, 23,151,203,193, 79,135, 78, 43,185, 92,206,147,198,142, 43,149,202,
+236,107,215,174,217, 13,161, 40, 14, 73,146,141, 9,168, 70, 17, 30, 30,174,162,105, 58, 83,199,105,209,249, 57, 89, 35,190, 94,
+254,241,177,225,227, 63,181,235,213,171, 15,199,218,214, 14, 4, 65,160, 32,191, 0,169, 9,247, 85, 23, 79,253,152, 95, 85,173,
+223, 18, 60, 31,127,247,135,166, 79, 22, 0, 4,207,223,169,233,159, 5, 0, 35,102,172, 64, 80, 79, 47, 16,250, 88, 79,175, 68,
+ 22,173, 86,171, 33, 18,137,160, 86,171, 27,157,226,193,204,204, 76, 40,147,201,164,181, 19, 49, 54,105, 21, 49,192, 59, 79, 35,
+138,162, 60, 74, 75, 75, 81, 85, 85,133, 59,119,238, 48, 27, 55,110, 44, 44, 44, 44,212,116,218, 84,169, 84, 30, 37, 37, 37,168,
+172,172, 68,116,116, 52, 19, 22, 22, 86, 88, 92, 92,188,170, 57,239,144, 80, 40,236,198,102,179, 99, 74, 75, 75,105, 35, 35, 35,
+ 82,165, 82,169,124,124,124,248, 66,161, 80,239, 5,213,197, 98,241, 80,109,199, 92, 93, 93,211,210,210,210, 58, 80, 20, 85,127,
+ 13, 68,174, 76, 38,115,235,213,171,151, 62,249,199,162,131, 7, 15,226,244,233,211,254, 21, 21, 21, 83, 51, 51, 51, 15, 3,240,
+103,179,217,120,244,232, 81,178, 76, 38,155, 52,122,244,232, 67,165,165,165,247, 80,179, 4,143, 62,184,148,154,154, 58,197,195,
+195,227,224,250,245,235,141, 3, 3, 3,217,142,142,142,232,222,189, 59, 82, 83, 83,113,225,194, 5,213,222,189,123,171,170,171,
+171, 63, 6,112,165,233,100, 7,161, 86,171,193,227,241, 52, 31, 62,159, 15, 46,151, 11,137,148,193, 39, 91,210,165,106, 8,165,
+ 91,215,205,186,192, 0, 68, 94,118,122, 81, 65, 94,246, 61,130, 32,110,138,197,226,114, 45,113,198,147,201,100, 93, 24,134, 97,
+ 17, 4,177, 93,169, 84,206, 88,176, 96,129,195,166, 77,155,208,169, 83, 39, 20, 21, 21, 65, 36, 18,193,205,205, 13,133,133,133,
+184,127,255, 62, 85, 93, 93,189, 15,192, 6,212,246, 31,209,134,178,162, 10,180,182,119,126,205,249,100, 24, 6, 12, 5,168,228,
+ 20, 40, 37, 3, 5,161, 2,135,163, 2,151,203,213,199,121, 98,104,154, 70,169,131, 3,232,132, 4,220,189,123, 23, 12,195,104,
+117,213,220,221,221,245,200,216,105,240,248,188,215,154, 11, 9,130, 0,151,199, 3,135,199,109,108,228,140,193,197, 50,224, 31,
+ 13,125,219,198,203, 0,204,126,252,248,241,225,254,253,251, 71, 48, 12,195, 65, 77,123,228,173,183,249,243,188,188,188,135,209,
+ 23, 30,174,180,107,109, 17, 54,108,106, 31,116,234,226, 2, 74, 77,225,118,228, 35,252,188,233,236,241,220,236,220, 25,208, 99,
+237, 51,154,166,111,244,238,214,137, 68,189,185,186, 29, 29, 29,233,150,140, 58, 44, 47, 47, 95,187,116,233, 82, 44, 95,190,188,
+ 37,163, 14, 27, 69,124, 74,225,108, 2, 76,235, 17,195,250, 14, 1, 65, 50, 10,133,188,137,140, 15,154,153, 75,185, 92,206,147,
+ 7,113, 98,159,198,206, 43, 44, 44, 28,242,209, 71, 31, 93, 97,179,217,109,155, 19,231, 52, 77,103,230,231,231, 15,212,125,166,
+250,182, 92, 90,225,118,254,248,254,207, 46,157, 62, 56,132,166,169,246, 4, 0, 22,155,251, 76,165, 84, 94,150, 75, 43,182, 65,
+207, 69,165, 55,207, 14,192,162, 29,191, 99,207,242, 17, 88, 16,118, 18, 63,174,249, 4, 43,183, 28,195,183,203, 23, 97,227,206,
+255,226,203, 69, 83, 48,118,242, 71, 52, 67,144,127,234,123, 31, 44, 22,235,210,254,253,251,167,127,242,201, 39,154, 65, 11, 12,
+195,188,150,177,171, 84, 42, 41, 77,211,216,183,111, 31, 13,224, 82, 83,124,175,167, 17,193, 52,213, 95, 74,223, 52,170,168,168,
+248, 56, 32, 32,224, 16, 0, 62,195, 48, 79, 75, 75, 75,255, 3,188, 90, 26,170,178,178,242,227, 94,189,122, 29, 98, 24,134, 79,
+ 16,196, 27,199,245, 65,237, 84, 15,221, 44, 44, 44, 98,106,157, 44,126, 75, 58,196, 55, 21,213, 77, 52, 43,234,211,132, 72, 3,
+ 88, 80,111,198,247, 77,254,254,254,245, 23,149, 78, 46, 45, 45,237,214,130,112, 93,145, 74,165, 94,107,214,172,249, 76, 32, 16,
+ 4, 85, 87, 87,119, 4, 0,145, 72,148, 42,151,203,111, 72,165,210,109,208, 61, 55,149,130,166,233, 84,181, 90,237,109, 99, 99,
+ 83, 51,162,182, 86,108, 1,192,111, 49, 84, 12, 64,117,175, 49,197,127,209, 59, 96,145,145,145,109, 44, 44, 44,222, 35, 8, 98,
+ 44,195, 48,238, 18,137, 68,190,102,205,154,232,240,240,240,242,182,109,219, 14, 27, 62,124, 56, 97,105,105,137, 7, 15, 30, 48,
+197,197,197,167, 0,172,130, 30, 35,173,105,154,206,220,188,121, 51,154,251,190, 55,117, 92,169, 84,230, 69, 70, 70, 90, 15, 45,
+ 40, 96,211, 52,141, 17, 35, 70,188, 38,224, 26,226,201,147, 39,144,203,229, 77, 78,230, 40, 47, 47,197,128,207, 86, 0,181,163,
+ 63,235, 80,227,100, 49, 96, 20, 6, 93,101,192,191, 11,127,245,130,158,122, 89,139, 14, 14, 14, 19, 4, 34,254, 60,151,142, 14,
+ 62, 47,211, 11,146, 36,229,213, 71,197, 98,241,126, 45, 25,185, 94,156,205,156,176,212, 96,255,254, 69,156,175,230,209,162,192,
+ 48, 20, 24,154, 1,195,208,160,105,170,102,193,107,134, 6, 67, 81, 4, 65,224, 79,133,180,201,153,193, 27,134,211,194,218,218,
+122, 3,195, 48, 67, 89, 44, 22, 89,223, 12,171,255,189,214,201,186, 84, 88, 88,248,101, 35,206,235,255, 92,124,134,135,135, 55,
+ 42,254,245, 29,117, 56,110,220, 56,170,153,239,230, 13,145, 72,228,208,216,177,170,170,170, 44,177, 88,252,222,223, 36, 62,235,
+143, 24,108, 14,103,179, 71, 29,234,226,116,113,113,225, 43,149,202,174, 0,220, 8,130, 48, 7, 80,162, 84, 42, 47, 23, 21, 21,
+229, 3,232, 6, 96, 77,237, 53, 95, 1,136,249, 63,126,223,133,214,214,214, 7, 73,146,108,173,207,197,106,181, 90, 81, 82, 82,
+ 50,189, 65,133, 64,195,105,101,101, 21,195,102,179, 91,235,193,147, 83, 92, 92,220,205,144,127, 26, 56,255, 65,104,216, 9, 94,
+235, 76,241,127,133,208, 50,112, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,167, 11,173, 70,247, 13,195,106, 13, 48,
+192, 0, 3, 12, 48,192, 0, 3,222, 14, 23, 26,136,173, 11,117, 95,136, 38, 84,105,115, 44,193,150, 40,219,171, 6, 78, 3,167,
+129,211,192,105,224, 52,112, 26, 56,255,117,156, 6,188, 67, 24,108, 85, 3,167,129,211,192,105,224, 52,112, 26, 56, 13,156,255,
+116,104,109, 58, 36, 13,113, 99,128, 1, 6, 24, 96,128, 1, 6, 24,240,215, 64,111,161, 37,178,115,247,176,118,241, 57,100,209,
+186,115,156, 69,235,206,113,214, 46, 62,135, 68,118,238, 30,255,210,120, 19, 2,152,204,102,179,175,216,219,219, 87, 64,203,210,
+ 59,255, 0,152, 2, 24,139,154,249,125, 70, 1, 48,122,151,228,129, 0,123, 2, 48,111, 26,144, 53, 13,200,154, 0,204, 11,252,
+ 7,246, 27, 92,183,208, 33,224,230,197,201, 23,215, 45,116, 8,104,244,248, 82, 7,171,187,191,143,219,177,105,158,163,229, 59,
+250, 75, 19, 91, 91,219, 3,118,118,118, 47,108,109,109, 51,109,109,109, 15, 2, 48, 51,100,119, 6, 24, 96,128, 1,127, 25,234,
+250,104,213,125, 52,125,180,216, 0, 16, 17, 17, 17, 8,224, 15, 0,253,131,131,131,163, 26, 94,109,225,236,253, 73,251,118,237,
+151,127,189,110, 21, 97,111,107,109,164,166,104,101,198,139,108,207,181, 95,135,253,250,146,199,222, 90,154,149,240, 99, 11, 2,
+ 69,176, 88,172, 9,124, 62, 63, 24, 64,157, 96, 75,150,203,229, 17, 20, 69,157,128,126,195,180, 97,103,103,119,147,197, 98,181,
+105,206, 31, 83, 20,149,149,159,159,223,167,133,145, 57,206,217,217,249, 96, 96, 96,160,145,191,191, 63,120, 60, 30,214,172, 89,
+179, 84, 44, 22,111,211,151,192,194,194,213, 68,201, 23, 44,102,243,120,131, 25,149,194,155, 1, 3,144,252, 4, 90, 45,191,198,
+149,203,183,150,150,166, 75,244,164, 90, 5, 96, 70,109, 92,253, 8, 96,243,219, 60, 37,211,187, 64,165,162,106,158, 9, 46, 27,
+212,185,231,102,127,172, 94,189,154, 29, 28, 28,140, 31,127,252,177,207,129, 3, 7,102, 73, 36,146,107, 0,126, 3,240,236,109,
+159, 74, 59, 96,118,175, 62,125,118, 76, 95,186,148, 37,189,121, 19, 59, 14, 30,220,142,154,249,150,246, 52,247, 89,226,114, 49,
+214,218,154, 19,204, 48,232, 74, 0, 4, 1, 60, 42, 44,166, 35,149, 74,234, 4,244,152,139,173, 9, 76,198,235,195,241,127,105,
+ 46, 65,249, 51,230, 11,254, 8,143,190,229,207,110,124, 1, 96, 88,195,227,106,153, 96, 58,195,114, 10,150, 50,177,217, 0,182,
+188,101,180, 26,217,216,216,196,157, 59,119,174,181,191,191, 63, 27, 0, 98, 98, 98,166, 5, 7, 7, 15, 40, 44, 44,244, 6, 80,
+241,127,148, 9, 9,216, 36, 57,143,199,225, 12,166, 40,170, 51, 0,176, 88,172,120,133, 74,117, 69, 77,211,123,160,231,156,108,
+ 6, 24, 96,192, 63, 23,186,180,200,223, 28, 90,103,134,175,187, 57,166,254,182, 62, 68,182,157, 60,123, 14, 28,243,164, 92, 82,
+ 45,123,241, 34,183,116,201,188,141, 87,102, 45,250,238,236,150, 31, 34, 34,163,238, 37,223,245,240,127, 47, 73,100,219,201, 83,
+ 11,181,182, 54, 92,103,161, 80,248,112,239,222,189,202,212,212, 84,166,172,172,140,121,242,228, 9,115,234,212, 41,102,206,156,
+ 57, 50,161, 80,248, 16,128,179, 62,156,118,118,118,249, 79,174,255,206,228,196,197, 50,153, 49,247, 24,149, 74,197, 40,149, 74,
+ 70,169, 84, 50, 73,151, 34,152,184,223,111,128,202, 97, 0, 0, 32, 0, 73, 68, 65, 84, 78, 51,143, 78,157, 96, 20, 10, 5,163,
+ 80, 40, 24,185, 92,206,180,107,215,238,165,158,225,108, 8, 71, 47, 47, 47, 69, 68, 68, 4,243,235,175,191, 50, 75,151, 46,101,
+124,125,125, 41, 0,243,245,189,119,145,173, 91,144, 73, 43,159,194, 79, 66,246, 40, 47, 68, 95,102, 18,159, 63, 98, 18,159,167,
+ 49,225, 87,147,153, 25,203,118, 42, 77, 90,249, 22,138,108,221,130,116,221,187,133,133, 69, 79,130, 32,152, 58, 0, 96,218,180,
+105, 83, 89,255,227,236,236,252,218,199,201,201,169,178,109,219,182,207,172,172,172,186, 54,198, 57,169, 51, 24, 38,233, 23,134,
+ 73,250,133, 89,221, 15, 76, 98, 98,226, 93,134, 97,254,168,251, 72,165,210, 63,206,156, 57,243,199,135, 31,126,248, 7,128, 15,
+154,136, 39,189,226,115, 26,144, 37, 57,119,142, 97,182,109, 99,152,192, 64, 38, 25, 96,166, 1, 89,205,228,108,103,111,207,121,
+244,221,230, 89,138,115,231,126,102, 46, 94,188,192, 68, 70, 70, 48,103,207, 28,100,182,111,155,167,180,179,227, 36, 0,232,208,
+ 12, 78, 54,128,141, 0,182,162,198,185, 76, 45, 44, 44,100,242,242,242, 24, 0,169,181,191,109,181,177,177,217,130,198,221,183,
+ 65,245,157,172,207,134,218, 95, 28, 63,172, 15, 35, 41,127,201,140, 31,214,135,249,108,168,253,107,206,214, 80, 87, 87,147, 5,
+ 35, 58, 23, 38,198, 28,165, 22,140,232, 92, 56,212,213,213,164,133,241, 73,160,102,157,208,189,215,175, 95, 87, 51,245,160, 82,
+169,152,195,135, 15, 83, 22, 22, 22, 63, 55,131,179,163,141,141, 77,166,165,165,101,106,253, 31,109,124, 70,245,114,239, 59,109,
+173,149,231,135,129,205, 8,167,191,128,203,205,185,114,242,123,170, 56, 43,158, 81, 72,243,153,242,167,177, 76, 78,242, 93,230,
+240,254,173, 42, 30,155,157, 3,192,255,109,158,165,102,194,192,105,224, 52,112,254, 13, 57,155,210, 34,255,203, 96, 55,188,193,
+134,224,243,121, 33,107, 87,175, 32,202,138,203,164,178, 10,137, 66, 37,147,201, 72, 46, 35,139, 79,122, 94, 64,178, 89,101,159,
+ 45, 90,104, 18,178,114,117, 72, 21, 48, 69,207,255,116,246,245,245,189,127,250,244,105, 91, 75, 75, 75,148,151,151,163,184,184,
+ 24,247,239,223, 7,195, 48, 24, 61,122, 52,191, 71,247,238, 93,191, 88,179,230, 78, 78,110,110, 0,180, 23,188,175,196,139,165,
+ 53, 54,247,169, 89,139,246,203, 23,197, 53,165, 14, 65,224,192,184, 96,205, 57, 27,114,106, 86,203, 16, 8, 4,154, 5,137, 91,
+128,128,129, 3, 7,114, 1, 96,230,204,153, 21, 18,137, 36,180,214,225,208,107,165, 85,145,173, 91,144,181,131, 99,196,247,251,
+ 54, 11, 59,183,119,131, 82,165, 70,102,222, 75,176, 57,230,104,221,154,139,143,166, 12,230,244,235,101,105,189,241,171, 3, 23,
+242,104,140,170, 46, 74,187,172,141,203,220,220,252,240,137, 19, 39,112,242,228, 73, 0, 64,106,106, 42,220,220,220, 68,186,194,
+144,144,144,224,250,193, 7, 31, 28, 47, 46, 46,238,160,235,220,134, 19,227,243,249,124,244,233,211, 7,158,158,158, 56,119,238,
+ 92,255, 90,103,235,173, 32,189,121, 19,198,143, 31, 3, 81, 45,170,188,180,243,243,115,185, 27,121,225,168,245,133,200,100,108,
+217,114, 16,207,158,213, 24,109,174,174,174,152, 60,105, 28, 39, 62, 62,218,107,236,216,201,209,183,110, 61,235, 83, 43,148,116,
+ 97,253, 15, 63,252,176,170,109,219,182, 24, 59,118,236, 56, 47, 47, 47,123, 83, 83, 83,236,223,191, 31, 14, 14, 14,174, 10,133,
+226,233,185,115,231, 28,243,242,242,176,112,225, 66,228,231,231, 47,213, 70,212,127, 72,255, 47,248, 35, 60,250,118,242,155, 14,
+ 99, 83, 7,252,112,236, 4,158, 60, 60,220, 87,174, 76,254,130, 75, 69, 77,149, 50,252, 25,133, 89,198, 33,109,186, 5, 90,117,
+240,250, 0, 46,126,177,214, 50,234,214,243, 47, 6,183, 11, 99, 11,100,135,215,109, 17, 23,191, 65, 58, 54,156,229, 93,145, 98,
+153,112, 5,197,192, 58,186, 78, 96,105,220, 90, 6, 31,244,235,215, 79,147,112, 47, 94,188,128, 92, 46,135,135,135, 7,169, 80,
+ 40,130,244,140,215,142,239,189,247,222,159,145,145,145, 86, 29, 59,118, 44, 44, 41, 41,209, 28,176,183, 50, 31, 18,117,122,251,
+194,141, 59,254,235,126,132, 33,202, 10,147,207,198,235,224,242,239,221,211,239,234,197,211, 71,141,137,202,108,240,204,139, 0,
+186, 24,233,199,127, 2, 97,100,137, 9,115,150,176,131, 6, 14,104, 53,120,216,152,171, 79,210,158, 13, 4,240,192, 80,175, 55,
+192,128,127,181,171,197,252,211,238, 73, 35,180,130,131,131,137,198,110,144,102,104, 31, 59, 91, 43,225,246,239, 14, 61, 96, 41,
+ 21, 10,145,185,153,130, 99,102, 74, 19, 38,102, 44,165, 66, 85,233,226,234,194,163, 25,218, 71, 11,127,195, 33,158,132, 80, 40,
+ 60,253,219,111,191,217,114, 56, 28,208, 52, 13, 27, 27, 27,100,100,100,160,172,172, 12, 18,137, 4,207,146,147,209,214,217, 9,
+235, 66, 86, 56, 44, 92, 17,114,186,186,186,186, 27, 94,111, 70,124, 99,216, 40,165,122,125,221,232,186, 37, 88,222,168,242,215,
+254,214,200, 49,125,135,162,102,100,101,101,193,216,216, 24,222,222,222,198,183,111,223,190,213,132,200,122,141,211,194,194,213,
+132,230,243, 78,238,253,126,141, 80,169, 74, 64, 82,122, 9, 58,181,237, 11, 59, 43,103,188, 44, 81,224,238,253,223,144, 16,247,
+ 11,218,183,114,198,252, 57, 3, 4, 97,155,127, 61,193, 85,183,117, 46, 43,203,168,104,140,179,162,162,194,184, 93,187,118,112,
+118,174, 89,247,140,162, 40, 36, 37, 37,129,162, 40,205,126,253,237,161, 83,215,161,174,200,196,244,105,211, 80, 92, 92,108,220,
+ 24, 39,135, 5,245,146, 89,147,217, 66, 14,192, 19, 89, 42, 42, 43, 43, 53,203,112, 40,149, 74, 60,122,244, 8, 1, 1, 1,129,
+225,225,225,186, 84,145, 94,241,169, 4,190,221,241,243,207, 59,167,148,151,147, 0,240, 35, 65,208, 74,134,249, 86,223,103,201,
+214,150,115,234,210,197, 35,214, 44, 50, 5,150,102,223,224,254,253, 76, 40,149, 53,225, 45, 46, 46,192,130,121, 21,224,114, 76,
+112,238,220,127,173, 60, 60,250,156,202,203, 83,122,227,245,102,196,198,194, 41,184,120,241, 34, 22, 44, 88,128,164,164, 36, 71,
+ 22,139,133,123,247,238, 65, 40, 20,226,187,239,190, 99,121,120,120, 56,138, 68, 34, 92,186,116, 9,249,249,249, 68, 83,225,252,
+227,242, 31, 95,151, 63,187,241, 69, 30,113,105,232, 15,199, 78,224,211, 73, 19, 96,207,164,223, 50,107, 79,124,253,222,136,222,
+ 95, 50, 44,167, 96,145,137,143,133,155,247, 8,112,121,198,152,255,249, 6,164, 38,156,183,168,150,196,205, 35,168,108,167,117,
+ 91,194, 23,189, 17,206, 95,199, 81, 51,127,185,237,119,197,249,129,203,227, 71,179,238,137, 99, 15,196,189, 18, 90,174,108,130,
+164,204,128,154,229, 83,158, 62,125,138,103,207,158,129,205,102, 67, 42,149, 66,173, 86, 55, 26, 78, 71, 71,199,217,106,181,250,
+203,218,116, 62, 36, 16, 8, 62, 62,122,244,168, 85,125,161,109,227, 51,170,151,149,137,104, 96,126, 65,113,105,244,131,196, 39,
+ 75,102,143,237,127,243,110, 66,182,146,243, 97, 86,121,220,185,114, 45,241, 41, 16,242,120,167, 46,157,249,175,177,234,249,117,
+136, 60,250,131, 99,236, 6, 74,149,139,234,210, 42, 72,158,137, 33,255,126, 55,186,204,251, 12,231,207,254,106,236,213,185, 91,
+184, 92,165,114, 3,160,104,193,187,217, 28, 24, 56, 13,156, 6,206,191, 39,167, 86, 45,194, 48,140, 31, 0,187,218,221,226, 90,
+ 93, 96, 13,160, 8, 53,171,200,216,213,230, 29,188,122,151, 53,220,175,127,110,195,253,250,223,139,107,191,219,214,110, 31, 16,
+ 4, 81,162, 35,232, 14,168, 89,154,240, 66,237, 22,168,109, 74,212,217,241,152, 32,200, 10,138,162,249, 92, 27, 91,217,204,241,
+ 3, 59,255,126, 53,230,145,145,181, 41,123, 72,255,174,129,247,227,159,223, 33, 72, 66, 69, 16,164, 94,253, 62, 88, 44,214,132,
+237,219,183,119, 54, 53, 53, 5, 77,211, 48, 51, 51, 67, 97, 97, 33, 20, 10, 5,202,203,203, 33,151, 84, 64, 41,169,192,227,236,
+ 23,232, 29,216, 31, 99,134,190,231,241,223,179,191, 77,160, 40,234,120, 83,188,142, 62, 93, 53, 78,214,134, 54, 86,175,172,137,
+236, 50,141,232,250,166,171, 27,184,198,198, 24,188, 36,228,109,158,129,216, 11, 23, 46, 92, 28, 61,122,244,176,101,203,150,145,
+ 98,177,248, 82, 70, 70, 70,111, 0, 73, 58, 69, 5, 95,176,120,238,226, 96, 11, 11, 99, 6,225, 87,126, 67,191,174,147, 96,196,
+ 99,161,184, 66, 9,130, 0,146, 19, 79,131, 32, 44, 17,151, 42, 70,223, 46,166,120,111,136,135,241,217, 95,147,151,225, 85,255,
+160, 55,146,166,180,180, 20, 5, 5, 5, 80,169, 84, 80,169, 84, 24, 59,110, 28,142, 28, 62,140,170,170, 42, 72,165, 82, 40, 20,
+ 10, 80, 20, 5,146, 36,113, 37, 34, 28,217,207,147,209, 43, 32, 0,208,178,244,210,225, 71,224, 0,184,251,228,201, 19, 36, 39,
+ 39, 35, 39, 39, 7, 2,129, 0,246,246,246,216,176, 97, 3,228,242,154, 53,202,198,141, 27, 23, 8, 32,254,109, 95,168,103,192,
+129, 12,138,250, 98,216,153, 51,182,183,207,156,161,239,158, 63,159,195,151, 72,246,235,115, 45,151,139,177,155,191,157,211, 73,
+ 36, 18, 33, 39,107, 59,220,221,185, 88,250,153, 21, 66,191, 41, 2, 0, 44, 92,208, 26,221,187, 89,163,162,236, 87, 88,219,174,
+194,206,157,139,218,207,152,177,117, 90,117, 53,117, 72, 7,245, 23,191,253,246,219, 24, 55, 55,183, 86,177,177,177, 4,143,199,
+131, 80, 40,132, 80, 40,132, 64, 32, 64, 65, 65, 1, 50, 50, 50,152,205,155, 55,231, 2,248,162, 41,162,117, 59,197,119, 0, 12,
+251,108, 40, 46, 62,121,120,184,111, 43,214,243,199, 99,230,247,121, 17,119, 55, 86,242,251,149,219, 95,169,101,130,236,178,156,
+171, 43,218,117,143,181,158,183,124, 61,118,111, 94,139, 39,247,110,150,216, 57, 87,236, 17, 18,242, 70,195, 25, 24,184,142,237,
+ 96,103,169,158, 61, 99,140,249,121,187,232,217,145,108,162, 48,175,232,225,119,200,136,149,242, 59,116,157,218,209,149, 84, 92,
+191,126, 93,216,175, 95, 63,200,100, 50,141, 51,121,244,232, 81, 90,173, 86,223,104,244,217, 84, 42,191,204,205,205,117,144, 74,
+165, 24, 58,116,232,194,239,190,251, 78, 84,183, 70, 29, 69, 81,175, 57, 89, 95,111, 59,114,121,241,151,123,110, 92, 62,254,141,
+227,215, 33, 31,247,159, 50,127,227, 13,104, 89, 71,146, 77,146,243,206,159, 57,104, 47,176, 80, 65,104,249, 30,100,249, 82, 60,
+ 57,240, 41,170, 43,100,232,254,245,122, 0, 60, 40, 84, 36,246,143, 24, 11,142,149, 35,214,126,242,177,227,234,253, 63,204,161,
+105,122,187,161, 94,111,128, 1, 6, 52,128, 29, 65, 16, 17, 0, 16, 18, 18,178, 42, 52, 52, 52,145, 32,136, 8,134, 97,130,107,
+ 13,148, 8,134, 97,130,235,206,169, 21,103,111,236,215,157,219,112,191,225,247,149, 43, 87,122,133,133,133,109, 10, 8, 8, 56,
+ 30, 29, 29,253, 28,128, 46,161, 53,188, 86, 88,189,177,244, 14, 89,167, 32,235,111, 95,115,180,104,250,230,211,231, 47,170,223,
+ 27,212,163,117, 68, 84,252,131,143, 62, 26, 62,112,194,136,126, 67, 50,178,138,147,219,187,216, 91, 39, 38,198,155,210, 52,125,
+ 83,159, 88,226,243,249,193, 3, 6, 12, 96,151,150,150,194,200,200, 8,133,133,133,200,205,205,133, 82,169,132,172,188, 12,242,
+242, 50,200,202, 74,161, 44, 47,197,179,152,251,240,105,239,202,175,237, 44,223, 36,234, 92,151,134, 78, 85,125,103,139,103, 98,
+ 2,190,137, 9,136,230, 55, 27,126,104,110,110,126,183,174, 80, 85, 42,149,243, 86,172, 88, 81, 68,211, 52, 54,110,220,104,106,
+108,108, 28, 14,128,175,139,196,196,134, 21, 28,208,197,155, 76,201,136, 67, 31,223,233,232,216,238,125,100,228, 75, 81, 36, 81,
+162,160, 76,137,238,253,118,161,141,239,122, 56,117, 9, 69,114,102, 9, 28, 91,185,145, 96,243,155, 92,252, 57, 59, 59,251,181,
+253,227,199,142,161,186,186, 26,237,219,183,199,164, 73,147,176, 98,197, 10, 76,154, 52, 9,142,142,142,152, 50,254, 3,172, 93,
+187, 22,121,121,121,186,130, 42,239,216,177,163,220,197,197, 69,238,226,226, 34, 87, 42,149,168,172,172, 68, 89, 89, 89,195,248,
+ 94,212,220,136,180,181,181, 93,105,111,111, 31,103,107,107,155,200,231,243, 35, 31, 17, 68,138,204,197,197,174,247,200,145,132,
+231,248,241,172, 76,161,144,136, 2,140,245,225,178,182,228, 12, 15, 26, 48,140, 87, 86,122, 80, 99, 82,125,252,145, 13,254,140,
+242,194,237, 91,221,176, 96, 94,123, 16,164, 0, 4,201, 67,117,213,117,244,240, 15,224,154,155, 19,186,158,165,201, 0, 30,245,
+238,221,219,113,254,252,249, 4,159,207,199,194,133, 11,149,159,124,242, 73,218,164, 73,147,210,174, 93,187, 70,185,184,184,192,
+201,201,137,112,114,114,114, 0,240,168,246,154, 38, 97,218,158,248, 90,174, 76,190,101,238, 38,122, 78,193,186, 87,165,138, 63,
+118,221, 22,113,241,215,123,159,111,201,120, 82,237,250,228,222,205,226,180,132,243,116,198,131, 63,138, 94,166, 73, 92,191,222,
+251,124,203,170, 61, 47, 27,125,169,163,162, 64,159,142,136, 82, 86, 87, 85,179, 71,142, 8,170,158, 61,115, 66, 71, 75, 99,175,
+163,104,245,158,111, 27,231,214, 83,214,110,218,169,252,100,206, 98,229,143, 63, 29,100, 36, 18, 9, 42, 42, 42,176,115,231, 78,
+245,249,243,231,115, 41,138, 90,172,173, 14, 4, 0, 42,149, 10,179,103,207, 22,153,154,154, 34, 59, 59, 91,227,136, 2,128,184,
+176, 56,254,246,131,132,148, 37,255, 25, 23, 88, 37,151,203, 47,255, 17,147,236,233,230,210,154, 32, 24,173, 3, 81,120, 28,206,
+224,110, 61,122,176, 24,166, 12, 4,219, 25,207, 14,111, 70, 69, 94, 9, 42, 10, 74,192,226,136,160, 6, 31, 42,154, 7,115, 31,
+127,164, 62,136, 69, 43, 27, 59, 54,159,195, 25, 98, 40, 79, 12, 48,224,223,137,166,180, 72,125,177, 20, 22, 22,182,169,169,227,
+245,182,138, 6,251, 26, 33,213, 80,132,213,255, 14, 0, 97, 97, 97,155, 24,134, 9,142,142,142, 62, 6, 64,170,231, 45,204,170,
+183,213,127, 30, 45,150, 76, 17,186,108,197, 23,176, 48, 19,154,249,119,117,179, 63,119, 41, 42,230,102,116, 76,114, 27, 39,107,
+ 27, 70,165,176,248,118,235,238,214, 68,181, 52, 76,207, 64,120, 88, 91, 91, 67,169, 84,226,233,211,167,200,201,201,129, 82,169,
+132,186,170, 10,242,178, 50,200, 74, 75, 65, 85, 73,192,165, 40, 72, 11, 11, 96,101, 36, 0, 94,141, 72,212,225,188, 17,141, 10,
+173,186,173,192,212, 20,124, 19, 83,144, 28, 78,163,205,138, 90,224,231,239,239,127, 50, 33, 33,161,199,160, 65,131,190, 66,205,
+ 16,249,204,220,220,220,129,107,214,172,145,219,217,217, 97,246,236,217,157, 0, 76,215, 41, 50,121, 10, 15, 23,251, 78,232,232,
+ 58, 29,109,156, 6,160,172, 74,133,194, 10, 21, 10,202,148,216,191, 43, 0,167,126,244,199,159,167,250, 34,225,242, 96,148,169,
+236, 97,236,248, 33, 24, 74,225,213, 20,231,149, 43, 87,176, 97,195, 6,124,245,213, 87,216,184,113, 35,190,250,234, 43,228,230,
+230,194,219,219, 27, 89, 89, 89,184,120,241, 34,196, 98, 49,172,173,173,113,255,254,125,108,219,182, 13,127,254,249,167,206,155,
+174, 19,174,122,156,211,172,182,116,181, 90, 61, 67, 60,114,100,231,124, 75, 75,207,174, 93,187, 14, 91,184,112,161,107,239,222,
+189, 53,199, 93, 93, 93,157,133, 66, 97, 30,106, 70, 80,118,105,138,139, 6,186,218,216,120, 67, 33, 79,169, 77, 99, 14, 8, 66,
+128, 1,131,147,209,187,111, 12,148, 42, 46, 72,130, 15,146, 20, 64,173, 46,134,133,133, 35, 24,134,240,214, 17,196, 53,133,133,
+133,110, 87,175, 94, 37, 51, 50, 50, 32, 16, 8, 0,224,197,186,117,235,118,111,217,178, 37,201,202,202,138,138,136,136,192,217,
+179,103, 17, 28, 28,204,250,228,147, 79,220,156,156,156,246,233,186,239,117, 59,197,119,126,217,122,113, 34, 71,101,209, 69, 32,
+108,211, 22, 85,198, 31,206, 13,180, 22, 1,192,165,244,116,137,173,115, 69, 88,149, 36, 46,203,188,117,229, 55,151,210,117,141,
+ 56, 93, 71, 63, 76, 75,185,251,203,153, 75,229, 5,249,165,156,174,157,189,164,161, 27,150,115,219,180,237,240,237,218, 21,255,
+177,207,173, 16,148, 13, 94,120, 49,229,244,165,251,149, 83, 63,250, 84, 61,115,214,124,217,197, 75, 87,206,208, 52,221, 25, 90,
+ 70, 28,210, 52, 13,177, 88,140,196,196, 68,164,167,167,163,176,176, 16, 69, 69, 69,144, 72, 36,154,230, 70, 35, 73,197,133,221,
+ 63,159,127, 44, 18, 10,141,122,116,118,115,190, 23,155, 84, 32, 18, 10,141,220,218, 58,119,196,255, 99,239,186,227,162,184,214,
+246, 51,179,189, 81,150,206, 2, 42,160, 40, 42, 8, 68, 68,236,168,145,196,222,176, 68,177, 68,163, 73, 52, 70,147, 24,176, 36,
+118,141,215,168,209,152,168,137, 61,118, 49, 42,118,197,222, 5, 84, 4, 20,164,247, 14,203,246, 50, 51,223, 31, 2, 23, 13,101,
+209, 36, 55,247,187, 60,191,223,176,236,238,204,179,231, 76, 57,231, 57,239,251,158,247, 96, 73,157,237, 8, 69, 81,222, 2,145,
+ 16, 0,129,242,184,235, 80,148, 41,160, 40, 87,160,178, 84, 1,173,158, 5,141,150,132, 90, 71,162,101,239, 1, 80, 40, 53, 80,
+148, 84,128,166, 40,159,230,238,166, 25,205,104, 70, 3,125,125,100, 88, 88,216, 2, 19,247, 53,217,189,249,186,240, 10, 11, 11,
+ 91, 64, 16, 68,100,120,120,120, 71,212, 63,161,170, 54,182,215,177, 1, 48, 33,189, 67, 73, 73,146,194,140,104, 63,114,238,252,
+111,206, 30,216,177,217, 78,171, 85,101, 90, 75, 37,148, 68,196,179,249,112,198, 74, 84, 42,202, 70, 40, 77, 79, 71,128,178,178,
+ 50,164,166,166, 66, 40, 20,130,203,225,128, 82,171, 65,169,149, 80,151,149,128,212,107,193,165, 40, 88,137,132,104, 41,115, 64,
+ 43,123, 7,147, 56,147,163, 46,212, 4,190,215,118, 23,254,171, 75,123,240,196, 18,240,204, 36,248, 36,242, 42, 0,128,203,229,
+ 2,139,151,155,100, 52,113,114,114, 58,185,127,255,126,110, 81, 81, 17, 98, 99, 99, 31, 1,168, 0, 96, 6,128, 78, 72, 72,184,
+ 20, 23, 23, 55,216,195,195, 3, 0, 90, 55, 70, 38, 47, 38, 41,131,145, 65, 86,126, 58,210,178, 99, 96,101,225, 6,142,168, 45,
+ 10,203,245,224, 11,221, 96,208,254,219,251,168,145,103, 64,173,103,153, 84,119,157, 78, 7,163,209, 8,163,209, 8,157, 78,135,
+143, 62,250, 8,183,110,223,198,193,223, 47, 35,245,197,115,180,115,117, 64,104,232, 68,116,233,210, 5,183,111,223,110,144,107,
+146, 47, 12, 78, 18,176,215,191, 79,130, 39,177,214,118,253,250,252,189,198,196, 22, 65, 16, 12,234,113, 69,190,134,239, 3, 3,
+ 3,219, 60, 87, 42,241, 52, 49, 17,253,151, 44, 1, 0,156, 57,115,230,149,186,204,155, 55,143, 23, 31, 31,255,225,195,135, 15,
+ 63,204,205,205, 93, 15,160,238, 96,115, 6, 56,125,250, 14,102,206,140, 71, 81, 81, 17, 0,224,208,129,127,235,210,180, 84, 61,
+222, 27,244,210,163,101,105,105,137,245,235,189, 76, 58,159, 20, 69, 97,251,246,237, 53,238, 66, 0, 96,179,217,221,231,205,155,
+ 55,178,174,253,219,180,105,195,109,140,115,238,104, 39,193,205, 71,204,167, 22,109, 90,117, 52,183,233,132, 18, 67,140, 87, 76,
+ 78,222,236,185,163,157, 54,110, 56,154,163, 17, 18,218,221, 4,149,229,194, 22,104,246,152, 82,198,148,115,155,117, 37, 45, 39,
+239,201, 47,146, 47,156, 53,253, 3,107,115, 75, 59,229,175, 63,174,150,146, 44,146, 57,249, 80, 95,222,209,221,218,114, 88,215,
+ 31, 20, 51,231, 46,142,209, 25,179,102, 33,235,228,115, 52,144,226,130,162, 40,228,230,230,162,168,168, 8,153,153,153, 40, 46,
+126,233,126, 45, 46, 46, 6, 77,211,111,211, 32, 66,157,153,137,140,227,191,162,213,196,137,240, 95,190, 12, 20,205,134, 90, 69,
+ 97,125,183,126, 40,171, 80, 67, 75, 19,144,189,211, 13,211,207,220, 0,201, 80,192,182, 45,205, 61, 73, 51,154,241, 63, 10, 83,
+210, 59, 84, 11,162,213,171, 87, 15,254,179,127,191,182,216, 90,189,122,245,211,213,171, 87, 55,229,183, 94,119, 25,214,188,175,
+142,209,186, 90, 43, 0,237, 15,157,102,101,113, 66, 74,124, 60, 59, 87,169, 86,138,236,237,108,181, 34, 1,159,174,144, 87,178,
+ 98,158, 60,210, 43,243, 95, 60,107, 66, 61, 18,226,226,226,188,114,115,115,145,153,145, 1,163, 90, 9, 82,171, 3,163, 81,161,
+127,143,110, 16, 0, 16,144, 4,184,180, 30,108, 22, 15,149, 10, 57, 0, 36, 52,218, 57, 26, 12,127,176,108, 17, 4, 1,158,153,
+ 25,120, 98, 49,120, 18,179, 87, 44, 92,166, 88,108,248,124,254,254, 35, 71,142, 56, 58, 57, 57, 97,217,178,101,112,118,118,246,
+148,201,100, 42, 11, 11, 11,161,189,189, 61, 58,116,232,128,110,221,186,225,236,217,179,128, 9, 57,165, 12, 70,193,227,103,233,
+232, 94, 92,122, 27, 55,174,254, 12,157, 90, 11,191,222, 63, 67,207,110, 5,219,142, 75, 65, 39,239,131, 42,255,196, 75,235,129,
+195, 16,100,103,166,131, 96,241,158,154,106,121,170,254,255,209,163, 71, 56,112,226, 26, 28, 91,182, 71,102, 82, 34, 18,175, 92,
+194, 45, 91,107,180,108,223,161,198, 13, 84,111, 25, 41,176, 87,108,121,153, 38,106,209,167, 31,240, 75, 75, 75,249, 86, 86, 86,
+218,234,115,231,232,232,248, 54, 98,235,131, 47,191,252, 18,229, 28, 14, 48,104, 16,184, 41, 41,208,235,245,232,218,181, 43,252,
+253,253, 1, 0, 93,187,118, 5,155,205, 70,167, 78,157, 32,147,201,176,101,203,150, 15,234, 19, 90, 36,129, 88,163,177,196,211,
+221,221,189, 70,104,237,217, 91,132,152,135,239,130, 0, 15,155,126, 76,174,217,183, 69,139, 22,200,207, 75, 1, 65, 48,113,141,
+148,113,185,131,131,195, 98, 71, 71, 71,247,239,191,255,158, 37, 16, 8,240,241,199, 31,187, 41, 20,138, 86, 85,166,100,132,135,
+135, 3, 0,190,253,246, 91, 44, 89,178, 4, 90,173, 86, 85, 31,217,158,245,222,178,194, 82,250, 67, 70, 33, 26, 17,100,211,202,
+187,111,112,127,184,121,244, 69,223,224, 76, 0, 88,101,197, 78, 31,179,118,161,229,113, 75, 51, 98,231,133,115, 23,191,237,209,
+187,239,194,175, 21, 87, 86,124,183,189,188,209,152,199,138,140,221,149,207,120, 99, 55,108,222,186,119,195, 55,225,115, 4,153,
+ 69,186,178,156, 50, 70, 33,225,179, 37,173,237, 9,201,236,249,203, 83,115,115, 83,190, 64,214,185, 70,103, 90,210, 52,141,148,
+148,148,154,152, 62,141, 70, 3,165, 82,137,172,172,172,154,123, 70, 45, 54,127,111,214,148, 33, 62, 74,181, 90,117,239, 73, 82,
+230,162,207, 38, 4, 42,213,106, 85, 82, 90,230,115, 96, 83,157,106,140, 36,201, 39,170, 74, 85,127, 85,185, 6, 69,177,207,224,
+220,175, 37, 12, 70, 2, 58, 35,133,162,146, 74,104,141, 0, 69,114,208,113, 76, 40, 40,130,141,226,220, 28,144, 44,214, 35,188,
+ 26,180,223,140,102, 52,227,127, 7, 13,106,145,106,139, 86, 96, 96,224,193,218, 86,167,234,255, 1,104,209,112, 40, 79, 81,109,
+ 49, 85,237, 78,172,239,119, 94,227, 53, 21,127,136,209,106, 52,189, 67,245,111,186, 88,200,101,255,250,118,130, 51,109, 52,182,
+ 43, 44, 46, 48,178,217,124,142,139,133, 58,175, 52,211,244, 95,215,106,181,145,151, 46, 93, 26,254,238,187,239,242,147,158, 60,
+130,174,162, 2,186,138,114,112,104, 35,172,132,157, 65,234,181, 32,116, 58, 56,121,210,208, 84, 10,113,237, 86,156, 65,171,213,
+ 70,154, 42,180, 72, 22,235,213,184, 44,137, 4,124, 51,115,240, 37,146,215, 93,139,141,137, 2,209,128, 1, 3,250,117,237,218,
+ 21, 12,195, 96,251,246,237,208,235,245, 60,189, 94, 15,157, 78, 7,189, 94, 15,185, 92,142,189,123,247,226,167,159,126,186, 5,
+ 96, 87,163,157,153, 81,119,233,252,197,168, 46, 83, 39, 12,230,156,137, 92, 15,163,142,130,154,112,134, 82,105,128, 66, 39, 2,
+101, 61, 17, 40, 56, 13, 22, 91,128,192, 78,110, 56,113, 52, 66, 15,163,246,178,137, 42,252, 21,171, 80, 86,102, 58,178, 95, 60,
+135, 68,158, 15, 91,115, 17, 84, 41,207,225, 23, 58,233,141,172, 19, 46, 46, 46,160,105, 26, 65, 65, 65, 53,193,213,111, 42,182,
+ 74, 74, 74,112,234,212, 41,116,237,218, 21,189,123,247, 70, 78, 78, 14, 82, 82, 82, 48,112,224,192,154,125, 30, 61,122,132,152,
+152, 24,180,110,221,176,145,176,184,212,112, 38, 59, 43, 54,100,216,176, 97,220,187,119,239,130, 97, 24,120,120,152,195,220, 76,
+ 12,130,228,163,125,123, 59, 0, 47,199, 0,125,250,244,129, 92,158, 98, 44, 43, 99,206, 52, 82,221,253, 0,126,215,233,116,201,
+189,122,245,146,189,120,241, 2,115,231,206,101, 31, 58,116,168,218,148,140,176,176, 87, 39, 83,168,213,245,187,238,219,121,123,
+126,229,102,148,246, 22, 8, 91,185,154,219,116,130,155, 71, 95, 0,192,187,131,167,194,173, 77, 11,200,139, 31,187,106,212,233,
+ 35,184,236, 50,233,227, 77, 57,241,194, 65, 94, 83, 52,133, 87,147,240,210,117,218,232,101, 87, 39, 29, 42,200,228, 76, 60,252,
+251,201,179, 51, 6, 14, 30,202, 49, 80, 70,163, 87, 75,142,229,145,227,167, 11,115, 50, 50,127, 64,230,185,184,127,219,255, 26,
+180,226, 81,114,185, 28, 98,177, 24,113,113,113,218, 65,131, 6,241, 73,146, 68,114,114,114,141,208,178,179,177,234,208,221,223,
+203,115,197,134,189,231,197,124, 62, 63,184, 79,231,246,241, 73, 25,217, 12, 67,164,215,107,109, 53, 24, 46, 62,137,125, 20,100,
+ 43,107,195, 74,185,122, 23,214, 61, 7, 66,171, 37,161,214,209,208, 26, 1, 35,139, 11, 71,223, 0, 88,182,110, 15, 6,192,131,
+187,183, 12, 90,131,225,124,115, 95,211,140,102,252, 79, 91,181,152,134, 68, 82,213,255,165, 0,210, 87,175, 94, 93, 92,203,218,
+ 84, 4,224, 17, 0,159,170,253,138, 94, 59,174,136, 32,136, 7, 12,195,248,215,226, 41,170, 37,184,106,255,175,123,109,159, 71,
+ 77, 16, 89,181, 95, 95, 21, 90,245, 77,169, 4, 0, 27, 27, 27, 59, 63,191,206,173,127,217,113, 24, 12,195,224, 89,204, 58,148,
+ 21, 38, 98,241,170, 59,173,157,156,156,122,231,228,228, 92, 51,165, 4, 20, 69, 29,218,185,115,231, 23, 1,239,248,249,185, 58,
+ 59,227, 81,122, 26,184, 12, 5, 46, 69,129,212,107,193,166,116,112,246,162, 64, 18, 18,228,230, 86, 96,205,254,195,113, 85, 89,
+226, 27,132,231,192,161, 88,150, 93, 1,130, 32,240,125,160, 23,120,102, 18,112,197, 18,124,114, 50,170, 70, 92, 69, 46, 11, 7,
+ 79, 34, 65,235, 0,147, 18,194,171,174, 92,185,242,240,201,147, 39,254, 94, 94, 94,248,226,139, 47,144,158,158, 14,154,166, 81,
+ 80, 80,160,201,203,203,203, 41, 42, 42, 74, 7,112, 28,192, 47, 48, 33,243, 56, 87,171,217, 24,121,108,207,172,192, 30,189,109,
+134,141,248, 9,191, 31,157,135,242, 10, 57, 84, 70, 33,148, 26, 35,148, 90, 22,172,172,189, 17,208,169, 19,114,115, 10,241,244,
+238,121, 5, 91,171, 90,215,148, 27,148, 32, 8,196,196,196,192, 93,102,134,231, 55,174,193, 70,196,129,143,204, 1,178,238, 61,
+106,242, 75, 53, 4, 14, 11,198, 15, 62,248,160, 38, 51,252,128, 1, 3,210, 38, 78,156,232, 56,111,222, 60,236,216,177, 3,183,
+110,221,250, 67,128,118,239,222,189,113,253,250,245,165, 0,190,109,204,168,167,211,233,224,233,233,137, 7, 15, 30,224,210,165,
+ 75,232,219,183, 47,122,247,238,141,199,143, 31,227,194,133, 11,136,137,137, 1, 65, 16,176,182,182,134,225,165,120, 54,212, 71,
+166,215,227,200,119,107,119, 46,216,176,225,167,142, 19, 38, 76,192,177, 99, 7, 49,117, 74, 59, 16, 36, 31, 4,193,199,208, 33,
+237,176,108,249, 3, 4, 4,244,129,141, 13, 7, 27,214,159, 72, 85,171,169,189, 38,156,198, 21, 23, 46, 92,144,105, 52, 26,148,
+151,151, 51, 18,137,132, 40, 41,121, 57,163,181, 46,139,150, 74,165, 18,212, 71,244, 36, 58, 97, 93,121, 37, 83,198, 40, 98, 70,
+148, 26, 99,188,251, 6,103,225,221,193, 83,112, 49,114, 23,162,206, 95,130, 21, 59, 61, 13,226,202,179,197,105,197,242, 60,165,
+199,214,246,239, 76, 99,101, 43,207,111,157, 61,244, 57,203,209,145, 62, 18,254,179,188,188, 33,161, 5,128, 40,141,223,119,242,
+ 56,131,161,221, 2, 3,218,120,181,112,228,149, 21, 23, 50, 71, 79,156,141,211,167, 29, 59, 85, 75, 96, 49,141, 8,245,101, 97,
+ 97, 97,223, 84,253,191,123,209,162, 69,211,214,172, 89, 99,155,159,159, 95, 19,163, 85, 88, 92, 26,213,109,208,108,170,164,188,
+ 66,183,115,195,252,209, 66, 1,159,183,104,205,206,171, 6, 22,238,214,199,107,164,233, 45, 99,230, 46,158,147,244, 44,198,169,
+149,144,135, 19,243,191,197,163, 11, 87, 96, 32,185,152,121,233, 30,180,122, 10,229,197, 37,184,252,225,167,144,216, 75,241,211,
+213, 99, 5, 52, 77,255,220,220,213, 52,163, 25,255,187,168, 79,139, 16, 4, 81, 87,142,189,130, 58, 62,123,208,208,113,245,240,
+252, 25,168, 55, 43,188, 73, 83,240,138,139,139, 11,175, 95,191,135,171,145, 43,112, 45,114, 5,158,198, 60, 66,110,142, 14, 57,
+ 5, 26,152,155,155,223,105,224,208,215, 51,199, 50, 42,149,106,228,162,197,223,228, 11,132, 34,244,234,215, 15, 14,182,118, 16,
+113, 57, 96, 25,105,176, 8, 14, 20, 69,150,120,254, 88,133,175,119,238, 43, 84,168, 84, 35,235,232, 36,250,215, 39, 50, 8,130,
+ 0,223,220, 12, 60,137, 25,248,102,230,175,184, 17, 5,230,230, 16,152,153,131,205,227,213, 21, 12,255, 7, 78,133, 66, 49,106,
+244,232,209,101, 21, 21, 21,152, 54,109, 26,174, 93,187, 22,115,254,252,121,243,199,143, 31, 11,139,138,138,218, 0, 24, 0, 96,
+ 91, 3, 34,235, 21,206,178,178,148, 74,198,168, 29,187,250,155,207,213, 26,163, 53, 66, 38, 29,130,152,204,130,145,162,193, 0,
+144, 89,241,208,189,255,114, 20,234,186,225,208,214,149, 42, 90,175,153,240, 90, 14,173, 87, 56, 25,134, 97,236,237,237,255,112,
+ 14, 46, 93,186,132,144,209,163, 16, 60, 98, 56,108, 93,221, 97,215,127, 32,130,167,205,196,214,173, 91, 65,146, 36,108,108,108,
+ 94,239,120,107, 56,247,196,130,115,224, 9,136, 3, 79, 64,236,142, 1, 27, 64,232,190,125,251,190,243,241,241,185,114,235,214,
+173,117, 0,198,214,254,173, 90, 88,242,154, 53,171,174,107,180,112,206,156, 57,234,164,164, 36,136,197, 98, 24,141, 70,220,186,
+117, 11, 63,253,244, 19,190,255,254,123,196,196,196,192,218,218, 26,173, 91,183,134, 86,171,197,131, 7, 15,212, 0, 22, 54,192,
+ 73, 23, 21, 25, 71,109,218,180,166,100,240,224,158,216,185,243, 71, 56, 56,116, 3,135,237, 0, 54,199, 22, 98,137, 39,126,253,
+229, 59,188,255,190, 31, 78,158, 56, 92, 90, 92, 98, 28, 5,192,104,194,189,164,185,119,239, 30,182,110,221,138,209,163, 71,231,
+132,132,132, 80, 21, 21, 21, 53, 22, 45,134, 97,192, 48, 12,150, 84,197,152,105,181, 90,126,125,156,211,191,142,203,153,191,242,
+233,178,130,252,156,174,215,174,220,249, 32,234,252, 37,164, 38, 69, 33,234,252, 37,220,136,186, 29, 86,144,159,211,213,175, 75,
+ 91,238,200,105,179,190,218, 19,113,140, 37, 49,119,196,158,136, 99,172,241,179, 63, 95,217, 57,184,239,194,198,238,249,170,235,
+200, 40, 10, 11,194, 87,173,219,172, 48,234, 53,228,191,126,216,146,171, 46,202, 91, 88,235,190,100, 26,187, 63,213,106,245, 54,
+141, 70, 35,211,104, 52, 50,173, 86,187, 48, 61, 61,189,215, 23, 95,124, 81, 68, 81, 84,141,181,180, 40,254,228,157,196,155,187,
+ 87,217,217, 72,133,221,252, 59,182, 91,191,237,232,213,204,172,130,223,106,229,208,170,171,156, 26,133, 90, 51,106,248,200,137,
+202,242, 50, 45, 2, 63, 15, 3, 45,144, 64, 75, 1, 6,134, 5, 35,193,198,147, 21,235, 33,180, 50,195,254,180,104, 85,133, 65,
+ 63, 10,175,230,208,106,168,238,111,131,102,206,102,206,102,206,127, 38,231,127, 51, 28,241,234, 90,135,142,175, 88,180, 26,155,
+ 82,233,228,228,212,107,216,208,254,232, 51,120, 17, 24,134, 65, 98,244, 90,148, 21, 61,131,147, 3, 31, 41,153,242, 64, 0,215,
+154, 80,152,204,244,172,172,174,115, 22, 46,138, 8, 25,208,175,189,151,171, 43,191, 85,171,150, 16,219,217,161,184,184, 8, 55,
+239,198, 27, 86, 30, 56, 18, 87, 37,178, 76,114, 76,210, 52,253, 50,200, 29, 64,191, 57, 95,131, 96,177,128,170, 52, 14,213, 29,
+163,171,127, 55, 16,108, 54, 40,134,134, 86,171, 53,101,182, 92,246,139, 23, 47, 70, 77,152, 48,225,114,100,100, 36, 25, 28, 28,
+236,123,252,248,241,183, 89, 51, 15,202,194,164, 43, 0, 6,175, 12,159,113,168,107,223,225,230, 30, 29, 59,115, 59,183, 98, 65,
+111, 32,144,155,147,129,200,136,251,250,248,123,231,229,140, 81, 51, 86, 85,156,116,165, 33, 46,189, 94,159,217,166, 77, 27,251,
+173, 91,183,214, 4,195, 83, 20,133,226,226, 98,220,185,115, 7,222,254, 1,104, 63,229, 67, 20, 21, 21, 97,211,166, 77,104,209,
+162, 5,134, 12, 25,130,210,210, 82, 24,141, 70, 83, 29,190, 20,128,243, 85, 27, 94, 19, 89, 68,213, 18, 64, 13,186, 13,221,221,
+221,121, 26,141,198,151, 97, 24, 22, 65, 16, 27,117, 58,221,228,240,240,112,199, 85,171, 86,161, 93,187,118, 40, 46, 46,134, 88,
+ 44,134,135,135, 7,138,138,138,112,255,254,125, 74,165, 82,109,197,203,133,172,139, 26, 41, 95,242,253,251,105, 93, 63,251,236,
+147,136,239,214,204,240,208,104,251,240,172,172,122,128, 97,140, 40, 42, 74, 71,165,252,150,126,249,178, 93, 47, 10, 10, 13, 35,
+ 1, 36,153, 88,231,111,103,205,154, 5, 0, 2, 0,139, 82, 82, 82, 98,219,183,111,239, 81,159, 69,203, 20,108, 56,154,163, 1,
+112, 96, 84,176,108,174,188,248,177,135, 21, 59, 61,173,171, 23,189,105,195,209, 28,141,185, 76,185,162, 56,253,218,243, 60,229,
+249,173,123, 34,142,177, 38,141, 24, 69, 57, 75,146,194, 4,118,204, 81, 19,168, 25, 31, 31, 31, 23,130, 40,117, 43, 44,121,246,
+112,234,180, 25, 99, 44,184,234, 51, 62,206, 37,173,201, 22,126,130,152,152,152, 52, 52,113,102,104, 21,158,231,228,228,244, 10,
+ 15, 15, 63,207, 48,204, 43,177, 9,133,197,165, 81,129,131,103, 49,229,229, 21,177, 69, 9, 39, 77,201,165,118,255,126,116, 76,
+ 63, 47,111,191, 99,223,173, 90, 99,223,103,206, 23,236,231, 87,174, 2,148, 1, 25,215,174,130,226,235,232,245,183, 47, 22, 84,
+232,245, 35,208,156, 21,190, 25,205,248,159,183,102, 53,164, 69,254,225, 24,132,122,130,225, 77,174,140,187,155,211,249,118, 30,
+173, 6,180,112,182, 5, 0,164,164,229, 34, 37, 45,231, 66, 74,106, 78,112, 35,138,183,190,233,149, 53,139, 74, 19, 85, 41, 28,
+ 24,211, 22,149,126,133,211,218,218,250, 33,155,205,118,110,202,217,160, 40, 42,183,184,184,216,207,196,114,142,119,117,117, 93,
+147,145,145, 17, 65,211,244,220, 38,170,253, 58, 57,171, 23,149, 38,217,188,254,140, 81,231, 13, 0, 4,155,103,202,162,210,181,
+ 57,189, 37, 18,201, 54, 14,135,211,162,250, 58, 86,199, 96, 81, 20,197,210,235,245, 2,138,162, 88, 0, 8,146, 36,141, 28, 14,
+ 71, 67, 16,132,209,104, 52,102,106,181,218, 25,248,119,194,209,134,234,222,104, 71, 95, 37,180, 80,135, 69,235, 18, 0, 36, 37,
+ 37,181,149, 74,165, 99, 9,130, 24,205, 48,140,103,101,101,165,118,241,226,197, 49, 71,142, 28,145,187,186,186,190, 55,104,208,
+ 32,226,241,227,199,136,139,139, 99, 74, 74, 74,142, 86, 89,177, 82,154,120, 47,145,124, 62,107,156,149, 21, 57,136, 97,224, 3,
+ 6, 4, 65,226, 73, 69, 5,125, 70,165,162,126,171, 18,140, 77,189, 63,171,241, 65,171, 86,173,118,165,165,165,113,234,179,164,
+214, 87,247,215,177,118, 97,199, 69,129, 61,123,142,186,115,227,198,241,249, 43,159, 46,171,253,221,236,225,210,169,227, 63,157,
+179,246,192,150, 31,230,111,254,189,108,167, 41,229,244,245,245,117, 39, 8, 98, 44, 0, 47,134, 97,218, 48, 12, 33, 32, 8,166,
+140, 32,136,167, 0, 30,235,116,186,200,248,248,248,236,183,168,251,155,140,112,235,227,172, 89, 84, 26, 20,213,137, 2, 24, 19,
+ 23,149,254,187,203,217,204,217,204,217,204,249,159,227,252,111,198, 71,117,124,102, 90,102,248,106,164,164,230, 4,167,164,230,
+160, 77,155, 54, 76,114,114,114,147, 68, 90,125,157, 52, 69, 81, 7, 85, 42,213,193,183, 33, 41, 41, 41,233,252, 23,159,188, 3,
+105,105,105, 7,254, 76,194, 42, 33,181,172,106,123, 83, 60, 81, 40, 20, 1,166,238,172,215,235,255,138,115, 67, 84, 89,179,150,
+214,183,195,128, 1, 3, 50,244,122,253, 37, 0, 89, 4, 65, 88, 2, 40,213,235,245,231,141, 70, 99, 65,114,114,114,231,245,235,
+215, 87,103,190, 95, 14,224,225, 27,150,131,214,106,169,253,185,185,212,254,191,160,142,204, 60, 4, 45, 0, 0, 32, 0, 73, 68,
+ 65, 84,251,117, 58,221, 60,107,107,235,214, 26,141,134,167,209,104,184,181, 39, 31, 8,133,194,162,134, 2,226,107,195,210,140,
+216,205,101,151, 89, 91,154, 17,175, 11, 41, 88, 57,225,152, 90, 25,215,206,202, 9,199, 76, 45, 88,108,108,108,138,143,143,207,
+ 62,146, 36, 93, 25,134,177, 7, 24, 11,134, 65, 17,195, 48,197,108, 54, 59, 39, 62, 62, 62,231, 31,212, 8,105,140, 52,189,206,
+168,211,253, 59,238,176,121,118, 97, 51,154,209,140,255, 63,168, 55, 70,139,221, 84,166,228,228,100,162,249,124, 54,163,182,216,
+106,232,203,140,140, 12, 45,128,219, 85,219,235,120, 8, 96,200, 63,189,130,121,121,121,126,245,125,103,170,200, 2, 94,198,108,
+ 1,113,117,102,103, 95,178,185,172, 18,155, 35,190,106,106,217, 30, 61,122,148, 9, 19, 93,236,205,104, 70, 51,154,209,140,191,
+ 12,111,111,209,106, 70, 51,154,209,140,102, 52,163, 25,205,104, 70,157,216, 94, 75,112,189, 98,221, 34, 80,255,204,129,166,248,
+ 94,223,100,246,193,165,102,206,102,206,102,206,102,206,102,206,102,206,102,206,255, 57,206,255,175,248,131,200,250, 59,208, 60,
+245,181,153,179,153,179,153,179,153,179,153,179,153,179,153,243,127, 65,100,189,190, 1,104,118, 29, 54,163, 25,205,248, 31,198,
+145, 35, 71, 76, 90, 84,116,220,252, 95, 7, 75, 36,210,197, 10,121,197,154,131,235,166, 30,175,254, 60, 36, 36,132,106, 62,139,
+205,104, 70, 51,240, 38,193,240,110,110,206, 29, 72,138,238,206, 48, 36,139, 33, 25, 3, 33, 87, 31, 74, 41, 43,123, 37,237,128,
+139,139,139, 37,135,196, 16,130, 97,196, 4, 65, 83, 52,139,188,149,154,154, 29,223,132,130,241,164, 82,233, 44, 46,151,219, 95,
+167,211, 57,147, 36,153,173,213,106, 47,169, 84,170, 31,241,199,196,133,255, 49,180,109,219,118,252,213,171, 87, 45,123,244,232,
+161, 21, 10,133, 70,181, 90,205, 62,119,238, 28,255,253,247,223, 47,127,241,226,197, 27,205, 72,148,201,100,125,127,253,245, 87,
+183,224,224, 96,180,105,211, 70, 57,118,236, 88,110, 96, 96, 32,119,218,180,105,169,185,185,185, 81, 77,164,235, 64, 16,196, 94,
+130, 32, 88, 52, 77,135,226,223,169, 27,254,108,144, 36, 73,206, 32, 8, 98, 4,195, 48,238, 4, 65,164, 48, 12,115,156,166,233,
+134, 18,183, 54,132, 81, 0, 6,146, 36,233, 7, 0, 52, 77,199, 0, 56, 3,152, 62,243,238,239,228, 20,137, 68,190, 0,160, 82,
+169, 98,255, 44, 78,130, 32,124, 1,128, 97,152, 55,229,156, 34, 20, 10,167, 3,128, 90,173,254, 5, 38, 44, 7,245, 58,152,173,
+158,140,223,210, 68, 0, 64,204,183,158, 0,128,166,188, 39,102, 38, 18, 77,249,173,186,248,154,194, 81, 7, 6, 78,152, 48, 97,
+213,111,191,253,246, 45,128, 19,127,197,141,239,224,224,242,227,247, 63,108,151,125, 62,235,195, 53,120,185, 34, 68,195, 15, 36,
+240, 46,143,197, 26,170,163,168, 27,241,192, 17, 0,108, 43, 43,171,241, 60, 30,175,151, 78,167,115,100,179,217,121, 58,157,238,
+122, 69, 69,197, 1, 52,176, 2,130,201,231, 53, 1, 82,189, 10, 14, 4,253,239,117,222, 24, 18, 90,174, 8,249, 68,123,148,253,
+ 3,154, 81, 18,192,156,170,186,238, 64,253,233, 60, 26,106,124, 62,151,201,100, 35,228,114,185,138,197, 98, 49,120, 57,235,249,
+229,159,151,223, 19, 52, 77, 23,150,150,150,134, 54,198, 37,110,129,118, 60, 49,177,151, 50, 64,109,212, 50, 31, 43,179,144, 40,
+113, 65, 55, 6, 8,101, 0, 87,146, 69,218,210, 52,157, 7, 32,138, 52,226,148, 34, 23,201,255,208,206,189,101,213,121,109, 85,
+245,158, 3,192, 30,192, 99, 0,159, 3, 80, 52,235,159,191, 13,175, 7,195,159, 6,144, 87, 35,180,106,165,187,239, 51,120,240,
+224,107,110,110,206, 29, 70, 15, 31,185,106,230,140,143, 9, 22,139, 68,220,211,167,236, 15, 66,167, 12,144, 74,165, 78, 18,173,
+182, 61, 8,130, 86, 9, 4,113,114,121, 69,206,145, 3,191,153,121,182,107, 71, 81, 20,141,173,219,126,126,255,232,239, 17, 11,
+ 76, 20, 91,109, 29, 28, 28,246,134,133,133, 57, 12, 29, 58,148,229,224,224,128,244,244,116,203,131, 7, 15,182,219,188,121,243,
+152,178,178,178, 80, 0,207,223,160,178, 61, 29,172,200, 1,102, 66,162, 31, 42, 41, 84, 26,112, 57, 95,141, 11, 0,110,188,233,
+217, 83,169, 84,179, 85, 42, 85,128,191,191, 63,179, 99,199, 14, 98,242,228,201, 12, 65, 16,132, 90,173,222, 13,224,141,132,150,
+ 88, 44,222, 18, 28, 28,236,225,225,225,145,242,226,197,139,129,135, 15, 31, 62, 51,105,210, 36,119,177, 88,156, 4,160,109, 19,
+233,118,149,148,148,248,168,213,106, 56, 59, 59,239, 0,240,206, 95,112, 19, 17, 44, 22,235,184,147,147, 19,179,118,237,218, 19,
+ 62, 62, 62,246,165,165,165,198,175,190,250,170,255,221,187,119,223,167, 40,106,104, 19,196,150,148, 32,136,109,246,246,246, 54,
+107,214,172, 73,238,220,185,243, 99, 62,159,207, 75, 74, 74, 18,205,155, 55,111,238,243,231,207,199, 48, 12, 51, 3,104, 82, 7,
+ 33, 37, 8, 98,155, 76, 38,179, 89,181,106, 85,186,159,159, 95, 28,151,203,229, 38, 37, 37,137,191,254,250,235,207, 19, 19, 19,
+223,136,147, 36,201,173, 1, 1, 1,210,111,191,253, 54,161, 93,187,118,183, 89, 44, 22, 47, 59, 59,155, 92,178,100,201,172,139,
+ 23, 47,134,208, 52, 61,243, 77,202,105,103,103, 39, 93,178,100, 73, 66, 96, 96,224, 93, 46,151,203,125,246,236, 25, 25, 22, 22,
+ 54, 43, 57, 57,217,228,114, 90, 89, 89, 5, 17, 4,177, 61, 63, 63,159, 13, 0,142,142,142, 93,204,205,205, 55,215, 94,211,178,
+ 58, 21,133,193, 96,168,212,104, 52, 19, 74, 75, 75,235, 76,132, 59, 57,124,211, 16, 0,216,172,175,126,255,242,181,177,247,192,
+214, 83,166, 84,218,215,225,101, 94,188,239,149, 83,135, 3,192,248,170,165,194,191, 87, 2,108, 54,155,246,117,248,156,137,205,
+111, 82,202,152, 97,125,251,246, 93, 18, 21, 21,245,115,159, 62,125,190,222,183,111,159, 93, 86, 86,214,119, 55,110,220,112, 25,
+ 55,110,220,228,203,151, 47,175, 46, 46, 46, 62,250,103,221,252, 60, 46,159, 79,144, 4,132, 2,145,185, 41,251,115, 72,114,240,
+237, 97,195,166,255,242,236,153,223,230,196, 68, 55,165,163, 99,192,103,159,125,102, 63,114,228, 72,210,197,197, 5,201,201,201,
+214,251,246,237,107,255,203, 47,191,140, 40, 47, 47,159, 3, 32,227,109, 68,150,178, 28,222, 90, 29,252, 24, 6,150, 53, 15, 44,
+129,114,190, 30, 49, 76, 2,158,252, 3,196,214, 55,187,118,237,250, 54, 57, 57, 25,171, 87,175, 6,128, 31,155,120,252,188, 97,
+195,134, 13,138,136,136, 16, 30, 57,114, 68,232,239,239, 15, 7, 7, 7, 84, 13,166,106, 18, 83,187,185,185,153,118,206,104,124,
+191,241,204,212,119,226, 74,207, 98,203,200,252,213, 66,103, 24,187, 13,243, 24, 49,120,178, 31, 44,108, 69, 16, 72,216, 40, 47,
+145,123, 61,139,201, 10,190,114, 56,249,187,228,232,162, 53,202, 76,124,131,250,115,242,253, 71, 96,109,109,189, 35, 53, 53, 53,
+ 72, 44, 22,191,242,121, 74, 74,138,175,135,135, 71, 5,128, 47,154, 42,220,108,109,109,247,211, 52,173, 45, 41, 41,249, 16, 0,
+204,204,204,126, 19,139,197,210,188,188,188, 5,127,213, 64,166, 26,175,107,145,255,114,139, 86, 77,188, 86, 93,107, 29, 18, 36,
+ 69,119,159, 57,227, 99, 98,236,248,113,249,201, 41,169, 52,155,195, 27,127,238,252,121, 81,135, 14, 29, 72,237,143, 63,194, 88,
+ 84, 4,195,220,185,221, 46, 93,186,100, 8, 25, 63, 81,205, 97, 17,187,220,221, 92, 69,135, 14, 28,116,136, 56,118,180, 59,128,
+198,132, 22,207,193,193, 97,239,213,171, 87,157,220,220,220, 80, 94, 94,142,244,244,116, 40,149, 74,140, 25, 51,134,211,189,123,
+119,167,209,163, 71,239,173,168,168,232,209, 4,203,150,125, 27,103,118,228,140, 41, 35,219,190, 63,160,187,216,201,165, 53,152,
+124, 13,178, 94, 36,250, 71, 94,189,251,217,174, 99,103,158, 39, 87, 48,131, 81,247,218, 72, 13,162,184,184,120,254,136, 17, 35,
+142, 5, 5, 5,217,242,249,124,200,100, 50, 98,232,208,161,133,185,185,185, 75,223, 88,181, 84, 45, 97, 67,146, 36, 85,251,181,
+142,229,129, 76,129,179, 84, 42,133, 84, 42, 5, 0,167,183, 29,121, 90, 90, 90,254,104,102,102, 54, 90, 46,151,171, 73,146,100,
+ 8,130, 96,116, 58,157, 80, 42,149, 62, 74, 72,124, 46,211,106,181,109,214,109,252,229,135,190, 61,125,204, 47, 94,188,136,145,
+ 35, 71, 50, 23, 46, 92,152, 97,234, 58,117, 4, 65,108, 27, 49, 98,132,106,241,226,197,154,228,148,116,167,132,231, 41,132, 88,
+192,163,109,108,108, 56,247,239,223,103,111,216,176, 65,176,100,201,146,109, 12,195,140,110,194,249,220, 54,110,220, 56,253,151,
+ 95,126,153,247, 44, 57,213,238, 73, 66, 50, 35, 17,112,140, 54, 54,214,172,187,119,239,210,111,194, 73,146,228,214,249,243,231,
+203,103,204,152, 81, 86, 82, 90,225, 80, 38, 87, 48,124, 14,203,224,224,224,192, 62,113,226,132,118,255,254,253,228,244,233,211,
+183,210, 52, 29,210,132,243,187,117,232,208,161,149, 97, 97, 97,229, 73, 41,105, 14, 79,226,159, 67,196,231, 24,236,237,237, 88,
+ 15, 30, 60,208,175, 91,183,142, 92,177, 98,133, 73,229, 20,139,197,123, 14, 31, 62,204, 62,113,226,101,219,119,231,206, 29,210,
+221,221, 93, 84,123, 31,181, 70, 11,146, 0,138,139,139, 69,129,129,129,123, 0,252, 33,185,175,223,210, 68, 76, 14, 7,102,207,
+158,157,215,212,155,197,207,241,179, 70,247,161,126,246,100, 54,168,166, 14,103,179,217,244,244,233,211,243, 95,255, 94,163,209,
+ 16, 0,134,226, 59,211,197,214,192,129, 3, 23,158, 62,125,186,245,190,125,251,214,239,223,191, 95, 7, 0, 2,129,192,230,224,
+193,131,171,199,140, 25,131, 49, 99,198, 44, 62,122,244,232,159, 38,180, 40,134,210, 3, 0, 95,192,231, 39, 38, 38, 18,158,158,
+158, 13,102,220,215,211,244,195, 95,158, 61,235,252,137,167,167,127, 41, 77,183,225,190,255,190, 98,222,188,121,197,114,185, 28,
+233,233,233,208,235,245,152, 60,121, 50,171, 79,159, 62,178, 49, 99,198,108,170,172,172, 28, 5, 64,111,194, 61,185,206,201,201,
+233,163,138,138, 10, 69,181, 85,167, 71, 40,197,238,229,107,228,119,106, 99,224,113, 89, 70,238,144,185, 52,113,225, 71, 66,233,
+233,134,155, 0,192, 85,161,168,137,131,129, 58, 97,238, 12, 55,138,131, 21,182,206,194,190, 69, 25,234,101,202,204, 6,197,210,
+ 40,177, 88, 60, 92,169, 84, 30,173,234,156,219, 14, 30, 60, 24,119,239,222, 5,128,238, 85, 66,171, 47, 73,146, 31,208, 52,253,
+ 43,128,134,150,114,251,108,216,176, 97,239, 70, 68, 68,152, 1,192,209,163, 71, 97, 48, 24,224,238,238, 14, 46,151, 11, 30,143,
+ 7, 14,135, 83,179, 58,136,137,112,180,181,181,129,141, 5, 7, 82, 43,241,251, 95,255, 52,140,221,162,131, 57, 10,169,167, 40,
+101,202, 97,100,180,224, 90,139,209, 46,216, 18,126, 3,250,146,167,182,198, 45, 56,181, 37,161,179,138,196, 16,100, 64,251, 79,
+233,217, 73,146,228, 63,126,252, 24, 50,153,236,149,207, 89, 44, 22, 0,244,122, 3,202,197, 41, 41, 41,129,209,209,209, 8, 10,
+ 10, 90,236,237,237,253,222,181,107,215, 28, 74, 74, 74, 16, 20, 20,180, 41, 59, 59,251,196, 95, 93,167,218, 90,228,255,139,169,
+139,124, 77, 73,246,121, 57, 10, 38, 89, 44, 22,137,212,148,116, 67, 80, 80,191, 73,153,153,153,146,128,128, 0,146,195,225, 64,
+ 25, 21, 5,205,131, 7,144, 72, 36, 24, 49, 98, 4,231,250,245,235,230,230, 18,243,105,105,169,105,149, 44, 22, 9,134, 33, 27,
+141,121,144, 74,165,179, 22, 44, 88,224,224,225,225, 1,163,209, 88,147,209,220,104, 52, 34, 43, 43, 11, 18,137, 4,161,161,161,
+118, 34,145,104,150,137,245,104,213,214,221, 46,230,234,153,109,239,204,155, 57, 80,220, 86,116, 17,226,172, 57,144, 28,253, 4,
+237,115,207, 33,108,120,128,248,194,150,197,126,173,101, 86, 49,181, 76,172, 38, 67,171,213,222,140,139,139,155,118,237,218, 53,
+ 26, 0,174, 92,185,194, 36, 36, 36,204,120,155, 81, 40, 77,211, 40, 47, 47, 7, 77,211,172,170,247,213,175,255,209,251,193,220,
+220,124,235,123,239,189, 55, 46, 35, 35, 67,120,246,236, 89,235,204,204, 76,155,180,180, 52,219,182,109,219,178, 87,175, 94,125,
+ 90,163,213,179, 12, 20,163, 51, 82,134,202,188,167, 79, 83,202, 10, 10, 98,118,238,220,169, 38, 8, 98,132,137,191, 49,202,209,
+209,209, 58, 60, 60, 28, 4, 71,212,165, 93,123,111, 15, 22, 71,104, 65,114,120, 22,106,181,134, 74, 77, 77,205, 10, 15, 15,119,
+245,241,241,145,225,165,123,205, 36, 78,153, 76,102,243,229,151, 95,130,205, 55,243,237,228,227,215,154,199, 23,155,177, 56, 66,
+179,128,128,128, 62, 41, 41, 41,185, 97, 97, 97,142,254,254,254, 77,226,244,247,247,151, 78,159, 62,221, 40, 16,154, 5,186,185,
+185,183,239,212,177,253,160,182,109,219, 14,103,179,217,198,162,162,162,140,208,208, 80,199, 33, 67,134,216, 55,133,211,206,206,
+ 78, 26, 22, 22,102,116,105,233, 30, 28,252,238,128,174, 92,161,153, 5,155, 39,182, 84,169, 52,212,179,103,207, 50, 22, 45, 90,
+228,232,235,235,107,103, 10,167, 74,165,226,216,216,216,192,203,203, 11, 29,220,221, 81, 81, 81,129,136,136, 8,236,218,181, 11,
+191,254,250, 43, 14, 28, 56,128,206, 61, 6,192,204,204, 12,185,185,185,144,203,229,156,191,251,134,162,126,246,100, 54,235, 62,
+ 26,250,241,199, 31,231, 78,159, 62, 61, 95, 40, 20,210,175,111, 86, 86, 86,212,132, 9, 19, 10, 66,191,222, 56,180,218,181,216,
+136, 37,235,241,153, 51,103, 94,236,219,183, 15, 29, 58,116, 64,112,112, 48, 15, 0,102,205,154,197, 27, 51,102, 12, 14, 31, 62,
+140,163, 71,143,198,123,120,120,220, 2, 48,204,148,114,134,134,134,246, 8, 9, 9,185, 17, 18, 18, 18, 59,118,236,216,237, 51,
+102,204,120,165,231,202,203,205,126,168,211,233,224,227,231, 47, 90,190,227,222,132,198,248, 18,128,125,219, 19, 19,119,173,121,
+250, 52, 99,113,135, 14,150, 45,211,210,172,118,175, 91,103, 83,189, 72,183,193, 96, 64, 86, 86, 22,164, 82, 41, 38, 76,152, 96,
+195,231,243, 67, 77, 40,230,134, 97,195,134, 77,201,204,204,148,252,242,203, 47,142,177,177,177,178,188,188, 60,199,203,151,206,
+219,126,245,197, 44, 51, 11, 9,143,151, 91,196, 16, 0,144,150, 11,113, 98, 42,122, 48, 12, 44,107,187, 19,223, 8,142, 16, 10,
+157,177,185,117, 15,203,231, 95, 30,246, 29, 27, 22,233,103, 35,117,228,135, 55,112, 68,167,181,107,215, 30, 57,117,234,212,248,
+ 30, 61,122, 28, 3, 32,172, 99, 31, 65,231,206,157, 35, 14, 31, 62, 60,165,103,207,158, 55, 1,120,213, 59,138,116,118, 30,241,
+251,239,191, 91, 87,191,183,177,177,129, 64, 32,248,131,200,226,114,185, 32, 73,178,201,213, 91,121,112, 60,219,170,189, 22,113,
+101,103,112,120,237, 99,172,125,255, 25,189,170, 91,154,246,199,208, 68, 92, 56,252, 24,133,120,140,129,159,180,198,248, 69, 62,
+253, 69, 20, 86,252,147, 58,240,162,162,162, 15,122,245,234,117,100,224,192,129,218,232,232,104, 20, 21, 21,193,201,169,102,172,
+157,255, 6,148, 86, 34,145, 8, 46, 46, 46,240,240,240, 24,127,253,250,117, 7,131,193,128,180,180, 52, 20, 22, 22,198,252, 29,
+117,170,173, 69,254,203,240,122, 32,252,233, 63, 8,173,170,181,133,174, 2, 0, 67, 16,202,199,113,113, 28, 22,143, 55,241,183,
+253,251,249, 92, 46, 23, 25, 25, 25,136,143,143,135,234,242,101,168,111,223, 70, 65, 65, 1, 20, 10, 5,236,237,237,177,109,199,
+ 14,177,142, 98,166, 62,123,254,156,197,144, 76,237,120,131, 58,167,120,242,249,252,254, 35, 71,142,172, 87,144,229,230,230, 98,
+224,192,129, 28, 22,139, 85,215,172,134,215, 57, 9,153, 45,113,234,242,177,229,142,142,188,120, 32,121, 30, 80, 25, 3, 48, 90,
+192,168, 3,114,158, 0,167,151,162,165, 34,145, 56,191,124,146,131,147,136,125,170, 14,165,220,216, 84, 84,119, 79, 79,207, 95,
+ 39, 78,156, 72, 2, 64,223,190,125, 9, 79, 79,207,237, 0,220, 27, 56,230, 82, 35,157,228,221,178,178, 50,140, 25, 51,198,186,
+117,235,214,151,198,140, 25, 99, 93,253,249,155,114, 86, 91,147, 59,116,232, 80, 34, 16, 8, 14, 0, 38, 53,176, 53,156,150,150,
+150, 63, 14, 28, 56,112,244,254,253,251,185, 0,112,245,234, 85,156, 58,117, 10, 79,159, 62, 69, 82, 82, 18,237,231,231,103,187,
+241,215, 35, 91,127,252,121,207,134,225,221,125,100,125,186,248,181,151, 40,202, 20,246,246,246,221, 25,134,113, 55,177,156, 3,
+151, 46, 93, 26,159,240, 34,195,130,100,115,216, 92, 14,155,111,110, 46,182,151,154,137,157,173, 68, 2, 39, 62, 73, 72, 84, 42,
+ 85,254,129, 3, 7,104, 0, 3, 77,229, 92,190,124,121,106, 66,114,134, 37, 65,178,217, 28, 54,135, 43,145,136, 44,223, 15, 14,
+242, 7, 0, 46, 24,174, 92, 46, 47,216,181,107,151,190, 41,156,223,126,251,109, 92,105,185, 66,202,230,112, 56,108, 54,171,230,
+ 92,138,133, 66, 91, 17,159,207,211,106,181, 57, 63,252,240,131,186, 41,156, 75,151, 46,141,127,246, 34,211,138, 36, 8, 22, 65,
+144,108,115, 51,177,181,181,133,200,214, 86, 34,180, 17,177, 89, 60,185, 92,158,179,119,239, 94,147, 56,245,122, 61,183,160,160,
+ 0, 9, 9, 9,112,241,247,199,197,139, 23,209,162, 69, 11,140, 25, 51, 6,227,198,141,131, 80, 40, 68,223, 64,111,132,135,135,
+227,197,139, 23,208,235,245,252,186, 56,171,227,164, 94,135, 76, 38,139,110,236,230,121,237,216, 87,202,233,235, 0,102,179,238,
+163,161,181, 5, 86,125,252, 86, 86, 86, 84, 93,214,174,215, 57, 7, 14, 28,184,240,242,229,203,173,247,238,221, 59, 52, 52, 52,
+244,230,222,189,123,209,181,107, 87, 36, 36, 36,192,213,213, 21,187,119,239,198,184,113,227,110,110,218,180,105,104,116,116,180,
+143,155,155,219,130,198, 56,199,142, 29,251,169,175,175,111, 84,126,126,126, 96,105,105,169, 87, 68, 68,196,212, 17, 35, 70,164,
+142, 31, 63,190, 95,141, 96, 52, 24,246,159, 62,121, 12,131,134,142, 68,187,142, 94, 91, 39, 47,216,231,221,200,179,201, 60, 5,
+182,239,202,203, 43,218,175,209,168,198,112, 56, 34,209,189,123, 86, 71,127,254,217,166,246,202, 2, 57, 57, 57, 24, 50,100, 8,
+135,203,229,246,108,164,156,107,135, 15, 31, 62, 38, 34, 34, 66, 90,109,213,185,125,251, 54,158, 60,121,130,244,244,116,148,151,
+151,163,223, 12, 5, 62, 94,253,146,251,227,213, 12, 6,204, 98,196,111,216,134,212, 64,216, 2, 14,214,230,236, 91, 83,127,104,
+ 55,235,163,173, 29,216, 18, 43, 14,126,251, 58, 9,197,105,218,163,245,112, 18,129,129,129,251, 66, 66, 66, 8,157, 78, 7,157,
+ 78,167, 3, 80,103, 86, 95, 39, 39, 39, 65,167, 78,157, 48, 99,198, 12,210,220,220,124, 83,125,229, 84, 42,149,218, 51,103,206,
+ 32, 52, 52, 20,115,230,204, 65,155, 54,109, 32,149, 74,193,225,112,176,103,223, 33,155,113, 83,103,182,125,167, 71, 47,159, 14,
+239,116,237, 84,169,101,249,115,132,210,233,245, 88, 67,234,172,187,194, 46, 26,113,105,119,176,121,104, 54,125,127,183, 74,241,
+213, 7,255, 74,124,118,173,224,233,130,144,237,113,204,157,110,197,251, 62,207, 68,129, 33, 1, 61,199,180,132,155,175,116,174,
+216, 5,158,111,122, 62, 77, 68,147, 56,189,189,189,123,220,191,127,159,223,171, 87, 47,100,100,100,128,195,169, 25, 79, 81,111,
+ 83,206,165, 75,151,242, 53, 26, 13, 30, 61,122,132, 73,147, 38,229,232,245,250,185,111, 83,206,166, 88,180,170,181,200,127, 25,
+182,191,182,229,213,103,209, 90, 10, 0, 6, 26,167, 38, 78,154,170,138,140,140, 20,241,120, 60,100,100,100, 32, 47, 47, 15,123,
+118,237,162,250,218,217, 85, 6, 59, 57,201,247,236,218,197,232,116, 58, 48, 12, 3, 79, 79, 79,140, 30, 61, 90, 56,106,204,248,
+ 66, 66,174, 62,100,130,155,199,177,218,191, 62,117,234,212, 63,124,255,213, 87, 95,193,220,220, 28, 4, 65, 56,152, 80,185,144,
+207,150, 14,119,150,186, 89, 22, 48,249,123, 74,193, 18, 0,108, 51,128,109, 14, 8, 44, 0,190, 25,192, 19, 65, 27, 29, 85, 74,
+ 50,193,233, 35,123,126,232, 4,160, 41,174, 30,200,100,178,197, 81, 81, 81,182,209,209,209,140, 92, 46, 71, 94, 94, 30,179,106,
+213, 42, 91,153, 76,182,248, 77,175, 72,110,110,238,242, 65,131, 6, 21, 76,154, 52,201,226,220,185,115, 46,147, 38, 77,178, 24,
+ 52,104, 80, 65,110,110,238,242,183,185,210, 92, 46,151,245,244,233, 83,171, 21, 43, 86,140, 3,240,176, 99,199,142, 37, 78, 78,
+ 78, 15,241, 50,104,178, 65,152,153,153,213,136,172,106,235, 26,155,205, 6,135,195,129, 76, 38,211,149,150,150, 82, 61,223,113,
+ 23,122, 90,144, 6, 25,159, 43,180, 18, 10,156,205,204, 45, 2, 74, 74, 74, 30, 19, 4,145, 98,162,139,207,183, 75,151, 46, 28,
+138,225,208, 31, 79,236, 43,155, 53, 37,200,238,167, 21,211, 91,252,176,252, 35,167,181, 75,166,121, 46,159, 63, 33,136,164,105,
+141,171,171,171, 67,117, 64,187, 9,230,115,191,206,157, 59,179,105,112,144,240, 60,189, 32, 35, 59,167,242,221, 62,129, 53,150,
+203, 14,190,126,193,182,182,182,189, 60, 61, 61, 59, 19, 4, 97,210,148,100,161, 80,232,219,174, 93, 59, 54,201,226, 16,214, 82,
+ 51, 23, 51,137,208,190,198,133, 98,105,217,205,202,214, 54,132,100,152, 10, 71, 71, 71, 59,161, 80,232,219,132,186,179,105,112,
+ 97,111,103,101, 97,107, 99, 41, 9, 14,234,222, 38,176, 91, 96, 91,239,128,174,129, 29,223,233, 60,138, 48, 26,229,238,238,238,
+118,213, 65,242,141, 88, 90, 5,251,247,239,199,138, 21, 43,208,169,101, 75, 56, 57, 57,193,206,206, 14,183,111,223,198,253,251,
+247, 33,149, 74, 81, 88, 88,136,117,235,214,225,248,241,227,208,235,245,102, 77,189,159, 76, 17, 91, 13,193,104, 52,146,175, 11,
+172,250,248,133, 66, 33, 93, 29, 36, 95, 31,206,156, 57,179,175,218,146,245,249,231,159,247,216,184,113,227,205,196,196, 68, 72,
+ 36, 18,220,191,127, 31, 83,167, 78,189,185,105,211,166, 30, 51,103,206,196,174, 93,187,144,154,154,186,163, 33,190,177, 99,199,
+ 46,153, 54,109,218, 15,215,174, 93, 35,237,237,237, 33,149, 74, 49,124,248,112,236,216,177,131,109, 52, 26,119,134,132,132,196,
+134,132,132,196, 82, 89, 23, 22, 30,249,117,213,237,184,199,177,248,244,179, 47,121, 58,163, 33,204,132,234, 51,106,137,164,210,
+216,171, 87,233, 97,131, 65, 53,150,203, 21, 89,196,198, 90,157,218,185,179, 70,108,133,135,135,195,194,194, 2,120, 25,192,140,
+ 6,172, 58, 31, 29, 63,126,188,166, 61,180,182,182, 6,143,199, 3,151,203, 5,135,195, 1,139,197,194,165,173, 98,252, 28,254,
+ 82, 95,252, 28, 78,224,194,143,132,242,109,174,157,200, 9, 94, 82,123, 94,236, 39,187, 59,250,120,245,179,198,237,131,249, 88,
+ 53, 40, 58,251,254,225,162,121,154, 66,124, 95,207, 97,239,124,245,213, 87, 29, 10, 11, 11,241,224,193, 3, 60,120,240,160, 62,
+ 11,144,230,228,201,147,223, 41, 20, 10,184,185,185, 97,216,176, 97,189, 0,248,215,243,220,160,115,231,206, 24, 50,100, 8,130,
+130,130,208,169, 83, 39,232,244, 70, 78,200,196,143,218, 61, 77, 45,114, 90,181,110,149, 40,234, 74, 4,121,243,230, 53,214,190,
+ 99, 23, 44, 2,131, 6,252,192, 53,115,188, 11,161,181,163, 41,245, 84, 81, 37,240,117,124, 31,219, 47,127, 70,110,190, 58, 73,
+178,231,212,102,119, 51, 51, 51, 34,230, 65,172, 97,207,150,195,153, 94,226, 97,133,119, 15,150, 64, 69,228,163,223, 20, 55,146,
+ 6, 70,255, 83,122,118,129, 64,176,241,218,181,107, 14,122,189, 30,113,113,113,152, 51,103,142,230, 45, 41,107, 12, 32, 46, 46,
+ 46,184,122,245, 42, 38, 76,152,160, 41, 40, 40,184,243,119,213,169,182, 22,249,255, 2,118, 45, 5, 89,131,172,172,172,114,169,
+ 84,234,212,174, 93, 59, 82,167,211,189,116, 73, 28, 61, 74,253,186,115,231,105,141, 70,243, 25, 0,238,143, 63,253,180,213,201,
+217, 57,104, 98,104, 40, 97, 48, 24, 48,104,208, 32, 94,100,100,164,117, 74, 97, 97,165, 9, 29,206, 43,191, 55,121,242,100,108,
+220,184, 17, 0, 48,123,246,236, 26,211, 58, 97, 66,192,146,196, 2, 3,131, 7,119, 54,207, 18,111, 54,215,119, 51, 40, 90,189,
+ 48,187, 43, 86, 8, 59,131,228,177, 33, 96,129,214, 27,140, 73,133, 35, 30,190, 72,106,223, 65, 88, 90,226,218,191, 99,111,252,
+122,113,239, 64, 21,165, 57,108,114,131, 35, 18,117,145, 72, 36,120,248,240, 97,105,231,206,157,203, 25,134,177, 88,190,124,185,
+141, 72, 36,234,242, 22,231, 62,237,249,243,231,189,186,119,239, 62,139, 36,201,254, 52, 77, 95, 42, 40, 40,248, 17, 64,154,137,
+199,127, 12,224, 91, 0, 53, 35, 75,157, 78, 7,146, 36,193, 48, 12,198,142, 29,139,240,240,240, 14, 79,158, 60, 65, 84, 84,148,
+ 85,255,254,253,239, 2, 40, 7,240, 33,128, 58,173,102,114,185, 92,125,255,254,125, 97, 84, 84, 20,104,154,134,149,149, 21,204,
+205,205,193,231,243, 49,124,248,112, 73, 88, 88, 88,191,243,231,207, 23,202, 91,181, 96, 9,242,114,148,124,137,196, 12, 14, 78,
+ 61,103,142,255, 32,145, 97,152,227, 77,104, 28,120, 66,182, 81, 67, 80, 90,114,237, 55,155, 72, 17,151, 75, 8,184,108,240,105,
+ 21, 22,126,183,146,224, 50, 20, 27, 77,244,207,115,185, 92,174, 25, 31, 58, 22,143,101, 16, 17, 96,254,140,135,131,197, 98,241,
+ 4,220,250,227, 49, 56, 36, 73,146, 36,201, 5, 96,242,162,125,124, 62,159,107,198,103,234,229, 20,178, 8, 22, 65, 16, 60,212,
+ 51, 19,205,215, 1, 76,181, 21,137,247, 89,138,182,182, 40,238,217,179, 39, 78, 71, 61,196,209, 83,151, 80,156,241, 24,139,190,
+254, 28,254,254,254,136,140,140,108,176, 76,213, 49, 90,245, 89,151,101, 50, 89,116,110,110,238, 59,245, 29,219,144,203,176, 30,
+ 43,213, 31,249,191,177,128,223,210, 68, 52, 18,163, 53,172,103,207,158,159,238,223,191, 95,247,222,123,239,241,198,142, 29, 11,
+ 47, 47,175, 30, 83,166, 76, 1, 0,244,239,223, 31, 27, 55,110,236, 49,101,202, 20, 28, 58,116, 8, 17, 17, 17,218, 62,125,250,
+124,125,245,234,213, 28,188,156,209,249, 7,208, 52, 61,100,219,182,109,175, 91, 10, 97, 52, 26, 97, 48, 24, 28,141, 70,163, 99,
+ 85, 91,132, 31,126,216, 84,124,225,124, 36,190, 94,176, 20,118,182, 14,190, 38,222, 67,196,228, 47,191, 44,222,189,110, 29,214,
+ 29, 58,132, 47, 93, 93, 69,123,227,227,113, 65,163,193,225,168,168,226,170,223,105, 52, 54, 83,169, 84,170,207,156, 57, 99,126,
+248,240, 97, 88, 90, 90,162, 77,155, 54,176,178,178, 2,135,195, 1,201, 18,130,197,149,162, 93,199, 46, 0,238, 3, 0, 92,101,
+ 80,122,186,225, 38, 65,160,156, 33,155, 30, 83,196,111,129, 86, 54,206,130,107,159,238,242,178, 52,183,227,226,220,143,153, 56,
+191, 57,235,184,166, 24,235, 97,196, 51,212, 31,243,213,217,205,205, 13,133,133,133, 56,115,230,140, 18,168, 87,144,129,166,233,
+239,126,250,233,167,175, 22, 44, 88,192,247,244,244, 4, 0, 95, 0, 15,234,218, 87, 44, 22,195,201,201,169, 70, 88,142,157, 52,
+211,125,198,188,153,194, 17, 3,130,192,102,219,160, 92,105, 64, 73,165, 1, 82, 27, 9,190,158, 23, 34,184,212,217,201,127,219,
+166,223, 78,170,213,240, 7,254,216, 30, 16, 4, 30,220,123,124,211, 91,224, 9, 16, 36,144, 69, 94, 1, 1, 2, 10,194, 0,130,
+197, 98, 40,138, 66,102,102, 38, 24,134,193,132, 17, 83,179, 62, 90, 21, 97,215, 99,130, 28, 46,237,100, 32, 24,244,254,167, 8,
+ 1,107,107,107,223,146,146, 18,164,165,165, 97,210,164, 73, 57,197,197,197, 23,149, 74,229,212,220,220, 92, 0, 40,125, 3,202,
+ 26, 49,239,235,235,139, 46, 93,186, 96,204,152, 49, 2,149, 74, 21,226,238,238,238, 84, 84, 84,212,237,175,172,207,235, 90,228,
+255,149,208,170,243, 65, 51, 24,218,105,183,110,133,242,210, 37,240, 46, 92,192, 97,153, 76,161,209,104,190, 0,144, 85,245,224,
+127,190,107,247,238, 91, 67,239,220, 49,215, 37, 38,194,253,201, 19,112, 44, 45,125,155, 90,128,157, 59,119, 66, 46,151,163,162,
+162, 2, 0,176,121,243,102,200,229,114, 24, 77, 92,112,150,205, 69, 15, 7, 59, 87,228, 35, 9, 52,155,148,164,183, 83,117,149,
+104,204,114,157, 50,237,149, 21,164, 19, 18, 51, 2,196,234, 18, 93, 87,130,165,131,166, 88, 5,167,238,109,192, 6,187, 71, 83,
+202, 88,237,247,103,179,217,165,207,159, 63, 31,210,182,109,219, 83, 0,108,222, 36, 30,224, 53, 36, 23, 20, 20,124,246, 38, 7,
+178, 88,172,111, 83, 83, 83,237,118,236,216, 49,107,249,242,229, 76,109,161, 85,253, 63,155,205, 6,195, 48,176,176,176, 0,135,
+195,177,191,125,251,182,125, 64, 64,192, 22,154,166,125,235,169, 39,227,229,229,133,212,212, 84,176,217,108, 88, 88, 88,128, 54,
+234,177,116,222, 76, 80, 44, 62,123,254,252,249,190, 35, 71,142,140,219,177, 99,135,193, 60,176,123,183,146,146,146,167,159, 78,
+152, 24,119,226,196, 9, 93, 85,138,135,198,135,248, 12, 19,155,148,148,196,114,150,217,179, 24,163,138, 22,115, 1,193,227, 31,
+ 24,158,196, 1, 2, 54,139,225, 18, 36,248, 2,161, 69, 90,118,118, 9, 77,211, 9,166,112,210, 52, 29,147,154,154, 42,180,183,
+179,102,171,212, 58,133,144,195,240,210, 99, 30,166,180,242,235,236, 14, 0,154,152,251, 87,249,237,218, 11,211, 11,138,196,174,
+174,174, 38,113,170,213,234,216,156,156, 28,150,189,189, 61, 59, 35, 43,251,164,165, 68,108,107,110,105,217, 21, 0,244,149, 21,
+247, 73,173,182,136,197, 97,219, 23,149,148,148,170,213,234, 84, 83,235,254,226,197, 11,182,163,163, 29,235,220,133,203,167,236,
+ 69,124, 59, 51, 30,219,156, 79, 16,132,136, 69,200,185, 70,186, 88, 32, 18,217,165,101,103,151, 50, 12, 83,175,133,112, 77,249,
+196, 17, 47,175,215,210, 67,181,184,241,248,241, 99,156,189,153, 0, 49,163, 3,161,169,192,133, 93,191, 96,194,252, 5,111, 29,
+247,215,152,216,122, 35,107,214,182,246,209,175,241, 35,175,145, 64,248, 9, 19, 38, 44,221,183,111, 95, 77, 0, 74, 66, 66, 2,
+250,246,237, 91,237,230, 64,112,112, 48, 2, 2, 2,144,144,144, 0, 15, 15, 15, 68, 69, 69,241, 89, 44, 22,127,226,196,137,171,
+126,251,237,183, 51,141,218,253,183,111,199,212,169, 83,235, 10,172,126, 1, 64, 67, 72, 61, 21,225,107,246,216,148,150, 20,163,
+176, 40, 63,214,212,243, 64, 16, 4, 38,127,249,101,241, 54,157, 14,251,239,221, 67,168, 88, 44,218,157,156,140, 65, 1, 1,240,
+238,219,183,216,148,182,174,218,170,163,209,104,192,225,112, 96,110,110, 14,107,107,107,112,185, 92,176, 56, 50,176,121, 62, 32,
+185, 92,248,245,244,193,186, 47,196,170, 73,239, 99, 19, 65,160,156,207, 67, 12, 87, 84,111,172, 14, 33,110,129,225, 12, 3,185,
+ 42, 11, 87,170, 5,137, 69, 75, 88,112,204, 56, 23,166,109,241,180, 52,183,227,226,236,166, 12, 92,216,146,125, 76,147,143, 69,
+ 85,231,130,110, 96, 32,225,109,105,105,137,172,172, 44,100,102,102,198,163,225, 0,127, 85, 66, 66, 66, 10,159,207,239, 96,107,
+107, 11, 0,110,245, 13,204,105,154,174,137,195,218,187,255,136,141,111, 47,119,193,187, 61, 58, 96,207,169,149,248, 36,100, 19,
+ 56, 44, 2, 20,165,199,250,141,131, 65,105, 21, 8, 25,250, 17,209,187,191,135,207,165, 83,186,105, 6,117,217, 47,127, 24, 8,
+176,177,226, 95,227,110, 91,242, 37,164, 55,104,194,210,198,198, 78,204,229,114, 97,109,238,168, 91, 48, 99,110, 30,195, 48, 53,
+207, 13,135,197, 53,144,149, 86,234,146,124,133,208,146,163, 6, 24,178,213,155,101,179,249,243,145,157,157,253, 89,175, 94,189,
+ 86, 85, 86, 86,150, 41,149,202, 9, 0,224,230,230,214,146, 36, 73, 62,128,134,188, 35, 45, 81,119, 90, 8,238,147, 39, 79, 96,
+102,102,134,156,156,156,218,198, 23,208, 52,253,143,153, 4,240, 15,133, 31,128, 24, 0,142, 0, 6,161, 86,122, 7,178,202, 84,
+215, 59, 50, 50,146,137,140,140,236, 93,211,121, 49, 12,109, 44, 45, 5,163,125,121,110, 57, 28, 14, 3,160,246,140, 38,145,165,
+165, 37,193,113,118, 6,193,127, 25,250,193,252,137, 83, 95, 13, 6,211, 82,203,208, 20, 88, 32,244, 96,106, 13, 90,148, 2, 2,
+ 43,109,250,225, 51,222, 98,228,243, 44,107,247,116,128,145, 1, 5,154,213,196,226, 48, 74,165, 18, 70,163, 81,218,186,117,235,
+211, 70,163, 81, 90,213,185, 49,255,169, 43, 74, 81, 84, 10,139,197,194,172, 89,179, 80,109,253,209,233,116,200,207,207,135, 86,
+171,133, 78,167, 67,106,106, 42, 42, 42, 42,160,211,233,240,244,233, 83,184,185,185,129,197, 98, 57, 54,208,152, 51, 12,195,192,
+197,197, 5,173, 90,181, 2,139, 96,240,235,218, 37, 88, 56,103, 38,198,185,209,216,249,227,122,244,233,211,167,189,171,171,107,
+ 32,155,205,166, 28, 28, 28,184, 17, 17, 17, 39, 41,138, 26, 14,211, 91,158, 51,225,225,225,173, 58,118,236,104,103,105,110,102,
+224,243, 88,224, 25,148, 12, 95, 91,194,176, 85,197,112,113,105,105,132, 80,228, 17, 26, 26, 74,213,103,133,168,139,243,139, 47,
+190,112,244,244,244,180,144, 90,154, 41,121, 28, 86, 33, 23, 76,113,197,227, 7,119, 1,128,103,107,167,129, 64,212, 97,210,164,
+ 73,198,166,112, 46, 94,188,216,205,214,214,214,146, 4, 83, 73,233,245,255,246,183,107,117, 37, 4,135,163, 6,151,215,121,246,
+236,217, 68, 83, 56,191,250,234, 43,215, 14, 29, 58, 88, 90,154,139, 21,108, 14, 43,143, 75,211,121, 2,208,249, 28,157,190, 76,
+ 96,107,163,130, 72,226, 23, 26, 26, 90, 47,103,181, 53, 43, 44, 44, 44,235, 53,225,141,210,210, 82,104,242,227,192,205, 73,132,
+143,132, 3,127, 91, 41,248,124,126,205,212,247,250,110,215,250, 98,180,234, 18, 91,166, 30,219,121, 89, 3, 46,192,109,237,163,
+ 95,207,155,149,155,155, 11, 71, 71,199, 6,159,167,223,126,251,109, 65, 80, 80, 80, 97,112,112,176,238,244,233,211, 32, 8, 2,
+ 81, 81, 81,200,201,201, 65,112,112, 48, 24,134,169,158,213,134,216,216, 88,244,239,223, 95,215,171, 87,175,156,170,252, 90,141,
+ 98,234,212,169, 48, 24, 12, 80, 40, 20, 40, 45, 45, 69,100,100, 36,124,124,124, 24,145, 72, 52,146,229, 50, 96,101,200,180, 5,
+221,188, 58,249, 98,203,166,117, 58, 30,155,179,166, 41,207, 43, 65, 16,152,244,197, 23,197, 21,126,126,165,123,149, 74,213,100,
+115,115, 81,235,172, 44,171,135,231,207,219,232,245,122,147, 56,170,173, 58,206,206,206, 53, 34,139,203,229,130,205,179, 5, 75,
+236, 13,158,117, 48, 68, 14, 35,113, 37,134,175,181, 16,227,184,153, 4,231,196,150,245,167,118, 16,185, 96,101,183,177,142, 17,
+221,199, 57, 94, 22,181,192,142,170,254,128,100,216, 68,196,148,245,109, 91,219,182, 18,226,206,145,124, 92,216,146,253,187, 38,
+ 31, 75, 0, 36, 55,246,156,235,245,122, 13, 69, 81, 32, 73, 18,108, 54,187,118, 76,224,173,223,127,255, 29, 15, 31, 62, 4,106,
+165,237,169,172,172,164, 88, 44, 22, 4, 2, 1, 0, 72, 26,104,239,192,225,112,192,225,112,112,245,238,117,235,113,163, 6, 19,
+183, 31, 93, 68,119,159,241, 40, 81,232, 81, 80,161, 71,185, 10,232,232,191, 8, 94,253,143,227,113,106, 37,124, 59,121,177, 88,
+ 60,241,164,186,248, 52,105,200, 82,102, 98,116, 73, 60,221, 70,151, 45, 60,123,231, 68, 66,252,245,163,143,159, 30,252,233, 84,
+114, 55,255, 94,202, 42, 99, 2, 20, 10, 5, 67, 16, 4, 51,119,250,130,148,189, 83,203,168, 77, 19, 30,211,108,173,224,197,223,
+216,212,183,180,181,181,189,109,109,109, 29, 85, 37,142, 90,154,153,153,221,114,116,116, 76,196,203,137, 30, 39,242,242,242, 60,
+149, 74,101,119,188,156,156,149, 81, 82, 82,210,183,202,242,148,209,128, 37,108,135, 92, 46,255,156,162,168,161, 85,219,251, 20,
+ 69,249, 38, 37, 37,117,240,245,245,141,119,119,119,143,117,119,119, 63,235,238,238,126,210,221,221,253,100, 80, 80,208,198,234,
+116, 15,127,177,219,240, 15, 90,228,191, 76,104,161, 74,100,109,175,122, 69,141,208, 2,112,245,245, 0, 52, 35,159,255,212,248,
+233,167,176, 60,121, 18,156,164, 36, 76,153, 52,201, 92, 36, 18,109,194,203, 28, 77,221, 37, 18,201,150, 37, 75,150,152,217,172,
+ 94, 13,217,245,235, 72,143,140,132,129,195,121,240, 38,165, 83,171,213, 96,179,217, 53,150, 24,177, 88, 12,138,162, 80,151,201,
+247, 15, 15,160, 17,119,114, 10, 18,193, 67, 43,208, 96, 20,231,228,189,238,141, 79, 89,100, 23, 41,119,243, 72, 86,114, 61,150,
+217,118,206, 99,233, 94, 0, 0, 32, 0, 73, 68, 65, 84,181,219,212,178,199, 61, 37,193, 86,240, 44, 5,200,204,204, 2, 5,186,
+ 73,254,102,141, 70, 83,161, 84, 42,225,235,235,107,253,240,225,195,214, 62, 62, 62, 86, 85,159,223,127,203, 11, 19, 40,147,201,
+142, 56, 57, 57,165,201,100,178, 35, 0, 2,155,112,236,142, 27, 55,110,128,197, 98, 97,201,146, 37,168,172,172,132, 94,175, 71,
+ 73, 73, 9, 50, 51, 51,161,211,233,144,157,157,141,103,207,158, 65,167,211, 33, 61, 61, 29, 90,109,227, 3, 18,154,166, 97,110,
+110, 14,141, 90,129,159, 87, 46,196,226,176,121,168,120, 17,141,236,220, 2, 88, 90,136,241,217,103,159,177,164, 82, 41, 77,211,
+116, 43,138,162,250,211, 52,189,213,148,235, 84,235,126,187,233,226,226,226,181,118,237,218, 14, 11, 87,110,229,154,179, 21, 12,
+223, 76, 64,243,204,248, 12,175,125, 87, 76, 93,180,137,251,195,134,239,159,223,185,115, 39, 7,166, 37,239, 36, 1,220,244,243,
+243,107,155,147,147,227,227,233,233,217,206,166,165, 43,159,239,232, 84,206,117,108, 33,103,180,154,123,132, 83,139,158, 91,183,
+110,141,187,117,235, 86,110, 83, 56,197, 98,113,251, 61,123,246,120,217,219,219,123,113,132, 66,129,170,162,226,176, 81,165, 60,
+194,178,148, 10, 72,115,203,247,143, 31, 63, 30,125,236,216,177,252,166,112,122,120,120,120,174, 92,185,178,163,183,183,119, 71,
+ 7,183,214,124,161,147, 75,137,192,185,101,137,208,219,135, 15,231, 86,239,109,217,178, 37,246,206,157, 59, 38,113,178, 88, 44,
+ 35, 73,146,224,112, 56, 16,137, 68, 56,119,238, 28, 62,157, 54, 30, 46, 78,214,104,231,233,137,126,159,124,142, 99,199,142,213,
+196,240,176, 88,172,122,123,244,221,171, 63, 59,229,231, 72, 68, 99, 91,251,104,108,107, 31,237,231, 72, 68,215, 43,182,170,190,
+175,107, 31,147, 90,163,122,220,141, 38,136,173, 51, 87,175, 94,253,110,242,228,201,188,129, 3, 7,226,222,189,123,152, 58,117,
+234,205,136,136, 8, 0,192,189,123,247, 48,119,238,220,155,151, 47, 95,198,204,153, 51,209,183,111, 95,222,141, 27, 55,182,192,
+132,220, 63, 70,163, 17, 59,119,238,132,209,104,132, 68, 34,129,149,149, 21, 6, 15, 30,140,184,184,184,153,187,118,237, 74,100,
+113, 56, 31, 12, 26, 58, 10,167, 79, 70,224,217,211,184,153,187, 87, 77,108,114, 82, 96,146, 36, 49,112,210,164,226,226,142, 29,
+ 75,119,203,229,170, 15,165, 82,145,103,126,190,213,149, 35, 71,108, 76, 16,106, 4, 69, 81, 53,226,170, 90,116, 84,111,108,158,
+ 45,216, 98, 47,176,205,252,241, 56,153,107,224, 6, 32,134,231,143,132,134,242,103,113,120,228,212,145, 11,221, 48,114,161, 27,
+134,205,119,157, 34,106,129, 95,197, 45,240,241,192, 57,173,130,220,253, 45, 32, 47,212, 35,114,125,122,134,166, 4,171, 1, 60,
+ 51,229, 57,167,105, 58, 62, 39, 39, 7, 60, 30, 15, 45, 90,180,104, 11,160, 58, 46,112,199,244,233,211,103, 47, 91,182,108, 30,
+128,101, 85,159, 73,130,130,130, 58, 42, 20, 10, 36, 37, 37, 1,192,195, 6,172,193, 53,179, 12, 75,229,233,124, 87,153, 55,124,
+218,207,128, 84,218, 9, 57,165, 58,228,150,234,240,235,207,195, 17,125, 99, 5, 30, 94, 8, 69, 70,126, 62,132, 14, 35, 64, 25,
+181, 94, 38, 12,234,101,143, 30, 61, 34,110,220,184, 65,208, 52, 13,131,193,192, 84,202,229, 76,204,205,155, 80, 95,187, 70,152,
+155,155, 19, 61,186,244, 82,236, 94,113,250,254,241, 31,111, 62,212,171,154, 60, 80,127, 27, 44, 78, 73, 73, 9, 60,114,228, 72,
+ 16,128,197,222,222,222,119, 50, 51, 51,187, 93,191,126,189,157,179,179,243,166, 55, 37,173, 78, 11,145,158,158,254,202, 86,149,
+ 22, 66, 87, 37, 26, 6, 86,137,185, 97, 0,230,226, 45,102,217, 55, 1, 87,255,139,131,225, 79,227,181,217,134,175, 11,173,218,
+137,194,224, 46,149,154, 25, 12,250,236,139, 23, 47,234, 73,146,132, 72, 36,194,228,169, 83,201,159,127,250,169,231,248,192,192,
+168,143,222,125,247,108,212,229,203,126, 1, 1, 1, 96, 24, 6, 36, 73,226,208,161, 67,106,141, 70, 93,226,226,226, 98,105, 74,
+163, 81,251, 1,146,203,229, 53, 66,171,162,162, 2,246,246,246, 38,187, 14,149,114, 92,186,124, 46,186,140,161, 62,201, 28,152,
+188, 65,191, 38,127,120, 64, 57, 77,177, 43, 40, 3, 42,212, 12, 42, 53, 96,223, 35,173, 2, 38,123,140,208,167,246, 15,120,118,
+ 45,241,118,137,134,210, 52,105,182, 68, 97, 97,225,194,144,144,144, 18, 71, 71, 71,194,220,220, 28, 78, 78, 78,228,176, 97,195,
+138,179,178,178,150,189,233, 21,177,182,182, 30, 23, 20, 20,116, 42, 39, 39,103,244,181,107,215, 90, 93,191,126,125,116, 80, 80,
+208, 41,107,107,235,113, 38, 82, 28, 94,176, 96,129,146,199,227,161,107,215,174,168,172,172, 68,213, 44,159, 6, 55, 83, 92,164,
+ 92, 46, 23,219,214,126,139,197, 97,243, 80,154,120, 15,143,111, 94,196,213,124, 2,139, 86,126, 15, 46,151,251, 70,185,190,218,
+216,138,188,189,101,102, 9,115,167,142,205, 13, 15, 11, 51,139,141,141,229,204,158, 51,151, 73,207, 43, 5,111,224, 58, 22,122,
+ 47, 36, 31, 41,109, 49,232,253,126, 88,178,248, 75,239,170,164,157, 13,162,189,173,200,219, 75,102, 22,255,229, 71,227, 83,230,
+204,153, 35, 92,179,102,141, 38, 48, 48, 80, 93, 80, 80, 32, 20, 75,173, 60,217, 22,150, 94,233,121,249,146,192,192,192,212, 79,
+ 62,249,164,188,169,156,139, 22, 45, 18,157, 63,127,158, 29, 18, 18, 98, 44, 43, 43,147,112,132, 66, 95,130, 47,232, 82, 84, 86,
+102, 49, 58, 36, 36,121,244,232,209,170,170,132,165, 38,115,126,243,205, 55,162,103,207,158,177, 3, 3, 3, 13,249,249,249,102,
+ 98,107, 27, 31,150,165,149,127, 90, 94,129,121,151,128,128, 23,179,103,207, 86, 54, 84,206,218, 34,197,204,204, 44,167,123,247,
+238, 88,191,126, 61,126,248,225, 7,188,247,222,123,136,123, 26,135, 65,179,231,161,195,199,115,113,242,246, 93,228,228,228, 96,
+249,242,229,240,241,241, 1,151,203,125, 86,231,243, 56, 51,145,136,205, 7, 17,155, 15,130,152,153, 72, 84,191,175,215,178,181,
+172, 2,181,247,175,107,191,135,223,212,109,233,242,115, 36,162, 27,138,195,106, 76,108,141, 30, 61,250,211,234, 20, 14, 31,126,
+248,225,205, 77,155, 54,245,248,240,195,151, 3,237,174, 93,187, 98,197,138, 21, 61, 22, 45, 90,116,115,229,202,149,232,215,175,
+ 31,220,221,221, 27,157,248, 66, 81, 20,140, 70, 35,198,143, 31, 15,163,209,136,162,162, 34, 60,127,254, 28,219,183,111, 7,195,
+ 48, 2, 0,112,148, 57,119,230,241,120,120, 20,243, 64,181,248,195,128,223,154, 96,201, 34,106, 15, 98, 20, 10, 5, 70,127,252,
+113,113,118,155, 54,165, 91,139,139, 85,211,164, 82,145,107, 70,134,149,153, 78,231,132, 6,226, 18, 9,130, 0, 77,211, 53,194,
+170, 90,112,189,190, 85,117,148, 38, 65,175,162,207, 92,223,151, 11, 0,232, 53, 81,134, 97,243, 93,167, 56,122,136, 54,247,156,
+240,210,232,125,108, 69, 10, 83,153, 75,173,129, 1,241, 77,176, 88,223,187,119,239, 30, 44, 45, 45, 17, 18, 18,194, 39, 73,114,
+117,245,120, 21, 47,115,103,109,168,230,226,243,249,235, 66, 67, 67,201,242,242,114, 60,126,252, 24, 0, 46,215,215, 46, 49, 12,
+ 83, 83,119, 69, 41, 1,138,230,225, 86,204, 57, 92,184,126, 20,105, 57, 69,200, 40,212, 0,108, 11,104,148,217,208,171,115,160,
+ 43,143,129, 92, 43, 50,169,192, 92, 46,183,200,219,219,155,241,247,247,103, 24,134,193,139, 23, 47,140,233, 25, 25,198, 7, 27,
+ 55, 50, 79,102,204, 32,204,158, 63,231, 10,133, 66,194,205,205, 13, 2,129,128, 22, 8, 4, 37,127, 99,231,253,151,164, 91,248,
+ 11,210, 66,252,153, 86, 45, 6,255,157,200,195,171,179, 13,107, 18,152,214,149,176, 20,140,185,112,236,209, 45, 63, 91,132,140,
+159,168,244,241,241,145, 58, 57, 57,129, 32, 8, 12, 31, 49,130, 8,186,118,205,140, 35,147,193,250,157,119,106,220, 17,151, 46,
+ 94,196,185,115,231,148,167,127, 63,238, 52,117,218,180, 33, 0,246, 52, 80, 24, 54,159,207,175,249,221,188,188, 60,240,249,252,
+154,152, 8,185, 92, 14, 91, 91, 91,228,229,229,193, 68,207,220,222,240,176,187, 97,133, 1, 11,221, 2,204, 56,196, 89,101, 62,
+ 40,134, 1,135,160, 0, 53, 3, 3, 5,104, 13, 12, 58,187,178,172, 46,168,141,210,200,123, 17,169, 0,246, 54,229,236,105,181,
+218, 43,177,177,177, 51,104,154, 62, 10,128,188,118,237, 26, 29, 31, 31,255, 41, 76, 15, 92,255,163,217, 94, 36,154, 31, 21, 21,
+101, 53,127,254,252,178,200,200,200,138,193,131, 7, 91,108,223,190,221,170,111,223,190,243, 75, 74, 74, 14,154, 98, 8,204,204,
+204,220,147,149,149,245,169,191,191, 63, 74, 75, 75,161,215,235, 17, 29, 29, 13, 15, 15, 15, 60,124,248, 16,109,219,182,197,131,
+ 7, 15,208,174, 93, 59, 80, 20, 5,141, 70, 3,154,166,169,198, 26,243,210,226, 34,160, 36, 19,185,247,206,226,249,147,104, 68,
+229, 18,248,241,224, 41,180,104,229,246, 70,121,106,218,218,137, 58, 58,218, 90, 95, 88,179,244, 27,187,244, 43,135, 16,177,243,
+ 71,250,234,217,179, 29,120,102,152,209,123,252,231,163,116, 6,180, 4,192,235, 22,224,143,129,210,103,148,168, 21,242,163,226,
+ 27, 78,176,216,214, 78,212,209,222,198,250,252,191, 86, 47, 51,123,113,110, 55, 14,111, 91,207, 28,219,119,192, 71, 3, 4,116,
+236,216,113, 32, 73,146,150, 0, 52, 85,113, 94, 38, 45,109, 83, 23,231,165, 83,167,252, 52, 64,192,137, 19, 39, 6,138, 68, 34,
+ 7, 0, 6,149, 74,149,242, 54,156,151, 35, 35,253,170,203, 73, 16,132, 29, 0, 61,195, 48, 47,208,196, 37,120,198,140, 25,179,
+ 98,238,220,185, 97, 20, 69,217,214, 26,157,179,214,173, 91,199,166,105,154,197, 48,140,158, 36, 73,253,249,243,231, 41,163,209,
+152,171,209,104, 62,126,155, 86,100,212,168, 81,184,123,247,238, 82,188,156,132, 97,170,181,250,149, 56,173,170, 37,123,222,152,
+255,218,181,107,203, 63,248,224,131,240,131, 7, 15, 62,223,180,105,211,208,153, 51,103,226,208,161, 67,104,211,166, 13, 30, 61,
+122,132,133, 11, 23, 2, 64,143, 69,139, 22,157,220,177, 99,135,123,122,122,250, 58, 19, 44, 26, 48, 26,141, 56,112,224, 0,134,
+ 15, 31, 14, 91, 91, 91,200,100, 50, 16, 4,113,101,218,180,105, 63, 1, 0,139, 96,113, 1, 64,171,209,106, 61, 61,253, 77,182,
+224,114,185,220,154,182, 46, 63, 63,191,102,166,224,128, 15, 62, 40,254,117,205, 26,252,166, 86, 99,154, 84, 42,202,118,118,118,
+ 60,249,226,197, 71, 79, 95, 54,206, 76, 67, 86,157,198, 68,150,169, 33, 13,234, 60, 44,248,125, 85,154, 3,128,247,122, 77,148,
+161,215, 68, 25,252,135,217, 17, 36,139,192,147, 11, 37,136,187, 84,122,204, 32,199, 21, 52,109,185,156,248,213,171, 87,159,236,
+221,187,247,208,246,237,219, 99,250,244,233,159,236,220,185,147,107, 48, 24,230,224,223,105, 30, 44, 72,146, 92,182,109,219,182,
+143,172,172,172,112,227,198, 13, 92,191,126,253, 10,128,204,250,218, 37, 0, 53, 57,179, 90,184,180,213, 60, 75, 87,136, 10,115,
+110,225,230,141,223,209,198,231,115, 8, 29,134,192,202,115, 37,244,137, 63, 64, 87,114, 1, 86, 46,131,145,157,254, 2, 44, 54,
+ 63,174,177, 32, 20,134, 97,158,102,103,103,187,187,187,187, 19,105,105,105, 70, 0, 12, 69, 81,140,190,103, 79, 67,135, 53,107,
+ 56,113,159,124, 66,116,123,246,140,197, 16, 4, 29, 29, 29, 13, 0, 9,255,137, 94,188, 58,221, 66, 92, 92, 92,125,233, 22,154,
+ 4,111,111,239, 30,215,175, 95,231,107, 52, 26, 92,189,122, 21, 93,186,212,204,237,250,143,102,191,175,173, 69,254,203,240, 81,
+ 29,159,109,127,197,162,245,202,141, 77, 19,156,118,109,219, 82, 92, 18,187,134, 15, 25,162,138,141,141,173, 25,245,105,238,223,
+135,242,220, 57, 80, 20, 5,134, 97,112,253,218, 53,132, 78,156,168,224,176,136, 95, 93, 93, 91, 49, 4,243, 74,238,150,254,117,
+140, 30, 66, 66, 66, 66,106, 26,159,172,172, 44,136,197, 98,240,120, 60,208, 52, 13,163,209, 8, 22,139, 5, 11, 11, 11, 24,141,
+198,186, 76, 48,175,115, 26,168, 82,229,232, 29,131, 38,228,201, 20,122,102,134,165, 43, 90,114,133, 53, 15,167,131, 57,129,161,
+ 62, 28,216,176, 11,153,203,235,222,205,165,181, 37,163,241,199, 25, 93,141, 77,249,111,219,169, 83,167,159, 66, 67, 67, 73, 0,
+232,223,191, 63,217,169, 83,167,205,104,120,169,156, 6, 57, 5, 2, 1, 31, 0, 78,157, 58, 85,250,252,249,243,247, 78,157, 58,
+ 85, 90,251,115, 19, 57,183,175, 93,187, 22, 34,145, 8, 70,163, 17, 58,157,174, 38, 62,171,246,171, 94,175,135,141,141, 13, 78,
+159, 62, 13,138,162, 78, 55, 86, 78,151,150,173, 64,216,182,198,158, 83, 81,184, 94,204,125, 19,145, 85,195,217,218, 65,220,206,
+193,198,250,226,191, 86, 45,183, 45, 75,142, 70,118,118, 54,115,254,220,233, 59, 26, 32,167,162, 18,139,203,149,104,167,214, 65,
+208,197, 29,153, 23,183,125,205, 44,234, 5, 3,234,158, 53, 88,195,217,193, 65,220,206,201,214,250,252,247,255, 90,101, 86,158,
+ 28,141,188,252,124,156, 57,125, 42, 86, 3, 84,187, 27,167,208, 52,237, 69,211,180, 23,128, 41, 13,136,151, 38,113,170, 84, 42,
+111,149, 74,229,253,103,114, 50, 12,227,205, 48,140,201,156,181, 99,162, 54,108,216,144,152,151,151, 23, 90, 88, 88, 24, 92,189,
+149,149,149,245, 87, 40, 20,125, 84, 42, 85, 79,245,134, 86, 22, 42,149,202, 78,161, 80, 56,106, 52,154,206, 0,162,155,112,207,
+215,160,118,214,233,188,188,188, 37,121,121,121, 68, 99,229,100,125,156, 72,236,255,254,203,223,183,109,219,230,248,150,252,175,
+148,179,184,184,248,232,193,131, 7,125,221,220,220,220,167, 76,153,130,173, 91,183, 98,211,166, 77, 90, 0,216,177, 99,135,182,
+150, 37,203, 37, 61, 61,221,191, 30,183, 97,255, 90,214,146,189, 3, 6, 12, 96,174, 95,191,142,225,195,135,215, 36, 18,253,229,
+151, 95, 96, 52, 26,229,253,250,245,163, 1, 64,173, 81,201, 25,154,129, 78, 95,175,255,253, 15,231,147,199,227,189, 95, 59, 95,
+ 96,117, 50,102, 30,143, 7,134, 97,208,174, 71,143,226,114, 31,159,210,157, 21, 21,170, 37,222,222,230, 31,121,122, 78,105, 15,
+ 76,172,139,147, 32,136, 87,172, 58,175,111, 77,176,100,213, 46,103,161, 58, 23,211,127, 95,149,118,174,218,178, 37,144,176,161,
+169, 52,226,248,154,180, 34, 77, 17,126,169, 79,252, 52, 84,247,210,210,210,217,107,214,172,209, 74,165, 82,140, 26, 53, 10, 43,
+ 87,174,156,214,163, 71,143, 10, 59, 59,187,187,109,218,180,121, 50,118,236,216,188,232,232,232,217, 65, 65, 65, 72, 74, 74,194,
+247,223,127, 95, 94, 86, 86, 54,161, 33, 78,130, 32,106, 44,121,195, 6,245, 47,253,121,243,122,186, 95,239, 79, 33, 18,154,195,
+192,113, 65,169,194,128, 50, 37, 3, 29, 63, 0, 60, 46, 31,193,129, 29,113,247,252,110, 21,165, 83,238,105,236,158, 87, 40, 20,
+199, 38, 79,158, 44,231,114,185,208,233,116, 12,135,195, 1,255,101,220, 49,205,121,239, 61,125,183,248,120, 35,197, 48, 52, 65,
+ 16,248,226,139, 47,148,101,101,101, 7,223,228, 57,106, 2,106,115,254, 89,233, 22,250,191,214,255,252, 25,105, 33,254,138,186,
+255, 55, 99,123, 29,219,191, 45, 90,213, 83, 42,171, 95, 9,130,166, 40,138,134,171,155,171, 89,122, 90,230,143, 99,198,132,124,
+ 56,112,224, 32,209,160, 65,131, 4, 29, 19, 95,142, 70, 79,157, 58,133,136,136, 8,213,133, 11, 23,228,124, 14,107,135, 75, 11,
+ 23,123,138,162, 65, 16,116,131,106,216,204,204,108,206,130, 5, 11,132, 21, 21, 21,216,180,105, 19,237,235,235, 75,138,197, 98,
+232,245,122,236,216,177,195,208,177, 99, 71, 14, 73,146,168,168,168, 0, 73,146,207, 76,172,224,227,138,204,156,224,159,130, 70,
+ 70,248,207,154,106,221, 33,168,155,180,143,139, 19, 12,239, 48,200,205, 74,195,243,203, 23,202,158,158,223, 88, 2, 77,193, 72,
+ 52,190, 60, 80, 93, 29,193,183, 23, 46, 92,176,155, 61,123, 54,163,209,104,136,204,204, 76,102,213,170, 85,118,211,167, 79,255,
+ 54, 55, 55,119,220, 27, 94, 20,162,188,188, 28, 4, 65,208, 85, 13, 73,245,168,191, 41,126,185,184, 61,123,246,156, 24, 49, 98,
+196,176,126,253,250, 33, 49, 49,177,198, 69, 88, 91,104, 85,207, 62, 92,189,122,117, 57,128,240,198, 72, 57, 28, 14, 54,237, 57,
+138,242,178, 98,216,219,203, 32, 16, 10,241,166, 51, 44,121, 36,185,228,187,229,223,216, 21, 39,220, 37,226,238, 68,209, 71, 30,
+ 23, 20, 26, 41,166,238,140,255,149,185, 76,149,250,111,120, 52, 67,178,150,124,183,106,153, 69,181, 91,243, 96, 76,158,156,160,
+152,217,111,245,136,252,183,112,254,205,144,201,100,200,203,203, 35,100, 50, 25, 83, 21,163,197, 52, 32,180, 94,189,193, 95,186,
+203,136,134,220,134,111,202,159,154,154,186,234,157,119,222,249, 50, 41, 41,233, 72,135, 14, 29,102, 2,104,161,213,106,203, 23,
+ 45, 90,244,175, 29, 59,118,124,104,138, 37, 11, 0, 14, 29, 58,180,113,234,212,169,231,134, 12, 25,242, 53, 77,211,157,106,117,
+236,169,118,118,118, 53, 46,220,162,130,252,176, 25, 31,142, 15, 83, 40,202, 76,206,115, 39,145, 72, 62, 90,180,104,145, 64,169,
+ 84, 98,203,150, 45,116,199,142, 29,201,234, 65,209,190,125,251,140,109,219,182,101,135,124,250,105,241,134,252,124,172,184,113,
+ 67, 25,230,229,229,187,243,249,243,206,160,233,189,245, 89,117,234,178,100, 85,135, 93,188, 33,114,171,196,214, 47, 0,222,235,
+ 54,198, 1, 39,214,166,161, 44, 93,247, 47, 24,241, 2, 38, 44, 11, 84, 7,178,143, 29, 59, 22, 92, 80, 80,112,226,155,111,190,
+177,232,220,185, 51,188,188,188, 56, 18,137, 36,160, 58, 93, 76, 69, 69, 5, 46, 93,186,132,173, 91,183,234,158, 62,125, 58,162,
+ 33,119, 21, 69, 81,133,109,219,182,173, 62, 15, 12, 65, 16, 37,114, 45, 97,113,184,125,128,100,202,140, 35,196,205, 7,183,145,
+171,167,161, 53,208,112,117,243, 67,159,247, 54,224,228,217, 39, 84,110,122,124,188, 65, 93,246,171, 9,229,125,145,156,156,124,
+124,249,242,229, 99,190,254,250,107, 97,113,113, 49,165,213,106,233,163, 71,143,178,166, 76,153, 66, 49,108, 54,205,101,179, 49,
+103,206, 28,117,121,121,249,239,192,223,186,192,244, 95,146,110,225, 47, 72, 11,241,167, 89,179,106,191,254,127, 65,157, 79, 40,
+205, 34,111,109,221,246,243,251,135, 14, 28,116, 96,177, 72,135, 23, 41, 41, 15,134,142, 28,157,115,241,226, 69, 43,174,133, 69,
+ 23, 0,180,110,230,204, 59,122,173,186, 52,242,196,137,150,174,174,173,124,170, 22,149,102,104, 22,121,171,161, 31, 84, 40, 20,
+202, 27, 55,110,168,194,195,195,137,172,172,172,253,246,246,246, 99,207,158, 61, 43, 25, 57,114,164, 58, 49, 49,241,152,131,131,
+195,176,160,160, 32,179, 47,191,252, 82,171, 80, 40,154,178,240,104, 60, 83, 84,214,254,254, 55,235, 62,184,191,246,231,119,193,
+102,117,135,150, 3,208,134, 91,208, 87, 94, 4,176, 31, 77,200,119, 84, 27, 98,177,216, 71, 36, 18, 33, 54, 54,182, 44, 32, 32,
+ 64,167,209,104,184, 43, 87,174,180, 22,139,197, 62,111,122,226, 25,134, 97,202,202,202, 64,211, 52, 27, 0, 81,245, 10,186,233,
+115,241,199, 13, 29, 58,244,196,225,195,135, 7, 12, 26, 52, 8,238,238,238, 48, 24, 12,104,219,182, 45,116, 58, 29, 60, 60, 60,
+160,213,106,177,116,233, 82, 84, 84, 84,204, 67, 3,107,158, 17, 4, 1,163,209, 88, 19,108,235,228,220,242,101,158,158,183, 72,
+ 99, 33,230,144,238,207, 34,119,162,176,164,152, 62,252,168,160, 64,165,167,130,147,139, 84, 79, 95,223, 79, 69, 65, 25, 52,229,
+179, 28, 0,208,210, 13,175, 56, 47,230,253, 31,123,215, 29,222, 84,217,190,239,115, 78,246,108,154,182,105, 83, 90, 90, 86, 1,
+ 41,171,236, 13,130,130,128,162,204, 15, 65,224, 3, 11,136, 34,160,224,192, 1,101, 9,226, 7, 10, 50, 42, 40, 67, 80, 89,178,
+ 81,134,148,150, 77,203, 44,101,143,238,145,166, 73,218, 52,205, 58, 57,191, 63,154,132,180,116, 36,165, 40,248,203,125, 93,231,
+ 74,206,200,157,247,172,247,189,223,231,125,222,231, 65,131,155,251,127, 64, 78,174, 10,191, 38,101,105,244,102, 91,191,155, 21,
+112,122, 84,206,231,132, 51,106,110, 10,134, 78,117,255,216, 39,129,187,130,170, 50, 92,204, 6,113, 65,248, 35,131,181, 63, 86,
+ 24, 35,235, 9,249,119,223,186,117,107, 55, 0, 36, 39, 39,167,141, 28, 57,242,227,251,247,239,207, 3,112,224,193,131, 7,107,
+ 61, 33,250,241,199, 31,111, 1,248,111, 85,199,252,178,244,191,187, 0,236,242,132,183,176,176,176, 36, 49, 49,177,228,195, 15,
+ 63, 36,210,210,210, 14, 6, 5, 5,189,124,232,208, 33,225,224,193,131,141, 87,175, 94, 61, 26, 28, 28,220,189, 79,159, 62,226,
+ 3,103,207,102, 20,223,185,179,111,223,253,251, 33, 22,155,109, 95, 85,239,103, 45,139,172, 50, 98,107,215,252,251,139,119, 47,
+190,223,199,102,196, 14, 83, 1, 78, 3, 72,127, 2,206, 19, 39, 79,158,108, 54,122,244,232,223, 6, 14, 28,216,185, 89,179,102,
+168, 91,183, 46,110,222,188,137,188,188, 60, 92,190,124, 25,123,247,238,221, 91, 82, 82, 82,109, 66,109,181, 90,253,120,122, 34,
+190, 60,120,195,247,115,246,158, 79,104,223,184,219,128,177,130,230,193, 54,152,204, 12,210, 30,222,193,220,207,215, 21,103, 61,
+188,149,108,182,154,223,128,155, 19,117, 12, 6, 67,236,183,223,126,203,222,183,111,223,128,149, 43, 87, 74,194,194,194, 40, 14,
+135, 67, 2, 96, 46, 92,184,192, 76,157, 58, 85,175, 82,169,246,235,116,186,216,191,185,141, 62,113,247,238,221, 40,138,162,106,
+ 53,220,194, 19,132,133,240,162, 54, 81,191,126, 72,179,134, 97,193,147, 26,212, 13,153, 82, 63, 44,116, 76, 69, 78,238, 13,124,
+125, 37,245,195,235, 68, 55,168, 27, 50,165, 97, 88,240,164,250,245, 67,154,185, 97, 90,108, 32,149, 74, 15, 42,149,202,214, 0,
+224,227,227, 51, 72, 38,147, 93,243,241,241, 25,100,239, 5, 14, 18,139,197,215, 35, 35, 35,223,254, 27,205,149, 85,114, 54,110,
+220,120,100, 81, 81,209, 59,141, 27, 55, 30,233, 88,191,115,231,142,115,189, 38,156,161,161,161,189, 47, 92,184,240,159,165, 75,
+151, 14,105,212,168,209,160,133, 11, 23, 14,249,253,247,223,255, 19, 18, 18,210,182, 6,156, 60, 0, 63,179,217,236, 28, 46,151,
+155,203,102,179,115, 28, 11,139,197,202,161, 40, 42, 7,192,218, 74,172,101,125, 92,122, 57, 9,129,129,129, 15, 2, 3, 3, 31,
+ 4, 5, 5, 61, 8, 10, 10,122,160, 84, 42, 31, 91,252,253,253, 19,220,189,158, 77,131,196, 93, 59,212,149,156,108,161, 20, 39,
+188, 16, 40,106, 90, 27,247,168,105,144,184,107,251,186, 62, 39, 91, 40, 37,241,255,223, 56, 91, 7,129, 97,214, 52,101,152, 53,
+ 77,153,214, 65, 96,170, 91,175, 77,179,191, 82,169,100,148, 74,229,156,167, 53,148, 80, 9,255,223,254,190,215, 34,103, 3,137,
+ 68,242, 75,221,186,117, 29,117,221,171, 82,169,244, 47,177, 88,252,170,189,174,123, 85, 36, 18,197, 69, 70, 70,142,173,142, 83,
+ 46,151, 95, 80, 40, 20,217,246, 37, 43, 48, 48, 48, 43, 48, 48, 48, 75,161, 80,100, 42, 20,138,204,128,128,128, 12,199, 34,147,
+201,206,212,240,220, 21, 0, 58, 2,104, 11, 64, 90,139,215,179, 62,128,137,246, 58,232, 43, 0,111, 3,104, 89, 11,247,136, 96,
+ 11,228,147,121,178,208,147,108,113, 64, 33, 91, 28, 80,200,243, 9, 57, 89, 69, 10, 30,119, 56,155,200,229,242, 5, 82,169,244,
+119,137, 68, 18, 47,145, 72,118,251,251,251, 47, 4,208,228, 31,122,150,196, 0,214,163, 52, 62,211, 1,148, 14,133,239, 70,233,
+164,130,176,103,240,153,255,255,140,232,127,234,143,251,120, 57,189,156, 94, 78, 47,167,151,211,203,249, 28,114,146,222,235,233,
+ 21, 90, 30, 10,173,242, 11,128, 42, 34,195,123,225,133, 23, 94,120,225,197,255, 99,216,188,151,192, 11, 15, 81,225,208, 50, 81,
+133, 42,245, 36,214, 84, 77,148,237, 17, 47,167,151,211,203,233,229,244,114,122, 57,189,156,255,239, 56,189,168, 69,120,205,170,
+ 94, 78, 47,167,151,211,203,233,229,244,114,122, 57,255,237,240, 14, 29,122,225,133, 23, 94,120,225,133, 23, 94, 60, 37,196,186,
+ 8,174, 50, 67,136, 94,161,229, 57, 72, 0,239, 0, 24, 10,160, 33, 74,179,217,111, 7,176, 10, 53, 27,211,151, 2,248, 24, 64,
+ 23,148,206,206,185, 7, 32, 30,165,179,115,138,188,151,187, 98,248,251,251,127,202,102,179,101, 64,105,106, 19,199,167,235,119,
+154,166, 53, 58,157,110,225, 83, 42, 2, 5, 55, 35, 40, 59,202,234, 90, 54,215, 79,139,197,242, 52,203,233,197,179,137,198,114,
+185,252,103,181, 90, 61, 10, 46, 73,150,189,240,226,223,128,128,128,128, 73,102,179,249, 51, 14,135,179, 32, 47, 47,111,245,255,
+163, 83,127, 76,100,149, 17, 90,251,246,237,139, 3,128,129, 3, 7,246, 0, 0,153, 76,118,138, 36,201,250,158,252,131,205,102,
+187,167,209,104, 42, 13,160, 38,147,201, 78, 81, 20,245, 24,167,197, 98,145,176, 88,172,194,138,126, 99,181, 90,211,117, 58, 93,
+219,103,228, 34, 18, 0,246,249,250,250,150,204,155, 55,111, 85,207,158, 61, 67, 51, 51, 51,173,179,102,205,234,126,233,210,165,
+ 1, 0, 94,241, 80,108,117, 34, 8, 98, 67,235,214,173,119,141, 25, 51,230,183, 14, 29, 58,112,243,243,243, 37,219,183,111,175,
+179,113,227,198, 68,155,205, 54, 10, 85, 36, 90,253,255, 12, 54,155, 45, 75, 79, 79,151, 0,165,169, 73,236,194, 10, 22,139, 5,
+ 22,139, 5,122,189, 30,173, 90,181,170,245,255, 13, 10, 10,138, 34, 8, 98,165, 88, 44,110, 91, 84, 84,116, 30,192,148,172,172,
+172, 75,158,148,213,106,181,130, 97, 24,103, 57,155, 53,107,230,189,161,158, 97, 2,151,203,237, 23, 17, 17,209,222,104, 52, 22,
+220,187,119,239, 28, 77,211, 95,160,246,114,180,249, 0,248,130,199,227,117,104,216,176, 97,232,173, 91,183,210,204,102,243, 89,
+148, 38, 67,214,214,134,200,234,209,163, 71,194,247,223,127,239, 55,121,242,228,132,248,248,248,174, 94,177,229,197, 63,133,208,
+208, 80,153, 94,175, 95, 7, 32,138,205,102, 7,241,249,124, 8, 4,130,108, 30,143,119, 81, 32, 16,140, 63,121,242,164,198, 83,
+ 78,154,166,191,120,240,224, 65, 80,199,142, 29,151, 40, 20,138,185, 42,149,170,196,108, 54, 31, 45, 40, 40,152, 1, 64, 87,213,
+111,203,107,145,231, 76,100,185,126,194, 33,186, 88,246, 19, 99, 0,244, 44,163,192, 88,172,144,135, 15, 31, 42,248,124, 62,108,
+ 54,155,179, 49, 43,191, 56,182,155, 76, 38, 52,111,222,220, 92, 77,131, 19,154,150,150,166,224,114,185,206,109, 38,147, 9,117,
+234,212,177,165,167,167, 43,236,105, 15,156, 48, 26,141, 8, 9, 9,121,150,114, 30,189, 35,151,203,181,169,169,105,173, 74,140,
+230,152,183,223,251,228,211, 81, 67, 95,242, 61,117,234,148,237,149, 87, 94, 49,198,197,197,189,131,210,196,169,110, 85,230, 4,
+ 65,108,156, 53,107,214, 92,190, 80,234,119,236, 84,178,113,227,246,253, 25,173, 27,215, 35,102,204,152, 65, 77,157, 58,245, 68,
+ 84, 84,212,207, 54,155,173, 13, 60,176,108,249,250,250, 30,226,241,120,225,246,235,151, 90, 80, 80,240,242, 51,248, 64,178,240,
+120,240,216,138,182, 85,139,252,252,124, 24, 12,134,199,150,102,205,154,185,155, 43,211,163,114,179,217,236,221,139, 22, 45,170,
+147,157,149,133,255, 45, 91,214, 17,165,150,204,142,238,252, 56, 55, 55,247,177,114, 54,109,218, 20, 94,120,132,143,231,206,157,
+187,232,205, 55,223, 4, 77,211, 48, 24, 12,193,183,111,223,142,252,236,179,207,222,184,115,231, 78,123, 0,119,159,180, 51, 30,
+ 17, 17,145, 50,109,218, 52,121,251,246,237, 97,207, 82, 17, 28, 31, 31,223,113,253,250,245,111,165,166,166, 54, 5,144,247, 36,
+127, 32,151,203,127,254,225,135, 31,252,132, 66, 33,246,236,217,227,215,187,119,239,248,164,164,164,110, 79, 32,182, 72, 63, 63,
+191,169, 0, 94,180,217,108, 92, 0,103, 11, 10, 10,230,195,243,168,238, 74,177, 88,188,131, 36,201,122,192,163,104,244, 36, 73,
+250, 19, 4,161,114,108, 35, 8, 66, 97,179,217, 78,171,213,234,206,222,199,241,249,134,159,159,223,132,156,156,156,239,121, 60,
+ 30,199,215,215, 23, 66,161, 16, 44, 22, 11, 44, 22,171, 46,143,199,171,203,227,241,250,247,234,213,107,202, 95,127,253, 85,101,
+132,253, 78,173, 3,199,129, 36, 98, 40,130,164, 0,128,100,139,164, 62, 62, 62,136,137,137, 17, 13, 26, 52, 72, 4, 0, 9, 9,
+ 9, 99,198,142, 29,219, 59, 61, 61,189,121,101, 98,171, 34, 45,242, 28, 33,182,170, 6, 15,118,245, 24, 87,230,205, 37, 73,112,
+185, 92,156, 57,115, 6,238, 4, 43,119,164, 72,168,178, 54,176, 71, 24,191,116,233,145, 1,192,209,208,112,185, 92,156, 60, 89,
+ 54,168,124,167, 78,157,156, 47,251,223,133,161,205, 74,131, 60,110,123,183,180, 92,195, 86,150, 70,215,222,246,110, 83,116,255,
+230, 33,134, 78,157, 51,162,184,196,220, 14,128, 94, 83, 80, 80,112,126,231,206,204,214,141, 27,115,126,254,249,231,246,117,234,
+212, 25,234,129,208,250,184, 77,155, 54, 59, 40,129,143,255,152,177,227,198,140,103,145,230,183, 38,126,184, 32, 45, 75,165,143,
+142,142,222,185,103,207,158, 49,139, 23, 47,190, 62,115,230,204,143, 1,204,118,183,252,124, 62, 63,252,198,141, 27, 17, 52, 77,
+163, 89,179,102,207, 98, 26,131,214, 40, 13,190,247, 38,128,173,246,109, 35, 81, 26,185, 63, 10,192, 69, 79,200, 28, 22,172,138,
+150,218, 70,157, 58,117,154,142, 30, 61,218, 95,173, 82,225,127,203,150, 57, 54,183, 69, 53,195,136,142,247,199,100, 50, 97,200,
+144, 33,163,105,154,102, 57, 68,160,209,104, 52,105,181,218, 18, 60,114, 44,205, 3,240,146, 27,197,169, 47, 18,137,190, 6, 16,
+101, 48, 24,234, 0,128, 72, 36,202,176,217,108,187,244,122,253,108, 60, 74,224,235,113, 7, 23, 64, 36, 42, 79, 5,197, 44, 90,
+180,232,214, 39,159,124,114,247, 31,224, 12, 15, 12, 12, 92, 56,108,216, 48,236,223,191, 31, 7, 14, 28,176, 8, 4, 2,214,216,
+177, 99,137, 41, 83,166,248, 78,155, 54,173, 63,128,111,159,240, 54,247,159, 59,119,174,252,133, 23, 94,192,246,237,219,113,249,
+242,101, 67, 68, 68,132,160,103,207,158, 96,177, 88,242, 79, 63,253,244, 21, 0, 27,158,228, 15,212,106,245,252, 15, 63,252,112,
+227,214,173, 91, 37,247,238,221,195,202,149, 43,253, 71,140, 24, 17,151,154,154,218,195, 3,177,197, 3, 48, 21, 64, 47,138,162,
+186,141, 29, 59,214,250,222,123,239,177, 73,146,180, 44, 91,182, 44, 96,253,250,245, 35,216,108,118, 84,126,126,190, 59,157, 52,
+ 18, 64,204,248,241,227,255,251,215, 95,127,249,158, 59,119,142,235,231,231, 7,154,166,157,150, 98,155,205,166,112, 60,179, 86,
+171, 21, 77,155, 54, 13,113,249,189,224,121, 21, 26, 36, 73,154,109, 54, 27, 27, 0, 31,128,177,186,245,127,147,200,146,203,229,
+147,213,106,245,170,160,160, 32, 4, 6, 6, 62,214,214, 26,141, 70,240,249,124, 78, 80, 80,208, 15,131, 6, 13, 98,239,222,189,
+187,210, 33, 64,130, 34,190,216,243,203,188, 58,114, 95, 9, 0, 96,249,154, 63,138, 1,224,247,223,127, 71,102,102, 38,124,125,
+125,209,188,121,115,106,222,188,121,202, 25, 51,102,252,175,160,160, 96,124,101, 92,229,181,200,115,102,209,138,173,104,189, 74,
+ 31, 45,134, 97,156,121,242,220,124,104,203,111, 58, 82,142,143, 48,153, 76, 40,111,209,114,188,188,108, 54,187,188,249, 17, 4,
+ 65, 48, 85,113, 86,128,177, 34,145,168,149, 94,175, 95,225, 65,239,214,201,185,237,221,166,216,200,155, 53,210,145,137,180,255,
+135,165,159, 27, 1,156,186, 63,126,229,247, 61,122,212,153,250,249,119,115, 12,249,153,170, 79, 71,191, 26, 30, 17,228, 39, 16,
+105,114,181,242, 38, 77,250,150,179,200, 84, 87,206,238, 99,198,140,217,244,231,153, 7, 4,159,207,225,176, 40,138,221,181, 69,
+ 99,191, 80, 31,202, 71, 2,248,164,221,189,117,106,220,184,113, 45,102,206,156,217,205, 3, 78,216, 27, 92,108,222,188, 25, 4,
+ 65,144,158,156,123, 45,226, 72, 85, 34,139, 97, 24, 16, 4,177,197,165, 81,217, 98,223,150,228, 34,182, 88, 85, 93, 79,135, 53,
+213, 33,170,198,142, 29, 59,218,106,181,178, 92, 42,137,242, 2,166, 34, 17,227,214,185, 43,149,202, 63, 1,188, 68, 16, 4, 76,
+ 37, 37,166,175,191,249,198,117,247,133,114, 34,235, 72,101,239,146,197, 98, 1, 77,211,172,164,164, 36,182,203,179,206, 6, 32,
+ 2,224,207, 48, 12, 72,146,188,226,198,245,108, 42, 20, 10, 79,237,221,187, 87,218,182,109, 91,130,203,229,194,106,181,226,234,
+213,171,161,139, 23, 47,158,120,228,200,145, 87,244,122,125, 51, 60,158, 60,221,157,123, 20, 25, 31, 31,175,111,208,160, 65,133,
+194, 81,167,211,177, 26, 55,110,220,163, 18, 81,244,180, 57,211,115,114,114, 94,127,233,165,151, 38,101,103,103,167, 88,173,214,
+143, 0, 52,247,247,247, 79, 26, 60,120, 48, 4, 2, 65, 47,131,193,240,237,147, 60,243, 10,133, 98, 80,231,206,157,177,114,229,
+ 74, 44, 94,188,184, 15,128,163, 0,122,235,116,186, 35,175,189,246, 26,100, 50,217,235, 26,141,102,195, 19,188, 71,141,187,119,
+239,254, 67, 76, 76,140,100,255,254,253,136,136,136, 64, 97, 97, 33, 62,248,224, 3,197,151, 95,126,121, 92,163,209,244,116,121,
+ 47, 42,227,108,198,227,241, 54,108,221,186, 85,220,160, 65,131, 6, 28, 14,135,108,208,160, 1,212,106, 53, 74, 74, 74,120, 11,
+ 22, 44,104, 33, 16, 8, 46,125,251,237,183, 27, 0, 12,174,166,156, 36,128,249,107,215,174,157, 20, 29, 29, 45, 27, 61,122, 52,
+109, 50,153,240,219,111,191,129,162, 40,176,217,108, 8,133, 66,103,242,106, 14,135,131, 38, 77, 30, 11,146,190,167,138,243,213,
+162,212, 15, 85, 6,207,134, 93,143, 84,193,231, 28,250, 96,179,217,224,243,249,224,243,249,224,241,120,184,113,227,198,231,124,
+ 62,127, 25, 65, 16, 86,119, 56,137, 71,234,162, 21,128,115,213,173,227,113,215,144,191,179,254,116, 32,132, 32,136,229, 0,122,
+149, 54,187,100,156,191,191,255,251, 57, 57, 57, 15,221,229, 84, 42,149,126,249,249,249,223, 42,149, 74, 4, 6, 6, 58,219,239,
+ 58,117,234,192, 98,177, 32, 39, 39, 7, 12,195, 64,163,209, 64, 40, 20, 34, 56, 56,248,219,232,232,232,237,177,177,177,249, 21,
+114,218,176,248,181, 17,159,125, 65, 81, 20, 9, 0, 20, 75, 44,158,246, 9, 16, 30, 30,142,174, 93,187,162,164,164, 4, 90,173,
+ 22,145,145,145, 44,130, 32,198, 16, 4, 33,101, 24,102, 53,128, 99,255, 66, 67, 97,165,206,240,115,203,143,139, 58,178,197,115,
+ 56, 28,183,132,150,253,248,234, 44, 40,164,197, 98, 1,135,195, 41, 99,145, 32, 8, 2, 52, 77,151,217,238, 16, 90, 53, 17,234,
+ 83,166, 76,177,253,240,195, 15,147, 10, 10, 10,214,160,134, 67, 9, 99,198,140,121,204,223, 99,198,140, 25,233,185,185,185,204,
+144,190,173, 68, 41, 7, 51,179, 26,250,138, 5, 1, 18, 73, 61,190,175, 92,150,159,159,127,218, 94,153,184,139, 70,109,218,180,
+ 17,108,220, 25,159,254,246,244, 69,243,218, 54,240,147,182, 12,241,247, 13,242, 17,112,197, 36,161,231, 91, 45,233,114,185, 60,
+194,211,114, 59,234, 5,161, 80, 8,146, 36,159, 37,139, 22,203, 33,178,212,106, 53,246,239,223,143, 1, 3, 6, 36, 57, 68,136,
+ 78,167, 67, 86, 86, 22,148, 74,101,146,221,242, 81,237, 48,162,205,102,131,217,108,134,217,108,118, 10, 24,151,103,200, 41, 96,
+ 28,199, 82, 20,117,165,134,101,159,231,235,235,219,189, 87,175, 94,220, 95,126,251,141,203, 48,140, 30,165, 57,212,138, 24,166,
+146, 4,217,229, 96,181, 90,157, 86, 54, 54,155,141,212,212, 84,103,195,229,200, 45,201,231,243,221, 51,101,240,120, 31,254,250,
+235,175,210,246,237,219, 19,249,249,249,176,217,108,206, 74,114,213,170, 85,252,161, 67,135,214, 73, 76, 76,252,212,104, 52,206,
+173,193,185, 18,149, 9, 34, 0,144, 74,165, 86,184, 23, 49,187, 90, 78,171,213, 74,116,233,210,101,166, 74,165,106, 97, 48, 24,
+ 22,184,115, 25, 1,236, 73, 79, 79,119,109,216, 47,165,164,164, 24,134, 15, 31, 46,168, 87,175, 94,135,228,228,228, 39,122, 72,
+ 27, 55,110,220,137,205,102,227,236,217,179, 70, 0,142,158,117,220,229,203,151,141,131, 7, 15,230,133,134,134,118,210,104,220,
+118, 89,105,220,180,105,211,195, 10,133, 66,224,168, 67, 3, 2, 2,216,177,177,177,146,140,140, 12,152,205,102,124,252,241,199,
+ 24, 56,112, 32,252,253,253, 49, 99,198,140,192, 37, 75,143,140,254,133, 0, 0, 32, 0, 73, 68, 65, 84,150,252, 92, 84, 84,212,
+166, 42,163, 53,151,203,221,116,251,246,237, 8,165, 82, 41, 56,115,230, 12, 90,182,108, 9,149, 74,133,236,236,108, 20, 21, 21,
+ 33, 59, 59, 27,227,199,143, 87,252,239,127,255, 11,118,195,146,229, 20, 89,177,177,177,154, 29, 59,118, 80,235,214,173,147,176,
+217,108,167,208, 98,177, 88, 78,161,229,200,173, 88,131,145, 6,141, 93,180,201,180, 90,237,147,248,185,241, 0,112, 93, 69, 22,
+143,199, 3,143,199, 3,159,207,127,162,188,172,207, 9,234, 16, 4,145,204,225,112,120, 66,161,144, 67,146, 36,120, 60, 94, 95,
+185, 92,126,173,121,243,230,205, 15, 31, 62,252,192, 29,146,146,146,146, 77, 60, 30,143,173, 80, 40, 0, 0, 17, 17, 17,104,217,
+178, 37,244,122,189, 77,171,213, 66, 38,147,145, 15, 31, 62,132,193, 96, 64, 86, 86, 22,194,194,194,216, 36, 73,110, 66,169, 31,
+242, 99, 56,149,148,189, 6,192, 26,199,186,191,191,127,142,171,165,147,207,231,163, 78,157, 58,200,200,200,128, 68, 34,161,190,
+252,242,203,193,191,253,246,219, 27,167, 78,157, 26, 3, 96,179, 11,213,220,231,216, 71,203, 33,178, 92, 63, 31, 9,173,129, 3,
+ 7,206,217,183,111, 95,143,138,122,225,108, 54,187,214,124, 93, 28,130, 74, 42,149,150,183, 90,193,102,179, 85,102,209,242,248,
+127,248,124,190, 96,242,228,201,133,171, 87,175,246, 88,108, 13, 91,153,226,180, 98, 61,214,141,108,214,236,212,167,159,126, 58,
+232,175,191,254,202,104,219,160, 30, 75,148,249,176,136, 47,149,201, 16, 82,119,192,216,215, 7, 95, 70,233,236, 67,119,113,187,
+176,176, 80,208, 48, 68,104, 34,201, 18,162, 46,143, 37, 81,138, 56,188, 32, 95,223, 58, 28,147, 49, 87,234,235,203, 53, 26,141,
+ 26, 84,145, 4, 26, 0, 2, 3, 3,255, 16, 8, 4, 97,142,117, 95, 95, 95, 31,134, 97, 32, 20, 10,161, 84, 42,197, 20, 69,221,
+116,121,185, 30,230,228,228,244,173,174, 96, 50,153,236, 15, 30,143, 23, 70,146, 36, 8,130, 0, 69, 81, 32, 73, 18, 36, 73, 58,
+191, 83, 20, 5,130, 32, 80, 92, 92,252,240,193,131, 7,125,221, 56, 95, 43,128, 40,130, 32,146,246,239,223,143, 14, 29, 58,224,
+224,193,131,232,215,175, 31,180, 90, 45,174, 94,189,138,238,221,187, 3,165, 67,138,110,193,213,249,221,209, 41,184,113,227,134,
+ 83,184,184, 46, 18,137,228, 73, 76,236, 9,195,134, 13,195, 15, 63,252,192,216, 59, 19, 34,130, 32, 90,250,248,248,220,184,126,
+253,186, 91,126, 48, 12,195,192,108,126,116,168,163,241,178,251, 67,120,148, 28,152,162,168,190,109,218,180, 33,180, 90,173, 67,
+ 64,130,197, 98,129,162, 40, 80, 20,133,239,191,255, 94,208,190,125,251,207,120, 60,222, 76, 14,135,163,179, 88, 44,191,148,148,
+148, 44, 0,160,121,150,106,164,110,221,186, 77, 79, 75, 75, 27, 24, 22, 22,182,247, 9,104, 24,139,197, 98, 2, 32,160, 40,138,
+ 93, 11,117, 20,101,127,182, 74, 92,196,190,213,190,206, 67,233, 48,177, 91,240,247,247,255,249,192,129, 3, 33, 97, 97, 97,176,
+ 88, 44,176, 90,173, 40, 42, 42, 66, 92, 92, 28,140, 70, 35,172, 86, 43, 34, 34, 34,240,197, 23, 95,148,188,255,254,251,252,181,
+107,215,230, 22, 21, 21,141,170,134,246,253,237,219,183,139,148, 74,165,192, 96, 48,224,238,221,187,104,211,166, 13, 10, 11, 11,
+161,215,235, 81, 92, 92, 12,179,217, 12,157, 78, 39,163,105,218, 84, 13,215,231,174, 34,107,226,196,137, 87,184, 92,110,155,247,
+222,123, 15,233,233,233,206,119,254,237,183,223, 70, 96, 96,160,243, 93,178,215,201, 30, 85,204, 44, 22, 11, 60, 30, 15, 28, 14,
+ 71, 83,183,110, 93, 16, 4,193,127,248,240, 97, 77,134,226,164, 0,116,108, 54,155,235, 42,176,120, 60, 30,206,158, 61,251, 41,
+151,203,173,204,154, 85,217,123,201,120,178,254, 79,131, 32,136,229, 28, 14,135, 39,151,203, 57, 46, 29, 78,142, 88, 44,134, 66,
+161, 88, 9,160,191,155,231,221, 90, 46,151, 59,235,247, 86,173, 90, 33, 45, 45,109,151, 86,171,125, 43, 55, 55, 23, 36, 73,110,
+ 34, 73,242, 13, 71, 39,181,160,160, 0,161,161,161,173, 43,227,235, 28, 21, 52, 9, 4, 83,198,162, 85,174,131, 6,169, 84,138,
+251,247,239, 67,175,215, 51,183,110,221, 34, 38, 79,158, 76,152, 76,166,159, 18, 19, 19, 79,163,116,182,125,165, 90,228, 57,129,
+231, 62, 90, 14,139,150,187, 13, 0, 65, 16,213,246, 38, 44, 22,139, 56, 50, 50,178, 34,135, 47,162, 34,161,101, 31, 78,170,209,
+131,206,102,179, 37, 53, 21, 91,229,177,119,199,214,192,197, 95,124,252,133, 60,184, 94,195,153, 51, 63,103,189,250,234,171,103,
+ 54,110,220, 72,203, 95,232,223,251,216, 31,155, 3,191,253, 96,214,193, 3, 7, 14, 0,165,142,209,238, 34, 97,223,190,125, 65,
+ 51,166, 78,193, 23, 31,190,127, 72, 26,225,207, 21, 19,114, 17,223,168,207, 19,131, 49,240, 26, 53, 29,184,115,239,222, 44, 0,
+137, 85,145, 8,133,194,176,228,228,228, 8,215,137, 4, 38,147, 9, 66,161, 16,199,142, 29, 11, 16, 8, 4, 1, 0, 96, 48, 24,
+208,188,121,115,119, 45, 38, 97, 55,111,222,140,144, 72, 36, 40, 46, 46,134,209,104,132,197, 98,129,205,102, 3, 65, 16, 96,179,
+217,224,114,185, 16,137, 68,158,206,236,187, 8,224,205, 1, 3, 6,108, 57,120,240, 32, 34, 35, 35, 81, 80, 80,128,148,148, 20,
+135,200,242,200, 71,203, 97, 37,114,245,199, 98,177, 88,248,185, 65, 3,188,157,153,233, 20, 48,203,125,124,240,133,173,102,217,
+ 52,154, 55,111,206, 36, 36, 36,224,208,161, 67,120,237,181,215,136,221,187,119,155,105,154,230,100,102,102, 94,201,204,204,116,
+139,195,102,179, 57,203,234,168,183, 93, 5,150,167, 66,203,106,181, 74,184, 92, 46, 74, 74, 74,224,176, 60,184, 46,245,235,215,
+135, 90,173,102,233,116, 58, 86,102,102,166,112,254,252,249,239, 29, 63,126, 92, 89, 88, 88, 56,242,159,172,133, 86,175, 94, 29,
+246,246,219,111,167,178, 88, 44,166, 95,191,126,163, 31, 62,124,248,186, 82,169, 60,250,215, 95,127,125, 3,160,177,167,124,254,
+254,254, 23, 88, 44, 86,136, 78,167,227,108,219,182,205, 82, 88, 88,200, 9, 8, 8,200,113,212, 29,142,107,109,177, 88,220,154,
+185,236,239,239,127, 65,165, 82,113, 86,172, 88, 97,201,207,207,231, 4, 6, 6,230, 56,120, 52, 26, 13,103,219,182,109, 22,157,
+ 78,199,241,241,241,185,160,213,106,171,229, 83,169, 84,163,198,140, 25, 19,127,244,232, 81,127,138,162,240,240,225, 67,228,231,
+231, 67, 38,147, 97,211,166, 77, 8, 11, 11,195,246,237,219,213,106,181,122,194,215, 95,127,253,153, 93,100, 85,231,163,213,189,
+ 67,135, 14, 97, 26,141, 6, 50,153, 12,122,189, 30, 23, 46, 92, 64,179,102,205,144,153,153, 9,146, 36, 33,147,201,176,106,213,
+170, 98,130, 32,212, 85, 17, 9, 4,130,215,163,163,163,101, 0, 16, 29, 29, 45,139,142,142,174,176,129,235,212,169, 19, 86,174,
+ 92, 89, 94,104,121,210, 49,112, 90,157, 92,196, 81, 73,199,142, 29,113,252,248,241, 89, 30,138, 35,147, 67,180,149,183,102,241,
+120, 60,143, 39,211,216,108, 54, 14, 74, 93, 26, 8,119,214,159, 1,244, 16, 8, 4,156,242, 27,139,139,139, 57, 74,165,178,155,
+ 7,194,215, 79, 32, 40, 53, 56,133,133,133, 65,171,213,210, 38,147,105,196,230,205,155, 45, 0, 16, 21, 21, 53,130,166,233, 18,
+171,213, 74,113,185, 92,232,245,122, 40, 20, 10,191, 42,108,163, 31,237,249,101,126, 80,121, 31, 45,165, 82,137,168,168, 40, 24,
+141, 70,100,101,101, 33, 46, 46,206, 66,211,244,150,213,171, 87,219, 2, 2, 2,254, 59,100,200, 16, 42, 49, 49,241, 93, 0,211,
+ 43,211, 34,207,153, 53, 43,182, 82,161,101, 87,144,199, 1,244, 44,127,146,229,197, 79, 85, 66,171,186,161, 67, 46,151,171, 73,
+ 77, 77, 21,185, 54, 42, 86,171, 21,193,193,193, 54,134, 97,136,138,132,214,147,152,130,217,108,182,228,147, 79, 62,209,172, 94,
+189,122,212,253,251,247,231,184,243,155,109,239, 54,197,198,114, 34,107,205,226,152,149, 43, 22,207,151,223, 57,244, 19,214,125,
+183,148,166,105, 36,182,104,209,162, 91, 81, 81, 17,203, 71,100,129, 74,131,131,118,145,229,174, 40, 36, 1,252,120,238,220,185,
+196,254,253,251,159,252,241,215,157,242,204,187,119, 79,243,116,170, 44,105,163, 8, 22,167, 78,216, 27,133, 37, 37,156, 17, 35,
+ 70, 4, 0, 24, 82, 93, 37,166,209,104,144,157,157, 93, 94,128,225,198,141, 27,143, 29,235, 86,225, 72, 18, 52, 77, 99,199,142,
+ 29, 16, 10,133, 16,137, 68,101, 22,135,200,170,225, 68,133,155, 0,208,175, 95, 63,168,213,106,136,197, 98,183,203, 85, 94,188,
+ 48, 12, 3,147,201, 4,147,201, 4,179,217, 76, 3, 96,179, 88, 44,140, 79, 79,119, 90,121, 60, 17, 48,229,209,162, 69, 11,230,
+212,169, 83, 56,121,242, 36,244,122, 61, 86,172, 88, 1,165, 82,249, 34,128,207, 61,229,114,113,210,167,117, 58, 29, 91,167,211,
+ 57,173,131,108, 54,219,105, 61,112,211,146,199, 97,177, 88,206,222,168, 99,113,181,106, 81, 20,133,192,192, 64, 4, 5, 5, 97,
+205,154, 53,156,122,245,234, 13,252, 39,107,160, 37, 75,150, 52, 90,190,124,249,250,141, 27, 55, 30, 28, 53,106,212,111, 87,175,
+ 94, 29,231,227,227,115,229,216,177, 99,243,121, 60,158,173,134,239,119, 72,102,102,166,194,117,147,205,102, 19, 90,173, 86,167,
+176, 45, 46, 46,118,187,131,193,102,179, 67,146,147,147,133, 0, 48,127,254,124, 54, 0,161,195, 25,220,193, 89, 92, 92,204,110,
+214,172, 89,136,187,207,122,124,124,124,183, 62,125,250,156, 58,124,248,176,111, 88, 88, 24, 50, 50, 50,144,145,145,129, 70,141,
+ 26, 97,225,194,133,122,157, 78,215, 5,192,205,162,162,162,221,110,114, 6,251,250,250,178, 83, 83, 83, 97,181, 90,209,186,117,
+107,172, 90,181, 10, 35, 70,140, 64,243,230,205,161,211,233,144,156,156,140, 13, 27, 54,248,114, 56,156, 42,235, 14,131,193,176,
+ 59, 54, 54, 54,180,188, 69,107,244,232,209,162,156,156, 28,231, 51, 25, 19, 19, 83,102, 8,209,147, 58,217, 62,180, 85,233, 82,
+ 19, 88,173, 86, 41,159,207,215,241,120, 60,174,195, 63, 43, 46, 46,206, 99,107, 86,185, 14,160, 39,235,255, 24, 28,162,181,130,
+182, 21, 65, 65, 65,110,243,240,120, 60,194, 81, 55, 90,173, 86,104,181, 90, 90,169, 84, 58,135,247,147,146,146,232,240,240,112,
+154,162, 40,138,203,229,130, 32, 8, 8,133,194, 74, 43,124,134,102, 98, 94, 29,241,121,153, 89,135,211, 62, 1,204,102, 51,146,
+146,146, 96, 54,155, 17, 23, 23,103,249,250,235,175, 51, 53, 26,205, 52, 0,172, 63,254,248, 99,204,172, 89,179, 40,133, 66,209,
+ 39, 55, 55, 23,213,105,145,231, 72,108, 61,102,229,114,180, 66,199, 7, 14, 28, 72,216,167, 86, 18, 14,225,228,137,208,178,191,
+124,213,182,188, 4, 65, 32, 43, 43,203,185,174, 80, 40, 60,254, 47,119,225,231,231,167,239,212,169,147, 68,165, 82,237, 94,178,
+100, 73,141, 44, 89,107, 22,199,172, 92, 52,239, 75,185,250,250, 25,164,103,102, 65,157,107, 73, 76,184,114,127, 23,128, 93, 0,
+128,181, 47, 28, 39, 38,165,124,239, 46,103, 83,127, 65, 43, 54,135,181,235,165,254, 3, 67,135, 71, 79, 39,223,121,231,157,174,
+ 99,198,140,209,142, 26, 53,106,170, 88, 44,110,108, 54,155, 11,118,238,223,255, 96,248,240,225,245,104,154, 30,131,106, 98,142,
+ 24, 12,134,135, 61,123,246,116,189,158,210, 35, 71,142, 4, 62,120,240, 0, 83,166, 76,201,203,200,200,208,184, 30,235, 78, 25,
+205,102,243,195, 86,173, 90, 85, 58, 92,232, 24, 82, 4,128,194,194,194,135, 30, 92,210,145,176, 59,190,231,231,231,227,198,141,
+ 27, 96,177, 88,232,216,177, 35, 18, 18, 18,208,181,107,215, 36, 79,172, 90, 37, 37, 37, 8, 11, 11, 67, 73, 73, 9,244,122,125,
+ 49, 0,222,166,122,245, 0, 0,239,230,231,227,194,215, 95,227,204,162, 69,112,125,158,221, 69,203,150, 45,153, 51,103,206,224,
+202,149, 43, 48, 26,141,152, 48, 97, 2, 0, 16,246,103,215,147,144, 25, 13, 40,138,234,215,191,127,255, 96, 0,208,235,245,196,
+185,115,231,192,231,243,157,239,194,222,189,123,145,145,145, 1,130, 32,224,235,235, 27, 82, 80, 80, 80, 15,192,253, 42,204,254,
+196,253,251,247,241,213, 87, 95,193,102,179, 97,214,172, 89,136,136,136,112, 10,172,135, 15, 31, 98,254,252,249,160,105, 26, 95,
+126,249, 37, 26, 53,106, 4,139,197,194, 71, 13, 67,104,212, 6,102,204,152,113,103,215,174, 93, 7,211,210,210, 94, 89,188,120,
+113, 15,130, 32,108, 51,103,206,252, 74, 42,149,210, 79,194, 91,160, 45,196,141,219, 15,157, 66,168,252, 18,224, 47,247,152,239,
+214,221, 52,231,239,105,218,149,143,134,159,220,215,211, 34, 22, 91, 44, 22,253, 27,111,188, 33,219,177, 99, 7,209,168, 81, 35,
+220,187,119,207, 97, 25, 42,134,231, 33, 29, 50,212,106,117, 4, 69, 81,156,219,183,111, 35, 60, 60, 28, 29, 58,116,192,130, 5,
+ 11,160, 82,169, 96,181, 90,161, 80, 40,108, 22,139, 37,201,108, 54,159,168,134, 43,102,226,196,137, 28, 0,147,236,150,173, 22,
+211,166, 77,179, 45, 93,186, 20, 73, 73, 73, 78, 11,150,171, 51,188,167, 67,135,174, 86, 39,215, 37, 46, 46,110, 22,151,203,101,
+ 0,156,133,231,129,158, 77,229, 45, 90, 53,177,102, 61, 45, 60,205,153,140, 74,165, 50, 78, 34,145, 12, 44, 40, 40, 40, 99,213,
+234,210,165,139, 57, 48, 48, 48,222, 93, 30,177, 88, 92, 64, 81,148, 31, 0,100,100,100, 64, 36, 18,113,238,222,189,187, 8,165,
+193,179, 81,175, 94,189, 69,106,181,154, 83,207, 94,159, 6, 5, 5,193,100, 50, 85,234,198,114,250, 98,206, 79, 0,126,114,172,
+203,229,242, 44,173, 86, 43, 88,186,116,105,209,162, 69,139, 12, 52, 77, 27, 1, 28,211,104, 52,206, 56, 90,217,217,217, 90, 54,
+155, 45,151,201,100,117, 28, 66,171, 34, 45,242,156,161,114,139,150, 93, 73, 50,229, 5, 17, 65, 16,143, 57,168, 87, 35,180,170,
+ 21, 89, 52, 77,151,177, 50, 56, 28,222, 43,250, 47,123,163, 94,163,161, 67,187,200,226,239,220,185,115,211,146, 37, 75,206,186,
+251, 59, 87, 31,173,181,223,204, 91,236, 16, 89,151, 79, 30,198,238, 20,173,106,214,162,101,203,107,122, 7, 94,240, 23,182, 12,
+ 12,244, 59,254,245,194, 24,233,157, 67, 27,240,219,218,255, 49,151,207,159,111,127,254,252,249,183,166, 76,153, 82,215,254, 96,
+169, 1, 92, 2, 48, 28,110,204,210,201,200,200,232, 91,174, 17,190,201,225,112, 2,133, 66, 33, 50, 50, 50,138,110,221,186,229,
+241,144,140, 74,165,234,251, 20, 30, 64,150, 67,100,169, 84, 42, 36, 39, 39,163, 87,175, 94, 0,128,132,132, 4,116,233,210, 5,
+137,137,137,104,211,166, 77, 18,128,118,168, 38, 80,171,197, 98,209,188,240,194, 11, 78,235,150, 86,171,181, 1, 64,116, 86, 22,
+ 98,149, 74,176, 88, 44,156, 89,180, 8,179, 45, 22, 44,240, 80,192,183,106,213,138, 57,119,238, 28, 30, 60,120, 0,171,213,138,
+ 65,131, 6,161,134, 47,125,243,166, 77,155, 30, 57,118,236, 88,128, 88, 44,134, 94,175, 71, 81, 81, 17,198,142, 29,139, 17, 35,
+ 70,192,104, 52, 98,219,182,109,216,179,103, 15, 36, 18, 9,244,122, 61,244,122,189,239,128, 1, 3, 78,221,188,121,179, 59,128,
+219,149, 8, 45,166,111,223,190,136,143,143, 7, 69, 81,104,223,190, 61,242,243, 31, 77, 6, 10, 12, 12,172,104, 31,245, 79, 10,
+ 45, 22,139,197,196,197,197, 45,238,209,163, 7,210,210,210, 94,105,211,166,205,138,113,227,198,101, 60, 41,175,175,143, 4,173,
+154, 53,128,209,104,132,209,104, 68,112,112, 48, 10, 11, 11,113,231,206, 29, 24,141, 70, 4, 42,100, 30,243, 69, 53,111,228,228,
+ 83, 40, 20,208,235,245,184,127,255, 62, 76, 38, 19,252,253, 61, 18, 90,161,125,251,246,253,107,203,150, 45,126, 27, 54,108, 48,
+245,236,217,147,187, 98,197, 10, 66, 42,149,194,165, 97,241, 20,113, 9, 9, 9, 97,125,250,244,105,114,253,250,117,196,197,197,
+193,100, 50, 33, 42, 42, 10,183,110,221, 66,167, 78,157, 80, 84, 84,116,246,252,249,243,123,220, 49, 12, 3,248,108,226,196,137,
+112,136,173,248,248,120,100,101,101, 65, 34,145, 60, 38,180, 28,190,143,246, 89,227,193,238, 20,214, 33,136, 92, 44, 79,179,101,
+ 50,153, 25,192,242, 26, 90,159, 0, 0,105,105,105,188, 22, 45, 90, 24,249,124, 62,215, 46,218,150, 61, 9, 95,109,162, 22,102,
+ 50, 86,138,160,160,160,105,254,254,254,125,234,215,175,143,156,156, 28, 14,151,203, 69,151, 46, 93,204,237,218,181, 51, 7, 5,
+ 5,189,235, 46, 15,143,199,187,206,225,112,186,151,118, 38,104,164,166,166,130, 97,152, 89,205,155, 55,127,191,176,176, 16,249,
+249,249, 92,169, 84,234,236, 84, 55,105,210, 4, 70,163,241,186, 7,150,183,152,240,240,240,207, 56, 28,206, 2,149, 74, 85, 81,
+ 88, 8,174, 76, 38,147,114, 56, 28,152,205,230, 50, 98,179,188, 22,121,222, 69, 86, 25,161,229,162, 34,203, 8, 29, 79, 44, 90,
+238, 88, 13, 28, 14,246,174,235, 14, 81, 87,254,191,106, 26, 67,203,199,199,199,232, 16, 89, 11, 22, 44, 56, 91, 19,142,237, 91,
+ 54, 43,125,108,197,161,153,103, 15,224,230,149, 68,236, 74,214,168,102, 45, 90, 54,245,213, 33, 35,115,202, 11, 51,119, 16, 17,
+ 32,108, 30,168,240, 59,254,205,146, 69, 82,245,245, 51,200,202,206,198,129,179,231, 19,205, 64, 50,128, 89,181,105, 90, 6, 74,
+135, 14, 41,138,122,150, 30, 88,167, 51,124, 86, 86,150, 67,100, 69, 1, 64,215,174, 93,147,236, 34, 11,238, 90,180, 52, 26, 77,
+249,148, 53,125, 0,248, 59,206,159,197, 98,161,203,103,159,121, 44,178, 0, 48,137,137,137, 80,171,213,142,158, 98, 77, 69, 22,
+130,130,130, 62, 60,118,236, 88,192,143, 63,254,168,219,184,113, 99,190,205,102, 99,183,106,213, 42,164,109,219,182,196,166, 77,
+155, 0, 0,195,135, 15,199,172, 89,179,112,237,218, 53,136, 68, 34,116,237,218,149,158, 51,103,142, 98,218,180,105,239,230,228,
+228, 76,173,176,117,180,217, 56,124, 62,255, 40,128, 23,175, 95,191, 14, 0,167, 80,154,194,201, 97, 69,168,116,159, 59,141,111,
+ 97, 97, 33, 91, 34,145, 84, 24, 26,130, 83,218, 27,242,212, 2,225,228, 60,121,242,228, 87,223,124,243,205,174, 15, 62,248,224,
+246, 19,114, 86,104,209, 26, 56,112, 32, 12, 70, 51,210,115,180,160,105, 43, 12,230, 92,143,249, 92, 45, 90, 3, 7, 14, 68,113,
+137, 9,169, 89,106, 88,173, 52, 10, 13,110,183,229,194,151, 94,122,233,143, 95,126,249, 37,232,244,233,211,160,105,218,118,235,
+214,173,251,111,188,241,134,116,230,204,153,126, 79, 48,201,232,187,145, 35, 71, 14, 61,121,242,164,186, 73,147, 38,242,179,103,
+207, 34, 55, 55, 23, 86,171, 21, 47,190,248, 34,184, 92,110,234,162, 69,139, 56, 0,190,115,247,222,216,197,150,249,252,249,243,
+111,159, 57,115, 70, 46,151,203,185,182,166, 77,145,117,248, 48,118,236,216,241,216, 15,214,174, 93, 11,184, 25,133,223, 97,113,
+ 58,119,238, 92,173, 8,172, 50, 45, 53,151, 91,227,225,199,231, 21,231,206,157,203,120,231,157,119,154, 73,165,210,229,221,186,
+117,235,229,231,231, 71,250,250,250,198,213,169, 83,231,253, 86,173, 90,185, 61,186,192,102,179,199,137, 68,162, 59, 86,171,149,
+ 42, 42, 42,130, 94,175, 47,173,164,173, 86, 46, 73,146,168, 87,175,158,179, 45,105,223,190, 61,130,130,130,232,148,148,148,113,
+238,242,231,229,229,149,153,133, 88, 1, 38,118,233,210,133,101, 52, 26,241,224,193,131, 4,215, 29, 21,105,145,231, 4,209, 85,
+138, 47,199, 73,185,158, 92,157, 58,117,210, 44, 22, 11,147, 12, 48,151, 46, 93, 98,162,163,163,171, 92, 74, 74, 74, 24,133, 66,
+145, 85, 65,227, 7, 87, 78,163,209, 88,230,119, 70,163,145, 9, 12, 12,164, 13, 6,195, 99,156, 6,131,129, 9, 9, 9,201,168,
+138,179, 2,140,189,120,241,226,234,217,179,103,119,240,224, 2, 57, 57,153, 53, 77,153, 13, 27, 54,252,135, 97,152, 30,221,154,
+133, 93, 25,214, 42,144,233, 18,161,200,220,179,125,203, 8,134, 97,122,148, 95, 28, 1, 78,171,226,108, 26, 40,122,161,119,100,
+221,130,203,135,182, 50,199,150,190,199,124, 51, 40,130,105, 19, 34,209, 52,245, 23,120,154, 35,166,218,108,233,145,145,145, 55,
+109, 54, 27, 99, 50,153,152,200,200,200, 91,181,193, 89, 3, 84,197,217, 26,165,190,108, 35, 43,216,214,250, 9,202,121,153, 97,
+ 24, 70,173, 86, 51, 69, 69, 69,140,209,104,100,104,154,102, 92, 1,224,178, 27,156,140,217,108,102, 10, 10, 10, 24,184,239,115,
+ 87, 33,167, 82,169,188,127,247,238, 93,166, 97,195,134,105,118,115,252, 52,189, 94,207,148,135, 94,175,103,122,245,234,197,220,
+186,117,139, 9, 15, 15, 47,185,117,235, 22,163, 84, 42,111, 84, 83,206,250,161,161,161, 71,253,253,253,227, 0, 68,120,176,175,
+202,235,185,109,219,182, 6, 12,195, 76, 96, 24, 38,186,146,101, 2,195, 48, 77,255,105, 78,251,245,205, 97, 24,134, 41, 46, 46,
+102,212,106, 53,147,153,153,201, 20, 23, 23, 51, 69, 69, 69,204,197,139, 23,153,211,167, 79, 51, 87,174, 92, 97,228,114,121,142,
+ 59,156, 14, 62,147,201,196,232,116, 58, 38, 55, 55,151, 49, 24, 12,140, 94,175,103,174, 94,189,202, 92,184,112,129,185,126,253,
+122, 69,124,143,113,250,249,249,173,205,206,206, 46, 58,117,234, 84,241,154, 53,107,138,131,130,130,174, 3, 8, 3,208,216,215,
+215, 55,251,189,247,222, 99,196, 98,241,195, 26,190, 71,205,216,108,246,197,197,139, 23,159,219,183,111, 95,206,158, 61,123, 76,
+235,215,175, 79,159, 50,101,202, 9, 22,139,117, 17, 64,179, 26,190, 71, 10,153, 76,118,234,236,217,179,214,130,130, 2, 70,163,
+209, 48, 58,157,142,209,235,245,140,193, 96, 96, 76, 38, 19, 99,177, 88,152, 19, 39, 78, 48,129,129,129,174,195,146, 31, 85,209,
+177,158,206, 48,204,135, 12,195,176,106,187,174,115,225,238, 86, 91,156,181, 81,215,145, 36,105,182,215, 29, 29, 75, 87,171, 94,
+255,167,202,217,187,119,239, 47, 71,140, 24,193,244,235,215,143,137,138,138,122,108,105,211,166, 13, 51,121,242,100,102,223,190,
+125,204,215, 95,127,253,101, 45,148,147,133,210, 73, 47, 11,123,247,238,109,137,143,143,103,134, 15, 31,206, 0,232, 91,149, 22,
+249, 55, 8, 46, 71,120, 7,194,245, 19, 0,204,102,115,218,205,155, 55,149, 77,172, 86, 10, 0,190,255,254,251,199, 44, 83,174,
+136,143,143,183, 18, 4,113,167,170,127, 55,155,205,105,199,142, 29, 11, 92,185,114, 37,219,197, 4, 12,171,213,106,203,204,204,
+ 36, 87,172, 88, 81,230,248,227,199,143, 91,173, 86,107,170,135, 39,185,161,117,235,214, 27,106,227,106,157,184,246,224,253, 63,
+ 14,252,238,223,177, 67, 55,141, 84, 46,175,176, 23,182,237,221,166, 32, 38, 85,109,213, 34, 88,228,130,197, 11, 99,100,142, 33,
+200, 95,147,178, 53, 37, 70,186, 87,138,202,112,185,182,239,112, 81, 81,209, 3,199, 76, 64,189, 94,159,250, 12, 62,132, 23, 81,
+ 26,227,202, 90,110, 91, 59, 60,161,211,169,205,102,131,143,143,143,211, 26, 90, 3,139, 40,227,176,176, 58,110,221,147,148,135,
+ 97,152,147, 87,175, 94, 13, 31, 59,118,172,100,227,198,141,119,105,154,102,143, 31, 63,222, 28, 20, 20,196, 73, 72, 72,176, 0,
+ 32,122,244,232,193,202,206,206,102, 50, 50, 50,212,175,189,246, 90,225,219,111,191,237,119,233,210, 37,174,205,102,171, 46,104,
+225,189,180,180,180,222, 53,216, 87, 37,134, 13, 27,118, 23, 79,158,198,230,169,115, 58,160,214,232,112,247, 65,134, 61,130,185,
+ 13,244,195, 28,167, 95,149,197, 98,133, 90,151,239,177, 69,235,206,253, 12,123,138, 49, 26, 52,157,105,231, 43,117,136,103, 10,
+138,171,111, 77, 88,172,174,115,230,204,233, 79,146, 36,121,230,204, 25,227,146, 37, 75,210,242,242,242, 6, 1, 72, 5,128,130,
+130,130,158, 27, 54,108,248,217,141, 80, 14,149, 33,217, 98,177,116,250,232,163,143,166, 2,232, 10,160,174,157, 59,193,110,201,
+170,105, 4,243, 92,141, 70,243,114,255,254,253, 15, 83, 20, 85,207,229, 61,242, 7,160,114,188, 23, 12,195, 40,114,114,114, 94,
+113,135,144, 32,136,101, 79,171, 34,121,154,220, 79, 88, 15, 61, 23, 51, 25,143, 30, 61, 58,119,208,160, 65,172,176,176,176, 79,
+195,194,194,200,130,130, 2, 20, 21, 21,129, 36, 73, 4, 5, 5, 33, 50, 50, 18, 65, 65, 65,182,235,215,175, 47,252,248,227,143,
+171,141,201,247,194, 11, 47, 52,176, 88, 44, 13, 73,146,108, 0,160, 1,195, 48, 13, 8,130,104, 0, 64, 14, 0, 82,169, 84, 26,
+ 30, 30,206,234,216,177, 35, 58,116,232,128,227,199,143, 99,251,246,237, 63, 1,248,195,213,154, 85, 94,139, 60, 11, 72,110, 13,
+166,217, 69, 16,215,218,160, 7, 97,195,113,134, 68,207,200, 68,103,156,189,242, 34,171,242,164,210, 21,152,254,250,190,248,226,
+139,206, 23,206,141, 70,229, 65,117, 47, 95, 94, 94, 94,223,113,227,198,149,225,164,105,218,152,159,159,255, 78,231,206,157, 87,
+ 81, 20,197, 43,247,192, 62,204,205,205,253, 91,115,245,149,143,163,213,183,255,235,170, 39,229, 20,115,200,134, 55,247,255,128,
+156, 92, 21,126, 77,202, 46, 40, 52,209, 61,111,169,138,175, 62,141,242, 63,124,248,176,223,115,160,248, 43, 18,173, 79,154, 60,
+ 59,207,141,128,164,213,229,168, 35,236,225, 68,106,229, 37,207,206,206, 94,250,217,103,159,189,188,112,225,194,128,131, 7, 15,
+ 74, 29, 29,148,193,131, 7,231, 94,189,122,181, 27, 0, 94, 73, 73,201,145,133, 11, 23, 6,196,196,196,248, 1,240, 3,128, 1,
+ 3, 6,228,228,228,228,172,132, 23, 85,194, 98,177,164, 71,190,208,196,217,241,115, 13,233,224,250,221,106,181,166,123,194, 87,
+ 17,143,235, 58, 77,211, 85,242, 81, 20,245, 65,135, 14, 29,168, 15, 62,248, 32,231,224,193,131,142, 68,186,174, 10,237,102, 53,
+ 65, 73,221,129, 17,192, 18,251, 82,155,208,171,213,234, 78, 30,254,134,246, 62,141, 21,118, 40, 61, 89,255, 71,176,123,247,238,
+207,135, 15, 31,190, 65, 46,151,111,110,208,160, 65,147,192,192, 64,169, 64, 32,128,209,104, 44, 52,153, 76, 55,110,222,188, 57,
+234,243,207, 63,191,231,150,133, 99,195, 6, 10, 0,199,102,179,241, 73,146, 20, 1,144, 18, 4,225,235, 16, 90, 4, 65,192,108,
+ 54,227,193,131, 7,152, 61,123, 54,125,244,232,209,175, 1,124,233, 65,199,181, 29,128, 0,151,122, 60, 0,128, 9,165, 1,108,
+243, 8,130, 56,255,180,175, 23, 97,195,241,102, 23, 65, 36,183, 70, 69,237, 68,213, 73,165, 43,123,225,242,242,242, 58,213,246,
+ 75, 92, 25,103, 94, 94, 94,216,179,242,134,140, 49, 46,217,138,181, 75,202,228, 57,116,136,176,138,214,171,131,214, 96,157,242,
+221, 31,215,150, 26,173,140,205,108,181,253,247, 86, 94,113,178,183, 30,170,117,188, 84, 91,239, 82, 45,150,233,106, 74, 74, 74,
+231, 41, 83,166,124, 46, 20, 10,219, 3, 64,113,113,241,153,204,204,204,121,176,207, 42,172,110,191, 23,149, 67,165, 82,181,125,
+ 22,249, 76, 38,211,251,157, 59,119,254,150,166,233,111,172, 86,107,194,255,131, 91, 81,226,125, 26,159, 95,252,246,219,111,247,
+ 0,116, 2,128,161, 67,135, 82, 0,176,125,251,118,143,197,243,216,177, 99,105,134, 97,204,246,231, 65,143,210,217,133, 5,142,
+ 58, 85,175,215, 23,100,102,102, 94,167,105,250, 58,128,159,225,249,140,219, 0,130, 32,246, 49, 12, 51,208, 46,220,246, 49, 12,
+ 51,208,117,219,211,182,106, 85,115, 72,245,206,240, 94,148, 98,123, 50,136,242, 67,129,213,173, 87,135,155, 57,250, 56, 0,109,
+188, 87,247,255, 37,238,102,102,102,142,121,130,253, 94, 60,127, 72, 53,153, 76,131,254, 31,157,175,214,123,203,255, 37,237, 95,
+ 13, 4,150, 3,215,175, 95,127,106, 46, 2,255, 52,154, 93, 44,219, 1, 47,191,238,130,232,138,132,151, 87,104,121,225,133, 23,
+ 94,120,241, 36,208,120, 47,129, 23,255,102, 56,124,179, 28,235,149,248,104,149,247,207,114,174, 19,168,124,230,128, 39, 89,201,
+107, 50, 75,226,136,151,211,203,233,229,244,114,122, 57,255,113, 78, 25,128,112, 0,139,171, 57,174,252,236,194, 28, 0, 42, 0,
+ 22,239,245,244,114, 62,129,126,112, 11, 12,195, 12,168,106,232,144, 32,136,253, 79, 75,104, 57,157,225, 91, 99, 78,228, 69,204,
+113,172,187, 43,180,158, 54,250,120, 57,189,156, 94, 78, 47,167,151,211,203,233,229,244,114, 62,161,208,234,245,241,199, 31,127,
+130,210,208, 24,204,199, 31,127,252, 9,195, 48, 3, 74,119, 49, 3,158,230,127, 95,107,131, 30,201,173,193, 56,150,107,109,208,
+163,146, 67,163, 93, 22, 39,188, 67,135, 94,120,225,133, 23, 94,120,225,197,179,142, 83,139, 22, 45, 42, 94,180,104,145,195,241,
+ 61, 15, 0, 97,183,112,229, 61,205, 63,182, 15, 19,186, 51, 81,170,234, 20, 60,255, 0,130, 73, 22,103, 52,155,195,235, 5,198,
+ 22, 9, 0, 32,169,107,180,169,228, 47,171,213,188, 25, 64,102, 77,137,155, 2, 47, 52,146, 9,246, 24,105,154,147, 86,104, 26,
+154, 82,154,230,192, 99, 12, 5,186,240,184,220, 63,121, 50,153,160,162,253, 70,141,198, 96, 52,153, 94,222, 14,156,244,190, 3,
+ 94,120,225,133, 23, 94, 60, 39, 16,249,250,250, 30, 37, 73, 50,204,177,193, 53,238, 96,249, 24,132, 52, 77,103,169,213,234,151,
+ 81, 58, 84,252,119,114,186,254,222,132, 26,182,229,181, 13, 79,135, 14, 89, 64,153, 40,172,127, 75,198,108,138,205,123, 91,226,
+ 35, 91,240,159,113,239,251, 69, 52,110, 66,132,134,214, 1, 24, 32, 53, 45, 61,240,206,237, 91,189,127,219,248,221, 12,157, 86,
+ 61,219, 98, 52,254,224, 41,247, 11,128,168,174,152,151,240,195,199,111,202, 88,176, 98,228,252, 45,135,136, 34,115,232,245,210,
+233,166, 30,137, 44,153,159,223, 31,139,142, 28, 17,248,182,108, 89,102, 31,195, 48,165,249,245, 46, 95, 22,124,250,242,203,127,
+ 12, 85,171,251,122,197,214,191, 18, 65, 82,169,116, 26,155,205,238,105, 54,155,195,184, 92,110, 26, 77,211,113, 5, 5, 5,203,
+ 1,100,120, 47,207,191, 27, 77,130, 68,221,154, 52, 8,219,146,153,157,147,164, 43, 49,141,191,153, 89,164,246, 94, 21,143, 81,
+ 85,126,205,127, 44,247, 38, 0,136,197,226, 11, 36, 73,134,184,138, 0, 71,206, 94,199,122,249, 79,155,205,118, 79,173, 86,119,
+174,130,182,129, 92, 46, 95, 5,160, 93,117, 1,147,237,177,217,206,171,213,234,119, 80,249,108, 61,137,175,175,239, 92,130, 32,
+134,145, 36, 73, 85,119, 78, 54,155,141,102, 24,102, 91, 65, 65,193,151, 0, 10, 43, 59,206,215,215,247, 72, 74, 74, 74, 59,133,
+ 66, 81,173,149,198,106,181, 34, 53, 53, 53,160,125,251,246, 39,212,106,117,211,167,201,249,119,107,145,154,162,138, 89,135,149,
+ 62,232, 0,202,228, 23,122,170, 17, 89, 57,124,241,158, 78,221,251,246,154, 60,245, 3,209,197,171, 55,240,231,241,211,208,233,
+141,160, 72, 18, 50,137, 16,141, 27, 55, 36,150,197,238,240,255,105,205,178,111,206,196, 31, 30, 80,162,215,190,230,145, 76, 23,
+178,102,207,122,163,189,200, 79, 78, 3, 54, 26, 31,246,111, 37,250,116, 95,210,108, 20, 91, 63,241, 88,100, 29, 61, 42,204,205,
+201, 65, 76,112, 48, 88, 86, 43,248, 36, 9, 62, 65,128, 79,146, 16,241,249,232,183,126, 61,230, 29, 60, 40,252,252,149, 87,188,
+ 98,235, 95, 6,177, 88, 60, 46, 56, 56,120,201,186,117,235,252,234,215,175, 15,145, 72, 4,181, 90,237,127,243,230,205,214,211,
+167, 79, 31,147,149,149,245,153, 78,167, 91,235,189, 82,255, 94,216,108, 24,253,227,130,119,234,100, 61,188, 93,103,226,194,173,
+141, 9, 63,186,231,141,124, 67,182,247,202,184,141,214, 0,146, 80,113,254,210,170,246, 85, 10, 62,159,159, 83, 82, 82,162,168,
+234, 24, 46,151,155,107, 50,153, 2,171,227, 34, 73, 50, 36, 35, 35, 67, 33, 20, 10, 65,211,180, 61, 27,128,205,217,145,118,205,
+126, 98, 15, 84,139,166, 77,155,154,171,226,148, 72, 36,223,231,230,230,246,113,228, 9,116, 17, 84, 21, 34, 35, 35,163, 79,179,
+102,205,190, 47, 44, 44,124,185, 18,241, 50,119,234,212,169,211,154, 55,111,238,176, 2,217,179, 32,148,126,170, 84, 42, 76,153,
+ 50,197,249, 31, 54,155, 13,135, 15, 31,158, 58,110,220, 56, 20, 20, 20, 76,175,226,220,195, 20, 10, 5, 97, 79, 40, 94, 41,230,
+204,153,131, 57,115,230,224,187,239,190, 35,216,108,182,172,154,235, 89, 43,156,127,151, 22,169,137, 5,171,154,200,240,251, 81,
+214, 55,107,255, 99, 66,235,239, 0,197,230,253,183, 93,231, 62, 61,167, 76,155, 37,218,250,251, 49,220,188,126, 25, 41, 9,191,
+148, 57,166,237,203,227,144,173, 42,196,184,201, 31,138, 9,138,213, 51,254,200,238,255, 90,140,134, 31,221,180,102, 5,134,241,
+184,239,117,108, 31,201,206, 16,220, 68,144,175, 0, 93,219, 52, 98,135,254,113,229, 61, 61,172,223, 94, 47,157, 37,227,145,200,
+ 90,247,230,155,232,102,177, 64, 65, 81,160, 8, 2, 20, 0,146, 32, 80, 98, 52,226,252,232,209,104,191,105, 19,190,220,187, 87,
+ 56,247,213, 87, 61, 18, 91, 34,145,232, 34, 65, 16,190, 69, 69, 69, 3, 80,154, 88,250,121, 64, 51,177, 88,188,159, 97,152, 2,
+189, 94,223,250, 25, 42,151, 18,165, 99,244,229,123,199, 28,148,206,168,242, 40,179, 48,143,199,123,123,232,208,161,203, 86,174,
+ 92, 41,204,201,201, 65,102,102, 38,104,154, 6,159,207, 71, 68, 68, 4,113,228,200, 17,191, 89,179,102, 45,221,191,127, 63,175,
+176,176,240, 91, 79, 58, 54,108, 54, 59, 86, 46,151,191, 18, 24, 24, 40,202,205,205, 45,214,104, 52,135,141, 70,227,219,168,121,
+218, 20,146,205,102,143, 10, 15, 15,127, 61, 56, 56, 56, 48, 35, 35, 67,149,158,158,190,199,104, 52,254,132, 26, 38,106,118,185,
+166, 45, 97,143, 86, 15, 32, 43, 60, 60,252,218,131, 7, 15,114,107,145, 51, 51, 60, 60, 60,185, 6,156, 34, 0,191, 1, 8,174,
+230,184, 76, 0,195,225,161, 53,219,121, 97, 25,219,129,249,203,215,141,143, 25,219,149,248,113,122,159,136, 73,223, 29, 57, 77,
+114,152,238,215,179, 74,210,188, 26,202, 61,145,101, 79,105, 85, 94, 80, 85,181,175, 74, 24,141,198, 0,179,217, 12,118, 37,201,
+226,245,122, 61, 36, 18, 73,128,187,133, 20, 8, 4,248,229,151, 95,192,102,179,193,102,179, 81, 80, 80,128,144,144, 16,231, 58,
+135,195,113,126,175, 91,183,110,181,124, 52, 77,183,167, 40, 10, 69, 69, 69,160,105,218,185,104, 52, 26, 48, 12, 3, 30,143, 7,
+154, 46, 77,231,228,178,191,125,101,124, 4, 65, 12, 11, 14, 14,198,214,173, 91, 97, 50,153, 30,219, 47,149, 74,113,245,234,163,
+ 36, 35, 20, 69,161, 67,135, 14, 36, 65, 16,195, 0, 76,175,130,151, 1,128,232,232,104, 80, 20, 5,138,162, 64,146,164,243,187,
+ 99,161,105, 26,115,230,204, 65,185,212,100,127, 27,231,179,134,106, 34,195,103,161, 18, 31, 45,242, 41,151,203,117,138,103,176,
+ 80, 36,253,234,157,247, 63, 20,239, 63,113, 5,169,105,169,143,137, 44, 0,184,240,231, 79,200,202,204, 64, 82, 74, 58, 70,253,
+247, 93,177, 84, 42,251,170, 92,133, 90,233,180, 81, 31, 9,231,235,143,135,119,229, 23, 89, 50, 81,232, 11, 80, 13,184, 96, 11,
+245,152, 53,176, 37, 79, 42,225, 44,113,167,156, 60, 46,247,207, 69, 71,142, 56, 69, 86, 23,163, 17, 60,154,134,149,166,157, 34,
+203,100,181,194, 96, 50, 65, 89, 84,132, 59,227,198,129,177, 88,240,217,174, 93, 66, 30,151,251,167, 59,229, 4, 0, 14,135,163,
+220,179,103, 79,221, 22, 45, 90, 28,135,251,193, 76,143, 60,229,123, 84, 21,218,180,106,213, 42,110,211,166, 77,117, 57, 28,142,
+178, 54, 56,249,124,254, 16,145, 72,148,199,231,243,135,212,176,156, 36,128,249,227,199,143, 79,108,216,176,225, 49,187,176,114,
+138,154,134, 13, 27, 30, 25, 63,126,252, 69, 0,115, 42,121,214, 43,226,172, 19, 28, 28,188, 96,229,202,149,194, 91,183,110, 33,
+ 35, 35, 3, 22,139, 5, 35, 71,142, 4, 77,211, 48, 24, 12, 48,153, 76, 88,188,120,177,200,207,207,111, 54, 74, 19, 5,187,115,
+238, 28, 31, 31,159, 91, 27, 55,110, 28,122,255,254,125,241,177, 99,199,136,171, 87,175,138,150, 46, 93, 58,200,207,207,239, 38,
+ 0, 94, 13,174, 39,169, 84, 42,127,220,189,123,247, 59, 87,175, 94, 13,217,185,115, 39,251,204,153, 51,202, 53,107,214, 76, 80,
+ 42,149,155, 0, 80, 53,188, 71,173,133, 66, 97,239,153, 51,103,218, 78,157, 58,149,113,234,212,169,140,101,203,150,161, 91,183,
+110, 93, 98, 98, 98,162,106,200,217, 70, 34,145,188, 56,115,230, 76, 91,124,124,124,230,217,179,103,211,151, 46, 93, 74,190,248,
+226,139, 93, 23, 44, 88,208,210, 67,206,223, 78,157, 58,213, 35, 45, 45,173,126,122,122,122,189,244,244,199,134,205, 2, 0, 0,
+ 27,138, 73, 68, 65, 84,244,240,244,244,244,240,140,140,140,176,172,172,172,186,217,217,217,161,185,185,185,161,113,113,113, 93,
+ 1,108,113,135,179, 73,160,232,157,233, 35,251, 20,207,254,111,127,230,147,183, 94, 98,102,141,236,193,188,210,189,197,239, 20,
+139, 69,156, 77, 78, 69,136, 15,240,211,148,118, 97,161,254,162,171,145,114,113,227,103,236,221,124,214, 56, 89, 14, 33,165, 86,
+171,177,127,255,126,216,173, 87,173, 93, 69,150, 78,167, 67, 86, 86,150, 99, 31,203,157,114, 74,165,210,163,235,214,173, 99, 74,
+ 74, 74,160,213,106,145,155,155,139,180,180, 52,220,185,115, 7,249,249,249,184,113,227, 6,132, 66,225, 81,119,202, 73, 16, 4,
+104,154,118, 10,169,195,135, 15, 99,252,248,241, 80,171,213,206,109, 44, 22,203,249,221,241,155,234, 56, 29,150, 39,154,166,113,
+246,236, 89, 76,156, 56, 17,203,150, 45,195,150, 45, 91,176,111,223, 62,168,213,106,167,216,178, 90,173,213,114,170, 84, 42,216,
+108,238,245,153, 24,134,129, 86,171,117,251,190,187, 10, 32, 22,139,245,152, 40,114, 44,158, 60, 75, 79,200,249,204,194,141,200,
+240,149,247,176, 29, 95,236,166,186,158, 79,171,144, 36,139, 51,106,216,216,169,126,233,185, 58,100,228,104, 65,145,143,218,189,
+168, 62, 99,193,162, 72,156,251,163,212,112, 69, 82, 20,180,122, 35, 52, 69,102, 12, 29, 59, 77,254,195,178, 47, 70, 89,205, 37,
+ 85,198,120,105, 14, 68, 68,138,197,111, 52,107, 86,151,188,206, 75, 65,212, 43, 9,160,109, 0, 19,255, 42, 90, 23, 40,168,166,
+127,114,223,208, 23,154, 23, 92, 5,110, 85,105,205,144,201, 4,190, 45, 91, 34, 38, 56, 24,221, 45, 22,112, 24, 6, 47,229,228,
+224,242,180,105, 48,238,216, 1, 18, 0,103,200, 16,244, 90,190, 28, 39,130,131, 17,100, 48, 64, 51, 99, 6, 2, 14, 29, 2, 71,
+ 42, 21, 32,207,189,201, 15, 4, 65,160,103,207,158, 56,114,228,136, 95,191,126,253,254,184,114,229,202, 96,171,213,122,162, 38,
+215,214,199,199,231, 2,139,197, 10,169,238, 56,171,213,154,174,213,106, 61, 78, 51,194, 98,177,186,119,232,208, 97,215,206,157,
+ 59,125,205,102,115,173,244, 66,184, 92,110,191, 65,131, 6,173, 91,189,122,181,116,194,132, 9,235,246,237,219, 87,108, 50,153,
+ 14,121,242, 72, 1,152,191,118,237,218, 73,209,209,209,178, 9, 19, 38, 48,119,238,220,113,181, 94, 5,116,235,214,173,225,186,
+117,235,130,218,181,107, 55,117,226,196,137, 28, 0,159, 85,103,229, 17,139,197,147,215,173, 91,231,175, 82,169, 80, 84, 84,228,
+172,100,211,211,211, 33, 16, 8, 64,146, 36, 72,146, 4,155,205,198, 87, 95,125,229, 55,121,242,228,105,106,181,122,154, 27, 86,
+178,216, 85,171, 86, 5,188,252,242,203,228,253,251,247, 65,146, 36,248,124, 62,222,124,243, 77,210, 96, 48,248,198,196,196,108,
+208,235,245, 35, 60,185,134,108, 54,123, 84,108,108,108,227, 46, 93,186,176, 82, 82, 82,208,169, 83, 39,156, 59,119, 14, 67,134,
+ 12, 97, 23, 22, 22,214,155, 53,107,214,120,163,209,232,105, 28, 23,165, 80, 40,108,254,215, 95,127,165,133,134,134, 58, 43,150,
+122,245,234,209, 3, 6, 12, 80,167,164,164, 52, 57,117,234, 84,126,231,206,157, 61, 73, 88, 94, 71, 40, 20, 54, 61,112,224, 64,
+ 86, 76, 76, 76,239,181,107,215, 14, 2,128,246,237,219,239,153, 55,111,222, 49,181, 90, 29,121,226,196, 9,117,247,238,221,211,
+221,228, 11, 86, 42,149,244,148, 41, 83,196, 85, 29,180,126,253,122, 13, 74, 19, 46,215, 7, 80,101,190,182, 38,225, 65,179,151,
+ 76, 27, 38, 0,109, 6, 99, 49, 0,230, 98,192, 92, 4,155,169, 24, 4, 71, 0, 88, 12, 8,224,169,241,219,228, 38,210,143,182,
+222,189, 78,223, 32, 6,164,168, 10, 15,193,139, 10,171, 26, 0, 81, 4, 65, 36,237,223,191, 31, 29, 58,116,192,254,253,251, 49,
+ 96,192,128, 36, 87, 49,112,245,234, 85,116,239,222, 29,118,139,150, 91,190, 90, 90,173,246,227, 57,115,230,196,143, 26, 53, 74,
+ 88,166, 50, 32, 73,200,100, 50,244,239,223,191, 68,175,215,127,236,110, 65,105,154, 6,139,197, 66,122,122, 58,214,175, 95,143,
+133, 11, 23, 34, 34, 34, 2, 22,139,229, 49,177,101,175,247,220,170,252,172, 86, 43,206,159, 63,143,205,155, 54,225,179,217,179,
+ 33,145, 72, 0, 0,102,179, 25,234,130, 2,240,249,124,167, 24,171, 70, 56,109,187,125,251,246,180,144,144,144, 50, 67,134,142,
+ 79,123,157, 5,155,205, 6,171,213,138,146,146, 18, 44, 91,182,204,202, 48,204,182,234,218, 31,135, 40,154, 54,109, 26,140,198,
+ 71, 6,245,150,118,159,228,240,240,112,180,106,213,202,185, 78,146, 36,227, 46,231, 15,157,155,195,224,114,116,147, 57, 75, 1,
+ 0, 33, 33, 33,104,210,164, 9,148, 74,101,165,156, 79, 91,139,212, 4, 30, 68,134,175, 92,104,253, 29,153,178,217, 28,126,175,
+ 6,141, 26, 19,169, 89,106,176, 88, 44,136,124,252,209,249,245,233,160, 40, 18, 98,153, 63, 8,218,240, 72, 17,147, 20, 88, 20,
+ 11,234, 66, 3,194,235, 55, 34,121,124, 65, 47,125, 53, 66, 75,234,195, 94, 53,115, 68,103,126,190, 53, 29,130,186,124,208,142,
+230, 52,152, 11,210,175, 16, 31,244,139, 16, 68,239,185,178, 10, 90,203,139,238,148,151,178, 90,161,160, 40,152, 25, 6,151,167,
+ 77, 67, 84,108, 44,146, 28,194, 48, 54, 22, 73,209,209,144,179,217,224,145, 36, 24,139,229,177, 49,125,119,132, 22, 0,164,165,
+165, 97,199,142, 29,242, 97,195,134,237,186,122,245,234, 40, 15,197,134,131,203,255,236,217,179,138,250,245,235, 87,122,204,189,
+123,247,208,182,109, 91,143,135,167,184, 92,110,191, 23, 95,124,113,235,142, 29, 59,124,146,147,147,161, 80, 40,158, 88,104,241,
+120,188,238,125,250,244,217,186,113,227, 70,105, 94, 94, 30, 98, 99, 99,165,175,190,250,234,150,196,196,196,215,141, 70,163, 59,
+ 98,179,140,200,138,141,141,213,172, 95,191,254, 7,148, 29, 34,204, 90,191,126,253,143,237,218,181,123, 39, 58, 58, 90, 6, 96,
+146,221,119,160, 74,177,197,227,241,122, 54,104,208,160, 76,175,150,199, 43, 53, 54,137, 68, 34,248,248,248,128,195,225,192,104,
+ 52, 34, 42, 42,138,224,114,185, 93,221, 57,103,137, 68,210,231,141, 55,222, 32, 19, 18, 18,144,157,157, 13,153, 76, 6,177, 88,
+ 12,154,166, 49, 97,194, 4,106,217,178,101, 61,245,122,207, 70,184, 66, 67, 67, 7,245,238,221,155,117,237,218, 53,220,191,127,
+ 31, 70,163, 17, 55,111,222,132, 84, 42,197, 91,111,189,197, 89,178,100,201,171, 25, 25, 25,158, 10,173,230,209,209,209, 57,174,
+ 34,203, 1,145, 72, 68, 52,110,220, 88,237,231,231,215, 6,128, 39, 66,171,249,187,239,190,155,187,104,209,162,238, 71,142, 28,
+113, 6,189, 60,114,228,200, 44, 0,248,246,219,111,227, 3, 2, 2,218, 0,112, 87,104,129, 97, 24,219,127,254,243,159,135, 92,
+ 46, 23,108, 54, 27, 92, 46,183,204,194,225,112, 64,146,164,196,241, 58, 87,199,119,253,126,246,226, 9,179,150, 46, 21,241, 41,
+246,251,175,183, 64, 93, 25, 7, 16,200,193,233,254, 17, 8, 89,169,209,146, 81,223, 3,254,252, 8,223,188,161, 38,163,127, 46,
+249,221, 76,251, 6,220, 45, 40, 40,252,135,219,128,118, 0,254,135,210,228,186,179, 1,156,125, 70,218,166,139, 0,162, 6, 12,
+ 24,224, 20, 91, 7, 15, 30, 68,191,126,253,160,209,104,112,237,218, 53, 87,145,229, 73,130,229,139, 22,139,229,210, 47,191,252,
+210,121,216,176, 97,132,203,251,133,228,228,100,220,184,113, 35,201, 93, 62,146, 36, 97,179,217,192,102,179,177,116,233, 82,152,
+205,102,252,252,243,207,216,190,125, 59, 72,146, 4, 65, 16, 32, 8, 2, 82,169, 20,223,125,247,157, 71,245, 30, 77,211,216,176,
+ 97, 3, 62,154, 53,203, 41,178,236, 35, 25, 8, 10, 12,132,159,191, 63,238,222,189, 91,173,208, 42, 40, 40,248,114,239,222,189,
+168,202, 25,126,239,222,189,206,239,229,156,225,171,111,231, 40, 10, 70,163, 17, 47,189,244, 40, 85,236,187,239,190,235,252,174,
+ 86,171, 65, 81,148,227, 90, 16,238,114, 26, 24,224,117,254,163,109,253, 63,248,160,140,133,174, 50,206,191, 67,139,212,150,117,
+171, 2,177, 21,101,183,206, 42, 1, 12, 64,169,143, 86, 22,240, 55,250,104, 49,140,173,105, 72,157, 96, 92,186,115, 21, 44,138,
+ 2,215,199, 31, 62,242, 64,216,172, 38,104,115,239,227,248,206,239, 1, 0,107, 55,108, 3, 73,146, 96,177, 40, 24, 77, 52, 34,
+234, 6,195,102,179, 53,173,138,251, 5,160,115,207, 64,255, 14,161, 97, 50,226,154,239,125, 52, 86,248,149, 27, 8,225, 33, 34,
+ 83, 76,116, 18, 11,218, 23,104,117,157,175, 3,167,170, 21, 3, 36, 9,146, 32, 32,228,112, 96,220,177,163,212,107, 51,182,180,
+205, 74,138,142, 6,249,251,239,144,240,120,160, 8, 2, 44,187, 9,186, 38,208,233,116, 32, 8, 2,155, 55,111,246,125,235,173,
+183,182, 92,187,118, 45,186,164,164,100,135, 39, 28, 26,141,102, 64,151, 46, 93,142,109,216,176, 33, 32, 40, 40,232,177,253,217,
+217,217, 24, 59,118,108,158, 70,163,241, 40,168, 27,159,207, 31, 50,104,208,160,117, 63,253,244,147,244,246,237,219, 40, 42, 42,
+ 66, 64, 64,192,147, 62, 10,109, 58,118,236,184,107,199,142, 29, 62,217,217,217,208,106,181, 48, 26,141,216,188,121,179,172,127,
+255,254, 59, 82, 82, 82,250, 1, 72,172,134,227,115, 87,145, 53,113,226,196, 43, 0, 20, 0, 86,149,215,160,246,125, 45, 92,196,
+150, 22,192,146, 42,122,162, 97, 34,145, 8,185,185,185, 24, 59,118, 44,110,221,122,100, 0, 13, 14, 14,118,246,244,238,222,189,
+139,128,128, 0, 16, 4,161,112,231,164, 3, 2, 2,196, 38,147, 9,227,199,143, 71, 90, 90, 90, 25,206,244,244,116, 16, 4, 33,
+244,244, 66, 6, 6, 6, 6, 26, 12, 6,116,235,214, 13, 37, 37,165,121,125,135, 15, 31, 14, 54,155,141,220,220, 92,176,217,108,
+255, 26,220, 31,255, 1, 3, 6, 84, 26, 90, 69, 42,149,154,125,125,125, 95,240,144,211,239,213, 87, 95,205,136,141,141,125,108,
+ 98,203,185,115,231, 94,147,203,229, 71,228,114,121, 99, 15, 57,109,174,162,138,195,225,148, 17, 90,108, 54, 27, 36, 73,186,237,
+163,118, 43, 87,191,146, 69,100,181, 90, 52,229,229,177,117, 21, 62, 96,138,114,192,121,241, 75, 92,202, 19, 96,233,178, 3, 0,
+128, 15,223,108,139,150,125,230,195,244,211,203,152,214,137,226,142, 78, 55,206, 4,240,249, 63, 92,231,127, 13,192, 49, 11,110,
+ 53,128, 86,207, 80,123,228, 20, 91, 7, 15, 30, 68,100,100, 36, 10, 10, 10,144,146,146, 82, 83,145,229,168,239, 62,154, 59,119,
+238,159,131, 7, 15, 22, 57, 58,173, 2,129, 0, 51,102,204, 48, 20, 21, 21,125,228,209, 67,100,179,129,197, 98, 57, 59,201,124,
+ 62, 31, 81, 81, 81, 78,145, 69, 16, 4,138,139,139,193, 98,177, 28, 51, 18, 9, 55,203, 8,101, 80, 16, 36, 18, 9, 26, 69, 68,
+224,182,189, 30,113,124,231,241,120, 32, 8, 2, 86,107,181,134,188, 66,187, 83,251,244,218,110,146, 29,162,168, 74,211,113,112,
+ 48,108, 54,155, 67,100, 50,181,193,233,239,239,143,162,162, 34,119, 57,159, 73, 84, 98,209,114, 8,173, 1, 40,245,213,122, 44,
+188, 67, 15, 0,199,241, 20,167, 84, 18, 96, 8, 27,195,128, 69,145,246,177, 91, 10, 20, 69, 66,157,151,133,229, 95, 78,178,139,
+172,237,216, 31,159,130,144, 6,145,143,198,113, 9, 2, 96,170,126,184, 3,124, 56,177,147, 7,119, 20,228, 16, 89,144, 5, 11,
+193,231,151,211,143,190, 28, 16,225, 36,166,244, 12, 17,158,223, 91, 18,123, 93,107,174,182,161,224,147,100,169,243, 59, 65, 84,
+232,220, 67,218,247, 81, 4, 1,134, 97,192,216, 60,243, 59,118, 8,121,129, 64, 0,179,217, 12,138,162,176, 98,197, 10, 89,159,
+ 62,125, 86,121, 42,180, 0, 36,231,228,228,244,159, 48, 97,194,193,109,219,182,249,251,251,251,151,233, 61, 76,152, 48, 65,149,
+147,147,211, 31, 30, 58,221,179,217,236, 85,171, 87,175,150, 62,120,240, 0,197,197,197, 16, 8, 4,206,202,167,166,207,103,251,
+246,237,255, 56,116,232,144,175, 86,171,133,217,108,134, 64, 32, 0,195, 48,160, 40, 10,191,254,250,171,223,192,129, 3, 15,164,
+166,166,190, 88, 85, 89, 5, 2,193,235,118,225,132,232,232,104, 89,116,116,116, 15,160,210, 72,189, 78, 68, 71, 71,203,166, 79,
+159,254,170,193, 96, 88, 82,197, 57,167,169,213,234, 32,129, 64,128,157, 59,119, 66, 44, 22, 67, 40, 20, 34, 56, 56, 24,106,181,
+ 26, 66,161, 16, 12,195,192, 98,177, 56, 42,139,124,119, 78, 60, 47, 47,175,200,106,181,250, 28, 60,120, 16,249,249,143,126, 82,
+183,110, 93,104, 52, 26,216,108,182, 98, 79, 47,102,102,102,102, 14, 65, 16,161,151, 46, 93,194,131, 7, 15,208,175, 95, 63,252,
+254,251,239,104,219,182,116,116,216,100, 50,213, 36,136, 31, 77, 81, 20, 83,197,115, 75, 0,240,173, 77, 78,123,227,229, 17,167,
+205,102,179, 57, 68,150,235,167,171,248,170,230, 63,203,188,206, 47, 4,138,215, 47,154,220,123,236,203,145,254, 48,228,221, 7,
+ 95,226, 15, 66, 22,142,165,203, 14,224,218,189,210,251,181,116,203, 5,108,141,233, 15, 8,228,104,226,163, 66,144,132,245,198,
+141,220,127, 92,104,249,184,246, 19,158,213,134,169, 95,191,126, 80,171,213, 16,139,197,181,225,159,115,218, 96, 48,220,220,189,
+123,119,155, 1, 3, 6,128,203,229,226,230,205,155, 72, 76, 76, 76, 1,112,218, 83,161,197,102,179, 49,119,238, 92, 76,154, 52,
+ 9,129,129,129,248,232,163,143,192, 98,177,156, 11, 65, 16, 78, 11,151, 39, 80, 4, 86, 61,241,209,225, 16, 95,157, 49,220,199,
+199,103, 46, 73,146,195, 40, 55, 46, 28, 77,211,180,205,102,219,166,213,106,171, 12,239,224,112, 92,119,231, 94,184, 94,131,106,
+218,180, 39,230,252, 59,180, 72, 77, 80,126,182, 97, 37, 22, 45,199,172,195,199, 82, 1, 57,206,242,184,221,100,119,252,105, 21,
+148, 32,169, 27,233, 25,153,240,243, 21,219, 69,150,125, 33, 73,180,140, 44,237,204,238,143, 79, 65, 72,253, 72,176, 40, 10, 44,
+138,130, 88,192, 67, 78,118, 22, 88, 44,242, 70,101,188,205, 41, 12, 30,220, 56, 52,220,215,143, 13, 85,128, 9,202,192, 74, 12,
+ 3,109, 36, 8, 81,114,209,215,143, 31,214,156,194,224,170,173,111,140, 83,104,153,173, 86,112,134, 12,113, 14, 23, 38, 69, 71,
+ 35, 42, 54, 22,244,160, 65,208,155,205,101, 76,197, 53, 21, 90, 2,129, 0,133,133,133, 24, 53,106,148,218, 98,177,188, 83,195,
+ 75,156,152,159,159, 63,116,244,232,209,249, 14, 1, 99, 54,155, 49,122,244,232,252,252,252,252,161,110, 88,137, 30,131,197, 98,
+121,167,109,219,182,106,149, 74,229, 44,103, 77, 42, 28, 7,228,114,249,254,245,235,215,203,141, 70, 35,172, 86,171,147, 83, 32,
+ 16,128,162, 40, 4, 4, 4, 96,235,214,173, 1,114,185,188,202,156, 85, 6,131, 97,119,108,108,172, 6, 0, 98, 99, 99, 53, 4,
+ 65,196, 17, 4,177,134, 32,136,213,229,150, 53, 4, 65,196,185, 30,107, 48, 24,118, 85,197,109, 50,153,226, 82, 82, 82, 24,161,
+ 80, 8,138,162, 96, 54,155,193,231,243,157, 38,113,157, 78, 7,131,161,116,152, 59, 49, 49, 17, 22,139, 37,193,157,115, 47, 44,
+ 44, 60,186, 97,195, 6, 91,221,186,117, 17, 25, 25,137,168,168, 40,116,236,216, 17, 97, 97, 97,152, 55,111, 30,173,215,235, 61,
+126,247, 50, 51, 51,247,255,246,219,111,150,208,208, 80,180,105,211, 6, 60, 30, 15, 45, 91,182, 68,112,112, 48, 22, 46, 92,104,
+210,106,181, 7,107,112,155, 82,175, 94,189, 74, 85, 33,114,165,112, 99,246,110, 57,164,157, 63,127,158,234,216,177,227,158,242,
+ 59,218,183,111,191, 71, 44, 22,251, 56, 76,236,158,244,200, 93,197, 21,143,199,115, 46,142,237, 44, 22,203,157,222, 15,249, 66,
+160,120,253, 87,147,122,141,125, 57,210, 23,123,142,158, 5,199,172, 1, 76, 85,140, 8,210, 22, 16, 28, 17, 2,125,216, 33,207,
+ 64, 27, 48, 13,192, 21,148,198, 97,250, 8,207, 22,156,142,239,249,249,249, 72, 73, 73, 65, 98, 98, 34, 58,118,236,136,132,132,
+ 4,224,145,131,188,199,208,106,181, 31,197,196,196,232, 29, 51,249,102,207,158,109, 40, 44, 44,252,200,211, 58,152, 97, 24,176,
+217,108, 52,105,210, 4,211,167, 79,199,129, 3, 7,112,243,230, 77, 88, 44, 22,167, 16,114,248,100,122, 98,209,226,112, 56, 8,
+ 12, 12,132,197, 98,113, 90,179, 0,224,246,173, 91, 96,177, 88,176,217,108, 48,153, 76,213, 90,180,124,124,124,230,174, 91,183,
+110,170, 74,165, 82,230,229,229, 41, 92,151,156,156, 28, 69, 86, 86,150, 34, 35, 35, 67,145,150,150,166,120,248,240,161,226,254,
+253,251,202,197,139, 23, 79,245,241,241,153,235, 78, 57, 41,138, 66,203,150, 45,241,238,187,239, 58,151,149, 43, 87, 58,151,227,
+199,143,123,236,188, 78, 81, 20,154,204, 89,138,254,121,140,115, 57, 16, 64, 56,151,107, 31, 78,172,138,243,169,107,145, 26,233,
+ 23,251,108, 67,215,196,210, 21,192, 49,235,208, 81,151, 57,221, 54,202, 59,195, 63, 53, 88, 77, 37,199,238,221,185,213,171, 73,
+243,118,100,182,170,168,204,244,207,168,158, 67, 65, 16, 4,234,212,143, 4,197, 98,129,162, 72,176, 40, 10, 50, 41, 31, 41,151,
+ 46,217,140, 6,195,177,138, 56,123, 0, 44,174,128,187,242,205,190, 45,249,153,220, 92, 4, 40, 69,224,176, 75,181, 35,115,111,
+104,185, 22,130, 5, 52,151, 96, 92,134,159,224, 88, 78,201, 74, 95,189,121, 79, 92, 37, 61, 64,155,205, 6, 49,143,135, 18,163,
+ 17, 6,171, 21, 61,151, 47,119, 14, 23,146, 4,129,139, 0, 90, 44, 95,142, 83, 59,118, 64,202,229, 2, 60,158,219,179, 66, 42,
+ 18, 90, 42,149, 10, 99,198,140,201,207,202,202,122,171, 38, 62, 90, 14, 24,141,198, 19,217,217,217,111, 13, 29, 58,116,243,206,
+157, 59,229, 67,135, 14, 85,103,103,103,191,229,166,223,211, 99, 40, 41, 41,217,145,150,150, 86, 60,102,204,152, 77, 91,182,108,
+241,243,247,247,119,246, 68,106,244,176, 18,132,170,119,239,222, 60,119,142,171,230,144, 24,187,115,251, 36,187,101,171,197,196,
+137, 19, 79,161,212,255,202, 21,115,214,174, 93, 59,220,101,136,113, 13,128,229, 85, 17,235,116,186,213,211,167, 79,255,239,137,
+ 19, 39,252,249,124, 62, 8,130, 0,135,195, 65,163, 70,141,156,179,104,216,108, 54, 24,134,193, 7, 31,124,160,202,205,205,253,
+214,205,123, 51, 49, 38, 38,166,123, 73, 73,137,239,152, 49, 99, 40, 62,159,143,156,156, 28, 44, 91,182,140,254,233,167,159, 52,
+122,189,126,108, 13,132,240,134, 47,190,248,162,103, 81, 81, 81,253, 9, 19, 38,112,180, 90, 45, 12, 6, 3,102,206,156,105,250,
+241,199, 31,211, 13, 6,131,199, 1,127, 59,117,234,116,231,225,195,135, 93,139,139,139, 11,132, 66, 97,121,107, 31, 33, 18,137,
+218, 1,216,228, 9,103, 84, 84,212,221,212,212,212,142,243,231,207,143,179, 88, 44,236,115,231,206, 57,157,225, 87,172, 88,113,
+156,207,231,247,134,135,201, 87, 9,130,176,241,120,188, 50, 22,172,242,223, 89, 44, 86,181,117, 90,211, 32,225,252,175,222,238,
+ 62,246,165, 23,124,176,251,232, 5,196,236,186,119, 35, 98,108, 64,147,134,190,121,176,229,165,224,195, 55,219, 98,233,150, 11,
+ 0, 74,135, 14,109,185,215,192, 20,220, 5, 35, 9,197,125,181, 42,243, 25,104, 3,142,163, 52,100,198,179,134, 50, 34,235,218,
+181,107,232,213,171, 23, 0, 32, 33, 33, 1, 93,186,116, 65, 66, 66, 2,186,118,237,234,113, 44, 45, 59,254,210,233,116, 15,143,
+ 31, 63,222, 44, 52, 52, 20,167, 79,159,190, 15,224, 47, 79, 11,233, 16, 90, 44, 22, 11, 35, 71,142, 68,159, 62,125, 80,183,110,
+221, 50,179, 13, 29,223, 61, 17, 27, 86,171, 21,205,155, 55,135,209,100, 2,135,195,113, 14, 77,178, 88, 44, 4, 40, 20,184,115,
+231,142, 91, 22, 45,146, 36,135,189,254,250,235,100,114,114, 50, 70,140, 24,129,205,155, 55, 87,122,236,232,209,163,241,203, 47,
+191,224,245,215, 95, 39, 63,249,228,147, 42,195, 59, 56,156,208,221, 57, 39, 71, 59, 93, 93,189, 95, 91,156, 79, 91,139, 60, 9,
+ 92, 66, 59, 84, 56,104, 82,193,182,216, 50, 66,203, 37, 72,216,211, 17, 90, 86,243,230,223,127,254,126,122,199, 85, 93, 3,148,
+ 10, 31,168,181, 6,167,216, 74, 58,190, 29, 0, 48,120,226, 2,176,168,210, 33, 69,169,152, 15, 1,135,194,142,141,223,170,204,
+230,146, 10,159,174, 66, 54, 57,233,147,206,141,124,184, 34, 11,116, 65, 12, 34, 3, 30,101,202, 33,234,111,127, 92,112,181,246,
+133,255,181, 2,188,217, 80, 44,253, 54, 89, 51, 9, 22,219,202,199, 26, 68,141,198,160,185,116, 73,208,111,221, 58,156,123,235,
+ 45,212,161,105,196, 5, 7, 67,206,102,195,135,199, 3, 73, 16, 48,236,219,135, 83, 59,119, 34,144,199, 3, 36, 18, 88,231,205,
+131, 49, 37, 5,150,194, 66, 67, 13,122,102, 24, 62,124,184, 74,165, 82, 13, 53,153, 76, 39,158,244, 58, 27, 12,134, 67,105,105,
+105,147, 58,117,234,180,202, 98,177,188, 99, 48, 24,158,104,102,148,201,100, 58,148,157,157, 61,100,248,240,225,219,119,237,218,
+229, 47,147,201,106,204,149,159,159,223,182,150, 30, 39, 27,128,207,236,206,237,147,162,163,163,101,231,207,159,255,239,250,245,
+235, 87,185,244, 38, 20,227,199,143,127,187,156,200,170,118,214, 33,128,212,220,220,220,121, 51,102,204, 88,240,205, 55,223,136,
+ 29,142,239,151, 47, 95,134,213,106, 5,155,205, 6, 77,211, 24, 63,126,124, 81,126,126,254, 82, 84, 30,209,249,177, 71, 75,167,
+211, 53,154, 63,127,254,250,229,203,151,247,161, 40, 74, 68,211,180,190,184,184, 56,174,164,164,100, 44,106, 22, 71,203,150,151,
+151, 55,230,243,207, 63, 31,179,108,217,178,215, 73,146, 84, 88,173, 86, 85, 97, 97,225, 94,131,193,240, 35,106, 48,148,116,250,
+244,233,188, 55,223,124,243, 94, 94, 94, 94,211,144,144, 16,173, 88, 44, 54,153, 76, 38, 74, 32, 16, 72, 69, 34, 81, 20,128,211,
+ 4, 65, 92,247,132, 51, 41, 41, 41,123,194,132, 9, 15,140, 70, 99,147, 53,107,214,196, 75,165,210,163, 4, 65, 16, 28, 14,199,
+ 87, 32, 16,244, 2, 16, 71, 16,196,109, 79, 56, 73,146,180,185, 90,175,202,251,103,113,185, 92,183,124,180,234, 7, 8,199,245,
+105,196,194,238, 99, 23, 16,179, 59,117, 3,205, 48, 59,119, 38, 21,236,251,168, 11, 96,222,246, 38, 90, 14,221, 84, 58, 92, 8,
+192,150,123, 13,230,109,163, 65, 8,253, 17,159,193,134,214, 96,222, 15, 47, 42,130, 51,188,131, 74,165, 66,114,114,178, 67,100,
+ 69, 1, 64,215,174, 93,147, 28, 98, 43, 49, 49, 17,109,218,180, 73, 2,192,246,244,121,213,233,116, 51, 70,141, 26,117,200,222,
+ 57,158, 81,131,142,159, 83,104, 57, 4, 85,221,186,117,157,235,174,139,139,143,150, 91,160,105, 26, 28, 14, 7, 44, 22, 11,202,
+224, 96,231,127, 49, 12,131, 59,119,238, 64,173, 86,187, 37,180, 40,138,162, 8,130,192,136, 17,238, 77, 72,254,207,127,254,131,
+184,184, 56, 80,110,170, 66,138,162, 16, 30, 30, 94,237, 49, 14, 93,234, 46,103, 72, 72, 72,141, 57,159,182, 22,169,169,192,170,
+232,123, 69,162,170,178, 23,226,239, 66,102, 81,145,246,179,141,235, 86,124, 51,126,242, 7,226,107,119,115,160, 45, 50,130,162,
+ 72,215,202, 19, 44, 22, 5,169,136,143,208, 32, 31,108,249,225,127,133,133, 58,205,231,168, 36,239, 97, 93, 9,103, 98,239,118,
+ 13,121, 28,165, 30, 77, 90, 12, 7,197,127, 36, 2,152,236, 74, 70, 7,187,252,137, 87, 82,245,252,223, 83,245, 19, 47, 22,152,
+ 30, 23, 90, 38,211,203,179,251,246,253, 35,230,192, 1, 97,251, 13, 27,112,119,252,120, 4, 27, 12,224,217,135, 18, 73,130,128,
+152,195,129,152,195, 41, 21, 89,203,150,193, 96,181, 98,249, 91,111, 21, 27, 77,166,190,158,188,228,249,249,249, 24, 52,104, 80,
+ 94,102,102,102,127,212, 96,104,175, 50,232,245,250, 29, 0,118,212, 22,159,209,104, 60,145,158,158,254,202,160, 65,131, 14, 28,
+ 58,116, 40,224, 25, 9, 50,231, 16, 91,230,243,231,207,191, 29, 31, 31,127, 23,101, 19,139,106,226,227,227,239, 78,152, 48,129,
+ 88,191,126,253,143, 0,190,128,155, 1, 60,245,122,253,138,195,135, 15,163,123,247,238, 95, 44, 90,180,200,175,109,219,182, 80,
+ 40, 20, 40, 44, 44, 68, 98, 98, 34,166, 77,155,166,214,233,116,139, 52, 26,205, 55, 30,150,217,108, 52, 26, 71,187, 78,165,174,
+141,235, 96, 52, 26,127,202,202,202,250,169,182, 8,167, 76,153,114,249,206,157, 59,249, 1, 1, 1, 29, 56, 28, 78, 11,148,250,
+ 1,101, 3,248,209, 83, 65,228,192,228,201,147, 47,221,185,115, 71, 85,167, 78,157,142,118, 78, 25, 74,211, 24,173,171, 1,103,
+230,133, 11, 23, 66,218,181,107, 71,178,217,108,134,162, 40,176,217,108,134,197, 98, 49,118,191, 26, 6, 0,246,238,221,203, 3,
+ 80,101,218,156,187,185,134,249,163,255,119,242,147,235,217, 37, 59, 83,114,138,167, 3, 96,182, 93, 19,254,217, 50,128,122,249,
+229,198,233, 48,198,118, 5, 33, 45, 13, 84,201, 20,101,129, 16, 5, 34,221, 86, 7,115,246,220,200,182,130, 88,226,213, 84, 21,
+247,171, 97, 15,239,144,149,149,229, 42,178, 28, 86,171,168,174, 93,187, 38,217, 69,150, 99, 95, 77,252,203,142,216,108,182, 39,
+106,195, 24,134, 65, 76, 76, 12,214,174, 93,139,234, 34,154,219,103,247, 17,213,241, 57, 44, 90, 52, 77,195,108, 54,227,218,181,
+107,206,152, 93,142,225, 66, 71,104, 7,171,213, 90,229,108,117,154,166,105,147,201,132, 95,127,253,213, 45,177,181,117,235, 86,
+148,148,148,128,174, 70,193,185,134, 98,104,213,170, 21,212,106,181,115,178, 79, 84,212,163, 80,121,102,179,217, 35,225,234,224,
+108,210,164, 9, 84, 42, 21, 28,254,194,161,111, 61, 50,246, 88,245,250,127,235,115, 95,169, 69,235,111,111, 49,121, 66,233,161,
+182,157,251,116,121,235,237,105,162, 34, 35,141, 7, 15, 30, 34, 47, 55, 11, 36, 65, 66, 89, 39, 4, 97, 97,225, 16,112, 73,108,
+142,253, 70,159,116,234,232,201,162,194,130,126,149,113, 13,240,225,156, 90, 54,164, 75,199, 6, 13, 36, 4,172, 22,128,182, 0,
+ 86, 11, 96,179,127, 58,182,217,202, 62,115,201,201, 26,230,147,139,234, 51,251,181,230, 10,115, 86, 13, 5,186,200,228,242, 63,
+230,236,221, 43,180,153,205,200,159, 49, 3, 66,171, 21,124,123,175,164,244, 68,120,176,206,155, 87, 42,178, 70,143, 46,214,106,
+ 52, 30,165,224,241,247,247,191, 64, 16,132,127, 94, 94,222,115, 21, 25, 62, 32, 32, 96, 63,195, 48, 42,149, 74,213,246, 25, 42,
+151, 2,128, 6,128,185,130,142, 68, 0, 60,247,255,113, 32, 60, 32, 32,224, 19,146, 36, 59, 49, 12,227, 71,146,100,129,205,102,
+ 59,157,155,155,187, 24,192, 29,111,123,250,143,193, 17, 25,190, 94, 53,199,229, 2,120, 31,165, 78,193, 15,220, 37,111,233,227,
+227, 99,228, 90,118,189, 22,201,235, 57, 44,202, 7,245,131, 36, 96,115,248,200,212, 89,113,228,186, 14,235,142,103,167, 25, 44,
+244,192, 91,121,197, 87,189,183,162, 74,212,122, 10,158,218,132, 92, 46, 63,251,199, 31,127,180,173, 95,191, 62,233,234,240,238,
+136,149,231, 24,222, 98,177, 74,181,220,137, 19, 39,172, 35, 70,140, 56,157,147,147,211,189, 50, 78,137, 68,242,231,149, 43, 87,
+ 94,210,106,181,143, 9, 42,215, 72,241,142,117,189, 94,143,201,147, 39, 31,174, 44, 5,143,143,143,207,178,111,190,249,102,234,
+224,193,131, 73, 71, 56,138,255,107,239,124, 94,155, 8,162, 56,254,221,164,219,212,180, 77,193, 4,148, 84,193,104,192, 20,193,
+ 67, 17,188,120,216,160, 69, 60,139,246, 34,245,230,165,254, 9, 66,227,127, 96,132,122,232,205,226,201, 67,207, 22, 20,189,122,
+240,100,109,107, 69,186,136,105, 66, 80,168,177,166,205,207,245,224, 46,172,211,221,184,211,125,179,217,141,251, 96,161, 61,244,
+211,239,204,123,143,188,125,147,153, 49, 63,198,117, 65,198,211,108, 54,177,188,188,220, 45, 22,139,143,119,119,119,109,151, 14,
+211,233,244,151, 82,169,116,218, 56,106,193,201,161,162,153, 76,102, 71, 85,213, 73, 47,153, 1, 46,184,254,234,110,245,165, 53,
+ 33,199,227,243,137,241,227, 11, 55,239,220, 79,101,178,231,165,147,233, 83,144, 16, 65,165,252, 21,234,231,143,218,202,179,197,
+111,123, 63,190, 63,172,215,247, 22,123,113, 46, 0,217,179, 19,195,207, 99, 29,228, 96, 20, 64,204,253, 84,135,222, 56, 0, 52,
+229,200,198,118,173, 53,251,161,199,178,143, 81,108, 61, 88, 89, 25,141,229,114,135, 14,138,235,118,187, 56, 88, 95,199,163,185,
+ 57,238, 34, 43,180,208, 66, 35,177,115,248,247, 25, 89, 45,252, 57,159,139,183, 99, 34, 77,157, 24,155,213,128,219, 17,116, 47,
+ 70, 36, 41,214,214,176, 9, 13,171,163, 67,191,158,188,219, 65, 61,156,126, 71,230,219, 75,165, 1,140, 37,147,201,151,209,104,
+244,140,209,145, 49,119,235, 45, 46,148,222,174, 84, 42,215, 0,244,218, 33,156, 77, 36, 18,139,157, 78,231,178,147, 75,165,163,
+209,232,219, 90,173, 54,143, 30,151, 74,139,216,117,152, 74,165, 62,169,170,154, 53,118, 81,155, 63, 43,173,118,150,111,109,109,
+ 65, 81, 20,181, 92, 46,103,188,100,250,213,108,118, 29,250,167,163,101,178,201,225,145,241,187,177,248,177,171,221, 86,123, 10,
+ 18, 48, 36,203, 27,141,253,250,171,131,250,207,167,176, 89, 46,244,210,110, 1, 87, 70, 98,177,213,225,137,137,184, 85,209,214,
+170,213,234, 7,141,198,245,176,200, 10, 45,180,208, 66, 11, 45, 64,150, 75, 38,147, 47,100, 89, 30, 49, 23,147,236,207,134,181,
+219,237,253,106,181,122, 3,192,166,199,204,255,211, 56,191,164, 54,227,148,169, 63,138,223,153, 2,199,174, 17, 50, 21,157, 89,
+ 8,136, 78,197,175, 76, 99,188, 28,220, 25,158, 56,162,154, 79,147, 78,141, 90,167, 40, 38, 85, 30, 89,232,212, 4,248,189, 16,
+ 16,157,138,223,152,108,252, 56,228,114, 49, 29,198, 20,175, 78,141, 90,167, 40,166,219, 60,234,161, 83,115, 27, 75, 54,190, 47,
+ 32,128,182, 54, 13,109,109, 26,218,251, 75,150,231, 54,222,179,251, 59,174, 47, 18,138,218, 9, 96, 28,187,175,243, 37,191, 50,
+205,243, 64,121, 85,128,128,107, 7, 94, 83, 51,153,249,164,178,130,190,195,228, 13, 28, 28, 56,202, 51,118, 10,191, 51, 99, 37,
+225, 30,161,200,226, 98, 82,197,189,104, 38, 85, 46,177, 76,138,184,183,242,187, 64, 31, 81,233, 36,201, 37, 17, 49,111, 17, 63,
+174,185, 44,147, 34,151, 88, 38, 69,220,123,193,164,200, 37, 43, 38, 69,220,219,249, 62,168,141, 38, 99,185, 80, 63,226, 65,114,
+ 80,108, 45, 1, 64,228, 40,147, 38,176, 83,150,167,102, 82,107, 22, 81,108,114,116, 96,250,206, 36,246, 81, 65,103, 82,190,221,
+228,169,124, 36, 34,222,205, 76, 42, 62,203,161,240,147, 21,211,173, 94, 27,157,228, 99,119, 27,247, 94, 49,137,125, 68,146, 75,
+ 12, 51, 79,252, 50,144, 55,253, 94,160,100, 82,229,146,133, 78,215,126,178, 98,186,213,107,163,147,124,236, 20,159, 33,162,184,
+253,236,104,105, 17,219,152, 88, 98, 30, 79, 10,141,190, 45,201,113,178, 7,138,201,185, 60, 51, 35,192,247,125,213, 73,201,100,
+ 53, 82, 46,247,136,212, 73,201,228,208, 58,112,204,160,249,221,143,243,105,199,115,179, 44,101,215, 29, 21,161,147,146,233,144,
+ 61, 16, 76, 23,190, 31, 56, 27,242,139, 16, 99,226,137,223, 76, 64,220,129, 17, 54,110, 98,157,121, 17, 29, 66, 1, 70,174, 83,
+127, 83, 94, 16, 48,246,160,204,105,152, 75, 97, 46,249, 46,151,152,152,204, 19,118,138, 72, 59,207, 44,147,226,127,152, 25, 84,
+ 49, 42,122,236,148,185, 36,194,247, 65,179,223,196,219, 78,253, 18,230,201,232, 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
index 7a2f196fd6d..b312f397939 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -42,6 +42,7 @@ set(SRC
gpencil_edit.c
gpencil_ops.c
gpencil_paint.c
+ gpencil_undo.c
gpencil_intern.h
)
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 440d5ee7c4d..cfa9585868e 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -644,7 +644,7 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
/* Check if may need to draw the active stroke cache, only if this layer is the active layer
* that is being edited. (Stroke buffer is currently stored in gp-data)
*/
- if ((G.f & G_GREASEPENCIL) && (gpl->flag & GP_LAYER_ACTIVE) &&
+ if (ED_gpencil_session_active() && (gpl->flag & GP_LAYER_ACTIVE) &&
(gpf->flag & GP_FRAME_PAINT))
{
/* Buffer stroke needs to be drawn with a different linestyle to help differentiate them from normal strokes. */
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 9dc764b7aac..1cd8b1f05db 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -511,8 +511,8 @@ static void gp_stroke_to_bezier (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, C
copy_v3_v3(p3d_prev, p3d_cur);
copy_v3_v3(p3d_cur, p3d_next);
- if (i + 1 < tot) {
- gp_strokepoint_convertcoords(C, gps, pt+1, p3d_next, subrect);
+ if (i + 2 < tot) {
+ gp_strokepoint_convertcoords(C, gps, pt + 2, p3d_next, subrect);
}
}
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index c31de8d30a7..8000af54f53 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -37,6 +37,7 @@
/* ***************************************************** */
/* Operator Defines */
+struct bGPdata;
struct wmOperatorType;
/* drawing ---------- */
@@ -48,6 +49,7 @@ typedef enum eGPencil_PaintModes {
GP_PAINTMODE_DRAW = 0,
GP_PAINTMODE_ERASER,
GP_PAINTMODE_DRAW_STRAIGHT,
+ GP_PAINTMODE_DRAW_POLY
} eGPencil_PaintModes;
/* buttons editing --- */
@@ -61,6 +63,11 @@ void GPENCIL_OT_active_frame_delete(struct wmOperatorType *ot);
void GPENCIL_OT_convert(struct wmOperatorType *ot);
+/* undo stack ---------- */
+
+void gpencil_undo_init(struct bGPdata *gpd);
+void gpencil_undo_push(struct bGPdata *gpd);
+void gpencil_undo_finish(void);
/******************************************************* */
/* FILTERED ACTION DATA - TYPES ---> XXX DEPRECEATED OLD ANIM SYSTEM CODE! */
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index e1e4c8d5457..150e0ba90e4 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -59,6 +59,9 @@ void ED_keymap_gpencil(wmKeyConfig *keyconf)
/* draw - straight lines */
kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_CTRL, DKEY);
RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_STRAIGHT);
+ /* draw - poly lines */
+ kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", RIGHTMOUSE, KM_PRESS, KM_CTRL, DKEY);
+ RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_POLY);
/* erase */
kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", RIGHTMOUSE, KM_PRESS, 0, DKEY);
RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 04565eab155..a23f2064a9e 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -124,6 +124,7 @@ enum {
/* Runtime flags */
enum {
GP_PAINTFLAG_FIRSTRUN = (1<<0), /* operator just started */
+ GP_PAINTFLAG_STROKEADDED = (1<<1) /* stroke was already added during draw session */
};
/* ------ */
@@ -152,7 +153,7 @@ static int gpencil_draw_poll (bContext *C)
/* check if current context can support GPencil data */
if (gpencil_data_get_pointers(C, NULL) != NULL) {
/* check if Grease Pencil isn't already running */
- if ((G.f & G_GREASEPENCIL) == 0)
+ if (ED_gpencil_session_active() == 0)
return 1;
else
CTX_wm_operator_poll_msg_set(C, "Grease Pencil operator is already active");
@@ -375,6 +376,52 @@ static short gp_stroke_addpoint (tGPsdata *p, const int mval[2], float pressure)
else
return GP_STROKEADD_NORMAL;
}
+ else if (p->paintmode == GP_PAINTMODE_DRAW_POLY) {
+ /* get pointer to destination point */
+ pt= (tGPspoint *)(gpd->sbuffer);
+
+ /* store settings */
+ pt->x= mval[0];
+ pt->y= mval[1];
+ pt->pressure= pressure;
+
+ /* if there's stroke fir this poly line session add (or replace last) point
+ to stroke. This allows to draw lines more interactively (see new segment
+ during mouse slide, i.e.) */
+ if (p->flags & GP_PAINTFLAG_STROKEADDED) {
+ bGPDstroke *gps= p->gpf->strokes.last;
+ bGPDspoint *pts;
+
+ /* first time point is adding to temporary buffer -- need to allocate new point in stroke */
+ if (gpd->sbuffer_size == 0) {
+ gps->points = MEM_reallocN(gps->points, sizeof(bGPDspoint)*(gps->totpoints+1));
+ gps->totpoints++;
+ }
+
+ pts = &gps->points[gps->totpoints-1];
+
+ /* special case for poly lines: normally, depth is needed only when creating new stroke from buffer,
+ but poly lines are converting to stroke instantly, so initialize depth buffer before converting coordinates */
+ if (gpencil_project_check(p)) {
+ View3D *v3d= p->sa->spacedata.first;
+
+ view3d_region_operator_needs_opengl(p->win, p->ar);
+ ED_view3d_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
+ }
+
+ /* convert screen-coordinates to appropriate coordinates (and store them) */
+ gp_stroke_convertcoords(p, &pt->x, &pts->x, NULL);
+
+ /* copy pressure */
+ pts->pressure= pt->pressure;
+ }
+
+ /* increment counters */
+ if (gpd->sbuffer_size == 0)
+ gpd->sbuffer_size++;
+
+ return GP_STROKEADD_NORMAL;
+ }
/* return invalid state for now... */
return GP_STROKEADD_INVALID;
@@ -395,7 +442,7 @@ static void gp_stroke_smooth (tGPsdata *p)
int i=0, cmx=gpd->sbuffer_size;
/* only smooth if smoothing is enabled, and we're not doing a straight line */
- if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT))
+ if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || ELEM(p->paintmode, GP_PAINTMODE_DRAW_STRAIGHT, GP_PAINTMODE_DRAW_POLY))
return;
/* don't try if less than 2 points in buffer */
@@ -527,17 +574,28 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
return;
}
+ /* special case for poly line -- for already added stroke during session
+ coordinates are getting added to stroke immediatelly to allow more
+ interactive behavior */
+ if (p->paintmode == GP_PAINTMODE_DRAW_POLY) {
+ if (p->flags & GP_PAINTFLAG_STROKEADDED)
+ return;
+ }
+
/* allocate memory for a new stroke */
gps= MEM_callocN(sizeof(bGPDstroke), "gp_stroke");
- /* allocate enough memory for a continuous array for storage points */
- pt= gps->points= MEM_callocN(sizeof(bGPDspoint)*totelem, "gp_stroke_points");
-
/* copy appropriate settings for stroke */
gps->totpoints= totelem;
gps->thickness= p->gpl->thickness;
gps->flag= gpd->sbuffer_sflag;
+ /* allocate enough memory for a continuous array for storage points */
+ gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
+
+ /* set pointer to first non-initialized point */
+ pt= gps->points + (gps->totpoints - totelem);
+
/* copy points from the buffer to the stroke */
if (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT) {
/* straight lines only -> only endpoints */
@@ -565,6 +623,16 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
pt->pressure= ptc->pressure;
}
}
+ else if (p->paintmode == GP_PAINTMODE_DRAW_POLY) {
+ /* first point */
+ ptc= gpd->sbuffer;
+
+ /* convert screen-coordinates to appropriate coordinates (and store them) */
+ gp_stroke_convertcoords(p, &ptc->x, &pt->x, NULL);
+
+ /* copy pressure */
+ pt->pressure= ptc->pressure;
+ }
else {
float *depth_arr= NULL;
@@ -643,6 +711,8 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
MEM_freeN(depth_arr);
}
+ p->flags |= GP_PAINTFLAG_STROKEADDED;
+
/* add stroke to frame */
BLI_addtail(&p->gpf->strokes, gps);
}
@@ -891,10 +961,14 @@ static void gp_session_validatebuffer (tGPsdata *p)
bGPdata *gpd= p->gpd;
/* clear memory of buffer (or allocate it if starting a new session) */
- if (gpd->sbuffer)
+ if (gpd->sbuffer) {
+ //printf("\t\tGP - reset sbuffer\n");
memset(gpd->sbuffer, 0, sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX);
- else
+ }
+ else {
+ //printf("\t\tGP - allocate sbuffer\n");
gpd->sbuffer= MEM_callocN(sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX, "gp_session_strokebuffer");
+ }
/* reset indices */
gpd->sbuffer_size = 0;
@@ -903,24 +977,21 @@ static void gp_session_validatebuffer (tGPsdata *p)
gpd->sbuffer_sflag= 0;
}
-/* init new painting session */
-static tGPsdata *gp_session_initpaint (bContext *C)
+/* (re)init new painting data */
+static int gp_session_initdata (bContext *C, tGPsdata *p)
{
- tGPsdata *p = NULL;
bGPdata **gpd_ptr = NULL;
ScrArea *curarea= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
/* make sure the active view (at the starting time) is a 3d-view */
if (curarea == NULL) {
+ p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: No active view for painting \n");
- return NULL;
+ return 0;
}
- /* create new context data */
- p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data");
-
/* pass on current scene and window */
p->scene= CTX_data_scene(C);
p->win= CTX_wm_window(C);
@@ -942,7 +1013,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: 3D-View active region doesn't have any region data, so cannot be drawable \n");
- return p;
+ return 0;
}
#if 0 // XXX will this sort of antiquated stuff be restored?
@@ -951,7 +1022,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return p;
+ return 0;
}
#endif
}
@@ -972,7 +1043,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return;
+ return 0;
}
#endif
}
@@ -992,13 +1063,13 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view (sequencer), active mode doesn't support Grease Pencil \n");
- return;
+ return 0;
}
if ((sseq->flag & SEQ_DRAW_GPENCIL)==0) {
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return;
+ return 0;
}
}
break;
@@ -1019,7 +1090,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return p;
+ return 0;
}
#endif
}
@@ -1031,7 +1102,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: Active view not appropriate for Grease Pencil drawing \n");
- return p;
+ return 0;
}
break;
}
@@ -1042,7 +1113,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: Current context doesn't allow for any Grease Pencil data \n");
- return p;
+ return 0;
}
else {
/* if no existing GPencil block exists, add one */
@@ -1051,8 +1122,11 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->gpd= *gpd_ptr;
}
- /* set edit flags - so that buffer will get drawn */
- G.f |= G_GREASEPENCIL;
+ if(ED_gpencil_session_active()==0) {
+ /* initialize undo stack,
+ also, existing undo stack would make buffer drawn */
+ gpencil_undo_init(p->gpd);
+ }
/* clear out buffer (stored in gp-data), in case something contaminated it */
gp_session_validatebuffer(p);
@@ -1062,6 +1136,19 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->im2d_settings.sizex= 1;
p->im2d_settings.sizey= 1;
#endif
+
+ return 1;
+}
+
+/* init new painting session */
+static tGPsdata *gp_session_initpaint (bContext *C)
+{
+ tGPsdata *p = NULL;
+
+ /* create new context data */
+ p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data");
+
+ gp_session_initdata(C, p);
/* return context data for running paint operator */
return p;
@@ -1078,6 +1165,7 @@ static void gp_session_cleanup (tGPsdata *p)
/* free stroke buffer */
if (gpd->sbuffer) {
+ //printf("\t\tGP - free sbuffer\n");
MEM_freeN(gpd->sbuffer);
gpd->sbuffer= NULL;
}
@@ -1247,7 +1335,8 @@ static void gp_paint_strokeend (tGPsdata *p)
static void gp_paint_cleanup (tGPsdata *p)
{
/* finish off a stroke */
- gp_paint_strokeend(p);
+ if(p->gpd)
+ gp_paint_strokeend(p);
/* "unlock" frame */
if (p->gpf)
@@ -1260,8 +1349,8 @@ static void gpencil_draw_exit (bContext *C, wmOperator *op)
{
tGPsdata *p= op->customdata;
- /* clear edit flags */
- G.f &= ~G_GREASEPENCIL;
+ /* clear undo stack */
+ gpencil_undo_finish();
/* restore cursor to indicate end of drawing */
WM_cursor_restore(CTX_wm_window(C));
@@ -1592,6 +1681,7 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
//printf("\tGP - hotkey invoked... waiting for click-drag\n");
}
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL, NULL);
/* add a modal handler for this operator, so that we can then draw continuous strokes */
WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -1609,16 +1699,57 @@ static int gpencil_area_exists(bContext *C, ScrArea *satest)
return 0;
}
+static tGPsdata *gpencil_stroke_begin(bContext *C, wmOperator *op)
+{
+ tGPsdata *p= op->customdata;
+
+ /* we must check that we're still within the area that we're set up to work from
+ * otherwise we could crash (see bug #20586)
+ */
+ if (CTX_wm_area(C) != p->sa) {
+ printf("\t\t\tGP - wrong area execution abort! \n");
+ p->status= GP_STATUS_ERROR;
+ }
+
+ //printf("\t\tGP - start stroke \n");
+
+ /* we may need to set up paint env again if we're resuming */
+ // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions
+ // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support
+
+ if (gp_session_initdata(C, p))
+ gp_paint_initstroke(p, p->paintmode);
+
+ p= op->customdata;
+
+ if(p->status != GP_STATUS_ERROR)
+ p->status= GP_STATUS_PAINTING;
+
+ return op->customdata;
+}
+
+static void gpencil_stroke_end(wmOperator *op)
+{
+ tGPsdata *p= op->customdata;
+
+ gp_paint_cleanup(p);
+
+ gpencil_undo_push(p->gpd);
+
+ gp_session_cleanup(p);
+
+ p->status= GP_STATUS_IDLING;
+
+ p->gpd= NULL;
+ p->gpl= NULL;
+ p->gpf= NULL;
+}
+
/* events handling during interactive drawing part of operator */
static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
{
tGPsdata *p= op->customdata;
- //int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
- /* currently, grease pencil conflicts with such operators as undo and set object mode
- which makes behavior of operator totally unpredictable and crash for some cases.
- the only way to solve this proper is to ger rid of pointers to data which can
- chage stored in operator custom data (sergey) */
- int estate = OPERATOR_RUNNING_MODAL;
+ int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
// if (event->type == NDOF_MOTION)
// return OPERATOR_PASS_THROUGH;
@@ -1646,17 +1777,24 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
if (ELEM(event->type, LEFTMOUSE, RIGHTMOUSE)) {
/* if painting, end stroke */
if (p->status == GP_STATUS_PAINTING) {
+ int sketch= 0;
/* basically, this should be mouse-button up = end stroke
* BUT what happens next depends on whether we 'painting sessions' is enabled
*/
- if (GPENCIL_SKETCH_SESSIONS_ON(p->scene)) {
+ sketch|= GPENCIL_SKETCH_SESSIONS_ON(p->scene);
+ /* polyline drawig is also 'sketching' -- all knots should be added during one session */
+ sketch|= p->paintmode == GP_PAINTMODE_DRAW_POLY;
+
+ if (sketch) {
/* end stroke only, and then wait to resume painting soon */
//printf("\t\tGP - end stroke only\n");
- gp_paint_cleanup(p);
- p->status= GP_STATUS_IDLING;
+ gpencil_stroke_end(op);
/* we've just entered idling state, so this event was processed (but no others yet) */
estate = OPERATOR_RUNNING_MODAL;
+
+ /* stroke could be smoothed, send notifier to refresh screen */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL);
}
else {
//printf("\t\tGP - end of stroke + op\n");
@@ -1664,35 +1802,19 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
estate = OPERATOR_FINISHED;
}
}
- else {
+ else if (event->val == KM_PRESS) {
/* not painting, so start stroke (this should be mouse-button down) */
- /* we must check that we're still within the area that we're set up to work from
- * otherwise we could crash (see bug #20586)
- */
- if (CTX_wm_area(C) != p->sa) {
- //printf("\t\t\tGP - wrong area execution abort! \n");
- p->status= GP_STATUS_ERROR;
+ p= gpencil_stroke_begin(C, op);
+
+ if (p->status == GP_STATUS_ERROR) {
estate = OPERATOR_CANCELLED;
}
- else {
- //printf("\t\tGP - start stroke \n");
- p->status= GP_STATUS_PAINTING;
-
- /* we may need to set up paint env again if we're resuming */
- // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions
- // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support
- gp_paint_initstroke(p, p->paintmode);
-
- if (p->status == GP_STATUS_ERROR) {
- estate = OPERATOR_CANCELLED;
- }
- }
+ } else {
+ p->status = GP_STATUS_IDLING;
}
}
-
-
/* handle mode-specific events */
if (p->status == GP_STATUS_PAINTING) {
/* handle painting mouse-movements? */
@@ -1704,7 +1826,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
/* finish painting operation if anything went wrong just now */
if (p->status == GP_STATUS_ERROR) {
- //printf("\t\t\t\tGP - add error done! \n");
+ printf("\t\t\t\tGP - add error done! \n");
estate = OPERATOR_CANCELLED;
}
else {
@@ -1721,28 +1843,6 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
estate = OPERATOR_RUNNING_MODAL;
}
}
- else if (p->status == GP_STATUS_IDLING) {
- /* standard undo/redo shouldn't be allowed to execute or else it causes crashes, so catch it here */
- // FIXME: this is a hardcoded hotkey that can't be changed
- // TODO: catch redo as well, but how?
- if (event->type == ZKEY && event->val == KM_RELEASE) {
- /* oskey = cmd key on macs as they seem to use cmd-z for undo as well? */
- if ((event->ctrl) || (event->oskey)) {
- /* just delete last stroke, which will look like undo to the end user */
- //printf("caught attempted undo event... deleting last stroke \n");
- gpencil_frame_delete_laststroke(p->gpl, p->gpf);
- /* undoing the last line can free p->gpf
- * note, could do this in a bit more of an elegant way then a search but it at least prevents a crash */
- if(BLI_findindex(&p->gpl->frames, p->gpf) == -1) {
- p->gpf= NULL;
- }
-
- /* event handled, so force refresh */
- ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
- estate = OPERATOR_RUNNING_MODAL;
- }
- }
- }
/* gpencil modal operator stores area, which can be removed while using it (like fullscreen) */
if(0==gpencil_area_exists(C, p->sa))
@@ -1778,6 +1878,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
static EnumPropertyItem prop_gpencil_drawmodes[] = {
{GP_PAINTMODE_DRAW, "DRAW", 0, "Draw Freehand", ""},
{GP_PAINTMODE_DRAW_STRAIGHT, "DRAW_STRAIGHT", 0, "Draw Straight Lines", ""},
+ {GP_PAINTMODE_DRAW_POLY, "DRAW_POLY", 0, "Dtaw Poly Line", ""},
{GP_PAINTMODE_ERASER, "ERASER", 0, "Eraser", ""},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c
new file mode 100644
index 00000000000..1154975e3cc
--- /dev/null
+++ b/source/blender/editors/gpencil/gpencil_undo.c
@@ -0,0 +1,168 @@
+/*
+ * $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) 2011 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation,
+ * Sergey Sharybin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_gpencil_types.h"
+#include "DNA_listBase.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BKE_context.h"
+#include "BKE_gpencil.h"
+
+#include "BLI_listbase.h"
+
+#include "ED_gpencil.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "gpencil_intern.h"
+
+#define MAXUNDONAME 64
+
+typedef struct bGPundonode {
+ struct bGPundonode *next, *prev;
+
+ char name[MAXUNDONAME];
+ struct bGPdata *gpd;
+} bGPundonode;
+
+static ListBase undo_nodes = {NULL, NULL};
+static bGPundonode *cur_node = NULL;
+
+int ED_gpencil_session_active(void)
+{
+ return undo_nodes.first != NULL;
+}
+
+int ED_undo_gpencil_step(bContext *C, int step, const char *name)
+{
+ bGPdata **gpd_ptr= NULL, *new_gpd= NULL;
+
+ gpd_ptr= gpencil_data_get_pointers(C, NULL);
+
+ if(step==1) { /* undo */
+ //printf("\t\tGP - undo step\n");
+ if(cur_node->prev) {
+ if(!name || strcmp(cur_node->name, name) == 0) {
+ cur_node= cur_node->prev;
+ new_gpd= cur_node->gpd;
+ }
+ }
+ }
+ else if (step==-1) {
+ //printf("\t\tGP - redo step\n");
+ if(cur_node->next) {
+ if(!name || strcmp(cur_node->name, name) == 0) {
+ cur_node= cur_node->next;
+ new_gpd= cur_node->gpd;
+ }
+ }
+ }
+
+ if(new_gpd) {
+ if(gpd_ptr) {
+ if(*gpd_ptr) {
+ bGPdata *gpd= *gpd_ptr;
+ bGPDlayer *gpl, *gpld;
+
+ free_gpencil_layers(&gpd->layers);
+
+ /* copy layers */
+ gpd->layers.first= gpd->layers.last= NULL;
+
+ for (gpl= new_gpd->layers.first; gpl; gpl= gpl->next) {
+ /* make a copy of source layer and its data */
+ gpld= gpencil_layer_duplicate(gpl);
+ BLI_addtail(&gpd->layers, gpld);
+ }
+ }
+ }
+ }
+
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void gpencil_undo_init(bGPdata *gpd)
+{
+ gpencil_undo_push(gpd);
+}
+
+void gpencil_undo_push(bGPdata *gpd)
+{
+ bGPundonode *undo_node;
+
+ //printf("\t\tGP - undo push\n");
+
+ if(cur_node) {
+ /* remove all un-done nodes from stack */
+ undo_node= cur_node->next;
+
+ while(undo_node) {
+ bGPundonode *next_node= undo_node->next;
+
+ free_gpencil_data(undo_node->gpd);
+ MEM_freeN(undo_node->gpd);
+
+ BLI_freelinkN(&undo_nodes, undo_node);
+
+ undo_node= next_node;
+ }
+ }
+
+ /* create new undo node */
+ undo_node= MEM_callocN(sizeof(bGPundonode), "gpencil undo node");
+ undo_node->gpd= gpencil_data_duplicate(gpd);
+
+ cur_node= undo_node;
+
+ BLI_addtail(&undo_nodes, undo_node);
+}
+
+void gpencil_undo_finish(void)
+{
+ bGPundonode *undo_node= undo_nodes.first;
+
+ while(undo_node) {
+ free_gpencil_data(undo_node->gpd);
+ MEM_freeN(undo_node->gpd);
+
+ undo_node= undo_node->next;
+ }
+
+ BLI_freelistN(&undo_nodes);
+
+ cur_node= NULL;
+}
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 07dcc959e32..bfd16487ae5 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -106,4 +106,8 @@ void paste_gpdata(void);
void snap_gplayer_frames(struct bGPDlayer *gpl, short mode);
void mirror_gplayer_frames(struct bGPDlayer *gpl, short mode);
+/* ------------ Grease-Pencil Undo System ------------------ */
+int ED_gpencil_session_active(void);
+int ED_undo_gpencil_step(struct bContext *C, int step, const char *name);
+
#endif /* ED_GPENCIL_H */
diff --git a/source/blender/editors/include/ED_navmesh_conversion.h b/source/blender/editors/include/ED_navmesh_conversion.h
new file mode 100644
index 00000000000..71b60cc4e4a
--- /dev/null
+++ b/source/blender/editors/include/ED_navmesh_conversion.h
@@ -0,0 +1,96 @@
+/**
+* $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 NAVMESH_CONVERSION_H
+#define NAVMESH_CONVERSION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct DerivedMesh;
+
+/* navmesh_conversion.cpp */
+bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly,
+ int &nverts, float *&verts,
+ int &ndtris, unsigned short *&dtris,
+ int& npolys, unsigned short *&dmeshes,
+ unsigned short*& polys, int *&dtrisToPolysMap,
+ int *&dtrisToTrisMap, int *&trisToFacesMap);
+
+bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts,
+ int &ntris, unsigned short *&tris, int *&trisToFacesMap,
+ int *&recastData);
+
+bool buildNavMeshData(const int nverts, const float* verts,
+ const int ntris, const unsigned short *tris,
+ const int* recastData, const int* trisToFacesMap,
+ int &ndtris, unsigned short *&dtris,
+ int &npolys, unsigned short *&dmeshes, unsigned short *&polys,
+ int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap);
+
+bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys,
+ unsigned short* polys, const unsigned short* dmeshes,
+ const float* verts, const unsigned short* dtris,
+ const int* dtrisToPolysMap);
+
+int polyNumVerts(const unsigned short* p, const int vertsPerPoly);
+bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts);
+int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx);
+float distPointToSegmentSq(const float* point, const float* a, const float* b);
+
+
+inline int bit(int a, int b)
+{
+ return (a & (1 << b)) >> b;
+}
+
+inline void intToCol(int i, float* col)
+{
+ int r = bit(i, 0) + bit(i, 3) * 2 + 1;
+ int g = bit(i, 1) + bit(i, 4) * 2 + 1;
+ int b = bit(i, 2) + bit(i, 5) * 2 + 1;
+ col[0] = 1 - r*63.0f/255.0f;
+ col[1] = 1 - g*63.0f/255.0f;
+ col[2] = 1 - b*63.0f/255.0f;
+}
+
+inline float area2(const float* a, const float* b, const float* c)
+{
+ return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]);
+}
+inline bool left(const float* a, const float* b, const float* c)
+{
+ return area2(a, b, c) < 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif //NAVMESH_CONVERSION_H
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index cc4dd6330fb..1cbf45960d3 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -39,6 +39,7 @@ struct Material;
struct Scene;
struct Tex;
struct bContext;
+struct bNodeTree;
struct bNode;
struct bNodeTree;
struct ScrArea;
@@ -47,6 +48,7 @@ struct ScrArea;
void ED_init_node_butfuncs(void);
/* node_draw.c */
+void ED_node_tree_update(struct SpaceNode *snode, struct Scene *scene);
void ED_node_changed_update(struct ID *id, struct bNode *node);
void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
@@ -57,8 +59,9 @@ void ED_node_texture_default(struct Tex *tex);
void ED_node_link_intersect_test(struct ScrArea *sa, int test);
void ED_node_link_insert(struct ScrArea *sa);
-void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
+void ED_node_update_hierarchy(struct bContext *C, struct bNodeTree *ntree);
+void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
/* node ops.c */
void ED_operatormacros_node(void);
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index c646ec55506..b451e278d47 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -136,8 +136,8 @@ void ED_setflagsLatt(struct Object *obedit, int flag);
/* object_modifier.c */
enum {
MODIFIER_APPLY_DATA=1,
- MODIFIER_APPLY_SHAPE,
-} eModifier_Apply_Mode;
+ MODIFIER_APPLY_SHAPE
+};
struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type);
int ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
diff --git a/source/blender/editors/include/ED_sequencer.h b/source/blender/editors/include/ED_sequencer.h
index cd22a5c6ca4..5be1403c97b 100644
--- a/source/blender/editors/include/ED_sequencer.h
+++ b/source/blender/editors/include/ED_sequencer.h
@@ -31,8 +31,4 @@
#define SEQ_ZOOM_FAC(szoom) ((szoom) > 0.0f)? (szoom) : ((szoom) == 0.0f)? (1.0f) : (-1.0f/(szoom))
-
-/* in space_sequencer.c, for rna update function */
-void ED_sequencer_update_view(bContext *C, int view);
-
#endif /* ED_SEQUENCER_H */
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index b4263935407..f8d0b819ac1 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -589,8 +589,8 @@ DEF_ICON(MOD_MULTIRES)
DEF_ICON(MOD_SMOKE)
DEF_ICON(MOD_SOLIDIFY)
DEF_ICON(MOD_SCREW)
+DEF_ICON(MOD_VERTEX_WEIGHT)
#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK160)
DEF_ICON(BLANK161)
DEF_ICON(BLANK162)
DEF_ICON(BLANK163)
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index ef88bb0bbb6..3e3e6da188e 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -630,7 +630,7 @@ PointerRNA uiItemFullO(uiLayout *layout, const char *opname, const char *name, i
if(!ot) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemFullO: unknown operator '%s'\n", opname);
+ RNA_warning("unknown operator '%s'", opname);
return PointerRNA_NULL;
}
@@ -737,7 +737,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
if(!ot || !ot->srna) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemsFullEnumO: %s '%s'\n", ot ? "unknown operator" : "operator missing srna", opname);
+ RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname);
return;
}
@@ -815,7 +815,7 @@ void uiItemEnumO_value(uiLayout *layout, const char *name, int icon, const char
/* pass */
}
else {
- RNA_warning("uiItemEnumO_value: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+ RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname);
return;
}
@@ -844,7 +844,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, NULL, &free);
if(item==NULL || RNA_enum_value_from_id(item, value_str, &value)==0) {
if(free) MEM_freeN(item);
- RNA_warning("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str);
+ RNA_warning("%s.%s, enum %s not found.", RNA_struct_identifier(ptr.type), propname, value_str);
return;
}
@@ -852,7 +852,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
MEM_freeN(item);
}
else {
- RNA_warning("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+ RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname);
return;
}
@@ -1059,7 +1059,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag,
if(!prop) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1072,7 +1072,7 @@ void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1087,7 +1087,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemEnumR_string: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1096,7 +1096,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
if(!RNA_enum_value_from_id(item, value, &ivalue)) {
if(free) MEM_freeN(item);
ui_item_disabled(layout, propname);
- RNA_warning("uiItemEnumR: enum property value not found: %s\n", value);
+ RNA_warning("enum property value not found: %s", value);
return;
}
@@ -1121,12 +1121,12 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname
if(!prop) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemsEnumR: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
if(RNA_property_type(prop) != PROP_ENUM) {
- RNA_warning("uiItemsEnumR: not an enum property: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("not an enum property: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
else {
@@ -1314,13 +1314,13 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- RNA_warning("uiItemPointerR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
type= RNA_property_type(prop);
if(!ELEM(type, PROP_POINTER, PROP_STRING)) {
- RNA_warning("uiItemPointerR: property %s must be a pointer or string.\n", propname);
+ RNA_warning("property %s must be a pointer or string.", propname);
return;
}
@@ -1328,11 +1328,11 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
if(!searchprop) {
- RNA_warning("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ RNA_warning("search collection property not found: %s.%s", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
else if (RNA_property_type(searchprop) != PROP_COLLECTION) {
- RNA_warning("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ RNA_warning("search collection property is not a collection type: %s.%s", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
@@ -1404,7 +1404,7 @@ static void ui_item_menu(uiLayout *layout, const char *name, int icon, uiMenuCre
if(layout->root->type == UI_LAYOUT_HEADER)
uiBlockSetEmboss(block, UI_EMBOSS);
- else if(layout->root->type == UI_LAYOUT_PANEL) {
+ else if(ELEM(layout->root->type, UI_LAYOUT_PANEL, UI_LAYOUT_TOOLBAR)) {
but->type= MENU;
but->flag |= UI_TEXT_LEFT;
}
@@ -1417,7 +1417,7 @@ void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const
mt= WM_menutype_find(menuname, FALSE);
if(mt==NULL) {
- RNA_warning("uiItemM: not found %s\n", menuname);
+ RNA_warning("not found %s", menuname);
return;
}
@@ -1526,7 +1526,7 @@ static void menu_item_enum_opname_menu(bContext *UNUSED(C), uiLayout *layout, vo
{
MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN);
+ uiLayoutSetOperatorContext(layout, lvl->opcontext);
uiItemsEnumO(layout, lvl->opname, lvl->propname);
}
@@ -1537,12 +1537,12 @@ void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname,
if(!ot) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemMenuEnumO: unknown operator '%s'\n", opname);
+ RNA_warning("unknown operator '%s'", opname);
return;
}
if(!ot->srna) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemMenuEnumO: operator missing srna '%s'\n", opname);
+ RNA_warning("operator missing srna '%s'", opname);
return;
}
@@ -1575,7 +1575,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemMenuEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 6830ed2d10a..bfe6a2f2602 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -245,7 +245,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
switch(event) {
case UI_ID_BROWSE:
case UI_ID_PIN:
- RNA_warning("warning, id event %d shouldnt come here\n", event);
+ RNA_warning("warning, id event %d shouldnt come here", event);
break;
case UI_ID_OPEN:
case UI_ID_ADD_NEW:
@@ -488,7 +488,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const
prop= RNA_struct_find_property(ptr, propname);
if(!prop || RNA_property_type(prop) != PROP_POINTER) {
- RNA_warning("uiTemplateID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -549,11 +549,11 @@ void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, co
propType= RNA_struct_find_property(ptr, proptypename);
if (!propID || RNA_property_type(propID) != PROP_POINTER) {
- RNA_warning("uiTemplateAnyID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
if (!propType || RNA_property_type(propType) != PROP_ENUM) {
- RNA_warning("uiTemplateAnyID: pointer-type property not found: %s.%s\n", RNA_struct_identifier(ptr->type), proptypename);
+ RNA_warning("pointer-type property not found: %s.%s", RNA_struct_identifier(ptr->type), proptypename);
return;
}
@@ -592,7 +592,7 @@ void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propna
/* check that properties are valid */
propPath= RNA_struct_find_property(ptr, propname);
if (!propPath || RNA_property_type(propPath) != PROP_STRING) {
- RNA_warning("uiTemplatePathBuilder: path property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("path property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -855,7 +855,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
- RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
+ RNA_warning("Expected modifier on object.");
return NULL;
}
@@ -863,7 +863,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
md= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
+ RNA_warning("expected modifier on object.");
return NULL;
}
@@ -1084,7 +1084,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
- RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
+ RNA_warning("Expected constraint on object.");
return NULL;
}
@@ -1092,7 +1092,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
con= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
+ RNA_warning("Expected constraint on object.");
return NULL;
}
@@ -1138,7 +1138,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
PointerRNA texture_ptr;
if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
- RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n");
+ RNA_warning("expected ID of type material, texture, lamp or world.");
return;
}
@@ -1844,12 +1844,14 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propn
PointerRNA cptr;
if(!prop) {
- RNA_warning("uiTemplateCurveMapping: curve property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("curve property not found: %s.%s",
+ RNA_struct_identifier(ptr->type), propname);
return;
}
if(RNA_property_type(prop) != PROP_POINTER) {
- RNA_warning("uiTemplateCurveMapping: curve is not a pointer: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("curve is not a pointer: %s.%s",
+ RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1879,7 +1881,7 @@ void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, const char *propnam
float softmin, softmax, step, precision;
if (!prop) {
- RNA_warning("uiTemplateColorWheel: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1949,7 +1951,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
prop= RNA_struct_find_property(ptr, propname);
if (!prop) {
- RNA_warning("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("layers property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1966,7 +1968,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
if(used_ptr && used_propname) {
used_prop= RNA_struct_find_property(used_ptr, used_propname);
if (!used_prop) {
- RNA_warning("uiTemplateLayer: used layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), used_propname);
+ RNA_warning("used layers property not found: %s.%s", RNA_struct_identifier(ptr->type), used_propname);
return;
}
@@ -2157,7 +2159,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
pa= block->panel;
if(!pa) {
- RNA_warning("uiTemplateList: only works inside a panel.\n");
+ RNA_warning("only works inside a panel.");
return;
}
@@ -2167,28 +2169,28 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
if(ptr->data) {
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
}
activeprop= RNA_struct_find_property(activeptr, activepropname);
if(!activeprop) {
- RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), activepropname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), activepropname);
return;
}
if(prop) {
type= RNA_property_type(prop);
if(type != PROP_COLLECTION) {
- RNA_warning("uiTemplateList: Expected collection property.\n");
+ RNA_warning("uiExpected collection property.");
return;
}
}
activetype= RNA_property_type(activeprop);
if(activetype != PROP_INT) {
- RNA_warning("uiTemplateList: Expected integer property.\n");
+ RNA_warning("expected integer property.");
return;
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 5da875356ea..d9d75c34a94 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -79,19 +79,32 @@
/* it has outline, back, and two optional tria meshes */
typedef struct uiWidgetTrias {
- int tot;
+ unsigned int tot;
float vec[32][2];
- int (*index)[3];
+ unsigned int (*index)[3];
} uiWidgetTrias;
+/* max as used by round_box__edges */
+#define WIDGET_CURVE_RESOLU 9
+#define WIDGET_SIZE_MAX (WIDGET_CURVE_RESOLU*4)
+
+enum {
+ WIDGET_TOP_LEFT= 1,
+ WIDGET_TOP_RIGHT= 2,
+ WIDGET_BOTTOM_RIGHT= 4,
+ WIDGET_BOTTOM_LEFT= 8,
+ /* just for convenience */
+ WIDGET_ALL_CORNERS= (WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT)
+};
+
typedef struct uiWidgetBase {
int totvert, halfwayvert;
- float outer_v[64][2];
- float inner_v[64][2];
- float inner_uv[64][2];
+ float outer_v[WIDGET_SIZE_MAX][2];
+ float inner_v[WIDGET_SIZE_MAX][2];
+ float inner_uv[WIDGET_SIZE_MAX][2];
short inner, outline, emboss; /* set on/off */
short shadedir;
@@ -123,7 +136,7 @@ typedef struct uiWidgetType {
/* *********************** draw data ************************** */
-static float cornervec[9][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
+static float cornervec[WIDGET_CURVE_RESOLU][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
{0.707, 0.293}, {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}, {1.0, 1.0}};
static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820},
@@ -133,7 +146,7 @@ static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820},
static float num_tria_vert[3][2]= {
{-0.352077, 0.532607}, {-0.352077, -0.549313}, {0.330000, -0.008353}};
-static int num_tria_face[1][3]= {
+static unsigned int num_tria_face[1][3]= {
{0, 1, 2}};
static float scroll_circle_vert[16][2]= {
@@ -142,7 +155,7 @@ static float scroll_circle_vert[16][2]= {
{-0.382683, -0.923880}, {0.000000, -1.000000}, {0.382684, -0.923880}, {0.707107, -0.707107},
{0.923880, -0.382684}, {1.000000, -0.000000}, {0.923880, 0.382683}, {0.707107, 0.707107}};
-static int scroll_circle_face[14][3]= {
+static unsigned int scroll_circle_face[14][3]= {
{0, 1, 2}, {2, 0, 3}, {3, 0, 15}, {3, 15, 4}, {4, 15, 14}, {4, 14, 5}, {5, 14, 13}, {5, 13, 6},
{6, 13, 12}, {6, 12, 7}, {7, 12, 11}, {7, 11, 8}, {8, 11, 10}, {8, 10, 9}};
@@ -150,13 +163,13 @@ static float menu_tria_vert[6][2]= {
{-0.41, 0.16}, {0.41, 0.16}, {0, 0.82},
{0, -0.82}, {-0.41, -0.16}, {0.41, -0.16}};
-static int menu_tria_face[2][3]= {{2, 0, 1}, {3, 5, 4}};
+static unsigned int menu_tria_face[2][3]= {{2, 0, 1}, {3, 5, 4}};
static float check_tria_vert[6][2]= {
{-0.578579, 0.253369}, {-0.392773, 0.412794}, {-0.004241, -0.328551},
{-0.003001, 0.034320}, {1.055313, 0.864744}, {0.866408, 1.026895}};
-static int check_tria_face[4][3]= {
+static unsigned int check_tria_face[4][3]= {
{3, 2, 4}, {3, 4, 5}, {1, 0, 3}, {0, 2, 3}};
GLubyte checker_stipple_sml[32*32/8] =
@@ -175,6 +188,7 @@ GLubyte checker_stipple_sml[32*32/8] =
void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3)
{
+ float tri_arr[3][2]= {{x1, y1}, {x2, y2}, {x3, y3}};
float color[4];
int j;
@@ -182,20 +196,18 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
glGetFloatv(GL_CURRENT_COLOR, color);
color[3] *= 0.125f;
glColor4fv(color);
-
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, tri_arr);
+
/* for each AA step */
for(j=0; j<8; j++) {
glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
-
- glBegin(GL_POLYGON);
- glVertex2f(x1, y1);
- glVertex2f(x2, y2);
- glVertex2f(x3, y3);
- glEnd();
-
+ glDrawArrays(GL_TRIANGLES, 0, 3);
glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
}
+ glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
}
@@ -216,7 +228,7 @@ static void widget_init(uiWidgetBase *wtb)
/* return tot */
static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int roundboxalign, float step)
{
- float vec[9][2];
+ float vec[WIDGET_CURVE_RESOLU][2];
float minx, miny, maxx, maxy;
int a, tot= 0;
@@ -231,59 +243,59 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r
maxy= rect->ymax+step;
/* mult */
- for(a=0; a<9; a++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++) {
vec[a][0]= rad*cornervec[a][0];
vec[a][1]= rad*cornervec[a][1];
}
/* start with left-top, anti clockwise */
- if(roundboxalign & 1) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & WIDGET_TOP_LEFT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx+rad-vec[a][0];
vert[tot][1]= maxy-vec[a][1];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx;
vert[tot][1]= maxy;
}
}
- if(roundboxalign & 8) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & WIDGET_BOTTOM_LEFT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx+vec[a][1];
vert[tot][1]= miny+rad-vec[a][0];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx;
vert[tot][1]= miny;
}
}
- if(roundboxalign & 4) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & WIDGET_BOTTOM_RIGHT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx-rad+vec[a][0];
vert[tot][1]= miny+vec[a][1];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx;
vert[tot][1]= miny;
}
}
- if(roundboxalign & 2) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & WIDGET_TOP_RIGHT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx-vec[a][1];
vert[tot][1]= maxy-rad+vec[a][0];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx;
vert[tot][1]= maxy;
}
@@ -294,7 +306,7 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r
/* this call has 1 extra arg to allow mask outline */
static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, float rad, float radi)
{
- float vec[9][2], veci[9][2];
+ float vec[WIDGET_CURVE_RESOLU][2], veci[WIDGET_CURVE_RESOLU][2];
float minx= rect->xmin, miny= rect->ymin, maxx= rect->xmax, maxy= rect->ymax;
float minxi= minx + 1.0f; /* boundbox inner */
float maxxi= maxx - 1.0f;
@@ -303,8 +315,10 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
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;
- const int hnum= ((roundboxalign & (1|2))==(1|2) || (roundboxalign & (4|8))==(4|8)) ? 1 : 2;
- const int vnum= ((roundboxalign & (1|8))==(1|8) || (roundboxalign & (2|4))==(2|4)) ? 1 : 2;
+ const int hnum= ((roundboxalign & (WIDGET_TOP_LEFT|WIDGET_TOP_RIGHT))==(WIDGET_TOP_LEFT|WIDGET_TOP_RIGHT) ||
+ (roundboxalign & (WIDGET_BOTTOM_RIGHT|WIDGET_BOTTOM_LEFT))==(WIDGET_BOTTOM_RIGHT|WIDGET_BOTTOM_LEFT)) ? 1 : 2;
+ const int vnum= ((roundboxalign & (WIDGET_TOP_LEFT|WIDGET_BOTTOM_LEFT))==(WIDGET_TOP_LEFT|WIDGET_BOTTOM_LEFT) ||
+ (roundboxalign & (WIDGET_TOP_RIGHT|WIDGET_BOTTOM_RIGHT))==(WIDGET_TOP_RIGHT|WIDGET_BOTTOM_RIGHT)) ? 1 : 2;
minsize= MIN2((rect->xmax-rect->xmin)*hnum, (rect->ymax-rect->ymin)*vnum);
@@ -315,7 +329,7 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
radi= 0.5f*minsize - 1.0f;
/* mult */
- for(a=0; a<9; a++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++) {
veci[a][0]= radi*cornervec[a][0];
veci[a][1]= radi*cornervec[a][1];
vec[a][0]= rad*cornervec[a][0];
@@ -323,9 +337,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
}
/* corner left-bottom */
- if(roundboxalign & 8) {
+ if(roundboxalign & WIDGET_BOTTOM_LEFT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= minxi+veci[a][1];
wt->inner_v[tot][1]= minyi+radi-veci[a][0];
@@ -350,9 +364,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
}
/* corner right-bottom */
- if(roundboxalign & 4) {
+ if(roundboxalign & WIDGET_BOTTOM_RIGHT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= maxxi-radi+veci[a][0];
wt->inner_v[tot][1]= minyi+veci[a][1];
@@ -379,9 +393,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
wt->halfwayvert= tot;
/* corner right-top */
- if(roundboxalign & 2) {
+ if(roundboxalign & WIDGET_TOP_RIGHT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= maxxi-veci[a][1];
wt->inner_v[tot][1]= maxyi-radi+veci[a][0];
@@ -406,9 +420,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
}
/* corner left-top */
- if(roundboxalign & 1) {
+ if(roundboxalign & WIDGET_TOP_LEFT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= minxi+radi-veci[a][0];
wt->inner_v[tot][1]= maxyi-veci[a][1];
@@ -433,7 +447,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
tot++;
}
-
+
+ BLI_assert(tot <= WIDGET_SIZE_MAX);
+
wt->totvert= tot;
}
@@ -516,16 +532,10 @@ static void widget_scroll_circle(uiWidgetTrias *tria, rcti *rect, float triasize
static void widget_trias_draw(uiWidgetTrias *tria)
{
- int a;
-
- glBegin(GL_TRIANGLES);
- for(a=0; a<tria->tot; a++) {
- glVertex2fv(tria->vec[ tria->index[a][0] ]);
- glVertex2fv(tria->vec[ tria->index[a][1] ]);
- glVertex2fv(tria->vec[ tria->index[a][2] ]);
- }
- glEnd();
-
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, tria->vec);
+ glDrawElements(GL_TRIANGLES, tria->tot*3, GL_UNSIGNED_INT, tria->index);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
static void widget_menu_trias(uiWidgetTrias *tria, rcti *rect)
@@ -601,19 +611,48 @@ static void round_box_shade_col4(const char col1[4], const char col2[4], const f
glColor4ubv(col);
}
-static void widgetbase_outline(uiWidgetBase *wtb)
+static void round_box_shade_col4_r(unsigned char col_r[4], const char col1[4], const char col2[4], const float fac)
+{
+ const int faci= FTOCHAR(fac);
+ const int facm= 255-faci;
+
+ col_r[0]= (faci*col1[0] + facm*col2[0])>>8;
+ col_r[1]= (faci*col1[1] + facm*col2[1])>>8;
+ col_r[2]= (faci*col1[2] + facm*col2[2])>>8;
+ col_r[3]= (faci*col1[3] + facm*col2[3])>>8;
+}
+
+static void widget_verts_to_quad_strip(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2+2][2])
{
int a;
-
- /* outline */
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->outer_v[a]);
- glVertex2fv(wtb->inner_v[a]);
+ for(a=0; a<totvert; a++) {
+ copy_v2_v2(quad_strip[a*2], wtb->outer_v[a]);
+ copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[a]);
+ }
+ copy_v2_v2(quad_strip[a*2], wtb->outer_v[0]);
+ copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[0]);
+}
+
+static void widget_verts_to_quad_strip_open(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2][2])
+{
+ int a;
+ for(a=0; a<totvert; a++) {
+ quad_strip[a*2][0]= wtb->outer_v[a][0];
+ quad_strip[a*2][1]= wtb->outer_v[a][1];
+ quad_strip[a*2+1][0]= wtb->outer_v[a][0];
+ quad_strip[a*2+1][1]= wtb->outer_v[a][1] - 1.0f;
}
- glVertex2fv(wtb->outer_v[0]);
- glVertex2fv(wtb->inner_v[0]);
- glEnd();
+}
+
+static void widgetbase_outline(uiWidgetBase *wtb)
+{
+ float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */
+ widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+ glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
@@ -626,100 +665,124 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
if(wtb->inner) {
if(wcol->shaded==0) {
if (wcol->alpha_check) {
+ float inner_v_half[WIDGET_SIZE_MAX][2];
float x_mid= 0.0f; /* used for dumb clamping of values */
/* dark checkers */
glColor4ub(UI_TRANSP_DARK, UI_TRANSP_DARK, UI_TRANSP_DARK, 255);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->inner_v[a]);
- }
- glEnd();
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
/* light checkers */
glEnable(GL_POLYGON_STIPPLE);
glColor4ub(UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, 255);
glPolygonStipple(checker_stipple_sml);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->inner_v[a]);
- }
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
glDisable(GL_POLYGON_STIPPLE);
/* alpha fill */
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4ubv((unsigned char*)wcol->inner);
- glBegin(GL_POLYGON);
+ glEnableClientState(GL_VERTEX_ARRAY);
+
for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->inner_v[a]);
x_mid += wtb->inner_v[a][0];
}
x_mid /= wtb->totvert;
- glEnd();
+
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
/* 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();
+
+ for(a=0; a<wtb->totvert; a++) {
+ inner_v_half[a][0]= MIN2(wtb->inner_v[a][0], x_mid);
+ inner_v_half[a][1]= wtb->inner_v[a][1];
+ }
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, inner_v_half);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
else {
/* simple fill */
glColor4ubv((unsigned char*)wcol->inner);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++)
- glVertex2fv(wtb->inner_v[a]);
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
}
else {
char col1[4], col2[4];
+ unsigned char col_array[WIDGET_SIZE_MAX * 4];
+ unsigned char *col_pt= col_array;
shadecolors4(col1, col2, wcol->inner, wcol->shadetop, wcol->shadedown);
glShadeModel(GL_SMOOTH);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++) {
- round_box_shade_col4(col1, col2, wtb->inner_uv[a][wtb->shadedir]);
- glVertex2fv(wtb->inner_v[a]);
+ for(a=0; a<wtb->totvert; a++, col_pt += 4) {
+ round_box_shade_col4_r(col_pt, col1, col2, wtb->inner_uv[a][wtb->shadedir]);
}
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glColorPointer(4, GL_UNSIGNED_BYTE, 0, col_array);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+
glShadeModel(GL_FLAT);
}
}
/* for each AA step */
if(wtb->outline) {
+ float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */
+ float quad_strip_emboss[WIDGET_SIZE_MAX*2][2]; /* only for emboss */
+
+ widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip);
+
+ if(wtb->emboss) {
+ widget_verts_to_quad_strip_open(wtb, wtb->halfwayvert, quad_strip_emboss);
+ }
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+
for(j=0; j<8; j++) {
glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
/* outline */
glColor4ub(wcol->outline[0], wcol->outline[1], wcol->outline[2], 32);
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->outer_v[a]);
- glVertex2fv(wtb->inner_v[a]);
- }
- glVertex2fv(wtb->outer_v[0]);
- glVertex2fv(wtb->inner_v[0]);
- glEnd();
+
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+ glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2);
/* emboss bottom shadow */
if(wtb->emboss) {
glColor4f(1.0f, 1.0f, 1.0f, 0.02f);
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<wtb->halfwayvert; a++) {
- glVertex2fv(wtb->outer_v[a]);
- glVertex2f(wtb->outer_v[a][0], wtb->outer_v[a][1]-1.0f);
- }
- glEnd();
+
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip_emboss);
+ glDrawArrays(GL_QUAD_STRIP, 0, wtb->halfwayvert*2);
}
glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
}
+
+ glDisableClientState(GL_VERTEX_ARRAY);
}
/* decoration */
@@ -1611,7 +1674,8 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float
uiWidgetBase wtb;
rcti rect1= *rect;
float alpha, alphastep;
- int step, tot, a;
+ int step, totvert;
+ float quad_strip[WIDGET_SIZE_MAX*2][2];
/* prevent tooltips to not show round shadow */
if( 2.0f*radout > 0.2f*(rect1.ymax-rect1.ymin) )
@@ -1620,31 +1684,32 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float
rect1.ymax -= 2.0f*radout;
/* inner part */
- tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & 12, 0.0f);
-
+ totvert= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT), 0.0f);
+
/* inverse linear shadow alpha */
alpha= 0.15;
alphastep= 0.67;
+ glEnableClientState(GL_VERTEX_ARRAY);
+
for(step= 1; step<=radout; step++, alpha*=alphastep) {
- round_box_shadow_edges(wtb.outer_v, &rect1, radin, 15, (float)step);
+ round_box_shadow_edges(wtb.outer_v, &rect1, radin, WIDGET_ALL_CORNERS, (float)step);
glColor4f(0.0f, 0.0f, 0.0f, alpha);
-
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<tot; a++) {
- glVertex2fv(wtb.outer_v[a]);
- glVertex2fv(wtb.inner_v[a]);
- }
- glEnd();
+
+ widget_verts_to_quad_strip_open(&wtb, totvert, quad_strip);
+
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+ glDrawArrays(GL_QUAD_STRIP, 0, totvert*2);
}
-
+
+ glDisableClientState(GL_VERTEX_ARRAY);
}
static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int direction)
{
uiWidgetBase wtb;
- int roundboxalign= 15;
+ int roundboxalign= WIDGET_ALL_CORNERS;
widget_init(&wtb);
@@ -1654,11 +1719,11 @@ static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int dir
//rect->ymax += 4.0;
}
else if (direction == UI_DOWN) {
- roundboxalign= 12;
+ roundboxalign= (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT);
rect->ymin -= 4.0;
}
else if (direction == UI_TOP) {
- roundboxalign= 3;
+ roundboxalign= WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT;
rect->ymax += 4.0;
}
@@ -2008,7 +2073,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
widget_init(&wtb);
/* fully rounded */
- round_box_edges(&wtb, 15, rect, rad);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad);
/* setup temp colors */
wcol_tmp.outline[0]= wcol_tmp.outline[1]= wcol_tmp.outline[2]= 0;
@@ -2107,17 +2172,15 @@ void ui_draw_link_bezier(rcti *rect)
if(ui_link_bezier_points(rect, coord_array, LINK_RESOL)) {
/* we can reuse the dist variable here to increment the GL curve eval amount*/
// const float dist= 1.0f/(float)LINK_RESOL; // UNUSED
- int i;
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
-
- glBegin(GL_LINE_STRIP);
- for(i=0; i<=LINK_RESOL; i++) {
- glVertex2fv(coord_array[i]);
- }
- glEnd();
-
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, coord_array);
+ glDrawArrays(GL_LINE_STRIP, 0, LINK_RESOL);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
@@ -2148,7 +2211,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
if(horizontal)
SWAP(short, wcol->shadetop, wcol->shadedown);
- round_box_edges(&wtb, 15, rect, rad);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad);
widgetbase_draw(&wtb, wcol);
/* slider */
@@ -2176,7 +2239,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
if (state & UI_SCROLL_NO_OUTLINE)
SWAP(short, outline, wtb.outline);
- round_box_edges(&wtb, 15, slider, rad);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, slider, rad);
if(state & UI_SCROLL_ARROWS) {
if(wcol->item[0] > 48) wcol->item[0]-= 48;
@@ -2343,7 +2406,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
/* left part of slider, always rounded */
rect1.xmax= rect1.xmin + ceil(offs+1.0f);
- round_box_edges(&wtb1, roundboxalign & ~6, &rect1, offs);
+ round_box_edges(&wtb1, roundboxalign & ~(WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT), &rect1, offs);
wtb1.outline= 0;
widgetbase_draw(&wtb1, wcol);
@@ -2354,7 +2417,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
offs*= (rect1.xmax + offs - rect->xmax)/offs;
else
offs= 0.0f;
- round_box_edges(&wtb1, roundboxalign & ~9, &rect1, offs);
+ round_box_edges(&wtb1, roundboxalign & ~(WIDGET_TOP_LEFT | WIDGET_BOTTOM_LEFT), &rect1, offs);
widgetbase_draw(&wtb1, wcol);
VECCOPY(wcol->outline, outline);
@@ -2436,7 +2499,7 @@ static void widget_icon_has_anim(uiBut *UNUSED(but), uiWidgetColors *wcol, rcti
wtb.outline= 0;
/* rounded */
- round_box_edges(&wtb, 15, rect, 10.0f);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 10.0f);
widgetbase_draw(&wtb, wcol);
}
}
@@ -2499,7 +2562,7 @@ static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int
widget_init(&wtb);
/* half rounded */
- round_box_edges(&wtb, 15, rect, rad);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad);
widgetbase_draw(&wtb, wcol);
}
@@ -2526,7 +2589,7 @@ static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(sta
/* rounded, but no outline */
wtb.outline= 0;
- round_box_edges(&wtb, 15, rect, 4.0f);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 4.0f);
widgetbase_draw(&wtb, wcol);
}
@@ -2550,7 +2613,7 @@ static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int UN
recttemp.ymax-= delta;
/* half rounded */
- round_box_edges(&wtb, 15, &recttemp, 4.0f);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, &recttemp, 4.0f);
/* decoration */
if(state & UI_SELECT) {
@@ -2650,12 +2713,12 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *
UI_GetThemeColor3ubv(TH_BACK, col);
glColor3ubv(col);
- round_box__edges(&wtb, 15, rect, 0.0f, 4.0);
+ round_box__edges(&wtb, WIDGET_ALL_CORNERS, rect, 0.0f, 4.0);
widgetbase_outline(&wtb);
}
/* outline */
- round_box_edges(&wtb, 15, rect, 5.0f);
+ round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 5.0f);
wtb.outline= 1;
wtb.inner= 0;
widgetbase_draw(&wtb, &wt->wcol);
@@ -2836,37 +2899,27 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
switch(but->flag & UI_BUT_ALIGN) {
case UI_BUT_ALIGN_TOP:
- return (12);
- break;
+ return WIDGET_BOTTOM_LEFT | WIDGET_BOTTOM_RIGHT;
case UI_BUT_ALIGN_DOWN:
- return (3);
- break;
+ return WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT;
case UI_BUT_ALIGN_LEFT:
- return (6);
- break;
+ return WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT;
case UI_BUT_ALIGN_RIGHT:
- return (9);
- break;
-
- case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT:
- return (1);
- break;
- case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT:
- return (2);
- break;
- case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT:
- return (8);
- break;
- case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT:
- return (4);
- break;
-
+ return WIDGET_TOP_LEFT | WIDGET_BOTTOM_LEFT;
+ case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_RIGHT:
+ return WIDGET_TOP_LEFT;
+ case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_LEFT:
+ return WIDGET_TOP_RIGHT;
+ case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_RIGHT:
+ return WIDGET_BOTTOM_LEFT;
+ case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_LEFT:
+ return WIDGET_BOTTOM_RIGHT;
default:
- return (0);
- break;
+ return 0;
}
- }
- return 15;
+ }
+
+ return WIDGET_ALL_CORNERS;
}
/* conversion from old to new buttons, so still messy */
@@ -3104,14 +3157,14 @@ void ui_draw_search_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
uiWidgetType *wt= widget_type(UI_WTYPE_BOX);
glEnable(GL_BLEND);
- widget_softshadow(rect, 15, 5.0f, 8.0f);
+ widget_softshadow(rect, WIDGET_ALL_CORNERS, 5.0f, 8.0f);
glDisable(GL_BLEND);
wt->state(wt, 0);
if(block)
- wt->draw(&wt->wcol, rect, block->flag, 15);
+ wt->draw(&wt->wcol, rect, block->flag, WIDGET_ALL_CORNERS);
else
- wt->draw(&wt->wcol, rect, 0, 15);
+ wt->draw(&wt->wcol, rect, 0, WIDGET_ALL_CORNERS);
}
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index eb6854d2548..57b31b1c84f 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -827,7 +827,7 @@ static int similar_face_select__internal(EditMesh *em, int mode, float thresh)
float angle;
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- angle= RAD2DEGF(angle_v2v2(base_efa->n, efa->n));
+ angle= RAD2DEGF(angle_v3v3(base_efa->n, efa->n));
if (angle/180.0f<=thresh) {
EM_select_face(efa, 1);
selcount++;
@@ -842,7 +842,7 @@ static int similar_face_select__internal(EditMesh *em, int mode, float thresh)
base_dot= dot_v3v3(base_efa->cent, base_efa->n);
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- angle= RAD2DEGF(angle_v2v2(base_efa->n, efa->n));
+ angle= RAD2DEGF(angle_v3v3(base_efa->n, efa->n));
if (angle/180.0f<=thresh) {
dot=dot_v3v3(efa->cent, base_efa->n);
if (fabsf(base_dot-dot) <= thresh) {
@@ -959,7 +959,7 @@ static int similar_edge_select__internal(EditMesh *em, int mode, float thresh)
else if (eed->f2==0) /* first access, assign the face */
eed->tmp.f= efa;
else if (eed->f2==1) /* second, we assign the angle*/
- eed->tmp.fp= RAD2DEGF(angle_v2v2(eed->tmp.f->n, efa->n))/180;
+ eed->tmp.fp= RAD2DEGF(angle_v3v3(eed->tmp.f->n, efa->n))/180;
eed->f2++; /* f2==0 no face assigned. f2==1 one face found. f2==2 angle calculated.*/
}
j++;
@@ -989,7 +989,7 @@ static int similar_edge_select__internal(EditMesh *em, int mode, float thresh)
for(eed= em->edges.first; eed; eed= eed->next) {
if (!(eed->f & SELECT) && !eed->h) {
sub_v3_v3v3(dir, eed->v1->co, eed->v2->co);
- angle= RAD2DEGF(angle_v2v2(base_dir, dir));
+ angle= RAD2DEGF(angle_v3v3(base_dir, dir));
if (angle>90.0f) /* use the smallest angle between the edges */
angle= fabsf(angle-180.0f);
@@ -1086,7 +1086,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
Mesh *me= obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
- int selcount = similar_edge_select__internal(em, RNA_int_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
+ int selcount = similar_edge_select__internal(em, RNA_enum_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
if (selcount) {
/* here was an edge-mode only select flush case, has to be generalized */
@@ -1159,7 +1159,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
float angle;
for(eve= em->verts.first; eve; eve= eve->next) {
if (!(eve->f & SELECT) && !eve->h) {
- angle= RAD2DEGF(angle_v2v2(base_eve->no, eve->no));
+ angle= RAD2DEGF(angle_v3v3(base_eve->no, eve->no));
if (angle/180.0f<=thresh) {
eve->f |= SELECT;
selcount++;
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 9ff2923f733..44e00ed8181 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -3234,13 +3234,13 @@ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert
normal_tri_v3( noA2,v1->co, v3->co, v4->co);
if(noA1[0] == noA2[0] && noA1[1] == noA2[1] && noA1[2] == noA2[2]) normalADiff = 0.0;
- else normalADiff = RAD2DEGF(angle_v2v2(noA1, noA2));
+ else normalADiff = RAD2DEGF(angle_v3v3(noA1, noA2));
//if(!normalADiff) normalADiff = 179;
normal_tri_v3( noB1,v2->co, v3->co, v4->co);
normal_tri_v3( noB2,v4->co, v1->co, v2->co);
if(noB1[0] == noB2[0] && noB1[1] == noB2[1] && noB1[2] == noB2[2]) normalBDiff = 0.0;
- else normalBDiff = RAD2DEGF(angle_v2v2(noB1, noB2));
+ else normalBDiff = RAD2DEGF(angle_v3v3(noB1, noB2));
//if(!normalBDiff) normalBDiff = 179;
measure += (normalADiff/360) + (normalBDiff/360);
@@ -3255,10 +3255,10 @@ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert
diff = 0.0;
diff = (
- fabsf(RAD2DEGF(angle_v2v2(edgeVec1, edgeVec2)) - 90) +
- fabsf(RAD2DEGF(angle_v2v2(edgeVec2, edgeVec3)) - 90) +
- fabsf(RAD2DEGF(angle_v2v2(edgeVec3, edgeVec4)) - 90) +
- fabsf(RAD2DEGF(angle_v2v2(edgeVec4, edgeVec1)) - 90)) / 360;
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec1, edgeVec2)) - 90) +
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec2, edgeVec3)) - 90) +
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec3, edgeVec4)) - 90) +
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec4, edgeVec1)) - 90)) / 360;
if(!diff) return 0.0;
measure += diff;
@@ -4869,7 +4869,7 @@ void mesh_set_face_flags(EditMesh *em, short mode)
/* helper to find edge for edge_rip */
static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, const int mval[2])
{
- float vec1[3], vec2[3], mvalf[2];
+ float vec1[2], vec2[2], mvalf[2];
ED_view3d_project_float(ar, co1, vec1, mat);
ED_view3d_project_float(ar, co2, vec2, mat);
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index 14b40d55f11..58ebb12e345 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -33,6 +33,7 @@ set(INC
../../render/extern/include
../../windowmanager
../../../../intern/guardedalloc
+ ../../../../extern/recastnavigation/Recast/Include
)
set(INC_SYS
@@ -58,8 +59,18 @@ set(SRC
object_intern.h
)
+if(WITH_GAMEENGINE)
+ list(APPEND SRC
+ object_navmesh.cpp
+ )
+endif()
+
if(WITH_PYTHON)
add_definitions(-DWITH_PYTHON)
endif()
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
+
blender_add_lib(bf_editor_object "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript
index ca048cb59f9..cdda16582ef 100644
--- a/source/blender/editors/object/SConscript
+++ b/source/blender/editors/object/SConscript
@@ -1,12 +1,13 @@
#!/usr/bin/python
Import ('env')
-sources = env.Glob('*.c')
+sources = env.Glob('*.c') + env.Glob('*.cpp')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc ../../blenloader'
incs += ' ../../makesrna ../../python ../../ikplugin'
incs += ' ../../render/extern/include ../../gpu' # for object_bake.c
+incs += ' #extern/recastnavigation/Recast/Include'
defs = []
@@ -19,5 +20,8 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
if env['WITH_BF_PYTHON']:
defs.append('WITH_PYTHON')
+
+if env['WITH_BF_GAMEENGINE']:
+ defs.append('WITH_GAMEENGINE')
env.BlenderLib ( 'bf_editors_object', sources, Split(incs), defs, libtype=['core'], priority=[35] )
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 266556773f0..bb32869469a 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -64,7 +64,6 @@
#include "ED_curve.h"
#include "ED_mesh.h"
-#include "ED_lattice.h"
#include "ED_screen.h"
#include "WM_types.h"
@@ -293,7 +292,7 @@ static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, flo
return totvert;
}
-static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
+static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
{
*indexar= NULL;
*tot= 0;
@@ -303,12 +302,7 @@ static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int *
case OB_MESH:
{
Mesh *me= obedit->data;
- EditMesh *em;
-
- load_editMesh(scene, obedit);
- make_editMesh(scene, obedit);
-
- em = BKE_mesh_get_editmesh(me);
+ EditMesh *em = BKE_mesh_get_editmesh(me);
/* check selected vertices first */
if( return_editmesh_indexar(em, tot, indexar, cent_r)) {
@@ -322,17 +316,10 @@ static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int *
}
case OB_CURVE:
case OB_SURF:
- load_editNurb(obedit);
- make_editNurb(obedit);
-
return return_editcurve_indexar(obedit, tot, indexar, cent_r);
case OB_LATTICE:
{
Lattice *lt= obedit->data;
-
- load_editLatt(obedit);
- make_editLatt(obedit);
-
return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r);
}
default:
@@ -440,7 +427,7 @@ static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *o
int tot, ok, *indexar;
char name[32];
- ok = object_hook_index_array(scene, obedit, &tot, &indexar, name, cent);
+ ok = object_hook_index_array(obedit, &tot, &indexar, name, cent);
if (!ok) return; // XXX error("Requires selected vertices or active Vertex Group");
@@ -773,7 +760,7 @@ static int object_hook_assign_exec(bContext *C, wmOperator *op)
/* assign functionality */
- if(!object_hook_index_array(CTX_data_scene(C), ob, &tot, &indexar, name, cent)) {
+ if(!object_hook_index_array(ob, &tot, &indexar, name, cent)) {
BKE_report(op->reports, RPT_WARNING, "Requires selected vertices or active vertex group");
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index c308d36f838..3da0723ec18 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -223,5 +223,10 @@ void OBJECT_OT_group_remove(struct wmOperatorType *ot);
/* object_bake.c */
void OBJECT_OT_bake_image(wmOperatorType *ot);
+/* object_navmesh.cpp */
+void OBJECT_OT_create_navmesh(struct wmOperatorType *ot);
+void OBJECT_OT_assign_navpolygon(struct wmOperatorType *ot);
+void OBJECT_OT_assign_new_navpolygon(struct wmOperatorType *ot);
+
#endif /* ED_OBJECT_INTERN_H */
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index c96d7c1fd10..8813b0027cd 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -1066,7 +1066,12 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
if (!mmd)
return OPERATOR_CANCELLED;
-
+
+ if(mmd->lvl==0) {
+ BKE_report(op->reports, RPT_ERROR, "Reshape can work only with higher levels of subdivisions.");
+ return OPERATOR_CANCELLED;
+ }
+
CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) {
if(selob->type == OB_MESH && selob != ob) {
secondob= selob;
diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp
new file mode 100644
index 00000000000..d0768d30236
--- /dev/null
+++ b/source/blender/editors/object/object_navmesh.cpp
@@ -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) 2004 by Blender Foundation
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
+
+#include <math.h>
+#include "Recast.h"
+
+extern "C"
+{
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_ID.h"
+
+#include "BKE_library.h"
+#include "BKE_depsgraph.h"
+#include "BKE_context.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_scene.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
+#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+#include "ED_object.h"
+#include "BLI_math_vector.h"
+
+#include "RNA_access.h"
+
+#include "ED_mesh.h"
+
+/*mesh/mesh_intern.h */
+extern struct EditVert *addvertlist(EditMesh *em, float *vec, struct EditVert *example);
+extern struct EditFace *addfacelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example, struct EditFace *exampleEdges);
+extern void free_vertlist(EditMesh *em, ListBase *edve);
+extern void free_edgelist(EditMesh *em, ListBase *lb);
+extern void free_facelist(EditMesh *em, ListBase *lb);
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+static void createVertsTrisData(bContext *C, LinkNode* obs, int& nverts, float*& verts, int &ntris, int*& tris)
+{
+ MVert *mvert;
+ int nfaces = 0, *tri, i, curnverts, basenverts, curnfaces;
+ MFace *mface;
+ float co[3], wco[3];
+ Object *ob;
+ LinkNode *oblink, *dmlink;
+ DerivedMesh *dm;
+ Scene* scene = CTX_data_scene(C);
+ LinkNode* dms = NULL;
+
+ nverts = 0;
+ ntris = 0;
+ //calculate number of verts and tris
+ for (oblink = obs; oblink; oblink = oblink->next)
+ {
+ ob = (Object*) oblink->link;
+ DerivedMesh *dm = mesh_create_derived_no_virtual(scene, ob, NULL, CD_MASK_MESH);
+ BLI_linklist_append(&dms, (void*)dm);
+
+ nverts += dm->getNumVerts(dm);
+ nfaces = dm->getNumFaces(dm);
+ ntris += nfaces;
+
+ //resolve quad faces
+ mface = dm->getFaceArray(dm);
+ for (i=0; i<nfaces; i++)
+ {
+ MFace* mf = &mface[i];
+ if (mf->v4)
+ ntris+=1;
+ }
+ }
+
+ //create data
+ verts = (float*) MEM_mallocN(sizeof(float)*3*nverts, "verts");
+ tris = (int*) MEM_mallocN(sizeof(int)*3*ntris, "faces");
+
+ basenverts = 0;
+ tri = tris;
+ for (oblink = obs, dmlink = dms; oblink && dmlink;
+ oblink = oblink->next, dmlink = dmlink->next)
+ {
+ ob = (Object*) oblink->link;
+ dm = (DerivedMesh*) dmlink->link;
+
+ curnverts = dm->getNumVerts(dm);
+ mvert = dm->getVertArray(dm);
+ //copy verts
+ for (i=0; i<curnverts; i++)
+ {
+ MVert *v = &mvert[i];
+ copy_v3_v3(co, v->co);
+ mul_v3_m4v3(wco, ob->obmat, co);
+ verts[3*(basenverts+i)+0] = wco[0];
+ verts[3*(basenverts+i)+1] = wco[2];
+ verts[3*(basenverts+i)+2] = wco[1];
+ }
+
+ //create tris
+ curnfaces = dm->getNumFaces(dm);
+ mface = dm->getFaceArray(dm);
+ for (i=0; i<curnfaces; i++)
+ {
+ MFace* mf = &mface[i];
+ tri[0]= basenverts + mf->v1; tri[1]= basenverts + mf->v3; tri[2]= basenverts + mf->v2;
+ tri += 3;
+ if (mf->v4)
+ {
+ tri[0]= basenverts + mf->v1; tri[1]= basenverts + mf->v4; tri[2]= basenverts + mf->v3;
+ tri += 3;
+ }
+ }
+ basenverts += curnverts;
+ }
+
+ //release derived mesh
+ for (dmlink = dms; dmlink; dmlink = dmlink->next)
+ {
+ dm = (DerivedMesh*) dmlink->link;
+ dm->release(dm);
+ }
+ BLI_linklist_free(dms, NULL);
+}
+
+static bool buildNavMesh(const RecastData& recastParams, int nverts, float* verts, int ntris, int* tris,
+ rcPolyMesh*& pmesh, rcPolyMeshDetail*& dmesh)
+{
+ float bmin[3], bmax[3];
+ rcHeightfield* solid;
+ unsigned char *triflags;
+ rcCompactHeightfield* chf;
+ rcContourSet *cset;
+
+ rcCalcBounds(verts, nverts, bmin, bmax);
+
+ //
+ // Step 1. Initialize build config.
+ //
+ rcConfig cfg;
+ memset(&cfg, 0, sizeof(cfg));
+ {
+/*
+ float cellsize = 0.3f;
+ float cellheight = 0.2f;
+ float agentmaxslope = M_PI/4;
+ float agentmaxclimb = 0.9f;
+ float agentheight = 2.0f;
+ float agentradius = 0.6f;
+ float edgemaxlen = 12.0f;
+ float edgemaxerror = 1.3f;
+ float regionminsize = 50.f;
+ float regionmergesize = 20.f;
+ int vertsperpoly = 6;
+ float detailsampledist = 6.0f;
+ float detailsamplemaxerror = 1.0f;
+ cfg.cs = cellsize;
+ cfg.ch = cellheight;
+ cfg.walkableSlopeAngle = agentmaxslope/M_PI*180.f;
+ cfg.walkableHeight = (int)ceilf(agentheight/ cfg.ch);
+ cfg.walkableClimb = (int)floorf(agentmaxclimb / cfg.ch);
+ cfg.walkableRadius = (int)ceilf(agentradius / cfg.cs);
+ cfg.maxEdgeLen = (int)(edgemaxlen/cellsize);
+ cfg.maxSimplificationError = edgemaxerror;
+ cfg.minRegionSize = (int)rcSqr(regionminsize);
+ cfg.mergeRegionSize = (int)rcSqr(regionmergesize);
+ cfg.maxVertsPerPoly = vertsperpoly;
+ cfg.detailSampleDist = detailsampledist< 0.9f ? 0 : cellsize * detailsampledist;
+ cfg.detailSampleMaxError = cellheight * detailsamplemaxerror;
+*/
+ cfg.cs = recastParams.cellsize;
+ cfg.ch = recastParams.cellheight;
+ cfg.walkableSlopeAngle = recastParams.agentmaxslope/((float)M_PI)*180.f;
+ cfg.walkableHeight = (int)ceilf(recastParams.agentheight/ cfg.ch);
+ cfg.walkableClimb = (int)floorf(recastParams.agentmaxclimb / cfg.ch);
+ cfg.walkableRadius = (int)ceilf(recastParams.agentradius / cfg.cs);
+ cfg.maxEdgeLen = (int)(recastParams.edgemaxlen/recastParams.cellsize);
+ cfg.maxSimplificationError = recastParams.edgemaxerror;
+ cfg.minRegionSize = (int)rcSqr(recastParams.regionminsize);
+ cfg.mergeRegionSize = (int)rcSqr(recastParams.regionmergesize);
+ cfg.maxVertsPerPoly = recastParams.vertsperpoly;
+ cfg.detailSampleDist = recastParams.detailsampledist< 0.9f ? 0 :
+ recastParams.cellsize * recastParams.detailsampledist;
+ cfg.detailSampleMaxError = recastParams.cellheight * recastParams.detailsamplemaxerror;
+
+ }
+
+ // Set the area where the navigation will be build.
+ vcopy(cfg.bmin, bmin);
+ vcopy(cfg.bmax, bmax);
+ rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height);
+
+ //
+ // Step 2. Rasterize input polygon soup.
+ //
+ // Allocate voxel heightfield where we rasterize our input data to.
+ solid = new rcHeightfield;
+ if (!solid)
+ return false;
+
+ if (!rcCreateHeightfield(*solid, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch))
+ return false;
+
+ // Allocate array that can hold triangle flags.
+ triflags = (unsigned char*) MEM_mallocN(sizeof(unsigned char)*ntris, "triflags");
+ if (!triflags)
+ return false;
+ // Find triangles which are walkable based on their slope and rasterize them.
+ memset(triflags, 0, ntris*sizeof(unsigned char));
+ rcMarkWalkableTriangles(cfg.walkableSlopeAngle, verts, nverts, tris, ntris, triflags);
+ rcRasterizeTriangles(verts, nverts, tris, triflags, ntris, *solid);
+ MEM_freeN(triflags);
+ MEM_freeN(verts);
+ MEM_freeN(tris);
+
+ //
+ // Step 3. Filter walkables surfaces.
+ //
+ rcFilterLedgeSpans(cfg.walkableHeight, cfg.walkableClimb, *solid);
+ rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid);
+
+ //
+ // Step 4. Partition walkable surface to simple regions.
+ //
+
+ chf = new rcCompactHeightfield;
+ if (!chf)
+ return false;
+ if (!rcBuildCompactHeightfield(cfg.walkableHeight, cfg.walkableClimb, RC_WALKABLE, *solid, *chf))
+ return false;
+
+ delete solid;
+
+ // Prepare for region partitioning, by calculating distance field along the walkable surface.
+ if (!rcBuildDistanceField(*chf))
+ return false;
+
+ // Partition the walkable surface into simple regions without holes.
+ if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize))
+ return false;
+
+ //
+ // Step 5. Trace and simplify region contours.
+ //
+ // Create contours.
+ cset = new rcContourSet;
+ if (!cset)
+ return false;
+
+ if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset))
+ return false;
+
+ //
+ // Step 6. Build polygons mesh from contours.
+ //
+ pmesh = new rcPolyMesh;
+ if (!pmesh)
+ return false;
+ if (!rcBuildPolyMesh(*cset, cfg.maxVertsPerPoly, *pmesh))
+ return false;
+
+
+ //
+ // Step 7. Create detail mesh which allows to access approximate height on each polygon.
+ //
+
+ dmesh = new rcPolyMeshDetail;
+ if (!dmesh)
+ return false;
+
+ if (!rcBuildPolyMeshDetail(*pmesh, *chf, cfg.detailSampleDist, cfg.detailSampleMaxError, *dmesh))
+ return false;
+
+ delete chf;
+ delete cset;
+
+ return true;
+}
+
+static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshDetail*& dmesh, Base* base)
+{
+ float co[3], rot[3];
+ EditMesh *em;
+ int i,j, k;
+ unsigned short* v;
+ int face[3];
+ Main *bmain = CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ Object* obedit;
+ int createob = base==NULL;
+ zero_v3(co);
+ zero_v3(rot);
+ if (createob)
+ {
+ //create new object
+ obedit = ED_object_add_type(C, OB_MESH, co, rot, FALSE, 1);
+ }
+ else
+ {
+ obedit = base->object;
+ scene_select_base(scene, base);
+ copy_v3_v3(obedit->loc, co);
+ copy_v3_v3(obedit->rot, rot);
+ }
+
+ ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER);
+ em = BKE_mesh_get_editmesh(((Mesh *)obedit->data));
+
+ if (!createob)
+ {
+ //clear
+ if(em->verts.first) free_vertlist(em, &em->verts);
+ if(em->edges.first) free_edgelist(em, &em->edges);
+ if(em->faces.first) free_facelist(em, &em->faces);
+ if(em->selected.first) BLI_freelistN(&(em->selected));
+ }
+
+ //create verts for polygon mesh
+ for(i = 0; i < pmesh->nverts; i++) {
+ v = &pmesh->verts[3*i];
+ co[0] = pmesh->bmin[0] + v[0]*pmesh->cs;
+ co[1] = pmesh->bmin[1] + v[1]*pmesh->ch;
+ co[2] = pmesh->bmin[2] + v[2]*pmesh->cs;
+ SWAP(float, co[1], co[2]);
+ addvertlist(em, co, NULL);
+ }
+
+ //create custom data layer to save polygon idx
+ CustomData_add_layer_named(&em->fdata, CD_RECAST, CD_CALLOC, NULL, 0, "recastData");
+
+ //create verts and faces for detailed mesh
+ for (i=0; i<dmesh->nmeshes; i++)
+ {
+ int uniquevbase = em->totvert;
+ unsigned short vbase = dmesh->meshes[4*i+0];
+ unsigned short ndv = dmesh->meshes[4*i+1];
+ unsigned short tribase = dmesh->meshes[4*i+2];
+ unsigned short trinum = dmesh->meshes[4*i+3];
+ const unsigned short* p = &pmesh->polys[i*pmesh->nvp*2];
+ int nv = 0;
+ for (j = 0; j < pmesh->nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ nv++;
+ }
+ //create unique verts
+ for (j=nv; j<ndv; j++)
+ {
+ copy_v3_v3(co, &dmesh->verts[3*(vbase + j)]);
+ SWAP(float, co[1], co[2]);
+ addvertlist(em, co, NULL);
+ }
+
+ EM_init_index_arrays(em, 1, 0, 0);
+
+ //create faces
+ for (j=0; j<trinum; j++)
+ {
+ unsigned char* tri = &dmesh->tris[4*(tribase+j)];
+ EditFace* newFace;
+ for (k=0; k<3; k++)
+ {
+ if (tri[k]<nv)
+ face[k] = p[tri[k]]; //shared vertex
+ else
+ face[k] = uniquevbase+tri[k]-nv; //unique vertex
+ }
+ newFace = addfacelist(em, EM_get_vert_for_index(face[0]), EM_get_vert_for_index(face[2]),
+ EM_get_vert_for_index(face[1]), NULL, NULL, NULL);
+
+ //set navigation polygon idx to the custom layer
+ int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_RECAST);
+ *polygonIdx = i+1; //add 1 to avoid zero idx
+ }
+
+ EM_free_index_arrays();
+ }
+
+ delete pmesh; pmesh = NULL;
+ delete dmesh; dmesh = NULL;
+
+ BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
+
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ if (createob)
+ {
+ obedit->gameflag &= ~OB_COLLISION;
+ obedit->gameflag |= OB_NAVMESH;
+ obedit->body_type = OB_BODY_TYPE_NAVMESH;
+ rename_id((ID *)obedit, "Navmesh");
+ }
+
+ ModifierData *md= modifiers_findByType(obedit, eModifierType_NavMesh);
+ if (!md)
+ {
+ ED_object_modifier_add(NULL, bmain, scene, obedit, NULL, eModifierType_NavMesh);
+ }
+
+ return obedit;
+}
+
+static int create_navmesh_exec(bContext *C, wmOperator *op)
+{
+ Scene* scene = CTX_data_scene(C);
+ int nverts, ntris;
+ float* verts;
+ int* tris;
+ rcPolyMesh* pmesh;
+ rcPolyMeshDetail* dmesh;
+ LinkNode* obs = NULL;
+ Base* navmeshBase = NULL;
+ //CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) //expand macros to avoid error in convertion from void*
+ {
+ ListBase ctx_data_list;
+ CollectionPointerLink *ctx_link;
+ CTX_data_selected_editable_bases(C, &ctx_data_list);
+ for(ctx_link = (CollectionPointerLink *)ctx_data_list.first;
+ ctx_link; ctx_link = (CollectionPointerLink *)ctx_link->next) {
+ Base* base= (Base*)ctx_link->ptr.data;
+ {
+ if (base->object->body_type==OB_BODY_TYPE_NAVMESH)
+ {
+ if (!navmeshBase || base==CTX_data_active_base(C))
+ navmeshBase = base;
+ }
+ else
+ BLI_linklist_append(&obs, (void*)base->object);
+ }
+ CTX_DATA_END;
+ createVertsTrisData(C, obs, nverts, verts, ntris, tris);
+ BLI_linklist_free(obs, NULL);
+ buildNavMesh(scene->gm.recastData, nverts, verts, ntris, tris, pmesh, dmesh);
+ createRepresentation(C, pmesh, dmesh, navmeshBase);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_create_navmesh(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Create navigation mesh";
+ ot->description= "Create navigation mesh for selected objects";
+ ot->idname= "OBJECT_OT_create_navmesh";
+
+ /* api callbacks */
+ ot->exec= create_navmesh_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int assign_navpolygon_poll(bContext *C)
+{
+ Object *ob= (Object *)CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ if (!ob || !ob->data)
+ return 0;
+ return (((Mesh*)ob->data)->edit_mesh != NULL);
+}
+
+static int assign_navpolygon_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+
+ //do work here
+ int targetPolyIdx = -1;
+ EditFace *ef, *efa;
+ efa = EM_get_actFace(em, 0);
+ if (efa)
+ {
+ if (CustomData_has_layer(&em->fdata, CD_RECAST))
+ {
+ targetPolyIdx = *(int*)CustomData_em_get(&em->fdata, efa->data, CD_RECAST);
+ targetPolyIdx = targetPolyIdx>=0? targetPolyIdx : -targetPolyIdx;
+ if (targetPolyIdx>0)
+ {
+ //set target poly idx to other selected faces
+ ef = (EditFace*)em->faces.last;
+ while(ef)
+ {
+ if((ef->f & SELECT )&& ef!=efa)
+ {
+ int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
+ *recastDataBlock = targetPolyIdx;
+ }
+ ef = ef->prev;
+ }
+ }
+ }
+ }
+
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_assign_navpolygon(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Assign polygon index";
+ ot->description= "Assign polygon index to face by active face";
+ ot->idname= "OBJECT_OT_assign_navpolygon";
+
+ /* api callbacks */
+ ot->poll = assign_navpolygon_poll;
+ ot->exec= assign_navpolygon_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int compare(const void * a, const void * b){
+ return ( *(int*)a - *(int*)b );
+}
+static int findFreeNavPolyIndex(EditMesh* em)
+{
+ //construct vector of indices
+ int numfaces = em->totface;
+ int* indices = new int[numfaces];
+ EditFace* ef = (EditFace*)em->faces.last;
+ int idx = 0;
+ while(ef)
+ {
+ int polyIdx = *(int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
+ indices[idx] = polyIdx;
+ idx++;
+ ef = ef->prev;
+ }
+ qsort(indices, numfaces, sizeof(int), compare);
+ //search first free index
+ int freeIdx = 1;
+ for (int i=0; i<numfaces; i++)
+ {
+ if (indices[i]==freeIdx)
+ freeIdx++;
+ else if (indices[i]>freeIdx)
+ break;
+ }
+ delete indices;
+ return freeIdx;
+}
+
+static int assign_new_navpolygon_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+
+ EditFace *ef;
+ if (CustomData_has_layer(&em->fdata, CD_RECAST))
+ {
+ int targetPolyIdx = findFreeNavPolyIndex(em);
+ if (targetPolyIdx>0)
+ {
+ //set target poly idx to selected faces
+ ef = (EditFace*)em->faces.last;
+ while(ef)
+ {
+ if(ef->f & SELECT )
+ {
+ int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
+ *recastDataBlock = targetPolyIdx;
+ }
+ ef = ef->prev;
+ }
+ }
+ }
+
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_assign_new_navpolygon(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Assign new polygon index";
+ ot->description= "Assign new polygon index to face";
+ ot->idname= "OBJECT_OT_assign_new_navpolygon";
+
+ /* api callbacks */
+ ot->poll = assign_navpolygon_poll;
+ ot->exec= assign_new_navpolygon_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 8f00f923b84..5eb17268d19 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -212,8 +212,15 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_bake_image);
WM_operatortype_append(OBJECT_OT_drop_named_material);
+
+#ifdef WITH_GAMEENGINE
+ WM_operatortype_append(OBJECT_OT_create_navmesh);
+ WM_operatortype_append(OBJECT_OT_assign_navpolygon);
+ WM_operatortype_append(OBJECT_OT_assign_new_navpolygon);
+#endif
}
+
void ED_operatormacros_object(void)
{
wmOperatorType *ot;
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index b9208e778c7..e9418ca9f9f 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -91,8 +91,6 @@
#include "ED_armature.h"
#include "ED_curve.h"
-#include "ED_lattice.h"
-#include "ED_mesh.h"
#include "ED_keyframing.h"
#include "ED_object.h"
#include "ED_screen.h"
@@ -124,12 +122,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
if(obedit->type==OB_MESH) {
Mesh *me= obedit->data;
- EditMesh *em;
-
- load_editMesh(scene, obedit);
- make_editMesh(scene, obedit);
-
- em = BKE_mesh_get_editmesh(me);
+ EditMesh *em = BKE_mesh_get_editmesh(me);
eve= em->verts.first;
while(eve) {
@@ -147,12 +140,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(me, em);
}
else if(ELEM(obedit->type, OB_SURF, OB_CURVE)) {
- ListBase *editnurb;
-
- load_editNurb(obedit);
- make_editNurb(obedit);
-
- editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= curve_get_editcurve(obedit);
cu= obedit->data;
@@ -192,13 +180,8 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
}
}
else if(obedit->type==OB_LATTICE) {
- Lattice *lt;
-
- load_editLatt(obedit);
- make_editLatt(obedit);
-
- lt= obedit->data;
-
+ Lattice *lt= obedit->data;
+
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
bp= lt->editlatt->latt->def;
while(a--) {
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index cb1fc7541d0..8fdd7a53e91 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -121,6 +121,20 @@ void ED_base_object_activate(bContext *C, Base *base)
/********************** Selection Operators **********************/
+static int objects_selectable_poll(bContext *C)
+{
+ /* we don't check for linked scenes here, selection is
+ still allowed then for inspection of scene */
+ Object *obact= CTX_data_active_object(C);
+
+ if(CTX_data_edit_object(C))
+ return 0;
+ if(obact && obact->mode)
+ return 0;
+
+ return 1;
+}
+
/************************ Select by Type *************************/
static int object_select_by_type_exec(bContext *C, wmOperator *op)
@@ -159,7 +173,7 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_by_type_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -341,7 +355,7 @@ void OBJECT_OT_select_linked(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_linked_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -667,7 +681,7 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_grouped_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -716,7 +730,7 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot)
/* api callbacks */
/*ot->invoke = XXX - need a int grid popup*/
ot->exec= object_select_by_layer_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -754,7 +768,7 @@ void OBJECT_OT_select_inverse(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_inverse_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -815,7 +829,7 @@ void OBJECT_OT_select_all(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_all_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -864,7 +878,7 @@ void OBJECT_OT_select_same_group(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_same_group_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -917,7 +931,7 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_mirror_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -974,7 +988,7 @@ void OBJECT_OT_select_name(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_name_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1022,7 +1036,7 @@ void OBJECT_OT_select_random(wmOperatorType *ot)
/* api callbacks */
/*ot->invoke= object_select_random_invoke XXX - need a number popup ;*/
ot->exec = object_select_random_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 66a67d7c4f2..62fdfc140df 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1732,14 +1732,16 @@ static void SCREEN_OT_region_scale(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
static int frame_offset_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
int delta;
delta = RNA_int_get(op->ptr, "delta");
- CTX_data_scene(C)->r.cfra += delta;
- CTX_data_scene(C)->r.subframe = 0.f;
+ scene->r.cfra += delta;
+ scene->r.subframe = 0.f;
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C));
@@ -1764,6 +1766,7 @@ static void SCREEN_OT_frame_offset(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
static int frame_jump_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
wmTimer *animtimer= CTX_wm_screen(C)->animtimer;
@@ -1787,7 +1790,7 @@ static int frame_jump_exec(bContext *C, wmOperator *op)
else
CFRA= PSFRA;
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
}
@@ -1816,6 +1819,7 @@ static void SCREEN_OT_frame_jump(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
static int keyframe_jump_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
bDopeSheet ads= {NULL};
@@ -1870,7 +1874,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
/* free temp stuff */
BLI_dlrbTree_free(&keys);
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
@@ -2796,6 +2800,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e
bScreen *screen= CTX_wm_screen(C);
if(screen->animtimer && screen->animtimer==event->customdata) {
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
wmTimer *wt= screen->animtimer;
ScreenAnimData *sad= wt->customdata;
@@ -2872,7 +2877,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e
}
if (sad->flag & ANIMPLAY_FLAG_JUMPED)
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
/* since we follow drawflags, we can't send notifier but tag regions ourselves */
ED_update_for_newframe(CTX_data_main(C), scene, screen, 1);
@@ -3480,8 +3485,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1);
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1);
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_CTRL|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);
WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", UPARROWKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "next", 0);
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index d69c1d9c447..79a3251cdf1 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -60,6 +60,7 @@
#include "DNA_brush_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
@@ -4663,7 +4664,7 @@ static void paint_brush_init_tex(Brush *brush)
if(brush) {
MTex *mtex= &brush->mtex;
if(mtex->tex && mtex->tex->nodetree)
- ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+ ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */
}
}
@@ -4805,7 +4806,7 @@ static void paint_brush_exit_tex(Brush *brush)
if(brush) {
MTex *mtex= &brush->mtex;
if(mtex->tex && mtex->tex->nodetree)
- ntreeEndExecTree(mtex->tex->nodetree);
+ ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1);
}
}
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 09873566d4a..9500c7f663c 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -322,8 +322,8 @@ static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
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);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
}
return 1;
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 2ee49f71a78..ced3dd00a9c 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -48,6 +48,7 @@
#include "BLI_rand.h"
#include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
@@ -3273,7 +3274,7 @@ static void sculpt_brush_init_tex(Sculpt *sd, SculptSession *ss)
/* init mtex nodes */
if(mtex->tex && mtex->tex->nodetree)
- ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+ ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */
/* TODO: Shouldn't really have to do this at the start of every
stroke, but sculpt would need some sort of notification when
@@ -3454,7 +3455,7 @@ static void sculpt_brush_exit_tex(Sculpt *sd)
MTex *mtex= &brush->mtex;
if(mtex->tex && mtex->tex->nodetree)
- ntreeEndExecTree(mtex->tex->nodetree);
+ ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1);
}
static void sculpt_stroke_done(bContext *C, struct PaintStroke *UNUSED(stroke))
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index 70884d47c23..72dbbd9da9a 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -119,7 +119,7 @@ static int open_exec(bContext *C, wmOperator *op)
info = AUD_getInfo(sound->playback_handle);
if (info.specs.channels == AUD_CHANNELS_INVALID) {
- sound_delete(C, sound);
+ sound_delete(bmain, sound);
if(op->customdata) MEM_freeN(op->customdata);
BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index 0d7cdf94bc7..46918407447 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -41,6 +41,7 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_main.h"
#include "BKE_sound.h"
#include "UI_view2d.h"
@@ -70,6 +71,7 @@
/* Set the new frame number */
static void graphview_cursor_apply(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
SpaceIpo *sipo= CTX_wm_space_graph(C);
@@ -78,7 +80,7 @@ static void graphview_cursor_apply(bContext *C, wmOperator *op)
*/
CFRA= RNA_int_get(op->ptr, "frame");
SUBFRA=0.f;
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
/* set the cursor value */
sipo->cursorVal= RNA_float_get(op->ptr, "value");
diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c
index 638bfe57608..60e9595b77a 100644
--- a/source/blender/editors/space_logic/logic_ops.c
+++ b/source/blender/editors/space_logic/logic_ops.c
@@ -322,7 +322,7 @@ static void LOGIC_OT_sensor_add(wmOperatorType *ot)
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");
+ ot->prop= 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");
@@ -437,7 +437,7 @@ static void LOGIC_OT_controller_add(wmOperatorType *ot)
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");
+ ot->prop= 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");
}
@@ -539,7 +539,7 @@ static void LOGIC_OT_actuator_add(wmOperatorType *ot)
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");
+ ot->prop= 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");
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c
index 920e93cc0fc..43a8747e942 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -718,6 +718,8 @@ static const char *actuator_name(int type)
return "State";
case ACT_ARMATURE:
return "Armature";
+ case ACT_STEERING:
+ return "Steering";
}
return "unknown";
}
@@ -3989,40 +3991,6 @@ static void draw_actuator_game(uiLayout *layout, PointerRNA *ptr)
uiItemR(layout, ptr, "filename", 0, NULL, ICON_NONE);
}
-/* The IPO/Fcurve actuator has been deprecated, so this is no longer used */
-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, "", ICON_NONE);
- subrow= uiLayoutRow(row, 1);
- uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
- uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
-
- 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, ICON_NONE);
-
- row= uiLayoutRow(layout, 0);
- if((RNA_enum_get(ptr, "play_type") == ACT_IPO_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
-
- else {
- uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NONE);
- uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NONE);
- }
- uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NONE);
-
- row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NONE);
-}
-
static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C)
{
Object *ob;
@@ -4379,6 +4347,48 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr)
uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NONE);
}
+static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *row;
+ uiLayout *col;
+
+ uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "target", 0, NULL, 0);
+ uiItemR(layout, ptr, "navmesh", 0, NULL, 0);
+
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "distance", 0, NULL, 0);
+ uiItemR(row, ptr, "velocity", 0, NULL, 0);
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "acceleration", 0, NULL, 0);
+ uiItemR(row, ptr, "turn_speed", 0, NULL, 0);
+
+ row = uiLayoutRow(layout, 0);
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "facing", 0, NULL, 0);
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "facing_axis", 0, NULL, 0);
+ if (!RNA_boolean_get(ptr, "facing"))
+ {
+ uiLayoutSetActive(col, 0);
+ }
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "normal_up", 0, NULL, 0);
+ if (!RNA_pointer_get(ptr, "navmesh").data)
+ {
+ uiLayoutSetActive(col, 0);
+ }
+
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "self_terminated", 0, NULL, 0);
+ if (RNA_enum_get(ptr, "mode")==ACT_STEERING_PATHFOLLOWING)
+ {
+ uiItemR(row, ptr, "update_period", 0, NULL, 0);
+ row = uiLayoutRow(layout, 0);
+ }
+ uiItemR(row, ptr, "show_visualization", 0, NULL, 0);
+}
+
static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
{
uiLayout *box;
@@ -4440,6 +4450,8 @@ static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
case ACT_VISIBILITY:
draw_actuator_visibility(box, ptr);
break;
+ case ACT_STEERING:
+ draw_actuator_steering(box, ptr);
}
}
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 0474d1f3bb1..623855485d7 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -53,9 +53,10 @@
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_node.h"
-#include "CMP_node.h"
-#include "SHD_node.h"
+#include "NOD_composite.h"
+#include "NOD_shader.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -81,6 +82,141 @@
#include "node_intern.h"
+// XXX interface.h
+extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
+
+/* ****************** SOCKET BUTTON DRAW FUNCTIONS ***************** */
+
+static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v)
+{
+ SpaceNode *snode= snode_v;
+
+ if(snode->treetype==NTREE_SHADER) {
+ nodeShaderSynchronizeID(node_v, 1);
+ // allqueue(REDRAWBUTSSHADING, 0);
+ }
+}
+
+void node_socket_button_default(const bContext *C, uiBlock *block,
+ bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+ const char *name, int x, int y, int width)
+{
+ PointerRNA ptr;
+ uiBut *bt;
+
+ RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+
+ bt = uiDefButR(block, NUM, B_NODE_EXEC, name,
+ x, y+1, width, NODE_DY-2,
+ &ptr, "default_value", 0, 0, 0, -1, -1, NULL);
+ if (node)
+ uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node);
+}
+
+typedef struct SocketComponentMenuArgs {
+ PointerRNA ptr;
+ int x, y, width;
+ uiButHandleFunc cb;
+ void *arg1, *arg2;
+} SocketComponentMenuArgs;
+/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
+static uiBlock *socket_component_menu(bContext *C, ARegion *ar, void *args_v)
+{
+ SocketComponentMenuArgs *args= (SocketComponentMenuArgs*)args_v;
+ uiBlock *block;
+ uiLayout *layout;
+
+ block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
+ uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
+
+ layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, NODE_DY, U.uistyles.first), 0);
+
+ uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE);
+
+ return block;
+}
+void node_socket_button_components(const bContext *C, uiBlock *block,
+ bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+ const char *name, int x, int y, int width)
+{
+ PointerRNA ptr;
+ SocketComponentMenuArgs *args;
+
+ RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+
+ args= MEM_callocN(sizeof(SocketComponentMenuArgs), "SocketComponentMenuArgs");
+
+ args->ptr = ptr;
+ args->x = x;
+ args->y = y;
+ args->width = width;
+ args->cb = node_sync_cb;
+ args->arg1 = CTX_wm_space_node(C);
+ args->arg2 = node;
+
+ uiDefBlockButN(block, socket_component_menu, args, name, x, y+1, width, NODE_DY-2, "");
+}
+
+void node_socket_button_color(const bContext *C, uiBlock *block,
+ bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+ const char *name, int x, int y, int width)
+{
+ PointerRNA ptr;
+ uiBut *bt;
+ int labelw= width - 40;
+
+ RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+
+ bt=uiDefButR(block, COL, B_NODE_EXEC, "",
+ x, y+2, (labelw>0 ? 40 : width), NODE_DY-2,
+ &ptr, "default_value", 0, 0, 0, -1, -1, NULL);
+ if (node)
+ uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node);
+
+ if (name[0]!='\0' && labelw>0)
+ uiDefBut(block, LABEL, 0, name, x + 40, y+2, labelw, NODE_DY-2, NULL, 0, 0, 0, 0, "");
+}
+
+/* ****************** BASE DRAW FUNCTIONS FOR NEW OPERATOR NODES ***************** */
+
+void node_draw_socket_new(bNodeSocket *sock, float size)
+{
+ float x=sock->locx, y=sock->locy;
+
+ /* 16 values of sin function */
+ static float si[16] = {
+ 0.00000000f, 0.39435585f,0.72479278f,0.93775213f,
+ 0.99871650f,0.89780453f,0.65137248f,0.29936312f,
+ -0.10116832f,-0.48530196f,-0.79077573f,-0.96807711f,
+ -0.98846832f,-0.84864425f,-0.57126821f,-0.20129852f
+ };
+ /* 16 values of cos function */
+ static float co[16] ={
+ 1.00000000f,0.91895781f,0.68896691f,0.34730525f,
+ -0.05064916f,-0.44039415f,-0.75875812f,-0.95413925f,
+ -0.99486932f,-0.87434661f,-0.61210598f,-0.25065253f,
+ 0.15142777f,0.52896401f,0.82076344f,0.97952994f,
+ };
+ int a;
+
+ glColor3ub(180, 180, 180);
+
+ glBegin(GL_POLYGON);
+ for(a=0; a<16; a++)
+ glVertex2f(x+size*si[a], y+size*co[a]);
+ glEnd();
+
+ glColor4ub(0, 0, 0, 150);
+ glEnable(GL_BLEND);
+ glEnable( GL_LINE_SMOOTH );
+ glBegin(GL_LINE_LOOP);
+ for(a=0; a<16; a++)
+ glVertex2f(x+size*si[a], y+size*co[a]);
+ glEnd();
+ glDisable( GL_LINE_SMOOTH );
+ glDisable(GL_BLEND);
+}
+
/* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
static void node_buts_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -192,11 +328,12 @@ static void node_buts_normal(uiLayout *layout, bContext *UNUSED(C), PointerRNA *
bNode *node= ptr->data;
rctf *butr= &node->butr;
bNodeSocket *sock= node->outputs.first; /* first socket stores normal */
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
uiBut *bt;
bt= uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
(short)butr->xmin, (short)butr->xmin, butr->xmax-butr->xmin, butr->xmax-butr->xmin,
- sock->ns.vec, 0.0f, 1.0f, 0, 0, "");
+ nor, 0.0f, 1.0f, 0, 0, "");
uiButSetFunc(bt, node_normal_cb, ntree, node);
}
#if 0 // not used in 2.5x yet
@@ -287,6 +424,469 @@ static void node_buts_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *pt
uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
}
+static int node_resize_area_default(bNode *node, int x, int y)
+{
+ if (node->flag & NODE_HIDDEN) {
+ rctf totr= node->totr;
+ /* right part of node */
+ totr.xmin= node->totr.xmax-20.0f;
+ return BLI_in_rctf(&totr, x, y);
+ }
+ else {
+ /* rect we're interested in is just the bottom right corner */
+ rctf totr= node->totr;
+ /* bottom right corner */
+ totr.xmin= totr.xmax-10.0f;
+ totr.ymax= totr.ymin+10.0f;
+ return BLI_in_rctf(&totr, x, y);
+ }
+}
+
+/* ****************** BUTTON CALLBACKS FOR COMMON NODES ***************** */
+
+/* width of socket columns in group display */
+#define NODE_GROUP_FRAME 120
+
+/* based on settings in node, sets drawing rect info. each redraw! */
+/* note: this assumes only 1 group at a time is drawn (linked data) */
+/* in node->totr the entire boundbox for the group is stored */
+static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
+{
+ if (!(gnode->flag & NODE_GROUP_EDIT)) {
+ node_update_default(C, ntree, gnode);
+ }
+ else {
+ bNodeTree *ngroup= (bNodeTree *)gnode->id;
+ bNode *node;
+ bNodeSocket *sock, *gsock;
+ float locx, locy;
+ rctf *rect= &gnode->totr;
+ float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
+ int counter;
+ int dy;
+
+ /* get "global" coords */
+ nodeSpaceCoords(gnode, &locx, &locy);
+
+ /* center them, is a bit of abuse of locx and locy though */
+ node_update_nodetree(C, ngroup, locx, locy);
+
+ rect->xmin = rect->xmax = locx;
+ rect->ymin = rect->ymax = locy;
+
+ counter= 1;
+ for(node= ngroup->nodes.first; node; node= node->next) {
+ if(counter) {
+ *rect= node->totr;
+ counter= 0;
+ }
+ else
+ BLI_union_rctf(rect, &node->totr);
+ }
+
+ /* add some room for links to group sockets */
+ rect->xmin -= 4*NODE_DY;
+ rect->xmax += 4*NODE_DY;
+ rect->ymin-= NODE_DY;
+ rect->ymax+= NODE_DY;
+
+ /* input sockets */
+ dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1);
+ gsock=ngroup->inputs.first;
+ sock=gnode->inputs.first;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ sock->locx = rect->xmin - node_group_frame;
+ sock->locy = dy;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ gsock->locx = rect->xmin;
+ gsock->locy = dy;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ gsock = gsock->next;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ gsock->locx = rect->xmin;
+ sock->locx = rect->xmin - node_group_frame;
+ sock->locy = gsock->locy = dy;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ gsock = gsock->next;
+ }
+ }
+
+ /* output sockets */
+ dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1);
+ gsock=ngroup->outputs.first;
+ sock=gnode->outputs.first;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ sock->locx = rect->xmax + node_group_frame;
+ sock->locy = dy - NODE_DYS;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ gsock->locx = rect->xmax;
+ gsock->locy = dy - NODE_DYS;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ gsock = gsock->next;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ gsock->locx = rect->xmax;
+ sock->locx = rect->xmax + node_group_frame;
+ sock->locy = gsock->locy = dy - NODE_DYS;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ gsock = gsock->next;
+ }
+ }
+ }
+}
+
+static void update_group_input_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)
+{
+ bNodeTree *ngroup= (bNodeTree*)ngroup_v;
+
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
+ ntreeUpdateTree(ngroup);
+}
+
+static void update_group_output_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)
+{
+ bNodeTree *ngroup= (bNodeTree*)ngroup_v;
+
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
+ ntreeUpdateTree(ngroup);
+}
+
+static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *sock, int in_out, float xoffset, float yoffset)
+{
+ bNodeTree *ngroup= (bNodeTree*)gnode->id;
+ uiBut *bt;
+
+ if (sock->flag & SOCK_DYNAMIC) {
+ bt = uiDefBut(gnode->block, TEX, 0, "",
+ sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
+ sock->name, 0, 31, 0, 0, "");
+ if (in_out==SOCK_IN)
+ uiButSetFunc(bt, update_group_input_cb, snode, ngroup);
+ else
+ uiButSetFunc(bt, update_group_output_cb, snode, ngroup);
+ }
+ else {
+ uiDefBut(gnode->block, LABEL, 0, sock->name,
+ sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
+ NULL, 0, 31, 0, 0, "");
+ }
+}
+
+static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *ntree, bNode *gnode, bNodeSocket *sock, bNodeSocket *gsock, int index, int in_out)
+{
+ bNodeTree *ngroup= (bNodeTree*)gnode->id;
+ bNodeSocketType *stype= ntreeGetSocketType(gsock ? gsock->type : sock->type);
+ uiBut *bt;
+ float offset;
+ int draw_value;
+ float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
+ float socket_size= NODE_SOCKSIZE*U.dpi/72;
+ float arrowbutw= 0.8f*UI_UNIT_X;
+ /* layout stuff for buttons on group left frame */
+ float colw= 0.6f*node_group_frame;
+ float col1= 6 - node_group_frame;
+ float col2= col1 + colw+6;
+ float col3= - arrowbutw - 6;
+ /* layout stuff for buttons on group right frame */
+ float cor1= 6;
+ float cor2= cor1 + arrowbutw + 6;
+ float cor3= cor2 + arrowbutw + 6;
+
+ /* node and group socket circles */
+ if (sock)
+ node_socket_circle_draw(ntree, sock, socket_size);
+ if (gsock)
+ node_socket_circle_draw(ngroup, gsock, socket_size);
+
+ /* socket name */
+ offset = (in_out==SOCK_IN ? col1 : cor3);
+ if (!gsock)
+ offset += (in_out==SOCK_IN ? node_group_frame : -node_group_frame);
+
+ /* draw both name and value button if:
+ * 1) input: not internal
+ * 2) output: (node type uses const outputs) and (group output is unlinked)
+ */
+ draw_value = 0;
+ switch (in_out) {
+ case SOCK_IN:
+ draw_value = !(gsock && (gsock->flag & SOCK_INTERNAL));
+ break;
+ case SOCK_OUT:
+ if (gnode->typeinfo->flag & NODE_CONST_OUTPUT)
+ draw_value = !(gsock && gsock->link);
+ break;
+ }
+ if (draw_value) {
+ /* both name and value buttons */
+ if (gsock) {
+ draw_group_socket_name(snode, gnode, gsock, in_out, offset, 0);
+ if (stype->buttonfunc)
+ stype->buttonfunc(C, gnode->block, ngroup, NULL, gsock, "", gsock->locx+offset, gsock->locy-NODE_DY, colw);
+ }
+ else {
+ draw_group_socket_name(snode, gnode, sock, in_out, offset, 0);
+ if (stype->buttonfunc)
+ stype->buttonfunc(C, gnode->block, ngroup, NULL, sock, "", sock->locx+offset, sock->locy-NODE_DY, colw);
+ }
+ }
+ else {
+ /* only name, no value button */
+ if (gsock)
+ draw_group_socket_name(snode, gnode, gsock, in_out, offset, -NODE_DYS);
+ else
+ draw_group_socket_name(snode, gnode, sock, in_out, offset, -NODE_DYS);
+ }
+
+ if (gsock && (gsock->flag & SOCK_DYNAMIC)) {
+ /* up/down buttons */
+ offset = (in_out==SOCK_IN ? col2 : cor2);
+ uiBlockSetDirection(gnode->block, UI_TOP);
+ uiBlockBeginAlign(gnode->block);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
+ gsock->locx+offset, gsock->locy, arrowbutw, arrowbutw, "");
+ if (!gsock->prev || !(gsock->prev->flag & SOCK_DYNAMIC))
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
+ gsock->locx+offset, gsock->locy-arrowbutw, arrowbutw, arrowbutw, "");
+ if (!gsock->next || !(gsock->next->flag & SOCK_DYNAMIC))
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out);
+ uiBlockEndAlign(gnode->block);
+ uiBlockSetDirection(gnode->block, 0);
+
+ /* remove button */
+ offset = (in_out==SOCK_IN ? col3 : cor1);
+ uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
+ gsock->locx+offset, gsock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, "");
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out);
+ uiBlockSetEmboss(gnode->block, UI_EMBOSS);
+ }
+}
+
+/* groups are, on creation, centered around 0,0 */
+static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
+{
+ if (!(gnode->flag & NODE_GROUP_EDIT)) {
+ node_draw_default(C, ar, snode, ntree, gnode);
+ }
+ else {
+ bNodeTree *ngroup= (bNodeTree *)gnode->id;
+ bNodeSocket *sock, *gsock;
+ uiLayout *layout;
+ PointerRNA ptr;
+ rctf rect= gnode->totr;
+ float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
+ float group_header= 26*U.dpi/72;
+
+ int index;
+
+ /* backdrop header */
+ glEnable(GL_BLEND);
+ uiSetRoundBox(3);
+ UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70);
+ uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymax, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
+
+ /* backdrop body */
+ UI_ThemeColorShadeAlpha(TH_BACK, -8, -70);
+ uiSetRoundBox(0);
+ uiDrawBox(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD);
+
+ /* input column */
+ UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
+ uiSetRoundBox(8);
+ uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymin, rect.xmin, rect.ymax, BASIS_RAD);
+
+ /* output column */
+ UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
+ uiSetRoundBox(4);
+ uiDrawBox(GL_POLYGON, rect.xmax, rect.ymin, rect.xmax+node_group_frame, rect.ymax, BASIS_RAD);
+
+ /* input column separator */
+ glColor4ub(200, 200, 200, 140);
+ glBegin(GL_LINES);
+ glVertex2f(rect.xmin, rect.ymin);
+ glVertex2f(rect.xmin, rect.ymax);
+ glEnd();
+
+ /* output column separator */
+ glColor4ub(200, 200, 200, 140);
+ glBegin(GL_LINES);
+ glVertex2f(rect.xmax, rect.ymin);
+ glVertex2f(rect.xmax, rect.ymax);
+ glEnd();
+
+ /* group node outline */
+ uiSetRoundBox(15);
+ glColor4ub(200, 200, 200, 140);
+ glEnable( GL_LINE_SMOOTH );
+ uiDrawBox(GL_LINE_LOOP, rect.xmin-node_group_frame, rect.ymin, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
+ glDisable( GL_LINE_SMOOTH );
+ glDisable(GL_BLEND);
+
+ /* backdrop title */
+ UI_ThemeColor(TH_TEXT_HI);
+
+ layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+group_header),
+ MIN2((int)(rect.xmax - rect.xmin-18.0f), node_group_frame+20), group_header, U.uistyles.first);
+ RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr);
+ uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL);
+ uiBlockLayoutResolve(gnode->block, NULL, NULL);
+
+ /* draw the internal tree nodes and links */
+ node_draw_nodetree(C, ar, snode, ngroup);
+
+ /* group sockets */
+ gsock=ngroup->inputs.first;
+ sock=gnode->inputs.first;
+ index = 0;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, NULL, index, SOCK_IN);
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ draw_group_socket(C, snode, ntree, gnode, NULL, gsock, index, SOCK_IN);
+ gsock = gsock->next;
+ ++index;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, gsock, index, SOCK_IN);
+ sock = sock->next;
+ gsock = gsock->next;
+ ++index;
+ }
+ }
+ gsock=ngroup->outputs.first;
+ sock=gnode->outputs.first;
+ index = 0;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, NULL, index, SOCK_OUT);
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ draw_group_socket(C, snode, ntree, gnode, NULL, gsock, index, SOCK_OUT);
+ gsock = gsock->next;
+ ++index;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, gsock, index, SOCK_OUT);
+ sock = sock->next;
+ gsock = gsock->next;
+ ++index;
+ }
+ }
+
+ uiEndBlock(C, gnode->block);
+ uiDrawBlock(C, gnode->block);
+ gnode->block= NULL;
+ }
+}
+
+static void node_common_buts_whileloop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "max_iterations", 0, NULL, 0);
+}
+
+static void node_update_frame(const bContext *UNUSED(C), bNodeTree *UNUSED(ntree), bNode *node)
+{
+ float locx, locy;
+
+ /* get "global" coords */
+ nodeSpaceCoords(node, &locx, &locy);
+
+ node->prvr.xmin= locx + NODE_DYS;
+ node->prvr.xmax= locx + node->width- NODE_DYS;
+
+ node->totr.xmin= locx;
+ node->totr.xmax= locx + node->width;
+ node->totr.ymax= locy;
+ node->totr.ymin= locy - node->height;
+}
+
+static void node_common_set_butfunc(bNodeType *ntype)
+{
+ switch(ntype->type) {
+ case NODE_GROUP:
+// ntype->uifunc= node_common_buts_group;
+ ntype->drawfunc= node_draw_group;
+ ntype->drawupdatefunc= node_update_group;
+ break;
+ case NODE_FORLOOP:
+// ntype->uifunc= node_common_buts_group;
+ ntype->drawfunc= node_draw_group;
+ ntype->drawupdatefunc= node_update_group;
+ break;
+ case NODE_WHILELOOP:
+ ntype->uifunc= node_common_buts_whileloop;
+ ntype->drawfunc= node_draw_group;
+ ntype->drawupdatefunc= node_update_group;
+ break;
+ case NODE_FRAME:
+ ntype->drawupdatefunc= node_update_frame;
+ break;
+ }
+}
+
/* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v)
@@ -470,8 +1070,6 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case NODE_DYNAMIC:
ntype->uifunc= node_shader_buts_dynamic;
break;
- default:
- ntype->uifunc= NULL;
}
if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc;
}
@@ -1225,8 +1823,6 @@ static void node_composit_set_butfunc(bNodeType *ntype)
case CMP_NODE_SEPYCCA:
ntype->uifunc=node_composit_buts_ycc;
break;
- default:
- ntype->uifunc= NULL;
}
if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc;
@@ -1381,9 +1977,6 @@ static void node_texture_set_butfunc(bNodeType *ntype)
case TEX_NODE_OUTPUT:
ntype->uifunc = node_texture_buts_output;
break;
-
- default:
- ntype->uifunc= NULL;
}
if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc;
}
@@ -1392,24 +1985,60 @@ static void node_texture_set_butfunc(bNodeType *ntype)
void ED_init_node_butfuncs(void)
{
+ bNodeTreeType *treetype;
bNodeType *ntype;
-
- /* shader nodes */
- ntype= node_all_shaders.first;
- while(ntype) {
- node_shader_set_butfunc(ntype);
- ntype= ntype->next;
- }
- /* composit nodes */
- ntype= node_all_composit.first;
- while(ntype) {
- node_composit_set_butfunc(ntype);
- ntype= ntype->next;
+ bNodeSocketType *stype;
+ int i;
+
+ /* node type ui functions */
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ treetype = ntreeGetType(i);
+ if (treetype) {
+ for (ntype= treetype->node_types.first; ntype; ntype= ntype->next) {
+ /* default ui functions */
+ ntype->drawfunc = node_draw_default;
+ ntype->drawupdatefunc = node_update_default;
+ ntype->uifunc = NULL;
+ ntype->uifuncbut = NULL;
+ ntype->resize_area_func = node_resize_area_default;
+
+ node_common_set_butfunc(ntype);
+
+ switch (i) {
+ case NTREE_COMPOSIT:
+ node_composit_set_butfunc(ntype);
+ break;
+ case NTREE_SHADER:
+ node_shader_set_butfunc(ntype);
+ break;
+ case NTREE_TEXTURE:
+ node_texture_set_butfunc(ntype);
+ break;
+ }
+ }
+ }
}
- ntype = node_all_textures.first;
- while(ntype) {
- node_texture_set_butfunc(ntype);
- ntype= ntype->next;
+
+ /* socket type ui functions */
+ for (i=0; i < NUM_SOCKET_TYPES; ++i) {
+ stype = ntreeGetSocketType(i);
+ if (stype) {
+ switch(stype->type) {
+ case SOCK_FLOAT:
+ case SOCK_INT:
+ case SOCK_BOOLEAN:
+ stype->buttonfunc = node_socket_button_default;
+ break;
+ case SOCK_VECTOR:
+ stype->buttonfunc = node_socket_button_components;
+ break;
+ case SOCK_RGBA:
+ stype->buttonfunc = node_socket_button_color;
+ break;
+ default:
+ stype->buttonfunc = NULL;
+ }
+ }
}
}
@@ -1840,6 +2469,69 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t
}
}
+static void node_link_straight_points(View2D *UNUSED(v2d), SpaceNode *snode, bNodeLink *link, float coord_array[][2])
+{
+ if(link->fromsock) {
+ coord_array[0][0]= link->fromsock->locx;
+ coord_array[0][1]= link->fromsock->locy;
+ }
+ else {
+ if(snode==NULL) return;
+ coord_array[0][0]= snode->mx;
+ coord_array[0][1]= snode->my;
+ }
+ if(link->tosock) {
+ coord_array[1][0]= link->tosock->locx;
+ coord_array[1][1]= link->tosock->locy;
+ }
+ else {
+ if(snode==NULL) return;
+ coord_array[1][0]= snode->mx;
+ coord_array[1][1]= snode->my;
+ }
+}
+
+void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 )
+{
+ float coord_array[2][2];
+ float linew;
+ int i;
+
+ node_link_straight_points(v2d, snode, link, coord_array);
+
+ /* store current linewidth */
+ glGetFloatv(GL_LINE_WIDTH, &linew);
+
+ glEnable(GL_LINE_SMOOTH);
+
+ if(do_triple) {
+ UI_ThemeColorShadeAlpha(th_col3, -80, -120);
+ glLineWidth(4.0f);
+
+ glBegin(GL_LINES);
+ glVertex2fv(coord_array[0]);
+ glVertex2fv(coord_array[1]);
+ glEnd();
+ }
+
+ UI_ThemeColor(th_col1);
+ glLineWidth(1.5f);
+
+ glBegin(GL_LINE_STRIP);
+ for (i=0; i < LINK_RESOL; ++i) {
+ float t= (float)i/(float)(LINK_RESOL-1);
+ if(do_shaded)
+ UI_ThemeColorBlend(th_col1, th_col2, t);
+ glVertex2f((1.0f-t)*coord_array[0][0]+t*coord_array[1][0], (1.0f-t)*coord_array[0][1]+t*coord_array[1][1]);
+ }
+ glEnd();
+
+ glDisable(GL_LINE_SMOOTH);
+
+ /* restore previuos linewidth */
+ glLineWidth(linew);
+}
+
/* note; this is used for fake links in groups too */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
{
@@ -1868,7 +2560,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
}
else {
/* check cyclic */
- if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
+ if((link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) && (link->flag & NODE_LINK_VALID)) {
/* special indicated link, on drop-node */
if(link->flag & NODE_LINKFLAG_HILITE) {
th_col1= th_col2= TH_ACTIVE;
@@ -1890,6 +2582,5 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
}
node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
+// node_draw_link_straight(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
}
-
-
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index 4b989a78fab..7b14e35e8fe 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -116,10 +116,12 @@ static void active_node_panel(const bContext *C, Panel *pa)
uiItemS(layout);
uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
uiItemS(layout);
-
+
/* draw this node's settings */
if (node->typeinfo && node->typeinfo->uifuncbut)
node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr);
+ else if (node->typeinfo && node->typeinfo->uifunc)
+ node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
}
/* ******************* node buttons registration ************** */
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 950b3c72fe7..ba1e8d3dd59 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -70,8 +70,8 @@
#include "RNA_access.h"
-#include "CMP_node.h"
-#include "SHD_node.h"
+#include "NOD_composite.h"
+#include "NOD_shader.h"
#include "node_intern.h"
@@ -81,6 +81,15 @@
// XXX interface.h
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
+/* XXX update functions for node editor are a mess, needs a clear concept */
+void ED_node_tree_update(SpaceNode *snode, Scene *scene)
+{
+ snode_set_context(snode, scene);
+
+ if(snode->nodetree && snode->nodetree->id.us==0)
+ snode->nodetree->id.us= 1;
+}
+
void ED_node_changed_update(ID *id, bNode *node)
{
bNodeTree *nodetree, *edittree;
@@ -123,24 +132,25 @@ static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
return 0;
}
+typedef struct NodeUpdateCalldata {
+ bNodeTree *ntree;
+ bNode *node;
+} NodeUpdateCalldata;
+static void node_generic_update_cb(void *calldata, ID *owner_id, bNodeTree *ntree)
+{
+ NodeUpdateCalldata *cd= (NodeUpdateCalldata*)calldata;
+ /* check if nodetree uses the group stored in calldata */
+ if (has_nodetree(ntree, cd->ntree))
+ ED_node_changed_update(owner_id, cd->node);
+}
void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node)
{
- Material *ma;
- Tex *tex;
- Scene *sce;
-
+ bNodeTreeType *tti= ntreeGetType(ntree->type);
+ NodeUpdateCalldata cd;
+ cd.ntree = ntree;
+ cd.node = node;
/* look through all datablocks, to support groups */
- for(ma=bmain->mat.first; ma; ma=ma->id.next)
- if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree))
- ED_node_changed_update(&ma->id, node);
-
- for(tex=bmain->tex.first; tex; tex=tex->id.next)
- if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree))
- ED_node_changed_update(&tex->id, node);
-
- for(sce=bmain->scene.first; sce; sce=sce->id.next)
- if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree))
- ED_node_changed_update(&sce->id, node);
+ tti->foreach_nodetree(bmain, &cd, node_generic_update_cb);
if(ntree->type == NTREE_TEXTURE)
ntreeTexCheckCyclics(ntree);
@@ -204,14 +214,19 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
}
/* based on settings in node, sets drawing rect info. each redraw! */
-static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
+static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
{
uiLayout *layout;
PointerRNA ptr;
bNodeSocket *nsock;
- float dy= node->locy;
+ float locx, locy;
+ float dy;
int buty;
+ /* get "global" coords */
+ nodeSpaceCoords(node, &locx, &locy);
+ dy= locy;
+
/* header */
dy-= NODE_DY;
@@ -222,14 +237,14 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
/* output sockets */
for(nsock= node->outputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- nsock->locx= node->locx + node->width;
+ nsock->locx= locx + node->width;
nsock->locy= dy - NODE_DYS;
dy-= NODE_DY;
}
}
- node->prvr.xmin= node->locx + NODE_DYS;
- node->prvr.xmax= node->locx + node->width- NODE_DYS;
+ node->prvr.xmin= locx + NODE_DYS;
+ node->prvr.xmax= locx + node->width- NODE_DYS;
/* preview rect? */
if(node->flag & NODE_PREVIEW) {
@@ -286,21 +301,22 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
node->butr.ymax= 0;
RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
-
+
layout= uiBlockLayout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
- node->locx+NODE_DYS, dy, node->butr.xmax, NODE_DY, U.uistyles.first);
-
+ locx+NODE_DYS, dy, node->butr.xmax, NODE_DY, U.uistyles.first);
+
node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
+
uiBlockEndAlign(node->block);
uiBlockLayoutResolve(node->block, NULL, &buty);
-
+
dy= buty - NODE_DYS/2;
}
/* input sockets */
for(nsock= node->inputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- nsock->locx= node->locx;
+ nsock->locx= locx;
nsock->locy= dy - NODE_DYS;
dy-= NODE_DY;
}
@@ -310,19 +326,23 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
if(node->inputs.first || (node->flag & (NODE_OPTIONS|NODE_PREVIEW))==0 )
dy-= NODE_DYS/2;
- node->totr.xmin= node->locx;
- node->totr.xmax= node->locx + node->width;
- node->totr.ymax= node->locy;
- node->totr.ymin= MIN2(dy, node->locy-2*NODE_DY);
+ node->totr.xmin= locx;
+ node->totr.xmax= locx + node->width;
+ node->totr.ymax= locy;
+ node->totr.ymin= MIN2(dy, locy-2*NODE_DY);
}
/* based on settings in node, sets drawing rect info. each redraw! */
static void node_update_hidden(bNode *node)
{
bNodeSocket *nsock;
+ float locx, locy;
float rad, drad, hiddenrad= HIDDEN_RAD;
int totin=0, totout=0, tot;
+ /* get "global" coords */
+ nodeSpaceCoords(node, &locx, &locy);
+
/* calculate minimal radius */
for(nsock= node->inputs.first; nsock; nsock= nsock->next)
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
@@ -336,9 +356,9 @@ static void node_update_hidden(bNode *node)
hiddenrad += 5.0f*(float)(tot-4);
}
- node->totr.xmin= node->locx;
- node->totr.xmax= node->locx + 3*hiddenrad + node->miniwidth;
- node->totr.ymax= node->locy + (hiddenrad - 0.5f*NODE_DY);
+ node->totr.xmin= locx;
+ node->totr.xmax= locx + 3*hiddenrad + node->miniwidth;
+ node->totr.ymax= locy + (hiddenrad - 0.5f*NODE_DY);
node->totr.ymin= node->totr.ymax - 2*hiddenrad;
/* output sockets */
@@ -364,6 +384,14 @@ static void node_update_hidden(bNode *node)
}
}
+void node_update_default(const bContext *C, bNodeTree *ntree, bNode *node)
+{
+ if(node->flag & NODE_HIDDEN)
+ node_update_hidden(node);
+ else
+ node_update_basis(C, ntree, node);
+}
+
static int node_get_colorid(bNode *node)
{
if(node->typeinfo->nclass==NODE_CLASS_INPUT)
@@ -383,138 +411,42 @@ static int node_get_colorid(bNode *node)
return TH_NODE;
}
-/* based on settings in node, sets drawing rect info. each redraw! */
-/* note: this assumes only 1 group at a time is drawn (linked data) */
-/* in node->totr the entire boundbox for the group is stored */
-static void node_update_group(const bContext *C, bNodeTree *UNUSED(ntree), bNode *gnode)
-{
- bNodeTree *ngroup= (bNodeTree *)gnode->id;
- bNode *node;
- bNodeSocket *sock, *gsock;
- rctf *rect= &gnode->totr;
- float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
- int counter;
- int dy;
-
- rect->xmin = rect->xmax = gnode->locx;
- rect->ymin = rect->ymax = gnode->locy;
-
- /* center them, is a bit of abuse of locx and locy though */
- for(node= ngroup->nodes.first; node; node= node->next) {
- node->locx+= gnode->locx;
- node->locy+= gnode->locy;
-
- if(node->flag & NODE_HIDDEN)
- node_update_hidden(node);
- else
- node_update(C, ngroup, node);
- node->locx-= gnode->locx;
- node->locy-= gnode->locy;
- }
- counter= 1;
- for(node= ngroup->nodes.first; node; node= node->next) {
- if(counter) {
- *rect= node->totr;
- counter= 0;
- }
- else
- BLI_union_rctf(rect, &node->totr);
- }
-
- /* add some room for links to group sockets */
- rect->xmin -= 4*NODE_DY;
- rect->xmax += 4*NODE_DY;
- rect->ymin-= NODE_DY;
- rect->ymax+= NODE_DY;
-
- /* input sockets */
- dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1);
- for(gsock=ngroup->inputs.first, sock=gnode->inputs.first; gsock; gsock=gsock->next, sock=sock->next) {
- gsock->locx = rect->xmin;
- sock->locx = rect->xmin - node_group_frame;
- sock->locy = gsock->locy = dy;
-
- /* prevent long socket lists from growing out of the group box */
- if (dy-3*NODE_DYS < rect->ymin)
- rect->ymin = dy-3*NODE_DYS;
- if (dy+3*NODE_DYS > rect->ymax)
- rect->ymax = dy+3*NODE_DYS;
-
- dy -= 2*NODE_DY;
- }
-
- /* output sockets */
- dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1);
- for(gsock=ngroup->outputs.first, sock=gnode->outputs.first; gsock; gsock=gsock->next, sock=sock->next) {
- gsock->locx = rect->xmax;
- sock->locx = rect->xmax + node_group_frame;
- sock->locy = gsock->locy = dy - NODE_DYS;
-
- /* prevent long socket lists from growing out of the group box */
- if (dy-3*NODE_DYS < rect->ymin)
- rect->ymin = dy-3*NODE_DYS;
- if (dy+3*NODE_DYS > rect->ymax)
- rect->ymax = dy+3*NODE_DYS;
-
- dy -= 2*NODE_DY;
- }
-}
-
/* note: in cmp_util.c is similar code, for node_compo_pass_on() */
/* note: in node_edit.c is similar code, for untangle node */
static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
{
- bNodeSocket *valsock= NULL, *colsock= NULL, *vecsock= NULL;
- bNodeSocket *sock;
+ static int types[]= { SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA };
bNodeLink link= {NULL};
- int a;
+ int i;
- /* connect the first value buffer in with first value out */
- /* connect the first RGBA buffer in with first RGBA out */
+ /* connect the first input of each type with first output of the same type */
- /* test the inputs */
- for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
- if(nodeCountSocketLinks(snode->edittree, sock)) {
- if(sock->type==SOCK_VALUE && valsock==NULL) valsock= sock;
- if(sock->type==SOCK_VECTOR && vecsock==NULL) vecsock= sock;
- if(sock->type==SOCK_RGBA && colsock==NULL) colsock= sock;
- }
- }
-
- /* outputs, draw lines */
glEnable(GL_BLEND);
glEnable( GL_LINE_SMOOTH );
- if(valsock || colsock || vecsock) {
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(nodeCountSocketLinks(snode->edittree, sock)) {
- link.tosock= sock;
-
- if(sock->type==SOCK_VALUE && valsock) {
- link.fromsock= valsock;
- node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
- valsock= NULL;
- }
- if(sock->type==SOCK_VECTOR && vecsock) {
- link.fromsock= vecsock;
- node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
- vecsock= NULL;
- }
- if(sock->type==SOCK_RGBA && colsock) {
- link.fromsock= colsock;
- node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
- colsock= NULL;
- }
+ link.fromnode = link.tonode = node;
+ for (i=0; i < 3; ++i) {
+ /* find input socket */
+ for (link.fromsock=node->inputs.first; link.fromsock; link.fromsock=link.fromsock->next)
+ if (link.fromsock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.fromsock))
+ break;
+ if (link.fromsock) {
+ for (link.tosock=node->outputs.first; link.tosock; link.tosock=link.tosock->next)
+ if (link.tosock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.tosock))
+ break;
+
+ if (link.tosock) {
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
}
}
}
+
glDisable(GL_BLEND);
glDisable( GL_LINE_SMOOTH );
}
-/* nice AA filled circle */
/* this might have some more generic use */
-static void circle_draw(float x, float y, float size, int col[3])
+static void node_circle_draw(float x, float y, float size, char *col)
{
/* 16 values of sin function */
static float si[16] = {
@@ -550,37 +482,10 @@ static void circle_draw(float x, float y, float size, int col[3])
glDisable(GL_BLEND);
}
-static void socket_circle_draw(bNodeSocket *sock, float size)
-{
- int col[3];
-
- if(sock->type==-1) {
- col[0]= 0; col[1]= 0; col[2]= 0;
- }
- else if(sock->type==SOCK_VALUE) {
- col[0]= 160; col[1]= 160; col[2]= 160;
- }
- else if(sock->type==SOCK_VECTOR) {
- col[0]= 100; col[1]= 100; col[2]= 200;
- }
- else if(sock->type==SOCK_RGBA) {
- col[0]= 200; col[1]= 200; col[2]= 40;
- }
- else {
- col[0]= 100; col[1]= 200; col[2]= 100;
- }
-
- circle_draw(sock->locx, sock->locy, size, col);
-}
-
-static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v)
+void node_socket_circle_draw(bNodeTree *UNUSED(ntree), bNodeSocket *sock, float size)
{
- SpaceNode *snode= snode_v;
-
- if(snode->treetype==NTREE_SHADER) {
- nodeShaderSynchronizeID(node_v, 1);
- // allqueue(REDRAWBUTSSHADING, 0);
- }
+ bNodeSocketType *stype = ntreeGetSocketType(sock->type);
+ node_circle_draw(sock->locx, sock->locy, size, stype->ui_color);
}
/* ************** Socket callbacks *********** */
@@ -639,89 +544,12 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
}
-typedef struct SocketVectorMenuArgs {
- PointerRNA ptr;
- int x, y, width;
- uiButHandleFunc cb;
- void *arg1, *arg2;
-} SocketVectorMenuArgs;
-
-/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
-static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *args_v)
-{
- SocketVectorMenuArgs *args= (SocketVectorMenuArgs*)args_v;
- uiBlock *block;
- uiLayout *layout;
-
- block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
- uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
-
- layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, NODE_DY, U.uistyles.first), 0);
-
- uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE);
-
- return block;
-}
-
-static void node_draw_socket_button(bNodeTree *ntree, bNodeSocket *sock, const char *name,
- uiBlock *block, int x, int y, int width,
- uiButHandleFunc cb, void *arg1, void *arg2)
-{
- uiBut *bt= NULL;
- PointerRNA ptr;
- int labelw;
- SocketVectorMenuArgs *args;
-
- RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
-
- switch (sock->type) {
- case SOCK_VALUE:
- bt=uiDefButR(block, NUM, B_NODE_EXEC, name,
- x, y+1, width, NODE_DY-2,
- &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
- if (cb)
- uiButSetFunc(bt, cb, arg1, arg2);
- break;
-
- case SOCK_VECTOR:
- args= MEM_callocN(sizeof(SocketVectorMenuArgs), "SocketVectorMenuArgs");
-
- args->ptr = ptr;
- args->x = x;
- args->y = y;
- args->width = width;
- args->cb = cb;
- args->arg1 = arg1;
- args->arg2 = arg2;
-
- uiDefBlockButN(block, socket_vector_menu, args, name,
- x, y+1, width, NODE_DY-2,
- "");
- break;
-
- case SOCK_RGBA:
- labelw= width - 40;
-
- bt=uiDefButR(block, COL, B_NODE_EXEC, "",
- x, y+2, (labelw>0 ? 40 : width), NODE_DY-2,
- &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
- if (cb)
- uiButSetFunc(bt, cb, arg1, arg2);
-
- if (name[0]!='\0' && labelw>0)
- uiDefBut(block, LABEL, 0, name,
- x + 40, y+2, labelw, NODE_DY-2,
- NULL, 0, 0, 0, 0, "");
- break;
- }
-}
-
static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
{
bNodeSocket *sock;
rctf *rct= &node->totr;
float iconofs;
- float socket_size= NODE_SOCKSIZE*U.dpi/72;
+ /* float socket_size= NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */
float iconbutw= 0.8f*UI_UNIT_X;
int color_id= node_get_colorid(node);
char showname[128]; /* 128 used below */
@@ -809,13 +637,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
else
UI_ThemeColor(TH_TEXT); */
- if (node->label[0]!='\0')
- BLI_strncpy(showname, node->label, sizeof(showname));
- else if (node->typeinfo->labelfunc)
- BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
- else
- BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
-
+ BLI_strncpy(showname, nodeLabel(node), sizeof(showname));
+
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -855,37 +678,45 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
/* socket inputs, buttons */
for(sock= node->inputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- socket_circle_draw(sock, socket_size);
-
- if(node->block && sock->link==NULL) {
- node_draw_socket_button(ntree, sock, sock->name, node->block, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, node_sync_cb, snode, node);
- }
- else {
- uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f),
- (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
- }
+ bNodeSocketType *stype= ntreeGetSocketType(sock->type);
+
+ if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))
+ continue;
+
+ node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
+
+ if (sock->link) {
+ uiDefBut(node->block, LABEL, 0, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, NODE_DY,
+ NULL, 0, 0, 0, 0, "");
+ }
+ else {
+ if (stype->buttonfunc)
+ stype->buttonfunc(C, node->block, ntree, node, sock, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY);
}
}
/* socket outputs */
for(sock= node->outputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- float slen;
- int ofs= 0;
-
- socket_circle_draw(sock, socket_size);
-
- UI_ThemeColor(TH_TEXT);
- slen= snode->aspect*UI_GetStringWidth(sock->name);
- while(slen > node->width) {
- ofs++;
- slen= snode->aspect*UI_GetStringWidth(sock->name+ofs);
- }
-
- uiDefBut(node->block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f),
- (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
+ PointerRNA sockptr;
+ float slen;
+ int ofs;
+
+ RNA_pointer_create((ID*)ntree, &RNA_NodeSocket, sock, &sockptr);
+
+ if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))
+ continue;
+
+ node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
+
+ ofs= 0;
+ UI_ThemeColor(TH_TEXT);
+ slen= snode->aspect*UI_GetStringWidth(sock->name);
+ while(slen > node->width) {
+ ofs++;
+ slen= snode->aspect*UI_GetStringWidth(sock->name+ofs);
}
+ uiDefBut(node->block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f),
+ (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
}
/* preview */
@@ -956,12 +787,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColor(TH_TEXT);
if(node->miniwidth>0.0f) {
- if (node->label[0]!='\0')
- BLI_strncpy(showname, node->label, sizeof(showname));
- else if (node->typeinfo->labelfunc)
- BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
- else
- BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
+ BLI_strncpy(showname, nodeLabel(node), sizeof(showname));
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -984,12 +810,12 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
/* sockets */
for(sock= node->inputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock, socket_size);
+ node_socket_circle_draw(snode->nodetree, sock, socket_size);
}
for(sock= node->outputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock, socket_size);
+ node_socket_circle_draw(snode->nodetree, sock, socket_size);
}
uiEndBlock(C, node->block);
@@ -997,7 +823,43 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
node->block= NULL;
}
-static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree)
+void node_draw_default(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
+{
+ if(node->flag & NODE_HIDDEN)
+ node_draw_hidden(C, ar, snode, node);
+ else
+ node_draw_basis(C, ar, snode, ntree, node);
+}
+
+static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
+{
+ if (node->typeinfo->drawupdatefunc)
+ node->typeinfo->drawupdatefunc(C, ntree, node);
+}
+
+void node_update_nodetree(const bContext *C, bNodeTree *ntree, float offsetx, float offsety)
+{
+ bNode *node;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ /* XXX little hack */
+ node->locx += offsetx;
+ node->locy += offsety;
+
+ node_update(C, ntree, node);
+
+ node->locx -= offsetx;
+ node->locy -= offsety;
+ }
+}
+
+static void node_draw(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
+{
+ if (node->typeinfo->drawfunc)
+ node->typeinfo->drawfunc(C, ar, snode, ntree, node);
+}
+
+void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree)
{
bNode *node;
bNodeLink *link;
@@ -1013,212 +875,11 @@ static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode,
glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
- /* not selected first */
- for(a=0, node= ntree->nodes.first; node; node= node->next, a++) {
+ /* draw nodes, last nodes in front */
+ for(a=0, node= ntree->nodes.first; node; node=node->next, a++) {
node->nr= a; /* index of node in list, used for exec event code */
- if(!(node->flag & SELECT)) {
- if(node->flag & NODE_GROUP_EDIT);
- else if(node->flag & NODE_HIDDEN)
- node_draw_hidden(C, ar, snode, node);
- else
- node_draw_basis(C, ar, snode, ntree, node);
- }
+ node_draw(C, ar, snode, ntree, node);
}
-
- /* selected */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->flag & SELECT) {
- if(node->flag & NODE_GROUP_EDIT);
- else if(node->flag & NODE_HIDDEN)
- node_draw_hidden(C, ar, snode, node);
- else
- node_draw_basis(C, ar, snode, ntree, node);
- }
- }
-}
-
-static void group_verify_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)
-{
- bNodeTree *ngroup= (bNodeTree*)ngroup_v;
-
- nodeGroupVerify(ngroup);
-}
-
-/* groups are, on creation, centered around 0,0 */
-static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
-{
- bNodeTree *ngroup= (bNodeTree *)gnode->id;
- bNodeSocket *sock;
- uiLayout *layout;
- PointerRNA ptr;
- uiBut *bt;
- rctf rect= gnode->totr;
- float socket_size= NODE_SOCKSIZE*U.dpi/72;
- float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
- float group_header= 26*U.dpi/72;
- float arrowbutw= 0.8f*UI_UNIT_X;
- /* layout stuff for buttons on group left frame */
- float col1= 6, colw1= 0.6f*node_group_frame;
- float col2= col1 + colw1+6;
- float col3= node_group_frame - arrowbutw - 6;
- /* layout stuff for buttons on group right frame */
- float cor1= 6;
- float cor2= cor1 + arrowbutw + 6;
- float cor3= cor2 + arrowbutw + 6, corw3= node_group_frame - cor3-6;
-
- int index;
-
- /* backdrop header */
- glEnable(GL_BLEND);
- uiSetRoundBox(3);
- UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70);
- uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymax, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
-
- /* backdrop body */
- UI_ThemeColorShadeAlpha(TH_BACK, -8, -70);
- uiSetRoundBox(0);
- uiDrawBox(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD);
-
- /* input column */
- UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
- uiSetRoundBox(8);
- uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymin, rect.xmin, rect.ymax, BASIS_RAD);
-
- /* output column */
- UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
- uiSetRoundBox(4);
- uiDrawBox(GL_POLYGON, rect.xmax, rect.ymin, rect.xmax+node_group_frame, rect.ymax, BASIS_RAD);
-
- /* input column separator */
- glColor4ub(200, 200, 200, 140);
- glBegin(GL_LINES);
- glVertex2f(rect.xmin, rect.ymin);
- glVertex2f(rect.xmin, rect.ymax);
- glEnd();
-
- /* output column separator */
- glColor4ub(200, 200, 200, 140);
- glBegin(GL_LINES);
- glVertex2f(rect.xmax, rect.ymin);
- glVertex2f(rect.xmax, rect.ymax);
- glEnd();
-
- /* group node outline */
- uiSetRoundBox(15);
- glColor4ub(200, 200, 200, 140);
- glEnable( GL_LINE_SMOOTH );
- uiDrawBox(GL_LINE_LOOP, rect.xmin-node_group_frame, rect.ymin, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
- glDisable( GL_LINE_SMOOTH );
- glDisable(GL_BLEND);
-
- /* backdrop title */
- UI_ThemeColor(TH_TEXT_HI);
-
- layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+group_header),
- MIN2((int)(rect.xmax - rect.xmin-18.0f), node_group_frame+20), group_header, U.uistyles.first);
- RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr);
- uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL);
- uiBlockLayoutResolve(gnode->block, NULL, NULL);
-
- /* draw the internal tree nodes and links */
- node_draw_nodetree(C, ar, snode, ngroup);
-
- /* group sockets */
- for(sock=ngroup->inputs.first, index=0; sock; sock=sock->next, ++index) {
- float locx= sock->locx - node_group_frame;
-
- socket_circle_draw(sock, socket_size);
- /* small hack to use socket_circle_draw function with offset */
- sock->locx -= node_group_frame;
- socket_circle_draw(sock, socket_size);
- sock->locx += node_group_frame;
-
- bt = uiDefBut(gnode->block, TEX, 0, "",
- locx+col1, sock->locy+1, colw1, NODE_DY,
- sock->name, 0, 31, 0, 0, "");
- uiButSetFunc(bt, group_verify_cb, snode, ngroup);
-
- node_draw_socket_button(ngroup, sock, "", gnode->block,
- locx+col1, sock->locy-NODE_DY, colw1,
- NULL, NULL, NULL);
-
- uiBlockSetDirection(gnode->block, UI_TOP);
- uiBlockBeginAlign(gnode->block);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
- locx+col2, sock->locy, arrowbutw, arrowbutw, "");
- if (!sock->prev)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
- locx+col2, sock->locy-arrowbutw, arrowbutw, arrowbutw, "");
- if (!sock->next)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
- uiBlockEndAlign(gnode->block);
- uiBlockSetDirection(gnode->block, 0);
-
- uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
- locx+col3, sock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, "");
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
- uiBlockSetEmboss(gnode->block, UI_EMBOSS);
- }
-
- for(sock=ngroup->outputs.first, index=0; sock; sock=sock->next, ++index) {
- float locx= sock->locx;
-
- socket_circle_draw(sock, socket_size);
- /* small hack to use socket_circle_draw function with offset */
- sock->locx += node_group_frame;
- socket_circle_draw(sock, socket_size);
- sock->locx -= node_group_frame;
-
- uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
- locx+col1, sock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, "");
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
- uiBlockSetEmboss(gnode->block, UI_EMBOSS);
-
- uiBlockSetDirection(gnode->block, UI_TOP);
- uiBlockBeginAlign(gnode->block);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
- locx+cor2, sock->locy, arrowbutw, arrowbutw, "");
- if (!sock->prev)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
- locx+cor2, sock->locy-arrowbutw, arrowbutw, arrowbutw, "");
- if (!sock->next)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
- uiBlockEndAlign(gnode->block);
- uiBlockSetDirection(gnode->block, 0);
-
- if (sock->link) {
- bt = uiDefBut(gnode->block, TEX, 0, "",
- locx+cor3, sock->locy-NODE_DYS+1, corw3, NODE_DY,
- sock->name, 0, 31, 0, 0, "");
- uiButSetFunc(bt, group_verify_cb, snode, ngroup);
- }
- else {
- bt = uiDefBut(gnode->block, TEX, 0, "",
- locx+cor3, sock->locy+1, corw3, NODE_DY,
- sock->name, 0, 31, 0, 0, "");
- uiButSetFunc(bt, group_verify_cb, snode, ngroup);
-
- node_draw_socket_button(ngroup, sock, "", gnode->block, locx+cor3, sock->locy-NODE_DY, corw3, NULL, NULL, NULL);
- }
- }
-
- uiEndBlock(C, gnode->block);
- uiDrawBlock(C, gnode->block);
- gnode->block= NULL;
}
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
@@ -1260,27 +921,19 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
if(node->flag & NODE_GROUP_EDIT)
node_uiblocks_init(C, (bNodeTree *)node->id);
}
-
- node_uiblocks_init(C, snode->nodetree);
+ node_uiblocks_init(C, snode->nodetree);
- /* for now, we set drawing coordinates on each redraw */
- for(node= snode->nodetree->nodes.first; node; node= node->next) {
- if(node->flag & NODE_GROUP_EDIT)
- node_update_group(C, snode->nodetree, node);
- else if(node->flag & NODE_HIDDEN)
- node_update_hidden(node);
- else
- node_update(C, snode->nodetree, node);
- }
-
+ node_update_nodetree(C, snode->nodetree, 0.0f, 0.0f);
node_draw_nodetree(C, ar, snode, snode->nodetree);
-
+
+ #if 0
/* active group */
for(node= snode->nodetree->nodes.first; node; node= node->next) {
if(node->flag & NODE_GROUP_EDIT)
node_draw_group(C, ar, snode, snode->nodetree, node);
}
+ #endif
}
/* temporary links */
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 508cb82ee1b..5f58f540aae 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -40,9 +40,11 @@
#include "MEM_guardedalloc.h"
+#include "DNA_ID.h"
#include "DNA_object_types.h"
#include "DNA_material_types.h"
#include "DNA_node_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "BLI_math.h"
@@ -58,11 +60,17 @@
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_material.h"
+#include "BKE_modifier.h"
#include "BKE_paint.h"
#include "BKE_screen.h"
#include "BKE_texture.h"
#include "BKE_report.h"
+
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_storage_types.h"
+
#include "RE_pipeline.h"
#include "IMB_imbuf_types.h"
@@ -74,11 +82,13 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "WM_api.h"
#include "WM_types.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "UI_view2d.h"
#include "IMB_imbuf.h"
@@ -88,9 +98,9 @@
#include "node_intern.h"
static EnumPropertyItem socket_in_out_items[] = {
- { SOCK_IN, "IN", 0, "In", "" },
- { SOCK_OUT, "OUT", 0, "Out", "" },
- { 0, NULL, 0, NULL, NULL}
+ { SOCK_IN, "SOCK_IN", 0, "Input", "" },
+ { SOCK_OUT, "SOCK_OUT", 0, "Output", "" },
+ { 0, NULL, 0, NULL, NULL },
};
/* ***************** composite job manager ********************** */
@@ -227,7 +237,7 @@ static bNode *editnode_get_active(bNodeTree *ntree)
/* check for edited group */
for(node= ntree->nodes.first; node; node= node->next)
- if(node->flag & NODE_GROUP_EDIT)
+ if(nodeGroupEditGet(node))
break;
if(node)
return nodeGetActive((bNodeTree *)node->id);
@@ -258,7 +268,7 @@ bNode *node_tree_get_editgroup(bNodeTree *nodetree)
/* get the groupnode */
for(gnode= nodetree->nodes.first; gnode; gnode= gnode->next)
- if(gnode->flag & NODE_GROUP_EDIT)
+ if(nodeGroupEditGet(gnode))
break;
return gnode;
}
@@ -269,6 +279,7 @@ void ED_node_shader_default(Material *ma)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
+ bNodeTemplate ntemp;
/* but lets check it anyway */
if(ma->nodetree) {
@@ -277,12 +288,14 @@ void ED_node_shader_default(Material *ma)
return;
}
- ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, FALSE);
+ ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0);
- out= nodeAddNodeType(ma->nodetree, SH_NODE_OUTPUT, NULL, NULL);
+ ntemp.type = SH_NODE_OUTPUT;
+ out= nodeAddNode(ma->nodetree, &ntemp);
out->locx= 300.0f; out->locy= 300.0f;
- in= nodeAddNodeType(ma->nodetree, SH_NODE_MATERIAL, NULL, NULL);
+ ntemp.type = SH_NODE_MATERIAL;
+ in= nodeAddNode(ma->nodetree, &ntemp);
in->locx= 10.0f; in->locy= 300.0f;
nodeSetActive(ma->nodetree, in);
@@ -291,7 +304,7 @@ void ED_node_shader_default(Material *ma)
tosock= out->inputs.first;
nodeAddLink(ma->nodetree, in, fromsock, out, tosock);
- ntreeSolveOrder(ma->nodetree); /* needed for pointers */
+ ntreeUpdateTree(ma->nodetree);
}
/* assumes nothing being done in ntree yet, sets the default in/out node */
@@ -300,6 +313,7 @@ void ED_node_composit_default(Scene *sce)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
+ bNodeTemplate ntemp;
/* but lets check it anyway */
if(sce->nodetree) {
@@ -308,14 +322,16 @@ void ED_node_composit_default(Scene *sce)
return;
}
- sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, FALSE);
+ sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, 0);
- out= nodeAddNodeType(sce->nodetree, CMP_NODE_COMPOSITE, NULL, NULL);
+ ntemp.type = CMP_NODE_COMPOSITE;
+ out= nodeAddNode(sce->nodetree, &ntemp);
out->locx= 300.0f; out->locy= 400.0f;
out->id= &sce->id;
id_us_plus(out->id);
- in= nodeAddNodeType(sce->nodetree, CMP_NODE_R_LAYERS, NULL, NULL);
+ ntemp.type = CMP_NODE_R_LAYERS;
+ in= nodeAddNode(sce->nodetree, &ntemp);
in->locx= 10.0f; in->locy= 400.0f;
in->id= &sce->id;
id_us_plus(in->id);
@@ -326,7 +342,7 @@ void ED_node_composit_default(Scene *sce)
tosock= out->inputs.first;
nodeAddLink(sce->nodetree, in, fromsock, out, tosock);
- ntreeSolveOrder(sce->nodetree); /* needed for pointers */
+ ntreeUpdateTree(sce->nodetree);
// XXX ntreeCompositForceHidden(sce->nodetree);
}
@@ -337,6 +353,7 @@ void ED_node_texture_default(Tex *tx)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
+ bNodeTemplate ntemp;
/* but lets check it anyway */
if(tx->nodetree) {
@@ -345,12 +362,14 @@ void ED_node_texture_default(Tex *tx)
return;
}
- tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, FALSE);
+ tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, 0);
- out= nodeAddNodeType(tx->nodetree, TEX_NODE_OUTPUT, NULL, NULL);
+ ntemp.type = TEX_NODE_OUTPUT;
+ out= nodeAddNode(tx->nodetree, &ntemp);
out->locx= 300.0f; out->locy= 300.0f;
- in= nodeAddNodeType(tx->nodetree, TEX_NODE_CHECKER, NULL, NULL);
+ ntemp.type = TEX_NODE_CHECKER;
+ in= nodeAddNode(tx->nodetree, &ntemp);
in->locx= 10.0f; in->locy= 300.0f;
nodeSetActive(tx->nodetree, in);
@@ -358,43 +377,53 @@ void ED_node_texture_default(Tex *tx)
tosock= out->inputs.first;
nodeAddLink(tx->nodetree, in, fromsock, out, tosock);
- ntreeSolveOrder(tx->nodetree); /* needed for pointers */
+ ntreeUpdateTree(tx->nodetree);
}
/* id is supposed to contain a node tree */
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype)
{
- bNode *node= NULL;
- short idtype= GS(id->name);
-
- if(idtype == ID_MA) {
- *ntree= ((Material*)id)->nodetree;
- if(treetype) *treetype= NTREE_SHADER;
- }
- else if(idtype == ID_SCE) {
- *ntree= ((Scene*)id)->nodetree;
- if(treetype) *treetype= NTREE_COMPOSIT;
- }
- else if(idtype == ID_TE) {
- *ntree= ((Tex*)id)->nodetree;
- if(treetype) *treetype= NTREE_TEXTURE;
+ if (id) {
+ bNode *node= NULL;
+ short idtype= GS(id->name);
+
+ if(idtype == ID_NT) {
+ *ntree= (bNodeTree*)id;
+ if(treetype) *treetype= (*ntree)->type;
+ }
+ else if(idtype == ID_MA) {
+ *ntree= ((Material*)id)->nodetree;
+ if(treetype) *treetype= NTREE_SHADER;
+ }
+ else if(idtype == ID_SCE) {
+ *ntree= ((Scene*)id)->nodetree;
+ if(treetype) *treetype= NTREE_COMPOSIT;
+ }
+ else if(idtype == ID_TE) {
+ *ntree= ((Tex*)id)->nodetree;
+ if(treetype) *treetype= NTREE_TEXTURE;
+ }
+ else {
+ if(treetype) *treetype= 0;
+ return;
+ }
+
+ /* find editable group */
+ if(edittree) {
+ if(*ntree)
+ for(node= (*ntree)->nodes.first; node; node= node->next)
+ if(nodeGroupEditGet(node))
+ break;
+
+ if(node && node->id)
+ *edittree= (bNodeTree *)node->id;
+ else
+ *edittree= *ntree;
+ }
}
else {
+ *ntree= NULL;
if(treetype) *treetype= 0;
- return;
- }
-
- /* find editable group */
- if(edittree) {
- if(*ntree)
- for(node= (*ntree)->nodes.first; node; node= node->next)
- if(node->flag & NODE_GROUP_EDIT)
- break;
-
- if(node && node->id)
- *edittree= (bNodeTree *)node->id;
- else
- *edittree= *ntree;
}
}
@@ -403,8 +432,6 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
{
Object *ob= OBACT;
- snode->nodetree= NULL;
- snode->edittree= NULL;
snode->id= snode->from= NULL;
if(snode->treetype==NTREE_SHADER) {
@@ -418,12 +445,10 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
}
}
else if(snode->treetype==NTREE_COMPOSIT) {
- snode->from= NULL;
snode->id= &scene->id;
- /* bit clumsy but reliable way to see if we draw first time */
- if(snode->nodetree==NULL)
- ntreeCompositForceHidden(scene->nodetree, scene);
+ /* update output sockets based on available layers */
+ ntreeCompositForceHidden(scene->nodetree, scene);
}
else if(snode->treetype==NTREE_TEXTURE) {
Tex *tx= NULL;
@@ -461,9 +486,14 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
}
}
}
+ else {
+ if (snode->nodetree && snode->nodetree->type == snode->treetype)
+ snode->id = &snode->nodetree->id;
+ else
+ snode->id = NULL;
+ }
- if(snode->id)
- node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL);
+ node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL);
}
static void snode_tag_changed(SpaceNode *snode, bNode *node)
@@ -574,17 +604,216 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
}
}
-/* when links in groups change, inputs/outputs change, nodes added/deleted... */
-void node_tree_verify_groups(bNodeTree *nodetree)
+static int compare_nodes(bNode *a, bNode *b)
{
- bNode *gnode;
+ bNode *parent;
+ /* These tell if either the node or any of the parent nodes is selected.
+ * A selected parent means an unselected node is also in foreground!
+ */
+ int a_select=(a->flag & NODE_SELECT), b_select=(b->flag & NODE_SELECT);
+ int a_active=(a->flag & NODE_ACTIVE), b_active=(b->flag & NODE_ACTIVE);
+
+ /* if one is an ancestor of the other */
+ /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */
+ for (parent = a->parent; parent; parent=parent->parent) {
+ /* if b is an ancestor, it is always behind a */
+ if (parent==b)
+ return 1;
+ /* any selected ancestor moves the node forward */
+ if (parent->flag & NODE_ACTIVE)
+ a_active = 1;
+ if (parent->flag & NODE_SELECT)
+ a_select = 1;
+ }
+ for (parent = b->parent; parent; parent=parent->parent) {
+ /* if a is an ancestor, it is always behind b */
+ if (parent==a)
+ return 0;
+ /* any selected ancestor moves the node forward */
+ if (parent->flag & NODE_ACTIVE)
+ b_active = 1;
+ if (parent->flag & NODE_SELECT)
+ b_select = 1;
+ }
+
+ /* if one of the nodes is in the background and the other not */
+ if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND))
+ return 0;
+ else if (!(a->flag & NODE_BACKGROUND) && (b->flag & NODE_BACKGROUND))
+ return 1;
- gnode= node_tree_get_editgroup(nodetree);
+ /* if one has a higher selection state (active > selected > nothing) */
+ if (!b_active && a_active)
+ return 1;
+ else if (!b_select && (a_active || a_select))
+ return 1;
- /* does all materials */
- if(gnode)
- nodeGroupVerify((bNodeTree *)gnode->id);
+ return 0;
+}
+/* Sorts nodes by selection: unselected nodes first, then selected,
+ * then the active node at the very end. Relative order is kept intact!
+ */
+void node_sort(bNodeTree *ntree)
+{
+ /* merge sort is the algorithm of choice here */
+ bNode *first_a, *first_b, *node_a, *node_b, *tmp;
+ int totnodes= BLI_countlist(&ntree->nodes);
+ int k, a, b;
+
+ k = 1;
+ while (k < totnodes) {
+ first_a = first_b = ntree->nodes.first;
+
+ do {
+ /* setup first_b pointer */
+ for (b=0; b < k && first_b; ++b) {
+ first_b = first_b->next;
+ }
+ /* all batches merged? */
+ if (first_b==NULL)
+ break;
+
+ /* merge batches */
+ node_a = first_a;
+ node_b = first_b;
+ a = b = 0;
+ while (a < k && b < k && node_b) {
+ if (compare_nodes(node_a, node_b)==0) {
+ node_a = node_a->next;
+ ++a;
+ }
+ else {
+ tmp = node_b;
+ node_b = node_b->next;
+ ++b;
+ BLI_remlink(&ntree->nodes, tmp);
+ BLI_insertlinkbefore(&ntree->nodes, node_a, tmp);
+ }
+ }
+
+ /* setup first pointers for next batch */
+ first_b = node_b;
+ for (; b < k; ++b) {
+ /* all nodes sorted? */
+ if (first_b==NULL)
+ break;
+ first_b = first_b->next;
+ }
+ first_a = first_b;
+ } while (first_b);
+
+ k = k << 1;
+ }
+}
+
+static int inside_rctf(rctf *bounds, rctf *rect)
+{
+ return (bounds->xmin <= rect->xmin && bounds->xmax >= rect->xmax
+ && bounds->ymin <= rect->ymin && bounds->ymax >= rect->ymax);
+}
+
+static void node_frame_attach_nodes(bNodeTree *UNUSED(ntree), bNode *frame)
+{
+ bNode *node;
+
+ /* only check nodes on top of the frame for attaching */
+ for (node=frame->next; node; node=node->next) {
+ if (node->parent==frame) {
+ /* detach nodes that went outside the frame */
+ if (!inside_rctf(&frame->totr, &node->totr))
+ nodeDetachNode(node);
+ }
+ else if (node->flag & NODE_SELECT && node->parent==NULL) {
+ /* attach selected, still unparented nodes */
+ if (inside_rctf(&frame->totr, &node->totr))
+ nodeAttachNode(node, frame);
+ }
+ }
+}
+
+void ED_node_update_hierarchy(bContext *UNUSED(C), bNodeTree *ntree)
+{
+ bNode *node;
+
+ /* XXX This does not work due to layout functions relying on node->block,
+ * which only exists during actual drawing. Can we rely on valid totr rects?
+ */
+ /* make sure nodes have correct bounding boxes after transform */
+// node_update_nodetree(C, ntree, 0.0f, 0.0f);
+
+ /* all selected nodes are re-parented */
+ for (node=ntree->nodes.last; node; node=node->prev) {
+ if (node->flag & NODE_SELECT && node->parent)
+ nodeDetachNode(node);
+ }
+
+ /* update higher Z-level nodes first */
+ for (node=ntree->nodes.last; node; node=node->prev) {
+ /* XXX callback? */
+ if (node->type==NODE_FRAME)
+ node_frame_attach_nodes(ntree, node);
+ }
+}
+
+/* ***************** generic operator functions for nodes ***************** */
+
+static int edit_node_poll(bContext *C)
+{
+ return ED_operator_node_active(C);
+}
+
+static void edit_node_properties(wmOperatorType *ot)
+{
+ /* XXX could node be a context pointer? */
+ RNA_def_string(ot->srna, "node", "", 32, "Node", "");
+ RNA_def_int(ot->srna, "socket", 0, 0, MAX_SOCKET, "Socket", "", 0, MAX_SOCKET);
+ RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Side", "");
+}
+
+static int edit_node_invoke_properties(bContext *C, wmOperator *op)
+{
+ if (!RNA_property_is_set(op->ptr, "node")) {
+ bNode *node= CTX_data_pointer_get_type(C, "node", &RNA_Node).data;
+ if (!node)
+ return 0;
+ else
+ RNA_string_set(op->ptr, "node", node->name);
+ }
+
+ if (!RNA_property_is_set(op->ptr, "in_out"))
+ RNA_enum_set(op->ptr, "in_out", SOCK_IN);
+
+ if (!RNA_property_is_set(op->ptr, "socket"))
+ RNA_int_set(op->ptr, "socket", 0);
+
+ return 1;
+}
+
+static void edit_node_properties_get(wmOperator *op, bNodeTree *ntree, bNode **rnode, bNodeSocket **rsock, int *rin_out)
+{
+ bNode *node;
+ bNodeSocket *sock=NULL;
+ char nodename[32];
+ int sockindex;
+ int in_out;
+ RNA_string_get(op->ptr, "node", nodename);
+ node = nodeFindNodebyName(ntree, nodename);
+
+ in_out = RNA_enum_get(op->ptr, "in_out");
+
+ sockindex = RNA_int_get(op->ptr, "socket");
+ switch (in_out) {
+ case SOCK_IN: sock = BLI_findlink(&node->inputs, sockindex); break;
+ case SOCK_OUT: sock = BLI_findlink(&node->outputs, sockindex); break;
+ }
+
+ if (rnode)
+ *rnode = node;
+ if (rsock)
+ *rsock = sock;
+ if (rin_out)
+ *rin_out = in_out;
}
/* ***************** Edit Group operator ************* */
@@ -594,8 +823,8 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
bNode *node;
/* make sure nothing has group editing on */
- for(node= snode->nodetree->nodes.first; node; node= node->next)
- node->flag &= ~NODE_GROUP_EDIT;
+ for(node=snode->nodetree->nodes.first; node; node=node->next)
+ nodeGroupEditClear(node);
if(gnode==NULL) {
/* with NULL argument we do a toggle */
@@ -603,34 +832,30 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
gnode= nodeGetActive(snode->nodetree);
}
- if(gnode && gnode->type==NODE_GROUP && gnode->id) {
- if(gnode->id->lib)
- ntreeMakeLocal((bNodeTree *)gnode->id);
-
- gnode->flag |= NODE_GROUP_EDIT;
- snode->edittree= (bNodeTree *)gnode->id;
+ if (gnode) {
+ snode->edittree = nodeGroupEditSet(gnode, 1);
/* deselect all other nodes, so we can also do grabbing of entire subtree */
for(node= snode->nodetree->nodes.first; node; node= node->next)
node->flag &= ~SELECT;
gnode->flag |= SELECT;
-
}
else
snode->edittree= snode->nodetree;
-
- ntreeSolveOrder(snode->nodetree);
}
static int node_group_edit_exec(bContext *C, wmOperator *UNUSED(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);
+ if (snode->nodetree==snode->edittree) {
+ bNode *gnode= nodeGetActive(snode->nodetree);
+ snode_make_group_editable(snode, gnode);
+ }
+ else
+ snode_make_group_editable(snode, NULL);
WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
@@ -643,7 +868,8 @@ static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e
bNode *gnode;
gnode= nodeGetActive(snode->edittree);
- if(gnode && gnode->type==NODE_GROUP && gnode->id && gnode->id->lib) {
+ /* XXX callback? */
+ if(gnode && gnode->id && GS(gnode->id->name)==ID_NT && gnode->id->lib) {
uiPupMenuOkee(C, op->type->idname, "Make group local?");
return OPERATOR_CANCELLED;
}
@@ -674,7 +900,7 @@ static int node_group_socket_add_exec(bContext *C, wmOperator *op)
SpaceNode *snode = CTX_wm_space_node(C);
int in_out= -1;
char name[32]= "";
- int type= SOCK_VALUE;
+ int type= SOCK_FLOAT;
bNodeTree *ngroup= snode->edittree;
bNodeSocket *sock;
@@ -691,9 +917,10 @@ static int node_group_socket_add_exec(bContext *C, wmOperator *op)
else
return OPERATOR_CANCELLED;
- sock = nodeGroupAddSocket(ngroup, name, type, in_out);
+ /* using placeholder subtype first */
+ sock = node_group_add_socket(ngroup, name, type, in_out);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
@@ -716,7 +943,7 @@ void NODE_OT_group_socket_add(wmOperatorType *ot)
RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Type", "Input or Output");
RNA_def_string(ot->srna, "name", "", 32, "Name", "Group socket name");
- RNA_def_enum(ot->srna, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of the group socket");
+ RNA_def_enum(ot->srna, "type", node_socket_type_items, SOCK_FLOAT, "Type", "Type of the group socket");
}
/* ***************** Remove Group Socket operator ************* */
@@ -743,8 +970,8 @@ static int node_group_socket_remove_exec(bContext *C, wmOperator *op)
sock = (bNodeSocket*)BLI_findlink(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, index);
if (sock) {
- nodeGroupRemoveSocket(ngroup, sock, in_out);
- node_tree_verify_groups(snode->nodetree);
+ node_group_remove_socket(ngroup, sock, in_out);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
}
@@ -801,6 +1028,8 @@ static int node_group_socket_move_up_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->inputs, sock);
BLI_insertlinkbefore(&ngroup->inputs, prev, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
}
else if (in_out==SOCK_OUT) {
sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index);
@@ -810,8 +1039,10 @@ static int node_group_socket_move_up_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->outputs, sock);
BLI_insertlinkbefore(&ngroup->outputs, prev, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
@@ -867,6 +1098,8 @@ static int node_group_socket_move_down_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->inputs, sock);
BLI_insertlinkafter(&ngroup->inputs, next, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
}
else if (in_out==SOCK_OUT) {
sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index);
@@ -876,8 +1109,10 @@ static int node_group_socket_move_down_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->outputs, sock);
BLI_insertlinkafter(&ngroup->outputs, next, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
@@ -924,7 +1159,7 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_WARNING, "Not a group");
return OPERATOR_CANCELLED;
}
- else if(!nodeGroupUnGroup(snode->edittree, gnode)) {
+ else if(!node_group_ungroup(snode->edittree, gnode)) {
BKE_report(op->reports, RPT_WARNING, "Can't ungroup");
return OPERATOR_CANCELLED;
}
@@ -952,70 +1187,16 @@ void NODE_OT_group_ungroup(wmOperatorType *ot)
/* ************************** Node generic ************** */
-/* allows to walk the list in order of visibility */
-bNode *next_node(bNodeTree *ntree)
-{
- static bNode *current=NULL, *last= NULL;
-
- if(ntree) {
- /* set current to the first selected node */
- for(current= ntree->nodes.last; current; current= current->prev)
- if(current->flag & NODE_SELECT)
- break;
-
- /* set last to the first unselected node */
- for(last= ntree->nodes.last; last; last= last->prev)
- if((last->flag & NODE_SELECT)==0)
- break;
-
- if(current==NULL)
- current= last;
-
- return NULL;
- }
- /* no nodes, or we are ready */
- if(current==NULL)
- return NULL;
-
- /* now we walk the list backwards, but we always return current */
- if(current->flag & NODE_SELECT) {
- bNode *node= current;
-
- /* find previous selected */
- current= current->prev;
- while(current && (current->flag & NODE_SELECT)==0)
- current= current->prev;
-
- /* find first unselected */
- if(current==NULL)
- current= last;
-
- return node;
- }
- else {
- bNode *node= current;
-
- /* find previous unselected */
- current= current->prev;
- while(current && (current->flag & NODE_SELECT))
- current= current->prev;
-
- return node;
- }
-
- return NULL;
-}
-
/* is rct in visible part of node? */
static bNode *visible_node(SpaceNode *snode, rctf *rct)
{
- bNode *tnode;
+ bNode *node;
- for(next_node(snode->edittree); (tnode=next_node(NULL));) {
- if(BLI_isect_rctf(&tnode->totr, rct, NULL))
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
+ if(BLI_isect_rctf(&node->totr, rct, NULL))
break;
}
- return tnode;
+ return node;
}
/* **************************** */
@@ -1318,8 +1499,9 @@ void NODE_OT_backimage_sample(wmOperatorType *ot)
/* ********************** size widget operator ******************** */
typedef struct NodeSizeWidget {
- float mxstart;
- float oldwidth;
+ float mxstart, mystart;
+ float oldwidth, oldheight;
+ float oldminiwidth;
} NodeSizeWidget;
static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
@@ -1338,13 +1520,16 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
if (node) {
if(node->flag & NODE_HIDDEN) {
- node->miniwidth= nsw->oldwidth + mx - nsw->mxstart;
+ node->miniwidth= nsw->oldminiwidth + mx - nsw->mxstart;
CLAMP(node->miniwidth, 0.0f, 100.0f);
}
else {
node->width= nsw->oldwidth + mx - nsw->mxstart;
CLAMP(node->width, UI_DPI_FAC*node->typeinfo->minwidth, UI_DPI_FAC*node->typeinfo->maxwidth);
}
+ /* height works the other way round ... */
+ node->height= nsw->oldheight - my + nsw->mystart;
+ CLAMP(node->height, node->typeinfo->minheight, node->typeinfo->maxheight);
}
ED_region_tag_redraw(ar);
@@ -1358,6 +1543,8 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
MEM_freeN(nsw);
op->customdata= NULL;
+ ED_node_update_hierarchy(C, snode->edittree);
+
return OPERATOR_FINISHED;
}
@@ -1371,35 +1558,21 @@ static int node_resize_invoke(bContext *C, wmOperator *op, wmEvent *event)
bNode *node= editnode_get_active(snode->edittree);
if(node) {
- rctf totr;
-
/* convert mouse coordinates to v2d space */
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1],
&snode->mx, &snode->my);
- totr= node->totr;
-
- if(node->flag & NODE_HIDDEN) {
- /* right part of node */
- totr.xmin= node->totr.xmax-20.0f;
- }
- else {
- /* bottom right corner */
- totr.xmin= totr.xmax-10.0f;
- totr.ymax= totr.ymin+10.0f;
- }
-
- if(BLI_in_rctf(&totr, snode->mx, snode->my)) {
+ if(node->typeinfo->resize_area_func(node, snode->mx, snode->my)) {
NodeSizeWidget *nsw= MEM_callocN(sizeof(NodeSizeWidget), "size widget op data");
op->customdata= nsw;
nsw->mxstart= snode->mx;
+ nsw->mystart= snode->my;
/* store old */
- if(node->flag & NODE_HIDDEN)
- nsw->oldwidth= node->miniwidth;
- else
- nsw->oldwidth= node->width;
+ nsw->oldwidth= node->width;
+ nsw->oldheight= node->height;
+ nsw->oldminiwidth= node->miniwidth;
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -1598,7 +1771,7 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode)
link->fromnode= tonode;
link->fromsock= sock;
}
- ntreeSolveOrder(snode->edittree);
+ ntreeUpdateTree(snode->edittree);
snode_tag_changed(snode, node);
}
}
@@ -1905,6 +2078,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
ListBase *nodelist = MEM_callocN(sizeof(ListBase), "items_list");
bNodeListItem *nli;
bNode *node;
+ bNodeLink *link;
int i, numlinks=0;
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -1941,7 +2115,15 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
/* then we can connect */
if (replace)
nodeRemSocketLinks(snode->edittree, sock_to);
- nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to);
+
+ link = nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to);
+ /* validate the new link */
+ ntreeUpdateTree(snode->edittree);
+ if (!(link->flag & NODE_LINK_VALID)) {
+ nodeRemLink(snode->edittree, link);
+ continue;
+ }
+
snode_tag_changed(snode, node_to);
++numlinks;
break;
@@ -1949,8 +2131,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
}
if (numlinks > 0) {
- node_tree_verify_groups(snode->nodetree);
- ntreeSolveOrder(snode->edittree);
+ ntreeUpdateTree(snode->edittree);
}
BLI_freelistN(nodelist);
@@ -1958,28 +2139,13 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
}
/* can be called from menus too, but they should do own undopush and redraws */
-bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, int type, float locx, float locy)
+bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, bNodeTemplate *ntemp, float locx, float locy)
{
bNode *node= NULL, *gnode;
node_deselectall(snode);
- if(type>=NODE_DYNAMIC_MENU) {
- node= nodeAddNodeType(snode->edittree, type, NULL, NULL);
- }
- else if(type>=NODE_GROUP_MENU) {
- if(snode->edittree!=snode->nodetree) {
- // XXX error("Can not add a Group in a Group");
- return NULL;
- }
- else {
- bNodeTree *ngroup= BLI_findlink(&bmain->nodetree, type-NODE_GROUP_MENU);
- if(ngroup)
- node= nodeAddNodeType(snode->edittree, NODE_GROUP, ngroup, NULL);
- }
- }
- else
- node= nodeAddNodeType(snode->edittree, type, NULL, NULL);
+ node = nodeAddNode(snode->edittree, ntemp);
/* generics */
if(node) {
@@ -1993,7 +2159,7 @@ bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, int type, floa
node->locy -= gnode->locy;
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
ED_node_set_active(bmain, snode->edittree, node);
if(snode->nodetree->type==NTREE_COMPOSIT) {
@@ -2094,9 +2260,8 @@ static int node_duplicate_exec(bContext *C, wmOperator *op)
break;
}
- ntreeSolveOrder(ntree);
+ ntreeUpdateTree(snode->edittree);
- node_tree_verify_groups(snode->nodetree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2185,17 +2350,25 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if( link->tosock!= tsock && (!tnode || (tnode!=node && link->tonode!=tnode)) ) {
link->tonode= tnode;
link->tosock= tsock;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
- ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
+ }
+
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
}
}
}
else {
- BLI_remlink(&snode->edittree->links, link);
- link->prev = link->next = NULL;
- link->tonode= NULL;
- link->tosock= NULL;
+ if (link->tonode || link->tosock) {
+ BLI_remlink(&snode->edittree->links, link);
+ link->prev = link->next = NULL;
+ link->tonode= NULL;
+ link->tosock= NULL;
+
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
+ }
}
}
else {
@@ -2205,18 +2378,25 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if( link->fromsock!= tsock && (!tnode || (tnode!=node && link->fromnode!=tnode)) ) {
link->fromnode= tnode;
link->fromsock= tsock;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
- ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
+ }
+
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
}
}
}
}
else {
- BLI_remlink(&snode->edittree->links, link);
- link->prev = link->next = NULL;
- link->fromnode= NULL;
- link->fromsock= NULL;
+ if (link->tonode || link->tosock) {
+ BLI_remlink(&snode->edittree->links, link);
+ link->prev = link->next = NULL;
+ link->fromnode= NULL;
+ link->fromsock= NULL;
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
+ }
}
}
/* hilight target sockets only */
@@ -2244,23 +2424,26 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
else if (outside_group_rect(snode) && (link->tonode || link->fromnode)) {
/* automatically add new group socket */
if (link->tonode && link->tosock) {
- link->fromsock = nodeGroupExposeSocket(snode->edittree, link->tosock, SOCK_IN);
+ link->fromsock = node_group_expose_socket(snode->edittree, link->tosock, SOCK_IN);
link->fromnode = NULL;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
+ }
+ snode->edittree->update |= NTREE_UPDATE_GROUP_IN | NTREE_UPDATE_LINKS;
}
else if (link->fromnode && link->fromsock) {
- link->tosock = nodeGroupExposeSocket(snode->edittree, link->fromsock, SOCK_OUT);
+ link->tosock = node_group_expose_socket(snode->edittree, link->fromsock, SOCK_OUT);
link->tonode = NULL;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
+ }
+ snode->edittree->update |= NTREE_UPDATE_GROUP_OUT | NTREE_UPDATE_LINKS;
}
}
else
nodeRemLink(snode->edittree, link);
- ntreeSolveOrder(snode->edittree);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2335,7 +2518,7 @@ static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event)
ED_preview_kill_jobs(C);
nldrag->in_out= node_link_init(snode, nldrag);
-
+
if(nldrag->in_out) {
op->customdata= nldrag;
@@ -2408,7 +2591,7 @@ static int node_make_link_exec(bContext *C, wmOperator *op)
snode_autoconnect(snode, 1, replace);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2482,8 +2665,7 @@ static int cut_links_exec(bContext *C, wmOperator *op)
}
}
- ntreeSolveOrder(snode->edittree);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2608,7 +2790,7 @@ void ED_node_link_insert(ScrArea *sa)
link->flag &= ~NODE_LINKFLAG_HILITE;
nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
- ntreeSolveOrder(snode->edittree); /* needed for pointers */
+ ntreeUpdateTree(snode->edittree); /* needed for pointers */
snode_tag_changed(snode, select);
ED_node_changed_update(snode->id, select);
}
@@ -2819,14 +3001,14 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
ED_preview_kill_jobs(C);
- gnode= nodeMakeGroupFromSelected(snode->nodetree);
+ gnode= node_group_make_from_selected(snode->nodetree);
if(gnode==NULL) {
BKE_report(op->reports, RPT_WARNING, "Can not make Group");
return OPERATOR_CANCELLED;
}
else {
nodeSetActive(snode->nodetree, gnode);
- ntreeSolveOrder(snode->nodetree);
+ ntreeUpdateTree(snode->nodetree);
}
snode_notify(C, snode);
@@ -2972,7 +3154,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
@@ -3056,7 +3238,7 @@ static int node_delete_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -3126,7 +3308,7 @@ static void node_delete_reconnect(bNodeTree* tree, bNode* node)
deliveringvecsocket = link->fromsock;
}
break;
- case SOCK_VALUE:
+ case SOCK_FLOAT:
if (valsocket == NULL) {
valsocket = link->tosock;
deliveringvalnode = link->fromnode;
@@ -3147,7 +3329,7 @@ static void node_delete_reconnect(bNodeTree* tree, bNode* node)
numberOfConnectedOutputSockets ++;
if (!first) first = link;
switch(sock->type) {
- case SOCK_VALUE:
+ case SOCK_FLOAT:
if (deliveringvalsocket) {
link->fromnode = deliveringvalnode;
link->fromsock = deliveringvalsocket;
@@ -3205,7 +3387,7 @@ static int node_delete_reconnect_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -3235,7 +3417,7 @@ static int node_show_cycles_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode= CTX_wm_space_node(C);
/* this is just a wrapper around this call... */
- ntreeSolveOrder(snode->edittree);
+ ntreeUpdateTree(snode->nodetree);
snode_notify(C, snode);
return OPERATOR_FINISHED;
@@ -3265,7 +3447,9 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
Image *ima= NULL;
- int ntype=0;
+ bNodeTemplate ntemp;
+
+ ntemp.type = -1;
/* check input variables */
if (RNA_property_is_set(op->ptr, "filepath"))
@@ -3297,11 +3481,14 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
node_deselectall(snode);
if (snode->nodetree->type==NTREE_COMPOSIT)
- ntype = CMP_NODE_IMAGE;
+ ntemp.type = CMP_NODE_IMAGE;
+ if (ntemp.type < 0)
+ return OPERATOR_CANCELLED;
+
ED_preview_kill_jobs(C);
- node = node_add_node(snode, bmain, scene, ntype, snode->mx, snode->my);
+ node = node_add_node(snode, bmain, scene, &ntemp, snode->mx, snode->my);
if (!node) {
BKE_report(op->reports, RPT_WARNING, "Could not add an image node.");
@@ -3350,5 +3537,67 @@ void NODE_OT_add_file(wmOperatorType *ot)
RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign.");
}
+/********************** New node tree operator *********************/
+
+static int new_node_tree_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode;
+ bNodeTree *ntree;
+ PointerRNA ptr, idptr;
+ PropertyRNA *prop;
+ int treetype;
+ char treename[MAX_ID_NAME-2] = "NodeTree";
+
+ /* retrieve state */
+ snode= CTX_wm_space_node(C);
+
+ if (RNA_property_is_set(op->ptr, "type"))
+ treetype = RNA_enum_get(op->ptr, "type");
+ else
+ treetype = snode->treetype;
+
+ if (RNA_property_is_set(op->ptr, "name"))
+ RNA_string_get(op->ptr, "name", treename);
+
+ ntree = ntreeAddTree(treename, treetype, 0);
+ if(!ntree)
+ return OPERATOR_CANCELLED;
+
+ /* hook into UI */
+ uiIDContextProperty(C, &ptr, &prop);
+ if(prop) {
+ RNA_id_pointer_create(&ntree->id, &idptr);
+ RNA_property_pointer_set(&ptr, prop, idptr);
+ /* RNA_property_pointer_set increases the user count,
+ * fixed here as the editor is the initial user.
+ */
+ --ntree->id.us;
+ RNA_property_update(C, &ptr, prop);
+ }
+ else if(snode) {
+ Scene *scene= CTX_data_scene(C);
+ snode->nodetree = ntree;
+
+ ED_node_tree_update(snode, scene);
+ }
+
+ return OPERATOR_FINISHED;
+}
+void NODE_OT_new_node_tree(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "New node tree";
+ ot->idname= "NODE_OT_new_node_tree";
+
+ /* api callbacks */
+ ot->exec= new_node_tree_exec;
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", nodetree_type_items, NTREE_COMPOSIT, "Tree Type", "");
+ RNA_def_string(ot->srna, "name", "NodeTree", MAX_ID_NAME-2, "Name", "");
+}
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index 634e49dc515..7077f4a7497 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -45,24 +45,26 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_screen.h"
#include "BKE_node.h"
#include "BKE_main.h"
+#include "RNA_access.h"
+
#include "WM_api.h"
#include "WM_types.h"
-
#include "UI_interface.h"
-#include "UI_resources.h"
#include "UI_interface_icons.h"
+#include "UI_resources.h"
#include "UI_view2d.h"
#include "node_intern.h"
/* ************************ add menu *********************** */
-static void do_node_add(bContext *C, void *UNUSED(arg), int event)
+static void do_node_add(bContext *C, bNodeTemplate *ntemp)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -89,7 +91,7 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event)
else node->flag &= ~NODE_TEST;
}
- node= node_add_node(snode, bmain, scene, event, snode->mx, snode->my);
+ node= node_add_node(snode, bmain, scene, ntemp, snode->mx, snode->my);
/* select previous selection before autoconnect */
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -105,69 +107,111 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event)
snode_dag_update(C, snode);
}
-static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
+static void do_node_add_static(bContext *C, void *UNUSED(arg), int event)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = event;
+ do_node_add(C, &ntemp);
+}
+
+static void do_node_add_group(bContext *C, void *UNUSED(arg), int event)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+ bNodeTemplate ntemp;
+
+ if (event>=0) {
+ ntemp.ngroup= BLI_findlink(&G.main->nodetree, event);
+ ntemp.type = ntemp.ngroup->nodetype;
+ }
+ else {
+ ntemp.type = -event;
+ switch (ntemp.type) {
+ case NODE_GROUP:
+ ntemp.ngroup = ntreeAddTree("Group", snode->treetype, ntemp.type);
+ break;
+ case NODE_FORLOOP:
+ ntemp.ngroup = ntreeAddTree("For Loop", snode->treetype, ntemp.type);
+ break;
+ case NODE_WHILELOOP:
+ ntemp.ngroup = ntreeAddTree("While Loop", snode->treetype, ntemp.type);
+ break;
+ default:
+ ntemp.ngroup = NULL;
+ }
+ }
+ if (!ntemp.ngroup)
+ return;
+
+ do_node_add(C, &ntemp);
+}
+
+#if 0 /* disabled */
+static void do_node_add_dynamic(bContext *C, void *UNUSED(arg), int event)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_DYNAMIC;
+ do_node_add(C, &ntemp);
+}
+#endif
+
+static int node_tree_has_type(int treetype, int nodetype)
+{
+ bNodeTreeType *ttype= ntreeGetType(treetype);
+ bNodeType *ntype;
+ for (ntype=ttype->node_types.first; ntype; ntype=ntype->next) {
+ if (ntype->type==nodetype)
+ return 1;
+ }
+ return 0;
+}
+
+static void node_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
{
Main *bmain= CTX_data_main(C);
SpaceNode *snode= CTX_wm_space_node(C);
bNodeTree *ntree;
int nodeclass= GET_INT_FROM_POINTER(arg_nodeclass);
- int tot= 0, a;
+ int event;
ntree = snode->nodetree;
-
+
if(!ntree) {
uiItemS(layout);
return;
}
-
- /* mostly taken from toolbox.c, node_add_sublevel() */
- if(nodeclass==NODE_CLASS_GROUP) {
- bNodeTree *ngroup= bmain->nodetree.first;
- for(; ngroup; ngroup= ngroup->id.next)
- if(ngroup->type==ntree->type)
- tot++;
- }
- else {
- bNodeType *type = ntree->alltypes.first;
- while(type) {
- if(type->nclass == nodeclass)
- tot++;
- type= type->next;
- }
- }
- if(tot==0) {
+ if (nodeclass==NODE_CLASS_GROUP) {
+ bNodeTree *ngroup;
+
+ uiLayoutSetFunc(layout, do_node_add_group, NULL);
+
+ /* XXX hack: negative numbers used for empty group types */
+ if (node_tree_has_type(ntree->type, NODE_GROUP))
+ uiItemV(layout, "New Group", 0, -NODE_GROUP);
+ if (node_tree_has_type(ntree->type, NODE_FORLOOP))
+ uiItemV(layout, "New For Loop", 0, -NODE_FORLOOP);
+ if (node_tree_has_type(ntree->type, NODE_WHILELOOP))
+ uiItemV(layout, "New While Loop", 0, -NODE_WHILELOOP);
uiItemS(layout);
- return;
- }
-
- uiLayoutSetFunc(layout, do_node_add, NULL);
-
- if(nodeclass==NODE_CLASS_GROUP) {
- bNodeTree *ngroup= bmain->nodetree.first;
-
- for(tot=0, a=0; ngroup; ngroup= ngroup->id.next, tot++) {
- if(ngroup->type==ntree->type) {
- uiItemV(layout, ngroup->id.name+2, ICON_NONE, NODE_GROUP_MENU+tot);
- a++;
+
+ for(ngroup=bmain->nodetree.first, event=0; ngroup; ngroup= ngroup->id.next, ++event) {
+ /* only use group trees */
+ if (ngroup->type==ntree->type && ELEM3(ngroup->nodetype, NODE_GROUP, NODE_FORLOOP, NODE_WHILELOOP)) {
+ uiItemV(layout, ngroup->id.name+2, 0, event);
}
}
}
+ else if (nodeclass==NODE_DYNAMIC) {
+ /* disabled */
+ }
else {
- bNodeType *type;
- int script=0;
-
- for(a=0, type= ntree->alltypes.first; type; type=type->next) {
- if(type->nclass == nodeclass && type->name) {
- if(type->type == NODE_DYNAMIC) {
- uiItemV(layout, type->name, ICON_NONE, NODE_DYNAMIC_MENU+script);
- script++;
- }
- else
- uiItemV(layout, type->name, ICON_NONE, type->type);
-
- a++;
- }
+ bNodeType *ntype;
+
+ uiLayoutSetFunc(layout, do_node_add_static, NULL);
+
+ for (ntype=ntreeGetType(ntree->type)->node_types.first; ntype; ntype=ntype->next) {
+ if(ntype->nclass==nodeclass && ntype->name)
+ uiItemV(layout, ntype->name, 0, ntype->type);
}
}
}
@@ -181,34 +225,37 @@ static void node_menu_add(const bContext *C, Menu *menu)
uiLayoutSetActive(layout, 0);
if(snode->treetype==NTREE_SHADER) {
- uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
- uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
- uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
- uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
- uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
- uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
- uiItemMenuF(layout, "Dynamic", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
+ uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, "Vector", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+ uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, "Dynamic", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
+ uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
}
else if(snode->treetype==NTREE_COMPOSIT) {
- uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
- uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
- uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
- uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
- uiItemMenuF(layout, "Filter", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER));
- uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
- uiItemMenuF(layout, "Matte", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE));
- uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
- uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, "Vector", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+ uiItemMenuF(layout, "Filter", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER));
+ uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, "Matte", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE));
+ uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+ uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
}
else if(snode->treetype==NTREE_TEXTURE) {
- uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
- uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
- uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
- uiItemMenuF(layout, "Patterns", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN));
- uiItemMenuF(layout, "Textures", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
- uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
- uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
- uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, "Patterns", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN));
+ uiItemMenuF(layout, "Textures", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
+ uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+ uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
}
}
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 4cfde22b8a0..3751d8efae8 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -33,6 +33,8 @@
#ifndef ED_NODE_INTERN_H
#define ED_NODE_INTERN_H
+#include "UI_interface.h"
+
/* internal exports only */
struct ARegion;
@@ -40,6 +42,7 @@ struct ARegionType;
struct View2D;
struct bContext;
struct wmWindowManager;
+struct bNodeTemplate;
struct bNode;
struct bNodeSocket;
struct bNodeLink;
@@ -64,6 +67,11 @@ void node_header_buttons(const bContext *C, ARegion *ar);
void node_menus_register(void);
/* node_draw.c */
+void node_socket_circle_draw(struct bNodeTree *ntree, struct bNodeSocket *sock, float size);
+void node_draw_default(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node);
+void node_update_default(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
+void node_update_nodetree(const struct bContext *C, struct bNodeTree *ntree, float offsetx, float offsety);
+void node_draw_nodetree(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree);
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d);
/* node_buttons.c */
@@ -90,6 +98,7 @@ void NODE_OT_select_same_type_prev(wmOperatorType *ot);
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link);
void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol);
+void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage);
void draw_nodespace_color_info(struct ARegion *ar, int color_manage, int channels, int x, int y, char *cp, float *fp);
@@ -97,10 +106,10 @@ void draw_nodespace_color_info(struct ARegion *ar, int color_manage, int channel
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype);
void snode_notify(bContext *C, SpaceNode *snode);
void snode_dag_update(bContext *C, SpaceNode *snode);
-bNode *next_node(bNodeTree *ntree);
-bNode *node_add_node(SpaceNode *snode, struct Main *bmain, Scene *scene, int type, float locx, float locy);
+bNode *node_add_node(struct SpaceNode *snode, struct Main *bmain, struct Scene *scene, struct bNodeTemplate *ntemp, float locx, float locy);
void snode_set_context(SpaceNode *snode, Scene *scene);
void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
+void node_sort(struct bNodeTree *ntree);
void node_deselectall(SpaceNode *snode);
int node_select_same_type(SpaceNode *snode);
int node_select_same_type_np(SpaceNode *snode, int dir);
@@ -146,6 +155,8 @@ void NODE_OT_backimage_sample(wmOperatorType *ot);
void NODE_OT_add_file(struct wmOperatorType *ot);
+void NODE_OT_new_node_tree(struct wmOperatorType *ot);
+
extern const char *node_context_dir[];
// XXXXXX
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 4bb0283690b..153d703ddf6 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -96,6 +96,8 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_backimage_sample);
WM_operatortype_append(NODE_OT_add_file);
+
+ WM_operatortype_append(NODE_OT_new_node_tree);
}
void ED_operatormacros_node(void)
@@ -193,6 +195,5 @@ void node_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "NODE_OT_render_changed", ZKEY, KM_PRESS, 0, 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 ca673277739..3d8b1676ea5 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -62,7 +62,7 @@ static bNode *node_under_mouse(bNodeTree *ntree, int mx, int my)
{
bNode *node;
- for(next_node(ntree); (node=next_node(NULL));) {
+ for(node=ntree->nodes.last; node; node=node->prev) {
/* node body (header and scale are in other operators) */
if (BLI_in_rctf(&node->totr, mx, my))
return node;
@@ -93,8 +93,10 @@ static bNode *node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, cons
}
else
node->flag ^= SELECT;
-
+
ED_node_set_active(bmain, snode->edittree, node);
+
+ node_sort(snode->edittree);
}
return node;
@@ -182,6 +184,8 @@ static int node_borderselect_exec(bContext *C, wmOperator *op)
}
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
@@ -252,6 +256,8 @@ static int node_select_all_exec(bContext *C, wmOperator *UNUSED(op))
node->flag |= NODE_SELECT;
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -292,6 +298,8 @@ static int node_select_linked_to_exec(bContext *C, wmOperator *UNUSED(op))
node->flag |= NODE_SELECT;
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -332,6 +340,8 @@ static int node_select_linked_from_exec(bContext *C, wmOperator *UNUSED(op))
node->flag |= NODE_SELECT;
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -358,6 +368,9 @@ static int node_select_same_type_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode = CTX_wm_space_node(C);
node_select_same_type(snode);
+
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -384,7 +397,11 @@ static int node_select_same_type_next_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode = CTX_wm_space_node(C);
node_select_same_type_np(snode, 0);
+
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
+
return OPERATOR_FINISHED;
}
@@ -408,6 +425,9 @@ static int node_select_same_type_prev_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode = CTX_wm_space_node(C);
node_select_same_type_np(snode, 1);
+
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c
index 601ffbd313d..c4567bea648 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -69,30 +69,14 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
sock->flag &= ~SOCK_HIDDEN;
}
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);
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(!(sock->flag & SOCK_IN_USE))
- if(sock->link==NULL)
- sock->flag |= SOCK_HIDDEN;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(!(sock->flag & SOCK_IN_USE))
- if(nodeCountSocketLinks(snode->edittree, sock)==0)
- sock->flag |= SOCK_HIDDEN;
+ /* hide unused sockets */
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->link==NULL)
+ sock->flag |= SOCK_HIDDEN;
}
- else {
- /* hide unused sockets */
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link==NULL)
- sock->flag |= SOCK_HIDDEN;
- }
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(nodeCountSocketLinks(snode->edittree, sock)==0)
- sock->flag |= SOCK_HIDDEN;
- }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(nodeCountSocketLinks(snode->edittree, sock)==0)
+ sock->flag |= SOCK_HIDDEN;
}
}
}
@@ -100,7 +84,7 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
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);
+ ntreeUpdateTree(snode->edittree);
}
static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
@@ -168,7 +152,7 @@ static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, const int mval[
UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my);
- for(next_node(snode->edittree); (node=next_node(NULL));) {
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
if(node->flag & NODE_HIDDEN) {
if(do_header_hidden_node(node, mx, my)) {
ED_region_tag_redraw(ar);
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 3c5f4a163a2..0990afa4fe6 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -439,14 +439,30 @@ static int node_context(const bContext *C, const char *member, bContextDataResul
else if(CTX_data_equals(member, "selected_nodes")) {
bNode *node;
- for(next_node(snode->edittree); (node=next_node(NULL));) {
- if(node->flag & NODE_SELECT) {
- CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node);
+ if(snode->edittree) {
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
+ if(node->flag & NODE_SELECT) {
+ CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node);
+ }
}
}
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
return 1;
}
+ else if(CTX_data_equals(member, "active_node")) {
+ bNode *node;
+
+ if(snode->edittree) {
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
+ if(node->flag & NODE_ACTIVE) {
+ CTX_data_pointer_set(result, &snode->edittree->id, &RNA_Node, node);
+ break;
+ }
+ }
+ }
+ CTX_data_type_set(result, CTX_DATA_TYPE_POINTER);
+ return 1;
+ }
return 0;
}
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 95a315272b9..e77bb979d47 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -97,7 +97,7 @@ static void outliner_height(SpaceOops *soops, ListBase *lb, int *h)
TreeElement *te= lb->first;
while(te) {
TreeStoreElem *tselem= TREESTORE(te);
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
outliner_height(soops, &te->subtree, h);
(*h) += UI_UNIT_Y;
te= te->next;
@@ -112,7 +112,7 @@ static void outliner_width(SpaceOops *soops, ListBase *lb, int *w)
// TreeStoreElem *tselem= TREESTORE(te);
// XXX fixme... te->xend is not set yet
- if(tselem->flag & TSE_CLOSED) {
+ if(!TSELEM_OPEN(tselem,soops)) {
if (te->xend > *w)
*w = te->xend;
}
@@ -135,7 +135,7 @@ static void outliner_rna_width(SpaceOops *soops, ListBase *lb, int *w, int start
if(startx+100 > *w)
*w = startx+100;
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
outliner_rna_width(soops, &te->subtree, w, startx+UI_UNIT_X);
te= te->next;
}
@@ -519,7 +519,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
}
}
@@ -560,7 +560,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
ptr= &te->rnaptr;
prop= te->directdata;
- if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0))
+ if(!(RNA_property_type(prop) == PROP_POINTER && (TSELEM_OPEN(tselem,soops))) )
uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, sizex, (int)te->ys, OL_RNA_COL_SIZEX, UI_UNIT_Y-1);
}
else if(tselem->type == TSE_RNA_ARRAY_ELEM) {
@@ -571,7 +571,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
}
}
@@ -828,7 +828,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
}
}
@@ -871,7 +871,7 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Spa
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(C, block, ar, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_buttons(C, block, ar, soops, &te->subtree);
}
}
@@ -1237,6 +1237,18 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
glEnable(GL_BLEND);
+ /* start by highlighting search matches
+ * we don't expand items when searching in the datablocks but we
+ * still want to highlight any filter matches.
+ */
+ if ( (SEARCHING_OUTLINER(soops) || (soops->outlinevis==SO_DATABLOCKS && soops->search_string[0]!=0)) &&
+ (tselem->flag & TSE_SEARCHMATCH))
+ {
+ /* TODO - add search highlight colour to theme? */
+ glColor4f(0.2f, 0.5f, 0.2f, 0.3f);
+ glRecti(startx, *starty+1, ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
+ }
+
/* colors for active/selected data */
if(tselem->type==0) {
if(te->idcode==ID_SCE) {
@@ -1317,10 +1329,10 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
icon_x = startx+5*ufac;
// icons a bit higher
- if(tselem->flag & TSE_CLOSED)
- UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT);
- else
+ if(TSELEM_OPEN(tselem,soops))
UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_DOWN);
+ else
+ UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT);
}
offsx+= UI_UNIT_X;
@@ -1356,7 +1368,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
offsx+= (int)(UI_UNIT_X + UI_GetStringWidth(te->name));
/* closed item, we draw the icons, not when it's a scene, or master-server list though */
- if(tselem->flag & TSE_CLOSED) {
+ if(!TSELEM_OPEN(tselem,soops)) {
if(te->subtree.first) {
if(tselem->type==0 && te->idcode==ID_SCE);
else if(tselem->type!=TSE_R_LAYER) { /* this tree element always has same amount of branches, so dont draw */
@@ -1382,7 +1394,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
te->ys= (float)*starty;
te->xend= startx+offsx;
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
*starty-= UI_UNIT_Y;
for(ten= te->subtree.first; ten; ten= ten->next)
@@ -1415,7 +1427,7 @@ static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx,
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
outliner_draw_hierarchy(soops, &te->subtree, startx+UI_UNIT_X, starty);
}
@@ -1439,12 +1451,12 @@ static void outliner_draw_struct_marks(ARegion *ar, SpaceOops *soops, ListBase *
tselem= TREESTORE(te);
/* selection status */
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
if(tselem->type == TSE_RNA_STRUCT)
glRecti(0, *starty+1, (int)ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, *starty+UI_UNIT_Y-1);
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_draw_struct_marks(ar, soops, &te->subtree, starty);
if(tselem->type == TSE_RNA_STRUCT)
fdrawline(0, (float)*starty+UI_UNIT_Y, ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, (float)*starty+UI_UNIT_Y);
@@ -1465,7 +1477,7 @@ static void outliner_draw_selection(ARegion *ar, SpaceOops *soops, ListBase *lb,
glRecti(0, *starty+1, (int)ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
}
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_selection(ar, soops, &te->subtree, starty);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_selection(ar, soops, &te->subtree, starty);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index 2b451a48748..05eace0d4ef 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -687,7 +687,7 @@ static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te,
te->ys= (float)(*starty);
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
TreeElement *ten;
for(ten= te->subtree.first; ten; ten= ten->next) {
outliner_set_coordinates_element(soops, ten, startx+UI_UNIT_X, starty);
@@ -910,7 +910,7 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase
}
else tselem->flag |= TSE_CLOSED;
- if(tselem->flag & TSE_CLOSED); else tree_element_show_hierarchy(scene, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) tree_element_show_hierarchy(scene, soops, &te->subtree);
}
}
@@ -1175,7 +1175,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, ReportL
}
/* go over sub-tree */
- if ((tselem->flag & TSE_CLOSED)==0)
+ if (TSELEM_OPEN(tselem,soops))
do_outliner_drivers_editop(soops, &te->subtree, reports, mode);
}
}
@@ -1343,7 +1343,7 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
}
/* go over sub-tree */
- if ((tselem->flag & TSE_CLOSED)==0)
+ if (TSELEM_OPEN(tselem,soops))
do_outliner_keyingset_editop(soops, ks, &te->subtree, mode);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 61507d1ffe5..215ab508ab6 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -126,6 +126,27 @@ typedef struct TreeElement {
#define OL_RNA_COL_SPACEX (UI_UNIT_X*2.5f)
+/* Outliner Searching --
+
+ Are we looking for something in the outliner?
+ If so finding matches in child items makes it more useful
+
+ - We want to flag parents to act as being open to filter child matches
+ - and also flag matches so we can highlight them
+ - Flags are stored in TreeStoreElem->flag
+ - Flag options defined in DNA_outliner_types.h
+ - SO_SEARCH_RECURSIVE defined in DNA_space_types.h
+
+ - NOT in datablocks view - searching all datablocks takes way too long
+ to be useful
+ - not searching into RNA items helps but isn't the complete solution
+ */
+
+#define SEARCHING_OUTLINER(sov) (sov->search_flags & SO_SEARCH_RECURSIVE)
+
+/* is the currrent element open? if so we also show children */
+#define TSELEM_OPEN(telm,sv) ( (telm->flag & TSE_CLOSED)==0 || (SEARCHING_OUTLINER(sv) && (telm->flag & TSE_CHILDSEARCH)) )
+
/* outliner_tree.c ----------------------------------------------- */
void outliner_free_tree(ListBase *lb);
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 2c0a8c34747..a88625aad0d 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -134,7 +134,7 @@ static int outliner_select(SpaceOops *soops, ListBase *lb, int *index, short *se
change |= 1;
}
}
- else if ((tselem->flag & TSE_CLOSED)==0) {
+ else if (TSELEM_OPEN(tselem,soops)) {
/* Only try selecting sub-elements if we haven't hit the right element yet
*
* Hack warning:
diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c
index b3170f9cd1e..b2fdd34aab2 100644
--- a/source/blender/editors/space_outliner/outliner_tools.c
+++ b/source/blender/editors/space_outliner/outliner_tools.c
@@ -145,7 +145,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb,
}
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
set_operation_types(soops, &te->subtree,
scenelevel, objectlevel, idlevel, datalevel);
}
@@ -250,7 +250,7 @@ static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops *
operation_cb(C, scene, te, tsep, tselem);
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_do_libdata_operation(C, scene, soops, &te->subtree, operation_cb);
}
}
@@ -397,7 +397,7 @@ void outliner_do_object_operation(bContext *C, Scene *scene_act, SpaceOops *soop
operation_cb(C, scene_owner ? scene_owner : scene_act, te, NULL, tselem);
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_do_object_operation(C, scene_act, soops, &te->subtree, operation_cb);
}
}
@@ -504,7 +504,7 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li
operation_cb(event, te, tselem);
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_do_data_operation(soops, type, event, &te->subtree, operation_cb);
}
}
@@ -857,7 +857,7 @@ static void outliner_do_id_set_operation(SpaceOops *soops, int type, ListBase *l
operation_cb(te, tselem, tsep, newid);
}
}
- if ((tselem->flag & TSE_CLOSED)==0) {
+ if (TSELEM_OPEN(tselem,soops)) {
outliner_do_id_set_operation(soops, type, &te->subtree, newid, operation_cb);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index 8904dcc360f..7e9eabc08db 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -827,6 +827,10 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
check_persistant(soops, te, id, type, index);
tselem= TREESTORE(te);
+ /* if we are searching for something expand to see child elements */
+ if(SEARCHING_OUTLINER(soops))
+ tselem->flag |= TSE_CHILDSEARCH;
+
te->parent= parent;
te->index= index; // for data arays
if(ELEM3(type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP));
@@ -981,6 +985,9 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else
te->name= (char*)RNA_struct_ui_name(ptr->type);
+ /* If searching don't expand RNA entries */
+ if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH;
+
iterprop= RNA_struct_iterator_property(ptr->type);
tot= RNA_property_collection_length(ptr, iterprop);
@@ -989,7 +996,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
if(!tselem->used)
tselem->flag &= ~TSE_CLOSED;
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
for(a=0; a<tot; a++)
outliner_add_element(soops, &te->subtree, (void*)ptr, te, TSE_RNA_PROPERTY, a);
}
@@ -1010,11 +1017,14 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
te->directdata= prop;
te->rnaptr= *ptr;
+ /* If searching don't expand RNA entries */
+ if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH;
+
if(proptype == PROP_POINTER) {
pptr= RNA_property_pointer_get(ptr, prop);
if(pptr.data) {
- if(!(tselem->flag & TSE_CLOSED))
+ if(TSELEM_OPEN(tselem,soops))
outliner_add_element(soops, &te->subtree, (void*)&pptr, te, TSE_RNA_STRUCT, -1);
else
te->flag |= TE_LAZY_CLOSED;
@@ -1023,7 +1033,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else if(proptype == PROP_COLLECTION) {
tot= RNA_property_collection_length(ptr, prop);
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
for(a=0; a<tot; a++) {
RNA_property_collection_lookup_int(ptr, prop, a, &pptr);
outliner_add_element(soops, &te->subtree, (void*)&pptr, te, TSE_RNA_STRUCT, a);
@@ -1035,7 +1045,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else if(ELEM3(proptype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
tot= RNA_property_array_length(ptr, prop);
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
for(a=0; a<tot; a++)
outliner_add_element(soops, &te->subtree, (void*)ptr, te, TSE_RNA_ARRAY_ELEM, a);
}
@@ -1068,7 +1078,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
te->directdata= idv;
te->name= km->idname;
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
a= 0;
for (kmi= km->items.first; kmi; kmi= kmi->next, a++) {
@@ -1368,7 +1378,10 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
*/
tselem= TREESTORE(te);
- if ((tselem->flag & TSE_CLOSED) || outliner_filter_tree(soops, &te->subtree)==0) {
+ /* flag as not a found item */
+ tselem->flag &= ~TSE_SEARCHMATCH;
+
+ if ((!TSELEM_OPEN(tselem,soops)) || outliner_filter_tree(soops, &te->subtree)==0) {
outliner_free_tree(&te->subtree);
BLI_remlink(lb, te);
@@ -1377,6 +1390,11 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
}
}
else {
+ tselem= TREESTORE(te);
+
+ /* flag as a found item - we can then highlight it */
+ tselem->flag |= TSE_SEARCHMATCH;
+
/* filter subtree too */
outliner_filter_tree(soops, &te->subtree);
}
@@ -1399,6 +1417,14 @@ void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
TreeStoreElem *tselem;
int show_opened= (soops->treestore==NULL); /* on first view, we open scenes */
+ /* Are we looking for something - we want to tag parents to filter child matches
+ - NOT in datablocks view - searching all datablocks takes way too long to be useful
+ - this variable is only set once per tree build */
+ if(soops->search_string[0]!=0 && soops->outlinevis!=SO_DATABLOCKS)
+ soops->search_flags |= SO_SEARCH_RECURSIVE;
+ else
+ soops->search_flags &= ~SO_SEARCH_RECURSIVE;
+
if(soops->tree.first && (soops->storeflag & SO_TREESTORE_REDRAW))
return;
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index df347506e74..e7673651546 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -2174,7 +2174,7 @@ static int sequencer_view_toggle_exec(bContext *C, wmOperator *UNUSED(op))
sseq->view++;
if (sseq->view > SEQ_VIEW_SEQUENCE_PREVIEW) sseq->view = SEQ_VIEW_SEQUENCE;
- ED_sequencer_update_view(C, sseq->view);
+ ED_area_tag_refresh(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 36471c7ffcf..5a0369ef80b 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -98,61 +98,6 @@ static ARegion *sequencer_find_region(ScrArea *sa, short type)
return ar;
}
-void ED_sequencer_update_view(bContext *C, int view)
-{
- ScrArea *sa= CTX_wm_area(C);
-
- ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW);
- ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW);
-
- switch (view) {
- case SEQ_VIEW_SEQUENCE:
- if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
- ar_main->flag &= ~RGN_FLAG_HIDDEN;
- ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
- }
- if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
- ar_preview->flag |= RGN_FLAG_HIDDEN;
- ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
- WM_event_remove_handlers(C, &ar_preview->handlers);
- }
- if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
- if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
- break;
- case SEQ_VIEW_PREVIEW:
- if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
- ar_main->flag |= RGN_FLAG_HIDDEN;
- ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
- WM_event_remove_handlers(C, &ar_main->handlers);
- }
- if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
- ar_preview->flag &= ~RGN_FLAG_HIDDEN;
- ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
- ar_preview->v2d.cur = ar_preview->v2d.tot;
- }
- if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
- if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
- break;
- case SEQ_VIEW_SEQUENCE_PREVIEW:
- if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
- ar_main->flag &= ~RGN_FLAG_HIDDEN;
- ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
- }
- if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
- ar_preview->flag &= ~RGN_FLAG_HIDDEN;
- ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
- ar_preview->v2d.cur = ar_preview->v2d.tot;
- }
- if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
- if (ar_preview) ar_preview->alignment= RGN_ALIGN_TOP;
- break;
- }
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
-}
-
-
/* ******************** default callbacks for sequencer space ***************** */
static SpaceLink *sequencer_new(const bContext *C)
@@ -256,6 +201,88 @@ static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(s
}
+static void sequencer_refresh(const bContext *C, ScrArea *sa)
+{
+ wmWindowManager *wm= CTX_wm_manager(C);
+ wmWindow *window= CTX_wm_window(C);
+ SpaceSeq *sseq= (SpaceSeq *)sa->spacedata.first;
+ ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW);
+ ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW);
+ int view_changed= 0;
+
+ switch (sseq->view) {
+ case SEQ_VIEW_SEQUENCE:
+ if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
+ ar_main->flag &= ~RGN_FLAG_HIDDEN;
+ ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
+ view_changed= 1;
+ }
+ if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
+ ar_preview->flag |= RGN_FLAG_HIDDEN;
+ ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
+ WM_event_remove_handlers((bContext*)C, &ar_preview->handlers);
+ view_changed= 1;
+ }
+ if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) {
+ ar_main->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
+ ar_preview->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ break;
+ case SEQ_VIEW_PREVIEW:
+ if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
+ ar_main->flag |= RGN_FLAG_HIDDEN;
+ ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
+ WM_event_remove_handlers((bContext*)C, &ar_main->handlers);
+ view_changed= 1;
+ }
+ if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
+ ar_preview->flag &= ~RGN_FLAG_HIDDEN;
+ ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
+ ar_preview->v2d.cur = ar_preview->v2d.tot;
+ view_changed= 1;
+ }
+ if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) {
+ ar_main->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
+ ar_preview->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ break;
+ case SEQ_VIEW_SEQUENCE_PREVIEW:
+ if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
+ ar_main->flag &= ~RGN_FLAG_HIDDEN;
+ ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
+ view_changed= 1;
+ }
+ if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
+ ar_preview->flag &= ~RGN_FLAG_HIDDEN;
+ ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
+ ar_preview->v2d.cur = ar_preview->v2d.tot;
+ view_changed= 1;
+ }
+ if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) {
+ ar_main->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
+ ar_preview->alignment= RGN_ALIGN_TOP;
+ view_changed= 1;
+ }
+ break;
+ }
+
+ if(view_changed) {
+ ED_area_initialize(wm, window, sa);
+ ED_area_tag_redraw(sa);
+ }
+}
+
static SpaceLink *sequencer_duplicate(SpaceLink *sl)
{
SpaceSeq *sseqn= MEM_dupallocN(sl);
@@ -516,6 +543,7 @@ void ED_spacetype_sequencer(void)
st->operatortypes= sequencer_operatortypes;
st->keymap= sequencer_keymap;
st->dropboxes= sequencer_dropboxes;
+ st->refresh= sequencer_refresh;
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index ecf5df4af7c..4aec1a8e61c 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -85,7 +85,7 @@ enum {
PCHAN_COLOR_SPHEREBONE_BASE, /* for the 'stick' of sphere (envelope) bones */
PCHAN_COLOR_SPHEREBONE_END, /* for the ends of sphere (envelope) bones */
PCHAN_COLOR_LINEBONE /* for the middle of line-bones */
-};
+};
/* This function sets the color-set for coloring a certain bone */
static void set_pchan_colorset (Object *ob, bPoseChannel *pchan)
@@ -437,43 +437,64 @@ static void draw_bonevert_solid(void)
glCallList(displist);
}
+static float bone_octahedral_verts[6][3]= {
+ { 0.0f, 0.0f, 0.0f},
+ { 0.1f, 0.1f, 0.1f},
+ { 0.1f, 0.1f, -0.1f},
+ {-0.1f, 0.1f, -0.1f},
+ {-0.1f, 0.1f, 0.1f},
+ { 0.0f, 1.0f, 0.0f}
+};
+
+static unsigned int bone_octahedral_wire_sides[8]= {0, 1, 5, 3, 0, 4, 5, 2};
+static unsigned int bone_octahedral_wire_square[8]= {1, 2, 3, 4, 1};
+
+static unsigned int bone_octahedral_solid_tris[8][3]= {
+ {2, 1, 0}, /* bottom */
+ {3, 2, 0},
+ {4, 3, 0},
+ {1, 4, 0},
+
+ {5, 1, 2}, /* top */
+ {5, 2, 3},
+ {5, 3, 4},
+ {5, 4, 1}
+};
+
+/* aligned with bone_octahedral_solid_tris */
+static float bone_octahedral_solid_normals[8][3]= {
+ { 0.70710683f, -0.70710683f, 0.00000000f},
+ {-0.00000000f, -0.70710683f, -0.70710683f},
+ {-0.70710683f, -0.70710683f, 0.00000000f},
+ { 0.00000000f, -0.70710683f, 0.70710683f},
+ { 0.99388373f, 0.11043154f, -0.00000000f},
+ { 0.00000000f, 0.11043154f, -0.99388373f},
+ {-0.99388373f, 0.11043154f, 0.00000000f},
+ { 0.00000000f, 0.11043154f, 0.99388373f}
+};
+
static void draw_bone_octahedral(void)
{
static GLuint displist=0;
if (displist == 0) {
- float vec[6][3];
-
displist= glGenLists(1);
glNewList(displist, GL_COMPILE);
-
- vec[0][0]= vec[0][1]= vec[0][2]= 0.0f;
- vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f;
-
- vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f;
- vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f;
- vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f;
- vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f;
-
+
/* Section 1, sides */
- glBegin(GL_LINE_LOOP);
- glVertex3fv(vec[0]);
- glVertex3fv(vec[1]);
- glVertex3fv(vec[5]);
- glVertex3fv(vec[3]);
- glVertex3fv(vec[0]);
- glVertex3fv(vec[4]);
- glVertex3fv(vec[5]);
- glVertex3fv(vec[2]);
- glEnd();
-
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, bone_octahedral_verts);
+ glDrawElements(GL_LINE_LOOP,
+ sizeof(bone_octahedral_wire_sides)/sizeof(*bone_octahedral_wire_sides),
+ GL_UNSIGNED_INT,
+ bone_octahedral_wire_sides);
+
/* Section 1, square */
- glBegin(GL_LINE_LOOP);
- glVertex3fv(vec[1]);
- glVertex3fv(vec[2]);
- glVertex3fv(vec[3]);
- glVertex3fv(vec[4]);
- glEnd();
+ glDrawElements(GL_LINE_LOOP,
+ sizeof(bone_octahedral_wire_square)/sizeof(*bone_octahedral_wire_square),
+ GL_UNSIGNED_INT,
+ bone_octahedral_wire_square);
+ glDisableClientState(GL_VERTEX_ARRAY);
glEndList();
}
@@ -484,59 +505,34 @@ static void draw_bone_octahedral(void)
static void draw_bone_solid_octahedral(void)
{
static GLuint displist=0;
-
+
if (displist == 0) {
- float vec[6][3], nor[3];
-
+ int i;
+
displist= glGenLists(1);
glNewList(displist, GL_COMPILE);
-
- vec[0][0]= vec[0][1]= vec[0][2]= 0.0f;
- vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f;
-
- vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f;
- vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f;
- vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f;
- vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f;
-
-
- glBegin(GL_TRIANGLES);
- /* bottom */
- normal_tri_v3( nor,vec[2], vec[1], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[2]); glVertex3fv(vec[1]); glVertex3fv(vec[0]);
-
- normal_tri_v3( nor,vec[3], vec[2], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[3]); glVertex3fv(vec[2]); glVertex3fv(vec[0]);
-
- normal_tri_v3( nor,vec[4], vec[3], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[4]); glVertex3fv(vec[3]); glVertex3fv(vec[0]);
- normal_tri_v3( nor,vec[1], vec[4], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[1]); glVertex3fv(vec[4]); glVertex3fv(vec[0]);
+#if 1
+ glBegin(GL_TRIANGLES);
+ for(i= 0; i < 8; i++) {
+ glNormal3fv(bone_octahedral_solid_normals[i]);
+ glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][0]]);
+ glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][1]]);
+ glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][2]]);
+ }
- /* top */
- normal_tri_v3( nor,vec[5], vec[1], vec[2]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[1]); glVertex3fv(vec[2]);
-
- normal_tri_v3( nor,vec[5], vec[2], vec[3]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[2]); glVertex3fv(vec[3]);
-
- normal_tri_v3( nor,vec[5], vec[3], vec[4]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[3]); glVertex3fv(vec[4]);
-
- normal_tri_v3( nor,vec[5], vec[4], vec[1]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[4]); glVertex3fv(vec[1]);
-
glEnd();
-
+
+#else /* not working because each vert needs a different normal */
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glNormalPointer(GL_FLOAT, 0, bone_octahedral_solid_normals);
+ glVertexPointer(3, GL_FLOAT, 0, bone_octahedral_verts);
+ glDrawElements(GL_TRIANGLES, sizeof(bone_octahedral_solid_tris)/sizeof(unsigned int), GL_UNSIGNED_INT, bone_octahedral_solid_tris);
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+#endif
+
glEndList();
}
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 19e8d42db2d..761de836cfb 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -1017,18 +1017,26 @@ static int ndof_orbit_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event
if (has_rotation) {
- const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES;
-
rv3d->view = RV3D_VIEW_USER;
if (U.flag & USER_TRACKBALL) {
+ const int invert_roll = U.ndof_flag & NDOF_ROLL_INVERT_AXIS;
+ const int invert_tilt = U.ndof_flag & NDOF_TILT_INVERT_AXIS;
+ const int invert_rot = U.ndof_flag & NDOF_ROTATE_INVERT_AXIS;
+
float rot[4];
float axis[3];
float angle = rot_sensitivity * ndof_to_axis_angle(ndof, axis);
-
- if (invert)
- angle = -angle;
-
+
+ if (invert_roll)
+ axis[2] = -axis[2];
+
+ if (invert_tilt)
+ axis[0] = -axis[0];
+
+ if (invert_rot)
+ axis[1] = -axis[1];
+
// transform rotation axis from view to world coordinates
mul_qt_v3(view_inv, axis);
@@ -1042,6 +1050,8 @@ static int ndof_orbit_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rot);
} else {
/* turntable view code by John Aughey, adapted for 3D mouse by [mce] */
+ const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES;
+
float angle, rot[4];
float xvec[3] = {1,0,0};
@@ -1143,10 +1153,26 @@ static int ndof_pan_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
const float vertical_sensitivity = 0.4f;
const float lateral_sensitivity = 0.6f;
- float pan_vec[3] = {lateral_sensitivity * ndof->tvec[0],
- vertical_sensitivity * ndof->tvec[1],
- forward_sensitivity * ndof->tvec[2]
- };
+ const int invert_panx = U.ndof_flag & NDOF_PANX_INVERT_AXIS;
+ const int invert_pany = U.ndof_flag & NDOF_PANY_INVERT_AXIS;
+ const int invert_panz = U.ndof_flag & NDOF_PANZ_INVERT_AXIS;
+
+ float pan_vec[3];
+
+ if (invert_panx)
+ pan_vec[0] = -lateral_sensitivity * ndof->tvec[0];
+ else
+ pan_vec[0] = lateral_sensitivity * ndof->tvec[0];
+
+ if (invert_panz)
+ pan_vec[1] = -vertical_sensitivity * ndof->tvec[1];
+ else
+ pan_vec[1] = vertical_sensitivity * ndof->tvec[1];
+
+ if (invert_pany)
+ pan_vec[2] = -forward_sensitivity * ndof->tvec[2];
+ else
+ pan_vec[2] = forward_sensitivity * ndof->tvec[2];
mul_v3_fl(pan_vec, speed * dt);
#endif
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index aa3837b0a74..632284d58eb 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -1675,7 +1675,14 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
if (RNA_property_is_set(op->ptr, "value"))
{
float values[4]= {0}; /* incase value isn't length 4, avoid uninitialized memory */
- RNA_float_get_array(op->ptr, "value", values);
+ PropertyRNA *prop= RNA_struct_find_property(op->ptr, "value");
+
+ if(RNA_property_array_check(prop)) {
+ RNA_float_get_array(op->ptr, "value", values);
+ } else {
+ values[0]= RNA_float_get(op->ptr, "value");
+ }
+
QUATCOPY(t->values, values);
QUATCOPY(t->auto_values, values);
t->flag |= T_AUTOVALUES;
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 7b43d0955a7..cae64899aeb 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -4771,12 +4771,14 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
else if (t->spacetype == SPACE_NODE) {
+ SpaceNode *snode= (SpaceNode *)t->sa->spacedata.first;
+ ED_node_update_hierarchy(C, snode->edittree);
+
if(cancelled == 0)
ED_node_link_insert(t->sa);
/* clear link line */
ED_node_link_intersect_test(t->sa, 0);
-
}
else if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
@@ -5194,6 +5196,11 @@ static void NodeToTransData(TransData *td, TransData2D *td2d, bNode *node)
td2d->loc2d = &node->locx; /* current location */
td->flag = 0;
+ /* exclude nodes whose parent is also transformed */
+ if (node->parent && (node->parent->flag & NODE_TRANSFORM)) {
+ td->flag |= TD_SKIP;
+ }
+
td->loc = td2d->loc;
VECCOPY(td->center, td->loc);
VECCOPY(td->iloc, td->loc);
@@ -5214,6 +5221,16 @@ static void createTransNodeData(bContext *C, TransInfo *t)
{
TransData *td;
TransData2D *td2d;
+ SpaceNode *snode= t->sa->spacedata.first;
+ bNode *node;
+
+ /* set transform flags on nodes */
+ for (node=snode->edittree->nodes.first; node; node=node->next) {
+ if ((node->flag & NODE_SELECT) || (node->parent && (node->parent->flag & NODE_TRANSFORM)))
+ node->flag |= NODE_TRANSFORM;
+ else
+ node->flag &= ~NODE_TRANSFORM;
+ }
t->total= CTX_DATA_COUNT(C, selected_nodes);
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index 72f13c14f5d..5e05342f3dc 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -24,6 +24,7 @@ set(INC
../../blenkernel
../../blenlib
../../blenloader
+ ../../../../extern/recastnavigation/Recast/Include
../../makesdna
../../makesrna
../../windowmanager
@@ -62,6 +63,7 @@ set(SRC
../include/ED_markers.h
../include/ED_mball.h
../include/ED_mesh.h
+ ../include/ED_navmesh_conversion.h
../include/ED_node.h
../include/ED_numinput.h
../include/ED_object.h
@@ -87,4 +89,10 @@ set(SRC
../include/UI_view2d.h
)
+if(WITH_GAMEENGINE)
+ list(APPEND SRC
+ navmesh_conversion.cpp
+ )
+endif()
+
blender_add_lib(bf_editor_util "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript
index a694b211ca4..5cb46480e1f 100644
--- a/source/blender/editors/util/SConscript
+++ b/source/blender/editors/util/SConscript
@@ -1,11 +1,15 @@
#!/usr/bin/python
Import ('env')
-sources = env.Glob('*.c')
+sources = env.Glob('*.c') + env.Glob('*.cpp')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../makesrna'
+incs += ' #extern/recastnavigation/Recast/Include'
incs += ' ../../blenloader'
-env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core'], priority=[130] )
+if not env['WITH_BF_GAMEENGINE']:
+ sources.remove('navmesh_conversion.cpp')
+
+env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core','player'], priority=[130,210] )
diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp
new file mode 100644
index 00000000000..aebd9624bc7
--- /dev/null
+++ b/source/blender/editors/util/navmesh_conversion.cpp
@@ -0,0 +1,450 @@
+/**
+* $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 <math.h>
+#include "Recast.h"
+
+
+extern "C"{
+#include "ED_navmesh_conversion.h"
+
+#include "DNA_meshdata_types.h"
+#include "BKE_cdderivedmesh.h"
+#include "BLI_math.h"
+}
+
+int polyNumVerts(const unsigned short* p, const int vertsPerPoly)
+{
+ int nv = 0;
+ for (int i=0; i<vertsPerPoly; i++)
+ {
+ if (p[i]==0xffff)
+ break;
+ nv++;
+ }
+ return nv;
+}
+
+bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts)
+{
+ int nv = polyNumVerts(p, vertsPerPoly);
+ if (nv<3)
+ return false;
+ for (int j=0; j<nv; j++)
+ {
+ const float* v = &verts[3*p[j]];
+ const float* v_next = &verts[3*p[(j+1)%nv]];
+ const float* v_prev = &verts[3*p[(nv+j-1)%nv]];
+ if (!left(v_prev, v, v_next))
+ return false;
+
+ }
+ return true;
+}
+
+float distPointToSegmentSq(const float* point, const float* a, const float* b)
+{
+ float abx[3], dx[3];
+ vsub(abx, b,a);
+ vsub(dx, point,a);
+ float d = abx[0]*abx[0]+abx[2]*abx[2];
+ float t = abx[0]*dx[0]+abx[2]*dx[2];
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+ dx[0] = a[0] + t*abx[0] - point[0];
+ dx[2] = a[2] + t*abx[2] - point[2];
+ return dx[0]*dx[0] + dx[2]*dx[2];
+}
+
+bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts,
+ int &ntris, unsigned short *&tris, int *&trisToFacesMap,
+ int *&recastData)
+{
+ nverts = dm->getNumVerts(dm);
+ if (nverts>=0xffff)
+ {
+ printf("Converting navmesh: Error! Too many vertices. Max number of vertices %d\n", 0xffff);
+ return false;
+ }
+ verts = new float[3*nverts];
+ dm->getVertCos(dm, (float(*)[3])verts);
+
+ //flip coordinates
+ for (int vi=0; vi<nverts; vi++)
+ {
+ SWAP(float, verts[3*vi+1], verts[3*vi+2]);
+ }
+
+ //calculate number of tris
+ int nfaces = dm->getNumFaces(dm);
+ MFace *faces = dm->getFaceArray(dm);
+ ntris = nfaces;
+ for (int fi=0; fi<nfaces; fi++)
+ {
+ MFace* face = &faces[fi];
+ if (face->v4)
+ ntris++;
+ }
+
+ //copy and transform to triangles (reorder on the run)
+ trisToFacesMap = new int[ntris];
+ tris = new unsigned short[3*ntris];
+ unsigned short* tri = tris;
+ int triIdx = 0;
+ for (int fi=0; fi<nfaces; fi++)
+ {
+ MFace* face = &faces[fi];
+ tri[3*triIdx+0] = (unsigned short) face->v1;
+ tri[3*triIdx+1] = (unsigned short) face->v3;
+ tri[3*triIdx+2] = (unsigned short) face->v2;
+ trisToFacesMap[triIdx++]=fi;
+ if (face->v4)
+ {
+ tri[3*triIdx+0] = (unsigned short) face->v1;
+ tri[3*triIdx+1] = (unsigned short) face->v4;
+ tri[3*triIdx+2] = (unsigned short) face->v3;
+ trisToFacesMap[triIdx++]=fi;
+ }
+ }
+
+ //carefully, recast data is just reference to data in derived mesh
+ recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ return true;
+}
+
+bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys,
+ unsigned short* polys, const unsigned short* dmeshes,
+ const float* verts, const unsigned short* dtris,
+ const int* dtrisToPolysMap)
+{
+ int capacity = vertsPerPoly;
+ unsigned short* newPoly = new unsigned short[capacity];
+ memset(newPoly, 0xff, sizeof(unsigned short)*capacity);
+ for (int polyidx=0; polyidx<npolys; polyidx++)
+ {
+ int nv = 0;
+ //search border
+ int btri = -1;
+ int bedge = -1;
+ int dtrisNum = dmeshes[polyidx*4+3];
+ int dtrisBase = dmeshes[polyidx*4+2];
+ unsigned char *traversedTris = new unsigned char[dtrisNum];
+ memset(traversedTris, 0, dtrisNum*sizeof(unsigned char));
+ for (int j=0; j<dtrisNum && btri==-1;j++)
+ {
+ int curpolytri = dtrisBase+j;
+ for (int k=0; k<3; k++)
+ {
+ unsigned short neighbortri = dtris[curpolytri*3*2+3+k];
+ if ( neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+ {
+ btri = curpolytri;
+ bedge = k;
+ break;
+ }
+ }
+ }
+ if (btri==-1 || bedge==-1)
+ {
+ //can't find triangle with border edge
+ return false;
+ }
+
+ newPoly[nv++] = dtris[btri*3*2+bedge];
+ int tri = btri;
+ int edge = (bedge+1)%3;
+ traversedTris[tri-dtrisBase] = 1;
+ while (tri!=btri || edge!=bedge)
+ {
+ int neighbortri = dtris[tri*3*2+3+edge];
+ if (neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+ {
+ if (nv==capacity)
+ {
+ capacity += vertsPerPoly;
+ unsigned short* newPolyBig = new unsigned short[capacity];
+ memset(newPolyBig, 0xff, sizeof(unsigned short)*capacity);
+ memcpy(newPolyBig, newPoly, sizeof(unsigned short)*nv);
+ delete newPoly;
+ newPoly = newPolyBig;
+ }
+ newPoly[nv++] = dtris[tri*3*2+edge];
+ //move to next edge
+ edge = (edge+1)%3;
+ }
+ else
+ {
+ //move to next tri
+ int twinedge = -1;
+ for (int k=0; k<3; k++)
+ {
+ if (dtris[neighbortri*3*2+3+k] == tri)
+ {
+ twinedge = k;
+ break;
+ }
+ }
+ if (twinedge==-1)
+ {
+ printf("Converting navmesh: Error! Can't find neighbor edge - invalid adjacency info\n");
+ goto returnLabel;
+ }
+ tri = neighbortri;
+ edge = (twinedge+1)%3;
+ traversedTris[tri-dtrisBase] = 1;
+ }
+ }
+
+ unsigned short* adjustedPoly = new unsigned short[nv];
+ int adjustedNv = 0;
+ for (size_t i=0; i<(size_t)nv; i++)
+ {
+ unsigned short prev = newPoly[(nv+i-1)%nv];
+ unsigned short cur = newPoly[i];
+ unsigned short next = newPoly[(i+1)%nv];
+ float distSq = distPointToSegmentSq(&verts[3*cur], &verts[3*prev], &verts[3*next]);
+ static const float tolerance = 0.001f;
+ if (distSq>tolerance)
+ adjustedPoly[adjustedNv++] = cur;
+ }
+ memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short));
+ delete adjustedPoly;
+ nv = adjustedNv;
+
+ bool allBorderTraversed = true;
+ for (size_t i=0; i<(size_t)dtrisNum; i++)
+ {
+ if (traversedTris[i]==0)
+ {
+ //check whether it has border edges
+ int curpolytri = dtrisBase+i;
+ for (int k=0; k<3; k++)
+ {
+ unsigned short neighbortri = dtris[curpolytri*3*2+3+k];
+ if ( neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+ {
+ allBorderTraversed = false;
+ break;
+ }
+ }
+ }
+ }
+
+ if (nv<=vertsPerPoly && allBorderTraversed)
+ {
+ for (int i=0; i<nv; i++)
+ {
+ polys[polyidx*vertsPerPoly*2+i] = newPoly[i];
+ }
+ }
+ }
+
+returnLabel:
+ delete newPoly;
+ return true;
+}
+
+struct SortContext
+{
+ const int* recastData;
+ const int* trisToFacesMap;
+};
+#if defined(_MSC_VER)
+static int compareByData(void* data, const void * a, const void * b)
+#else
+static int compareByData(const void * a, const void * b, void* data)
+#endif
+{
+ const SortContext* context = (const SortContext*)data;
+ return ( context->recastData[context->trisToFacesMap[*(int*)a]] -
+ context->recastData[context->trisToFacesMap[*(int*)b]] );
+}
+
+bool buildNavMeshData(const int nverts, const float* verts,
+ const int ntris, const unsigned short *tris,
+ const int* recastData, const int* trisToFacesMap,
+ int &ndtris, unsigned short *&dtris,
+ int &npolys, unsigned short *&dmeshes, unsigned short *&polys,
+ int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap)
+
+{
+ if (!recastData)
+ {
+ printf("Converting navmesh: Error! Can't find recast custom data\n");
+ return false;
+ }
+
+ //sort the triangles by polygon idx
+ int* trisMapping = new int[ntris];
+ for (int i=0; i<ntris; i++)
+ trisMapping[i]=i;
+ SortContext context;
+ context.recastData = recastData;
+ context.trisToFacesMap = trisToFacesMap;
+#if defined(_MSC_VER)
+ qsort_s(trisMapping, ntris, sizeof(int), compareByData, &context);
+#else
+ qsort_r(trisMapping, ntris, sizeof(int), compareByData, &context);
+#endif
+ //search first valid triangle - triangle of convex polygon
+ int validTriStart = -1;
+ for (int i=0; i< ntris; i++)
+ {
+ if (recastData[trisToFacesMap[trisMapping[i]]]>0)
+ {
+ validTriStart = i;
+ break;
+ }
+ }
+
+ if (validTriStart<0)
+ {
+ printf("Converting navmesh: Error! No valid polygons in mesh\n");
+ delete trisMapping;
+ return false;
+ }
+
+ ndtris = ntris-validTriStart;
+ //fill dtris to faces mapping
+ dtrisToTrisMap = new int[ndtris];
+ memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int));
+ delete trisMapping; trisMapping=NULL;
+
+ //create detailed mesh triangles - copy only valid triangles
+ //and reserve memory for adjacency info
+ dtris = new unsigned short[3*2*ndtris];
+ memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris);
+ for (int i=0; i<ndtris; i++)
+ {
+ memcpy(dtris+3*2*i, tris+3*dtrisToTrisMap[i], sizeof(unsigned short)*3);
+ }
+ //create new recast data corresponded to dtris and renumber for continuous indices
+ int prevPolyIdx=-1, curPolyIdx, newPolyIdx=0;
+ dtrisToPolysMap = new int[ndtris];
+ for (int i=0; i<ndtris; i++)
+ {
+ curPolyIdx = recastData[trisToFacesMap[dtrisToTrisMap[i]]];
+ if (curPolyIdx!=prevPolyIdx)
+ {
+ newPolyIdx++;
+ prevPolyIdx=curPolyIdx;
+ }
+ dtrisToPolysMap[i] = newPolyIdx;
+ }
+
+
+ //build adjacency info for detailed mesh triangles
+ buildMeshAdjacency(dtris, ndtris, nverts, 3);
+
+ //create detailed mesh description for each navigation polygon
+ npolys = dtrisToPolysMap[ndtris-1];
+ dmeshes = new unsigned short[npolys*4];
+ memset(dmeshes, 0, npolys*4*sizeof(unsigned short));
+ unsigned short *dmesh = NULL;
+ int prevpolyidx = 0;
+ for (int i=0; i<ndtris; i++)
+ {
+ int curpolyidx = dtrisToPolysMap[i];
+ if (curpolyidx!=prevpolyidx)
+ {
+ if (curpolyidx!=prevpolyidx+1)
+ {
+ printf("Converting navmesh: Error! Wrong order of detailed mesh faces\n");
+ return false;
+ }
+ dmesh = dmesh==NULL ? dmeshes : dmesh+4;
+ dmesh[2] = (unsigned short)i; //tbase
+ dmesh[3] = 0; //tnum
+ prevpolyidx = curpolyidx;
+ }
+ dmesh[3]++;
+ }
+
+ //create navigation polygons
+ vertsPerPoly = 6;
+ polys = new unsigned short[npolys*vertsPerPoly*2];
+ memset(polys, 0xff, sizeof(unsigned short)*vertsPerPoly*2*npolys);
+
+ buildPolygonsByDetailedMeshes(vertsPerPoly, npolys, polys, dmeshes, verts, dtris, dtrisToPolysMap);
+
+ return true;
+}
+
+
+bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly,
+ int &nverts, float *&verts,
+ int &ndtris, unsigned short *&dtris,
+ int& npolys, unsigned short *&dmeshes,
+ unsigned short*& polys, int *&dtrisToPolysMap,
+ int *&dtrisToTrisMap, int *&trisToFacesMap)
+{
+ bool res = true;
+ int ntris =0, *recastData=NULL;
+ unsigned short *tris=NULL;
+ res = buildRawVertIndicesData(dm, nverts, verts, ntris, tris, trisToFacesMap, recastData);
+ if (!res)
+ {
+ printf("Converting navmesh: Error! Can't get vertices and indices from mesh\n");
+ goto exit;
+ }
+
+ res = buildNavMeshData(nverts, verts, ntris, tris, recastData, trisToFacesMap,
+ ndtris, dtris, npolys, dmeshes,polys, vertsPerPoly,
+ dtrisToPolysMap, dtrisToTrisMap);
+ if (!res)
+ {
+ printf("Converting navmesh: Error! Can't get vertices and indices from mesh\n");
+ goto exit;
+ }
+
+exit:
+ if (tris)
+ delete tris;
+
+ return res;
+}
+
+int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx)
+{
+ int res = -1;
+ for(int i=0; i<vertsPerPoly; i++)
+ {
+ if (p[i]==0xffff)
+ break;
+ if (p[i]==vertexIdx)
+ {
+ res = i;
+ break;
+ }
+ }
+ return res;
+}
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index a2381a208ef..c1aca61f795 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -54,6 +54,7 @@
#include "ED_armature.h"
#include "ED_particle.h"
#include "ED_curve.h"
+#include "ED_gpencil.h"
#include "ED_mball.h"
#include "ED_mesh.h"
#include "ED_object.h"
@@ -126,6 +127,11 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
Object *obact= CTX_data_active_object(C);
ScrArea *sa= CTX_wm_area(C);
+ /* grease pencil can be can be used in plenty of spaces, so check it first */
+ if(ED_gpencil_session_active()) {
+ return ED_undo_gpencil_step(C, step, undoname);
+ }
+
if(sa && sa->spacetype==SPACE_IMAGE) {
SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index d0c7f9d494f..5a1c0c537c0 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -126,6 +126,7 @@ GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex);
int GPU_texture_target(GPUTexture *tex);
int GPU_texture_opengl_width(GPUTexture *tex);
int GPU_texture_opengl_height(GPUTexture *tex);
+int GPU_texture_opengl_bindcode(GPUTexture *tex);
/* GPU Framebuffer
- this is a wrapper for an OpenGL framebuffer object (FBO). in practice
@@ -179,6 +180,7 @@ typedef struct GPUVertexAttribs {
int type;
int glindex;
int gltexco;
+ int attribid;
char name[32];
} layer[GPU_MAX_ATTRIB];
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index f563d8cbe92..95a08e6d5b3 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -37,6 +37,8 @@
#ifndef __GPU_MATERIAL__
#define __GPU_MATERIAL__
+#include "DNA_listBase.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -46,6 +48,7 @@ struct ImageUser;
struct Material;
struct Object;
struct Lamp;
+struct Image;
struct bNode;
struct LinkNode;
struct Scene;
@@ -72,7 +75,6 @@ typedef enum GPUType {
GPU_VEC4 = 4,
GPU_MAT3 = 9,
GPU_MAT4 = 16,
- GPU_TEX1D = 1001,
GPU_TEX2D = 1002,
GPU_SHADOW2D = 1003,
GPU_ATTRIB = 3001
@@ -107,10 +109,10 @@ typedef struct GPUNodeStack {
GPUNodeLink *GPU_attribute(int type, const char *name);
GPUNodeLink *GPU_uniform(float *num);
-GPUNodeLink *GPU_dynamic_uniform(float *num);
+GPUNodeLink *GPU_dynamic_uniform(float *num, int dynamictype, void *data);
GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser);
GPUNodeLink *GPU_texture(int size, float *pixels);
-GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex);
+GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex, int dynamictype, void *data);
GPUNodeLink *GPU_socket(GPUNodeStack *sock);
GPUNodeLink *GPU_builtin(GPUBuiltin builtin);
@@ -153,6 +155,72 @@ typedef struct GPUShadeResult {
void GPU_shadeinput_set(GPUMaterial *mat, struct Material *ma, GPUShadeInput *shi);
void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr);
+/* Export GLSL shader */
+
+typedef enum GPUDynamicType {
+ GPU_DYNAMIC_NONE = 0,
+ GPU_DYNAMIC_OBJECT_VIEWMAT = 1,
+ GPU_DYNAMIC_OBJECT_MAT = 2,
+ GPU_DYNAMIC_OBJECT_VIEWIMAT = 3,
+ GPU_DYNAMIC_OBJECT_IMAT = 4,
+ GPU_DYNAMIC_OBJECT_COLOR = 5,
+ GPU_DYNAMIC_LAMP_FIRST = 6,
+ GPU_DYNAMIC_LAMP_DYNVEC = 6,
+ GPU_DYNAMIC_LAMP_DYNCO = 7,
+ GPU_DYNAMIC_LAMP_DYNIMAT = 8,
+ GPU_DYNAMIC_LAMP_DYNPERSMAT = 9,
+ GPU_DYNAMIC_LAMP_DYNENERGY = 10,
+ GPU_DYNAMIC_LAMP_DYNCOL = 11,
+ GPU_DYNAMIC_LAMP_LAST = 11,
+ GPU_DYNAMIC_SAMPLER_2DBUFFER = 12,
+ GPU_DYNAMIC_SAMPLER_2DIMAGE = 13,
+ GPU_DYNAMIC_SAMPLER_2DSHADOW = 14,
+} GPUDynamicType;
+
+typedef enum GPUDataType {
+ GPU_DATA_NONE = 0,
+ GPU_DATA_1I = 1, // 1 integer
+ GPU_DATA_1F = 2,
+ GPU_DATA_2F = 3,
+ GPU_DATA_3F = 4,
+ GPU_DATA_4F = 5,
+ GPU_DATA_9F = 6,
+ GPU_DATA_16F = 7,
+ GPU_DATA_4UB = 8,
+} GPUDataType;
+
+/* this structure gives information of each uniform found in the shader */
+typedef struct GPUInputUniform {
+ struct GPUInputUniform *next, *prev;
+ char varname[32]; /* name of uniform in shader */
+ GPUDynamicType type; /* type of uniform, data format and calculation derive from it */
+ GPUDataType datatype; /* type of uniform data */
+ struct Object *lamp; /* when type=GPU_DYNAMIC_LAMP_... or GPU_DYNAMIC_SAMPLER_2DSHADOW */
+ struct Image *image; /* when type=GPU_DYNAMIC_SAMPLER_2DIMAGE */
+ int texnumber; /* when type=GPU_DYNAMIC_SAMPLER, texture number: 0.. */
+ unsigned char *texpixels; /* for internally generated texture, pixel data in RGBA format */
+ int texsize; /* size in pixel of the texture in texpixels buffer: for 2D textures, this is S and T size (square texture) */
+} GPUInputUniform;
+
+typedef struct GPUInputAttribute {
+ struct GPUInputAttribute *next, *prev;
+ char varname[32]; /* name of attribute in shader */
+ int type; /* from CustomData.type, data type derives from it */
+ GPUDataType datatype; /* type of attribute data */
+ const char *name; /* layer name */
+ int number; /* generic attribute number */
+} GPUInputAttribute;
+
+typedef struct GPUShaderExport {
+ ListBase uniforms;
+ ListBase attributes;
+ char *vertex;
+ char *fragment;
+} GPUShaderExport;
+
+GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma);
+void GPU_free_shader_export(GPUShaderExport *shader);
+
/* Lamps */
GPULamp *GPU_lamp_from_blender(struct Scene *scene, struct Object *ob, struct Object *par);
diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript
index b48e1d5a8e2..adb52d577a1 100644
--- a/source/blender/gpu/SConscript
+++ b/source/blender/gpu/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
defs = [ 'GLEW_STATIC' ]
-incs = '../blenlib ../blenkernel ../makesdna ../include ../blenloader'
+incs = '../blenlib ../blenkernel ../makesdna ../makesrna ../include ../blenloader'
incs += ' #/extern/glew/include #intern/guardedalloc #intern/smoke/extern ../imbuf .'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 360f3dbf63f..f02aee8d8af 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -64,101 +64,9 @@ extern char datatoc_gpu_shader_vertex_glsl[];
/* structs and defines */
-typedef enum GPUDataSource {
- GPU_SOURCE_VEC_UNIFORM,
- GPU_SOURCE_BUILTIN,
- GPU_SOURCE_TEX_PIXEL,
- GPU_SOURCE_TEX,
- GPU_SOURCE_ATTRIB
-} GPUDataSource;
-
static const char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4",
NULL, NULL, NULL, NULL, "mat3", NULL, NULL, NULL, NULL, NULL, NULL, "mat4"};
-struct GPUNode {
- struct GPUNode *next, *prev;
-
- const char *name;
- int tag;
-
- ListBase inputs;
- ListBase outputs;
-};
-
-struct GPUNodeLink {
- GPUNodeStack *socket;
-
- int attribtype;
- const char *attribname;
-
- int image;
-
- int texture;
- int texturesize;
-
- void *ptr1, *ptr2;
-
- int dynamic;
-
- int type;
- int users;
-
- GPUTexture *dynamictex;
-
- GPUBuiltin builtin;
-
- struct GPUOutput *output;
-};
-
-typedef struct GPUOutput {
- struct GPUOutput *next, *prev;
-
- GPUNode *node;
- int type; /* data type = length of vector/matrix */
- GPUNodeLink *link; /* output link */
- int id; /* unique id as created by code generator */
-} GPUOutput;
-
-typedef struct GPUInput {
- struct GPUInput *next, *prev;
-
- GPUNode *node;
-
- int type; /* datatype */
- int source; /* data source */
-
- int id; /* unique id as created by code generator */
- int texid; /* number for multitexture */
- int attribid; /* id for vertex attributes */
- int bindtex; /* input is responsible for binding the texture? */
- int definetex; /* input is responsible for defining the pixel? */
- int textarget; /* GL_TEXTURE_* */
- int textype; /* datatype */
-
- struct Image *ima; /* image */
- struct ImageUser *iuser;/* image user */
- float *dynamicvec; /* vector data in case it is dynamic */
- GPUTexture *tex; /* input texture, only set at runtime */
- int shaderloc; /* id from opengl */
- char shadername[32]; /* name in shader */
-
- float vec[16]; /* vector data */
- GPUNodeLink *link;
- int dynamictex; /* dynamic? */
- int attribtype; /* attribute type */
- char attribname[32]; /* attribute name */
- int attribfirst; /* this is the first one that is bound */
- GPUBuiltin builtin; /* builtin uniform */
-} GPUInput;
-
-struct GPUPass {
- struct GPUPass *next, *prev;
-
- ListBase inputs;
- struct GPUOutput *output;
- struct GPUShader *shader;
-};
-
/* GLSL code parsing for finding function definitions.
* These are stored in a hash for lookup when creating a material. */
@@ -245,8 +153,6 @@ static void gpu_parse_functions_string(GHash *hash, char *code)
if(!type && gpu_str_prefix(code, "sampler2DShadow"))
type= GPU_SHADOW2D;
- if(!type && gpu_str_prefix(code, "sampler1D"))
- type= GPU_TEX1D;
if(!type && gpu_str_prefix(code, "sampler2D"))
type= GPU_TEX2D;
@@ -298,9 +204,7 @@ static char *gpu_generate_function_prototyps(GHash *hash)
else if(function->paramqual[a] == FUNCTION_QUAL_INOUT)
BLI_dynstr_append(ds, "inout ");
- if(function->paramtype[a] == GPU_TEX1D)
- BLI_dynstr_append(ds, "sampler1D");
- else if(function->paramtype[a] == GPU_TEX2D)
+ if(function->paramtype[a] == GPU_TEX2D)
BLI_dynstr_append(ds, "sampler2D");
else if(function->paramtype[a] == GPU_SHADOW2D)
BLI_dynstr_append(ds, "sampler2DShadow");
@@ -542,7 +446,6 @@ static void codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes)
/* create exactly one sampler for each texture */
if (codegen_input_has_texture(input) && input->bindtex)
BLI_dynstr_appendf(ds, "uniform %s samp%d;\n",
- (input->textype == GPU_TEX1D)? "sampler1D":
(input->textype == GPU_TEX2D)? "sampler2D": "sampler2DShadow",
input->texid);
}
@@ -947,6 +850,7 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
input->textarget = GL_TEXTURE_2D;
input->textype = type;
input->dynamictex = 1;
+ input->dynamicdata = link->ptr2;
MEM_freeN(link);
}
else if(link->texture) {
@@ -955,14 +859,9 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
input->source = GPU_SOURCE_TEX;
input->textype = type;
- if (type == GPU_TEX1D) {
- input->tex = GPU_texture_create_1D(link->texturesize, link->ptr1, NULL);
- input->textarget = GL_TEXTURE_1D;
- }
- else {
- input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, NULL);
- input->textarget = GL_TEXTURE_2D;
- }
+ //input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, NULL);
+ input->tex = GPU_texture_create_2D(link->texturesize, 1, link->ptr1, NULL);
+ input->textarget = GL_TEXTURE_2D;
MEM_freeN(link->ptr1);
MEM_freeN(link);
@@ -993,8 +892,11 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
input->source = GPU_SOURCE_VEC_UNIFORM;
memcpy(input->vec, link->ptr1, type*sizeof(float));
- if(link->dynamic)
+ if(link->dynamic) {
input->dynamicvec= link->ptr1;
+ input->dynamictype= link->dynamictype;
+ input->dynamicdata= link->ptr2;
+ }
MEM_freeN(link);
}
@@ -1102,12 +1004,12 @@ static void gpu_nodes_get_vertex_attributes(ListBase *nodes, GPUVertexAttribs *a
input->attribfirst = 1;
attribs->layer[a].type = input->attribtype;
- attribs->layer[a].glindex = input->attribid;
+ attribs->layer[a].attribid = input->attribid;
BLI_strncpy(attribs->layer[a].name, input->attribname,
sizeof(attribs->layer[a].name));
}
else
- input->attribid = attribs->layer[a].glindex;
+ input->attribid = attribs->layer[a].attribid;
}
}
}
@@ -1148,13 +1050,15 @@ GPUNodeLink *GPU_uniform(float *num)
return link;
}
-GPUNodeLink *GPU_dynamic_uniform(float *num)
+GPUNodeLink *GPU_dynamic_uniform(float *num, int dynamictype, void *data)
{
GPUNodeLink *link = GPU_node_link_create(0);
link->ptr1= num;
- link->ptr2= NULL;
+ link->ptr2= data;
link->dynamic= 1;
+ link->dynamictype = dynamictype;
+
return link;
}
@@ -1181,12 +1085,14 @@ GPUNodeLink *GPU_texture(int size, float *pixels)
return link;
}
-GPUNodeLink *GPU_dynamic_texture(GPUTexture *tex)
+GPUNodeLink *GPU_dynamic_texture(GPUTexture *tex, int dynamictype, void *data)
{
GPUNodeLink *link = GPU_node_link_create(0);
link->dynamic = 1;
link->dynamictex = tex;
+ link->dynamictype = dynamictype;
+ link->ptr2 = data;
return link;
}
@@ -1389,8 +1295,6 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
fragmentcode = code_generate_fragment(nodes, outlink->output, name);
vertexcode = code_generate_vertex(nodes);
shader = GPU_shader_create(vertexcode, fragmentcode, datatoc_gpu_shader_material_glsl); /*FUNCTION_LIB);*/
- MEM_freeN(fragmentcode);
- MEM_freeN(vertexcode);
/* failed? */
if (!shader) {
@@ -1405,6 +1309,9 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
pass->output = outlink->output;
pass->shader = shader;
+ pass->fragmentcode = fragmentcode;
+ pass->vertexcode = vertexcode;
+ pass->libcode = datatoc_gpu_shader_material_glsl;
/* extract dynamic inputs and throw away nodes */
GPU_nodes_extract_dynamic_inputs(pass, nodes);
@@ -1417,6 +1324,10 @@ void GPU_pass_free(GPUPass *pass)
{
GPU_shader_free(pass->shader);
GPU_inputs_free(&pass->inputs);
+ if (pass->fragmentcode)
+ MEM_freeN(pass->fragmentcode);
+ if (pass->vertexcode)
+ MEM_freeN(pass->vertexcode);
MEM_freeN(pass);
}
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index b0a131f5989..1e44eba89d4 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -39,12 +39,15 @@
#define __GPU_CODEGEN_H__
#include "DNA_listBase.h"
+#include "GPU_material.h"
+#include "GL/glew.h"
struct ListBase;
struct GPUShader;
struct GPUOutput;
struct GPUNode;
struct GPUVertexAttribs;
+struct GPUFrameBuffer;
#define MAX_FUNCTION_NAME 64
#define MAX_PARAMETER 32
@@ -68,7 +71,105 @@ GPUFunction *GPU_lookup_function(const char *name);
at the end if used.
*/
-struct GPUPass;
+typedef enum GPUDataSource {
+ GPU_SOURCE_VEC_UNIFORM,
+ GPU_SOURCE_BUILTIN,
+ GPU_SOURCE_TEX_PIXEL,
+ GPU_SOURCE_TEX,
+ GPU_SOURCE_ATTRIB
+} GPUDataSource;
+
+struct GPUNode {
+ struct GPUNode *next, *prev;
+
+ const char *name;
+ int tag;
+
+ ListBase inputs;
+ ListBase outputs;
+};
+
+struct GPUNodeLink {
+ GPUNodeStack *socket;
+
+ int attribtype;
+ const char *attribname;
+
+ int image;
+
+ int texture;
+ int texturesize;
+
+ void *ptr1, *ptr2;
+
+ int dynamic;
+ int dynamictype;
+
+ int type;
+ int users;
+
+ GPUTexture *dynamictex;
+
+ GPUBuiltin builtin;
+
+ struct GPUOutput *output;
+};
+
+typedef struct GPUOutput {
+ struct GPUOutput *next, *prev;
+
+ GPUNode *node;
+ int type; /* data type = length of vector/matrix */
+ GPUNodeLink *link; /* output link */
+ int id; /* unique id as created by code generator */
+} GPUOutput;
+
+typedef struct GPUInput {
+ struct GPUInput *next, *prev;
+
+ GPUNode *node;
+
+ int type; /* datatype */
+ int source; /* data source */
+
+ int id; /* unique id as created by code generator */
+ int texid; /* number for multitexture */
+ int attribid; /* id for vertex attributes */
+ int bindtex; /* input is responsible for binding the texture? */
+ int definetex; /* input is responsible for defining the pixel? */
+ int textarget; /* GL_TEXTURE_* */
+ int textype; /* datatype */
+
+ struct Image *ima; /* image */
+ struct ImageUser *iuser;/* image user */
+ float *dynamicvec; /* vector data in case it is dynamic */
+ int dynamictype; /* origin of the dynamic uniform (GPUDynamicType) */
+ void *dynamicdata; /* data source of the dynamic uniform */
+ GPUTexture *tex; /* input texture, only set at runtime */
+ int shaderloc; /* id from opengl */
+ char shadername[32]; /* name in shader */
+
+ float vec[16]; /* vector data */
+ GPUNodeLink *link;
+ int dynamictex; /* dynamic? */
+ int attribtype; /* attribute type */
+ char attribname[32]; /* attribute name */
+ int attribfirst; /* this is the first one that is bound */
+ GPUBuiltin builtin; /* builtin uniform */
+} GPUInput;
+
+struct GPUPass {
+ struct GPUPass *next, *prev;
+
+ ListBase inputs;
+ struct GPUOutput *output;
+ struct GPUShader *shader;
+ char *fragmentcode;
+ char *vertexcode;
+ const char *libcode;
+};
+
+
typedef struct GPUPass GPUPass;
GPUPass *GPU_generate_pass(ListBase *nodes, struct GPUNodeLink *outlink,
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index c9f1b093b7a..fb9f21cde8c 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -423,7 +423,7 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
if (tex->target != GL_TEXTURE_1D) {
/* CLAMP_TO_BORDER is an OpenGL 1.3 core feature */
- GLenum wrapmode = (depth)? GL_CLAMP_TO_EDGE: GL_CLAMP_TO_BORDER;
+ GLenum wrapmode = (depth || tex->h == 1)? GL_CLAMP_TO_EDGE: GL_CLAMP_TO_BORDER;
glTexParameteri(tex->target, GL_TEXTURE_WRAP_S, wrapmode);
glTexParameteri(tex->target, GL_TEXTURE_WRAP_T, wrapmode);
@@ -685,6 +685,11 @@ int GPU_texture_opengl_height(GPUTexture *tex)
return tex->h;
}
+int GPU_texture_opengl_bindcode(GPUTexture *tex)
+{
+ return tex->bindcode;
+}
+
GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex)
{
return tex->fb;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 15b96b6d808..9aa453af4d6 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -175,7 +175,7 @@ static void gpu_material_set_attrib_id(GPUMaterial *material)
* removed by the glsl compiler by dead code elimination */
for(a=0, b=0; a<attribs->totlayer; a++) {
- sprintf(name, "att%d", attribs->layer[a].glindex);
+ sprintf(name, "att%d", attribs->layer[a].attribid);
attribs->layer[a].glindex = GPU_shader_get_attribute(shader, name);
if(attribs->layer[a].glindex >= 0) {
@@ -386,12 +386,12 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode
/* from get_lamp_visibility */
if(lamp->type==LA_SUN || lamp->type==LA_HEMI) {
mat->dynproperty |= DYN_LAMP_VEC;
- GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec), lv, dist, &visifac);
+ GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), lv, dist, &visifac);
return visifac;
}
else {
mat->dynproperty |= DYN_LAMP_CO;
- GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), lv, dist, &visifac);
+ GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco, GPU_DYNAMIC_LAMP_DYNCO, lamp->ob), lv, dist, &visifac);
if(lamp->type==LA_AREA)
return visifac;
@@ -426,11 +426,11 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode
if(lamp->type == LA_SPOT) {
if(lamp->mode & LA_SQUARE) {
mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_IMAT;
- GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec), GPU_dynamic_uniform((float*)lamp->dynimat), *lv, &inpr);
+ GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), GPU_dynamic_uniform((float*)lamp->dynimat, GPU_DYNAMIC_LAMP_DYNIMAT, lamp->ob), *lv, &inpr);
}
else {
mat->dynproperty |= DYN_LAMP_VEC;
- GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec), *lv, &inpr);
+ GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), *lv, &inpr);
}
GPU_link(mat, "lamp_visibility_spot", GPU_uniform(&lamp->spotsi), GPU_uniform(&lamp->spotbl), inpr, visifac, &visifac);
@@ -646,7 +646,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
float area[4][4]= {{0.0f}}, areasize= 0.0f;
mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_CO;
- GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), GPU_dynamic_uniform(lamp->dynvec), vn, GPU_uniform((float*)area),
+ GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco, GPU_DYNAMIC_LAMP_DYNCO, lamp->ob), GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), vn, GPU_uniform((float*)area),
GPU_uniform(&areasize), GPU_uniform(&lamp->k), &inp);
}
@@ -684,13 +684,13 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
GPU_link(mat, "test_shadowbuf",
GPU_builtin(GPU_VIEW_POSITION),
- GPU_dynamic_texture(lamp->tex),
- GPU_dynamic_uniform((float*)lamp->dynpersmat),
+ GPU_dynamic_texture(lamp->tex, GPU_DYNAMIC_SAMPLER_2DSHADOW, lamp->ob),
+ GPU_dynamic_uniform((float*)lamp->dynpersmat, GPU_DYNAMIC_LAMP_DYNPERSMAT, lamp->ob),
GPU_uniform(&lamp->bias), inp, &shadfac);
if(lamp->mode & LA_ONLYSHADOW) {
GPU_link(mat, "shade_only_shadow", i, shadfac,
- GPU_dynamic_uniform(&lamp->dynenergy), &shadfac);
+ GPU_dynamic_uniform(&lamp->dynenergy, GPU_DYNAMIC_LAMP_DYNENERGY, lamp->ob), &shadfac);
if(!(lamp->mode & LA_NO_DIFF))
GPU_link(mat, "shade_only_shadow_diffuse", shadfac, shi->rgb,
@@ -719,7 +719,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
if(GPU_link_changed(shi->refl) || ma->ref != 0.0f) {
if(!(lamp->mode & LA_NO_DIFF)) {
GPUNodeLink *rgb;
- GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol), &rgb);
+ GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), &rgb);
add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);
}
}
@@ -729,7 +729,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
(GPU_link_changed(shi->spec) || ma->spec != 0.0f)) {
if(lamp->type == LA_HEMI) {
GPU_link(mat, "shade_hemi_spec", vn, lv, view, GPU_uniform(&ma->spec), shi->har, visifac, &t);
- GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol);
+ GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), shi->specrgb, &outcol);
GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec);
}
else {
@@ -752,11 +752,11 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
if(ma->mode & MA_RAMP_SPEC) {
GPUNodeLink *spec;
do_specular_ramp(shi, specfac, t, &spec);
- GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), spec, &outcol);
+ GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), spec, &outcol);
GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec);
}
else {
- GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol);
+ GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), shi->specrgb, &outcol);
GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec);
}
}
@@ -1676,3 +1676,187 @@ int GPU_lamp_shadow_layer(GPULamp *lamp)
return -1;
}
+/* export the GLSL shader */
+
+GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma)
+{
+ static struct {
+ GPUBuiltin gputype;
+ GPUDynamicType dynamictype;
+ GPUDataType datatype;
+ } builtins[] = {
+ { GPU_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWMAT, GPU_DATA_16F },
+ { GPU_INVERSE_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWIMAT, GPU_DATA_16F },
+ { GPU_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_MAT, GPU_DATA_16F },
+ { GPU_INVERSE_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_IMAT, GPU_DATA_16F },
+ { GPU_OBCOLOR, GPU_DYNAMIC_OBJECT_COLOR, GPU_DATA_4F },
+ { 0 }
+ };
+
+ GPUShaderExport *shader = NULL;
+ GPUPass *pass;
+ GPUInput *input;
+ GPUMaterial *mat;
+ GPUInputUniform *uniform;
+ GPUInputAttribute *attribute;
+ GLint lastbindcode;
+ int i, liblen, fraglen;
+
+ if(!GPU_glsl_support())
+ return NULL;
+
+ mat = GPU_material_from_blender(scene, ma);
+ pass = (mat)? mat->pass: NULL;
+
+ if(pass && pass->fragmentcode && pass->vertexcode) {
+ shader = MEM_callocN(sizeof(GPUShaderExport), "GPUShaderExport");
+
+ for(input = pass->inputs.first; input; input = input->next) {
+ uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform");
+
+ if(input->ima) {
+ /* image sampler uniform */
+ uniform->type = GPU_DYNAMIC_SAMPLER_2DIMAGE;
+ uniform->datatype = GPU_DATA_1I;
+ uniform->image = input->ima;
+ uniform->texnumber = input->texid;
+ BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+ }
+ else if(input->tex) {
+ /* generated buffer */
+ uniform->texnumber = input->texid;
+ uniform->datatype = GPU_DATA_1I;
+ BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+
+ switch(input->textype) {
+ case GPU_SHADOW2D:
+ uniform->type = GPU_DYNAMIC_SAMPLER_2DSHADOW;
+ uniform->lamp = input->dynamicdata;
+ break;
+ case GPU_TEX2D:
+ if(GPU_texture_opengl_bindcode(input->tex)) {
+ uniform->type = GPU_DYNAMIC_SAMPLER_2DBUFFER;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode);
+ glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(input->tex));
+ uniform->texsize = GPU_texture_opengl_width(input->tex) * GPU_texture_opengl_height(input->tex);
+ uniform->texpixels = MEM_mallocN(uniform->texsize*4, "RGBApixels");
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, uniform->texpixels);
+ glBindTexture(GL_TEXTURE_2D, lastbindcode);
+ }
+ break;
+ }
+ }
+ else {
+ uniform->type = input->dynamictype;
+ BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+ switch(input->type) {
+ case 1:
+ uniform->datatype = GPU_DATA_1F;
+ break;
+ case 2:
+ uniform->datatype = GPU_DATA_2F;
+ break;
+ case 3:
+ uniform->datatype = GPU_DATA_3F;
+ break;
+ case 4:
+ uniform->datatype = GPU_DATA_4F;
+ break;
+ case 9:
+ uniform->datatype = GPU_DATA_9F;
+ break;
+ case 16:
+ uniform->datatype = GPU_DATA_16F;
+ break;
+ }
+
+ if(uniform->type >= GPU_DYNAMIC_LAMP_FIRST && uniform->type <= GPU_DYNAMIC_LAMP_LAST)
+ uniform->lamp = input->dynamicdata;
+ }
+
+ if(uniform->type != GPU_DYNAMIC_NONE)
+ BLI_addtail(&shader->uniforms, uniform);
+ else
+ MEM_freeN(uniform);
+ }
+
+ /* process builtin uniform */
+ for(i=0; builtins[i].gputype; i++) {
+ if(mat->builtins & builtins[i].gputype) {
+ uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform");
+ uniform->type = builtins[i].dynamictype;
+ uniform->datatype = builtins[i].datatype;
+ BLI_strncpy(uniform->varname, GPU_builtin_name(builtins[i].gputype), sizeof(uniform->varname));
+ BLI_addtail(&shader->uniforms, uniform);
+ }
+ }
+
+ // now link fragement shader with library shader
+ // TBD: remove the function that are not used in the main function
+ liblen = (pass->libcode) ? strlen(pass->libcode) : 0;
+ fraglen = strlen(pass->fragmentcode);
+ shader->fragment = (char *)MEM_mallocN(liblen+fraglen+1, "GPUFragShader");
+ if(pass->libcode)
+ memcpy(shader->fragment, pass->libcode, liblen);
+ memcpy(&shader->fragment[liblen], pass->fragmentcode, fraglen);
+ shader->fragment[liblen+fraglen] = 0;
+
+ // export the attribute
+ for(i=0; i<mat->attribs.totlayer; i++) {
+ attribute = MEM_callocN(sizeof(GPUInputAttribute), "GPUInputAttribute");
+ attribute->type = mat->attribs.layer[i].type;
+ attribute->number = mat->attribs.layer[i].glindex;
+ BLI_snprintf(attribute->varname, sizeof(attribute->varname), "att%d", mat->attribs.layer[i].attribid);
+
+ switch(attribute->type) {
+ case CD_TANGENT:
+ attribute->datatype = GPU_DATA_4F;
+ break;
+ case CD_MTFACE:
+ attribute->datatype = GPU_DATA_2F;
+ attribute->name = mat->attribs.layer[i].name;
+ break;
+ case CD_MCOL:
+ attribute->datatype = GPU_DATA_4UB;
+ attribute->name = mat->attribs.layer[i].name;
+ break;
+ case CD_ORCO:
+ attribute->datatype = GPU_DATA_3F;
+ break;
+ }
+
+ if(attribute->datatype != GPU_DATA_NONE)
+ BLI_addtail(&shader->attributes, attribute);
+ else
+ MEM_freeN(attribute);
+ }
+
+ // export the vertex shader
+ shader->vertex = BLI_strdup(pass->vertexcode);
+ }
+
+ return shader;
+}
+
+void GPU_free_shader_export(GPUShaderExport *shader)
+{
+ GPUInputUniform *uniform;
+
+ if(shader == NULL)
+ return;
+
+ for(uniform = shader->uniforms.first; uniform; uniform=uniform->next)
+ if(uniform->texpixels)
+ MEM_freeN(uniform->texpixels);
+
+ BLI_freelistN(&shader->uniforms);
+ BLI_freelistN(&shader->attributes);
+
+ if(shader->vertex)
+ MEM_freeN(shader->vertex);
+ if(shader->fragment)
+ MEM_freeN(shader->fragment);
+
+ MEM_freeN(shader);
+}
+
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl
index 815b74a1bf4..c5c822d9224 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl
@@ -308,22 +308,22 @@ void normal(vec3 dir, vec3 nor, out vec3 outnor, out float outdot)
outdot = -dot(dir, nor);
}
-void curves_vec(float fac, vec3 vec, sampler1D curvemap, out vec3 outvec)
+void curves_vec(float fac, vec3 vec, sampler2D curvemap, out vec3 outvec)
{
- outvec.x = texture1D(curvemap, (vec.x + 1.0)*0.5).x;
- outvec.y = texture1D(curvemap, (vec.y + 1.0)*0.5).y;
- outvec.z = texture1D(curvemap, (vec.z + 1.0)*0.5).z;
+ outvec.x = texture2D(curvemap, vec2((vec.x + 1.0)*0.5, 0.0)).x;
+ outvec.y = texture2D(curvemap, vec2((vec.y + 1.0)*0.5, 0.0)).y;
+ outvec.z = texture2D(curvemap, vec2((vec.z + 1.0)*0.5, 0.0)).z;
if (fac != 1.0)
outvec = (outvec*fac) + (vec*(1.0-fac));
}
-void curves_rgb(float fac, vec4 col, sampler1D curvemap, out vec4 outcol)
+void curves_rgb(float fac, vec4 col, sampler2D curvemap, out vec4 outcol)
{
- outcol.r = texture1D(curvemap, texture1D(curvemap, col.r).a).r;
- outcol.g = texture1D(curvemap, texture1D(curvemap, col.g).a).g;
- outcol.b = texture1D(curvemap, texture1D(curvemap, col.b).a).b;
+ outcol.r = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.r, 0.0)).a, 0.0)).r;
+ outcol.g = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.g, 0.0)).a, 0.0)).g;
+ outcol.b = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.b, 0.0)).a, 0.0)).b;
if (fac != 1.0)
outcol = (outcol*fac) + (col*(1.0-fac));
@@ -635,9 +635,9 @@ void mix_linear(float fac, vec4 col1, vec4 col2, out vec4 outcol)
outcol.b= col1.b + fac*(2.0*(col2.b) - 1.0);
}
-void valtorgb(float fac, sampler1D colormap, out vec4 outcol, out float outalpha)
+void valtorgb(float fac, sampler2D colormap, out vec4 outcol, out float outalpha)
{
- outcol = texture1D(colormap, fac);
+ outcol = texture2D(colormap, vec2(fac, 0.0));
outalpha = outcol.a;
}
@@ -1320,9 +1320,9 @@ void lamp_falloff_sliders(float lampdist, float ld1, float ld2, float dist, out
visifac *= lampdistkw/(lampdistkw + ld2*dist*dist);
}
-void lamp_falloff_curve(float lampdist, sampler1D curvemap, float dist, out float visifac)
+void lamp_falloff_curve(float lampdist, sampler2D curvemap, float dist, out float visifac)
{
- visifac = texture1D(curvemap, dist/lampdist).x;
+ visifac = texture2D(curvemap, vec2(dist/lampdist, 0.0)).x;
}
void lamp_visibility_sphere(float lampdist, float dist, float visifac, out float outvisifac)
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index 87a8ed65532..63c7d34cda8 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,1250 +1,1310 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 39789;
+int datatoc_gpu_shader_material_glsl_size= 41714;
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,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,
+ 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,
+123, 13, 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, 13, 10, 9,118,101, 99, 51, 32, 99, 59, 13, 10, 13, 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, 13, 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, 13, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 13, 10,
+ 13, 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 13, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 13, 10, 9,
+ 9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,115, 32,
+ 61, 32, 48, 46, 48, 59, 13, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 13, 10, 9,105,102, 32, 40,115,
+ 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,
+101, 32,123, 13, 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, 13, 10, 13, 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, 13, 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, 13, 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, 13, 10, 13, 10, 9, 9,104, 32, 47, 61, 32, 54, 46, 48, 59, 13, 10, 13, 10, 9,
+ 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 13, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, 46, 48, 59, 13, 10, 9,125, 13, 10, 13,
+ 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,
+ 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10, 9,118,101, 99, 51, 32,114,103, 98, 59,
+ 13, 10, 13, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 13, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 13, 10,
+ 9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 13, 10, 13, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 13, 10, 9,
+ 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101,
+ 32,123, 13, 10, 9, 9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 13, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,
+ 9, 13, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, 48, 59, 13, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 13,
+ 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 13, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102,
+ 44, 32,102, 41, 59, 13, 10, 9, 9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 13, 10, 9, 9,113, 32, 61, 32,118,
+ 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 13, 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, 13, 10, 9, 9, 13, 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, 13, 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, 13, 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, 13, 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, 13, 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, 13,
+ 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, 13, 10, 9,125,
+ 13, 10, 13, 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, 13,
+ 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 13, 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, 13, 10, 9,101,108,115,101, 13, 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, 13, 10,125, 13, 10, 13,
+ 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, 13, 10,123, 13, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 13, 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, 13, 10, 9,
+101,108,115,101, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 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, 13, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61,
+ 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 13, 10,125, 13, 10, 13, 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,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,
+ 52, 32, 99,111,108, 95,116,111, 41, 13, 10,123, 13, 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, 13, 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, 13, 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, 13, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,
+108, 95,102,114,111,109, 46, 97, 59, 13, 10,125, 13, 10, 13, 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, 13, 10, 13, 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, 13, 10, 13, 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, 13, 10,123, 13, 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, 13,
+ 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,
+123, 13, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 13, 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, 13, 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, 13, 10, 9,111,114, 99,111, 32,
+ 61, 32, 97,116,116,111,114, 99,111, 59, 13, 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, 13, 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, 13, 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, 13, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13,
+ 10, 13, 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, 13, 10,123, 13, 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, 13, 10, 9,105,102, 40,100,111,109,105,110, 32, 61, 61,
+ 32, 49, 46, 48, 41, 13, 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, 13, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 13, 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, 13, 10,125, 13, 10, 13,
+ 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, 13, 10,123, 13, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97,
+ 98,115, 40, 99,111, 46,122, 41, 59, 13, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41,
+ 59, 13, 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, 13, 10,125, 13,
+ 10, 13, 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, 13, 10,123, 13, 10, 9,
+111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,
+116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,116,118,
+ 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,105,102, 32, 40,118, 97,108, 50,
+ 32, 61, 61, 32, 48, 46, 48, 41, 13, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101,
+ 13, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,
+108, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,116,
+118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 13, 10,125, 13,
+ 10, 13, 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, 13, 10,123, 13, 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, 13, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,
+115,105,110, 40,118, 97,108, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48,
+ 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10, 9, 9,111,117,116,118, 97,
+108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,118, 97,108, 32,
+ 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,
+116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61,
+ 32, 48, 46, 48, 41, 13, 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, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13,
+ 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, 13, 10,123, 13, 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, 13, 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, 13,
+ 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 13, 10, 9, 9,111,
+117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,
+ 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41,
+ 13, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,118,
+ 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10,125, 13, 10, 13, 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, 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,
+ 97,108, 41, 13, 10,123, 13, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 13, 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, 13, 10,125,
+ 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50,
+ 59, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,116,118,101,
+ 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 13, 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, 13, 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, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118,
+ 49, 44, 32,118, 50, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 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, 13, 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, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,
116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,
-108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,
-122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,
-101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10, 9,111,117,116,118, 32, 61, 32,
- 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99,
- 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100,105,114, 59, 10, 9,111,117,116,100,
-111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,
-118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,
-112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99,
- 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109,
- 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,120, 59, 10, 9,111,117,116,118,101,
- 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,121,
- 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,
-117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46,
- 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99,
- 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41,
- 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99,
- 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,
-111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,
-101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,
-118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,
-116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,
-114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61,
- 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,
-117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32,
- 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32,
- 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
- 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118,
- 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32,
- 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,
-108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,
-116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,
-125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,
-100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
- 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,
-103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
- 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97,
- 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108,
- 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40,
-102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44,
- 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112,
- 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,
-111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108,
- 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
-117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32,
- 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43,
- 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
- 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48,
- 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111,
-108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52,
- 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
-108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41,
- 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116,
- 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32, 43, 32,
-102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40, 49, 46,
- 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
+116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 13, 10,123, 13, 10, 9,111,117,116,
+118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 13, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109,
+ 97,108,105,122,101, 40,118, 41, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10,
+ 9,111,117,116,118, 32, 61, 32, 45,118, 59, 13, 10,125, 13, 10, 13, 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, 13, 10,123, 13, 10, 9,111,117,116,110,111,114,
+ 32, 61, 32,100,105,114, 59, 13, 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, 13, 10,125, 13, 10, 13, 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, 50, 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, 13, 10,123, 13, 10, 9,111,117,116,118,101, 99, 46,120,
+ 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99,
+ 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 13, 10, 9,111,117,116,118,101, 99,
+ 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,
+101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 13, 10, 9,111,117,116,118,
+101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,
+ 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 13, 10, 13, 10, 9,
+105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 13, 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, 13, 10, 13, 10,125,
+ 13, 10, 13, 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, 50, 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, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,101,
+120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68,
+ 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,114, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32,
+ 48, 46, 48, 41, 41, 46,114, 59, 13, 10, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,
+ 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,
+112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,103, 59,
+ 13, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112,
+ 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,
+ 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46, 98, 59, 13, 10, 13, 10, 9,105,102, 32,
+ 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 13, 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, 13, 10, 13, 10, 9,111,117,116,
+ 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 13, 10,125, 13, 10, 13, 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,
+ 13, 10,123, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,
+101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108,
+ 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,
+115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
+111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,
+100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
+108, 41, 13, 10,123, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100,
+ 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+ 13, 10,123, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,
+101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 13, 10,123, 13,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100,
+ 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 13,
+ 10,123, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,
+111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
+108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13,
+ 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
+ 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41,
+ 59, 13, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,
+100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10,
+ 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102,
+ 97, 99, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 10,
+118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
+108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13,
+ 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
+ 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111,108,
+ 50, 44, 32,102, 97, 99, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125,
+ 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
-116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
- 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48,
- 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,
- 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32,
- 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,114, 41,
- 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,
-103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46,
- 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61,
- 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,
-108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,
-116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97, 99,109,
- 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,
-108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48,
- 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
-108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
-123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 44, 32,
-102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,
- 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,
-116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,
-111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,
-114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114,
- 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,
-111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,
-108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,
-117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117,
-116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40,
+116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
+ 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59,
+ 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,
+102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42,
+ 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61,
+ 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,
102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44,
- 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112,
- 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,
-111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,
-116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114,
-107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
- 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,
-109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61,
- 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,
-117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,
-103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,
-108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98,
- 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10,
- 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
-100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
- 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61,
- 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61,
- 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9,
- 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,
- 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46,
- 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,109,112,
- 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,
-115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116,
- 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46,
- 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41,
- 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,
-109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116,
- 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32,
- 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123,
- 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59,
- 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,
- 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 47,116,
-109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,
-101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,
-105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
- 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
- 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,
-111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116,
- 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,
-111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,
-114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,
- 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,
-111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49,
- 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
-116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99,
- 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,
-108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32,
- 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,
- 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62,
- 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,
-111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102,
- 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,
- 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46,
- 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48,
- 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112,
- 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10,
- 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,104,117,
-101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
- 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,
-109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61,
- 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,
-101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,
- 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41,
- 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,
-104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118,
- 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44,
- 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
- 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
+ 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,
+109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32,
+ 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13,
+ 10, 13, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 13, 10, 9, 9,111,117,116, 99,111,108,
+ 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 13, 10, 9,101,
+108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,
+ 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,
+117,116, 99,111,108, 46,114, 41, 59, 13, 10, 13, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41,
+ 13, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,
+111,108, 50, 46,103, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32,
+ 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41,
+ 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 13, 10, 13, 10, 9,105,102, 40,111,117,116, 99,111,
+108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43,
+ 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116, 99,111,
+108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48,
+ 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 13, 10,125,
+ 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52,
+ 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
+108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46,
+ 48, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 45, 32,
+ 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
+ 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
-116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
- 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59,
- 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,105,102, 40,
-104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108,
- 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32,
- 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,
-111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45,
- 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,
-104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50,
- 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32, 43, 32,
-102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116,
- 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,102, 97,
+116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
+ 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59,
+ 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10, 9,105,102, 40, 99,111,108, 50, 46,
+114, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108,
+ 46,114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 13, 10, 9,105,102, 40, 99,
+111,108, 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,
+116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 13, 10, 9,
+105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,
+109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
+ 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
+111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46,
+ 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,
+115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 46, 97,
+ 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114,107, 40,102,
+108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,
+112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61,
+ 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 13, 10, 9,
+111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,
+120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101,
+ 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,
+ 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,111,117,116,
+ 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98,
+ 42,102, 97, 99, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13, 10,125, 13, 10,
+ 13, 10,118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52,
+ 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
+108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46,
+ 48, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10, 9,105,102, 40,111,117,116, 99,
+111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46,
+ 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 13, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48,
+ 41, 13, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9,101,108,115,101, 32,105,102,
+ 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 13, 10, 9, 9,
+ 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9,101,108,115,101, 13, 10, 9, 9, 9,111,117,116,
+ 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 13, 10, 9,125, 13, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33,
+ 61, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97,
+ 99, 42, 99,111,108, 50, 46,103, 59, 13, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10, 9, 9, 9,
+111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32,
+ 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 13, 10, 9, 9, 9,111,117,116, 99,111,
+108, 46,103, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9,101,108,115,101, 13, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32,
+ 61, 32,116,109,112, 59, 13, 10, 9,125, 13, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41,
+ 32,123, 13, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50,
+ 46, 98, 59, 13, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10, 9, 9, 9,111,117,116, 99,111,108,
+ 46, 98, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,
+111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 13, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,
+ 49, 46, 48, 59, 13, 10, 9, 9,101,108,115,101, 13, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59,
+ 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102,
+ 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
+ 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13,
+ 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 13, 10, 9,105,102, 40,
+116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 13, 10,
+ 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,
+116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46,114,
+ 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 13, 10, 9, 9,
+111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108,
+ 46,114, 32, 61, 32,116,109,112, 59, 13, 10, 13, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,
+111,108, 50, 46,103, 59, 13, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 13, 10, 9, 9,111,117,116, 99,111,
+108, 46,103, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48,
+ 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41,
+ 13, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40,116,109,
+112, 32, 62, 32, 49, 46, 48, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,
+115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 13, 10, 13, 10, 9,116,109,112, 32, 61, 32,
+102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 13, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48,
+ 46, 48, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102,
+ 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,
+116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 13,
+ 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 98,
+ 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
+117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48,
+ 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
+ 59, 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10, 9,118,101, 99, 52, 32,104,115,
+118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 13, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44,
+ 32,104,115,118, 50, 41, 59, 13, 10, 13, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 13,
+ 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 13, 10, 9, 9,104,
+115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 13, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118,
+ 44, 32,116,109,112, 41, 59, 32, 13, 10, 13, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,
+108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49,
+ 46, 97, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97,116,
+ 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
+ 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
+ 32, 45, 32,102, 97, 99, 59, 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13, 10, 9,118,
+101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 13, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,
+111,108, 44, 32,104,115,118, 41, 59, 13, 10, 13, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123,
+ 13, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 13, 10, 13, 10, 9,
+ 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121,
+ 59, 13, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 13, 10, 9,
+125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
+117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48,
+ 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
+ 59, 13, 10, 13, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 13, 10, 9,114,103, 98, 95,116,111, 95,104,
+115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 13, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50,
+ 44, 32,104,115,118, 50, 41, 59, 13, 10, 13, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32,
+ 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 13, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,
+111,117,116, 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,102,108,
+111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
+117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112,
+ 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 13, 10, 13,
+ 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 13, 10, 9,114,103, 98, 95,116,111, 95,
+104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 13, 10, 13, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33,
+ 61, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,
+115,118, 41, 59, 13, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 13, 10, 9, 9,104,115,118, 46,121,
+ 32, 61, 32,104,115,118, 50, 46,121, 59, 13, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,
+112, 41, 59, 32, 13, 10, 13, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,
+109,112, 44, 32,102, 97, 99, 41, 59, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 13,
+ 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97,
99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46,
- 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
- 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,
-115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50,
- 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,
-111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,
-118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111,
- 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120,
- 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61,
- 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
-116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
- 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32,
- 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,118,
-101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,101,
- 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32, 43, 32,
-102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32, 99,111,
-108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,
-105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108,
- 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,
- 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40,
- 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,103,
- 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99,
- 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,
-117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50,
- 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 10, 9,
- 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,
-108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32,
- 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115,
- 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10,123, 10, 9,111,117,116, 99,111,
-108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,102, 97, 99, 41, 59, 10, 9,111,
-117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,
-111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
- 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,
-111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,
-101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,
-120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,
-116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
-111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,
-120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,
-121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,
-118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,
-116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
- 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,
-118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118,
- 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49,
- 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60,
- 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,
-116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,
+ 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32,
+ 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
+102, 97, 99, 59, 13, 10, 13, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 13, 10, 9,
+118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,
+101, 32, 45, 32, 99,111,108, 49, 41, 59, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32,
+ 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32,
+ 99,111,108, 49, 42,115, 99,114, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101, 97,114,
+ 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108,
+ 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61,
+ 32, 99,111,108, 49, 59, 13, 10, 13, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 13, 10, 9, 9,111,
+117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50,
+ 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32,
+ 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48,
+ 41, 59, 13, 10, 13, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 13, 10, 9, 9,111,117,116, 99,111,
+108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45,
+ 32, 48, 46, 53, 41, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49,
+ 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 13, 10,
+ 13, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61,
+ 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53,
+ 41, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43,
+ 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 13, 10,125, 13, 10, 13,
+ 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,
+114, 50, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61,
+ 32,116,101,120,116,117,114,101, 50, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,118,101, 99, 50, 40,102, 97, 99, 44, 32, 48,
+ 46, 48, 41, 41, 59, 13, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 13, 10,125, 13,
+ 10, 13, 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 13, 10,123, 13, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,
+108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,
+114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,
+110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47,
+ 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101,
+ 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,
+116, 99,111,108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48,
+ 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 13, 10, 9,111,
+117,116, 99,111,108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,104,117,101, 95,
+115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,
+118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 13, 10, 13, 10, 9,
+114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 13, 10, 13, 10, 9,104,115,118, 91, 48, 93,
+ 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 13, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48,
+ 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46,
+ 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 13, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116,
+ 59, 13, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,
101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59,
- 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46,
- 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48,
- 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,
-118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,
-111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,
-103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114,
- 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,
-100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,
-102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,
-118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,
-117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52,
- 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,
-100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,
-121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,
-101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,
-116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
-116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40,
- 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61,
- 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,
-110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,
- 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101,
- 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,
-102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118,
- 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44,
- 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48,
- 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,
-118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,
-105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48,
- 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32,
- 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61,
- 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32,
- 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42,
+ 13, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 13, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62,
+ 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93,
+ 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 13, 10, 13, 10, 9,104,115,118, 95,116,111, 95,114,103,
+ 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 13, 10, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120,
+ 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,
+101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 13, 10,123, 13,
+ 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 13, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 13, 10, 9, 98, 32, 61, 32,
+ 99,111,108, 46, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,
+111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99,
+ 52, 32, 99,111,108, 41, 13, 10,123, 13, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32,
+ 49, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99,
+ 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
+114,103, 98, 41, 13, 10,123, 13, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44,
+ 32, 97,108,112,104, 97, 41, 59, 13, 10,125, 13, 10, 13, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84,
+ 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 13, 10, 13, 10,118,111,105,100, 32,116,101,
+120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,111,117,116,118,101, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,
+122, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,
+118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 13, 10,123, 13, 10,
+ 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, 13, 10,125, 13, 10, 13,
+ 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51, 32,118,101,
+ 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 13, 10,123, 13, 10, 9,111,117,116,118, 97,108,
+ 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9,
+111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120,
+116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99,
+ 51, 32,110,111,114,109, 97,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101,
+ 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,
+118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 13, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32,
+ 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 13, 10, 13, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 13, 10, 9, 99,111,
+108,111,114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,110,
+111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13,
+ 10, 13, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,
+115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41,
+ 13, 10,123, 13, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101,
+ 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 13, 10, 9,118,
+ 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 13, 10, 13, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40,
+ 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 13, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48,
+ 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 13, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50,
+ 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 13, 10,125, 13, 10, 13, 10, 47, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47,
- 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111,
- 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,
-111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,
-111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99,
- 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46,
- 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,
-111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,
-101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,
-114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,
-114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116,
- 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,
-105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,
-103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,
-105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10,
- 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109,
- 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109,
- 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,
-121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,
-118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10, 9,114,101,102, 32,
- 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125,
- 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 98,108,101,110,100,101,114,
- 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,111,117,
-116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108,
- 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46,
- 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,
-102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,
-108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
+ 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 13, 10,123, 13, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,
+111,114, 99,111, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50, 32, 97,
+116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 13, 10,123, 13, 10, 9, 47, 42, 32,100,105,115, 97, 98,
+108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104,
+ 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 13, 10, 9, 32,
+ 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48,
+ 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 13, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,
+117,118, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,
+118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41,
+ 13, 10,123, 13, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110,
+ 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 13, 10, 9,
+ 32, 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42,
+ 47, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108,
+ 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52,
+ 32,116, 97,110,103,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 13, 10,
+123, 13, 10, 9,111,117,116,116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,
+110,116, 46,120,121,122, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108,
+ 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,103,108,111, 98, 97,108, 41, 13, 10,123, 13, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,
+110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 13, 10,125, 13, 10, 13, 10,
+118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,
+116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,111, 98,106,101, 99,116, 41, 13, 10,123, 13, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,
+109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,
+120,121,122, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, 32,
+118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 13, 10,123, 13,
+ 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41,
+ 42,118,110, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,
+110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 13, 10,123, 13, 10,
+ 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103,
+ 97,116,101,100, 32, 42, 47, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101,
+ 40,110,111,114,109, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,
+101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,
+110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32,
+ 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 13, 10, 13, 10, 9,
+105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,
+108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,
+111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13,
+ 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13,
+ 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,
+102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10,
+ 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,
+111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,
+111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97,
+ 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40,
+ 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40,
+ 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116,
+ 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,
+121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,
-103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,
-102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44,
- 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102,
- 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
- 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101,
- 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120,
- 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108,
- 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46,
- 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,
-110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97,
- 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,
- 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,
-120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,
-111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,
-111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59,
- 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43,
- 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48,
- 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46,
- 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32,
- 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,
-108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46,
- 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108,
- 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125,
- 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44,
- 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61,
- 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
- 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109,
- 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97,
- 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,
-114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,
-114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41,
- 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,
-111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32,
- 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32,
- 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99,
+111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61,
+ 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 13, 10, 13, 10, 9,105,102,
+ 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 13, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,
+116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114,
+ 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97,
+ 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42,
+ 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 13, 10, 13, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,
+103, 32, 60, 32, 48, 46, 53, 41, 13, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,
+102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 13, 10, 9,101,108,115,
+101, 13, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48,
+ 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,
+117,116, 99,111,108, 46,103, 41, 59, 13, 10, 13, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41,
+ 13, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50,
+ 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110, 99,
+111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49,
+ 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,
+117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10,
+ 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116,
+ 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99,
+ 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
+116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,
+123, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,
+117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,
+101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41,
+ 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97,
+ 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 13, 10, 13, 10, 9,105,102, 40,116,101,
+120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,
+116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59,
+ 13, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61,
+ 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,
+101,120, 99,111,108, 46,103, 59, 13, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,
+110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,
+116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120,
+ 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10,
+ 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116,
+ 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116,
+ 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,
+100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99,
51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59,
- 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,
-116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,
- 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108,
- 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97,
- 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,
-111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,
-115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97,
- 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41,
- 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,
-117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,
-105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108,
- 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,
-101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
- 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,
-109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32,
- 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59,
- 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,
-111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,
-108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116,
- 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108,
- 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98,
- 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,
- 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,
-117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,
- 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
- 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10,
- 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108,
- 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59,
- 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120,
- 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48,
- 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,
-111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,
-103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,
-108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,
-101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95, 99,111,
-108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41,
- 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,
-108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
-108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42,
- 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,
- 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32,
-102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109,
-112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,
+109, 44, 32, 99,111,108, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109,
+ 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 13, 10, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,
+111,108, 46,114, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108,
+ 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,
+114, 59, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 13, 10, 9,105,102, 40, 99,
+111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,
+115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 13, 10, 9, 99,111,108, 32, 61, 32,102,
+ 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,
+ 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61,
+ 32,111,117,116, 99,111,108, 46, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,
+105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 13, 10, 13, 10,
+ 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116,
+ 59, 13, 10, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 13, 10, 9,105,102, 40,
+ 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,
+108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 13, 10, 9, 99,111,108, 32, 61, 32,
+102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108,
+ 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32,
+ 61, 32,111,117,116, 99,111,108, 46,103, 59, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,
+ 98, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32,
+ 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 13,
+ 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116,
+ 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,
+111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,118,
+101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,
+118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32,
+ 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103,
+ 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,
+111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13,
+ 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,
+103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,
+108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108,
+ 46,114,103, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101,
+ 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13,
+ 10,123, 13, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,
+102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,
+120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32,
+ 99,111,108, 46,114,103, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,
+111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110,
+ 99,111,108, 41, 13, 10,123, 13, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95, 99,111,108,111,
+114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,
+118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108,
+ 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,
+118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 13, 10,123, 13, 10, 9,102, 97,
+ 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97,
+ 99,116, 59, 13, 10, 13, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,102,108,111, 97,
+116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 13, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 13, 10, 9,
+ 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120,
+ 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116,
+ 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,
+109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44,
+ 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32,
+ 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118,
+ 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120,
+ 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10,
+ 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,
+109, 41, 59, 13, 10, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 13, 10, 9,105,110, 99,
+111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,102,
108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118,
- 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61,
- 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44,
- 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116,
- 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97,
- 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10,
- 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,
-116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,
-102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,
-118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61,
- 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,
-109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,
-111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,117, 98, 40,
-102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,
-118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61,
- 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,
-117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,
-111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,
-108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,
-114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102,
- 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,
-111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116,
- 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,
-123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,
-102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33,
- 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102,
- 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108,
- 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,102,102, 40,
-102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,
-118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32,
- 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32,
- 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,
-114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,
-117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111,
- 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,
-111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32,
- 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,
-104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,
-117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111,
- 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,
-111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32,
- 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,
-109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46,
- 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,
-102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,116,104, 97,114, 32, 61, 32,104, 97,114,
- 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,
-121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
-104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60,
- 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114,
- 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,
-111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97,
- 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,
-112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116,
- 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,
-111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,101,110,115,105,116,121, 32, 61, 32,100,
-111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103,
- 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,101,114,116, 40,102,108,
-111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,117,101, 41,
- 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117,101, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32,105,110,114,103, 98,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,
-101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98,
- 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,
-102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,
-116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,
-116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,
-108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108,
- 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41,
- 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32,
- 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 10,
- 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44,
- 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10,
- 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,
-101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,
-111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120,
-121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115,
- 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,
-101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111,
- 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108,
- 41, 10,123, 10, 9, 47, 47, 32, 84,104,101, 32,105,110,118,101,114,116, 32,111,102, 32,116,104,101, 32,114,101,100, 32, 99,104,
- 97,110,110,101,108, 32,105,115, 32,116,111, 32,109, 97,107,101, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,
-109, 97,112, 32, 99,111,109,112,108,105, 97,110,116, 32,119,105,116,104, 32,116,104,101, 32,111,117,116,115,105,100,101, 32,119,
-111,114,108,100, 46, 10, 9, 47, 47, 32, 73,116, 32,110,101,101,100,115, 32,116,111, 32, 98,101, 32,100,111,110,101, 32, 98,101,
- 99, 97,117,115,101, 32,105,110, 32, 66,108,101,110,100,101,114, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,
-117,115,101,100, 32,112,111,105,110,116,115, 32,105,110,119, 97,114,100, 46, 10, 9, 47, 47, 32, 83,104,111,117,108,100, 32,116,
-104,105,115, 32,101,118,101,114, 32, 99,104, 97,110,103,101, 32,116,104,105,115, 32,110,101,103, 97,116,101, 32,109,117,115,116,
- 32, 98,101, 32,114,101,109,111,118,101,100, 46, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,
-120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,110,111,114,109, 97,108, 32,
- 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 45, 99,111,108,111,114, 46,114, 44, 32, 99,111,108,111,114, 46,103, 44, 32, 99,
-111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40,
- 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,
-100,101, 32, 41, 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59,
- 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104,
-101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101,
-114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116,
-114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10, 9,
-109, 97,116, 51, 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10, 9,109, 51,
- 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,
-120,121,122, 59, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,
-109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44,
- 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109,
- 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,
-109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,
-114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10,
- 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
-101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9,
- 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,
-105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10, 9,109, 97,
-116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,
-109, 86,105,101,119, 73,110,118, 41, 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,
-119, 50,111, 98,106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,
-118, 83,105,103,109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,
-112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,
-102, 95,110,111,114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,
-115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40,
- 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118,
- 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,
+111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,
+101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102, 97,
+ 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 13, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45,
+ 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49,
+ 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
+108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,
+109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109,
+ 41, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102,
+ 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,
+109,116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111,
+ 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
+103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102,
+ 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,
+103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 13, 10, 9,105,110, 99,
+111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13,
+ 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,
+108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,
+116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61,
+ 32, 48, 46, 48, 41, 13, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102,
+ 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110, 99,
+111,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,
+100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101,
+120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13,
+ 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97,
+ 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,
+109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,
+102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97,
+ 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,
+116,101,120, 99,111,108, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108,
+ 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 13, 10,125, 13,
+ 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,
+117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123,
+ 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115,
+ 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102,108,111, 97,116, 32, 99,111,
+108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,
+111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,
+116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,
+112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48,
+ 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112,
+ 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 13, 10,123,
+ 13, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111,
+ 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 13, 10,123, 13, 10, 9,111,
+117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,
+101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 13, 10,123, 13, 10, 9,104, 97,114, 32, 42, 61, 32, 49,
+ 50, 56, 46, 48, 59, 13, 10, 13, 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61,
+ 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,
+104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108,
+ 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 13, 10,123, 13, 10,
+ 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,
+ 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,
+104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108,
+ 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 13, 10,125, 13, 10, 13, 10,118,
+111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 13, 10,123, 13, 10, 9,105,110,116,101,110,115,105,116,121, 32,
+ 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98,
+ 46,114,103, 98, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,
+101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+118, 97,108,117,101, 41, 13, 10,123, 13, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118,
+ 97,108,117,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116,
+ 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 13, 10,123,
+ 13, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,
+103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,
+120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,
+108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,
+110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 13, 10,123,
+ 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 13, 10, 9,111,117,116,
+105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 13, 10,
+ 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 13, 10,125, 13, 10,
+ 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,
+101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,
+101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 13, 10,123, 13, 10, 9,102,108,111,
+ 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 13, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52,
+ 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 13, 10, 9,111,117,116,115,
+116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,
+100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,
+101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 13, 10,123, 13, 10,
+ 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 13, 10,125, 13, 10, 13, 10,118,
+111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111,
+ 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 13,
+ 10,123, 13, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 13, 10,125, 13, 10,
+ 13, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,118,101, 99, 32, 61, 32,
+118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41,
+ 44, 32,118,101, 99, 46,122, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,
+118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 13, 10,123, 13, 10,
+ 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121,
+ 41, 59, 13, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,
+120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,
+109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 13, 10,123, 13, 10, 9, 47, 47, 32, 84,104,101,
+ 32,105,110,118,101,114,116, 32,111,102, 32,116,104,101, 32,114,101,100, 32, 99,104, 97,110,110,101,108, 32,105,115, 32,116,111,
+ 32,109, 97,107,101, 13, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,109, 97,112, 32, 99,111,109,112,108,105,
+ 97,110,116, 32,119,105,116,104, 32,116,104,101, 32,111,117,116,115,105,100,101, 32,119,111,114,108,100, 46, 13, 10, 9, 47, 47,
+ 32, 73,116, 32,110,101,101,100,115, 32,116,111, 32, 98,101, 32,100,111,110,101, 32, 98,101, 99, 97,117,115,101, 32,105,110, 32,
+ 66,108,101,110,100,101,114, 13, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,117,115,101,100, 32,112,111,105,
+110,116,115, 32,105,110,119, 97,114,100, 46, 13, 10, 9, 47, 47, 32, 83,104,111,117,108,100, 32,116,104,105,115, 32,101,118,101,
+114, 32, 99,104, 97,110,103,101, 32,116,104,105,115, 32,110,101,103, 97,116,101, 32,109,117,115,116, 32, 98,101, 32,114,101,109,
+111,118,101,100, 46, 13, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50,
+ 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48,
+ 42, 40,118,101, 99, 51, 40, 45, 99,111,108,111,114, 46,114, 44, 32, 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114, 46,
+ 98, 41, 32, 45, 32,118,101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 13, 10,125, 13, 10,
+ 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, 32,118,
+101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101,
+ 32, 41, 13, 10,123, 13, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 13, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78,
+ 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,
+ 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101,
+ 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120,
+ 52, 32,109, 97,116,114,105,120, 32, 42, 47, 13, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109,
+ 52, 41, 13, 10,123, 13, 10, 9,109, 97,116, 51, 32,109, 51, 59, 13, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93,
+ 46,120,121,122, 59, 13, 10, 9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 13, 10, 9,109, 51, 91,
+ 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 13, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 13, 10,125, 13,
+ 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40,
+ 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 13,
+ 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119,
+ 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 13, 10,
+ 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110,
+ 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,
+108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99,
+ 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51,
+ 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,
+101,116, 32, 41, 32, 13, 10,123, 13, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97,
+116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 13, 10, 9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98,
+106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,109, 86,105,101,119, 73,110,118, 41, 59,
+ 13, 10, 9, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,
+100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84,
+ 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 13,
+ 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111,114,109,
+ 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 13, 10, 13, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,
+118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 13, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78,
+ 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 13, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,
+103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 13, 10, 9, 13, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,
109, 32,118, 78, 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,
-110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82,
- 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42,
- 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10,
- 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32,
- 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99,
- 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,
-100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77,
- 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116,
- 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101,
- 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102,
- 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44,
- 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,
-117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9,
- 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,
- 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,
-105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,
-118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99,
- 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,
-105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10,
- 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84,
- 44, 32,118, 78, 32, 41, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,
-115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110,
- 40, 32,100,111,116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,
-102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,
-117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,
-114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
-101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95, 98,117,109,112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,
-112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,
-102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78,
- 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,
-118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,
-117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,
-118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59,
- 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32,
- 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109,
- 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,
-108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78,
- 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32,
- 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10,
- 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59,
- 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,
-116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,
-118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,
-118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44,
- 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,
-115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108,
- 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,
-120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108,
- 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,
- 10, 9,102,108,111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,
-101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98,
-116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32,
- 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108,
- 41, 44, 32, 72,117,108, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114,
- 32, 45, 32, 72,108,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32,
- 72,108,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101,
- 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104,
- 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116,
- 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,
-118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101,
- 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99,
- 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,
-120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114,
- 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99,
- 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59,
- 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,
-120, 68,121, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9,
-114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99,
- 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,
- 41, 44, 32, 72,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97,
- 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50,
- 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,
-116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61,
- 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,
-108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,
-112, 95,100,101,114,105,118, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,
-109, 97, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108,
-111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41,
- 32, 10,123, 10, 9,102,108,111, 97,116, 32,115, 32, 61, 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116,
-104,105,115, 32,105,102, 32,102,108,105,112,112,101,100, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,
-101, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10,
- 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, 10,
- 9, 47, 47, 32,116,104,105,115, 32,118, 97,114,105, 97,110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116,
-105,118,101, 32,109, 97,112, 32,105,115, 32,100,101,115, 99,114,105, 98,101,100, 32,104,101,114,101, 10, 9, 47, 47, 32,104,116,
-116,112, 58, 47, 47,109,109,105,107,107,101,108,115,101,110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50,
- 48, 49, 49, 47, 48, 55, 47,100,101,114,105,118, 97,116,105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 10, 9,118,101, 99,
- 50, 32,100,105,109, 32, 61, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 10, 9,118,101, 99,
- 50, 32,100, 66,100,117,118, 32, 61, 32,104, 83, 99, 97,108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114,
-101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 10, 9, 10, 9,100,
- 66,115, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121,
- 42, 84,101,120, 68,120, 46,121, 59, 10, 9,100, 66,116, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121, 46,120,
- 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,121, 46,121, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116,
- 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,
-118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,
-101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,
-100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,
-103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118,
- 82, 50, 32, 41, 59, 10, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,
-118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,
-109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
-120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,
-116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82,
- 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,
-116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44,
- 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101,
- 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100,
- 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,
-120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,
-111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102,
- 68,101,116, 41, 32, 42, 32, 40, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,
-103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,
-101,120, 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-100, 66,116, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120,
- 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9,
- 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114,
- 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,
- 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,
-101, 95,116,101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51,
- 40, 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101,
- 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,
-120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,
-118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109, 97,
-108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,116,
-101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,109,
- 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111,117,
-116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, 32,
-110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111,114,
-109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,
-111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32,
-110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,
-111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42,
- 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,
-118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101,
- 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,
-125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101,
- 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44,
+110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 13, 10, 9,118,
+ 82, 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 13, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50,
+ 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 13, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,
+106, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102,
+ 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61,
+ 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,
+117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120,
+ 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,
+114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9,
+ 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99,
+ 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,
+ 97, 99, 99, 95,111,117,116, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82,
+ 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32,
+ 41, 32, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,
+102, 95,112,111,115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,
+115,117,114,102, 95,112,111,115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,
+109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,
+114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 13, 10, 9, 13, 10, 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,
+105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59, 13, 10, 9,118,
+ 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109,
+ 97, 83, 32, 41, 32, 41, 59, 13, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,103,109,
+ 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,
+101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97,
+ 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,
+116,117,100,101, 95,105,110, 41, 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61,
+ 32,102, 77, 97,103,110,105,116,117,100,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,
+112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44,
+ 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,102,108,111,
+ 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99,
+ 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116,
+ 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 13, 10,123, 13, 10,
+ 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41,
+ 59, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,
+115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,
+111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,
+114,109, 97,108, 32, 42, 47, 13, 10, 9, 13, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97,
+ 84, 44, 32,118, 78, 32, 41, 59, 13, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,
+109, 97, 83, 32, 41, 32, 59, 13, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,
+118, 82, 49, 32, 41, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97,
+ 98,115, 40,102, 68,101,116, 41, 59, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110,
+ 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,
+105,110, 41, 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,
+110,105,116,117,100,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112,
+ 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,
+111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32,
+ 41, 32, 13, 10,123, 13, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 13, 10, 9,
+118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,
+111, 46,120,121, 41, 32, 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43,
+ 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32, 72,108,108,
+ 44, 72,108,114, 44, 72,117,108, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,
+109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,
+116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 13, 10, 9,114,103, 98,116,
+111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41,
+ 59, 13, 10, 9, 13, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108,
+ 41, 59, 13, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59,
+ 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51,
+ 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99,
+ 97,108,101, 44, 32, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,
+102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 13, 10,123, 13, 10,
+ 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9,
+118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 13, 10,
+ 9,118,101, 99, 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,108,
+ 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 13, 10, 9,118,101,
+ 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32,
+ 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32,
+ 84,101,120, 68,121, 32, 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,
+ 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,
+114, 44, 72,100, 44, 72,117, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
+ 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,
+101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 32, 41, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,
+116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 13, 10, 9,114,103, 98,
+116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59,
+ 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44,
+ 32, 72,117, 32, 41, 59, 13, 10, 9, 13, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45,
+ 32, 72,108, 41, 59, 13, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,100,101,114,105,118, 40, 32,118,101,
+ 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,105,
+109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44,
+ 32, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,
+116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 13, 10,123, 13, 10, 9,102,108,111,
+ 97,116, 32,115, 32, 61, 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116,104,105,115, 32,105,102, 32,102,
+108,105,112,112,101,100, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101, 13, 10, 9,118,101, 99, 50,
+ 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9,118,101, 99, 50, 32,
+ 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9, 13, 10, 9, 47, 47, 32,
+116,104,105,115, 32,118, 97,114,105, 97,110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116,105,118,101, 32,
+109, 97,112, 32,105,115, 32,100,101,115, 99,114,105, 98,101,100, 32,104,101,114,101, 13, 10, 9, 47, 47, 32,104,116,116,112, 58,
+ 47, 47,109,109,105,107,107,101,108,115,101,110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50, 48, 49, 49,
+ 47, 48, 55, 47,100,101,114,105,118, 97,116,105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 13, 10, 9,118,101, 99, 50, 32,
+100,105,109, 32, 61, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 13, 10, 9,118,101, 99, 50,
+ 32,100, 66,100,117,118, 32, 61, 32,104, 83, 99, 97,108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114,101,
+ 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 13, 10, 9, 13, 10, 9,
+100, 66,115, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,
+121, 42, 84,101,120, 68,120, 46,121, 59, 13, 10, 9,100, 66,116, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121,
+ 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,121, 46,121, 59, 13, 10,125, 13, 10, 13, 10,118,111,
+105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,
+102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,
+118,101, 99, 51, 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 32,
+ 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,
+114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,
+114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43,
+ 32,100, 66,116, 32, 42, 32,118, 82, 50, 32, 41, 59, 13, 10, 9, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118,
+ 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 13, 10, 9,112,101,114,116,117,114, 98,101,100,
+ 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 13,
+ 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112,
+ 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,
+116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 13, 10, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,
+101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,
+120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10,
+ 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 13, 10,123, 13, 10, 9,118,101,
+ 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9,118,101, 99,
+ 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 13, 10, 9,118,101,
+ 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32, 13, 10,
+ 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,
+105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,120, 46,121, 41, 32, 41, 32,
+ 42, 32,118, 82, 49, 32, 43, 32, 13, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,116, 32, 47, 32,108,101,110,
+103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,
+101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 13, 10, 9, 9, 9, 9, 13, 10, 9,118, 78, 97, 99, 99,
+ 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 13, 10, 9,112,
+101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99,
+ 95,111,117,116, 32, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,
+101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,
+117,116,110,111,114,109, 97,108, 41, 13, 10,123, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40,
+ 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59,
+ 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,
+118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,
+116,101,120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 13, 10,
+123, 13, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,
+111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 13, 10, 13, 10, 9,111,117,116,110,111,114,109,
+ 97,108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,
+101,120,110,111,114,109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,
+108, 59, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,
+114,109, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,
+109, 97,108, 40,102,108,111, 97,116, 32,110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,
+101, 99, 51, 32,110,101,119,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
+108, 41, 13, 10,123, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97,
+ 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32,110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 13, 10, 9,
+111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41,
+ 59, 13, 10,125, 13, 10, 13, 10, 47, 42, 42, 42, 42, 42, 42, 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 47, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,117,110,
+ 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44,
32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102,
- 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32, 61,
- 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41,
- 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102,
- 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44,
- 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,
-123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32,
- 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110,
-118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,
-115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97,
- 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100,105,
-115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101,114,
-115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108,111,
- 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,
-115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97,109,
-112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,
-100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105,115,
-105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43,
- 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,
-108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112,
-108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,116,
-117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 41, 46,120,
- 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,101,114,101,
- 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,102,108,111,
- 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99,
- 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, 59, 10, 10,
- 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, 46, 48, 41,
- 47,108, 97,109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,
-116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,109, 97,116,
- 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,
-110,112,114, 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, 32, 48, 46,
- 48, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, 42,118,101,
- 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, 97,
-120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,111,
-116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,114,
-116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, 32, 61, 32,
- 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,
-116, 95, 99,105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,118,
- 44, 32,108, 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,
-105,116,121, 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,111,
-116, 98,108, 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116,
- 32, 61, 32,115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, 9, 9,111,
-117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 32,
- 61, 32,105,110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, 47, 10, 9,
- 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, 32,115,109,
-111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, 10, 10, 9,
- 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,125, 10,125,
- 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, 99,108, 97,109,112, 40,102,108,111,
- 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99,
- 41, 10,123, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, 48,
- 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
- 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 10,123, 10,
- 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,112,
-104,105, 99, 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,
-114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41,
- 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, 97,
-110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,111,
-115,115, 40,108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,115,
- 40, 99, 44, 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,111,
-114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,118,
-101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, 32, 61, 32,
-100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,110,111,
- 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48,
- 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, 97,116, 32,
-105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,105,
-110,112, 32, 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,
-114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, 41,
- 10,123, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, 32,114, 97,
-100, 91, 52, 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101,
- 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,111,
-114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91,
- 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, 41,
- 59, 10, 9,118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91,
- 51, 93, 46,120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,
-115, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,109,
- 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9, 99,
- 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,101,
- 99, 91, 51, 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,
-118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,111,
-115, 40,100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 49, 93, 32,
- 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,114, 97,
+ 97, 99, 41, 13, 10,123, 13, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101, 99, 59, 13, 10, 9,100,105,115,116, 32, 61, 32,
+ 49, 46, 48, 59, 13, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100,
+ 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,
+118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13,
+ 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 13, 10, 9,100,105,115,116, 32, 61, 32,108,101,110,
+103,116,104, 40,108,118, 41, 59, 13, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 13, 10,
+ 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,
+102, 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,
+ 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41,
+ 13, 10,123, 13, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,
+115,116, 32, 43, 32,100,105,115,116, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,
+111,102,102, 95,105,110,118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,
+111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13,
+ 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43,
+ 32,100,105,115,116, 42,100,105,115,116, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,
+108,111,102,102, 95,115,108,105,100,101,114,115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111,
+ 97,116, 32,108,100, 49, 44, 32,102,108,111, 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,108, 97,109,
+112,100,105,115,116,107,119, 32, 61, 32,108, 97,109,112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 13, 10, 13, 10,
+ 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,
+108,100, 49, 42,100,105,115,116, 41, 59, 13, 10, 9,118,105,115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,
+107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43, 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59,
+ 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95, 99,117,114,118,101, 40,102,
+108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,
+112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99,
+ 41, 13, 10,123, 13, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,
+109, 97,112, 44, 32,118,101, 99, 50, 40,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 44, 32, 48, 46, 48, 41, 41, 46,120,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,
+101,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,
+102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,
+102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,
+115,116, 59, 13, 10, 13, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,
+116, 44, 32, 48, 46, 48, 41, 47,108, 97,109,112,100,105,115,116, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,
+112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,
+109,112,118,101, 99, 44, 32,109, 97,116, 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 13, 10,123, 13, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108,
+ 97,109,112,118,101, 99, 41, 32, 62, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61,
+ 32, 40,108, 97,109,112,105,109, 97,116, 42,118,101, 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 13, 10,
+ 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, 97,120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,
+116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,111,116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 13, 10, 13, 10,
+ 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,114,116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 13, 10, 9,
+125, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110,112,114, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,
+105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,116, 95, 99,105,114, 99,108,101, 40,118,
+101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+105,110,112,114, 41, 13, 10,123, 13, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101,
+ 99, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,
+112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,111,116, 98,108, 44, 32,
+102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,116, 32, 61, 32,
+115,112,111,116,115,105, 59, 13, 10, 13, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 13, 10, 9, 9,111,
+117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9,
+ 9,116, 32, 61, 32,105,110,112,114, 32, 45, 32,116, 59, 13, 10, 13, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97,
+ 32, 42, 47, 13, 10, 9, 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 13, 10, 9, 9, 9,105,110,112,
+114, 32, 42, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116,
+ 98,108, 41, 59, 13, 10, 13, 10, 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,
+110,112,114, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,
+105,116,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61,
+ 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, 48, 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 13, 10,123, 13, 10, 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,
+101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,112,104,105, 99, 32, 42, 47, 13, 10, 9,118,105,101,
+119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61,
+ 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44,
+ 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, 97,
+110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,118,110, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,111,115,115, 40,108,118, 44,
+ 32,116, 97,110,103, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,115, 40, 99, 44, 32,116,
+ 97,110,103, 41, 59, 13, 10, 13, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,111,114, 41, 59,
+ 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,118,
+101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 13, 10,123, 13, 10, 9,105,110,112, 32,
+ 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
+105,115, 95,110,111, 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10,
+ 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,
+101,109,105, 40,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13,
+ 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,105,110,112, 32, 43, 32, 48, 46, 53, 59, 13, 10,125, 13, 10, 13, 10,102,108,111, 97,
+116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101,
+ 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93,
+ 44, 32, 99, 91, 52, 93, 59, 13, 10, 9,102,108,111, 97,116, 32,114, 97,100, 91, 52, 93, 44, 32,102, 97, 99, 59, 13, 10, 9, 13,
+ 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48,
+ 93, 46,120,121,122, 41, 59, 13, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32,
+ 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 13, 10, 9,118,101, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,
+108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, 41, 59, 13, 10, 9,118,101, 99, 91, 51, 93,
+ 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 51, 93, 46,120,121,122, 41, 59, 13,
+ 10, 13, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 48,
+ 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 13, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,
+ 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 13, 10, 9, 99, 91, 50, 93, 32, 61,
+ 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41,
+ 41, 59, 13, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91,
+ 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 13, 10, 13, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,111,115, 40,
+100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 13, 10, 9,114, 97,100, 91, 49, 93, 32, 61,
+ 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 13, 10, 9,114, 97,
100, 91, 50, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, 41,
- 59, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99,
- 91, 48, 93, 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91,
- 48, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 49, 93, 41,
- 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, 59, 10, 9,
-102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, 9,114,101,
-116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, 51, 32,108,
- 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,109, 97,
-116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,116, 32,107,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,111,
-115,105,116,105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59,
- 10, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,123,
- 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116,
- 32,105,110,116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, 44,
- 32, 99,111, 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,114,
-101, 97,115,105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,
-102,117,115,101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110,
- 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,
-122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110,
- 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,
-110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,116,
- 40,110, 44, 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,
-115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123,
- 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,
-118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,
-116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,
- 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,116, 95, 66,
- 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, 9,118,101,
- 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, 59,
- 10, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,101,
-119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, 9,105,102,
- 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, 59,
- 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,
- 97, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, 10, 10, 9,
- 9,102,108,111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,
-117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 10, 9,
- 9,102,108,111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40,
- 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, 42, 61, 32,
- 48, 46, 57, 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,105,
-110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,
-101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,
-100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,
-116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, 59, 10, 9,
-101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,
-124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,
-101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,
-116,104, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,110,110, 97,
-101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,
-111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,
-102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,
-108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41,
- 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 10, 9,
- 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,100,
- 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, 61, 32,110,
-108, 42,112,111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46,
- 48, 41, 59, 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, 51,
- 32,118,105,101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,116, 32,102,
-102, 97, 99, 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, 61, 32, 49,
- 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, 44, 32,118,
-110, 41, 59, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, 10, 9, 9,
-101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, 43, 32, 40,
- 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, 40,116, 50,
- 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, 50, 62, 49,
- 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, 50,
- 59, 10, 9,125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95,100,105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,
-108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,102,114,101,
-115,110,101,108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, 60,
- 49, 46, 48, 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46,
- 48, 44, 32,105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, 10,118,111,
-105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,
-118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,105, 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,105, 32, 61,
- 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, 42,101,108,
-115,101, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,
- 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,118,110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,108,
- 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 41, 10,123, 10, 9,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,108,
- 97,109,112, 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99,
- 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
-104,101,109,105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51,
- 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,102,
-108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,108,118,
- 32, 43, 61, 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, 10,
- 9,116, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, 48,
- 46, 53, 59, 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, 97,
-114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118,101,
- 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61,
- 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61,
- 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32,
- 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
- 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,
-101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101,
- 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,
-108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,105,102, 40,
-110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10,
- 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,
-118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, 97,
-114,100, 41, 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, 99,102, 97,
- 99, 32, 61, 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,112,
-101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116,
- 32,114,101,102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, 48,
- 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102,
- 40,115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32,
- 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,111,119,101,
-114, 60, 49, 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, 49, 46, 48,
- 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,
-101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,104, 32, 61,
- 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,
-100,111,116, 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, 9,115,
-112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,102,108,
-111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 9,
- 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, 40,110,108,
- 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,
- 9, 9,125, 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120,
- 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, 32,
- 61, 32, 49, 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, 41,
- 47,118,104, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,118,
-104, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,102, 40, 97,
- 32, 60, 32, 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105,
-102, 40, 98, 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,101,108,115,
-101, 32,105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, 9, 9, 9,
+ 59, 13, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101,
+ 99, 91, 48, 93, 41, 41, 59, 13, 10, 13, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44,
+ 32, 99, 91, 48, 93, 41, 59, 13, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99,
+ 91, 49, 93, 41, 59, 13, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50,
+ 93, 41, 59, 13, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41,
+ 59, 13, 10, 13, 10, 9,114,101,116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13, 10,
+ 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,
+105,111,110, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,
+118,101, 99, 51, 32,118,110, 44, 32,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,
+122,101, 44, 32,102,108,111, 97,116, 32,107, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 13, 10,123, 13, 10,
+ 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,111,115,105,116,105,111,110, 59, 13, 10, 9,118,101, 99, 51, 32,118,101, 99, 32,
+ 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 13, 10, 13, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108,
+ 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 13, 10,
+ 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,102,108,111, 97,116, 32,105,110,116,101,110,115, 32, 61, 32, 97,114,
+101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, 44, 32, 99,111, 44, 32,118,110, 41, 59, 13, 10, 13,
+ 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,114,101, 97,115,105,122,101, 44, 32,107, 41,
+ 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,111,
+114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51,
+ 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118,
+ 32, 43, 32,108, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104,
+ 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44,
+ 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,116, 40,
+110, 44, 32,108, 41, 59, 13, 10, 13, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9,
+ 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46,
+ 48, 41, 32,123, 13, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10,
+ 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41,
+ 59, 13, 10, 9, 9,102,108,111, 97,116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59,
+ 13, 10, 9, 9,102,108,111, 97,116, 32, 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 13, 10, 13, 10,
+ 9, 9,118,101, 99, 51, 32, 76,105,116, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,
+108,110,108, 42,110, 41, 59, 13, 10, 9, 9,118,101, 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,
+122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, 59, 13, 10, 13, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120,
+ 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,101,119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 13, 10, 9, 9,
+102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 13, 10, 13, 10, 9, 9,105,102, 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119,
+ 95, 65, 41, 32,123, 13, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, 59, 13, 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,
+119, 95, 65, 59, 13, 10, 9, 9,125, 13, 10, 9, 9,101,108,115,101, 32,123, 13, 10, 9, 9, 9, 97, 32, 61, 32, 86,105,101,119,
+ 95, 65, 59, 13, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 13, 10, 9, 9,125, 13, 10, 13, 10, 9, 9,102,108,111,
+ 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41,
+ 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 13, 10, 9, 9,102,108,
+111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, 40,114,111,
+117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 13, 10, 13, 10, 9, 9, 98, 32, 42, 61, 32, 48,
+ 46, 57, 53, 59, 13, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,105,
+110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,
+115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,
+108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,
+111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,114,
+115,108,116, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 13, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97,
+ 99,111,115, 40,114,115,108,116, 41, 59, 13, 10, 13, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115,
+ 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,
+116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61,
+ 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,
+115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101,
+ 95,100,105,102,102,117,115,101, 95,109,105,110,110, 97,101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51,
+ 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 13, 10,
+ 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,102,108,111, 97,
+116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 13, 10, 9,
+ 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 13, 10, 9, 9, 9,105,115, 32, 61, 32,110,108,
+ 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,100, 97,114,107,110,101,115,115, 32, 45,
+ 32, 49, 46, 48, 41, 59, 13, 10, 9, 9,101,108,115,101, 13, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40, 49,
+ 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 13, 10, 9,125,
+ 13, 10,125, 13, 10, 13, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, 51, 32,118,105,
+101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 13, 10, 9,102,108,111, 97,116, 32,102,
+102, 97, 99, 59, 13, 10, 13, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,102,102, 97, 99, 32,
+ 61, 32, 49, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,
+105,101,119, 44, 32,118,110, 41, 59, 13, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48,
+ 43,116, 49, 59, 13, 10, 9, 9,101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 13, 10, 13, 10, 9, 9,116, 50,
+ 61, 32,103,114, 97,100, 32, 43, 32, 40, 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41,
+ 59, 13, 10, 13, 10, 9, 9,105,102, 40,116, 50, 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,
+ 9,101,108,115,101, 32,105,102, 40,116, 50, 62, 49, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9,
+101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, 50, 59, 13, 10, 9,125, 13, 10, 13, 10, 9,114,101,116,117,114,110, 32,102,
+102, 97, 99, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,102,114,
+101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,
+119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,105,115, 32, 61, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,108,
+118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,
+104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,105,115, 41, 13, 10,123, 13, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, 60, 49, 46, 48, 41, 13,
+ 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,105,
+115, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 13, 10,125, 13, 10, 13, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116,
+ 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,105, 41, 13, 10,123, 13, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 13, 10, 9, 9,111,117,
+116,105, 32, 61, 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 13, 10,
+ 9, 47, 42,101,108,115,101, 13, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 13, 10,125, 13, 10, 13, 10,118,111,105,
+100, 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 13, 10,123, 13, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 13, 10,
+125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,
+108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32, 99,111,108, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,105,102, 40,105, 32, 62, 32, 48, 46, 48,
+ 41, 13, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,108, 97,109,112, 99,111,108, 42, 99,111,108, 59, 13, 10, 9,101,
+108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48,
+ 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,104,101,109,105, 95,115,112,101, 99, 40,
+118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111,
+ 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102,
+ 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 13, 10,123, 13, 10, 9,108,118, 32, 43, 61, 32,118,105,101,119,
+ 59, 13, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 13, 10, 13, 10, 9,116, 32, 61, 32,
+100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 13, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, 48, 46, 53, 59, 13,
+ 10, 13, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, 97,114,100,
+ 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118,
+101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,
+100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,
+104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,114,115,
+108,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 13, 10, 9,115,112,
+101, 99,102, 97, 99, 32, 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 13, 10,125, 13, 10, 13, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,
+118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,
+109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,
+110, 44, 32,104, 41, 59, 13, 10, 13, 10, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,115,112,101,
+ 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,102,108,111, 97,
+116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9, 9,102,
+108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, 97,114,100, 41, 59, 13, 10, 13, 10, 9, 9,105, 32, 61,
+ 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 13, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,105, 59, 13, 10, 9,125,
+ 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,112,101, 99, 40,118,101, 99,
+ 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,101,102,114, 97,
+ 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,
+112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, 48, 41, 32,123, 13,
+ 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,105,102, 40,
+115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,115,112,101, 99,102, 97, 99, 32,
+ 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,
+111,119,101,114, 60, 49, 48, 48, 46, 48, 41, 13, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116,
+ 40, 49, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 13, 10, 9, 9,101,108,115,101, 13, 10, 9, 9, 9,115,112,
+101, 99, 95,112,111,119,101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 13, 10, 13, 10, 9, 9,
+118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 13, 10, 9, 9,102,108,
+111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 13, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48,
+ 46, 48, 41, 32,123, 13, 10, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9, 9,125, 13, 10, 9,
+ 9,101,108,115,101, 32,123, 13, 10, 9, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110,
+ 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 13, 10, 9, 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,
+110, 44, 32,108, 41, 59, 13, 10, 9, 9, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 13, 10, 9, 9, 9,
+ 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9, 9, 9,125, 13, 10, 9, 9, 9,101,108,115,101, 32,123,
+ 13, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32,
+ 48, 46, 48, 49, 41, 59, 13, 10, 13, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9,
+ 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, 41, 47,118,104, 59, 13, 10, 9, 9, 9,
+ 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,118,104, 59, 13, 10, 13, 10, 9, 9,
+ 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 13, 10, 13, 10, 9, 9, 9, 9,105,102, 40, 97, 32, 60, 32, 98,
+ 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 13, 10, 9, 9, 9, 9,101,108,115,101, 32,105,102, 40, 98,
+ 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 13, 10, 9, 9, 9, 9,101,108,115,101, 32,
+105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 13, 10, 13, 10, 9, 9, 9,
9,102,108,111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,102,114, 97,
- 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61, 32,
- 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41, 41,
- 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104, 42,
- 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41,
- 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116,
- 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,
-109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,103, 41, 47,
- 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, 44, 32, 48,
- 46, 48, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119,
- 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51,
- 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99,
- 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10,
- 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, 49,
- 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46,
- 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, 44,
- 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,115,
- 40,110,104, 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, 48,
- 46, 48, 48, 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, 48,
- 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,114,
- 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, 40,
-115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,111,
-110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,
-108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,
-122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, 32,
-110, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,105,
-102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,
-105,102, 40, 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,
-109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,
-114,115,108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,
-116,104, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99,
- 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, 99,102, 97,
- 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,112, 59, 10,
-125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, 97,100,102,
- 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102,
-108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,116, 32,
- 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, 99, 59, 10,
-125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,116, 44, 32,
-118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 99,111,108, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116, 42,108, 97,109,112, 99,
-111,108, 42,115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,118,101,
+ 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 13, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61,
+ 32, 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41,
+ 41, 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104,
+ 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48,
+ 41, 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 13, 10, 9, 9, 9, 9,102,108,111,
+ 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 13, 10, 13, 10, 9, 9, 9, 9,115,112,101, 99,102, 97,
+ 99, 32, 61, 32,109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,
+110,103, 41, 47, 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41,
+ 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9, 9, 9,125, 13, 10, 9, 9,125, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,
+105,100, 32,115,104, 97,100,101, 95,119, 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101,
+ 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,115,112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,
+105,122,101, 40,108, 32, 43, 32,118, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116,
+ 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120,
+ 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61,
+ 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,
+ 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,115, 40,110,104, 41, 41, 59, 13, 10, 9,102,108,111, 97,116, 32, 97,
+108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 13, 10, 9,115,112,101, 99,
+102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, 48, 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,
+108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,114, 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,
+101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, 40,115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41,
+ 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,111,110, 95,115,112,101, 99, 40,118,101, 99,
+ 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44,
+ 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97,
+ 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118,
+ 41, 59, 13, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, 32,110, 41, 59, 13, 10, 9,102,
+108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 13, 10, 13, 10, 9,105,102, 40, 97,110,
+103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40,
+ 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111,
+116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,114,115,
+108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104,
+ 41, 59, 13, 10, 13, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,
+100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,
+102, 97, 99, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101,
+ 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,
+105,110,112, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111,
+ 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,
+115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+116, 41, 13, 10,123, 13, 10, 9,116, 32, 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99,
+ 42,115,112,101, 99,102, 97, 99, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,
+112,101, 99, 40,102,108,111, 97,116, 32,116, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,
+115,112,101, 99, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32,116, 42,108, 97,109,112, 99,111,108, 42,115,112,101, 99, 99,111,108, 59, 13, 10,125, 13, 10, 13,
+ 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,
+111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,
+100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99,
+ 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,
+116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 13, 10,125, 13, 10, 13, 10,118,111,
+105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10,
+ 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40, 99,111,108, 50, 44, 32,118,101, 99, 52, 40,
+ 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100,
+ 32,115,104, 97,100,101, 95,109, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101,
99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
- 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 10,125, 10,
- 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,
- 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
- 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125,
- 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,
-108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
-123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40, 99,111,108, 50, 44, 32,118,101, 99,
- 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-115,104, 97,100,101, 95,109, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99,
- 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109, 97,120, 40, 99,111,108, 49, 42, 99,
-111,108, 50, 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,
-111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
-108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, 10, 10,
-118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32,
- 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118,
- 97,108,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 10,
-125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,
-118,101, 99, 52, 32,111, 98, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44,
- 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101,
- 99, 51, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,
-117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46,
- 53, 56, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
- 95,111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,
-102, 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
-115,104, 97,100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,103,
-121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
- 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,100,102,
- 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32,111,117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, 32,118,
-101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,116, 32,
-115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,101, 99,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, 32, 61,
- 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46,
- 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32,
-114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,
-109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119,
- 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,
-116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,116, 32,
- 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104,
- 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 47,
- 47,102,108,111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104,
- 97,100,111,119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99,
-111, 46,119, 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104,
- 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
- 95,101,120,112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,108,105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 44, 32,111,117,116, 32,118,101, 99, 51,
- 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,108,105,110,102, 97, 99, 42, 40, 49, 46, 48,
- 32, 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
-100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,109,105,
-115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,105,115,
-116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
-102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 44, 32,122, 99,111,114, 59, 10, 10, 9,122, 99,111,114, 32,
- 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32,
- 48, 46, 48, 41, 63, 32,108,101,110,103,116,104, 40, 99,111, 41, 58, 32, 45, 99,111, 91, 50, 93, 59, 10, 9, 10, 9,102, 97, 99,
- 32, 61, 32, 99,108, 97,109,112, 40, 40,122, 99,111,114, 45,109,105,115,116,115,116, 97, 41, 47,109,105,115,116,100,105,115,116,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,105,102, 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 48, 46, 48,
- 41, 32,102, 97, 99, 32, 42, 61, 32,102, 97, 99, 59, 10, 9,101,108,115,101, 32,105,102, 40,109,105,115,116,116,121,112,101, 32,
- 61, 61, 32, 49, 46, 48, 41, 59, 10, 9,101,108,115,101, 32,102, 97, 99, 32, 61, 32,115,113,114,116, 40,102, 97, 99, 41, 59, 10,
- 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 45,102, 97, 99, 41, 42, 40, 49, 46, 48, 45,
-109,105,115,105, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119,111,114,108,100, 95,109,105,120, 40,118,
-101, 99, 51, 32,104,111,114, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 99,111,108, 46, 97, 44, 32,
- 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,109,105,120, 40,104,111,
-114, 44, 32, 99,111,108, 46,114,103, 98, 44, 32,102, 97, 99, 41, 44, 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111,112, 97,113,117,101, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52,
- 40, 99,111,108, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,
-112,104, 97, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 99,111,108,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,
-101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 42,111, 98, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,
+ 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109, 97,120, 40, 99,111,108,
+ 49, 42, 99,111,108, 50, 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41,
+ 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,111,117,116, 32,118,101, 99, 52,
+ 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,102, 42, 99,
+111,108, 49, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,118,101, 99, 52, 32, 99,
+111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
+ 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 13, 10,125, 13, 10, 13, 10,
+118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,
+111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,
+100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 99,111,108, 44,
+ 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,
+118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 41, 59, 13,
+ 10,125, 13, 10, 13, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101, 99, 51, 32, 99,111,108,
+111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 13, 10,123, 13, 10, 9,111,117,116,118, 97,
+108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 53, 56, 32, 43,
+ 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
+111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,102,
+ 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,
+104, 97,100,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,
+103,121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,
+104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,
+104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116,100,105,102,102, 41, 13, 10,123, 13, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,
+102,102, 32, 45, 32,118,101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13,
+ 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108,
+ 97,114, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,
+118,101, 99, 52, 32,115,112,101, 99, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 13, 10,123, 13,
+ 10, 9,111,117,116,115,112,101, 99, 32, 61, 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,
+115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,115,116, 95,115,
+104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32,114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,
+111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116,
+ 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 13, 10,123, 13, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32,
+ 48, 46, 48, 41, 32,123, 13, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,
+115,101, 32,123, 13, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 42,
+118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 13, 10, 13, 10, 9, 9, 47, 47,102,108,111, 97,116, 32, 98,105, 97,
+115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104, 97,100,111,119, 98,105, 97,115, 59, 13,
+ 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99,111, 46,119, 59, 13, 10, 13, 10, 9,
+ 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104, 97,100,111,119,109, 97,112,
+ 44, 32, 99,111, 41, 46,120, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,101,120,
+112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32,108,
+105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
+116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,108,105,110,102, 97, 99, 42, 40, 49, 46, 48, 32,
+ 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,
+104, 97,100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,
+109,105,115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,
+105,115,116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 44, 32,122, 99,111,114, 59, 13, 10, 13, 10,
+ 9,122, 99,111,114, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91,
+ 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,108,101,110,103,116,104, 40, 99,111, 41, 58, 32, 45, 99,111, 91, 50, 93, 59, 13,
+ 10, 9, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 40,122, 99,111,114, 45,109,105,115,116,115,116, 97, 41, 47,
+109,105,115,116,100,105,115,116, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,105,102, 40,109,105,115,116,116,121,
+112,101, 32, 61, 61, 32, 48, 46, 48, 41, 32,102, 97, 99, 32, 42, 61, 32,102, 97, 99, 59, 13, 10, 9,101,108,115,101, 32,105,102,
+ 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 49, 46, 48, 41, 59, 13, 10, 9,101,108,115,101, 32,102, 97, 99, 32, 61, 32,
+115,113,114,116, 40,102, 97, 99, 41, 59, 13, 10, 13, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 49,
+ 46, 48, 45,102, 97, 99, 41, 42, 40, 49, 46, 48, 45,109,105,115,105, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,
+104, 97,100,101, 95,119,111,114,108,100, 95,109,105,120, 40,118,101, 99, 51, 32,104,111,114, 44, 32,118,101, 99, 52, 32, 99,111,
+108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102,
+ 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 99,111,108, 46, 97, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,109,105,120, 40,104,111,114, 44, 32, 99,111,108, 46,114,103, 98, 44, 32,102,
+ 97, 99, 41, 44, 32, 99,111,108, 46, 97, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,
+112,104, 97, 95,111,112, 97,113,117,101, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98,
+ 44, 32, 49, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111,
+ 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 99,111,108, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52,
+ 40, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 42,111, 98, 99,111,108, 46, 97, 41, 59, 13, 10,125, 13, 10, 13, 10,
0};
diff --git a/source/blender/imbuf/intern/cineon/cineonlib.c b/source/blender/imbuf/intern/cineon/cineonlib.c
index 922cfcf9629..b4da39ac41e 100644
--- a/source/blender/imbuf/intern/cineon/cineonlib.c
+++ b/source/blender/imbuf/intern/cineon/cineonlib.c
@@ -36,6 +36,9 @@
#include <netinet/in.h> /* htonl() */
#endif
#include <string.h> /* memset */
+
+#include "BLI_utildefines.h"
+
#include "cin_debug_stuff.h"
#include "logmemfile.h"
@@ -288,7 +291,7 @@ initCineonGenericHeader(CineonFile* cineon, CineonGenericHeader* header, const c
}
static void
-dumpCineonGenericHeader(CineonGenericHeader* header) {
+UNUSED_FUNCTION(dumpCineonGenericHeader)(CineonGenericHeader* header) {
dumpCineonFileInfo(&header->fileInfo);
dumpCineonImageInfo(&header->imageInfo);
dumpCineonFormatInfo(&header->formatInfo);
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.h b/source/blender/imbuf/intern/cineon/logImageCore.h
index f05c19c4f47..cbc7cb9d64a 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.h
+++ b/source/blender/imbuf/intern/cineon/logImageCore.h
@@ -38,8 +38,12 @@ extern "C" {
#endif
#include "BLO_sys_types.h" // for intptr_t support
+
+#ifdef _MSC_VER
#undef ntohl
#undef htonl
+#endif
+
typedef int (GetRowFn)(LogImageFile* logImage, unsigned short* row, int lineNum);
typedef int (SetRowFn)(LogImageFile* logImage, const unsigned short* row, int lineNum);
typedef void (CloseFn)(LogImageFile* logImage);
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index 93db8340aac..239903208ec 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -230,6 +230,20 @@ typedef struct bArmatureActuator {
struct Object *subtarget;
} bArmatureActuator;
+typedef struct bSteeringActuator {
+ char pad[5];
+ char flag;
+ short facingaxis;
+ int type; /* 0=seek, 1=flee, 2=path following */
+ float dist;
+ float velocity;
+ float acceleration;
+ float turnspeed;
+ int updateTime;
+ struct Object *target;
+ struct Object *navmesh;
+} bSteeringActuator;
+
typedef struct bActuator {
struct bActuator *next, *prev, *mynew;
short type;
@@ -295,6 +309,7 @@ typedef struct bActuator {
#define ACT_SHAPEACTION 21
#define ACT_STATE 22
#define ACT_ARMATURE 23
+#define ACT_STEERING 24
/* actuator flag */
#define ACT_SHOW 1
@@ -511,6 +526,16 @@ typedef struct bActuator {
#define ACT_CAMERA_X (float)'x'
#define ACT_CAMERA_Y (float)'y'
+/* steeringactuator->type */
+#define ACT_STEERING_SEEK 0
+#define ACT_STEERING_FLEE 1
+#define ACT_STEERING_PATHFOLLOWING 2
+/* steeringactuator->flag */
+#define ACT_STEERING_SELFTERMINATED 1
+#define ACT_STEERING_ENABLEVISUALIZATION 2
+#define ACT_STEERING_AUTOMATICFACING 4
+#define ACT_STEERING_NORMALUP 8
+
#endif
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index cdfcf465c6c..b721dc60e73 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -92,7 +92,8 @@ typedef struct CustomData {
#define CD_ID_MCOL 21
#define CD_TEXTURE_MCOL 22
#define CD_CLOTH_ORCO 23
-#define CD_NUMTYPES 24
+#define CD_RECAST 24
+#define CD_NUMTYPES 25
/* Bits for CustomDataMask */
#define CD_MASK_MVERT (1 << CD_MVERT)
@@ -117,6 +118,7 @@ typedef struct CustomData {
#define CD_MASK_MDISPS (1 << CD_MDISPS)
#define CD_MASK_WEIGHT_MCOL (1 << CD_WEIGHT_MCOL)
#define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO)
+#define CD_MASK_RECAST (1 << CD_RECAST)
/* CustomData.flag */
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index e3510b3a25a..61c4a660992 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -184,6 +184,10 @@ typedef struct PartialVisibility {
unsigned int totface, totedge, totvert, pad;
} PartialVisibility;
+typedef struct MRecast{
+ int i;
+} MRecast;
+
/* mvert->flag (1=SELECT) */
#define ME_SPHERETEST 2
#define ME_VERT_TMP_TAG 4
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 053f3b38168..ed060d58123 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -71,6 +71,10 @@ typedef enum ModifierType {
eModifierType_Solidify,
eModifierType_Screw,
eModifierType_Warp,
+ eModifierType_WeightVGEdit,
+ eModifierType_WeightVGMix,
+ eModifierType_WeightVGProximity,
+ eModifierType_NavMesh,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -675,7 +679,6 @@ typedef struct ShrinkwrapModifierData {
#define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS (1<<2)
#define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL 0 /* projection over normal is used if no axis is selected */
-
typedef struct SimpleDeformModifierData {
ModifierData modifier;
@@ -747,6 +750,10 @@ typedef struct ScrewModifierData {
#define MOD_SCREW_OBJECT_OFFSET (1<<2)
// #define MOD_SCREW_OBJECT_ANGLE (1<<4)
+typedef struct NavMeshModifierData {
+ ModifierData modifier;
+} NavMeshModifierData;
+
typedef struct WarpModifierData {
ModifierData modifier;
@@ -785,4 +792,173 @@ typedef enum {
/* PROP_RANDOM not used */
} WarpModifierFalloff;
+typedef struct WeightVGEditModifierData {
+ ModifierData modifier;
+
+ /* Note: I tried to keep everything logically ordered - provided the
+ * alignment constraints... */
+
+ char defgrp_name[32]; /* Name of vertex group to edit. */
+
+ short edit_flags; /* Using MOD_WVG_EDIT_* flags. */
+ short falloff_type; /* Using MOD_WVG_MAPPING_* defines. */
+ float default_weight; /* Weight for vertices not in vgroup. */
+
+ /* Mapping stuff. */
+ struct CurveMapping *cmap_curve; /* The custom mapping curve! */
+
+ /* The add/remove vertices weight thresholds. */
+ float add_threshold, rem_threshold;
+
+ /* Masking options. */
+ float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
+ /* Name of mask vertex group from which to get weight factors. */
+ char mask_defgrp_name[32];
+
+ /* Texture masking. */
+ int mask_tex_use_channel; /* Which channel to use as weightf. */
+ struct Tex *mask_texture; /* The texture. */
+ struct Object *mask_tex_map_obj; /* Name of the map object. */
+ /* How to map the texture (using MOD_DISP_MAP_* constants). */
+ int mask_tex_mapping;
+ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
+
+ /* Padding... */
+ int pad_i1;
+} WeightVGEditModifierData;
+
+/* WeightVGEdit flags. */
+/* Use parametric mapping. */
+//#define MOD_WVG_EDIT_MAP (1 << 0)
+/* Use curve mapping. */
+//#define MOD_WVG_EDIT_CMAP (1 << 1)
+/* Reverse weights (in the [0.0, 1.0] standard range). */
+//#define MOD_WVG_EDIT_REVERSE_WEIGHTS (1 << 2)
+/* Add vertices with higher weight than threshold to vgroup. */
+#define MOD_WVG_EDIT_ADD2VG (1 << 3)
+/* Remove vertices with lower weight than threshold from vgroup. */
+#define MOD_WVG_EDIT_REMFVG (1 << 4)
+/* Clamp weights. */
+//#define MOD_WVG_EDIT_CLAMP (1 << 5)
+
+typedef struct WeightVGMixModifierData {
+ ModifierData modifier;
+
+ /* XXX Note: I tried to keep everything logically ordered – provided the
+ * alignment constraints... */
+
+ char defgrp_name_a[32]; /* Name of vertex group to modify/weight. */
+ char defgrp_name_b[32]; /* Name of other vertex group to mix in. */
+ float default_weight_a; /* Default weight value for first vgroup. */
+ float default_weight_b; /* Default weight value to mix in. */
+ char mix_mode; /* How second vgroups weights affect first ones */
+ char mix_set; /* What vertices to affect. */
+
+ char pad_c1[6];
+
+ /* Masking options. */
+ float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
+ /* Name of mask vertex group from which to get weight factors. */
+ char mask_defgrp_name[32];
+
+ /* Texture masking. */
+ int mask_tex_use_channel; /* Which channel to use as weightf. */
+ struct Tex *mask_texture; /* The texture. */
+ struct Object *mask_tex_map_obj; /* Name of the map object. */
+ int mask_tex_mapping; /* How to map the texture! */
+ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
+
+ /* Padding... */
+ int pad_i1;
+} WeightVGMixModifierData;
+
+/* How second vgroup's weights affect first ones. */
+#define MOD_WVG_MIX_SET 1 /* Second weights replace weights. */
+#define MOD_WVG_MIX_ADD 2 /* Second weights are added to weights. */
+#define MOD_WVG_MIX_SUB 3 /* Second weights are subtracted from weights. */
+#define MOD_WVG_MIX_MUL 4 /* Second weights are multiplied with weights. */
+#define MOD_WVG_MIX_DIV 5 /* Second weights divide weights. */
+#define MOD_WVG_MIX_DIF 6 /* Difference between second weights and weights. */
+#define MOD_WVG_MIX_AVG 7 /* Average of both weights. */
+
+/* What vertices to affect. */
+#define MOD_WVG_SET_ALL 1 /* Affect all vertices. */
+#define MOD_WVG_SET_A 2 /* Affect only vertices in first vgroup. */
+#define MOD_WVG_SET_B 3 /* Affect only vertices in second vgroup. */
+#define MOD_WVG_SET_OR 4 /* Affect only vertices in one vgroup or the other. */
+#define MOD_WVG_SET_AND 5 /* Affect only vertices in both vgroups. */
+
+typedef struct WeightVGProximityModifierData {
+ ModifierData modifier;
+
+ /* Note: I tried to keep everything logically ordered - provided the
+ * alignment constraints... */
+
+ char defgrp_name[32]; /* Name of vertex group to modify/weight. */
+
+ /* Proximity modes. */
+ int proximity_mode;
+ int proximity_flags;
+
+ /* Target object from which to calculate vertices distances. */
+ struct Object *proximity_ob_target;
+
+ /* Masking options. */
+ float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
+ /* Name of mask vertex group from which to get weight factors. */
+ char mask_defgrp_name[32];
+
+ /* Texture masking. */
+ int mask_tex_use_channel; /* Which channel to use as weightf. */
+ struct Tex *mask_texture; /* The texture. */
+ struct Object *mask_tex_map_obj; /* Name of the map object. */
+ int mask_tex_mapping; /* How to map the texture! */
+ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
+
+ float min_dist, max_dist; /* Distances mapping to 0.0/1.0 weights. */
+
+ /* Put here to avoid breaking existing struct... */
+ short falloff_type; /* Using MOD_WVG_MAPPING_* defines. */
+
+ /* Padding... */
+ short pad_s1;
+} WeightVGProximityModifierData;
+
+/* Modes of proximity weighting. */
+/* Dist from target object to affected object. */
+#define MOD_WVG_PROXIMITY_OBJECT 1 /* source vertex to other location */
+/* Dist from target object to vertex. */
+#define MOD_WVG_PROXIMITY_GEOMETRY 2 /* source vertex to other geometry */
+
+/* Flags options for proximity weighting. */
+/* Use nearest vertices of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
+#define MOD_WVG_PROXIMITY_GEOM_VERTS (1 << 0)
+/* Use nearest edges of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
+#define MOD_WVG_PROXIMITY_GEOM_EDGES (1 << 1)
+/* Use nearest faces of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
+#define MOD_WVG_PROXIMITY_GEOM_FACES (1 << 2)
+
+/* Defines common to all WeightVG modifiers. */
+/* Mapping modes. */
+#define MOD_WVG_MAPPING_NONE 0
+#define MOD_WVG_MAPPING_CURVE 1
+#define MOD_WVG_MAPPING_SHARP 2 /* PROP_SHARP */
+#define MOD_WVG_MAPPING_SMOOTH 3 /* PROP_SMOOTH */
+#define MOD_WVG_MAPPING_ROOT 4 /* PROP_ROOT */
+/* PROP_LIN not used (same as NONE, here...). */
+/* PROP_CONST not used. */
+#define MOD_WVG_MAPPING_SPHERE 7 /* PROP_SPHERE */
+#define MOD_WVG_MAPPING_RANDOM 8 /* PROP_RANDOM */
+#define MOD_WVG_MAPPING_STEP 9 /* Median Step. */
+
+/* Tex channel to be used as mask. */
+#define MOD_WVG_MASK_TEX_USE_INT 1
+#define MOD_WVG_MASK_TEX_USE_RED 2
+#define MOD_WVG_MASK_TEX_USE_GREEN 3
+#define MOD_WVG_MASK_TEX_USE_BLUE 4
+#define MOD_WVG_MASK_TEX_USE_HUE 5
+#define MOD_WVG_MASK_TEX_USE_SAT 6
+#define MOD_WVG_MASK_TEX_USE_VAL 7
+#define MOD_WVG_MASK_TEX_USE_ALPHA 8
+
#endif
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index efaf30b02f6..bac1e3cd8ca 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -38,26 +38,29 @@
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
+struct ID;
struct ListBase;
struct SpaceNode;
struct bNodeLink;
struct bNodeType;
-struct bNodeGroup;
+struct bNodeTreeExec;
struct AnimData;
struct bGPdata;
struct uiBlock;
#define NODE_MAXSTR 32
-
typedef struct bNodeStack {
float vec[4];
- float min, max; /* min/max for values (UI writes it, execute might use it) */
+ float min, max;
void *data;
short hasinput; /* when input has link, tagged before executing */
short hasoutput; /* when output is linked, tagged before executing */
short datatype; /* type of data pointer */
short sockettype; /* type of socket stack comes from, to remap linking different sockets */
+ short is_copy; /* data is a copy of external data (no freeing) */
+ short external; /* data is used by external nodes (no freeing) */
+ short pad[2];
} bNodeStack;
/* ns->datatype, shadetree only */
@@ -68,50 +71,58 @@ typedef struct bNodeSocket {
struct bNodeSocket *next, *prev, *new_sock;
char name[32];
- bNodeStack ns; /* custom data for inputs, only UI writes in this */
+
+ void *storage; /* custom storage */
short type, flag;
short limit; /* max. number of links */
-
- /* stack data info (only during execution!) */
- short stack_type; /* type of stack reference */
- /* XXX only one of stack_ptr or stack_index is used (depending on stack_type).
- * could store the index in the pointer with SET_INT_IN_POINTER (a bit ugly).
- * (union won't work here, not supported by DNA)
- */
- struct bNodeStack *stack_ptr; /* constant input value */
- short stack_index; /* local stack index or external input number */
short pad1;
float locx, locy;
- /* internal data to retrieve relations and groups */
+ void *default_value; /* default input value used for unlinked sockets */
+
+ /* execution data */
+ short stack_index; /* local stack index */
+ short stack_type; /* deprecated, kept for forward compatibility */
+ int pad3;
+ void *cache; /* cached data from execution */
+ /* internal data to retrieve relations and groups */
int own_index; /* group socket identifiers, to find matching pairs after reading files */
- struct bNodeSocket *groupsock;
int to_index; /* XXX deprecated, only used for restoring old group node links */
- int pad2;
+ struct bNodeSocket *groupsock;
- struct bNodeLink *link; /* a link pointer, set in nodeSolveOrder() */
+ struct bNodeLink *link; /* a link pointer, set in ntreeUpdateTree */
+
+ /* DEPRECATED only needed for do_versions */
+ bNodeStack ns; /* custom data for inputs, only UI writes in this */
} bNodeSocket;
/* sock->type */
-#define SOCK_VALUE 0
-#define SOCK_VECTOR 1
-#define SOCK_RGBA 2
+#define SOCK_FLOAT 0
+#define SOCK_VECTOR 1
+#define SOCK_RGBA 2
+#define SOCK_INT 3
+#define SOCK_BOOLEAN 4
+#define SOCK_MESH 5
+#define NUM_SOCKET_TYPES 6 /* must be last! */
+
+/* socket side (input/output) */
+#define SOCK_IN 1
+#define SOCK_OUT 2
/* sock->flag, first bit is select */
- /* hidden is user defined, to hide unused */
+ /* hidden is user defined, to hide unused */
#define SOCK_HIDDEN 2
- /* only used now for groups... */
-#define SOCK_IN_USE 4
- /* unavailable is for dynamic sockets */
+ /* only used now for groups... */
+#define SOCK_IN_USE 4 /* XXX deprecated */
+ /* unavailable is for dynamic sockets */
#define SOCK_UNAVAIL 8
-
-/* sock->stack_type */
-#define SOCK_STACK_LOCAL 1 /* part of the local tree stack */
-#define SOCK_STACK_EXTERN 2 /* use input stack pointer */
-#define SOCK_STACK_CONST 3 /* use pointer to constant input value */
+ /* dynamic socket (can be modified by user) */
+#define SOCK_DYNAMIC 16
+ /* group socket should not be exposed */
+#define SOCK_INTERNAL 32
typedef struct bNodePreview {
unsigned char *rect;
@@ -119,7 +130,6 @@ typedef struct bNodePreview {
int pad;
} bNodePreview;
-
/* limit data in bNode to what we want to see saved? */
typedef struct bNode {
struct bNode *next, *prev, *new_node;
@@ -132,11 +142,14 @@ typedef struct bNode {
short nr; /* number of this node in list, used for UI exec events */
ListBase inputs, outputs;
+ struct bNode *parent; /* parent node */
struct ID *id; /* optional link to libdata */
void *storage; /* custom data, must be struct, for storage in file */
float locx, locy; /* root offset for drawing */
- float width, miniwidth;
+ float width, height; /* node custom width and height */
+ float miniwidth; /* node width if hidden */
+ int pad;
char label[32]; /* custom user-defined label */
short custom1, custom2; /* to be abused for buttons */
float custom3, custom4;
@@ -151,7 +164,6 @@ typedef struct bNode {
struct uiBlock *block; /* runtime during drawing */
struct bNodeType *typeinfo; /* lookup of callbacks and defaults */
-
} bNode;
/* node->flag */
@@ -163,11 +175,17 @@ typedef struct bNode {
#define NODE_ACTIVE_ID 32
#define NODE_DO_OUTPUT 64
#define NODE_GROUP_EDIT 128
- /* free test flag, undefined */
+ /* free test flag, undefined */
#define NODE_TEST 256
- /* composite: don't do node but pass on buffer(s) */
+ /* composite: don't do node but pass on buffer(s) */
#define NODE_MUTED 512
-#define NODE_CUSTOM_NAME 1024 /* deprecated! */
+#define NODE_CUSTOM_NAME 1024 /* deprecated! */
+ /* group node types: use const outputs by default */
+#define NODE_CONST_OUTPUT (1<<11)
+ /* node is always behind others */
+#define NODE_BACKGROUND (1<<12)
+ /* automatic flag for nodes included in transforms */
+#define NODE_TRANSFORM (1<<13)
typedef struct bNodeLink {
struct bNodeLink *next, *prev;
@@ -175,13 +193,13 @@ typedef struct bNodeLink {
bNode *fromnode, *tonode;
bNodeSocket *fromsock, *tosock;
- int flag, pad;
-
+ int flag;
+ int pad;
} bNodeLink;
-
/* link->flag */
-#define NODE_LINKFLAG_HILITE 1
+#define NODE_LINKFLAG_HILITE 1 /* link has been successfully validated */
+#define NODE_LINK_VALID 2
/* the basis for a Node tree, all links and nodes reside internal here */
/* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
@@ -193,19 +211,24 @@ typedef struct bNodeTree {
ListBase nodes, links;
- bNodeStack *stack; /* stack is only while executing, no read/write in file */
- struct ListBase *threadstack; /* same as above */
-
int type, init; /* set init on fileread */
- int stacksize; /* amount of elements in stack */
int cur_index; /* sockets in groups have unique identifiers, adding new sockets always
will increase this counter */
- int flag, pad;
+ int flag;
+ int update; /* update flags */
+
+ int nodetype; /* specific node type this tree is used for */
- ListBase alltypes; /* type definitions */
ListBase inputs, outputs; /* external sockets for group nodes */
-
- int pad2[2];
+
+ /* execution data */
+ /* XXX It would be preferable to completely move this data out of the underlying node tree,
+ * so node tree execution could finally run independent of the tree itself. This would allow node trees
+ * to be merely linked by other data (materials, textures, etc.), as ID data is supposed to.
+ * Execution data is generated from the tree once at execution start and can then be used
+ * as long as necessary, even while the tree is being modified.
+ */
+ struct bNodeTreeExec *execdata;
/* callbacks */
void (*progress)(void *, float progress);
@@ -216,20 +239,59 @@ typedef struct bNodeTree {
} bNodeTree;
/* ntree->type, index */
-#define NTREE_SHADER 0
-#define NTREE_COMPOSIT 1
-#define NTREE_TEXTURE 2
+#define NTREE_SHADER 0
+#define NTREE_COMPOSIT 1
+#define NTREE_TEXTURE 2
+#define NUM_NTREE_TYPES 3
/* ntree->init, flag */
-#define NTREE_TYPE_INIT 1
-#define NTREE_EXEC_INIT 2
+#define NTREE_TYPE_INIT 1
/* ntree->flag */
#define NTREE_DS_EXPAND 1 /* for animation editors */
-/* XXX not nice, but needed as a temporary flag
+/* XXX not nice, but needed as a temporary flags
* for group updates after library linking.
*/
-#define NTREE_DO_VERSIONS 1024
+#define NTREE_DO_VERSIONS_GROUP_EXPOSE 1024
+
+/* ntree->update */
+#define NTREE_UPDATE 0xFFFF /* generic update flag (includes all others) */
+#define NTREE_UPDATE_LINKS 1 /* links have been added or removed */
+#define NTREE_UPDATE_NODES 2 /* nodes or sockets have been added or removed */
+#define NTREE_UPDATE_GROUP_IN 16 /* group inputs have changed */
+#define NTREE_UPDATE_GROUP_OUT 32 /* group outputs have changed */
+#define NTREE_UPDATE_GROUP 48 /* group has changed (generic flag including all other group flags) */
+
+
+/* socket value structs for input buttons */
+
+typedef struct bNodeSocketValueInt {
+ int subtype; /* RNA subtype */
+ int value;
+ int min, max;
+} bNodeSocketValueInt;
+
+typedef struct bNodeSocketValueFloat {
+ int subtype; /* RNA subtype */
+ float value;
+ float min, max;
+} bNodeSocketValueFloat;
+
+typedef struct bNodeSocketValueBoolean {
+ char value;
+ char pad[3];
+} bNodeSocketValueBoolean;
+
+typedef struct bNodeSocketValueVector {
+ int subtype; /* RNA subtype */
+ float value[3];
+ float min, max;
+} bNodeSocketValueVector;
+
+typedef struct bNodeSocketValueRGBA {
+ float value[4];
+} bNodeSocketValueRGBA;
+
/* data structs, for node->storage */
@@ -354,7 +416,6 @@ typedef struct TexNodeOutput {
char name[32];
} TexNodeOutput;
-
/* comp channel matte */
#define CMP_NODE_CHANNEL_MATTE_CS_RGB 1
#define CMP_NODE_CHANNEL_MATTE_CS_HSV 2
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index ffa82092ef1..8750ee9e906 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -189,6 +189,8 @@ typedef struct Object {
float max_vel; /* clamp the maximum velocity 0.0 is disabled */
float min_vel; /* clamp the maximum velocity 0.0 is disabled */
float m_contactProcessingThreshold;
+ float obstacleRad;
+ char pad0[4];
short rotmode; /* rotation mode - uses defines set out in DNA_action_types.h for PoseChannel rotations... */
@@ -473,6 +475,8 @@ typedef struct DupliObject {
#define OB_SOFT_BODY 0x20000
#define OB_OCCLUDER 0x40000
#define OB_SENSOR 0x80000
+#define OB_NAVMESH 0x100000
+#define OB_HASOBSTACLE 0x200000
/* ob->gameflag2 */
#define OB_NEVER_DO_ACTIVITY_CULLING 1
@@ -493,6 +497,7 @@ typedef struct DupliObject {
#define OB_BODY_TYPE_SOFT 4
#define OB_BODY_TYPE_OCCLUDER 5
#define OB_BODY_TYPE_SENSOR 6
+#define OB_BODY_TYPE_NAVMESH 7
/* ob->scavisflag */
#define OB_VIS_SENS 1
diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h
index c44f10efde8..af19aa490ae 100644
--- a/source/blender/makesdna/DNA_outliner_types.h
+++ b/source/blender/makesdna/DNA_outliner_types.h
@@ -51,6 +51,8 @@ typedef struct TreeStore {
#define TSE_CLOSED 1
#define TSE_SELECTED 2
#define TSE_TEXTBUT 4
+#define TSE_CHILDSEARCH 8
+#define TSE_SEARCHMATCH 16
/* TreeStoreElem types in BIF_outliner.h */
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 00f626106ae..aa0a41680ec 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -431,8 +431,38 @@ typedef struct GameFraming {
#define SCE_GAMEFRAMING_EXTEND 1
#define SCE_GAMEFRAMING_SCALE 2
+typedef struct RecastData
+{
+ float cellsize;
+ float cellheight;
+ float agentmaxslope;
+ float agentmaxclimb;
+ float agentheight;
+ float agentradius;
+ float edgemaxlen;
+ float edgemaxerror;
+ float regionminsize;
+ float regionmergesize;
+ int vertsperpoly;
+ float detailsampledist;
+ float detailsamplemaxerror;
+} RecastData;
+
typedef struct GameData {
+ /* standalone player */
+ struct GameFraming framing;
+ short fullscreen, xplay, yplay, freqplay;
+ short depth, attrib, rt1, rt2;
+
+ /* stereo/dome mode */
+ struct GameDome dome;
+ short stereoflag, stereomode;
+ short pad2, pad3;
+ float eyeseparation, pad1;
+ RecastData recastData;
+
+
/* physics (it was in world)*/
float gravity; /*Gravitation constant for the game world*/
@@ -445,21 +475,12 @@ typedef struct GameData {
* bit 3: (gameengine): Activity culling is enabled.
* bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling
*/
- short mode, flag, matmode, pad[3];
+ short mode, flag, matmode, pad[2];
short occlusionRes; /* resolution of occlusion Z buffer in pixel */
short physicsEngine;
short ticrate, maxlogicstep, physubstep, maxphystep;
-
- /* standalone player */
- struct GameFraming framing;
- short fullscreen, xplay, yplay, freqplay;
- short depth, attrib, rt1, rt2;
-
- /* stereo/dome mode */
- struct GameDome dome;
- short stereoflag, stereomode;
- short pad2, pad3;
- float eyeseparation, pad1;
+ short obstacleSimulation;
+ float levelHeight;
} GameData;
#define STEREO_NOSTEREO 1
@@ -483,6 +504,11 @@ typedef struct GameData {
#define WOPHY_ODE 4
#define WOPHY_BULLET 5
+/* obstacleSimulation */
+#define OBSTSIMULATION_NONE 0
+#define OBSTSIMULATION_TOI_rays 1
+#define OBSTSIMULATION_TOI_cells 2
+
/* GameData.flag */
#define GAME_RESTRICT_ANIM_UPDATES (1 << 0)
#define GAME_ENABLE_ALL_FRAMES (1 << 1)
@@ -499,6 +525,7 @@ typedef struct GameData {
#define GAME_IGNORE_DEPRECATION_WARNINGS (1 << 12)
#define GAME_ENABLE_ANIMATION_RECORD (1 << 13)
#define GAME_SHOW_MOUSE (1 << 14)
+#define GAME_SHOW_OBSTACLE_SIMULATION (1 << 15)
#define GAME_GLSL_NO_COLOR_MANAGEMENT (1 << 15)
/* Note: GameData.flag is a short (max 16 flags). To add more flags, GameData.flag needs to be an int */
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 66b10bcbf21..1627d4d2acb 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -861,6 +861,7 @@ enum {
/* outliner search flags (SpaceOops->search_flags) */
#define SO_FIND_CASE_SENSITIVE (1<<0)
#define SO_FIND_COMPLETE (1<<1)
+#define SO_SEARCH_RECURSIVE (1<<2)
/* headerbuttons: 450-499 */
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 43dc532d4f6..d3ac09dc812 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -607,6 +607,12 @@ extern UserDef U; /* from blenkernel blender.c */
/* zoom is up/down if this flag is set (otherwise forward/backward) */
#define NDOF_ZOOM_UPDOWN (1 << 7)
#define NDOF_ZOOM_INVERT (1 << 8)
+#define NDOF_ROTATE_INVERT_AXIS (1 << 9)
+#define NDOF_TILT_INVERT_AXIS (1 << 10)
+#define NDOF_ROLL_INVERT_AXIS (1 << 11)
+#define NDOF_PANX_INVERT_AXIS (1 << 12)
+#define NDOF_PANY_INVERT_AXIS (1 << 13)
+#define NDOF_PANZ_INVERT_AXIS (1 << 14)
#ifdef __cplusplus
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 712db9af2b4..48c5422b453 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -356,10 +356,13 @@ extern StructRNA RNA_NearSensor;
extern StructRNA RNA_NlaStrip;
extern StructRNA RNA_NlaTrack;
extern StructRNA RNA_Node;
+extern StructRNA RNA_NodeForLoop;
extern StructRNA RNA_NodeGroup;
extern StructRNA RNA_NodeLink;
extern StructRNA RNA_NodeSocket;
+extern StructRNA RNA_NodeSocketPanel;
extern StructRNA RNA_NodeTree;
+extern StructRNA RNA_NodeWhileLoop;
extern StructRNA RNA_NoiseTexture;
extern StructRNA RNA_NorController;
extern StructRNA RNA_Object;
@@ -405,7 +408,6 @@ extern StructRNA RNA_PropertyGroupItem;
extern StructRNA RNA_PropertySensor;
extern StructRNA RNA_PythonConstraint;
extern StructRNA RNA_PythonController;
-extern StructRNA RNA_RGBANodeSocket;
extern StructRNA RNA_RadarSensor;
extern StructRNA RNA_RandomSensor;
extern StructRNA RNA_RaySensor;
@@ -582,9 +584,7 @@ extern StructRNA RNA_UserPreferencesFilePaths;
extern StructRNA RNA_UserPreferencesSystem;
extern StructRNA RNA_UserPreferencesView;
extern StructRNA RNA_UserSolidLight;
-extern StructRNA RNA_ValueNodeSocket;
extern StructRNA RNA_VectorFont;
-extern StructRNA RNA_VectorNodeSocket;
extern StructRNA RNA_VertexGroup;
extern StructRNA RNA_VertexGroupElement;
extern StructRNA RNA_VertexPaint;
@@ -593,6 +593,9 @@ extern StructRNA RNA_VoxelData;
extern StructRNA RNA_VoxelDataTexture;
extern StructRNA RNA_WarpModifier;
extern StructRNA RNA_WaveModifier;
+extern StructRNA RNA_WeightVGEditModifier;
+extern StructRNA RNA_WeightVGMixModifier;
+extern StructRNA RNA_WeightVGProximityModifier;
extern StructRNA RNA_Window;
extern StructRNA RNA_WindowManager;
extern StructRNA RNA_WipeSequence;
@@ -628,6 +631,8 @@ extern const PointerRNA PointerRNA_NULL;
/* Structs */
+StructRNA *RNA_struct_find(const char *identifier);
+
const char *RNA_struct_identifier(StructRNA *type);
const char *RNA_struct_ui_name(StructRNA *type);
const char *RNA_struct_ui_description(StructRNA *type);
@@ -998,7 +1003,15 @@ int RNA_function_call_direct_va_lookup(struct bContext *C, struct ReportList *re
short RNA_type_to_ID_code(StructRNA *type);
StructRNA *ID_code_to_RNA_type(short idcode);
-void RNA_warning(const char *format, ...)
+
+/* macro which inserts the function name */
+#ifdef __GNUC__
+# define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args)
+#else /* MSVC doesnt support variable length args in macros */
+# define RNA_warning _RNA_warning
+#endif
+
+void _RNA_warning(const char *format, ...)
#ifdef __GNUC__
__attribute__ ((format (printf, 1, 2)))
#endif
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 3d0f3386ecc..32e7f5d309f 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -102,10 +102,12 @@ extern EnumPropertyItem transform_mode_types[];
extern EnumPropertyItem posebone_rotmode_items[];
extern EnumPropertyItem property_type_items[];
+extern EnumPropertyItem property_subtype_items[];
extern EnumPropertyItem property_unit_items[];
extern EnumPropertyItem viewport_shade_items[];
+extern EnumPropertyItem nodetree_type_items[];
extern EnumPropertyItem node_socket_type_items[];
extern EnumPropertyItem node_math_items[];
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index f8199074f27..4a18518dde9 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -99,7 +99,10 @@ typedef enum PropertyUnit {
#define RNA_ENUM_BITFLAG_SIZE 32
-/* also update enums in bpy_props.c when adding items here */
+/* also update enums in bpy_props.c when adding items here
+ * watch it: these values are written to files as part of
+ * node socket button subtypes!
+ */
typedef enum PropertySubType {
PROP_NONE = 0,
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index 9a294737aa2..10006ddca6b 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -9,6 +9,7 @@ objs += o
incs = '#/intern/guardedalloc #/intern/memutil #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .'
incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin ../blenfont ../blenloader'
incs += ' ../render/extern/include'
+incs += ' ../nodes'
incs += ' #/extern/glew/include'
incs += ' ../freestyle'
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 8fd72d122ed..1910baea6f2 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -201,7 +201,7 @@ if(NOT WITH_MOD_FLUID)
endif()
if(WITH_FFTW3)
- add_definitions(-DFFTW3=1)
+ add_definitions(-DWITH_FFTW3)
endif()
if(WITH_SDL)
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 24c892b96c4..5c2580e4b90 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -71,7 +71,7 @@ if env['WITH_BF_GAMEENGINE']:
defs.append('WITH_GAMEENGINE')
if env['WITH_BF_FFTW3']:
- defs.append('FFTW3=1')
+ defs.append('WITH_FFTW3')
if env['WITH_BF_SDL']:
defs.append('WITH_SDL')
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index ad79771416d..1ccd6d9a1d7 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -475,6 +475,17 @@ static const char *rna_ensure_property_name(PropertyRNA *prop)
/* Structs */
+StructRNA *RNA_struct_find(const char *identifier)
+{
+ StructRNA *type;
+ if (identifier) {
+ for (type = BLENDER_RNA.structs.first; type; type = type->cont.next)
+ if (strcmp(type->identifier, identifier)==0)
+ return type;
+ }
+ return NULL;
+}
+
const char *RNA_struct_identifier(StructRNA *type)
{
return type->identifier;
@@ -4396,7 +4407,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
buf= MEM_mallocN(sizeof(char)*(length+1), "RNA_property_as_string");
buf_esc= MEM_mallocN(sizeof(char)*(length*2+1), "RNA_property_as_string esc");
RNA_property_string_get(ptr, prop, buf);
- BLI_strescape(buf_esc, buf, length*2);
+ BLI_strescape(buf_esc, buf, length*2+1);
MEM_freeN(buf);
BLI_dynstr_appendf(dynstr, "\"%s\"", buf_esc);
MEM_freeN(buf_esc);
@@ -5363,7 +5374,8 @@ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, i
return 0;
}
-void RNA_warning(const char *format, ...)
+/* use RNA_warning macro which includes __func__ suffix */
+void _RNA_warning(const char *format, ...)
{
va_list args;
@@ -5371,6 +5383,11 @@ void RNA_warning(const char *format, ...)
vprintf(format, args);
va_end(args);
+ /* gcc macro adds '\n', but cant use for other compilers */
+#ifndef __GNUC__
+ fputc('\n', stdout);
+#endif
+
#ifdef WITH_PYTHON
{
extern void PyC_LineSpit(void);
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 5eccba16c3d..3214d31a53c 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -60,6 +60,7 @@ EnumPropertyItem actuator_type_items[] ={
{ACT_SOUND, "SOUND", 0, "Sound", ""},
{ACT_STATE, "STATE", 0, "State", ""},
{ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""},
+ {ACT_STEERING, "STEERING", 0, "Steering", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -103,6 +104,8 @@ static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr)
return &RNA_StateActuator;
case ACT_ARMATURE:
return &RNA_ArmatureActuator;
+ case ACT_STEERING:
+ return &RNA_SteeringActuator;
default:
return &RNA_Actuator;
}
@@ -323,30 +326,6 @@ static void rna_Actuator_constraint_detect_material_set(struct PointerRNA *ptr,
}
}
-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_ActionActuator_add_set(struct PointerRNA *ptr, int value)
{
bActuator *act = (bActuator *)ptr->data;
@@ -459,6 +438,7 @@ EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, Property
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);
+ RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_STEERING);
RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_SOUND);
RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_STATE);
@@ -504,6 +484,18 @@ static void rna_Actuator_Armature_update(Main *bmain, Scene *scene, PointerRNA *
constraint[0] = 0;
}
+static void rna_SteeringActuator_navmesh_set(PointerRNA *ptr, PointerRNA value)
+{
+ bActuator *act = (bActuator*)ptr->data;
+ bSteeringActuator *sa = (bSteeringActuator*) act->data;
+
+ Object* obj = value.data;
+ if (obj && obj->body_type==OB_BODY_TYPE_NAVMESH)
+ sa->navmesh = obj;
+ else
+ sa->navmesh = NULL;
+}
+
/* note: the following set functions exists only to avoid id refcounting */
static void rna_Actuator_editobject_mesh_set(PointerRNA *ptr, PointerRNA value)
{
@@ -858,77 +850,6 @@ static void rna_def_object_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
-/* The fcurve actuator has been replace with the action actuator, so this is no longer used */
-static void rna_def_fcurve_actuator(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- static EnumPropertyItem prop_type_items[] ={
- {ACT_IPO_PLAY, "PLAY", 0, "Play", ""},
- {ACT_IPO_PINGPONG, "PINGPONG", 0, "Ping Pong", ""},
- {ACT_IPO_FLIPPER, "FLIPPER", 0, "Flipper", ""},
- {ACT_IPO_LOOP_STOP, "STOP", 0, "Loop Stop", ""},
- {ACT_IPO_LOOP_END, "END", 0, "Loop End", ""},
-// {ACT_IPO_KEY2KEY, "IPOCHILD", 0, "Key to Key", ""},
- {ACT_IPO_FROM_PROP, "PROP", 0, "Property", ""},
- {0, NULL, 0, NULL, NULL}};
-
- 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, "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_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "sta");
- RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
- RNA_def_property_ui_text(prop, "Start Frame", "");
- RNA_def_property_update(prop, NC_SCENE, NULL);
-
- prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "end");
- RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
- RNA_def_property_ui_text(prop, "End Frame", "");
- 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 F-Curve position");
- 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");
-
- /* booleans */
- 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_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);
-
- 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 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, "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 F-Curve on all children Objects as well");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-}
-
static void rna_def_camera_actuator(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1995,6 +1916,108 @@ static void rna_def_armature_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
+static void rna_def_steering_actuator(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem prop_type_items[] ={
+ {ACT_STEERING_SEEK, "SEEK", 0, "Seek", ""},
+ {ACT_STEERING_FLEE, "FLEE", 0, "Flee", ""},
+ {ACT_STEERING_PATHFOLLOWING, "PATHFOLLOWING", 0, "Path following", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem facingaxis_items[] ={
+ {1, "X", 0, "X", ""},
+ {2, "Y", 0, "Y", ""},
+ {3, "Z", 0, "Z", ""},
+ {4, "-X", 0, "-X", ""},
+ {5, "-Y", 0, "-Y", ""},
+ {6, "-Z", 0, "-Z", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "SteeringActuator", "Actuator");
+ RNA_def_struct_ui_text(srna, "Steering Actuator", "");
+ RNA_def_struct_sdna_from(srna, "bSteeringActuator", "data");
+
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_ui_text(prop, "Behavior", "");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "velocity");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Velocity", "Velocity magnitude");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "acceleration", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "acceleration");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Acceleration", "Max acceleration");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "turn_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "turnspeed");
+ RNA_def_property_range(prop, 0.0, 720.0);
+ RNA_def_property_ui_text(prop, "Turn Speed", "Max turn speed");
+ 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_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Dist", "Relax distance");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_pointer_sdna(prop, NULL, "target");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Target Object", "Set target object");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "self_terminated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_SELFTERMINATED);
+ RNA_def_property_ui_text(prop, "Self Terminated", "Terminate when target is reached");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "show_visualization", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_ENABLEVISUALIZATION);
+ RNA_def_property_ui_text(prop, "Visualize", "Enable debug visualization");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "update_period", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "updateTime");
+ RNA_def_property_ui_range(prop, -1, 100000, 1, 1);
+ RNA_def_property_ui_text(prop, "Update period", "Path update period");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "navmesh", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_pointer_sdna(prop, NULL, "navmesh");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "NavMesh Object", "Navigation mesh");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_SteeringActuator_navmesh_set", NULL, NULL);
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "facing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_AUTOMATICFACING);
+ RNA_def_property_ui_text(prop, "Facing", "Enable automatic facing");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "facing_axis", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "facingaxis");
+ RNA_def_property_enum_items(prop, facingaxis_items);
+ RNA_def_property_ui_text(prop, "Axis", "Axis for automatic facing");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "normal_up", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_NORMALUP);
+ RNA_def_property_ui_text(prop, "N", "Use normal of the navmesh to set \"UP\" vector");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+}
+
void RNA_def_actuator(BlenderRNA *brna)
{
rna_def_actuator(brna);
@@ -2016,6 +2039,7 @@ void RNA_def_actuator(BlenderRNA *brna)
rna_def_shape_action_actuator(brna);
rna_def_state_actuator(brna);
rna_def_armature_actuator(brna);
+ rna_def_steering_actuator(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 08c4a503386..4c1bc027524 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -262,6 +262,7 @@ 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);
+void RNA_api_texture(struct StructRNA *srna);
void RNA_api_environment_map(struct StructRNA *srna);
/* main collection functions */
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 262a115f555..505ddfaefbf 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -215,9 +215,7 @@ void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material
struct bNodeTree *rna_Main_nodetree_new(Main *UNUSED(bmain), const char *name, int type)
{
- bNodeTree *tree = ntreeAddTree(name, type, TRUE);
-
-// ntreeMakeGroupSockets(tree);
+ bNodeTree *tree = ntreeAddTree(name, type, NODE_GROUP);
id_us_min(&tree->id);
return tree;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 37a629f46d0..464f676b7f6 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -68,7 +68,11 @@ EnumPropertyItem modifier_type_items[] ={
{eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""},
{eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
{eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
+ {0, "", 0, "Modify", ""},
{eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
+ {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""},
+ {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""},
+ {eModifierType_WeightVGProximity, "VERTEX_WEIGHT_PROXIMITY", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Proximity", ""},
{0, "", 0, "Deform", ""},
{eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
{eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
@@ -87,6 +91,7 @@ EnumPropertyItem modifier_type_items[] ={
{eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""},
{eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""},
{eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
+ {eModifierType_NavMesh, "NAVMESH", ICON_MOD_PHYSICS, "Navigation mesh", ""},
{eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
{eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
{eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
@@ -184,6 +189,14 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
return &RNA_ScrewModifier;
case eModifierType_Warp:
return &RNA_WarpModifier;
+ case eModifierType_NavMesh:
+ return &RNA_NavMeshModifier;
+ case eModifierType_WeightVGEdit:
+ return &RNA_VertexWeightEditModifier;
+ case eModifierType_WeightVGMix:
+ return &RNA_VertexWeightMixModifier;
+ case eModifierType_WeightVGProximity:
+ return &RNA_VertexWeightProximityModifier;
default:
return &RNA_Modifier;
}
@@ -376,6 +389,46 @@ static void rna_SolidifyModifier_vgroup_set(PointerRNA *ptr, const char *value)
rna_object_vgroup_name_set(ptr, value, smd->defgrp_name, sizeof(smd->defgrp_name));
}
+static void rna_WeightVGModifier_vgroup_set(PointerRNA *ptr, const char *value)
+{
+ ModifierData *md = (ModifierData*)ptr->data;
+ if (md->type == eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name));
+ }
+ else if (md->type == eModifierType_WeightVGMix) {
+ WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name_a, sizeof(wmd->defgrp_name_a));
+ }
+ else if (md->type == eModifierType_WeightVGProximity) {
+ WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name));
+ }
+}
+
+static void rna_WeightVGModifier_mask_vgroup_set(PointerRNA *ptr, const char *value)
+{
+ ModifierData *md = (ModifierData*)ptr->data;
+ if (md->type == eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
+ }
+ else if (md->type == eModifierType_WeightVGMix) {
+ WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
+ }
+ else if (md->type == eModifierType_WeightVGProximity) {
+ WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
+ }
+}
+
+static void rna_WeightVGMixModifier_vgroup2_set(PointerRNA *ptr, const char *value)
+{
+ WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)ptr->data;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name_b, sizeof(wmd->defgrp_name_b));
+}
+
static void rna_MappingInfo_uvlayer_set(PointerRNA *ptr, const char *value)
{
MappingInfoModifierData *mmd= (MappingInfoModifierData *)ptr->data;
@@ -400,6 +453,23 @@ static void rna_WaveModifier_uvlayer_set(PointerRNA *ptr, const char *value)
rna_object_uvlayer_name_set(ptr, value, wmd->uvlayer_name, sizeof(wmd->uvlayer_name));
}
+static void rna_WeightVGModifier_mask_uvlayer_set(PointerRNA *ptr, const char *value)
+{
+ ModifierData *md = (ModifierData*)ptr->data;
+ if (md->type == eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*)md;
+ rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
+ }
+ else if (md->type == eModifierType_WeightVGMix) {
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*)md;
+ rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
+ }
+ else if (md->type == eModifierType_WeightVGProximity) {
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*)md;
+ rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
+ }
+}
+
static void rna_MultiresModifier_level_range(PointerRNA *ptr, int *min, int *max)
{
MultiresModifierData *mmd = (MultiresModifierData*)ptr->data;
@@ -2366,7 +2436,7 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
prop= RNA_def_property(srna, "steps", PROP_INT, PROP_UNSIGNED);
RNA_def_property_range(prop, 2, 10000);
- RNA_def_property_ui_range(prop, 2, 512, 1, 0);
+ RNA_def_property_ui_range(prop, 3, 512, 1, 0);
RNA_def_property_ui_text(prop, "Steps", "Number of steps in the revolution");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2420,6 +2490,311 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Modifier_update");*/
}
+static void rna_def_modifier_navmesh(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ /* PropertyRNA *prop; */ /* UNUSED */
+
+ srna= RNA_def_struct(brna, "NavMeshModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "NavMesh Modifier", "NavMesh modifier");
+ RNA_def_struct_sdna(srna, "NavMeshModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM);
+}
+
+static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna)
+{
+ static EnumPropertyItem weightvg_mask_tex_map_items[] = {
+ {MOD_DISP_MAP_LOCAL, "LOCAL", 0, "Local", ""},
+ {MOD_DISP_MAP_GLOBAL, "GLOBAL", 0, "Global", ""},
+ {MOD_DISP_MAP_OBJECT, "OBJECT", 0, "Object", ""},
+ {MOD_DISP_MAP_UV, "UV", 0, "UV", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem weightvg_mask_tex_used_items[] = {
+ {MOD_WVG_MASK_TEX_USE_INT, "INT", 0, "Intensity", ""},
+ {MOD_WVG_MASK_TEX_USE_RED, "RED", 0, "Red", ""},
+ {MOD_WVG_MASK_TEX_USE_GREEN, "GREEN", 0, "Green", ""},
+ {MOD_WVG_MASK_TEX_USE_BLUE, "BLUE", 0, "Blue", ""},
+ {MOD_WVG_MASK_TEX_USE_HUE, "HUE", 0, "Hue", ""},
+ {MOD_WVG_MASK_TEX_USE_SAT, "SAT", 0, "Saturation", ""},
+ {MOD_WVG_MASK_TEX_USE_VAL, "VAL", 0, "Value", ""},
+ {MOD_WVG_MASK_TEX_USE_ALPHA, "ALPHA", 0, "Alpha", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(srna, "mask_constant", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Influence", "Global influence of current modifications on vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "mask_defgrp_name");
+ RNA_def_property_ui_text(prop, "Mask VGroup", "Masking vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_texture", PROP_POINTER, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Masking Tex", "Masking texture.");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_tex_use_channel", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mask_tex_used_items);
+ RNA_def_property_ui_text(prop, "Use Channel", "Which texture channel to use for masking.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_tex_mapping", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mask_tex_map_items);
+ RNA_def_property_ui_text(prop, "Texture Coordinates", "Which texture coordinates "
+ "to use for mapping.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+ prop= RNA_def_property(srna, "mask_tex_uv_layer", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "mask_tex_uvlayer_name");
+ RNA_def_property_ui_text(prop, "UV Layer", "UV layer name");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_uvlayer_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_tex_map_object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "mask_tex_map_obj");
+ RNA_def_property_ui_text(prop, "Texture Coordinate Object", "Which object to take texture "
+ "coordinates from.");
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+}
+
+static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
+{
+ static EnumPropertyItem weightvg_edit_falloff_type_items[] = {
+ {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""},
+ {MOD_WVG_MAPPING_CURVE, "CURVE", ICON_RNDCURVE, "Custom Curve", ""},
+ {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
+ {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
+ {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""},
+ {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""},
+ {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""},
+ {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "VertexWeightEditModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "WeightVG Edit Modifier",
+ "Edit the weights of vertices in a group.");
+ RNA_def_struct_sdna(srna, "WeightVGEditModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT);
+
+ prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_edit_falloff_type_items);
+ RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG);
+ RNA_def_property_ui_text(prop, "Group Add", "Add vertices with weight over threshold "
+ "to vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_remove", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REMFVG);
+ RNA_def_property_ui_text(prop, "Group Remove", "Remove vertices with weight below threshold "
+ "from vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if "
+ "it is not in the vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "map_curve", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "cmap_curve");
+ RNA_def_property_ui_text(prop, "Mapping Curve", "Custom mapping curve.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "add_threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "add_threshold");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex's weight "
+ "to be added to the vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "remove_threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rem_threshold");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex's weight "
+ "to be removed from the vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ /* Common masking properties. */
+ rna_def_modifier_weightvg_mask(brna, srna);
+}
+
+static void rna_def_modifier_weightvgmix(BlenderRNA *brna)
+{
+ static EnumPropertyItem weightvg_mix_modes_items[] = {
+ {MOD_WVG_MIX_SET, "SET", 0, "Replace weights", ""},
+ {MOD_WVG_MIX_ADD, "ADD", 0, "Add to weights", ""},
+ {MOD_WVG_MIX_SUB, "SUB", 0, "Subtract from weights", ""},
+ {MOD_WVG_MIX_MUL, "MUL", 0, "Multiply weights", ""},
+ {MOD_WVG_MIX_DIV, "DIV", 0, "Divide weights", ""},
+ {MOD_WVG_MIX_DIF, "DIF", 0, "Difference", ""},
+ {MOD_WVG_MIX_AVG, "AVG", 0, "Average", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem weightvg_mix_set_items[] = {
+ {MOD_WVG_SET_ALL, "ALL", 0, "All vertices", ""},
+ {MOD_WVG_SET_A, "A", 0, "Vertices from group A", ""},
+ {MOD_WVG_SET_B, "B", 0, "Vertices from group B", ""},
+ {MOD_WVG_SET_OR, "OR", 0, "Vertices from one group", ""},
+ {MOD_WVG_SET_AND, "AND", 0, "Vertices from both groups", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "VertexWeightMixModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "WeightVG Mix Modifier",
+ "Mix the weights of two vertex groups.");
+ RNA_def_struct_sdna(srna, "WeightVGMixModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT);
+
+ prop= RNA_def_property(srna, "vertex_group_a", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name_a");
+ RNA_def_property_ui_text(prop, "Vertex Group A", "First vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "vertex_group_b", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name_b");
+ RNA_def_property_ui_text(prop, "Vertex Group B", "Second vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGMixModifier_vgroup2_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "default_weight_a", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Default Weight A", "Default weight a vertex will have if "
+ "it is not in the first vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "default_weight_b", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Default Weight B", "Default weight a vertex will have if "
+ "it is not in the second vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mix_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mix_modes_items);
+ RNA_def_property_ui_text(prop, "Mix Mode", "How weights from vgroup 2 affect weights "
+ "of vgroup 1.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mix_set", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mix_set_items);
+ RNA_def_property_ui_text(prop, "Vertex Set", "Which vertices should be affected.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ /* Common masking properties. */
+ rna_def_modifier_weightvg_mask(brna, srna);
+}
+
+static void rna_def_modifier_weightvgproximity(BlenderRNA *brna)
+{
+ static EnumPropertyItem weightvg_proximity_modes_items[] = {
+ {MOD_WVG_PROXIMITY_OBJECT, "OBJECT", 0, "Object Distance",
+ "Use distance between affected and target objects."},
+ {MOD_WVG_PROXIMITY_GEOMETRY, "GEOMETRY", 0, "Geometry Distance",
+ "Use distance between affected object's vertices and target object, or target object's geometry."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem proximity_geometry_items[] = {
+ {MOD_WVG_PROXIMITY_GEOM_VERTS, "VERTEX", ICON_VERTEXSEL, "Vertex", "Compute distance to nearest vertex."},
+ {MOD_WVG_PROXIMITY_GEOM_EDGES, "EDGE", ICON_EDGESEL, "Edge", "Compute distance to nearest edge."},
+ {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", "Compute distance to nearest face."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem weightvg_proximity_falloff_type_items[] = {
+ {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""},
+ /* No curve mapping here! */
+ {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
+ {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
+ {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""},
+ {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""},
+ {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""},
+ {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "VertexWeightProximityModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "WeightVG Proximity Modifier",
+ "Set the weights of vertices in a group from a target object's "
+ "distance.");
+ RNA_def_struct_sdna(srna, "WeightVGProximityModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT);
+
+ prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "proximity_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_proximity_modes_items);
+ RNA_def_property_ui_text(prop, "Proximity Mode", "Which distances to target object to use.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "proximity_geometry", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "proximity_flags");
+ RNA_def_property_enum_items(prop, proximity_geometry_items);
+ RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */
+ RNA_def_property_ui_text(prop, "Proximity Geometry",
+ "Use the shortest computed distance to target object's geometry "
+ "as weight.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "proximity_ob_target");
+ RNA_def_property_ui_text(prop, "Target Object", "Object to calculate vertices distances from.");
+ 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, "min_dist", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Lowest Dist", "Distance mapping to weight 0.0 (or weight 1.0 if above Highest Dist).");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "max_dist", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0 (or weight 0.0 if below Lowest Dist).");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_proximity_falloff_type_items);
+ RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ /* Common masking properties. */
+ rna_def_modifier_weightvg_mask(brna, srna);
+}
+
void RNA_def_modifier(BlenderRNA *brna)
{
StructRNA *srna;
@@ -2517,6 +2892,10 @@ void RNA_def_modifier(BlenderRNA *brna)
rna_def_modifier_smoke(brna);
rna_def_modifier_solidify(brna);
rna_def_modifier_screw(brna);
+ rna_def_modifier_navmesh(brna);
+ rna_def_modifier_weightvgedit(brna);
+ rna_def_modifier_weightvgmix(brna);
+ rna_def_modifier_weightvgproximity(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 56492a52da9..49a0458977a 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -30,13 +30,17 @@
#include <stdlib.h>
#include <string.h>
+#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_enum_types.h"
#include "rna_internal.h"
+#include "rna_internal_types.h"
#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_node_types.h"
+#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
@@ -53,9 +57,16 @@
#include "MEM_guardedalloc.h"
+EnumPropertyItem nodetree_type_items[] = {
+ {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, "Material", "Material nodes" },
+ {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes" },
+ {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes" },
+ {0, NULL, 0, NULL, NULL}
+};
+
EnumPropertyItem node_socket_type_items[] = {
- {SOCK_VALUE, "VALUE", 0, "Value", ""},
+ {SOCK_FLOAT, "VALUE", 0, "Value", ""},
{SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
{SOCK_RGBA, "RGBA", 0, "RGBA", ""},
{0, NULL, 0, NULL, NULL}};
@@ -99,6 +110,41 @@ EnumPropertyItem node_filter_items[] = {
{6, "SHADOW", 0, "Shadow", ""},
{0, NULL, 0, NULL, NULL}};
+
+/* Add any new socket value subtype here.
+ * When adding a new subtype here, make sure you also add it
+ * to the subtype definitions in DNA_node_types.h.
+ * This macro is used by the RNA and the internal converter functions
+ * to define all socket subtypes. The SUBTYPE macro must be defined
+ * before using this macro, and undefined afterwards.
+ */
+#define NODE_DEFINE_SUBTYPES_INT \
+SUBTYPE(INT, Int, NONE, None) \
+SUBTYPE(INT, Int, UNSIGNED, Unsigned)
+
+#define NODE_DEFINE_SUBTYPES_FLOAT \
+SUBTYPE(FLOAT, Float, NONE, None) \
+SUBTYPE(FLOAT, Float, UNSIGNED, Unsigned) \
+SUBTYPE(FLOAT, Float, PERCENTAGE, Percentage) \
+SUBTYPE(FLOAT, Float, FACTOR, Factor) \
+SUBTYPE(FLOAT, Float, ANGLE, Angle) \
+SUBTYPE(FLOAT, Float, TIME, Time) \
+SUBTYPE(FLOAT, Float, DISTANCE, Distance)
+
+#define NODE_DEFINE_SUBTYPES_VECTOR \
+SUBTYPE(VECTOR, Vector, NONE, None) \
+SUBTYPE(VECTOR, Vector, TRANSLATION, Translation) \
+SUBTYPE(VECTOR, Vector, DIRECTION, Direction) \
+SUBTYPE(VECTOR, Vector, VELOCITY, Velocity) \
+SUBTYPE(VECTOR, Vector, ACCELERATION, Acceleration) \
+SUBTYPE(VECTOR, Vector, EULER, Euler) \
+SUBTYPE(VECTOR, Vector, XYZ, XYZ)
+
+#define NODE_DEFINE_SUBTYPES \
+NODE_DEFINE_SUBTYPES_INT \
+NODE_DEFINE_SUBTYPES_FLOAT \
+NODE_DEFINE_SUBTYPES_VECTOR
+
#ifdef RNA_RUNTIME
#include "BLI_linklist.h"
@@ -121,32 +167,18 @@ static StructRNA *rna_Node_refine(struct PointerRNA *ptr)
#include "rna_nodetree_types.h"
- #undef DefNode
-
case NODE_GROUP:
return &RNA_NodeGroup;
+ case NODE_FORLOOP:
+ return &RNA_NodeForLoop;
+ case NODE_WHILELOOP:
+ return &RNA_NodeWhileLoop;
default:
return &RNA_Node;
}
}
-static StructRNA *rna_NodeSocketType_refine(struct PointerRNA *ptr)
-{
- bNodeSocket *ns= (bNodeSocket*)ptr->data;
-
- switch(ns->type) {
- case SOCK_VALUE:
- return &RNA_ValueNodeSocket;
- case SOCK_VECTOR:
- return &RNA_VectorNodeSocket;
- case SOCK_RGBA:
- return &RNA_RGBANodeSocket;
- default:
- return &RNA_UnknownType;
- }
-}
-
static StructRNA *rna_NodeTree_refine(struct PointerRNA *ptr)
{
bNodeTree *ntree= (bNodeTree*)ptr->data;
@@ -170,6 +202,46 @@ static char *rna_Node_path(PointerRNA *ptr)
return BLI_sprintfN("nodes[\"%s\"]", node->name);
}
+static StructRNA *rna_NodeSocket_refine(PointerRNA *ptr)
+{
+ bNodeSocket *sock= (bNodeSocket*)ptr->data;
+
+ if (sock->default_value) {
+ /* This returns the refined socket type with the full definition
+ * of the default input value with type and subtype.
+ */
+
+ #define SUBTYPE(socktype, stypename, id, idname) \
+ { \
+ bNodeSocketValue##stypename *value= (bNodeSocketValue##stypename*)sock->default_value; \
+ if (value->subtype==PROP_##id) \
+ return &RNA_NodeSocket##stypename##idname; \
+ }
+
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ NODE_DEFINE_SUBTYPES_FLOAT
+ break;
+ case SOCK_INT:
+ NODE_DEFINE_SUBTYPES_INT
+ break;
+ case SOCK_BOOLEAN:
+ return &RNA_NodeSocketBoolean;
+ break;
+ case SOCK_VECTOR:
+ NODE_DEFINE_SUBTYPES_VECTOR
+ break;
+ case SOCK_RGBA:
+ return &RNA_NodeSocketRGBA;
+ break;
+ }
+
+ #undef SUBTYPE
+ }
+
+ return &RNA_NodeSocket;
+}
+
static char *rna_NodeSocket_path(PointerRNA *ptr)
{
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
@@ -275,7 +347,7 @@ static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
bNode *node= (bNode*)ptr->data;
- nodeGroupVerify((bNodeTree *)node->id);
+ ntreeUpdateTree((bNodeTree *)node->id);
node_update(bmain, scene, ntree, node);
}
@@ -313,18 +385,42 @@ static void rna_NodeGroupSocket_update(Main *bmain, Scene *scene, PointerRNA *pt
bNodeSocket *sock= (bNodeSocket*)ptr->data;
bNode *node;
- nodeGroupVerify(ntree);
+ ntreeUpdateTree(ntree);
if (nodeFindNode(ntree, sock, &node, NULL, NULL))
node_update(bmain, scene, ntree, node);
}
-static void rna_NodeSocket_defvalue_range(PointerRNA *ptr, float *min, float *max)
+static void rna_NodeLink_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+
+ ntree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(ntree);
+}
+
+static void rna_NodeSocketInt_range(PointerRNA *ptr, int *min, int *max)
{
bNodeSocket *sock= (bNodeSocket*)ptr->data;
+ bNodeSocketValueInt *val= (bNodeSocketValueInt*)sock->default_value;
+ *min = val->min;
+ *max = val->max;
+}
- *min = sock->ns.min;
- *max = sock->ns.max;
+static void rna_NodeSocketFloat_range(PointerRNA *ptr, float *min, float *max)
+{
+ bNodeSocket *sock= (bNodeSocket*)ptr->data;
+ bNodeSocketValueFloat *val= (bNodeSocketValueFloat*)sock->default_value;
+ *min = val->min;
+ *max = val->max;
+}
+
+static void rna_NodeSocketVector_range(PointerRNA *ptr, float *min, float *max)
+{
+ bNodeSocket *sock= (bNodeSocket*)ptr->data;
+ bNodeSocketValueVector *val= (bNodeSocketValueVector*)sock->default_value;
+ *min = val->min;
+ *max = val->max;
}
static void rna_Node_mapping_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -454,18 +550,22 @@ static EnumPropertyItem *rna_Node_channel_itemf(bContext *UNUSED(C), PointerRNA
static bNode *rna_NodeTree_node_new(bNodeTree *ntree, bContext *UNUSED(C), ReportList *reports, int type, bNodeTree *group)
{
bNode *node;
+ bNodeTemplate ntemp;
if (type == NODE_GROUP && group == NULL) {
BKE_reportf(reports, RPT_ERROR, "node type \'GROUP\' missing group argument");
return NULL;
}
- node = nodeAddNodeType(ntree, type, group, NULL);
-
+
+ ntemp.type = type;
+ ntemp.ngroup = group;
+ node = nodeAddNode(ntree, &ntemp);
+
if (node == NULL) {
BKE_reportf(reports, RPT_ERROR, "Unable to create node");
}
else {
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntreeUpdateTree(ntree); /* update group node socket links*/
NodeTagChanged(ntree, node);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
@@ -495,7 +595,7 @@ static bNode *rna_NodeTree_node_composite_new(bNodeTree *ntree, bContext *C, Rep
}
ntreeCompositForceHidden(ntree, CTX_data_scene(C));
- ntreeSolveOrder(ntree);
+ ntreeUpdateTree(ntree);
}
return node;
@@ -523,7 +623,7 @@ static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNod
id_us_min(node->id);
nodeFreeNode(ntree, node);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntreeUpdateTree(ntree); /* update group node socket links*/
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
@@ -551,9 +651,7 @@ static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, b
if(ret) {
NodeTagChanged(ntree, tonode);
- nodeGroupVerify(ntree); /* update group node socket links*/
-
- ntreeSolveOrder(ntree);
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
@@ -567,8 +665,7 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod
}
else {
nodeRemLink(ntree, link);
- ntreeSolveOrder(ntree);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
@@ -577,9 +674,10 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod
static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
{
/* XXX should check if tree is a group here! no good way to do this currently. */
- bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_IN);
+ bNodeSocket *gsock= node_group_add_socket(ntree, name, type, SOCK_IN);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_IN;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -587,9 +685,10 @@ static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(
static bNodeSocket *rna_NodeTree_output_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
{
/* XXX should check if tree is a group here! no good way to do this currently. */
- bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_OUT);
+ bNodeSocket *gsock= node_group_add_socket(ntree, name, type, SOCK_OUT);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_OUT;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -606,11 +705,12 @@ static bNodeSocket *rna_NodeTree_input_expose(bNodeTree *ntree, ReportList *repo
BKE_reportf(reports, RPT_ERROR, "Socket is not an input");
else {
/* XXX should check if tree is a group here! no good way to do this currently. */
- gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_IN);
+ gsock = node_group_add_socket(ntree, sock->name, sock->type, SOCK_IN);
if (add_link)
nodeAddLink(ntree, NULL, gsock, node, sock);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_IN;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -629,11 +729,12 @@ static bNodeSocket *rna_NodeTree_output_expose(bNodeTree *ntree, ReportList *rep
BKE_reportf(reports, RPT_ERROR, "Socket is not an output");
else {
/* XXX should check if tree is a group here! no good way to do this currently. */
- gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_OUT);
+ gsock = node_group_add_socket(ntree, sock->name, sock->type, SOCK_OUT);
if (add_link)
nodeAddLink(ntree, node, sock, NULL, gsock);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_OUT;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -668,14 +769,16 @@ static EnumPropertyItem node_ycc_items[] = {
{ 2, "JFIF", 0, "Jpeg", ""},
{0, NULL, 0, NULL, NULL}};
-#define MaxNodes 1000
+#define MaxNodes 50000
enum
{
Category_GroupNode,
+ Category_LoopNode,
+ Category_LayoutNode,
Category_ShaderNode,
Category_CompositorNode,
- Category_TextureNode
+ Category_TextureNode,
};
typedef struct NodeInfo
@@ -715,9 +818,10 @@ static void init(void)
#include "rna_nodetree_types.h"
- #undef DefNode
-
reg_node(NODE_GROUP, Category_GroupNode, "GROUP", "NodeGroup", "Node", "Group", "");
+ reg_node(NODE_FORLOOP, Category_LoopNode, "FORLOOP", "NodeForLoop", "Node", "ForLoop", "");
+ reg_node(NODE_WHILELOOP, Category_LoopNode, "WHILELOOP", "NodeWhileLoop", "Node", "WhileLoop", "");
+ reg_node(NODE_FRAME, Category_LayoutNode, "FRAME", "NodeFrame", "Node", "Frame", "");
}
static StructRNA* def_node(BlenderRNA *brna, int node_id)
@@ -793,6 +897,41 @@ static void def_group(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
}
+static void def_forloop(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_struct_type(prop, "NodeTree");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Node Tree", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
+}
+
+static void def_whileloop(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_struct_type(prop, "NodeTree");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Node Tree", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
+
+ prop = RNA_def_property(srna, "max_iterations", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "custom1");
+ RNA_def_property_range(prop, 0.0f, 10000000.0f);
+ RNA_def_property_ui_text(prop, "Max. Iterations", "Limit for number of iterations");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
+}
+
+static void def_frame(StructRNA *srna)
+{
+// PropertyRNA *prop;
+
+}
static void def_math(StructRNA *srna)
{
@@ -2510,94 +2649,112 @@ static void rna_def_node_socket(BlenderRNA *brna)
srna = RNA_def_struct(brna, "NodeSocket", NULL);
RNA_def_struct_ui_text(srna, "Node Socket", "Input or output socket of a node");
- RNA_def_struct_refine_func(srna, "rna_NodeSocketType_refine");
RNA_def_struct_sdna(srna, "bNodeSocket");
+ RNA_def_struct_refine_func(srna, "rna_NodeSocket_refine");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
+ prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, node_socket_type_items);
+ RNA_def_property_enum_default(prop, 0);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Type", "Node Socket type");
+
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
/* XXX must be editable for group sockets. if necessary use a special rna definition for these */
// RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Name", "Socket name");
RNA_def_struct_name_property(srna, prop);
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroupSocket_update");
-
- /* can add back if there is any use in reading them */
-#if 0
- prop = RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "ns.min");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Minimum Value", "");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
-
- prop = RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "ns.max");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Maximum Value", "");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
-#endif
-
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_enum_items(prop, node_socket_type_items);
- RNA_def_property_ui_text(prop, "Type", "Node Socket type");
}
-static void rna_def_node_socket_value(BlenderRNA *brna)
+static void rna_def_node_socket_subtype(BlenderRNA *brna, int type, int subtype, const char *name, const char *ui_name)
{
StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "ValueNodeSocket", "NodeSocket");
- RNA_def_struct_ui_text(srna, "Value Node Socket", "Input or output socket of a node");
+ PropertyRNA *prop=NULL;
+ PropertySubType propsubtype= PROP_NONE;
+
+ #define SUBTYPE(socktype, stypename, id, idname) { PROP_##id, #id, 0, #idname, ""},
+ static EnumPropertyItem subtype_items[] = {
+ NODE_DEFINE_SUBTYPES
+ {0, NULL, 0, NULL, NULL}
+ };
+ #undef SUBTYPE
+
+ #define SUBTYPE(socktype, stypename, id, idname) if (subtype==PROP_##id) propsubtype = PROP_##id;
+ NODE_DEFINE_SUBTYPES
+ #undef SUBTYPE
+
+ srna = RNA_def_struct(brna, name, "NodeSocket");
+ RNA_def_struct_ui_text(srna, ui_name, "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "ns.vec");
- RNA_def_property_array(prop, 1);
- RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
- RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range");
-}
-
-static void rna_def_node_socket_vector(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "VectorNodeSocket", "NodeSocket");
- RNA_def_struct_ui_text(srna, "Vector Node Socket", "Input or output socket of a node");
- RNA_def_struct_sdna(srna, "bNodeSocket");
- RNA_def_struct_ui_icon(srna, ICON_PLUG);
- RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_float_sdna(prop, NULL, "ns.vec");
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
- RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range");
-}
-
-static void rna_def_node_socket_rgba(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "RGBANodeSocket", "NodeSocket");
- RNA_def_struct_ui_text(srna, "RGBA Node Socket", "Input or output socket of a node");
- RNA_def_struct_sdna(srna, "bNodeSocket");
- RNA_def_struct_ui_icon(srna, ICON_PLUG);
- RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_float_sdna(prop, NULL, "ns.vec");
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
- RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range");
+
+ switch (type) {
+ case SOCK_INT:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueInt", "default_value");
+
+ prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "subtype");
+ RNA_def_property_enum_items(prop, subtype_items);
+ RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "default_value", PROP_INT, propsubtype);
+ RNA_def_property_int_sdna(prop, NULL, "value");
+ RNA_def_property_int_funcs(prop, NULL, NULL, "rna_NodeSocketInt_range");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_FLOAT:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueFloat", "default_value");
+
+ prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "subtype");
+ RNA_def_property_enum_items(prop, subtype_items);
+ RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "default_value", PROP_FLOAT, propsubtype);
+ RNA_def_property_float_sdna(prop, NULL, "value");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketFloat_range");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_BOOLEAN:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueBoolean", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "value", 1);
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_VECTOR:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueVector", "default_value");
+
+ prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "subtype");
+ RNA_def_property_enum_items(prop, subtype_items);
+ RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "default_value", PROP_FLOAT, propsubtype);
+ RNA_def_property_float_sdna(prop, NULL, "value");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketVector_range");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_RGBA:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueRGBA", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR);
+ RNA_def_property_float_sdna(prop, NULL, "value");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ }
}
static void rna_def_node(BlenderRNA *brna)
@@ -2625,6 +2782,11 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Node_name_set");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+ prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "label");
+ RNA_def_property_ui_text(prop, "Label", "Optional custom node label");
+ RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
+
prop = RNA_def_property(srna, "inputs", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "inputs", NULL);
RNA_def_property_struct_type(prop, "NodeSocket");
@@ -2634,18 +2796,19 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "outputs", NULL);
RNA_def_property_struct_type(prop, "NodeSocket");
RNA_def_property_ui_text(prop, "Outputs", "");
-
- prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
- RNA_def_property_string_sdna(prop, NULL, "label");
- RNA_def_property_ui_text(prop, "Label", "Optional custom node label");
- RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "parent");
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Parent", "Parent this node is attached to");
}
static void rna_def_node_link(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
+
srna = RNA_def_struct(brna, "NodeLink", NULL);
RNA_def_struct_ui_text(srna, "NodeLink", "Link between nodes in a node tree");
RNA_def_struct_sdna(srna, "bNodeLink");
@@ -2687,7 +2850,7 @@ static void rna_def_group_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int
RNA_def_function_ui_description(func, "Add a socket to the group tree.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_string(func, "name", "Socket", 32, "Name", "Name of the socket");
- RNA_def_enum(func, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of socket");
+ RNA_def_enum(func, "type", node_socket_type_items, SOCK_FLOAT, "Type", "Type of socket");
/* return value */
parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket.");
RNA_def_function_return(func, parm);
@@ -2708,12 +2871,6 @@ static void rna_def_nodetree(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem nodetree_type_items[] = {
- {NTREE_SHADER, "SHADER", 0, "Shader", ""},
- {NTREE_COMPOSIT, "COMPOSITE", 0, "Composite", ""},
- {NTREE_TEXTURE, "TEXTURE", 0, "Texture", ""},
- {0, NULL, 0, NULL, NULL}};
-
srna = RNA_def_struct(brna, "NodeTree", "ID");
RNA_def_struct_ui_text(srna, "Node Tree", "Node tree consisting of linked nodes used for materials, textures and compositing");
RNA_def_struct_sdna(srna, "bNodeTree");
@@ -2736,6 +2893,7 @@ static void rna_def_nodetree(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
+ RNA_def_property_update(prop, NC_NODE, NULL);
prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -2825,15 +2983,23 @@ void RNA_def_nodetree(BlenderRNA *brna)
{
init();
rna_def_nodetree(brna);
+
rna_def_node_socket(brna);
- rna_def_node_socket_value(brna);
- rna_def_node_socket_vector(brna);
- rna_def_node_socket_rgba(brna);
+
+ /* Generate RNA definitions for all socket subtypes */
+ #define SUBTYPE(socktype, stypename, id, idname) \
+ rna_def_node_socket_subtype(brna, SOCK_##socktype, PROP_##id, "NodeSocket"#stypename#idname, #idname" "#stypename" Node Socket");
+ NODE_DEFINE_SUBTYPES
+ #undef SUBTYPE
+ rna_def_node_socket_subtype(brna, SOCK_BOOLEAN, 0, "NodeSocketBoolean", "Boolean Node Socket");
+ rna_def_node_socket_subtype(brna, SOCK_RGBA, 0, "NodeSocketRGBA", "RGBA Node Socket");
+
rna_def_node(brna);
rna_def_node_link(brna);
rna_def_shader_node(brna);
rna_def_compositor_node(brna);
rna_def_texture_node(brna);
+
rna_def_composite_nodetree(brna);
rna_def_shader_nodetree(brna);
rna_def_texture_nodetree(brna);
@@ -2842,10 +3008,14 @@ void RNA_def_nodetree(BlenderRNA *brna)
#include "rna_nodetree_types.h"
- #undef DefNode
-
define_specific_node(brna, NODE_GROUP, def_group);
+ define_specific_node(brna, NODE_FORLOOP, def_forloop);
+ define_specific_node(brna, NODE_WHILELOOP, def_whileloop);
+ define_specific_node(brna, NODE_FRAME, def_frame);
}
+/* clean up macro definition */
+#undef NODE_DEFINE_SUBTYPES
+
#endif
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index d48df85697a..a624d1d6403 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -26,7 +26,12 @@
* \ingroup RNA
*/
-
+
+/* Empty definitions for undefined macros to avoid warnings */
+#ifndef DefNode
+#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc)
+#endif
+
/* Tree type Node ID RNA def function Enum name Struct name UI Name UI Description */
DefNode( ShaderNode, SH_NODE_OUTPUT, 0, "OUTPUT", Output, "Output", "" )
DefNode( ShaderNode, SH_NODE_MATERIAL, def_sh_material, "MATERIAL", Material, "Material", "" )
@@ -138,3 +143,6 @@ DefNode( TextureNode, TEX_NODE_DECOMPOSE, 0, "DECOM
DefNode( TextureNode, TEX_NODE_VALTONOR, 0, "VALTONOR", ValToNor, "Val to Nor", "" )
DefNode( TextureNode, TEX_NODE_SCALE, 0, "SCALE", Scale, "Scale", "" )
+
+/* undefine macros */
+#undef DefNode
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index ad323b0aba4..571f8d36305 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -132,6 +132,7 @@ EnumPropertyItem object_type_curve_items[] = {
#include "DNA_key_types.h"
#include "DNA_constraint_types.h"
#include "DNA_lattice_types.h"
+#include "DNA_node_types.h"
#include "BKE_armature.h"
#include "BKE_bullet.h"
@@ -857,6 +858,8 @@ static int rna_GameObjectSettings_physics_type_get(PointerRNA *ptr)
if (!(ob->gameflag & OB_COLLISION)) {
if (ob->gameflag & OB_OCCLUDER) {
ob->body_type = OB_BODY_TYPE_OCCLUDER;
+ } else if (ob->gameflag & OB_NAVMESH){
+ ob->body_type = OB_BODY_TYPE_NAVMESH;
} else {
ob->body_type = OB_BODY_TYPE_NO_COLLISION;
}
@@ -886,31 +889,35 @@ static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
switch (ob->body_type) {
case OB_BODY_TYPE_SENSOR:
ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST;
- ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE);
+ ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE|OB_NAVMESH);
break;
case OB_BODY_TYPE_OCCLUDER:
ob->gameflag |= OB_OCCLUDER;
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC);
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_NAVMESH);
+ break;
+ case OB_BODY_TYPE_NAVMESH:
+ ob->gameflag |= OB_NAVMESH;
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_OCCLUDER);
break;
case OB_BODY_TYPE_NO_COLLISION:
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC);
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC|OB_NAVMESH);
break;
case OB_BODY_TYPE_STATIC:
ob->gameflag |= OB_COLLISION;
- ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
case OB_BODY_TYPE_DYNAMIC:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR;
- ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
case OB_BODY_TYPE_RIGID:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR;
- ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
default:
case OB_BODY_TYPE_SOFT:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR;
- ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
/* assume triangle mesh, if no bounds chosen for soft body */
if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH))
@@ -1342,6 +1349,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
{OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", "Soft body"},
{OB_BODY_TYPE_OCCLUDER, "OCCLUDE", 0, "Occlude", "Occluder for optimizing scene rendering"},
{OB_BODY_TYPE_SENSOR, "SENSOR", 0, "Sensor", "Collision Sensor, detects static and dynamic objects but not the other collision sensor objects"},
+ {OB_BODY_TYPE_NAVMESH, "NAVMESH", 0, "NavMesh", "Navigation mesh"},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "GameObjectSettings", NULL);
@@ -1511,6 +1519,15 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "bsoft");
RNA_def_property_ui_text(prop, "Soft Body Settings", "Settings for Bullet soft body simulation");
+ prop= RNA_def_property(srna, "create_obstacle", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_HASOBSTACLE);
+ RNA_def_property_ui_text(prop, "Create obstacle", "Create representation for obstacle simulation");
+
+ prop= RNA_def_property(srna, "obstacle_radius", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH);
+ RNA_def_property_float_sdna(prop, NULL, "obstacleRad");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Obstacle Radius", "Radius of object representation in obstacle simulation");
+
/* state */
prop= RNA_def_property(srna, "states_visible", PROP_BOOLEAN, PROP_LAYER_MEMBER);
@@ -2035,18 +2052,19 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Matrix", "Inverse of object's parent matrix at time of parenting");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
- /* collections */
+ /* modifiers */
+ prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Modifier");
+ RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting the geometric data of the object");
+ rna_def_object_modifiers(brna, prop);
+
+ /* constraints */
prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "Constraint");
RNA_def_property_ui_text(prop, "Constraints", "Constraints affecting the transformation of the object");
// RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, 0, "constraints__add", "constraints__remove");
rna_def_object_constraints(brna, prop);
- prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "Modifier");
- RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting the geometric data of the object");
- rna_def_object_modifiers(brna, prop);
-
/* game engine */
prop= RNA_def_property(srna, "game", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
@@ -2297,6 +2315,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
/* pose */
prop= RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index ba91fc3536b..77fa975761f 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -51,34 +51,34 @@
#include "WM_types.h"
#include "WM_api.h"
-static EnumPropertyItem part_from_items[] = {
+EnumPropertyItem part_from_items[] = {
{PART_FROM_VERT, "VERT", 0, "Verts", ""},
{PART_FROM_FACE, "FACE", 0, "Faces", ""},
{PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_reactor_from_items[] = {
+EnumPropertyItem part_reactor_from_items[] = {
{PART_FROM_VERT, "VERT", 0, "Verts", ""},
{PART_FROM_FACE, "FACE", 0, "Faces", ""},
{PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_dist_items[] = {
+EnumPropertyItem part_dist_items[] = {
{PART_DISTR_JIT, "JIT", 0, "Jittered", ""},
{PART_DISTR_RAND, "RAND", 0, "Random", ""},
{PART_DISTR_GRID, "GRID", 0, "Grid", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_hair_dist_items[] = {
+EnumPropertyItem part_hair_dist_items[] = {
{PART_DISTR_JIT, "JIT", 0, "Jittered", ""},
{PART_DISTR_RAND, "RAND", 0, "Random", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_draw_as_items[] = {
+EnumPropertyItem part_draw_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
{PART_DRAW_DOT, "DOT", 0, "Point", ""},
@@ -88,14 +88,14 @@ static EnumPropertyItem part_draw_as_items[] = {
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_hair_draw_as_items[] = {
+EnumPropertyItem part_hair_draw_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
{PART_DRAW_PATH, "PATH", 0, "Path", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_ren_as_items[] = {
+EnumPropertyItem part_ren_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_HALO, "HALO", 0, "Halo", ""},
{PART_DRAW_LINE, "LINE", 0, "Line", ""},
@@ -106,7 +106,7 @@ static EnumPropertyItem part_ren_as_items[] = {
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_hair_ren_as_items[] = {
+EnumPropertyItem part_hair_ren_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_PATH, "PATH", 0, "Path", ""},
{PART_DRAW_OB, "OBJECT", 0, "Object", ""},
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index e063f8ec85a..7f85a2fa1d7 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -46,6 +46,42 @@ EnumPropertyItem property_type_items[] = {
{PROP_COLLECTION, "COLLECTION", 0, "Collection", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem property_subtype_items[] = {
+ {PROP_NONE, "NONE", 0, "None", ""},
+
+ /* strings */
+ {PROP_FILEPATH, "FILEPATH", 0, "File Path", ""},
+ {PROP_DIRPATH, "DIRPATH", 0, "Directory Path", ""},
+ {PROP_FILENAME, "FILENAME", 0, "File Name", ""},
+
+ /* numbers */
+ {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""},
+ {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
+ {PROP_FACTOR, "FACTOR", 0, "Factor", ""},
+ {PROP_ANGLE, "ANGLE", 0, "Angle", ""},
+ {PROP_TIME, "TIME", 0, "Time", ""},
+ {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""},
+
+ /* number arrays */
+ {PROP_COLOR, "COLOR", 0, "Color", ""},
+ {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
+ {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
+ {PROP_VELOCITY, "VELOCITY", 0, "Velocity", ""},
+ {PROP_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""},
+ {PROP_MATRIX, "MATRIX", 0, "Matrix", ""},
+ {PROP_EULER, "EULER", 0, "Euler Angles", ""},
+ {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""},
+ {PROP_AXISANGLE, "AXISANGLE", 0, "Axis-Angle", ""},
+ {PROP_XYZ, "XYZ", 0, "XYZ", ""},
+ {PROP_XYZ_LENGTH, "XYZ_LENGTH", 0, "XYZ Length", ""},
+ {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Color", ""},
+ {PROP_COORDS, "COORDS", 0, "Coordinates", ""},
+
+ /* booleans */
+ {PROP_LAYER, "LAYER", 0, "Layer", ""},
+ {PROP_LAYER_MEMBER, "LAYER_MEMBER", 0, "Layer Member", ""},
+ {0, NULL, 0, NULL, NULL}};
+
EnumPropertyItem property_unit_items[] = {
{PROP_UNIT_NONE, "NONE", 0, "None", ""},
{PROP_UNIT_LENGTH, "LENGTH", 0, "Length", ""},
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 715cc0fe83e..12206f0ce6a 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -40,6 +40,7 @@
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
#include "DNA_linestyle_types.h"
+#include "BLI_math.h"
/* Include for Bake Options */
#include "RE_pipeline.h"
@@ -442,11 +443,10 @@ static void rna_Scene_preview_range_end_frame_set(PointerRNA *ptr, int value)
data->r.pefra= value;
}
-static void rna_Scene_frame_update(bContext *C, PointerRNA *UNUSED(ptr))
+static void rna_Scene_frame_update(Main *bmain, Scene *UNUSED(current_scene), PointerRNA *ptr)
{
- //Scene *scene= ptr->id.data;
- //ED_update_for_newframe(C);
- sound_seek_scene(C);
+ Scene *scene= (Scene*)ptr->id.data;
+ sound_seek_scene(bmain, scene);
}
static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr)
@@ -2004,6 +2004,96 @@ static void rna_def_freestyle_settings(BlenderRNA *brna)
rna_def_freestyle_linesets(brna, prop);
}
+static void rna_def_scene_game_recast_data(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "SceneGameRecastData", NULL);
+ RNA_def_struct_sdna(srna, "RecastData");
+ RNA_def_struct_nested(brna, srna, "Scene");
+ RNA_def_struct_ui_text(srna, "Recast Data", "Recast data for a Game datablock");
+
+ prop= RNA_def_property(srna, "cell_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "cellsize");
+ RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
+ RNA_def_property_ui_text(prop, "Cell Size", "Rasterized cell size");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "cell_height", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "cellheight");
+ RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
+ RNA_def_property_ui_text(prop, "Cell Height", "Rasterized cell height");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "agent_height", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "agentheight");
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+ RNA_def_property_ui_text(prop, "Agent Height", "Minimum height where the agent can still walk");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "agent_radius", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "agentradius");
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+ RNA_def_property_ui_text(prop, "Agent Radius", "Radius of the agent");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "max_climb", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "agentmaxclimb");
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Climb", "Maximum height between grid cells the agent can climb");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "max_slope", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "agentmaxslope");
+ RNA_def_property_range(prop, 0, M_PI/2);
+ RNA_def_property_ui_text(prop, "Max Slope", "Maximum walkable slope angle in degrees");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+
+ prop= RNA_def_property(srna, "region_min_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "regionminsize");
+ RNA_def_property_ui_range(prop, 0, 150, 1, 2);
+ RNA_def_property_ui_text(prop, "Min Region Size", "Minimum regions size. Smaller regions will be deleted");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "region_merge_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "regionmergesize");
+ RNA_def_property_ui_range(prop, 0, 150, 1, 2);
+ RNA_def_property_ui_text(prop, "Merged Region Size", "Minimum regions size. Smaller regions will be merged");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "edge_max_len", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "edgemaxlen");
+ RNA_def_property_ui_range(prop, 0, 50, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Edge Length", "Maximum contour edge length");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "edge_max_error", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "edgemaxerror");
+ RNA_def_property_ui_range(prop, 0.1, 3.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Edge Error", "Maximum distance error from contour to cells");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "verts_per_poly", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "vertsperpoly");
+ RNA_def_property_ui_range(prop, 3, 12, 1, 0);
+ RNA_def_property_ui_text(prop, "Verts Per Poly", "Max number of vertices per polygon");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "sample_dist", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "detailsampledist");
+ RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "sample_max_error", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "detailsamplemaxerror");
+ RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+}
+
static void rna_def_scene_game_data(BlenderRNA *brna)
{
StructRNA *srna;
@@ -2053,6 +2143,12 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
{GAME_MAT_GLSL, "GLSL", 0, "GLSL", "OpenGL shading language shaders"},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem obstacle_simulation_items[] = {
+ {OBSTSIMULATION_NONE, "NONE", 0, "None", ""},
+ {OBSTSIMULATION_TOI_rays, "RVO (rays)", 0, "RVO (rays)", ""},
+ {OBSTSIMULATION_TOI_cells, "RVO (cells)", 0, "RVO (cells)", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "SceneGameData", NULL);
RNA_def_struct_sdna(srna, "GameData");
RNA_def_struct_nested(brna, srna, "Scene");
@@ -2305,6 +2401,33 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
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, "rna_Scene_glsl_update");
+
+ /* obstacle simulation */
+ prop= RNA_def_property(srna, "obstacle_simulation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "obstacleSimulation");
+ RNA_def_property_enum_items(prop, obstacle_simulation_items);
+ RNA_def_property_ui_text(prop, "Obstacle simulation", "Simulation used for obstacle avoidance in the game engine");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "level_height", PROP_FLOAT, PROP_ACCELERATION);
+ RNA_def_property_float_sdna(prop, NULL, "levelHeight");
+ RNA_def_property_range(prop, 0.0f, 200.0f);
+ RNA_def_property_ui_text(prop, "Level height", "Max difference in heights of obstacles to enable their interaction");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "show_obstacle_simulation", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_OBSTACLE_SIMULATION);
+ RNA_def_property_ui_text(prop, "Visualization", "Enable debug visualization for obstacle simulation");
+
+ /* Recast Settings */
+ prop= RNA_def_property(srna, "recast_data", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "recastData");
+ RNA_def_property_struct_type(prop, "SceneGameRecastData");
+ RNA_def_property_ui_text(prop, "Recast Data", "");
+
+ /* Nestled Data */
+ rna_def_scene_game_recast_data(brna);
}
static void rna_def_scene_render_layer(BlenderRNA *brna)
@@ -3648,7 +3771,6 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
RNA_def_property_int_funcs(prop, NULL, "rna_Scene_current_frame_set", NULL);
RNA_def_property_ui_text(prop, "Current Frame", "Current Frame, to update animation data from python frame_set() instead");
- RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_frame_update");
prop= RNA_def_property(srna, "frame_subframe", PROP_FLOAT, PROP_TIME);
@@ -3867,7 +3989,8 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
-
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
/* Transform Orientations */
prop= RNA_def_property(srna, "orientations", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "transform_spaces", NULL);
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index be4adb405e2..bd1021f038a 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -72,7 +72,8 @@ static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
{
bScreen *sc= (bScreen*)ptr->data;
- /* exception: can't set screens inside of area/region handers */
+ /* exception: can't set screens inside of area/region handers, and must
+ use context so notifier gets to the right window */
if(sc->newscene) {
WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, sc->newscene);
sc->newscene= NULL;
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index d439c2551f1..93ffa62a4c6 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -121,7 +121,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
static EnumPropertyItem prop_noise_type_items[] = {
{MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""},
-#if FFTW3 == 1
+#ifdef WITH_FFTW3
{MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""},
#endif
/* {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 7a7debe1bf5..249cdb28ae1 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -48,6 +48,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "RNA_enum_types.h"
+
EnumPropertyItem space_type_items[] = {
{SPACE_EMPTY, "EMPTY", 0, "Empty", ""},
{SPACE_VIEW3D, "VIEW_3D", 0, "3D View", ""},
@@ -119,6 +121,7 @@ EnumPropertyItem viewport_shade_items[] = {
#include "BKE_paint.h"
#include "ED_image.h"
+#include "ED_node.h"
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_sequencer.h"
@@ -805,10 +808,9 @@ static void rna_SpaceDopeSheetEditor_mode_update(Main *UNUSED(bmain), Scene *sce
/* Space Graph Editor */
-static void rna_SpaceGraphEditor_display_mode_update(bContext *C, PointerRNA *UNUSED(ptr))
+static void rna_SpaceGraphEditor_display_mode_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
- //SpaceIpo *sipo= (SpaceIpo*)(ptr->data);
- ScrArea *sa= CTX_wm_area(C);
+ ScrArea *sa= rna_area_from_space(ptr);
/* after changing view mode, must force recalculation of F-Curve colors
* which can only be achieved using refresh as opposed to redraw
@@ -822,11 +824,10 @@ static int rna_SpaceGraphEditor_has_ghost_curves_get(PointerRNA *ptr)
return (sipo->ghostCurves.first != NULL);
}
-static void rna_Sequencer_display_mode_update(bContext *C, PointerRNA *ptr)
+static void rna_Sequencer_view_type_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
- int view = RNA_enum_get(ptr, "view_type");
-
- ED_sequencer_update_view(C, view);
+ ScrArea *sa= rna_area_from_space(ptr);
+ ED_area_tag_refresh(sa);
}
static float rna_BackgroundImage_opacity_get(PointerRNA *ptr)
@@ -841,6 +842,24 @@ static void rna_BackgroundImage_opacity_set(PointerRNA *ptr, float value)
bgpic->blend = 1.0f - value;
}
+/* Space Node Editor */
+
+static int rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, PointerRNA value)
+{
+ SpaceNode *snode= (SpaceNode*)ptr->data;
+ bNodeTree *ntree= (bNodeTree*)value.data;
+
+ /* exclude group trees, only trees of the active type */
+ return (ntree->nodetype==0 && ntree->type == snode->treetype);
+}
+
+static void rna_SpaceNodeEditor_node_tree_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ SpaceNode *snode= (SpaceNode*)ptr->data;
+
+ ED_node_tree_update(snode, scene);
+}
+
static EnumPropertyItem *rna_SpaceProperties_texture_context_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free)
{
Scene *scene = CTX_data_scene(C);
@@ -1622,6 +1641,7 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, "Grease Pencil", "Grease pencil data for this space");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "use_grease_pencil", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DISPGP);
@@ -1688,8 +1708,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
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 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");
+ RNA_def_property_update(prop, 0, "rna_Sequencer_view_type_update");
/* display type, fairly important */
prop= RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
@@ -1986,7 +2005,6 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, mode_items);
RNA_def_property_ui_text(prop, "Mode", "Editing context being displayed");
- RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, "rna_SpaceGraphEditor_display_mode_update");
/* display */
@@ -2417,12 +2435,6 @@ static void rna_def_space_node(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem tree_type_items[] = {
- {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, "Material", "Material nodes"},
- {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes"},
- {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes"},
- {0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem texture_type_items[] = {
{SNODE_TEX_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Edit texture nodes from Object"},
{SNODE_TEX_WORLD, "WORLD", ICON_WORLD_DATA, "World", "Edit texture nodes from World"},
@@ -2441,7 +2453,7 @@ static void rna_def_space_node(BlenderRNA *brna)
prop= RNA_def_property(srna, "tree_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "treetype");
- RNA_def_property_enum_items(prop, tree_type_items);
+ RNA_def_property_enum_items(prop, nodetree_type_items);
RNA_def_property_ui_text(prop, "Tree Type", "Node tree type to display and edit");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, NULL);
@@ -2462,8 +2474,10 @@ static void rna_def_space_node(BlenderRNA *brna)
prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_SpaceNodeEditor_node_tree_poll");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Node Tree", "Node tree being displayed and edited");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, "rna_SpaceNodeEditor_node_tree_update");
prop= RNA_def_property(srna, "show_backdrop", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_BACKDRAW);
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index a1ce77b061d..890be76c49a 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -48,7 +48,7 @@
#include "BKE_node.h"
-static EnumPropertyItem texture_filter_items[] = {
+EnumPropertyItem texture_filter_items[] = {
{TXF_BOX, "BOX", 0, "Box", ""},
{TXF_EWA, "EWA", 0, "EWA", ""},
{TXF_FELINE, "FELINE", 0, "FELINE", ""},
@@ -1820,6 +1820,8 @@ static void rna_def_texture(BlenderRNA *brna)
rna_def_texture_pointdensity(brna);
rna_def_texture_voxeldata(brna);
/* XXX add more types here .. */
+
+ RNA_api_texture(srna);
}
void RNA_def_texture(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_texture_api.c b/source/blender/makesrna/intern/rna_texture_api.c
index 8d4b73f1f0c..8c63d5da8fd 100644
--- a/source/blender/makesrna/intern/rna_texture_api.c
+++ b/source/blender/makesrna/intern/rna_texture_api.c
@@ -43,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "RE_pipeline.h"
+#include "RE_shader_ext.h"
void save_envmap(struct EnvMap *env, bContext *C, ReportList *reports, const char* filepath, struct Scene *scene, float layout[12])
{
@@ -67,30 +68,59 @@ void clear_envmap(struct EnvMap *env, bContext *C)
}
}
+void texture_evaluate(struct Tex *tex, float value[3], float color_r[3])
+{
+ TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
+ multitex_ext(tex, value, NULL, NULL, 1, &texres);
+
+ color_r[0] = texres.tr;
+ color_r[1] = texres.tg;
+ color_r[2] = texres.tb;
+ color_r[3] = texres.tin;
+}
+
#else
+void RNA_api_texture(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ func= RNA_def_function(srna, "evaluate", "texture_evaluate");
+ RNA_def_function_ui_description(func, "Evaluate the texture at the coordinates given");
+
+ parm= RNA_def_float_vector(func, "value", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ /* return location and normal */
+ parm= RNA_def_float_vector(func, "result", 4, NULL, -FLT_MAX, FLT_MAX, "Result", NULL, -1e4, 1e4);
+ RNA_def_property_flag(parm, PROP_THICK_WRAP);
+ RNA_def_function_output(func, parm);
+
+}
+
void RNA_api_environment_map(StructRNA *srna)
{
FunctionRNA *func;
PropertyRNA *parm;
-
+
static const float default_layout[] = { 0,0, 1,0, 2,0, 0,1, 1,1, 2,1 };
-
+
func= RNA_def_function(srna, "clear", "clear_envmap");
- RNA_def_function_ui_description(func, "Discard the environment map and free it from memory.");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Discard the environment map and free it from memory.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
func= RNA_def_function(srna,"save", "save_envmap");
- RNA_def_function_ui_description(func, "Save the environment map to disc using the scene render settings.");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
-
- parm= RNA_def_string_file_name(func,"filepath","",FILE_MAX,"File path","Location of the output file");
- RNA_def_property_flag(parm, PROP_REQUIRED);
-
- RNA_def_pointer(func, "scene", "Scene", "", "Overrides the scene from which image parameters are taken.");
+ RNA_def_function_ui_description(func, "Save the environment map to disc using the scene render settings.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+
+ parm= RNA_def_string_file_name(func,"filepath","",FILE_MAX,"File path","Location of the output file");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ RNA_def_pointer(func, "scene", "Scene", "", "Overrides the scene from which image parameters are taken.");
- parm = RNA_def_float_array(func, "layout", 12, default_layout, 0.0f, 0.0f, "File layout", "Flat array describing the X,Y position of each cube face in the output image, where 1 is the size of a face. Order is [+Z -Z +Y -X -Y +X]. Use -1 to skip a face.", 0.0f, 0.0f);
+ parm = RNA_def_float_array(func, "layout", 12, default_layout, 0.0f, 0.0f, "File layout", "Flat array describing the X,Y position of each cube face in the output image, where 1 is the size of a face. Order is [+Z -Z +Y -X -Y +X]. Use -1 to skip a face.", 0.0f, 0.0f);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index d4ac9880290..92c93f41dfc 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -46,7 +46,7 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname,
int flag= 0;
if(!prop) {
- RNA_warning("rna_uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 7d0502f1be9..4bc828cdc4f 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1959,6 +1959,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ static float default_dir[3] = {0.f, 1.f, 0.f};
srna= RNA_def_struct(brna, "UserSolidLight", NULL);
RNA_def_struct_sdna(srna, "SolidLight");
@@ -1972,6 +1973,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
prop= RNA_def_property(srna, "direction", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_float_sdna(prop, NULL, "vec");
RNA_def_property_array(prop, 3);
+ RNA_def_property_float_array_default(prop, default_dir);
RNA_def_property_ui_text(prop, "Direction", "The direction that the OpenGL light is shining");
RNA_def_property_update(prop, 0, "rna_UserDef_viewport_lights_update");
@@ -2791,6 +2793,36 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Invert Axes", "Toggle between moving the viewpoint or moving the scene being viewed");
/* in 3Dx docs, this is called 'object mode' vs. 'target camera mode' */
+ /* 3D view: roll */
+ prop= RNA_def_property(srna, "ndof_roll_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROLL_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert roll Axis", "Invert roll axis");
+
+ /* 3D view: tilt */
+ prop= RNA_def_property(srna, "ndof_tilt_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_TILT_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert tilt Axis", "Invert tilt axis");
+
+ /* 3D view: rotate */
+ prop= RNA_def_property(srna, "ndof_rotate_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROTATE_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert rotation Axis", "Invert rotation axis");
+
+ /* 3D view: pan x */
+ prop= RNA_def_property(srna, "ndof_panx_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANX_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert x Axis", "Invert x axis");
+
+ /* 3D view: pan y */
+ prop= RNA_def_property(srna, "ndof_pany_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANY_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert y Axis", "Invert y axis");
+
+ /* 3D view: pan z */
+ prop= RNA_def_property(srna, "ndof_panz_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANZ_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert z Axis", "Invert z axis");
+
/* 3D view: fly */
prop= RNA_def_property(srna, "ndof_lock_horizon", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_LOCK_HORIZON);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 4c07a89a42f..7ce1e1ab88f 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -486,7 +486,8 @@ static void rna_Window_screen_update(bContext *C, PointerRNA *ptr)
{
wmWindow *win= (wmWindow*)ptr->data;
- /* exception: can't set screens inside of area/region handers */
+ /* exception: can't set screens inside of area/region handers, and must
+ use context so notifier gets to the right window */
if(win->newscreen) {
WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, win->newscreen);
win->newscreen= NULL;
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index 72b54dce473..11ec327c306 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -360,7 +360,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "aosamp");
- RNA_def_property_range(prop, 1, 32);
+ RNA_def_property_range(prop, 1, 128);
RNA_def_property_ui_text(prop, "Samples", "Amount of ray samples. Higher values give smoother results and longer rendering times");
RNA_def_property_update(prop, 0, "rna_World_update");
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index d1f153265ac..bdbc51605ba 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -32,13 +32,18 @@ set(INC
../blenlib
../blenloader
../makesdna
+ ../makesrna
../render/extern/include
+ ../editors/include
+ ../gpu
../../../intern/elbeem/extern
../../../intern/guardedalloc
+ ../../../extern/recastnavigation/Recast/Include
)
set(INC_SYS
${ZLIB_INCLUDE_DIRS}
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
@@ -63,6 +68,7 @@ set(SRC
intern/MOD_meshdeform.c
intern/MOD_mirror.c
intern/MOD_multires.c
+ intern/MOD_navmesh.cpp
intern/MOD_none.c
intern/MOD_particleinstance.c
intern/MOD_particlesystem.c
@@ -80,11 +86,16 @@ set(SRC
intern/MOD_uvproject.c
intern/MOD_warp.c
intern/MOD_wave.c
+ intern/MOD_weightvg_util.c
+ intern/MOD_weightvgedit.c
+ intern/MOD_weightvgmix.c
+ intern/MOD_weightvgproximity.c
MOD_modifiertypes.h
intern/MOD_boolean_util.h
intern/MOD_fluidsim_util.h
intern/MOD_util.h
+ intern/MOD_weightvg_util.h
)
if(WITH_MOD_BOOLEAN)
@@ -108,4 +119,8 @@ if(NOT WITH_MOD_FLUID)
add_definitions(-DDISABLE_ELBEEM)
endif()
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
+
blender_add_lib(bf_modifiers "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h
index 4e44a226c64..0ae9768c0e6 100644
--- a/source/blender/modifiers/MOD_modifiertypes.h
+++ b/source/blender/modifiers/MOD_modifiertypes.h
@@ -72,6 +72,10 @@ extern ModifierTypeInfo modifierType_ShapeKey;
extern ModifierTypeInfo modifierType_Solidify;
extern ModifierTypeInfo modifierType_Screw;
extern ModifierTypeInfo modifierType_Warp;
+extern ModifierTypeInfo modifierType_NavMesh;
+extern ModifierTypeInfo modifierType_WeightVGEdit;
+extern ModifierTypeInfo modifierType_WeightVGMix;
+extern ModifierTypeInfo modifierType_WeightVGProximity;
/* MOD_util.c */
void modifier_type_init(ModifierTypeInfo *types[]);
diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript
index d1bb95761ff..f90e637d151 100644
--- a/source/blender/modifiers/SConscript
+++ b/source/blender/modifiers/SConscript
@@ -1,12 +1,14 @@
#!/usr/bin/python
Import ('env')
-sources = env.Glob('intern/*.c')
+sources = env.Glob('intern/*.c') + env.Glob('intern/*.cpp')
incs = '. ./intern'
-incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern'
+incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern #/extern/glew/include'
incs += ' ../render/extern/include ../blenloader'
-incs += ' ../include ../blenlib ../makesdna ../blenkernel ../blenkernel/intern'
+incs += ' ../include ../blenlib ../makesdna ../makesrna ../blenkernel ../blenkernel/intern'
+incs += ' ../editors/include ../gpu'
+incs += ' #extern/recastnavigation/Recast/Include'
incs += ' ' + env['BF_ZLIB_INC']
diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp
new file mode 100644
index 00000000000..bc97023a58b
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_navmesh.cpp
@@ -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):
+*
+* ***** END GPL LICENSE BLOCK *****
+*
+*/
+#include <math.h>
+#include "Recast.h"
+
+extern "C"{
+#include "ED_navmesh_conversion.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_particle.h"
+#include "BKE_customdata.h"
+#include "MEM_guardedalloc.h"
+#include "BIF_gl.h"
+#include "GPU_buffers.h"
+#include "GPU_draw.h"
+#include "UI_resources.h"
+
+static void initData(ModifierData *md)
+{
+ /* NavMeshModifierData *nmmd = (NavMeshModifierData*) md; */ /* UNUSED */
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ /* NavMeshModifierData *nmmd = (NavMeshModifierData*) md; */
+ /* NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; */
+
+ //.todo - deep copy
+}
+
+/*
+static void (*drawFacesSolid_original)(DerivedMesh *dm, float (*partial_redraw_planes)[4],
+ int fast, int (*setMaterial)(int, void *attribs)) = NULL;*/
+
+#ifdef WITH_GAMEENGINE
+
+static void drawNavMeshColored(DerivedMesh *dm)
+{
+ int a, glmode;
+ MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT);
+ MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE);
+ int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ if (!polygonIdx)
+ return;
+ const float BLACK_COLOR[3] = {0.f, 0.f, 0.f};
+ float col[3];
+ /*
+ //UI_ThemeColor(TH_WIRE);
+ glDisable(GL_LIGHTING);
+ glLineWidth(2.0);
+ dm->drawEdges(dm, 0, 1);
+ glLineWidth(1.0);
+ glEnable(GL_LIGHTING);*/
+
+ glDisable(GL_LIGHTING);
+ if(GPU_buffer_legacy(dm) ) {
+ DEBUG_VBO( "Using legacy code. drawNavMeshColored\n" );
+ //glShadeModel(GL_SMOOTH);
+ glBegin(glmode = GL_QUADS);
+ for(a = 0; a < dm->numFaceData; a++, mface++) {
+ int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
+ int polygonIdx = *(int*)CustomData_get(&dm->faceData, a, CD_RECAST);
+ if (polygonIdx<=0)
+ memcpy(col, BLACK_COLOR, 3*sizeof(float));
+ else
+ intToCol(polygonIdx, col);
+
+ if(new_glmode != glmode) {
+ glEnd();
+ glBegin(glmode = new_glmode);
+ }
+ glColor3fv(col);
+ glVertex3fv(mvert[mface->v1].co);
+ glVertex3fv(mvert[mface->v2].co);
+ glVertex3fv(mvert[mface->v3].co);
+ if(mface->v4) {
+ glVertex3fv(mvert[mface->v4].co);
+ }
+ }
+ glEnd();
+ }
+ glEnable(GL_LIGHTING);
+}
+
+static void navDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
+{
+ drawNavMeshColored(dm);
+}
+
+static void navDM_drawFacesSolid(DerivedMesh *dm,
+ float (*partial_redraw_planes)[4],
+ int fast, int (*setMaterial)(int, void *attribs))
+{
+ //drawFacesSolid_original(dm, partial_redraw_planes, fast, setMaterial);
+ drawNavMeshColored(dm);
+}
+#endif /* WITH_GAMEENGINE */
+
+static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,DerivedMesh *dm)
+{
+#ifdef WITH_GAMEENGINE
+ DerivedMesh *result;
+ int maxFaces = dm->getNumFaces(dm);
+
+ result = CDDM_copy(dm);
+ if (!CustomData_has_layer(&result->faceData, CD_RECAST))
+ {
+ int *sourceRecastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE,
+ sourceRecastData, maxFaces, "recastData");
+ }
+ int *recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST);
+ result->drawFacesTex = navDM_drawFacesTex;
+ result->drawFacesSolid = navDM_drawFacesSolid;
+
+
+ //process mesh
+ int vertsPerPoly=0, nverts=0, ndtris=0, npolys=0;
+ float* verts=NULL;
+ unsigned short *dtris=NULL, *dmeshes=NULL, *polys=NULL;
+ int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL;
+
+ bool res = buildNavMeshDataByDerivedMesh(dm, vertsPerPoly, nverts, verts, ndtris, dtris,
+ npolys, dmeshes, polys, dtrisToPolysMap, dtrisToTrisMap,
+ trisToFacesMap);
+ if (res)
+ {
+ //invalidate concave polygon
+ for (size_t polyIdx=0; polyIdx<(size_t)npolys; polyIdx++)
+ {
+ unsigned short* poly = &polys[polyIdx*2*vertsPerPoly];
+ if (!polyIsConvex(poly, vertsPerPoly, verts))
+ {
+ //set negative polygon idx to all faces
+ unsigned short *dmesh = &dmeshes[4*polyIdx];
+ unsigned short tbase = dmesh[2];
+ unsigned short tnum = dmesh[3];
+ for (unsigned short ti=0; ti<tnum; ti++)
+ {
+ unsigned short triidx = dtrisToTrisMap[tbase+ti];
+ unsigned short faceidx = trisToFacesMap[triidx];
+ if (recastData[faceidx]>0)
+ recastData[faceidx] = -recastData[faceidx];
+ }
+ }
+ }
+
+ }
+ else
+ {
+ printf("Error during creation polygon infos\n");
+ }
+
+ //clean up
+ if (verts!=NULL)
+ delete verts;
+ if (dtris!=NULL)
+ delete dtris;
+ if (dmeshes!=NULL)
+ delete dmeshes;
+ if (polys!=NULL)
+ delete polys;
+ if (dtrisToPolysMap!=NULL)
+ delete dtrisToPolysMap;
+ if (dtrisToTrisMap!=NULL)
+ delete dtrisToTrisMap;
+ if (trisToFacesMap!=NULL)
+ delete trisToFacesMap;
+
+ return result;
+#else // WITH_GAMEENGINE
+ return dm;
+#endif // WITH_GAMEENGINE
+}
+
+/*
+static int isDisabled(ModifierData *md, int useRenderParams)
+{
+ NavMeshModifierData *amd = (NavMeshModifierData*) md;
+ return false;
+}*/
+
+
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int useRenderParams, int isFinalCalc)
+{
+ DerivedMesh *result = NULL;
+ NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
+ bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_RECAST)>0;
+ if (ob->body_type!=OB_BODY_TYPE_NAVMESH || !hasRecastData )
+ {
+ //convert to nav mesh object:
+ //1)set physics type
+ ob->gameflag &= ~OB_COLLISION;
+ ob->gameflag |= OB_NAVMESH;
+ ob->body_type = OB_BODY_TYPE_NAVMESH;
+ //2)add and init recast data layer
+ if (!hasRecastData)
+ {
+ Mesh* obmesh = (Mesh *)ob->data;
+ if (obmesh)
+ {
+ int numFaces = obmesh->totface;
+ CustomData_add_layer_named(&obmesh->fdata, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData");
+ int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_RECAST);
+ for (int i=0; i<numFaces; i++)
+ {
+ recastData[i] = i+1;
+ }
+ CustomData_add_layer_named(&derivedData->faceData, CD_RECAST, CD_REFERENCE, recastData, numFaces, "recastData");
+ }
+ }
+ }
+
+ result = createNavMeshForVisualization(nmmd, derivedData);
+
+ return result;
+}
+
+
+ModifierTypeInfo modifierType_NavMesh = {
+ /* name */ "NavMesh",
+ /* structName */ "NavMeshModifierData",
+ /* structSize */ sizeof(NavMeshModifierData),
+ /* type */ eModifierTypeType_Constructive,
+ /* flags */ (ModifierTypeFlag) (eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_Single),
+ /* copyData */ copyData,
+ /* deformVerts */ 0,
+ /* deformMatrices */ 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_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index c5fdf465a0a..486c98f82a0 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -275,7 +275,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (fabsf(screw_ofs) <= (FLT_EPSILON*100.0f) && fabsf(fabsf(angle) - ((float)M_PI * 2.0f)) <= (FLT_EPSILON*100.0f)) {
close= 1;
step_tot--;
- if(step_tot < 2) step_tot= 2;
+ if(step_tot < 3) step_tot= 3;
maxVerts = totvert * step_tot; /* -1 because we're joining back up */
maxEdges = (totvert * step_tot) + /* these are the edges between new verts */
@@ -286,7 +286,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
else {
close= 0;
- if(step_tot < 2) step_tot= 2;
+ if(step_tot < 3) step_tot= 3;
maxVerts = totvert * step_tot; /* -1 because we're joining back up */
maxEdges = (totvert * (step_tot-1)) + /* these are the edges between new verts */
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index e9b835eab81..a2fe947a523 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -295,5 +295,9 @@ void modifier_type_init(ModifierTypeInfo *types[])
INIT_TYPE(Solidify);
INIT_TYPE(Screw);
INIT_TYPE(Warp);
+ INIT_TYPE(NavMesh);
+ INIT_TYPE(WeightVGEdit);
+ INIT_TYPE(WeightVGMix);
+ INIT_TYPE(WeightVGProximity);
#undef INIT_TYPE
}
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c
new file mode 100644
index 00000000000..98615c70553
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.c
@@ -0,0 +1,306 @@
+/*
+ * $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) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_math.h"
+#include "BLI_rand.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_color_types.h" /* CurveMapping. */
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_colortools.h" /* CurveMapping. */
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+#include "RE_shader_ext.h" /* Texture masking. */
+
+/* Maps new_w weights in place, using either one of the predifined functions, or a custom curve.
+ * Return values are in new_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * cmap might be NULL, in which case curve mapping mode will return unmodified data.
+ */
+void weightvg_do_map(int num, float *new_w, short falloff_type, CurveMapping *cmap)
+{
+ int i;
+
+ /* Return immediately, if we have nothing to do! */
+ /* Also security checks... */
+ if(((falloff_type == MOD_WVG_MAPPING_CURVE) && (cmap == NULL))
+ || !ELEM7(falloff_type, MOD_WVG_MAPPING_CURVE, MOD_WVG_MAPPING_SHARP, MOD_WVG_MAPPING_SMOOTH,
+ MOD_WVG_MAPPING_ROOT, MOD_WVG_MAPPING_SPHERE, MOD_WVG_MAPPING_RANDOM,
+ MOD_WVG_MAPPING_STEP))
+ return;
+
+ /* Map each weight (vertex) to its new value, accordingly to the chosen mode. */
+ for(i = 0; i < num; ++i) {
+ float fac = new_w[i];
+
+ /* Code borrowed from the warp modifier. */
+ /* Closely matches PROP_SMOOTH and similar. */
+ switch(falloff_type) {
+ case MOD_WVG_MAPPING_CURVE:
+ fac = curvemapping_evaluateF(cmap, 0, fac);
+ break;
+ case MOD_WVG_MAPPING_SHARP:
+ fac = fac*fac;
+ break;
+ case MOD_WVG_MAPPING_SMOOTH:
+ fac = 3.0f*fac*fac - 2.0f*fac*fac*fac;
+ break;
+ case MOD_WVG_MAPPING_ROOT:
+ fac = (float)sqrt(fac);
+ break;
+ case MOD_WVG_MAPPING_SPHERE:
+ fac = (float)sqrt(2*fac - fac * fac);
+ break;
+ case MOD_WVG_MAPPING_RANDOM:
+ BLI_srand(BLI_rand()); /* random seed */
+ fac = BLI_frand()*fac;
+ break;
+ case MOD_WVG_MAPPING_STEP:
+ fac = (fac >= 0.5f)?1.0f:0.0f;
+ break;
+ }
+
+ new_w[i] = fac;
+ }
+}
+
+/* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor.
+ * Return values are in org_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear.
+ */
+void weightvg_do_mask(int num, const int *indices, float *org_w, const float *new_w,
+ Object *ob, DerivedMesh *dm, float fact, const char defgrp_name[32],
+ Tex *texture, int tex_use_channel, int tex_mapping,
+ Object *tex_map_object, const char *tex_uvlayer_name)
+{
+ int ref_didx;
+ int i;
+
+ /* If influence factor is null, nothing to do! */
+ if (fact == 0.0f) return;
+
+ /* If we want to mask vgroup weights from a texture. */
+ if (texture) {
+ /* The texture coordinates. */
+ float (*tex_co)[3];
+ /* See mapping note below... */
+ MappingInfoModifierData t_map;
+ float (*v_co)[3];
+
+ /* Use new generic get_texture_coords, but do not modify our DNA struct for it...
+ * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ?
+ * What e.g. if a modifier wants to use several textures ?
+ * Why use only v_co, and not MVert (or both) ?
+ */
+ t_map.texture = texture;
+ t_map.map_object = tex_map_object;
+ BLI_strncpy(t_map.uvlayer_name, tex_uvlayer_name, sizeof(t_map.uvlayer_name));
+ t_map.texmapping = tex_mapping;
+ v_co = MEM_mallocN(sizeof(*v_co) * num, "WeightVG Modifier, TEX mode, v_co");
+ dm->getVertCos(dm, v_co);
+ tex_co = MEM_callocN(sizeof(*tex_co) * num, "WeightVG Modifier, TEX mode, tex_co");
+ get_texture_coords(&t_map, ob, dm, v_co, tex_co, num);
+ MEM_freeN(v_co);
+
+ /* For each weight (vertex), make the mix between org and new weights. */
+ for(i = 0; i < num; ++i) {
+ int idx = indices ? indices[i] : i;
+ TexResult texres;
+ float h, s, v; /* For HSV color space. */
+
+ texres.nor = NULL;
+ get_texture_value(texture, tex_co[idx], &texres);
+ /* Get the good channel value... */
+ switch(tex_use_channel) {
+ case MOD_WVG_MASK_TEX_USE_INT:
+ org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0f - (texres.tin*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_RED:
+ org_w[i] = (new_w[i] * texres.tr * fact) + (org_w[i] * (1.0f - (texres.tr*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_GREEN:
+ org_w[i] = (new_w[i] * texres.tg * fact) + (org_w[i] * (1.0f - (texres.tg*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_BLUE:
+ org_w[i] = (new_w[i] * texres.tb * fact) + (org_w[i] * (1.0f - (texres.tb*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_HUE:
+ rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v);
+ org_w[i] = (new_w[i] * h * fact) + (org_w[i] * (1.0f - (h*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_SAT:
+ rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v);
+ org_w[i] = (new_w[i] * s * fact) + (org_w[i] * (1.0f - (s*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_VAL:
+ rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v);
+ org_w[i] = (new_w[i] * v * fact) + (org_w[i] * (1.0f - (v*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_ALPHA:
+ org_w[i] = (new_w[i] * texres.ta * fact) + (org_w[i] * (1.0f - (texres.ta*fact)));
+ break;
+ default:
+ org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0f - (texres.tin*fact)));
+ break;
+ }
+ }
+
+ MEM_freeN(tex_co);
+ }
+ else if ((ref_didx = defgroup_name_index(ob, defgrp_name)) != -1) {
+ MDeformVert *dvert = NULL;
+
+ /* Check whether we want to set vgroup weights from a constant weight factor or a vertex
+ * group.
+ */
+ /* Get vgroup idx from its name. */
+
+ /* Proceed only if vgroup is valid, else use constant factor. */
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* Proceed only if vgroup is valid, else assume factor = O. */
+ if (dvert == NULL) return;
+
+ /* For each weight (vertex), make the mix between org and new weights. */
+ for (i = 0; i < num; i++) {
+ int idx = indices ? indices[i] : i;
+ const float f= defvert_find_weight(&dvert[idx], ref_didx) * fact;
+ org_w[i] = (new_w[i] * f) + (org_w[i] * (1.0f-f));
+ /* If that vertex is not in ref vgroup, assume null factor, and hence do nothing! */
+ }
+ }
+ else {
+ /* Default "influence" behavior. */
+ /* For each weight (vertex), make the mix between org and new weights. */
+ const float ifact= 1.0f - fact;
+ for (i = 0; i < num; i++) {
+ org_w[i] = (new_w[i] * fact) + (org_w[i] * ifact);
+ }
+ }
+}
+
+/* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group.
+ * If indices is not NULL, it must be a table of same length as weights, mapping to the real
+ * vertex index (in case the weight table does not cover the whole vertices...).
+ */
+void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num,
+ const int *indices, const float *weights, int do_add,
+ float add_thresh, int do_rem, float rem_thresh)
+{
+ int i;
+
+ for (i = 0; i < num; i++) {
+ int j;
+ int add2vg = do_add;
+ float w = weights[i];
+ MDeformVert *dv = &dvert[indices ? indices[i] : i];
+ MDeformWeight *newdw;
+
+ /* Never allow weights out of [0.0, 1.0] range. */
+ CLAMP(w, 0.0f, 1.0f);
+
+ /* Let's first check to see if this vert is already in the weight group – if so
+ * let's update it, or remove it if needed.
+ */
+ for (j = 0; j < dv->totweight; j++) {
+ /* If this weight corresponds to the deform group, update the value or,
+ * if lower than rem_threshold, remove the vertex from the vgroup.
+ */
+ if (dv->dw[j].def_nr == defgrp_idx) {
+ /* Remove the vertex from this vgroup if needed. */
+ if (do_rem && w < rem_thresh) {
+ /* TODO, move this into deform.c to make into a generic function */
+
+ dv->totweight--;
+ /* If there are still other deform weights attached to this vert then remove
+ * this deform weight, and reshuffle the others.
+ */
+ if(dv->totweight) {
+ newdw = MEM_mallocN(sizeof(MDeformWeight)*(dv->totweight), "deformWeight");
+ if(dv->dw){
+ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*j);
+ memcpy(newdw+j, dv->dw+j+1, sizeof(MDeformWeight)*(dv->totweight-j));
+ MEM_freeN(dv->dw);
+ }
+ dv->dw = newdw;
+ }
+ /* If there are no other deform weights left then just remove this one. */
+ else {
+ MEM_freeN(dv->dw);
+ dv->dw = NULL;
+ }
+ }
+ /* Else, just set the new computed weight. */
+ else {
+ dv->dw[j].weight = w;
+ }
+ add2vg = FALSE;
+ break;
+ }
+ }
+
+ /* If the vert wasn't in the deform group, add it if needed!
+ */
+ if ((add2vg == TRUE) && w > add_thresh) {
+ /* TODO, mvoe into deform.c and make into a generic function, this assumes the vertex
+ * groups have already been checked, so this has to remain low level */
+ newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "WeightVGEdit Modifier, deformWeight");
+ if(dv->dw) {
+ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
+ MEM_freeN(dv->dw);
+ }
+ dv->dw = newdw;
+ dv->dw[dv->totweight].weight = w;
+ dv->dw[dv->totweight].def_nr = defgrp_idx;
+ dv->totweight++;
+ }
+ }
+}
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h
new file mode 100644
index 00000000000..ce3520f1900
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.h
@@ -0,0 +1,90 @@
+/*
+ * $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) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/modifiers/intern/MOD_util.h
+ * \ingroup modifiers
+ */
+
+
+#ifndef MOD_WEIGHTVG_UTIL_H
+#define MOD_WEIGHTVG_UTIL_H
+
+/* so modifier types match their defines */
+#include "MOD_modifiertypes.h"
+
+struct CurveMapping;
+struct DerivedMesh;
+struct Object;
+struct Tex;
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+/**************************************
+ * Util functions. *
+ **************************************/
+
+/* We cannot divide by zero (what a surprise...).
+ * So if -MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR < weightf < MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR,
+ * we clamp weightf to this value (or its negative version).
+ * Also used to avoid null power factor.
+ */
+#define MOD_WVG_ZEROFLOOR 1.0e-32f
+
+/* Maps new_w weights in place, using either one of the predifined functions, or a custom curve.
+ * Return values are in new_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * cmap might be NULL, in which case curve mapping mode will return unmodified data.
+ */
+void weightvg_do_map(int num, float *new_w, short mode, struct CurveMapping *cmap);
+
+/* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor.
+ * Return values are in org_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear.
+ */
+void weightvg_do_mask(int num, const int *indices, float *org_w, const float *new_w, Object *ob,
+ DerivedMesh *dm, float fact, const char defgrp_name[32], Tex *texture,
+ int tex_use_channel, int tex_mapping, Object *tex_map_object,
+ const char *tex_uvlayer_name);
+
+/* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group.
+ * If indices is not NULL, it must be a table of same length as weights, mapping to the real
+ * vertex index (in case the weight table does not cover the whole vertices...).
+ */
+void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num,
+ const int *indices, const float *weights, int do_add,
+ float add_thresh, int do_rem, float rem_thresh);
+
+#endif /* MOD_WEIGHTVG_UTIL_H */
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c
new file mode 100644
index 00000000000..fb6d4dc10e6
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -0,0 +1,326 @@
+/*
+ * $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) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_utildefines.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+
+#include "DNA_color_types.h" /* CurveMapping. */
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_colortools.h" /* CurveMapping. */
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+
+/**************************************
+ * Modifiers functions. *
+ **************************************/
+static void initData(ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ wmd->edit_flags = 0;
+ wmd->falloff_type = MOD_WVG_MAPPING_NONE;
+ wmd->default_weight = 0.0f;
+
+ wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0);
+ curvemapping_initialize(wmd->cmap_curve);
+
+ wmd->rem_threshold = 0.01f;
+ wmd->add_threshold = 0.01f;
+
+ wmd->mask_constant = 1.0f;
+ wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */
+ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL;
+}
+
+static void freeData(ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ curvemapping_free(wmd->cmap_curve);
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ WeightVGEditModifierData *twmd = (WeightVGEditModifierData*) target;
+
+ BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name));
+
+ twmd->edit_flags = wmd->edit_flags;
+ twmd->falloff_type = wmd->falloff_type;
+ twmd->default_weight = wmd->default_weight;
+
+ twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve);
+
+ twmd->add_threshold = wmd->add_threshold;
+ twmd->rem_threshold = wmd->rem_threshold;
+
+ twmd->mask_constant = wmd->mask_constant;
+ BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name));
+ twmd->mask_texture = wmd->mask_texture;
+ twmd->mask_tex_use_channel = wmd->mask_tex_use_channel;
+ twmd->mask_tex_mapping = wmd->mask_tex_mapping;
+ twmd->mask_tex_map_obj = wmd->mask_tex_map_obj;
+ BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name));
+}
+
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ CustomDataMask dataMask = 0;
+
+ /* We need vertex groups! */
+ dataMask |= CD_MASK_MDEFORMVERT;
+
+ /* Ask for UV coordinates if we need them. */
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV)
+ dataMask |= CD_MASK_MTFACE;
+
+ return dataMask;
+}
+
+static int dependsOnTime(ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ if(wmd->mask_texture)
+ return BKE_texture_dependsOnTime(wmd->mask_texture);
+ return 0;
+}
+
+static void foreachObjectLink(ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ walk(userData, ob, &wmd->mask_tex_map_obj);
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ walk(userData, ob, (ID **)&wmd->mask_texture);
+
+ foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
+}
+
+static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
+{
+ walk(userData, ob, md, "mask_texture");
+}
+
+static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
+ Object *UNUSED(ob), DagNode *obNode)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ DagNode *curNode;
+
+ if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
+ curNode = dag_get_node(forest, wmd->mask_tex_map_obj);
+
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGEdit Modifier");
+ }
+
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGEdit Modifier");
+}
+
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ /* If no vertex group, bypass. */
+ return (wmd->defgrp_name[0] == '\0');
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ DerivedMesh *dm = derivedData, *ret = NULL;
+#if 0
+ Mesh *ob_m = NULL;
+#endif
+ MDeformVert *dvert = NULL;
+ float *org_w; /* Array original weights. */
+ float *new_w; /* Array new weights. */
+ int numVerts;
+ int defgrp_idx;
+ int i;
+ char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
+ /* Flags. */
+ int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
+ int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
+
+ /* Get number of verts. */
+ numVerts = dm->getNumVerts(dm);
+
+ /* Check if we can just return the original mesh.
+ * Must have verts and therefore verts assigned to vgroups to do anything useful!
+ */
+ if ((numVerts == 0) || (ob->defbase.first == NULL))
+ return dm;
+
+ /* Get vgroup idx from its name. */
+ defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+ if (defgrp_idx < 0)
+ return dm;
+
+ /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+ * time! See scene 5 of the WeighVG test file...
+ */
+#if 0
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* If no dverts, return unmodified data... */
+ if (dvert == NULL)
+ return dm;
+
+ /* Get org mesh, only to test whether affected cdata layer has already been copied
+ * somewhere up in the modifiers stack.
+ */
+ ob_m = get_mesh(ob);
+ if (ob_m == NULL)
+ return dm;
+
+ /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
+ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
+ /* XXX Seems to create problems with weightpaint mode???
+ * I'm missing something here, I guess...
+ */
+// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
+ ret = CDDM_copy(dm);
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ ret->release(ret);
+ return dm;
+ }
+ rel_ret = 1;
+ }
+ else
+ ret = dm;
+#else
+ ret = CDDM_copy(dm);
+ rel_ret = 1;
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ if (rel_ret)
+ ret->release(ret);
+ return dm;
+ }
+#endif
+
+ /* Get org weights, assuming 0.0 for vertices not in given vgroup. */
+ org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
+ new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
+ for (i = 0; i < numVerts; i++) {
+ MDeformWeight *dw= defvert_find_index(&dvert[i], defgrp_idx);
+ org_w[i] = new_w[i] = wmd->default_weight;
+
+ if(dw) {
+ org_w[i] = new_w[i] = dw->weight;
+ }
+ }
+
+ /* Do mapping. */
+ if (wmd->falloff_type != MOD_WVG_MAPPING_NONE) {
+ weightvg_do_map(numVerts, new_w, wmd->falloff_type, wmd->cmap_curve);
+ }
+
+ /* Do masking. */
+ weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, ret, wmd->mask_constant,
+ wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
+ wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
+
+ /* Update/add/remove from vgroup. */
+ weightvg_update_vg(dvert, defgrp_idx, numVerts, NULL, org_w, do_add, wmd->add_threshold,
+ do_rem, wmd->rem_threshold);
+
+ /* Freeing stuff. */
+ MEM_freeN(org_w);
+ MEM_freeN(new_w);
+
+ /* Return the vgroup-modified mesh. */
+ return ret;
+}
+
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
+{
+ return applyModifier(md, ob, derivedData, 0, 1);
+}
+
+
+ModifierTypeInfo modifierType_WeightVGEdit = {
+ /* name */ "VertexWeightEdit",
+ /* structName */ "WeightVGEditModifierData",
+ /* structSize */ sizeof(WeightVGEditModifierData),
+ /* type */ eModifierTypeType_Nonconstructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh
+/* |eModifierTypeFlag_SupportsMapping*/
+ |eModifierTypeFlag_SupportsEditmode,
+
+ /* copyData */ copyData,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ applyModifierEM,
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ freeData,
+ /* isDisabled */ isDisabled,
+ /* updateDepgraph */ updateDepgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ foreachTexLink,
+};
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c
new file mode 100644
index 00000000000..f1422a342eb
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -0,0 +1,466 @@
+/*
+ * $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) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_utildefines.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+
+
+/**
+ * This mixes the old weight with the new weight factor.
+ */
+static float mix_weight(float weight, float weight2, char mix_mode)
+{
+#if 0
+ /*
+ * XXX Don't know why, but the switch version takes many CPU time,
+ * and produces lag in realtime playback...
+ */
+ switch (mix_mode)
+ {
+ case MOD_WVG_MIX_ADD:
+ return (weight + weight2);
+ case MOD_WVG_MIX_SUB:
+ return (weight - weight2);
+ case MOD_WVG_MIX_MUL:
+ return (weight * weight2);
+ case MOD_WVG_MIX_DIV:
+ /* Avoid dividing by zero (or really small values). */
+ if (0.0 <= weight2 < MOD_WVG_ZEROFLOOR)
+ weight2 = MOD_WVG_ZEROFLOOR;
+ else if (-MOD_WVG_ZEROFLOOR < weight2)
+ weight2 = -MOD_WVG_ZEROFLOOR;
+ return (weight / weight2);
+ case MOD_WVG_MIX_DIF:
+ return (weight < weight2 ? weight2 - weight : weight - weight2);
+ case MOD_WVG_MIX_AVG:
+ return (weight + weight2) / 2.0;
+ case MOD_WVG_MIX_SET:
+ default:
+ return weight2;
+ }
+#endif
+ if (mix_mode == MOD_WVG_MIX_SET)
+ return weight2;
+ else if (mix_mode == MOD_WVG_MIX_ADD)
+ return (weight + weight2);
+ else if (mix_mode == MOD_WVG_MIX_SUB)
+ return (weight - weight2);
+ else if (mix_mode == MOD_WVG_MIX_MUL)
+ return (weight * weight2);
+ else if (mix_mode == MOD_WVG_MIX_DIV) {
+ /* Avoid dividing by zero (or really small values). */
+ if (weight2 < 0.0f && weight2 > -MOD_WVG_ZEROFLOOR)
+ weight2 = -MOD_WVG_ZEROFLOOR;
+ else if (weight2 >= 0.0f && weight2 < MOD_WVG_ZEROFLOOR)
+ weight2 = MOD_WVG_ZEROFLOOR;
+ return (weight / weight2);
+ }
+ else if (mix_mode == MOD_WVG_MIX_DIF)
+ return (weight < weight2 ? weight2 - weight : weight - weight2);
+ else if (mix_mode == MOD_WVG_MIX_AVG)
+ return (weight + weight2) * 0.5f;
+ else return weight2;
+}
+
+/**************************************
+ * Modifiers functions. *
+ **************************************/
+static void initData(ModifierData *md)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+
+ wmd->default_weight_a = 0.0f;
+ wmd->default_weight_b = 0.0f;
+ wmd->mix_mode = MOD_WVG_MIX_SET;
+ wmd->mix_set = MOD_WVG_SET_AND;
+
+ wmd->mask_constant = 1.0f;
+ wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */
+ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL;
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ WeightVGMixModifierData *twmd = (WeightVGMixModifierData*) target;
+
+ BLI_strncpy(twmd->defgrp_name_a, wmd->defgrp_name_a, sizeof(twmd->defgrp_name_a));
+ BLI_strncpy(twmd->defgrp_name_b, wmd->defgrp_name_b, sizeof(twmd->defgrp_name_b));
+ twmd->default_weight_a = wmd->default_weight_a;
+ twmd->default_weight_b = wmd->default_weight_b;
+ twmd->mix_mode = wmd->mix_mode;
+ twmd->mix_set = wmd->mix_set;
+
+ twmd->mask_constant = wmd->mask_constant;
+ BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name));
+ twmd->mask_texture = wmd->mask_texture;
+ twmd->mask_tex_use_channel = wmd->mask_tex_use_channel;
+ twmd->mask_tex_mapping = wmd->mask_tex_mapping;
+ twmd->mask_tex_map_obj = wmd->mask_tex_map_obj;
+ BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name));
+}
+
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ CustomDataMask dataMask = 0;
+
+ /* We need vertex groups! */
+ dataMask |= CD_MASK_MDEFORMVERT;
+
+ /* Ask for UV coordinates if we need them. */
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV)
+ dataMask |= CD_MASK_MTFACE;
+
+ return dataMask;
+}
+
+static int dependsOnTime(ModifierData *md)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+
+ if(wmd->mask_texture)
+ return BKE_texture_dependsOnTime(wmd->mask_texture);
+ return 0;
+}
+
+static void foreachObjectLink(ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ walk(userData, ob, &wmd->mask_tex_map_obj);
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+
+ walk(userData, ob, (ID **)&wmd->mask_texture);
+
+ foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
+}
+
+static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
+{
+ walk(userData, ob, md, "mask_texture");
+}
+
+static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
+ Object *UNUSED(ob), DagNode *obNode)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ DagNode *curNode;
+
+ if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
+ curNode = dag_get_node(forest, wmd->mask_tex_map_obj);
+
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGMix Modifier");
+ }
+
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGMix Modifier");
+}
+
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ /* If no vertex group, bypass. */
+ return (wmd->defgrp_name_a[0] == '\0');
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ DerivedMesh *dm = derivedData, *ret = NULL;
+#if 0
+ Mesh *ob_m = NULL;
+#endif
+ MDeformVert *dvert = NULL;
+ int numVerts;
+ int defgrp_idx, defgrp_idx2 = -1;
+ float *org_w;
+ float *new_w;
+ int *tidx, *indices = NULL;
+ int numIdx = 0;
+ int i, j;
+ char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
+
+ /* Get number of verts. */
+ numVerts = dm->getNumVerts(dm);
+
+ /* Check if we can just return the original mesh.
+ * Must have verts and therefore verts assigned to vgroups to do anything useful!
+ */
+ if ((numVerts == 0) || (ob->defbase.first == NULL))
+ return dm;
+
+ /* Get vgroup idx from its name. */
+ defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name_a);
+ if (defgrp_idx < 0)
+ return dm;
+ /* Get seconf vgroup idx from its name, if given. */
+ if (wmd->defgrp_name_b[0] != (char)0) {
+ defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name_b);
+ if (defgrp_idx2 < 0)
+ return dm;
+ }
+
+ /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+ * time! See scene 5 of the WeighVG test file...
+ */
+#if 0
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* If no dverts, return unmodified data... */
+ if (dvert == NULL)
+ return dm;
+
+ /* Get org mesh, only to test whether affected cdata layer has already been copied
+ * somewhere up in the modifiers stack.
+ */
+ ob_m = get_mesh(ob);
+ if (ob_m == NULL)
+ return dm;
+
+ /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
+ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
+ /* XXX Seems to create problems with weightpaint mode???
+ * I'm missing something here, I guess...
+ */
+// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
+ ret = CDDM_copy(dm);
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ ret->release(ret);
+ return dm;
+ }
+ rel_ret = 1;
+ }
+ else
+ ret = dm;
+#else
+ ret = CDDM_copy(dm);
+ rel_ret = 1;
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ if (rel_ret)
+ ret->release(ret);
+ return dm;
+ }
+#endif
+
+ /* Find out which vertices to work on. */
+ tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");
+ switch (wmd->mix_set) {
+ case MOD_WVG_SET_A:
+ /* All vertices in first vgroup. */
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_B:
+ /* All vertices in second vgroup. */
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx2) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_OR:
+ /* All vertices in one vgroup or the other. */
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx || dvert[i].dw[j].def_nr == defgrp_idx2) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_AND:
+ /* All vertices in both vgroups. */
+ for (i = 0; i < numVerts; i++) {
+ int idx1 = FALSE;
+ int idx2 = FALSE;
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx) {
+ if (idx2 == TRUE) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ else {
+ idx1 = TRUE;
+ }
+ }
+ else if(dvert[i].dw[j].def_nr == defgrp_idx2) {
+ if (idx1 == TRUE) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ else {
+ idx2 = TRUE;
+ }
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_ALL:
+ default:
+ /* Use all vertices, no need to do anything here. */
+ break;
+ }
+ if (numIdx) {
+ indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGMix Modifier, indices");
+ memcpy(indices, tidx, sizeof(int) * numIdx);
+ }
+ else
+ numIdx = numVerts;
+ MEM_freeN(tidx);
+
+ org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGMix Modifier, org_w");
+ new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGMix Modifier, new_w");
+
+ /* Mix weights. */
+ for (i = 0; i < numIdx; i++) {
+ float weight2 = 0.0;
+ int w1 = FALSE;
+ int w2 = FALSE;
+ int idx = indices ? indices[i] : i;
+ for (j = 0; j < dvert[idx].totweight; j++) {
+ if(dvert[idx].dw[j].def_nr == defgrp_idx) {
+ org_w[i] = dvert[idx].dw[j].weight;
+ w1 = TRUE;
+ if (w2 == TRUE)
+ break;
+ }
+ else if(dvert[idx].dw[j].def_nr == defgrp_idx2) {
+ weight2 = dvert[idx].dw[j].weight;
+ w2 = TRUE;
+ if (w1 == TRUE)
+ break;
+ }
+ }
+ if (w1 == FALSE)
+ org_w[i] = wmd->default_weight_a;
+ if (w2 == FALSE)
+ weight2 = wmd->default_weight_b;
+ new_w[i] = mix_weight(org_w[i], weight2, wmd->mix_mode);
+ }
+
+ /* Do masking. */
+ weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant,
+ wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
+ wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
+
+ /* Update (add to) vgroup.
+ * XXX Depending on the MOD_WVG_SET_xxx option chosen, we might have to add vertices to vgroup.
+ */
+ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, TRUE, -FLT_MAX, 0, 0.0f);
+
+ /* Freeing stuff. */
+ MEM_freeN(org_w);
+ MEM_freeN(new_w);
+
+ if (indices)
+ MEM_freeN(indices);
+
+ /* Return the vgroup-modified mesh. */
+ return ret;
+}
+
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
+{
+ return applyModifier(md, ob, derivedData, 0, 1);
+}
+
+
+ModifierTypeInfo modifierType_WeightVGMix = {
+ /* name */ "VertexWeightMix",
+ /* structName */ "WeightVGMixModifierData",
+ /* structSize */ sizeof(WeightVGMixModifierData),
+ /* type */ eModifierTypeType_Nonconstructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh
+/* |eModifierTypeFlag_SupportsMapping*/
+ |eModifierTypeFlag_SupportsEditmode,
+
+ /* copyData */ copyData,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ applyModifierEM,
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ NULL,
+ /* isDisabled */ isDisabled,
+ /* updateDepgraph */ updateDepgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ foreachTexLink,
+};
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
new file mode 100644
index 00000000000..af3f71d6099
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -0,0 +1,567 @@
+/*
+ * $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) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_editVert.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_shrinkwrap.h" /* For SpaceTransform stuff. */
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+
+/**************************************
+ * Util functions. *
+ **************************************/
+
+/* Util macro. */
+#define OUT_OF_MEMORY() ((void)printf("WeightVGProximity: Out of memory.\n"))
+
+/**
+ * Returns the squared distance between two given points.
+ */
+static float squared_dist(const float *a, const float *b)
+{
+ float tmp[3];
+ VECSUB(tmp, a, b);
+ return INPR(tmp, tmp);
+}
+
+/**
+ * Find nearest vertex and/or edge and/or face, for each vertex (adapted from shrinkwrap.c).
+ */
+static void get_vert2geom_distance(int numVerts, float (*v_cos)[3],
+ float *dist_v, float *dist_e, float *dist_f,
+ DerivedMesh *target, const SpaceTransform *loc2trgt)
+{
+ int i;
+ BVHTreeFromMesh treeData_v = NULL_BVHTreeFromMesh;
+ BVHTreeFromMesh treeData_e = NULL_BVHTreeFromMesh;
+ BVHTreeFromMesh treeData_f = NULL_BVHTreeFromMesh;
+ BVHTreeNearest nearest_v = NULL_BVHTreeNearest;
+ BVHTreeNearest nearest_e = NULL_BVHTreeNearest;
+ BVHTreeNearest nearest_f = NULL_BVHTreeNearest;
+
+ if (dist_v) {
+ /* Create a bvh-tree of the given target's verts. */
+ bvhtree_from_mesh_verts(&treeData_v, target, 0.0, 2, 6);
+ if(treeData_v.tree == NULL) {
+ OUT_OF_MEMORY();
+ return;
+ }
+ }
+ if (dist_e) {
+ /* Create a bvh-tree of the given target's edges. */
+ bvhtree_from_mesh_edges(&treeData_e, target, 0.0, 2, 6);
+ if(treeData_e.tree == NULL) {
+ OUT_OF_MEMORY();
+ return;
+ }
+ }
+ if (dist_f) {
+ /* Create a bvh-tree of the given target's faces. */
+ bvhtree_from_mesh_faces(&treeData_f, target, 0.0, 2, 6);
+ if(treeData_f.tree == NULL) {
+ OUT_OF_MEMORY();
+ return;
+ }
+ }
+
+ /* Setup nearest. */
+ nearest_v.index = nearest_e.index = nearest_f.index = -1;
+ /*nearest_v.dist = nearest_e.dist = nearest_f.dist = FLT_MAX;*/
+ /* Find the nearest vert/edge/face. */
+#ifndef __APPLE__
+#pragma omp parallel for default(none) private(i) firstprivate(nearest_v,nearest_e,nearest_f) \
+ shared(treeData_v,treeData_e,treeData_f,numVerts,v_cos,dist_v,dist_e, \
+ dist_f,loc2trgt) \
+ schedule(static)
+#endif
+ for (i = 0; i < numVerts; ++i) {
+ float tmp_co[3];
+
+ /* Convert the vertex to tree coordinates. */
+ VECCOPY(tmp_co, v_cos[i]);
+ space_transform_apply(loc2trgt, tmp_co);
+
+ /* Use local proximity heuristics (to reduce the nearest search).
+ *
+ * If we already had an hit before, we assume this vertex is going to have a close hit to
+ * that other vertex, so we can initiate the "nearest.dist" with the expected value to that
+ * last hit.
+ * This will lead in prunning of the search tree.
+ */
+ if (dist_v) {
+ nearest_v.dist = nearest_v.index != -1 ? squared_dist(tmp_co, nearest_v.co) : FLT_MAX;
+ /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */
+ BLI_bvhtree_find_nearest(treeData_v.tree, tmp_co, &nearest_v, treeData_v.nearest_callback, &treeData_v);
+ dist_v[i] = sqrtf(nearest_v.dist);
+ }
+ if (dist_e) {
+ nearest_e.dist = nearest_e.index != -1 ? squared_dist(tmp_co, nearest_e.co) : FLT_MAX;
+ /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */
+ BLI_bvhtree_find_nearest(treeData_e.tree, tmp_co, &nearest_e, treeData_e.nearest_callback, &treeData_e);
+ dist_e[i] = sqrtf(nearest_e.dist);
+ }
+ if (dist_f) {
+ nearest_f.dist = nearest_f.index != -1 ? squared_dist(tmp_co, nearest_f.co) : FLT_MAX;
+ /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */
+ BLI_bvhtree_find_nearest(treeData_f.tree, tmp_co, &nearest_f, treeData_f.nearest_callback, &treeData_f);
+ dist_f[i] = sqrtf(nearest_f.dist);
+ }
+ }
+
+ if (dist_v)
+ free_bvhtree_from_mesh(&treeData_v);
+ if (dist_e)
+ free_bvhtree_from_mesh(&treeData_e);
+ if (dist_f)
+ free_bvhtree_from_mesh(&treeData_f);
+}
+
+/**
+ * Returns the real distance between a vertex and another reference object.
+ * Note that it works in final world space (i.e. with constraints etc. applied).
+ */
+static void get_vert2ob_distance(int numVerts, float (*v_cos)[3], float *dist,
+ Object* ob, Object* obr)
+{
+ /* Vertex and ref object coordinates. */
+ float v_wco[3];
+ unsigned int i= numVerts;
+
+ while(i-- > 0) {
+ /* Get world-coordinates of the vertex (constraints and anim included). */
+ mul_v3_m4v3(v_wco, ob->obmat, v_cos[i]);
+ /* Return distance between both coordinates. */
+ dist[i] = len_v3v3(v_wco, obr->obmat[3]);
+ }
+}
+
+/**
+ * Returns the real distance between an object and another reference object.
+ * Note that it works in final world space (i.e. with constraints etc. applied).
+ */
+static float get_ob2ob_distance(const Object* ob, const Object* obr)
+{
+ return len_v3v3(ob->obmat[3], obr->obmat[3]);
+}
+
+/**
+ * Maps distances to weights, with an optionnal “smoothing” mapping.
+ */
+void do_map(float *weights, const int nidx, const float min_d, const float max_d, short mode)
+{
+ const float range_inv= 1.0f / (max_d - min_d); /* invert since multiplication is faster */
+ unsigned int i= nidx;
+ if(max_d == min_d) {
+ while (i-- > 0) {
+ weights[i] = (weights[i] >= max_d) ? 1.0f : 0.0f; /* "Step" behavior... */
+ }
+ }
+ else if(max_d > min_d) {
+ while (i-- > 0) {
+ if (weights[i] >= max_d) weights[i]= 1.0f; /* most likely case first */
+ else if(weights[i] <= min_d) weights[i]= 0.0f;
+ else weights[i]= (weights[i] - min_d) * range_inv;
+ }
+ }
+ else {
+ while (i-- > 0) {
+ if (weights[i] <= max_d) weights[i]= 1.0f; /* most likely case first */
+ else if(weights[i] >= min_d) weights[i]= 0.0f;
+ else weights[i]= (weights[i] - min_d) * range_inv;
+ }
+ }
+
+ if(!ELEM(mode, MOD_WVG_MAPPING_NONE, MOD_WVG_MAPPING_CURVE)) {
+ weightvg_do_map(nidx, weights, mode, NULL);
+ }
+}
+
+/**************************************
+ * Modifiers functions. *
+ **************************************/
+static void initData(ModifierData *md)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+
+ wmd->proximity_mode = MOD_WVG_PROXIMITY_OBJECT;
+ wmd->proximity_flags = MOD_WVG_PROXIMITY_GEOM_VERTS;
+
+ wmd->falloff_type = MOD_WVG_MAPPING_NONE;
+
+ wmd->mask_constant = 1.0f;
+ wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */
+ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL;
+ wmd->max_dist = 1.0f; /* vert arbitrary distance, but don't use 0 */
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ WeightVGProximityModifierData *twmd = (WeightVGProximityModifierData*) target;
+
+ BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name));
+ twmd->proximity_mode = wmd->proximity_mode;
+ twmd->proximity_flags = wmd->proximity_flags;
+ twmd->proximity_ob_target = wmd->proximity_ob_target;
+
+ twmd->falloff_type = wmd->falloff_type;
+
+ twmd->mask_constant = wmd->mask_constant;
+ BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name));
+ twmd->mask_texture = wmd->mask_texture;
+ twmd->mask_tex_use_channel = wmd->mask_tex_use_channel;
+ twmd->mask_tex_mapping = wmd->mask_tex_mapping;
+ twmd->mask_tex_map_obj = wmd->mask_tex_map_obj;
+ BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name));
+ twmd->min_dist = wmd->min_dist;
+ twmd->max_dist = wmd->max_dist;
+}
+
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ CustomDataMask dataMask = 0;
+
+ /* We need vertex groups! */
+ dataMask |= CD_MASK_MDEFORMVERT;
+
+ /* Ask for UV coordinates if we need them. */
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV)
+ dataMask |= CD_MASK_MTFACE;
+
+ return dataMask;
+}
+
+static int dependsOnTime(ModifierData *md)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+
+ if(wmd->mask_texture)
+ return BKE_texture_dependsOnTime(wmd->mask_texture);
+ return 0;
+}
+
+static void foreachObjectLink(ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ walk(userData, ob, &wmd->proximity_ob_target);
+ walk(userData, ob, &wmd->mask_tex_map_obj);
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+
+ walk(userData, ob, (ID **)&wmd->mask_texture);
+
+ foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
+}
+
+static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
+{
+ walk(userData, ob, md, "mask_texture");
+}
+
+static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
+ Object *UNUSED(ob), DagNode *obNode)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ DagNode *curNode;
+
+ if (wmd->proximity_ob_target) {
+ curNode = dag_get_node(forest, wmd->proximity_ob_target);
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGProximity Modifier");
+ }
+
+ if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
+ curNode = dag_get_node(forest, wmd->mask_tex_map_obj);
+
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGProximity Modifier");
+ }
+
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGProximity Modifier");
+}
+
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ /* If no vertex group, bypass. */
+ if (wmd->defgrp_name[0] == '\0') return 1;
+ /* If no target object, bypass. */
+ return (wmd->proximity_ob_target == NULL);
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ DerivedMesh *dm = derivedData, *ret = NULL;
+#if 0
+ Mesh *ob_m = NULL;
+#endif
+ MDeformVert *dvert = NULL;
+ int numVerts;
+ float (*v_cos)[3] = NULL; /* The vertices coordinates. */
+ Object *obr = NULL; /* Our target object. */
+ int defgrp_idx;
+ float *tw = NULL;
+ float *org_w = NULL;
+ float *new_w =NULL;
+ int *tidx, *indices = NULL;
+ int numIdx = 0;
+ int i, j;
+ char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
+
+ /* Get number of verts. */
+ numVerts = dm->getNumVerts(dm);
+
+ /* Check if we can just return the original mesh.
+ * Must have verts and therefore verts assigned to vgroups to do anything useful!
+ */
+ if ((numVerts == 0) || (ob->defbase.first == NULL))
+ return dm;
+
+ /* Get our target object. */
+ obr = wmd->proximity_ob_target;
+ if (obr == NULL)
+ return dm;
+
+ /* Get vgroup idx from its name. */
+ defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+ if (defgrp_idx < 0)
+ return dm;
+
+ /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+ * time! See scene 5 of the WeighVG test file...
+ */
+#if 0
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* If no dverts, return unmodified data... */
+ if (dvert == NULL)
+ return dm;
+
+ /* Get org mesh, only to test whether affected cdata layer has already been copied
+ * somewhere up in the modifiers stack.
+ */
+ ob_m = get_mesh(ob);
+ if (ob_m == NULL)
+ return dm;
+
+ /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
+ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
+ /* XXX Seems to create problems with weightpaint mode???
+ * I'm missing something here, I guess...
+ */
+// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
+ ret = CDDM_copy(dm);
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ ret->release(ret);
+ return dm;
+ }
+ rel_ret = 1;
+ }
+ else
+ ret = dm;
+#else
+ ret = CDDM_copy(dm);
+ rel_ret = 1;
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ if (rel_ret)
+ ret->release(ret);
+ return dm;
+ }
+#endif
+
+ /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight.
+ */
+ tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGProximity Modifier, tidx");
+ tw = MEM_mallocN(sizeof(float) * numVerts, "WeightVGProximity Modifier, tw");
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx) {
+ tidx[numIdx] = i;
+ tw[numIdx++] = dvert[i].dw[j].weight;
+ break;
+ }
+ }
+ }
+ indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices");
+ memcpy(indices, tidx, sizeof(int) * numIdx);
+ org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, org_w");
+ new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, new_w");
+ memcpy(org_w, tw, sizeof(float) * numIdx);
+ MEM_freeN(tidx);
+ MEM_freeN(tw);
+
+ /* Get our vertex coordinates. */
+ v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos");
+ for (i = 0; i < numIdx; i++)
+ ret->getVertCo(ret, indices[i], v_cos[i]);
+
+ /* Compute wanted distances. */
+ if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJECT) {
+ float dist = get_ob2ob_distance(ob, obr);
+ for(i = 0; i < numIdx; i++)
+ new_w[i] = dist;
+ }
+ else if (wmd->proximity_mode == MOD_WVG_PROXIMITY_GEOMETRY) {
+ const short use_trgt_verts = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_VERTS);
+ const short use_trgt_edges = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_EDGES);
+ const short use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_FACES);
+
+ if (use_trgt_verts || use_trgt_edges || use_trgt_faces) {
+ DerivedMesh *target_dm = obr->derivedFinal;
+ if (!target_dm) {
+ if (ELEM3(obr->type, OB_CURVE, OB_SURF, OB_FONT))
+ target_dm = CDDM_from_curve(obr);
+ else if (obr->type == OB_MESH) {
+ Mesh *me = (Mesh*)obr->data;
+ if (me->edit_mesh)
+ target_dm = CDDM_from_editmesh((EditMesh*)me->edit_mesh, me);
+ else
+ target_dm = CDDM_from_mesh(me, obr);
+ }
+ }
+
+ /* We must check that we do have a valid target_dm! */
+ if (target_dm) {
+ SpaceTransform loc2trgt;
+ float *dists_v = use_trgt_verts ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_v") : NULL;
+ float *dists_e = use_trgt_edges ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_e") : NULL;
+ float *dists_f = use_trgt_faces ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_f") : NULL;
+
+ space_transform_setup(&loc2trgt, ob, obr);
+ get_vert2geom_distance(numIdx, v_cos, dists_v, dists_e, dists_f,
+ target_dm, &loc2trgt);
+ for(i = 0; i < numIdx; i++) {
+ new_w[i] = dists_v ? dists_v[i] : FLT_MAX;
+ new_w[i] = dists_e ? minf(dists_e[i], new_w[i]) : new_w[i];
+ new_w[i] = dists_f ? minf(dists_f[i], new_w[i]) : new_w[i];
+ }
+ if(dists_v) MEM_freeN(dists_v);
+ if(dists_e) MEM_freeN(dists_e);
+ if(dists_f) MEM_freeN(dists_f);
+ }
+ /* Else, fall back to default obj2vert behavior. */
+ else {
+ get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr);
+ }
+ }
+ else {
+ get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr);
+ }
+ }
+
+ /* Map distances to weights. */
+ do_map(new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type);
+
+ /* Do masking. */
+ weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant,
+ wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
+ wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
+
+ /* Update vgroup. Note we never add nor remove vertices from vgroup here. */
+ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f);
+
+ /* Freeing stuff. */
+ MEM_freeN(org_w);
+ MEM_freeN(new_w);
+ MEM_freeN(indices);
+ MEM_freeN(v_cos);
+
+ /* Return the vgroup-modified mesh. */
+ return ret;
+}
+
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
+{
+ return applyModifier(md, ob, derivedData, 0, 1);
+}
+
+
+ModifierTypeInfo modifierType_WeightVGProximity = {
+ /* name */ "VertexWeightProximity",
+ /* structName */ "WeightVGProximityModifierData",
+ /* structSize */ sizeof(WeightVGProximityModifierData),
+ /* type */ eModifierTypeType_Nonconstructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh
+/* |eModifierTypeFlag_SupportsMapping*/
+ |eModifierTypeFlag_SupportsEditmode,
+
+ /* copyData */ copyData,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ applyModifierEM,
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ NULL,
+ /* isDisabled */ isDisabled,
+ /* updateDepgraph */ updateDepgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ foreachTexLink,
+};
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index c3bd37c18ee..82848c6a5d7 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -38,117 +38,137 @@ set(INC
set(INC_SYS
${GLEW_INCLUDE_PATH}
+ intern
+ composite
+ shader
+ texture
)
set(SRC
- intern/CMP_nodes/CMP_alphaOver.c
- intern/CMP_nodes/CMP_bilateralblur.c
- intern/CMP_nodes/CMP_blur.c
- intern/CMP_nodes/CMP_brightness.c
- intern/CMP_nodes/CMP_channelMatte.c
- intern/CMP_nodes/CMP_chromaMatte.c
- intern/CMP_nodes/CMP_colorMatte.c
- intern/CMP_nodes/CMP_colorSpill.c
- intern/CMP_nodes/CMP_colorbalance.c
- intern/CMP_nodes/CMP_composite.c
- intern/CMP_nodes/CMP_crop.c
- intern/CMP_nodes/CMP_curves.c
- intern/CMP_nodes/CMP_defocus.c
- intern/CMP_nodes/CMP_diffMatte.c
- intern/CMP_nodes/CMP_dilate.c
- intern/CMP_nodes/CMP_directionalblur.c
- intern/CMP_nodes/CMP_displace.c
- intern/CMP_nodes/CMP_distanceMatte.c
- intern/CMP_nodes/CMP_filter.c
- intern/CMP_nodes/CMP_flip.c
- intern/CMP_nodes/CMP_gamma.c
- intern/CMP_nodes/CMP_glare.c
- intern/CMP_nodes/CMP_hueSatVal.c
- intern/CMP_nodes/CMP_huecorrect.c
- intern/CMP_nodes/CMP_idMask.c
- intern/CMP_nodes/CMP_image.c
- intern/CMP_nodes/CMP_invert.c
- intern/CMP_nodes/CMP_lensdist.c
- intern/CMP_nodes/CMP_levels.c
- intern/CMP_nodes/CMP_lummaMatte.c
- intern/CMP_nodes/CMP_mapUV.c
- intern/CMP_nodes/CMP_mapValue.c
- intern/CMP_nodes/CMP_math.c
- intern/CMP_nodes/CMP_mixrgb.c
- intern/CMP_nodes/CMP_normal.c
- intern/CMP_nodes/CMP_normalize.c
- intern/CMP_nodes/CMP_outputFile.c
- intern/CMP_nodes/CMP_premulkey.c
- intern/CMP_nodes/CMP_rgb.c
- intern/CMP_nodes/CMP_rotate.c
- intern/CMP_nodes/CMP_scale.c
- intern/CMP_nodes/CMP_sepcombHSVA.c
- intern/CMP_nodes/CMP_sepcombRGBA.c
- intern/CMP_nodes/CMP_sepcombYCCA.c
- intern/CMP_nodes/CMP_sepcombYUVA.c
- intern/CMP_nodes/CMP_setalpha.c
- intern/CMP_nodes/CMP_splitViewer.c
- intern/CMP_nodes/CMP_texture.c
- intern/CMP_nodes/CMP_tonemap.c
- intern/CMP_nodes/CMP_translate.c
- intern/CMP_nodes/CMP_valToRgb.c
- intern/CMP_nodes/CMP_value.c
- intern/CMP_nodes/CMP_vecBlur.c
- intern/CMP_nodes/CMP_viewer.c
- intern/CMP_nodes/CMP_zcombine.c
- intern/CMP_util.c
- intern/SHD_nodes/SHD_camera.c
- intern/SHD_nodes/SHD_curves.c
- intern/SHD_nodes/SHD_dynamic.c
- intern/SHD_nodes/SHD_geom.c
- intern/SHD_nodes/SHD_hueSatVal.c
- intern/SHD_nodes/SHD_invert.c
- intern/SHD_nodes/SHD_mapping.c
- intern/SHD_nodes/SHD_material.c
- intern/SHD_nodes/SHD_math.c
- intern/SHD_nodes/SHD_mixRgb.c
- intern/SHD_nodes/SHD_normal.c
- intern/SHD_nodes/SHD_output.c
- intern/SHD_nodes/SHD_rgb.c
- intern/SHD_nodes/SHD_sepcombRGB.c
- intern/SHD_nodes/SHD_squeeze.c
- intern/SHD_nodes/SHD_texture.c
- intern/SHD_nodes/SHD_valToRgb.c
- intern/SHD_nodes/SHD_value.c
- intern/SHD_nodes/SHD_vectMath.c
- intern/SHD_util.c
- intern/TEX_nodes/TEX_at.c
- intern/TEX_nodes/TEX_bricks.c
- intern/TEX_nodes/TEX_checker.c
- intern/TEX_nodes/TEX_compose.c
- intern/TEX_nodes/TEX_coord.c
- intern/TEX_nodes/TEX_curves.c
- intern/TEX_nodes/TEX_decompose.c
- intern/TEX_nodes/TEX_distance.c
- intern/TEX_nodes/TEX_hueSatVal.c
- intern/TEX_nodes/TEX_image.c
- intern/TEX_nodes/TEX_invert.c
- intern/TEX_nodes/TEX_math.c
- intern/TEX_nodes/TEX_mixRgb.c
- intern/TEX_nodes/TEX_output.c
- intern/TEX_nodes/TEX_proc.c
- intern/TEX_nodes/TEX_rotate.c
- intern/TEX_nodes/TEX_scale.c
- intern/TEX_nodes/TEX_texture.c
- intern/TEX_nodes/TEX_translate.c
- intern/TEX_nodes/TEX_valToNor.c
- intern/TEX_nodes/TEX_valToRgb.c
- intern/TEX_nodes/TEX_viewer.c
- intern/TEX_util.c
+ composite/nodes/node_composite_alphaOver.c
+ composite/nodes/node_composite_bilateralblur.c
+ composite/nodes/node_composite_blur.c
+ composite/nodes/node_composite_brightness.c
+ composite/nodes/node_composite_channelMatte.c
+ composite/nodes/node_composite_chromaMatte.c
+ composite/nodes/node_composite_colorMatte.c
+ composite/nodes/node_composite_colorSpill.c
+ composite/nodes/node_composite_colorbalance.c
+ composite/nodes/node_composite_common.c
+ composite/nodes/node_composite_composite.c
+ composite/nodes/node_composite_crop.c
+ composite/nodes/node_composite_curves.c
+ composite/nodes/node_composite_defocus.c
+ composite/nodes/node_composite_diffMatte.c
+ composite/nodes/node_composite_dilate.c
+ composite/nodes/node_composite_directionalblur.c
+ composite/nodes/node_composite_displace.c
+ composite/nodes/node_composite_distanceMatte.c
+ composite/nodes/node_composite_filter.c
+ composite/nodes/node_composite_flip.c
+ composite/nodes/node_composite_gamma.c
+ composite/nodes/node_composite_glare.c
+ composite/nodes/node_composite_hueSatVal.c
+ composite/nodes/node_composite_huecorrect.c
+ composite/nodes/node_composite_idMask.c
+ composite/nodes/node_composite_image.c
+ composite/nodes/node_composite_invert.c
+ composite/nodes/node_composite_lensdist.c
+ composite/nodes/node_composite_levels.c
+ composite/nodes/node_composite_lummaMatte.c
+ composite/nodes/node_composite_mapUV.c
+ composite/nodes/node_composite_mapValue.c
+ composite/nodes/node_composite_math.c
+ composite/nodes/node_composite_mixrgb.c
+ composite/nodes/node_composite_normal.c
+ composite/nodes/node_composite_normalize.c
+ composite/nodes/node_composite_outputFile.c
+ composite/nodes/node_composite_premulkey.c
+ composite/nodes/node_composite_rgb.c
+ composite/nodes/node_composite_rotate.c
+ composite/nodes/node_composite_scale.c
+ composite/nodes/node_composite_sepcombHSVA.c
+ composite/nodes/node_composite_sepcombRGBA.c
+ composite/nodes/node_composite_sepcombYCCA.c
+ composite/nodes/node_composite_sepcombYUVA.c
+ composite/nodes/node_composite_setalpha.c
+ composite/nodes/node_composite_splitViewer.c
+ composite/nodes/node_composite_texture.c
+ composite/nodes/node_composite_tonemap.c
+ composite/nodes/node_composite_translate.c
+ composite/nodes/node_composite_valToRgb.c
+ composite/nodes/node_composite_value.c
+ composite/nodes/node_composite_vecBlur.c
+ composite/nodes/node_composite_viewer.c
+ composite/nodes/node_composite_zcombine.c
+ composite/node_composite_tree.c
+ composite/node_composite_util.c
+
+ shader/nodes/node_shader_camera.c
+ shader/nodes/node_shader_common.c
+ shader/nodes/node_shader_curves.c
+ shader/nodes/node_shader_dynamic.c
+ shader/nodes/node_shader_geom.c
+ shader/nodes/node_shader_hueSatVal.c
+ shader/nodes/node_shader_invert.c
+ shader/nodes/node_shader_mapping.c
+ shader/nodes/node_shader_material.c
+ shader/nodes/node_shader_math.c
+ shader/nodes/node_shader_mixRgb.c
+ shader/nodes/node_shader_normal.c
+ shader/nodes/node_shader_output.c
+ shader/nodes/node_shader_rgb.c
+ shader/nodes/node_shader_sepcombRGB.c
+ shader/nodes/node_shader_squeeze.c
+ shader/nodes/node_shader_texture.c
+ shader/nodes/node_shader_valToRgb.c
+ shader/nodes/node_shader_value.c
+ shader/nodes/node_shader_vectMath.c
+ shader/node_shader_tree.c
+ shader/node_shader_util.c
+
+ texture/nodes/node_texture_at.c
+ texture/nodes/node_texture_bricks.c
+ texture/nodes/node_texture_checker.c
+ texture/nodes/node_texture_common.c
+ texture/nodes/node_texture_compose.c
+ texture/nodes/node_texture_coord.c
+ texture/nodes/node_texture_curves.c
+ texture/nodes/node_texture_decompose.c
+ texture/nodes/node_texture_distance.c
+ texture/nodes/node_texture_hueSatVal.c
+ texture/nodes/node_texture_image.c
+ texture/nodes/node_texture_invert.c
+ texture/nodes/node_texture_math.c
+ texture/nodes/node_texture_mixRgb.c
+ texture/nodes/node_texture_output.c
+ texture/nodes/node_texture_proc.c
+ texture/nodes/node_texture_rotate.c
+ texture/nodes/node_texture_scale.c
+ texture/nodes/node_texture_texture.c
+ texture/nodes/node_texture_translate.c
+ texture/nodes/node_texture_valToNor.c
+ texture/nodes/node_texture_valToRgb.c
+ texture/nodes/node_texture_viewer.c
+ texture/node_texture_tree.c
+ texture/node_texture_util.c
+
intern/node_util.c
+ intern/node_exec.c
+ intern/node_common.c
+ intern/node_socket.c
+
+ composite/node_composite_util.h
+ shader/node_shader_util.h
+ texture/node_texture_util.h
- CMP_node.h
- SHD_node.h
- TEX_node.h
- intern/CMP_util.h
- intern/SHD_util.h
- intern/TEX_util.h
+ NOD_composite.h
+ NOD_shader.h
+ NOD_texture.h
+ NOD_socket.h
intern/node_util.h
+ intern/node_exec.h
+ intern/node_common.h
)
if(WITH_PYTHON)
diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/NOD_composite.h
index 65c9236710f..11ffcc9027f 100644
--- a/source/blender/nodes/CMP_node.h
+++ b/source/blender/nodes/NOD_composite.h
@@ -30,18 +30,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file CMP_node.h
+/** \file NOD_composite.h
* \ingroup nodes
*/
-#ifndef CMP_NODE_H
-#define CMP_NODE_H
+#ifndef NOD_composite_H
+#define NOD_composite_H
#include "BKE_node.h"
+extern bNodeTreeType ntreeType_Composite;
+
/* ****************** types array for all composite nodes ****************** */
+void register_node_type_cmp_group(ListBase *lb);
+void register_node_type_cmp_forloop(ListBase *lb);
+void register_node_type_cmp_whileloop(ListBase *lb);
+
void register_node_type_cmp_rlayers(ListBase *lb);
void register_node_type_cmp_image(ListBase *lb);
void register_node_type_cmp_texture(ListBase *lb);
diff --git a/source/blender/nodes/SHD_node.h b/source/blender/nodes/NOD_shader.h
index 80e5eec6893..6c5ea79e1ee 100644
--- a/source/blender/nodes/SHD_node.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -30,19 +30,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file SHD_node.h
+/** \file NOD_shader.h
* \ingroup nodes
*/
-#ifndef SHD_NODE_H
-#define SHD_NODE_H
+#ifndef NOD_SHADER_H
+#define NOD_SHADER_H
#include "BKE_node.h"
+extern struct bNodeTreeType ntreeType_Shader;
+
/* the type definitions array */
/* ****************** types array for all shaders ****************** */
+void register_node_type_sh_group(ListBase *lb);
+void register_node_type_sh_forloop(ListBase *lb);
+void register_node_type_sh_whileloop(ListBase *lb);
+
void register_node_type_sh_output(ListBase *lb);
void register_node_type_sh_material(ListBase *lb);
void register_node_type_sh_camera(ListBase *lb);
diff --git a/source/blender/nodes/NOD_socket.h b/source/blender/nodes/NOD_socket.h
new file mode 100644
index 00000000000..9ddf159cd9c
--- /dev/null
+++ b/source/blender/nodes/NOD_socket.h
@@ -0,0 +1,90 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file NOD_socket.h
+ * \ingroup nodes
+ */
+
+
+#ifndef NOD_SOCKET_H_
+#define NOD_SOCKET_H_
+
+#include "DNA_listBase.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_node.h"
+
+#include "RNA_types.h"
+
+struct bNodeTree;
+struct bNode;
+struct bNodeStack;
+
+void node_socket_type_init(struct bNodeSocketType *types[]);
+
+struct bNodeSocket *nodeAddInputInt(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, int value, int min, int max);
+struct bNodeSocket *nodeAddOutputInt(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, float value, float min, float max);
+struct bNodeSocket *nodeAddOutputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name, char value);
+struct bNodeSocket *nodeAddOutputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputVector(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, float x, float y, float z, float min, float max);
+struct bNodeSocket *nodeAddOutputVector(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name, float r, float g, float b, float a);
+struct bNodeSocket *nodeAddOutputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name);
+struct bNodeSocket *nodeAddOutputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *node_add_input_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp);
+struct bNodeSocket *node_add_output_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp);
+
+void node_verify_socket_templates(struct bNodeTree *ntree, struct bNode *node);
+
+
+/* Socket Converters */
+
+#define SOCK_VECTOR_X 1
+#define SOCK_VECTOR_Y 2
+#define SOCK_VECTOR_Z 3
+
+#define SOCK_RGBA_R 1
+#define SOCK_RGBA_G 2
+#define SOCK_RGBA_B 3
+#define SOCK_RGBA_A 4
+
+#define SOCK_MESH_VERT_CO 1
+#define SOCK_MESH_VERT_NO 2
+
+#endif
diff --git a/source/blender/nodes/TEX_node.h b/source/blender/nodes/NOD_texture.h
index 23a6b4427af..d098c241583 100644
--- a/source/blender/nodes/TEX_node.h
+++ b/source/blender/nodes/NOD_texture.h
@@ -30,18 +30,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file TEX_node.h
+/** \file NOD_texture.h
* \ingroup nodes
*/
-#ifndef TEX_NODE_H
-#define TEX_NODE_H
+#ifndef NOD_TEXTURE_H
+#define NOD_TEXTURE_H
#include "BKE_node.h"
+extern bNodeTreeType ntreeType_Texture;
+
/* ****************** types array for all texture nodes ****************** */
+void register_node_type_tex_group(ListBase *lb);
+void register_node_type_tex_forloop(ListBase *lb);
+void register_node_type_tex_whileloop(ListBase *lb);
+
void register_node_type_tex_math(ListBase *lb);
void register_node_type_tex_mix_rgb(ListBase *lb);
void register_node_type_tex_valtorgb(ListBase *lb);
diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript
index 8d17c6f5e16..0cbc7b80933 100644
--- a/source/blender/nodes/SConscript
+++ b/source/blender/nodes/SConscript
@@ -2,11 +2,11 @@
Import ('env')
sources = env.Glob('intern/*.c')
-cmpsources = env.Glob('intern/CMP_nodes/*.c')
-shdsources = env.Glob('intern/SHD_nodes/*.c')
-texsources = env.Glob('intern/TEX_nodes/*.c')
-
+cmpsources = env.Glob('composite/*.c') + env.Glob('composite/nodes/*.c')
+shdsources = env.Glob('shader/*.c') + env.Glob('shader/nodes/*.c')
+texsources = env.Glob('texture/*.c') + env.Glob('texture/nodes/*.c')
incs = '. ./intern '
+incs += './composite ./shader ./texture '
incs += '#/intern/guardedalloc ../editors/include ../blenlib ../makesdna'
incs += ' ../render/extern/include ../makesrna '
incs += ' ../imbuf ../avi '
diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c
new file mode 100644
index 00000000000..01e46ed3df9
--- /dev/null
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -0,0 +1,837 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/composite/node_composite_tree.c
+ * \ingroup nodes
+ */
+
+
+#include <stdio.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_threads.h"
+
+#include "BKE_animsys.h"
+#include "BKE_colortools.h"
+#include "BKE_fcurve.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+
+#include "node_exec.h"
+#include "node_util.h"
+
+#include "PIL_time.h"
+
+#include "RNA_access.h"
+
+#include "NOD_composite.h"
+#include "node_composite_util.h"
+
+static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
+{
+ Scene *sce;
+ for(sce= main->scene.first; sce; sce= sce->id.next) {
+ if(sce->nodetree) {
+ func(calldata, &sce->id, sce->nodetree);
+ }
+ }
+}
+
+static void free_node_cache(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->cache) {
+ free_compbuf(sock->cache);
+ sock->cache= NULL;
+ }
+ }
+}
+
+static void free_cache(bNodeTree *ntree)
+{
+ bNode *node;
+ for(node= ntree->nodes.first; node; node= node->next)
+ free_node_cache(ntree, node);
+}
+
+static void update_node(bNodeTree *ntree, bNode *node)
+{
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->cache) {
+ //free_compbuf(sock->cache);
+ //sock->cache= NULL;
+ }
+ }
+ node->need_exec= 1;
+
+ /* individual node update call */
+ if (node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
+}
+
+/* local tree then owns all compbufs */
+static void localize(bNodeTree *UNUSED(localtree), bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ /* ensure new user input gets handled ok */
+ node->need_exec= 0;
+
+ /* move over the compbufs */
+ /* right after ntreeCopyTree() oldsock pointers are valid */
+
+ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ if(node->id) {
+ if(node->flag & NODE_DO_OUTPUT)
+ node->new_node->id= (ID *)copy_image((Image *)node->id);
+ else
+ node->new_node->id= NULL;
+ }
+ }
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ sock->new_sock->cache= sock->cache;
+ compbuf_set_node(sock->new_sock->cache, node->new_node);
+
+ sock->cache= NULL;
+ sock->new_sock->new_sock= sock;
+ }
+ }
+}
+
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+
+ if(lnode->preview && lnode->preview->rect) {
+ nodeFreePreview(lnode->new_node);
+ lnode->new_node->preview= lnode->preview;
+ lnode->preview= NULL;
+ }
+ }
+ }
+ }
+}
+
+static void local_merge(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+ bNodeSocket *lsock;
+
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) {
+ /* image_merge does sanity check for pointers */
+ BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id);
+ }
+ }
+
+ for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) {
+ if(ntreeOutputExists(lnode->new_node, lsock->new_sock)) {
+ lsock->new_sock->cache= lsock->cache;
+ compbuf_set_node(lsock->new_sock->cache, lnode->new_node);
+ lsock->cache= NULL;
+ lsock->new_sock= NULL;
+ }
+ }
+ }
+ }
+}
+
+bNodeTreeType ntreeType_Composite = {
+ /* type */ NTREE_COMPOSIT,
+ /* idname */ "NTCompositing Nodetree",
+
+ /* node_types */ { NULL, NULL },
+
+ /* free_cache */ free_cache,
+ /* free_node_cache */ free_node_cache,
+ /* foreach_nodetree */ foreach_nodetree,
+ /* localize */ localize,
+ /* local_sync */ local_sync,
+ /* local_merge */ local_merge,
+ /* update */ NULL,
+ /* update_node */ update_node
+};
+
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree, int use_tree_data)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+ bNodeSocket *sock;
+
+ if (use_tree_data) {
+ /* XXX hack: prevent exec data from being generated twice.
+ * this should be handled by the renderer!
+ */
+ if (ntree->execdata)
+ return ntree->execdata;
+ }
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
+ exec = ntree_exec_begin(ntree);
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next) {
+ /* initialize needed for groups */
+ node->exec= 0;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ bNodeStack *ns= node_get_socket_stack(exec->stack, sock);
+ if(ns && sock->cache) {
+ ns->data= sock->cache;
+ sock->cache= NULL;
+ }
+ }
+ /* cannot initialize them while using in threads */
+ if(ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) {
+ curvemapping_initialize(node->storage);
+ if(node->type==CMP_NODE_CURVE_RGB)
+ curvemapping_premultiply(node->storage, 0);
+ }
+ }
+
+ if (use_tree_data) {
+ /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
+ * which only store the ntree pointer. Should be fixed at some point!
+ */
+ ntree->execdata = exec;
+ }
+
+ return exec;
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+void ntreeCompositEndExecTree(bNodeTreeExec *exec, int use_tree_data)
+{
+ if(exec) {
+ bNodeTree *ntree= exec->nodetree;
+ bNode *node;
+ bNodeStack *ns;
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next) {
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ if(ns && ns->data) {
+ sock->cache= ns->data;
+ ns->data= NULL;
+ }
+ }
+ if(node->type==CMP_NODE_CURVE_RGB)
+ curvemapping_premultiply(node->storage, 1);
+
+ node->need_exec= 0;
+ }
+
+ ntree_exec_end(exec);
+
+ if (use_tree_data) {
+ /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
+ ntree->execdata = NULL;
+ }
+ }
+}
+
+/* ***************************** threaded version for execute composite nodes ************* */
+/* these are nodes without input, only giving values */
+/* or nodes with only value inputs */
+static int node_only_value(bNode *node)
+{
+ bNodeSocket *sock;
+
+ if(ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_VALUE, CMP_NODE_RGB))
+ return 1;
+
+ /* doing this for all node types goes wrong. memory free errors */
+ if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) {
+ int retval= 1;
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->link)
+ retval &= node_only_value(sock->link->fromnode);
+ }
+ return retval;
+ }
+ return 0;
+}
+
+/* not changing info, for thread callback */
+typedef struct ThreadData {
+ bNodeStack *stack;
+ RenderData *rd;
+} ThreadData;
+
+static void *exec_composite_node(void *nodeexec_v)
+{
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec= nodeexec_v;
+ bNode *node= nodeexec->node;
+ ThreadData *thd= (ThreadData *)node->threaddata;
+
+ node_get_stack(node, thd->stack, nsin, nsout);
+
+ if((node->flag & NODE_MUTED) && (!node_only_value(node))) {
+ /* viewers we execute, for feedback to user */
+ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
+ node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
+ else
+ node_compo_pass_on(node, nsin, nsout);
+ }
+ else if(node->typeinfo->execfunc)
+ node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
+ else if (node->typeinfo->newexecfunc)
+ node->typeinfo->newexecfunc(thd->rd, 0, node, nodeexec->data, nsin, nsout);
+
+ node->exec |= NODE_READY;
+ return 0;
+}
+
+/* return total of executable nodes, for timecursor */
+static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd)
+{
+ bNodeTree *ntree = exec->nodetree;
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec;
+ bNode *node;
+ bNodeSocket *sock;
+ int n, totnode= 0, group_edit= 0;
+
+ /* if we are in group edit, viewer nodes get skipped when group has viewer */
+ for(node= ntree->nodes.first; node; node= node->next)
+ if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
+ if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER))
+ group_edit= 1;
+
+ /* NB: using the exec data list here to have valid dependency sort */
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ int a;
+ node = nodeexec->node;
+
+ node_get_stack(node, exec->stack, nsin, nsout);
+
+ /* test the outputs */
+ /* skip value-only nodes (should be in type!) */
+ if(!node_only_value(node)) {
+ for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
+ if(nsout[a]->data==NULL && nsout[a]->hasoutput) {
+ node->need_exec= 1;
+ break;
+ }
+ }
+ }
+
+ /* test the inputs */
+ for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
+ /* skip viewer nodes in bg render or group edit */
+ if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && (G.background || group_edit))
+ node->need_exec= 0;
+ /* is sock in use? */
+ else if(sock->link) {
+ bNodeLink *link= sock->link;
+
+ /* this is the test for a cyclic case */
+ if(link->fromnode==NULL || link->tonode==NULL);
+ else if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
+ if(link->fromnode->need_exec) {
+ node->need_exec= 1;
+ break;
+ }
+ }
+ else {
+ node->need_exec= 0;
+ printf("Node %s skipped, cyclic dependency\n", node->name);
+ }
+ }
+ }
+
+ if(node->need_exec) {
+
+ /* free output buffers */
+ for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
+ if(nsout[a]->data) {
+ free_compbuf(nsout[a]->data);
+ nsout[a]->data= NULL;
+ }
+ }
+ totnode++;
+ /* printf("node needs exec %s\n", node->name); */
+
+ /* tag for getExecutableNode() */
+ node->exec= 0;
+ }
+ else {
+ /* tag for getExecutableNode() */
+ node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED;
+
+ }
+ }
+
+ /* last step: set the stack values for only-value nodes */
+ /* just does all now, compared to a full buffer exec this is nothing */
+ if(totnode) {
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->need_exec==0 && node_only_value(node)) {
+ if(node->typeinfo->execfunc) {
+ node_get_stack(node, exec->stack, nsin, nsout);
+ node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
+ }
+ }
+ }
+ }
+
+ return totnode;
+}
+
+/* while executing tree, free buffers from nodes that are not needed anymore */
+static void freeExecutableNode(bNodeTreeExec *exec)
+{
+ /* node outputs can be freed when:
+ - not a render result or image node
+ - when node outputs go to nodes all being set NODE_FINISHED
+ */
+ bNodeTree *ntree = exec->nodetree;
+ bNodeExec *nodeexec;
+ bNode *node;
+ bNodeSocket *sock;
+ int n;
+
+ /* set exec flag for finished nodes that might need freed */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type!=CMP_NODE_R_LAYERS)
+ if(node->exec & NODE_FINISHED)
+ node->exec |= NODE_FREEBUFS;
+ }
+ /* clear this flag for input links that are not done yet.
+ * Using the exec data for valid dependency sort.
+ */
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if((node->exec & NODE_FINISHED)==0) {
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ if(sock->link)
+ sock->link->fromnode->exec &= ~NODE_FREEBUFS;
+ }
+ }
+ /* now we can free buffers */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->exec & NODE_FREEBUFS) {
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ bNodeStack *ns= node_get_socket_stack(exec->stack, sock);
+ if(ns && ns->data) {
+ free_compbuf(ns->data);
+ ns->data= NULL;
+ // printf("freed buf node %s \n", node->name);
+ }
+ }
+ }
+ }
+}
+
+static bNodeExec *getExecutableNode(bNodeTreeExec *exec)
+{
+ bNodeExec *nodeexec;
+ bNodeSocket *sock;
+ int n;
+
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ if(nodeexec->node->exec==0) {
+ /* input sockets should be ready */
+ for(sock= nodeexec->node->inputs.first; sock; sock= sock->next) {
+ if(sock->link && sock->link->fromnode)
+ if((sock->link->fromnode->exec & NODE_READY)==0)
+ break;
+ }
+ if(sock==NULL)
+ return nodeexec;
+ }
+ }
+ return NULL;
+}
+
+/* check if texture nodes need exec or end */
+static void ntree_composite_texnode(bNodeTree *ntree, int init)
+{
+ bNode *node;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_TEXTURE && node->id) {
+ Tex *tex= (Tex *)node->id;
+ if(tex->nodetree && tex->use_nodes) {
+ /* has internal flag to detect it only does it once */
+ if(init) {
+ if (!tex->nodetree->execdata)
+ tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree, 1);
+ }
+ else
+ ntreeTexEndExecTree(tex->nodetree->execdata, 1);
+ tex->nodetree->execdata = NULL;
+ }
+ }
+ }
+
+}
+
+/* optimized tree execute test for compositing */
+void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
+{
+ bNodeExec *nodeexec;
+ bNode *node;
+ ListBase threads;
+ ThreadData thdata;
+ int totnode, curnode, rendering= 1, n;
+ bNodeTreeExec *exec= ntree->execdata;
+
+ if(ntree==NULL) return;
+
+ if(do_preview)
+ ntreeInitPreview(ntree, 0, 0);
+
+ if (!ntree->execdata) {
+ /* XXX this is the top-level tree, so we use the ntree->execdata pointer. */
+ exec = ntreeCompositBeginExecTree(ntree, 1);
+ }
+ ntree_composite_texnode(ntree, 1);
+
+ /* prevent unlucky accidents */
+ if(G.background)
+ rd->scemode &= ~R_COMP_CROP;
+
+ /* setup callerdata for thread callback */
+ thdata.rd= rd;
+ thdata.stack= exec->stack;
+
+ /* fixed seed, for example noise texture */
+ BLI_srandom(rd->cfra);
+
+ /* sets need_exec tags in nodes */
+ curnode = totnode= setExecutableNodes(exec, &thdata);
+
+ BLI_init_threads(&threads, exec_composite_node, rd->threads);
+
+ while(rendering) {
+
+ if(BLI_available_threads(&threads)) {
+ nodeexec= getExecutableNode(exec);
+ if(nodeexec) {
+ node = nodeexec->node;
+ 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", curnode, node->name);
+ ntree->stats_draw(ntree->sdh, str);
+ }
+ curnode--;
+
+ node->threaddata = &thdata;
+ node->exec= NODE_PROCESSING;
+ BLI_insert_thread(&threads, nodeexec);
+ }
+ else
+ PIL_sleep_ms(50);
+ }
+ else
+ PIL_sleep_ms(50);
+
+ rendering= 0;
+ /* test for ESC */
+ if(ntree->test_break && ntree->test_break(ntree->tbh)) {
+ for(node= ntree->nodes.first; node; node= node->next)
+ node->exec |= NODE_READY;
+ }
+
+ /* check for ready ones, and if we need to continue */
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->exec & NODE_READY) {
+ if((node->exec & NODE_FINISHED)==0) {
+ BLI_remove_thread(&threads, nodeexec); /* this waits for running thread to finish btw */
+ node->exec |= NODE_FINISHED;
+
+ /* freeing unused buffers */
+ if(rd->scemode & R_COMP_FREE)
+ freeExecutableNode(exec);
+ }
+ }
+ else rendering= 1;
+ }
+ }
+
+ BLI_end_threads(&threads);
+
+ /* XXX top-level tree uses the ntree->execdata pointer */
+ ntreeCompositEndExecTree(exec, 1);
+}
+
+/* *********************************************** */
+
+/* clumsy checking... should do dynamic outputs once */
+static void force_hidden_passes(bNode *node, int passflag)
+{
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ sock->flag &= ~SOCK_UNAVAIL;
+
+ sock= BLI_findlink(&node->outputs, RRES_OUT_Z);
+ if(!(passflag & SCE_PASS_Z)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_NORMAL);
+ if(!(passflag & SCE_PASS_NORMAL)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_VEC);
+ if(!(passflag & SCE_PASS_VECTOR)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_UV);
+ if(!(passflag & SCE_PASS_UV)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_RGBA);
+ if(!(passflag & SCE_PASS_RGBA)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_DIFF);
+ if(!(passflag & SCE_PASS_DIFFUSE)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_SPEC);
+ if(!(passflag & SCE_PASS_SPEC)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_SHADOW);
+ if(!(passflag & SCE_PASS_SHADOW)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_AO);
+ if(!(passflag & SCE_PASS_AO)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_REFLECT);
+ if(!(passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT);
+ if(!(passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_INDIRECT);
+ if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB);
+ if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA);
+ if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_MIST);
+ if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT);
+ if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_ENV);
+ if(!(passflag & SCE_PASS_ENVIRONMENT)) sock->flag |= SOCK_UNAVAIL;
+
+}
+
+/* based on rules, force sockets hidden always */
+void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if( node->type==CMP_NODE_R_LAYERS) {
+ Scene *sce= node->id?(Scene *)node->id:curscene;
+ SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+ if(srl)
+ force_hidden_passes(node, srl->passflag);
+ }
+ else if( node->type==CMP_NODE_IMAGE) {
+ Image *ima= (Image *)node->id;
+ if(ima) {
+ if(ima->rr) {
+ ImageUser *iuser= node->storage;
+ RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
+ if(rl)
+ force_hidden_passes(node, rl->passflag);
+ else
+ force_hidden_passes(node, 0);
+ }
+ else if(ima->type!=IMA_TYPE_MULTILAYER) { /* if ->rr not yet read we keep inputs */
+ force_hidden_passes(node, RRES_OUT_Z);
+ }
+ else
+ force_hidden_passes(node, 0);
+ }
+ else
+ force_hidden_passes(node, 0);
+ }
+ }
+
+}
+
+/* called from render pipeline, to tag render input and output */
+/* need to do all scenes, to prevent errors when you re-render 1 scene */
+void ntreeCompositTagRender(Scene *curscene)
+{
+ Scene *sce;
+
+ for(sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if(sce->nodetree) {
+ bNode *node;
+
+ for(node= sce->nodetree->nodes.first; node; node= node->next) {
+ if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE)
+ NodeTagChanged(sce->nodetree, node);
+ else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */
+ NodeTagChanged(sce->nodetree, node);
+ }
+ }
+ }
+}
+
+static int node_animation_properties(bNodeTree *ntree, bNode *node)
+{
+ bNodeSocket *sock;
+ const ListBase *lb;
+ Link *link;
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ /* check to see if any of the node's properties have fcurves */
+ RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
+ lb = RNA_struct_type_properties(ptr.type);
+
+ for (link=lb->first; link; link=link->next) {
+ int driven, len=1, index;
+ prop = (PropertyRNA *)link;
+
+ if (RNA_property_array_check(prop))
+ len = RNA_property_array_length(&ptr, prop);
+
+ for (index=0; index<len; index++) {
+ if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
+ NodeTagChanged(ntree, node);
+ return 1;
+ }
+ }
+ }
+
+ /* now check node sockets */
+ for (sock = node->inputs.first; sock; sock=sock->next) {
+ int driven, len=1, index;
+
+ RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
+ prop = RNA_struct_find_property(&ptr, "default_value");
+ if (prop) {
+ if (RNA_property_array_check(prop))
+ len = RNA_property_array_length(&ptr, prop);
+
+ for (index=0; index<len; index++) {
+ if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
+ NodeTagChanged(ntree, node);
+ return 1;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* tags nodes that have animation capabilities */
+int ntreeCompositTagAnimated(bNodeTree *ntree)
+{
+ bNode *node;
+ int tagged= 0;
+
+ if(ntree==NULL) return 0;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+
+ tagged = node_animation_properties(ntree, node);
+
+ /* otherwise always tag these node types */
+ if(node->type==CMP_NODE_IMAGE) {
+ Image *ima= (Image *)node->id;
+ if(ima && ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+ NodeTagChanged(ntree, node);
+ tagged= 1;
+ }
+ }
+ else if(node->type==CMP_NODE_TIME) {
+ NodeTagChanged(ntree, node);
+ tagged= 1;
+ }
+ /* here was tag render layer, but this is called after a render, so re-composites fail */
+ else if(node->type==NODE_GROUP) {
+ if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) {
+ NodeTagChanged(ntree, node);
+ }
+ }
+ }
+
+ return tagged;
+}
+
+
+/* called from image window preview */
+void ntreeCompositTagGenerators(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if( ELEM(node->type, CMP_NODE_R_LAYERS, CMP_NODE_IMAGE))
+ NodeTagChanged(ntree, node);
+ }
+}
+
+/* XXX after render animation system gets a refresh, this call allows composite to end clean */
+void ntreeClearTags(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ node->need_exec= 0;
+ if(node->type==NODE_GROUP)
+ ntreeClearTags((bNodeTree *)node->id);
+ }
+}
diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/composite/node_composite_util.c
index a763f34a644..78f97c5289e 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/composite/node_composite_util.c
@@ -27,12 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_util.c
+/** \file blender/nodes/composite/node_composite_util.c
* \ingroup nodes
*/
-#include "CMP_util.h"
+#include "node_composite_util.h"
CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc)
{
@@ -67,7 +67,7 @@ CompBuf *dupalloc_compbuf(CompBuf *cbuf)
{
CompBuf *dupbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1);
if(dupbuf) {
- memmove(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y);
+ memcpy(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y);
dupbuf->xof= cbuf->xof;
dupbuf->yof= cbuf->yof;
@@ -156,7 +156,7 @@ void node_compo_pass_on(bNode *node, bNodeStack **nsin, bNodeStack **nsout)
if(valbuf || colbuf || vecbuf) {
for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
if(nsout[a]->hasoutput) {
- if(sock->type==SOCK_VALUE && valbuf) {
+ if(sock->type==SOCK_FLOAT && valbuf) {
nsout[a]->data= pass_on_compbuf(valbuf);
valbuf= NULL;
}
@@ -1325,7 +1325,7 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
if (src->x < 3) xy &= ~(int) 1;
if (src->y < 3) xy &= ~(int) 2;
if (xy < 1) return;
-
+
// see "Recursive Gabor Filtering" by Young/VanVliet
// all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200
if (sigma >= 3.556)
diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/composite/node_composite_util.h
index 3f37eae2af9..57ebe2191dd 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/composite/node_composite_util.h
@@ -27,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_util.h
+/** \file blender/nodes/composite/node_composite_util.h
* \ingroup nodes
*/
-#ifndef CMP_NODE_UTILS_H_
-#define CMP_NODE_UTILS_H_
+#ifndef NODE_COMPOSITE_UTIL_H_
+#define NODE_COMPOSITE_UTIL_H_
#include <stdlib.h>
#include <string.h>
@@ -70,7 +70,6 @@
#include "BKE_library.h"
#include "BKE_object.h"
-#include "../CMP_node.h"
#include "node_util.h"
#include "IMB_imbuf_types.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
index 9dcdfaf21e6..551f716e72b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+++ b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+/** \file blender/nodes/composite/nodes/node_composite_alphaOver.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** ALPHAOVER ******************** */
-static bNodeSocketType cmp_node_alphaover_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f},
- { 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},
+static bNodeSocketTemplate cmp_node_alphaover_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_alphaover_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_alphaover_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -140,7 +140,7 @@ static void node_composit_exec_alphaover(void *UNUSED(data), bNode *node, bNodeS
}
}
-static void node_alphaover_init(bNode* node)
+static void node_alphaover_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats");
}
@@ -149,8 +149,8 @@ void register_node_type_cmp_alphaover(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_alphaover_in, cmp_node_alphaover_out);
+ node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_alphaover_in, cmp_node_alphaover_out);
node_type_size(&ntype, 80, 40, 120);
node_type_init(&ntype, node_alphaover_init);
node_type_storage(&ntype, "NodeTwoFloats", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
index c106b437e17..e8e6e164983 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+/** \file blender/nodes/composite/nodes/node_composite_bilateralblur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** BILATERALBLUR ******************** */
-static bNodeSocketType cmp_node_bilateralblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_bilateralblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_bilateralblur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_bilateralblur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -247,7 +247,7 @@ static void node_composit_exec_bilateralblur(void *UNUSED(data), bNode *node, bN
free_compbuf(new);
}
-static void node_composit_init_bilateralblur(bNode* node)
+static void node_composit_init_bilateralblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeBilateralBlurData *nbbd= MEM_callocN(sizeof(NodeBilateralBlurData), "node bilateral blur data");
node->storage= nbbd;
@@ -259,8 +259,8 @@ void register_node_type_cmp_bilateralblur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_bilateralblur_in, cmp_node_bilateralblur_out);
+ node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_bilateralblur_in, cmp_node_bilateralblur_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_bilateralblur);
node_type_storage(&ntype, "NodeBilateralBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c
index 718578a921b..cd37404e677 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_blur.c
@@ -28,21 +28,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_blur.c
+/** \file blender/nodes/composite/nodes/node_composite_blur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** BLUR ******************** */
-static bNodeSocketType cmp_node_blur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Size", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_blur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Size", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_blur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_blur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -713,7 +713,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
generate_preview(data, node, out[0]->data);
}
-static void node_composit_init_blur(bNode* node)
+static void node_composit_init_blur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= MEM_callocN(sizeof(NodeBlurData), "node blur data");
}
@@ -722,8 +722,8 @@ void register_node_type_cmp_blur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_blur_in, cmp_node_blur_out);
+ node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_blur_in, cmp_node_blur_out);
node_type_size(&ntype, 120, 80, 200);
node_type_init(&ntype, node_composit_init_blur);
node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c b/source/blender/nodes/composite/nodes/node_composite_brightness.c
index 50a8d05b03d..55d890e6d31 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
+++ b/source/blender/nodes/composite/nodes/node_composite_brightness.c
@@ -28,24 +28,24 @@
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_brightness.c
+/** \file blender/nodes/composite/nodes/node_composite_brightness.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Brigh and contrsast ******************** */
-static bNodeSocketType cmp_node_brightcontrast_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Bright", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Contrast", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate cmp_node_brightcontrast_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Bright", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Contrast", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_brightcontrast_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_brightcontrast_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -100,8 +100,8 @@ void register_node_type_cmp_brightcontrast(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_brightcontrast_in, cmp_node_brightcontrast_out);
+ node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_brightcontrast_in, cmp_node_brightcontrast_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_brightcontrast);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
index e395716f36d..1e3992a7185 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_channelMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Channel Matte Node ********************************* */
-static bNodeSocketType cmp_node_channel_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_channel_matte_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_channel_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_channel_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -187,7 +187,7 @@ static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack
}
-static void node_composit_init_channel_matte(bNode *node)
+static void node_composit_init_channel_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage=c;
@@ -206,8 +206,8 @@ void register_node_type_cmp_channel_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_channel_matte_in, cmp_node_channel_matte_out);
+ node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_channel_matte_in, cmp_node_channel_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_channel_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
index 03230f2e212..49c90e85621 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_chromaMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Chroma Key ********************************************************** */
-static bNodeSocketType cmp_node_chroma_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_chroma_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_chroma_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_chroma_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -178,7 +178,7 @@ static void node_composit_exec_chroma_matte(void *data, bNode *node, bNodeStack
}
-static void node_composit_init_chroma_matte(bNode *node)
+static void node_composit_init_chroma_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage= c;
@@ -193,8 +193,8 @@ void register_node_type_cmp_chroma_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_chroma_in, cmp_node_chroma_out);
+ node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_chroma_in, cmp_node_chroma_out);
node_type_size(&ntype, 200, 80, 300);
node_type_init(&ntype, node_composit_init_chroma_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
index 55d77a902b9..b17052ed542 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_colorMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Color Key ********************************************************** */
-static bNodeSocketType cmp_node_color_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_color_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -114,7 +114,7 @@ static void node_composit_exec_color_matte(void *data, bNode *node, bNodeStack *
free_compbuf(cbuf);
}
-static void node_composit_init_color_matte(bNode *node)
+static void node_composit_init_color_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node color");
node->storage= c;
@@ -129,8 +129,8 @@ void register_node_type_cmp_color_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_color_in, cmp_node_color_out);
+ node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_color_in, cmp_node_color_out);
node_type_size(&ntype, 200, 80, 300);
node_type_init(&ntype, node_composit_init_color_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c
index 905d97709c3..418d6802cec 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+/** \file blender/nodes/composite/nodes/node_composite_colorSpill.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
#define avg(a,b) ((a+b)/2)
/* ******************* 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_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_spill_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{-1,0,""}
};
-static bNodeSocketType cmp_node_color_spill_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_spill_out[]={
+ {SOCK_RGBA,0,"Image"},
{-1,0,""}
};
@@ -315,7 +315,7 @@ static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNod
free_compbuf(spillmap);
}
-static void node_composit_init_color_spill(bNode *node)
+static void node_composit_init_color_spill(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeColorspill *ncs= MEM_callocN(sizeof(NodeColorspill), "node colorspill");
node->storage=ncs;
@@ -330,8 +330,8 @@ void register_node_type_cmp_color_spill(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS,
- cmp_node_color_spill_in, cmp_node_color_spill_out);
+ node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_color_spill_in, cmp_node_color_spill_out);
node_type_size(&ntype, 140, 80, 200);
node_type_init(&ntype, node_composit_init_color_spill);
node_type_storage(&ntype, "NodeColorspill", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
index 4074ea2fa29..6bce18c14ef 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+/** \file blender/nodes/composite/nodes/node_composite_colorbalance.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Color Balance ********************************* */
-static bNodeSocketType cmp_node_colorbalance_in[]={
- {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_colorbalance_in[]={
+ {SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_colorbalance_out[]={
- {SOCK_RGBA,0,"Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_colorbalance_out[]={
+ {SOCK_RGBA,0,"Image"},
{-1,0,""}
};
@@ -175,7 +175,7 @@ static void node_composit_exec_colorbalance(void *UNUSED(data), bNode *node, bNo
}
}
-static void node_composit_init_colorbalance(bNode *node)
+static void node_composit_init_colorbalance(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeColorBalance *n= node->storage= MEM_callocN(sizeof(NodeColorBalance), "node colorbalance");
@@ -188,8 +188,8 @@ void register_node_type_cmp_colorbalance(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_colorbalance_in, cmp_node_colorbalance_out);
+ node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_colorbalance_in, cmp_node_colorbalance_out);
node_type_size(&ntype, 400, 200, 400);
node_type_init(&ntype, node_composit_init_colorbalance);
node_type_storage(&ntype, "NodeColorBalance", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/composite/nodes/node_composite_common.c b/source/blender/nodes/composite/nodes/node_composite_common.c
new file mode 100644
index 00000000000..d5ae442c25f
--- /dev/null
+++ b/source/blender/nodes/composite/nodes/node_composite_common.c
@@ -0,0 +1,373 @@
+/*
+ * $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 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva,
+ * Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/composite/nodes/node_composite_common.c
+ * \ingroup cmpnodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
+
+#include "node_composite_util.h"
+#include "node_common.h"
+#include "node_exec.h"
+
+#if 0
+static void PRINT_BUFFERS(bNodeTreeExec *exec)
+{
+ bNodeTree *ntree= exec->nodetree;
+ bNode *node;
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int i;
+
+ printf("-------------- DEBUG --------------\n");
+ for (sock=ntree->inputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("%d. Tree Input %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ for (sock=ntree->outputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("%d. Tree Output %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ for (node=ntree->nodes.first; node; node=node->next) {
+ printf("Node %s:\n", node->name);
+ for (sock=node->inputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("\t%d. Input %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ for (sock=node->outputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("\t%d. Output %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ }
+}
+#endif
+
+static void copy_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+
+ /* tag as copy to prevent freeing */
+ to->is_copy = 1;
+ }
+}
+
+static void move_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+ to->is_copy = from->is_copy;
+
+ zero_v4(from->vec);
+ from->data = NULL;
+ from->datatype = 0;
+ from->is_copy = 0;
+ }
+}
+
+/**** GROUP ****/
+
+static void *group_initexec(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNodeTreeExec *exec;
+ bNodeSocket *sock;
+ bNodeStack *ns;
+
+ /* initialize the internal node tree execution */
+ exec = ntreeCompositBeginExecTree(ngroup, 0);
+
+ /* tag group outputs as external to prevent freeing */
+ for (sock=ngroup->outputs.first; sock; sock=sock->next) {
+ if (!(sock->flag & SOCK_INTERNAL)) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ ns->external = 1;
+ }
+ }
+
+ return exec;
+}
+
+static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+{
+ bNodeTreeExec *gexec= (bNodeTreeExec*)nodedata;
+
+ ntreeCompositEndExecTree(gexec, 0);
+}
+
+/* Copy inputs to the internal stack.
+ * This is a shallow copy, no buffers are duplicated here!
+ */
+static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(ns, in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_move_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ move_stack(out[a], ns);
+ }
+ }
+}
+
+/* Free internal buffers */
+static void group_free_internal(bNodeTreeExec *gexec) {
+ bNodeStack *ns;
+ int i;
+
+ for (i=0, ns=gexec->stack; i < gexec->stacksize; ++i, ++ns) {
+ if (!ns->external && !ns->is_copy) {
+ if (ns->data) {
+ free_compbuf(ns->data);
+ ns->data = NULL;
+ }
+ }
+ }
+}
+
+static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ group_copy_inputs(node, in, exec->stack);
+ ntreeExecNodes(exec, data, thread);
+ group_free_internal(exec);
+ group_move_outputs(node, out, exec->stack);
+}
+
+void register_node_type_cmp_group(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_group_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_group_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+/**** FOR LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+/* Move the results from the previous iteration back to the input sockets. */
+static void loop_iteration_reset(bNodeTree *ngroup, bNodeStack *gstack)
+{
+ bNodeSocket *gin, *gout;
+ bNodeStack *nsin, *nsout;
+
+ gin = ngroup->inputs.first;
+ gout = ngroup->outputs.first;
+
+ while (gin && gout) {
+ /* skip static (non-looping) sockets */
+ while (gin && !(gin->flag & SOCK_DYNAMIC))
+ gin=gin->next;
+ while (gout && !(gout->flag & SOCK_DYNAMIC))
+ gout=gout->next;
+
+ if (gin && gout) {
+ nsin = node_get_socket_stack(gstack, gin);
+ nsout = node_get_socket_stack(gstack, gout);
+
+ move_stack(nsin, nsout);
+
+ gin=gin->next;
+ gout=gout->next;
+ }
+ }
+}
+
+static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ int totiterations= (int)in[0]->vec[0];
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ /* "Iteration" socket */
+ sock = exec->nodetree->inputs.first;
+ ns = node_get_socket_stack(exec->stack, sock);
+
+ group_copy_inputs(node, in, exec->stack);
+ for (iteration=0; iteration < totiterations; ++iteration) {
+ /* first input contains current iteration counter */
+ ns->vec[0] = (float)iteration;
+
+ if (iteration > 0)
+ loop_iteration_reset(exec->nodetree, exec->stack);
+ ntreeExecNodes(exec, data, thread);
+ group_free_internal(exec);
+ }
+ group_move_outputs(node, out, exec->stack);
+}
+
+void register_node_type_cmp_forloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_forloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_forloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
+
+
+/**** WHILE LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ int condition= (in[0]->vec[0] > 0.0f);
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ /* "Condition" socket */
+ sock = exec->nodetree->outputs.first;
+ ns = node_get_socket_stack(exec->stack, sock);
+
+ iteration = 0;
+ group_copy_inputs(node, in, exec->stack);
+ while (condition && iteration < node->custom1) {
+ if (iteration > 0)
+ loop_iteration_reset(exec->nodetree, exec->stack);
+ ntreeExecNodes(exec, data, thread);
+ group_free_internal(exec);
+
+// PRINT_BUFFERS(exec);
+
+ condition = (ns->vec[0] > 0.0f);
+ ++iteration;
+ }
+ group_move_outputs(node, out, exec->stack);
+}
+
+void register_node_type_cmp_whileloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_whileloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_whileloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/composite/nodes/node_composite_composite.c
index fb68f56ae64..492e5c28459 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
+++ b/source/blender/nodes/composite/nodes/node_composite_composite.c
@@ -27,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_composite.c
+/** \file blender/nodes/composite/nodes/node_composite_composite.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** COMPOSITE ******************** */
-static bNodeSocketType cmp_node_composite_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_composite_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
@@ -103,8 +103,8 @@ void register_node_type_cmp_composite(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- cmp_node_composite_in, NULL);
+ node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_composite_in, NULL);
node_type_size(&ntype, 80, 60, 200);
node_type_exec(&ntype, node_composit_exec_composite);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/composite/nodes/node_composite_crop.c
index 0331217f0cb..b8c539b6d66 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
+++ b/source/blender/nodes/composite/nodes/node_composite_crop.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_crop.c
+/** \file blender/nodes/composite/nodes/node_composite_crop.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Crop ******************** */
-static bNodeSocketType cmp_node_crop_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_crop_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_crop_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_crop_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -103,7 +103,7 @@ static void node_composit_exec_crop(void *UNUSED(data), bNode *node, bNodeStack
}
}
-static void node_composit_init_crop(bNode* node)
+static void node_composit_init_crop(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeTwoXYs *nxy= MEM_callocN(sizeof(NodeTwoXYs), "node xy data");
node->storage= nxy;
@@ -117,8 +117,8 @@ void register_node_type_cmp_crop(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_crop_in, cmp_node_crop_out);
+ node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_crop_in, cmp_node_crop_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_crop);
node_type_storage(&ntype, "NodeTwoXYs", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/composite/nodes/node_composite_curves.c
index 921c5e21fea..58074eaca57 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
+++ b/source/blender/nodes/composite/nodes/node_composite_curves.c
@@ -27,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_curves.c
+/** \file blender/nodes/composite/nodes/node_composite_curves.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** CURVE Time ******************** */
/* custom1 = sfra, custom2 = efra */
-static bNodeSocketType cmp_node_time_out[]= {
- { SOCK_VALUE, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_time_out[]= {
+ { SOCK_FLOAT, 0, "Fac"},
{ -1, 0, "" }
};
@@ -57,7 +57,7 @@ static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack *
}
-static void node_composit_init_curves_time(bNode* node)
+static void node_composit_init_curves_time(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= 1;
node->custom2= 250;
@@ -68,8 +68,8 @@ void register_node_type_cmp_curve_time(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, cmp_node_time_out);
+ node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_time_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_curves_time);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -82,13 +82,13 @@ void register_node_type_cmp_curve_time(ListBase *lb)
/* **************** CURVE VEC ******************** */
-static bNodeSocketType cmp_node_curve_vec_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_vec_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_curve_vec_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_vec_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
{ -1, 0, "" }
};
@@ -100,7 +100,7 @@ static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeS
curvemapping_evaluate_premulRGBF(node->storage, out[0]->vec, in[0]->vec);
}
-static void node_composit_init_curve_vec(bNode* node)
+static void node_composit_init_curve_vec(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
}
@@ -109,8 +109,8 @@ void register_node_type_cmp_curve_vec(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_curve_vec_in, cmp_node_curve_vec_out);
+ node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_curve_vec_in, cmp_node_curve_vec_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_composit_init_curve_vec);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -121,16 +121,16 @@ void register_node_type_cmp_curve_vec(ListBase *lb)
/* **************** CURVE RGB ******************** */
-static bNodeSocketType cmp_node_curve_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_curve_rgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_rgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -187,7 +187,7 @@ static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeS
}
-static void node_composit_init_curve_rgb(bNode* node)
+static void node_composit_init_curve_rgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
@@ -196,8 +196,8 @@ void register_node_type_cmp_curve_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_curve_rgb_in, cmp_node_curve_rgb_out);
+ node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_curve_rgb_in, cmp_node_curve_rgb_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_composit_init_curve_rgb);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c
index f249e2cff6c..84a084591c5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
+++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_defocus.c
+/** \file blender/nodes/composite/nodes/node_composite_defocus.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ************ qdn: Defocus node ****************** */
-static bNodeSocketType cmp_node_defocus_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_defocus_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_defocus_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_defocus_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -857,7 +857,7 @@ static void node_composit_exec_defocus(void *UNUSED(data), bNode *node, bNodeSta
if (zbuf_use && (zbuf_use != zbuf)) free_compbuf(zbuf_use);
}
-static void node_composit_init_defocus(bNode* node)
+static void node_composit_init_defocus(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
/* qdn: defocus node */
NodeDefocus *nbd = MEM_callocN(sizeof(NodeDefocus), "node defocus data");
@@ -878,8 +878,8 @@ void register_node_type_cmp_defocus(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_defocus_in, cmp_node_defocus_out);
+ node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_defocus_in, cmp_node_defocus_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_defocus);
node_type_storage(&ntype, "NodeDefocus", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
index 296053298da..23bcf57e2bc 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_diffMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* channel Difference Matte ********************************* */
-static bNodeSocketType cmp_node_diff_matte_in[]={
- {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_diff_matte_in[]={
+ {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_diff_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_diff_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -125,7 +125,7 @@ static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack **
free_compbuf(imbuf2);
}
-static void node_composit_init_diff_matte(bNode *node)
+static void node_composit_init_diff_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage= c;
@@ -137,8 +137,8 @@ void register_node_type_cmp_diff_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_diff_matte_in, cmp_node_diff_matte_out);
+ node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_diff_matte_in, cmp_node_diff_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_diff_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c b/source/blender/nodes/composite/nodes/node_composite_dilate.c
index f5d16ff0ab8..c774045a12f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_dilate.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_dilate.c
+/** \file blender/nodes/composite/nodes/node_composite_dilate.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Dilate/Erode ******************** */
-static bNodeSocketType cmp_node_dilateerode_in[]= {
- { SOCK_VALUE, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_dilateerode_in[]= {
+ { SOCK_FLOAT, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_dilateerode_out[]= {
- { SOCK_VALUE, 0, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_dilateerode_out[]= {
+ { SOCK_FLOAT, 0, "Mask"},
{ -1, 0, "" }
};
@@ -152,8 +152,8 @@ void register_node_type_cmp_dilateerode(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_dilateerode_in, cmp_node_dilateerode_out);
+ node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_dilateerode_in, cmp_node_dilateerode_out);
node_type_size(&ntype, 130, 100, 320);
node_type_exec(&ntype, node_composit_exec_dilateerode);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
index 2a8bbcc9ad5..1a5e3150f53 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+/** \file blender/nodes/composite/nodes/node_composite_directionalblur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_dblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f, 0.f, 1.f},
+static bNodeSocketTemplate cmp_node_dblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_dblur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_dblur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -122,7 +123,7 @@ static void node_composit_exec_dblur(void *UNUSED(data), bNode *node, bNodeStack
out[0]->data= dblur(node, new, ndbd->iter, ndbd->wrap, ndbd->center_x, ndbd->center_y, ndbd->distance, ndbd->angle, ndbd->spin, ndbd->zoom);
}
-static void node_composit_init_dblur(bNode* node)
+static void node_composit_init_dblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeDBlurData *ndbd= MEM_callocN(sizeof(NodeDBlurData), "node dblur data");
node->storage= ndbd;
@@ -134,8 +135,8 @@ void register_node_type_cmp_dblur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_dblur_in, cmp_node_dblur_out);
+ node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_dblur_in, cmp_node_dblur_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_dblur);
node_type_storage(&ntype, "NodeDBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/composite/nodes/node_composite_displace.c
index 9139edf8560..28d220eb4c9 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
+++ b/source/blender/nodes/composite/nodes/node_composite_displace.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_displace.c
+/** \file blender/nodes/composite/nodes/node_composite_displace.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Displace ******************** */
-static bNodeSocketType cmp_node_displace_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Vector", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "X Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
- { SOCK_VALUE, 1, "Y Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+static bNodeSocketTemplate cmp_node_displace_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_VECTOR, 1, "Vector", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_TRANSLATION},
+ { SOCK_FLOAT, 1, "X Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Y Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_displace_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_displace_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -188,8 +188,8 @@ void register_node_type_cmp_displace(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_displace_in, cmp_node_displace_out);
+ node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_displace_in, cmp_node_displace_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_displace);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
index 5f7613464c1..b186be5500b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_distanceMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* channel Distance Matte ********************************* */
-static bNodeSocketType cmp_node_distance_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_distance_matte_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_distance_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_distance_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -122,7 +122,7 @@ static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStac
free_compbuf(inbuf);
}
-static void node_composit_init_distance_matte(bNode *node)
+static void node_composit_init_distance_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage= c;
@@ -134,8 +134,8 @@ void register_node_type_cmp_distance_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_distance_matte_in, cmp_node_distance_matte_out);
+ node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_distance_matte_in, cmp_node_distance_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_distance_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c b/source/blender/nodes/composite/nodes/node_composite_filter.c
index 915cb01d2d4..64a4c69b671 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
+++ b/source/blender/nodes/composite/nodes/node_composite_filter.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_filter.c
+/** \file blender/nodes/composite/nodes/node_composite_filter.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** FILTER ******************** */
-static bNodeSocketType cmp_node_filter_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 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},
+static bNodeSocketTemplate cmp_node_filter_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_filter_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_filter_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -226,8 +226,8 @@ void register_node_type_cmp_filter(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_filter_in, cmp_node_filter_out);
+ node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_filter_in, cmp_node_filter_out);
node_type_size(&ntype, 80, 40, 120);
node_type_label(&ntype, node_filter_label);
node_type_exec(&ntype, node_composit_exec_filter);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c b/source/blender/nodes/composite/nodes/node_composite_flip.c
index b5fd7b46e03..931aacbe6fd 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
+++ b/source/blender/nodes/composite/nodes/node_composite_flip.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_flip.c
+/** \file blender/nodes/composite/nodes/node_composite_flip.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Flip ******************** */
-static bNodeSocketType cmp_node_flip_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_flip_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_flip_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_flip_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -94,8 +94,8 @@ void register_node_type_cmp_flip(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_flip_in, cmp_node_flip_out);
+ node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_flip_in, cmp_node_flip_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_flip);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c
index 261257d3b5f..f1dd3d40c09 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
+++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c
@@ -28,22 +28,22 @@
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_gamma.c
+/** \file blender/nodes/composite/nodes/node_composite_gamma.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Gamma Tools ******************** */
-static bNodeSocketType cmp_node_gamma_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f},
+static bNodeSocketTemplate cmp_node_gamma_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_gamma_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_gamma_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -81,8 +81,8 @@ void register_node_type_cmp_gamma(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_gamma_in, cmp_node_gamma_out);
+ node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_gamma_in, cmp_node_gamma_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_gamma);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c b/source/blender/nodes/composite/nodes/node_composite_glare.c
index 2e0822a4511..98a41e4af69 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
+++ b/source/blender/nodes/composite/nodes/node_composite_glare.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_glare.c
+/** \file blender/nodes/composite/nodes/node_composite_glare.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_glare_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_glare_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_glare_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_glare_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -474,7 +475,7 @@ static void node_composit_exec_glare(void *UNUSED(data), bNode *node, bNodeStack
out[0]->data = new;
}
-static void node_composit_init_glare(bNode* node)
+static void node_composit_init_glare(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeGlare *ndg = MEM_callocN(sizeof(NodeGlare), "node glare data");
ndg->quality = 1;
@@ -494,8 +495,8 @@ void register_node_type_cmp_glare(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_glare_in, cmp_node_glare_out);
+ node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_glare_in, cmp_node_glare_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_glare);
node_type_storage(&ntype, "NodeGlare", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
index 7b5511c699c..1d060726b67 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+++ b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+/** \file blender/nodes/composite/nodes/node_composite_hueSatVal.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Hue Saturation ******************** */
-static bNodeSocketType cmp_node_hue_sat_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_hue_sat_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_hue_sat_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_hue_sat_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -95,7 +95,7 @@ static void node_composit_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeSta
}
}
-static void node_composit_init_hue_sat(bNode* node)
+static void node_composit_init_hue_sat(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeHueSat *nhs= MEM_callocN(sizeof(NodeHueSat), "node hue sat");
node->storage= nhs;
@@ -108,8 +108,8 @@ void register_node_type_cmp_hue_sat(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_hue_sat_in, cmp_node_hue_sat_out);
+ node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_hue_sat_in, cmp_node_hue_sat_out);
node_type_size(&ntype, 150, 80, 250);
node_type_init(&ntype, node_composit_init_hue_sat);
node_type_storage(&ntype, "NodeHueSat", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
index edf6c454285..13a606e2c68 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+/** \file blender/nodes/composite/nodes/node_composite_huecorrect.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_huecorrect_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_huecorrect_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_huecorrect_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_huecorrect_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -137,7 +137,7 @@ static void node_composit_exec_huecorrect(void *UNUSED(data), bNode *node, bNode
}
-static void node_composit_init_huecorrect(bNode* node)
+static void node_composit_init_huecorrect(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
CurveMapping *cumapping = node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
int c;
@@ -157,8 +157,8 @@ void register_node_type_cmp_huecorrect(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_huecorrect_in, cmp_node_huecorrect_out);
+ node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_huecorrect_in, cmp_node_huecorrect_out);
node_type_size(&ntype, 320, 140, 400);
node_type_init(&ntype, node_composit_init_huecorrect);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c b/source/blender/nodes/composite/nodes/node_composite_idMask.c
index 72d0de7d15e..43f78a90add 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
+++ b/source/blender/nodes/composite/nodes/node_composite_idMask.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_idMask.c
+/** \file blender/nodes/composite/nodes/node_composite_idMask.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** ID Mask ******************** */
-static bNodeSocketType cmp_node_idmask_in[]= {
- { SOCK_VALUE, 1, "ID value", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_idmask_in[]= {
+ { SOCK_FLOAT, 1, "ID value", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_idmask_out[]= {
- { SOCK_VALUE, 0, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_idmask_out[]= {
+ { SOCK_FLOAT, 0, "Alpha"},
{ -1, 0, "" }
};
@@ -113,8 +113,8 @@ void register_node_type_cmp_idmask(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_idmask_in, cmp_node_idmask_out);
+ node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_idmask_in, cmp_node_idmask_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_idmask);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index a5f256054cd..6149947233e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -27,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_image.c
+/** \file blender/nodes/composite/nodes/node_composite_image.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** IMAGE (and RenderResult, multilayer image) ******************** */
-static bNodeSocketType cmp_node_rlayers_out[]= {
+static bNodeSocketTemplate cmp_node_rlayers_out[]= {
{ SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_VECTOR, 0, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_VECTOR, 0, "Speed", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
@@ -52,9 +52,9 @@ static bNodeSocketType cmp_node_rlayers_out[]= {
{ SOCK_RGBA, 0, "Reflect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Indirect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Emit", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Environment",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
@@ -74,7 +74,7 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i
ibuf= BKE_image_get_ibuf(ima, iuser);
if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) {
- return NULL;
+ return NULL;
}
if (ibuf->rect_float == NULL) {
@@ -213,7 +213,7 @@ static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack *
if(out[RRES_OUT_INDEXOB]->hasoutput)
out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB);
if(out[RRES_OUT_INDEXMA]->hasoutput)
- out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA);
+ out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA);
if(out[RRES_OUT_MIST]->hasoutput)
out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST);
if(out[RRES_OUT_EMIT]->hasoutput)
@@ -295,7 +295,7 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE
}
}
-static void node_composit_init_image(bNode* node)
+static void node_composit_init_image(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -309,8 +309,8 @@ void register_node_type_cmp_image(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- NULL, cmp_node_rlayers_out);
+ node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out);
node_type_size(&ntype, 120, 80, 300);
node_type_init(&ntype, node_composit_init_image);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
@@ -440,8 +440,8 @@ void register_node_type_cmp_rlayers(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- NULL, cmp_node_rlayers_out);
+ node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out);
node_type_size(&ntype, 150, 100, 300);
node_type_exec(&ntype, node_composit_exec_rlayers);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/composite/nodes/node_composite_invert.c
index 27b0324dfe0..fa64c9ec1b1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
+++ b/source/blender/nodes/composite/nodes/node_composite_invert.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_invert.c
+/** \file blender/nodes/composite/nodes/node_composite_invert.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** INVERT ******************** */
-static bNodeSocketType cmp_node_invert_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_invert_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_invert_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_invert_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -114,7 +114,7 @@ static void node_composit_exec_invert(void *UNUSED(data), bNode *node, bNodeStac
}
}
-static void node_composit_init_invert(bNode *node)
+static void node_composit_init_invert(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1 |= CMP_CHAN_RGB;
}
@@ -124,8 +124,8 @@ void register_node_type_cmp_invert(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_invert_in, cmp_node_invert_out);
+ node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_invert_in, cmp_node_invert_out);
node_type_size(&ntype, 120, 120, 140);
node_type_init(&ntype, node_composit_init_invert);
node_type_exec(&ntype, node_composit_exec_invert);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/composite/nodes/node_composite_lensdist.c
index 3a005210c6a..7d6c945a9e3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+++ b/source/blender/nodes/composite/nodes/node_composite_lensdist.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+/** \file blender/nodes/composite/nodes/node_composite_lensdist.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_lensdist_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f},
- { SOCK_VALUE, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f},
+static bNodeSocketTemplate cmp_node_lensdist_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_lensdist_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_lensdist_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -183,7 +184,7 @@ static void node_composit_exec_lensdist(void *UNUSED(data), bNode *node, bNodeSt
}
-static void node_composit_init_lensdist(bNode* node)
+static void node_composit_init_lensdist(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeLensDist *nld = MEM_callocN(sizeof(NodeLensDist), "node lensdist data");
nld->jit = nld->proj = nld->fit = 0;
@@ -195,8 +196,8 @@ void register_node_type_cmp_lensdist(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_lensdist_in, cmp_node_lensdist_out);
+ node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_lensdist_in, cmp_node_lensdist_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_lensdist);
node_type_storage(&ntype, "NodeLensDist", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/composite/nodes/node_composite_levels.c
index 2c9f7d97f09..e34788ff62b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
+++ b/source/blender/nodes/composite/nodes/node_composite_levels.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_levels.c
+/** \file blender/nodes/composite/nodes/node_composite_levels.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** LEVELS ******************** */
-static bNodeSocketType cmp_node_view_levels_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_view_levels_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_view_levels_out[]={
- {SOCK_VALUE, 0,"Mean",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE, 0,"Std Dev",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_view_levels_out[]={
+ {SOCK_FLOAT, 0,"Mean"},
+ {SOCK_FLOAT, 0,"Std Dev"},
{-1,0,""}
};
@@ -52,7 +52,7 @@ static void rgb_tobw(float r, float g, float b, float* out)
*out= r*0.35f + g*0.45f + b*0.2f;
}
-static void fill_bins(bNode* node, CompBuf* in, int* bins, int colorcor)
+static void fill_bins(bNode* node, CompBuf* in, int* bins)
{
float value[4];
int ivalue=0;
@@ -68,39 +68,29 @@ static void fill_bins(bNode* node, CompBuf* in, int* bins, int colorcor)
if(value[3] > 0.0) { /* don't count transparent pixels */
switch(node->custom1) {
case 1: { /* all colors */
- if(colorcor)
- linearrgb_to_srgb_v3_v3(&value[0],&value[0]);
rgb_tobw(value[0],value[1],value[2], &value[0]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
break;
}
case 2: { /* red channel */
- if(colorcor)
- value[0]=linearrgb_to_srgb(value[0]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
break;
}
case 3: { /* green channel */
- if(colorcor)
- value[1]=linearrgb_to_srgb(value[1]);
value[1]=value[1]*255; /* scale to 0-255 range */
ivalue=(int)value[1];
break;
}
case 4: /*blue channel */
{
- if(colorcor)
- value[2]=linearrgb_to_srgb(value[2]);
value[2]=value[2]*255; /* scale to 0-255 range */
ivalue=(int)value[2];
break;
}
case 5: /* luminence */
{
- if(colorcor)
- linearrgb_to_srgb_v3_v3(&value[0],&value[0]);
rgb_to_yuv(value[0],value[1],value[2], &value[0], &value[1], &value[2]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
@@ -285,7 +275,6 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
{
CompBuf* cbuf;
CompBuf* histogram;
- RenderData *rd=data;
float mean, std_dev;
int bins[256];
int x;
@@ -302,7 +291,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
}
/*fill bins */
- fill_bins(node, in[0]->data, bins, rd->color_mgt_flag & R_COLOR_MANAGEMENT);
+ fill_bins(node, in[0]->data, bins);
/* draw the histogram chart */
draw_histogram(node, histogram, bins);
@@ -328,7 +317,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
free_compbuf(histogram);
}
-static void node_composit_init_view_levels(bNode* node)
+static void node_composit_init_view_levels(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1=1; /*All channels*/
}
@@ -337,8 +326,8 @@ void register_node_type_cmp_view_levels(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW,
- cmp_node_view_levels_in, cmp_node_view_levels_out);
+ node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_view_levels_in, cmp_node_view_levels_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_view_levels);
node_type_storage(&ntype, "ImageUser", NULL, NULL);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
index 34e58791932..cac2a386801 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_lummaMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Luma Matte Node ********************************* */
-static bNodeSocketType cmp_node_luma_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_luma_matte_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_luma_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_luma_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -100,7 +100,7 @@ static void node_composit_exec_luma_matte(void *data, bNode *node, bNodeStack **
free_compbuf(cbuf);
}
-static void node_composit_init_luma_matte(bNode *node)
+static void node_composit_init_luma_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage=c;
@@ -112,8 +112,8 @@ void register_node_type_cmp_luma_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_luma_matte_in, cmp_node_luma_matte_out);
+ node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_luma_matte_in, cmp_node_luma_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_luma_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
index 6b2c561b14a..b1cae62274b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+/** \file blender/nodes/composite/nodes/node_composite_mapUV.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Map UV ******************** */
-static bNodeSocketType cmp_node_mapuv_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_mapuv_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_VECTOR, 1, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_mapuv_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_mapuv_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -168,8 +168,8 @@ void register_node_type_cmp_mapuv(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_mapuv_in, cmp_node_mapuv_out);
+ node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_mapuv_in, cmp_node_mapuv_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_mapuv);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c b/source/blender/nodes/composite/nodes/node_composite_mapValue.c
index f14e0fbd804..95e0f3dadd1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mapValue.c
@@ -27,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+/** \file blender/nodes/composite/nodes/node_composite_mapValue.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** MAP VALUE ******************** */
-static bNodeSocketType cmp_node_map_value_in[]= {
- { SOCK_VALUE, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_map_value_in[]= {
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_map_value_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_map_value_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -79,7 +79,7 @@ static void node_composit_exec_map_value(void *UNUSED(data), bNode *node, bNodeS
}
-static void node_composit_init_map_value(bNode* node)
+static void node_composit_init_map_value(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_mapping();
}
@@ -88,8 +88,8 @@ void register_node_type_cmp_map_value(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_map_value_in, cmp_node_map_value_out);
+ node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_map_value_in, cmp_node_map_value_out);
node_type_size(&ntype, 100, 60, 150);
node_type_init(&ntype, node_composit_init_map_value);
node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/composite/nodes/node_composite_math.c
index b7a67f3563b..a8a631bdbad 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c
+++ b/source/blender/nodes/composite/nodes/node_composite_math.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_math.c
+/** \file blender/nodes/composite/nodes/node_composite_math.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SCALAR MATH ******************** */
-static bNodeSocketType cmp_node_math_in[]= {
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f},
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_math_in[]= {
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_math_out[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_math_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -145,7 +145,6 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
out[0]= floorf(in[0] / in2[0] + 0.5f) * in2[0];
else
out[0]= floorf(in[0] + 0.5f);
-
}
break;
case 15: /* Less Than */
@@ -201,8 +200,8 @@ void register_node_type_cmp_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_math_in, cmp_node_math_out);
+ node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_math_in, cmp_node_math_out);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
node_type_exec(&ntype, node_composit_exec_math);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c
index d2454b37c29..eaab24d628a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+/** \file blender/nodes/composite/nodes/node_composite_mixrgb.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** MIX RGB ******************** */
-static bNodeSocketType cmp_node_mix_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 5.0f},
- { 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},
+static bNodeSocketTemplate cmp_node_mix_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 5.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_mix_rgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_mix_rgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -88,8 +88,8 @@ void register_node_type_cmp_mix_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_mix_rgb_in, cmp_node_mix_rgb_out);
+ node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_mix_rgb_in, cmp_node_mix_rgb_out);
node_type_size(&ntype, 110, 60, 120);
node_type_label(&ntype, node_blend_label);
node_type_exec(&ntype, node_composit_exec_mix_rgb);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c b/source/blender/nodes/composite/nodes/node_composite_normal.c
index f53d3041947..adf087019dc 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
+++ b/source/blender/nodes/composite/nodes/node_composite_normal.c
@@ -27,30 +27,30 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_normal.c
+/** \file blender/nodes/composite/nodes/node_composite_normal.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** NORMAL ******************** */
-static bNodeSocketType cmp_node_normal_in[]= {
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normal_in[]= {
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_normal_out[]= {
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VALUE, 0, "Dot", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normal_out[]= {
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_FLOAT, 0, "Dot"},
{ -1, 0, "" }
};
static void do_normal(bNode *node, float *out, float *in)
{
bNodeSocket *sock= node->outputs.first;
- float *nor= sock->ns.vec;
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
/* render normals point inside... the widget points outside */
out[0]= -INPR(nor, in);
@@ -60,12 +60,13 @@ static void do_normal(bNode *node, float *out, float *in)
static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
/* stack order input: normal */
/* stack order output: normal, value */
/* input no image? then only vector op */
if(in[0]->data==NULL) {
- VECCOPY(out[0]->vec, sock->ns.vec);
+ VECCOPY(out[0]->vec, nor);
/* render normals point inside... the widget points outside */
out[1]->vec[0]= -INPR(out[0]->vec, in[0]->vec);
}
@@ -82,12 +83,23 @@ static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStac
}
+static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
+
+ nor[0] = 0.0f;
+ nor[1] = 0.0f;
+ nor[2] = 1.0f;
+}
+
void register_node_type_cmp_normal(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_normal_in, cmp_node_normal_out);
+ node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_normal_in, cmp_node_normal_out);
+ node_type_init(&ntype, init);
node_type_size(&ntype, 100, 60, 200);
node_type_exec(&ntype, node_composit_exec_normal);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c b/source/blender/nodes/composite/nodes/node_composite_normalize.c
index 22ebd924f09..3a913b1a0a2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
+++ b/source/blender/nodes/composite/nodes/node_composite_normalize.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_normalize.c
+/** \file blender/nodes/composite/nodes/node_composite_normalize.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** NORMALIZE single channel, useful for Z buffer ******************** */
-static bNodeSocketType cmp_node_normalize_in[]= {
- { SOCK_VALUE, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normalize_in[]= {
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_normalize_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normalize_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -107,8 +107,8 @@ void register_node_type_cmp_normalize(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_normalize_in, cmp_node_normalize_out);
+ node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_normalize_in, cmp_node_normalize_out);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, node_composit_exec_normalize);
node_type_storage(&ntype, "TexMapping", NULL, NULL);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
index 1d52e694ea9..20203f66b5a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
@@ -27,17 +27,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+/** \file blender/nodes/composite/nodes/node_composite_outputFile.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** OUTPUT FILE ******************** */
-static bNodeSocketType cmp_node_output_file_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_output_file_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
@@ -93,7 +93,7 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
}
}
-static void node_composit_init_output_file(bNode *node)
+static void node_composit_init_output_file(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
Scene *scene= (Scene *)node->id;
NodeImageFile *nif= MEM_callocN(sizeof(NodeImageFile), "node image file");
@@ -113,8 +113,8 @@ void register_node_type_cmp_output_file(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_output_file_in, NULL);
+ node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_output_file_in, NULL);
node_type_size(&ntype, 140, 80, 300);
node_type_init(&ntype, node_composit_init_output_file);
node_type_storage(&ntype, "NodeImageFile", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c b/source/blender/nodes/composite/nodes/node_composite_premulkey.c
index 15d2ac25180..a3f958e04d9 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+++ b/source/blender/nodes/composite/nodes/node_composite_premulkey.c
@@ -28,21 +28,21 @@
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+/** \file blender/nodes/composite/nodes/node_composite_premulkey.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Premul and Key Alpha Convert ******************** */
-static bNodeSocketType cmp_node_premulkey_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_premulkey_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_premulkey_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_premulkey_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -67,8 +67,8 @@ void register_node_type_cmp_premulkey(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_premulkey_in, cmp_node_premulkey_out);
+ node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_premulkey_in, cmp_node_premulkey_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_premulkey);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c b/source/blender/nodes/composite/nodes/node_composite_rgb.c
index 36b7988c4e0..b9287a4978e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
+++ b/source/blender/nodes/composite/nodes/node_composite_rgb.c
@@ -27,33 +27,46 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_rgb.c
+/** \file blender/nodes/composite/nodes/node_composite_rgb.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** RGB ******************** */
-static bNodeSocketType cmp_node_rgb_out[]= {
- { SOCK_RGBA, 0, "RGBA", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_rgb_out[]= {
+ { SOCK_RGBA, 0, "RGBA", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
+static void node_composit_init_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
+ /* uses the default value of the output socket, must be initialized here */
+ col[0] = 0.5f;
+ col[1] = 0.5f;
+ col[2] = 0.5f;
+ col[3] = 1.0f;
+}
+
static void node_composit_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
- QUATCOPY(out[0]->vec, sock->ns.vec);
+ QUATCOPY(out[0]->vec, col);
}
void register_node_type_cmp_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, cmp_node_rgb_out);
+ node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_rgb_out);
+ node_type_init(&ntype, node_composit_init_rgb);
node_type_size(&ntype, 140, 80, 140);
node_type_exec(&ntype, node_composit_exec_rgb);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/composite/nodes/node_composite_rotate.c
index eccac4f0e6d..2bbb77cd1da 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_rotate.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_rotate.c
+/** \file blender/nodes/composite/nodes/node_composite_rotate.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Rotate ******************** */
-static bNodeSocketType cmp_node_rotate_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Degr", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_rotate_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Degr", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_ANGLE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_rotate_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_rotate_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -122,7 +122,7 @@ static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStac
}
}
-static void node_composit_init_rotate(bNode *node)
+static void node_composit_init_rotate(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= 1; /* Bilinear Filter*/
}
@@ -131,8 +131,8 @@ void register_node_type_cmp_rotate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_rotate_in, cmp_node_rotate_out);
+ node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_rotate_in, cmp_node_rotate_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_rotate);
node_type_exec(&ntype, node_composit_exec_rotate);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/composite/nodes/node_composite_scale.c
index b6030cc5a5f..b6ad36f957f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
+++ b/source/blender/nodes/composite/nodes/node_composite_scale.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_scale.c
+/** \file blender/nodes/composite/nodes/node_composite_scale.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Scale ******************** */
#define CMP_SCALE_MAX 12000
-static bNodeSocketType cmp_node_scale_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "X", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX},
- { SOCK_VALUE, 1, "Y", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX},
+static bNodeSocketTemplate cmp_node_scale_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "X", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Y", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_scale_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_scale_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -118,8 +118,8 @@ void register_node_type_cmp_scale(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_scale_in, cmp_node_scale_out);
+ node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_scale_in, cmp_node_scale_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_scale);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
index 87c4ed1dac0..6b1813d2142 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE HSVA ******************** */
-static bNodeSocketType cmp_node_sephsva_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sephsva_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_sephsva_out[]= {
- { SOCK_VALUE, 0, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sephsva_out[]= {
+ { SOCK_FLOAT, 0, "H"},
+ { SOCK_FLOAT, 0, "S"},
+ { SOCK_FLOAT, 0, "V"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -105,8 +105,8 @@ void register_node_type_cmp_sephsva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0,
- cmp_node_sephsva_in, cmp_node_sephsva_out);
+ node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_sephsva_in, cmp_node_sephsva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_sephsva);
@@ -115,15 +115,15 @@ void register_node_type_cmp_sephsva(ListBase *lb)
/* **************** COMBINE HSVA ******************** */
-static bNodeSocketType cmp_node_combhsva_in[]= {
- { SOCK_VALUE, 1, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combhsva_in[]= {
+ { SOCK_FLOAT, 1, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combhsva_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combhsva_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -175,8 +175,8 @@ void register_node_type_cmp_combhsva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combhsva_in, cmp_node_combhsva_out);
+ node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combhsva_in, cmp_node_combhsva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combhsva);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
index 11afd1eaaef..a60f6b81c95 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE RGBA ******************** */
-static bNodeSocketType cmp_node_seprgba_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_seprgba_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_seprgba_out[]= {
- { SOCK_VALUE, 0, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_seprgba_out[]= {
+ { SOCK_FLOAT, 0, "R"},
+ { SOCK_FLOAT, 0, "G"},
+ { SOCK_FLOAT, 0, "B"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -83,8 +83,8 @@ void register_node_type_cmp_seprgba(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0,
- cmp_node_seprgba_in, cmp_node_seprgba_out);
+ node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_seprgba_in, cmp_node_seprgba_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_seprgba);
@@ -94,15 +94,15 @@ void register_node_type_cmp_seprgba(ListBase *lb)
/* **************** COMBINE RGBA ******************** */
-static bNodeSocketType cmp_node_combrgba_in[]= {
- { SOCK_VALUE, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combrgba_in[]= {
+ { SOCK_FLOAT, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combrgba_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combrgba_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -151,8 +151,8 @@ void register_node_type_cmp_combrgba(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combrgba_in, cmp_node_combrgba_out);
+ node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combrgba_in, cmp_node_combrgba_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combrgba);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
index 81591602dae..5e042f54fb0 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE YCCA ******************** */
-static bNodeSocketType cmp_node_sepycca_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepycca_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_sepycca_out[]= {
- { SOCK_VALUE, 0, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Cb", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Cr", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepycca_out[]= {
+ { SOCK_FLOAT, 0, "Y"},
+ { SOCK_FLOAT, 0, "Cb"},
+ { SOCK_FLOAT, 0, "Cr"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -154,8 +154,8 @@ void register_node_type_cmp_sepycca(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_sepycca_in, cmp_node_sepycca_out);
+ node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_sepycca_in, cmp_node_sepycca_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_sepycca);
@@ -165,15 +165,15 @@ void register_node_type_cmp_sepycca(ListBase *lb)
/* **************** COMBINE YCCA ******************** */
-static bNodeSocketType cmp_node_combycca_in[]= {
- { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combycca_in[]= {
+ { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combycca_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combycca_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -301,8 +301,8 @@ void register_node_type_cmp_combycca(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combycca_in, cmp_node_combycca_out);
+ node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combycca_in, cmp_node_combycca_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combycca);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
index 8687e307df3..70bc36a020d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE YUVA ******************** */
-static bNodeSocketType cmp_node_sepyuva_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepyuva_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_sepyuva_out[]= {
- { SOCK_VALUE, 0, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepyuva_out[]= {
+ { SOCK_FLOAT, 0, "Y"},
+ { SOCK_FLOAT, 0, "U"},
+ { SOCK_FLOAT, 0, "V"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -105,8 +105,8 @@ void register_node_type_cmp_sepyuva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0,
- cmp_node_sepyuva_in, cmp_node_sepyuva_out);
+ node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_sepyuva_in, cmp_node_sepyuva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_sepyuva);
@@ -116,15 +116,15 @@ void register_node_type_cmp_sepyuva(ListBase *lb)
/* **************** COMBINE YUVA ******************** */
-static bNodeSocketType cmp_node_combyuva_in[]= {
- { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combyuva_in[]= {
+ { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combyuva_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combyuva_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -176,8 +176,8 @@ void register_node_type_cmp_combyuva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combyuva_in, cmp_node_combyuva_out);
+ node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combyuva_in, cmp_node_combyuva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combyuva);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c b/source/blender/nodes/composite/nodes/node_composite_setalpha.c
index bb8533a79f6..8264d4d4dea 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+++ b/source/blender/nodes/composite/nodes/node_composite_setalpha.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+/** \file blender/nodes/composite/nodes/node_composite_setalpha.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SET ALPHA ******************** */
-static bNodeSocketType cmp_node_setalpha_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_setalpha_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_setalpha_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_setalpha_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -79,8 +79,8 @@ void register_node_type_cmp_setalpha(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_setalpha_in, cmp_node_setalpha_out);
+ node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_setalpha_in, cmp_node_setalpha_out);
node_type_size(&ntype, 120, 40, 140);
node_type_exec(&ntype, node_composit_exec_setalpha);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
index 13cb3bcfed5..e73caa542b7 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
@@ -27,17 +27,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+/** \file blender/nodes/composite/nodes/node_composite_splitViewer.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SPLIT VIEWER ******************** */
-static bNodeSocketType cmp_node_splitviewer_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_splitviewer_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -141,7 +141,7 @@ static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack *
}
}
-static void node_composit_init_splitviewer(bNode* node)
+static void node_composit_init_splitviewer(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -155,8 +155,8 @@ void register_node_type_cmp_splitviewer(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_splitviewer_in, NULL);
+ node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_splitviewer_in, NULL);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_splitviewer);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/composite/nodes/node_composite_texture.c
index 46e71b8b8e5..1dbbd56d2f1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
+++ b/source/blender/nodes/composite/nodes/node_composite_texture.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_texture.c
+/** \file blender/nodes/composite/nodes/node_composite_texture.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** TEXTURE ******************** */
-static bNodeSocketType cmp_node_texture_in[]= {
- { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f},
- { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 1.0f, -10.0f, 10.0f},
+static bNodeSocketTemplate cmp_node_texture_in[]= {
+ { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_TRANSLATION},
+ { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 1.0f, -10.0f, 10.0f, PROP_XYZ},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_texture_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA , 0, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_texture_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
+ { SOCK_RGBA , 0, "Color"},
{ -1, 0, "" }
};
@@ -148,8 +148,8 @@ void register_node_type_cmp_texture(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- cmp_node_texture_in, cmp_node_texture_out);
+ node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_texture_in, cmp_node_texture_out);
node_type_size(&ntype, 120, 80, 240);
node_type_exec(&ntype, node_composit_exec_texture);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c b/source/blender/nodes/composite/nodes/node_composite_tonemap.c
index f15811ec790..ba2dc9c5c79 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+++ b/source/blender/nodes/composite/nodes/node_composite_tonemap.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+/** \file blender/nodes/composite/nodes/node_composite_tonemap.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_tonemap_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_tonemap_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_tonemap_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_tonemap_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -147,7 +148,7 @@ static void node_composit_exec_tonemap(void *UNUSED(data), bNode *node, bNodeSta
free_compbuf(img);
}
-static void node_composit_init_tonemap(bNode* node)
+static void node_composit_init_tonemap(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeTonemap *ntm = MEM_callocN(sizeof(NodeTonemap), "node tonemap data");
ntm->type = 1;
@@ -167,8 +168,8 @@ void register_node_type_cmp_tonemap(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_tonemap_in, cmp_node_tonemap_out);
+ node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_tonemap_in, cmp_node_tonemap_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_tonemap);
node_type_storage(&ntype, "NodeTonemap", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c b/source/blender/nodes/composite/nodes/node_composite_translate.c
index eb69523e7a9..872667a4e17 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_translate.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_translate.c
+/** \file blender/nodes/composite/nodes/node_composite_translate.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Translate ******************** */
-static bNodeSocketType cmp_node_translate_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "X", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
- { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_translate_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "X", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_translate_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_translate_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -65,8 +65,8 @@ void register_node_type_cmp_translate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_translate_in, cmp_node_translate_out);
+ node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_translate_in, cmp_node_translate_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_translate);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c
index 1e1c8c61b46..edd315e5a92 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+++ b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+/** \file blender/nodes/composite/nodes/node_composite_valToRgb.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VALTORGB ******************** */
-static bNodeSocketType cmp_node_valtorgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_valtorgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_valtorgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_valtorgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
+ { SOCK_FLOAT, 0, "Alpha"},
{ -1, 0, "" }
};
@@ -80,7 +80,7 @@ static void node_composit_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeSt
}
}
-static void node_composit_init_valtorgb(bNode* node)
+static void node_composit_init_valtorgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_colorband(1);
}
@@ -89,8 +89,8 @@ void register_node_type_cmp_valtorgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_valtorgb_in, cmp_node_valtorgb_out);
+ node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_valtorgb_in, cmp_node_valtorgb_out);
node_type_size(&ntype, 240, 200, 300);
node_type_init(&ntype, node_composit_init_valtorgb);
node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
@@ -102,12 +102,12 @@ void register_node_type_cmp_valtorgb(ListBase *lb)
/* **************** RGBTOBW ******************** */
-static bNodeSocketType cmp_node_rgbtobw_in[]= {
+static bNodeSocketTemplate cmp_node_rgbtobw_in[]= {
{ SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_rgbtobw_out[]= {
- { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_rgbtobw_out[]= {
+ { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -143,8 +143,8 @@ void register_node_type_cmp_rgbtobw(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
- cmp_node_rgbtobw_in, cmp_node_rgbtobw_out);
+ node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_rgbtobw_in, cmp_node_rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_composit_exec_rgbtobw);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_value.c b/source/blender/nodes/composite/nodes/node_composite_value.c
index 46762065bb4..ed650477f50 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_value.c
+++ b/source/blender/nodes/composite/nodes/node_composite_value.c
@@ -27,32 +27,45 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_value.c
+/** \file blender/nodes/composite/nodes/node_composite_value.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VALUE ******************** */
-static bNodeSocketType cmp_node_value_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_value_out[]= {
+ /* XXX value nodes use the output sockets for buttons, so we need explicit limits here! */
+ { SOCK_FLOAT, 0, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{ -1, 0, "" }
};
+static void node_composit_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value;
+ /* uses the default value of the output socket, must be initialized here */
+ dval->value = 0.5f;
+ dval->min = -FLT_MAX;
+ dval->max = FLT_MAX;
+}
+
static void node_composit_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float val= ((bNodeSocketValueFloat*)sock->default_value)->value;
- out[0]->vec[0]= sock->ns.vec[0];
+ out[0]->vec[0]= val;
}
void register_node_type_cmp_value(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, cmp_node_value_out);
+ node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_value_out);
+ node_type_init(&ntype, node_composit_init_value);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_composit_exec_value);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c
index c43bfa2435a..26fcffa93ac 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+/** \file blender/nodes/composite/nodes/node_composite_vecBlur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VECTOR BLUR ******************** */
-static bNodeSocketType cmp_node_vecblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Speed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_vecblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_VECTOR, 1, "Speed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_VELOCITY},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_vecblur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_vecblur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -87,7 +87,7 @@ static void node_composit_exec_vecblur(void *UNUSED(data), bNode *node, bNodeSta
free_compbuf(img);
}
-static void node_composit_init_vecblur(bNode* node)
+static void node_composit_init_vecblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeBlurData *nbd= MEM_callocN(sizeof(NodeBlurData), "node blur data");
node->storage= nbd;
@@ -100,8 +100,8 @@ void register_node_type_cmp_vecblur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_vecblur_in, cmp_node_vecblur_out);
+ node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_vecblur_in, cmp_node_vecblur_out);
node_type_size(&ntype, 120, 80, 200);
node_type_init(&ntype, node_composit_init_vecblur);
node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c
index c4e719efbf9..8b052c5db35 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c
@@ -27,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_viewer.c
+/** \file blender/nodes/composite/nodes/node_composite_viewer.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VIEWER ******************** */
-static bNodeSocketType cmp_node_viewer_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_viewer_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
@@ -124,7 +124,7 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in,
}
}
-static void node_composit_init_viewer(bNode* node)
+static void node_composit_init_viewer(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -137,8 +137,8 @@ void register_node_type_cmp_viewer(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- cmp_node_viewer_in, NULL);
+ node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_viewer_in, NULL);
node_type_size(&ntype, 80, 60, 200);
node_type_init(&ntype, node_composit_init_viewer);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
@@ -146,5 +146,3 @@ void register_node_type_cmp_viewer(ListBase *lb)
nodeRegisterType(lb, &ntype);
}
-
-
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c b/source/blender/nodes/composite/nodes/node_composite_zcombine.c
index 0fae0fcd4d5..220b770198a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+++ b/source/blender/nodes/composite/nodes/node_composite_zcombine.c
@@ -27,26 +27,26 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+/** \file blender/nodes/composite/nodes/node_composite_zcombine.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Z COMBINE ******************** */
/* lazy coder note: node->custom2 is abused to send signal */
-static bNodeSocketType cmp_node_zcombine_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_zcombine_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_zcombine_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_zcombine_out[]= {
+ { SOCK_RGBA, 0, "Image"},
+ { SOCK_FLOAT, 0, "Z"},
{ -1, 0, "" }
};
@@ -228,8 +228,8 @@ void register_node_type_cmp_zcombine(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_zcombine_in, cmp_node_zcombine_out);
+ node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_zcombine_in, cmp_node_zcombine_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_composit_exec_zcombine);
diff --git a/source/blender/nodes/intern/SHD_util.c b/source/blender/nodes/intern/SHD_util.c
deleted file mode 100644
index 190f68ce19a..00000000000
--- a/source/blender/nodes/intern/SHD_util.c
+++ /dev/null
@@ -1,219 +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) 2005 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/nodes/intern/SHD_util.c
- * \ingroup nodes
- */
-
-
-#include "SHD_util.h"
-
-
-
-
-
-/* ****** */
-
-void nodestack_get_vec(float *in, short type_in, bNodeStack *ns)
-{
- float *from= ns->vec;
-
- if(type_in==SOCK_VALUE) {
- if(ns->sockettype==SOCK_VALUE)
- *in= *from;
- else
- *in= 0.333333f*(from[0]+from[1]+from[2]);
- }
- else if(type_in==SOCK_VECTOR) {
- if(ns->sockettype==SOCK_VALUE) {
- in[0]= from[0];
- in[1]= from[0];
- in[2]= from[0];
- }
- else {
- VECCOPY(in, from);
- }
- }
- else { /* type_in==SOCK_RGBA */
- if(ns->sockettype==SOCK_RGBA) {
- QUATCOPY(in, from);
- }
- else if(ns->sockettype==SOCK_VALUE) {
- in[0]= from[0];
- in[1]= from[0];
- in[2]= from[0];
- in[3]= 1.0f;
- }
- else {
- VECCOPY(in, from);
- in[3]= 1.0f;
- }
- }
-}
-
-
-/* ******************* execute and parse ************ */
-
-void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
-{
- ShaderCallData scd;
- /*
- @note: preserve material from ShadeInput for material id, nodetree execs change it
- fix for bug "[#28012] Mat ID messy with shader nodes"
- */
- Material *mat = shi->mat;
- /* convert caller data to struct */
- scd.shi= shi;
- scd.shr= shr;
-
- /* each material node has own local shaderesult, with optional copying */
- memset(shr, 0, sizeof(ShadeResult));
-
- ntreeExecTree(ntree, &scd, shi->thread); /* threads */
- // @note: set material back to preserved material
- shi->mat = mat;
- /* better not allow negative for now */
- if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f;
- if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f;
- if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f;
-
-}
-
-/* go over all used Geometry and Texture nodes, and return a texco flag */
-/* no group inside needed, this function is called for groups too */
-void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mode)
-{
- bNode *node;
- bNodeSocket *sock;
- int a;
-
- ntreeSocketUseFlags(ntree);
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==SH_NODE_TEXTURE) {
- if((r_mode & R_OSA) && node->id) {
- Tex *tex= (Tex *)node->id;
- if ELEM3(tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP)
- *texco |= TEXCO_OSA|NEED_UV;
- }
- /* usability exception... without input we still give the node orcos */
- sock= node->inputs.first;
- if(sock==NULL || sock->link==NULL)
- *texco |= TEXCO_ORCO|NEED_UV;
- }
- else if(node->type==SH_NODE_GEOMETRY) {
- /* note; sockets always exist for the given type! */
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(sock->flag & SOCK_IN_USE) {
- switch(a) {
- case GEOM_OUT_GLOB:
- *texco |= TEXCO_GLOB|NEED_UV; break;
- case GEOM_OUT_VIEW:
- *texco |= TEXCO_VIEW|NEED_UV; break;
- case GEOM_OUT_ORCO:
- *texco |= TEXCO_ORCO|NEED_UV; break;
- case GEOM_OUT_UV:
- *texco |= TEXCO_UV|NEED_UV; break;
- case GEOM_OUT_NORMAL:
- *texco |= TEXCO_NORM|NEED_UV; break;
- case GEOM_OUT_VCOL:
- *texco |= NEED_UV; *mode |= MA_VERTEXCOL; break;
- }
- }
- }
- }
- }
-}
-
-/* nodes that use ID data get synced with local data */
-void nodeShaderSynchronizeID(bNode *node, int copyto)
-{
- if(node->id==NULL) return;
-
- if(ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) {
- bNodeSocket *sock;
- Material *ma= (Material *)node->id;
- int a;
-
- /* hrmf, case in loop isnt super fast, but we dont edit 100s of material at same time either! */
- for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
- if(!(sock->flag & SOCK_HIDDEN)) {
- if(copyto) {
- switch(a) {
- case MAT_IN_COLOR:
- VECCOPY(&ma->r, sock->ns.vec); break;
- case MAT_IN_SPEC:
- VECCOPY(&ma->specr, sock->ns.vec); break;
- case MAT_IN_REFL:
- ma->ref= sock->ns.vec[0]; break;
- case MAT_IN_MIR:
- VECCOPY(&ma->mirr, sock->ns.vec); break;
- case MAT_IN_AMB:
- ma->amb= sock->ns.vec[0]; break;
- case MAT_IN_EMIT:
- ma->emit= sock->ns.vec[0]; break;
- case MAT_IN_SPECTRA:
- ma->spectra= sock->ns.vec[0]; break;
- case MAT_IN_RAY_MIRROR:
- ma->ray_mirror= sock->ns.vec[0]; break;
- case MAT_IN_ALPHA:
- ma->alpha= sock->ns.vec[0]; break;
- case MAT_IN_TRANSLUCENCY:
- ma->translucency= sock->ns.vec[0]; break;
- }
- }
- else {
- switch(a) {
- case MAT_IN_COLOR:
- VECCOPY(sock->ns.vec, &ma->r); break;
- case MAT_IN_SPEC:
- VECCOPY(sock->ns.vec, &ma->specr); break;
- case MAT_IN_REFL:
- sock->ns.vec[0]= ma->ref; break;
- case MAT_IN_MIR:
- VECCOPY(sock->ns.vec, &ma->mirr); break;
- case MAT_IN_AMB:
- sock->ns.vec[0]= ma->amb; break;
- case MAT_IN_EMIT:
- sock->ns.vec[0]= ma->emit; break;
- case MAT_IN_SPECTRA:
- sock->ns.vec[0]= ma->spectra; break;
- case MAT_IN_RAY_MIRROR:
- sock->ns.vec[0]= ma->ray_mirror; break;
- case MAT_IN_ALPHA:
- sock->ns.vec[0]= ma->alpha; break;
- case MAT_IN_TRANSLUCENCY:
- sock->ns.vec[0]= ma->translucency; break;
- }
- }
- }
- }
- }
-
-}
diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c
new file mode 100644
index 00000000000..d7830b6a260
--- /dev/null
+++ b/source/blender/nodes/intern/node_common.c
@@ -0,0 +1,983 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_common.c
+ * \ingroup nodes
+ */
+
+
+#include <string.h>
+
+#include "DNA_action_types.h"
+#include "DNA_anim_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_action.h"
+#include "BKE_animsys.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BLI_math.h"
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "node_common.h"
+#include "node_exec.h"
+#include "NOD_socket.h"
+
+/**** Group ****/
+
+bNodeSocket *node_group_find_input(bNode *gnode, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+ for (sock=gnode->inputs.first; sock; sock=sock->next)
+ if (sock->groupsock == gsock)
+ return sock;
+ return NULL;
+}
+
+bNodeSocket *node_group_find_output(bNode *gnode, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+ for (sock=gnode->outputs.first; sock; sock=sock->next)
+ if (sock->groupsock == gsock)
+ return sock;
+ return NULL;
+}
+
+bNodeSocket *node_group_add_extern_socket(bNodeTree *UNUSED(ntree), ListBase *lb, int in_out, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+
+ if (gsock->flag & SOCK_INTERNAL)
+ return NULL;
+
+ sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+
+ /* make a copy of the group socket */
+ *sock = *gsock;
+ sock->link = NULL;
+ sock->next = sock->prev = NULL;
+ sock->new_sock = NULL;
+
+ /* group sockets are dynamically added */
+ sock->flag |= SOCK_DYNAMIC;
+
+ sock->own_index = gsock->own_index;
+ sock->groupsock = gsock;
+ sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
+
+ if (gsock->default_value)
+ sock->default_value = MEM_dupallocN(gsock->default_value);
+
+ if(lb)
+ BLI_addtail(lb, sock);
+
+ return sock;
+}
+
+bNode *node_group_make_from_selected(bNodeTree *ntree)
+{
+ bNodeLink *link, *linkn;
+ bNode *node, *gnode, *nextn;
+ bNodeTree *ngroup;
+ bNodeSocket *gsock;
+ ListBase anim_basepaths = {NULL, NULL};
+ float min[2], max[2];
+ int totnode=0;
+ bNodeTemplate ntemp;
+
+ INIT_MINMAX2(min, max);
+
+ /* is there something to group? also do some clearing */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->flag & NODE_SELECT) {
+ /* no groups in groups */
+ if(node->type==NODE_GROUP)
+ return NULL;
+ DO_MINMAX2( (&node->locx), min, max);
+ totnode++;
+ }
+ node->done= 0;
+ }
+ if(totnode==0) return NULL;
+
+ /* check if all connections are OK, no unselected node has both
+ inputs and outputs to a selection */
+ for(link= ntree->links.first; link; link= link->next) {
+ if(link->fromnode && link->tonode && link->fromnode->flag & NODE_SELECT)
+ link->tonode->done |= 1;
+ if(link->fromnode && link->tonode && link->tonode->flag & NODE_SELECT)
+ link->fromnode->done |= 2;
+ }
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if((node->flag & NODE_SELECT)==0)
+ if(node->done==3)
+ break;
+ }
+ if(node)
+ return NULL;
+
+ /* OK! new nodetree */
+ ngroup= ntreeAddTree("NodeGroup", ntree->type, NODE_GROUP);
+
+ /* move nodes over */
+ for(node= ntree->nodes.first; node; node= nextn) {
+ nextn= node->next;
+ if(node->flag & NODE_SELECT) {
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (ntree->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* change node-collection membership */
+ BLI_remlink(&ntree->nodes, node);
+ BLI_addtail(&ngroup->nodes, node);
+
+ node->locx-= 0.5f*(min[0]+max[0]);
+ node->locy-= 0.5f*(min[1]+max[1]);
+ }
+ }
+
+ /* move animation data over */
+ if (ntree->adt) {
+ LinkData *ld, *ldn=NULL;
+
+ BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
+ }
+ }
+
+ /* make group node */
+ ntemp.type = NODE_GROUP;
+ ntemp.ngroup = ngroup;
+ gnode= nodeAddNode(ntree, &ntemp);
+ gnode->locx= 0.5f*(min[0]+max[0]);
+ gnode->locy= 0.5f*(min[1]+max[1]);
+
+ /* relink external sockets */
+ for(link= ntree->links.first; link; link= linkn) {
+ linkn= link->next;
+
+ if(link->fromnode && link->tonode && (link->fromnode->flag & link->tonode->flag & NODE_SELECT)) {
+ BLI_remlink(&ntree->links, link);
+ BLI_addtail(&ngroup->links, link);
+ }
+ else if(link->tonode && (link->tonode->flag & NODE_SELECT)) {
+ gsock = node_group_expose_socket(ngroup, link->tosock, SOCK_IN);
+ link->tosock->link = nodeAddLink(ngroup, NULL, gsock, link->tonode, link->tosock);
+ link->tosock = node_group_add_extern_socket(ntree, &gnode->inputs, SOCK_IN, gsock);
+ link->tonode = gnode;
+ }
+ else if(link->fromnode && (link->fromnode->flag & NODE_SELECT)) {
+ /* search for existing group node socket */
+ for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next)
+ if (gsock->link && gsock->link->fromsock==link->fromsock)
+ break;
+ if (!gsock) {
+ gsock = node_group_expose_socket(ngroup, link->fromsock, SOCK_OUT);
+ gsock->link = nodeAddLink(ngroup, link->fromnode, link->fromsock, NULL, gsock);
+ link->fromsock = node_group_add_extern_socket(ntree, &gnode->outputs, SOCK_OUT, gsock);
+ }
+ else
+ link->fromsock = node_group_find_output(gnode, gsock);
+ link->fromnode = gnode;
+ }
+ }
+
+ ngroup->update |= NTREE_UPDATE;
+ ntreeUpdateTree(ngroup);
+ ntree->update |= NTREE_UPDATE_NODES|NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(ntree);
+
+ return gnode;
+}
+
+/* XXX This is a makeshift function to have useful initial group socket values.
+ * In the end this should be implemented by a flexible socket data conversion system,
+ * which is yet to be implemented. The idea is that beside default standard conversions,
+ * such as int-to-float, it should be possible to quickly select a conversion method or
+ * a chain of conversions for each input, whenever there is more than one option.
+ * E.g. a vector-to-float conversion could use either of the x/y/z components or
+ * the vector length.
+ *
+ * In the interface this could be implemented by a pseudo-script textbox on linked inputs,
+ * with quick selection from a predefined list of conversion options. Some Examples:
+ * - vector component 'z' (vector->float): "z"
+ * - greyscale color (float->color): "grey"
+ * - color luminance (color->float): "lum"
+ * - matrix column 2 length (matrix->vector->float): "col[1].len"
+ * - mesh vertex coordinate 'y' (mesh->vertex->vector->float): "vertex.co.y"
+ *
+ * The actual conversion is then done by a series of conversion functions,
+ * which are defined in the socket type structs.
+ */
+static void convert_socket_value(bNodeSocket *from, bNodeSocket *to)
+{
+ /* XXX only one of these pointers is valid! just putting them here for convenience */
+ bNodeSocketValueFloat *fromfloat= (bNodeSocketValueFloat*)from->default_value;
+ bNodeSocketValueInt *fromint= (bNodeSocketValueInt*)from->default_value;
+ bNodeSocketValueBoolean *frombool= (bNodeSocketValueBoolean*)from->default_value;
+ bNodeSocketValueVector *fromvector= (bNodeSocketValueVector*)from->default_value;
+ bNodeSocketValueRGBA *fromrgba= (bNodeSocketValueRGBA*)from->default_value;
+
+ bNodeSocketValueFloat *tofloat= (bNodeSocketValueFloat*)to->default_value;
+ bNodeSocketValueInt *toint= (bNodeSocketValueInt*)to->default_value;
+ bNodeSocketValueBoolean *tobool= (bNodeSocketValueBoolean*)to->default_value;
+ bNodeSocketValueVector *tovector= (bNodeSocketValueVector*)to->default_value;
+ bNodeSocketValueRGBA *torgba= (bNodeSocketValueRGBA*)to->default_value;
+
+ switch (from->type) {
+ case SOCK_FLOAT:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = fromfloat->value;
+ break;
+ case SOCK_INT:
+ toint->value = (int)fromfloat->value;
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromfloat->value > 0.0f);
+ break;
+ case SOCK_VECTOR:
+ tovector->value[0] = tovector->value[1] = tovector->value[2] = fromfloat->value;
+ break;
+ case SOCK_RGBA:
+ torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = fromfloat->value;
+ break;
+ }
+ break;
+ case SOCK_INT:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = (float)fromint->value;
+ break;
+ case SOCK_INT:
+ toint->value = fromint->value;
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromint->value > 0);
+ break;
+ case SOCK_VECTOR:
+ tovector->value[0] = tovector->value[1] = tovector->value[2] = (float)fromint->value;
+ break;
+ case SOCK_RGBA:
+ torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = (float)fromint->value;
+ break;
+ }
+ break;
+ case SOCK_BOOLEAN:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = (float)frombool->value;
+ break;
+ case SOCK_INT:
+ toint->value = (int)frombool->value;
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = frombool->value;
+ break;
+ case SOCK_VECTOR:
+ tovector->value[0] = tovector->value[1] = tovector->value[2] = (float)frombool->value;
+ break;
+ case SOCK_RGBA:
+ torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = (float)frombool->value;
+ break;
+ }
+ break;
+ case SOCK_VECTOR:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = fromvector->value[0];
+ break;
+ case SOCK_INT:
+ toint->value = (int)fromvector->value[0];
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromvector->value[0] > 0.0f);
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(tovector->value, fromvector->value);
+ break;
+ case SOCK_RGBA:
+ copy_v3_v3(torgba->value, fromvector->value);
+ torgba->value[3] = 1.0f;
+ break;
+ }
+ break;
+ case SOCK_RGBA:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = fromrgba->value[0];
+ break;
+ case SOCK_INT:
+ toint->value = (int)fromrgba->value[0];
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromrgba->value[0] > 0.0f);
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(tovector->value, fromrgba->value);
+ break;
+ case SOCK_RGBA:
+ copy_v4_v4(torgba->value, fromrgba->value);
+ break;
+ }
+ break;
+ }
+}
+
+static void copy_socket_value(bNodeSocket *from, bNodeSocket *to)
+{
+ /* XXX only one of these pointers is valid! just putting them here for convenience */
+ bNodeSocketValueFloat *fromfloat= (bNodeSocketValueFloat*)from->default_value;
+ bNodeSocketValueInt *fromint= (bNodeSocketValueInt*)from->default_value;
+ bNodeSocketValueBoolean *frombool= (bNodeSocketValueBoolean*)from->default_value;
+ bNodeSocketValueVector *fromvector= (bNodeSocketValueVector*)from->default_value;
+ bNodeSocketValueRGBA *fromrgba= (bNodeSocketValueRGBA*)from->default_value;
+
+ bNodeSocketValueFloat *tofloat= (bNodeSocketValueFloat*)to->default_value;
+ bNodeSocketValueInt *toint= (bNodeSocketValueInt*)to->default_value;
+ bNodeSocketValueBoolean *tobool= (bNodeSocketValueBoolean*)to->default_value;
+ bNodeSocketValueVector *tovector= (bNodeSocketValueVector*)to->default_value;
+ bNodeSocketValueRGBA *torgba= (bNodeSocketValueRGBA*)to->default_value;
+
+ if (from->type != to->type)
+ return;
+
+ switch (from->type) {
+ case SOCK_FLOAT:
+ *tofloat = *fromfloat;
+ break;
+ case SOCK_INT:
+ *toint = *fromint;
+ break;
+ case SOCK_BOOLEAN:
+ *tobool = *frombool;
+ break;
+ case SOCK_VECTOR:
+ *tovector = *fromvector;
+ break;
+ case SOCK_RGBA:
+ *torgba = *fromrgba;
+ break;
+ }
+}
+
+/* returns 1 if its OK */
+int node_group_ungroup(bNodeTree *ntree, bNode *gnode)
+{
+ bNodeLink *link, *linkn;
+ bNode *node, *nextn;
+ bNodeTree *ngroup, *wgroup;
+ ListBase anim_basepaths = {NULL, NULL};
+
+ ngroup= (bNodeTree *)gnode->id;
+ if(ngroup==NULL) return 0;
+
+ /* clear new pointers, set in copytree */
+ for(node= ntree->nodes.first; node; node= node->next)
+ node->new_node= NULL;
+
+ /* wgroup is a temporary copy of the NodeTree we're merging in
+ * - all of wgroup's nodes are transferred across to their new home
+ * - ngroup (i.e. the source NodeTree) is left unscathed
+ */
+ wgroup= ntreeCopyTree(ngroup);
+
+ /* add the nodes into the ntree */
+ for(node= wgroup->nodes.first; node; node= nextn) {
+ nextn= node->next;
+
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (wgroup->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* migrate node */
+ BLI_remlink(&wgroup->nodes, node);
+ BLI_addtail(&ntree->nodes, node);
+
+ node->locx+= gnode->locx;
+ node->locy+= gnode->locy;
+
+ node->flag |= NODE_SELECT;
+ }
+
+ /* restore external links to and from the gnode */
+ for(link= ntree->links.first; link; link= link->next) {
+ if (link->fromnode==gnode) {
+ if (link->fromsock->groupsock) {
+ bNodeSocket *gsock= link->fromsock->groupsock;
+ if (gsock->link) {
+ if (gsock->link->fromnode) {
+ /* NB: using the new internal copies here! the groupsock pointer still maps to the old tree */
+ link->fromnode = (gsock->link->fromnode ? gsock->link->fromnode->new_node : NULL);
+ link->fromsock = gsock->link->fromsock->new_sock;
+ }
+ else {
+ /* group output directly maps to group input */
+ bNodeSocket *insock= node_group_find_input(gnode, gsock->link->fromsock);
+ if (insock->link) {
+ link->fromnode = insock->link->fromnode;
+ link->fromsock = insock->link->fromsock;
+ }
+ }
+ }
+ else {
+ /* copy the default input value from the group socket default to the external socket */
+ convert_socket_value(gsock, link->tosock);
+ }
+ }
+ }
+ }
+ /* remove internal output links, these are not used anymore */
+ for(link=wgroup->links.first; link; link= linkn) {
+ linkn = link->next;
+ if (!link->tonode)
+ nodeRemLink(wgroup, link);
+ }
+ /* restore links from internal nodes */
+ for(link= wgroup->links.first; link; link= link->next) {
+ /* indicates link to group input */
+ if (!link->fromnode) {
+ /* NB: can't use find_group_node_input here,
+ * because gnode sockets still point to the old tree!
+ */
+ bNodeSocket *insock;
+ for (insock= gnode->inputs.first; insock; insock= insock->next)
+ if (insock->groupsock->new_sock == link->fromsock)
+ break;
+ if (insock->link) {
+ link->fromnode = insock->link->fromnode;
+ link->fromsock = insock->link->fromsock;
+ }
+ else {
+ /* copy the default input value from the group node socket default to the internal socket */
+ convert_socket_value(insock, link->tosock);
+ nodeRemLink(wgroup, link);
+ }
+ }
+ }
+
+ /* add internal links to the ntree */
+ for(link= wgroup->links.first; link; link= linkn) {
+ linkn= link->next;
+ BLI_remlink(&wgroup->links, link);
+ BLI_addtail(&ntree->links, link);
+ }
+
+ /* and copy across the animation */
+ if (wgroup->adt) {
+ LinkData *ld, *ldn=NULL;
+ bAction *waction;
+
+ /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */
+ waction = wgroup->adt->action = copy_action(wgroup->adt->action);
+
+ /* now perform the moving */
+ BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
+ }
+
+ /* free temp action too */
+ free_libblock(&G.main->action, waction);
+ }
+
+ /* delete the group instance. this also removes old input links! */
+ nodeFreeNode(ntree, gnode);
+
+ /* free the group tree (takes care of user count) */
+ free_libblock(&G.main->nodetree, wgroup);
+
+ ntree->update |= NTREE_UPDATE_NODES|NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(ntree);
+
+ return 1;
+}
+
+bNodeSocket *node_group_add_socket(bNodeTree *ngroup, const char *name, int type, int in_out)
+{
+ bNodeSocketType *stype = ntreeGetSocketType(type);
+ bNodeSocket *gsock = MEM_callocN(sizeof(bNodeSocket), "bNodeSocket");
+
+ strncpy(gsock->name, name, sizeof(gsock->name));
+ gsock->type = type;
+ /* group sockets are dynamically added */
+ gsock->flag |= SOCK_DYNAMIC;
+
+ gsock->next = gsock->prev = NULL;
+ gsock->new_sock = NULL;
+ gsock->link = NULL;
+ /* assign new unique index */
+ gsock->own_index = ngroup->cur_index++;
+ gsock->limit = (in_out==SOCK_IN ? 0xFFF : 1);
+
+ if (stype->value_structsize > 0)
+ gsock->default_value = MEM_callocN(stype->value_structsize, "default socket value");
+
+ BLI_addtail(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, gsock);
+
+ ngroup->update |= (in_out==SOCK_IN ? NTREE_UPDATE_GROUP_IN : NTREE_UPDATE_GROUP_OUT);
+
+ return gsock;
+}
+
+bNodeSocket *node_group_expose_socket(bNodeTree *ngroup, bNodeSocket *sock, int in_out)
+{
+ bNodeSocket *gsock= node_group_add_socket(ngroup, sock->name, sock->type, in_out);
+
+ /* initialize the default value. */
+ copy_socket_value(sock, gsock);
+
+ return gsock;
+}
+
+void node_group_expose_all_sockets(bNodeTree *ngroup)
+{
+ bNode *node;
+ bNodeSocket *sock, *gsock;
+
+ for (node=ngroup->nodes.first; node; node=node->next) {
+ for (sock=node->inputs.first; sock; sock=sock->next) {
+ if (!sock->link && !(sock->flag & SOCK_HIDDEN)) {
+ gsock = node_group_add_socket(ngroup, sock->name, sock->type, SOCK_IN);
+
+ /* initialize the default value. */
+ copy_socket_value(sock, gsock);
+
+ sock->link = nodeAddLink(ngroup, NULL, gsock, node, sock);
+ }
+ }
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ if (nodeCountSocketLinks(ngroup, sock)==0 && !(sock->flag & SOCK_HIDDEN)) {
+ gsock = node_group_add_socket(ngroup, sock->name, sock->type, SOCK_OUT);
+
+ /* initialize the default value. */
+ copy_socket_value(sock, gsock);
+
+ gsock->link = nodeAddLink(ngroup, node, sock, NULL, gsock);
+ }
+ }
+ }
+}
+
+void node_group_remove_socket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out)
+{
+ nodeRemSocketLinks(ngroup, gsock);
+
+ switch (in_out) {
+ case SOCK_IN:
+ BLI_remlink(&ngroup->inputs, gsock);
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
+ break;
+ case SOCK_OUT:
+ BLI_remlink(&ngroup->outputs, gsock);
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
+ break;
+ }
+
+ if (gsock->default_value)
+ MEM_freeN(gsock->default_value);
+
+ MEM_freeN(gsock);
+}
+
+/* groups display their internal tree name as label */
+const char *node_group_label(bNode *node)
+{
+ return (node->id)? node->id->name+2: "Missing Datablock";
+}
+
+int node_group_valid(bNodeTree *ntree, bNodeTemplate *ntemp)
+{
+ bNodeTemplate childtemp;
+ bNode *node;
+
+ /* regular groups cannot be recursive */
+ if (ntree == ntemp->ngroup)
+ return 0;
+
+ /* make sure all children are valid */
+ for (node=ntemp->ngroup->nodes.first; node; node=node->next) {
+ childtemp = nodeMakeTemplate(node);
+ if (!nodeValid(ntree, &childtemp))
+ return 0;
+ }
+
+ return 1;
+}
+
+bNodeTemplate node_group_template(bNode *node)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_GROUP;
+ ntemp.ngroup = (bNodeTree*)node->id;
+ return ntemp;
+}
+
+void node_group_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp)
+{
+ node->id = (ID*)ntemp->ngroup;
+
+ /* NB: group socket input/output roles are inverted internally!
+ * Group "inputs" work as outputs in links and vice versa.
+ */
+ if (ntemp->ngroup) {
+ bNodeSocket *gsock;
+ for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock);
+ for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock);
+ }
+}
+
+static bNodeSocket *group_verify_socket(bNodeTree *ntree, ListBase *lb, int in_out, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+
+ /* group sockets tagged as internal are not exposed ever */
+ if (gsock->flag & SOCK_INTERNAL)
+ return NULL;
+
+ for(sock= lb->first; sock; sock= sock->next) {
+ if(sock->own_index==gsock->own_index)
+ break;
+ }
+ if(sock) {
+ sock->groupsock = gsock;
+
+ strcpy(sock->name, gsock->name);
+ sock->type= gsock->type;
+
+ /* XXX hack: group socket input/output roles are inverted internally,
+ * need to change the limit value when making actual node sockets from them.
+ */
+ sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
+
+ BLI_remlink(lb, sock);
+
+ return sock;
+ }
+ else {
+ return node_group_add_extern_socket(ntree, NULL, in_out, gsock);
+ }
+}
+
+static void group_verify_socket_list(bNodeTree *ntree, bNode *node, ListBase *lb, int in_out, ListBase *glb)
+{
+ bNodeSocket *sock, *nextsock, *gsock;
+
+ /* step by step compare */
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ /* abusing new_sock pointer for verification here! only used inside this function */
+ gsock->new_sock= group_verify_socket(ntree, lb, in_out, gsock);
+ }
+ /* leftovers are removed */
+ for (sock=lb->first; sock; sock=nextsock) {
+ nextsock=sock->next;
+ if (sock->flag & SOCK_DYNAMIC)
+ nodeRemoveSocket(ntree, node, sock);
+ }
+ /* and we put back the verified sockets */
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ if (gsock->new_sock) {
+ BLI_addtail(lb, gsock->new_sock);
+ gsock->new_sock = NULL;
+ }
+ }
+}
+
+/* make sure all group node in ntree, which use ngroup, are sync'd */
+void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id)
+{
+ /* check inputs and outputs, and remove or insert them */
+ if (node->id==id) {
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ group_verify_socket_list(ntree, node, &node->inputs, SOCK_IN, &ngroup->inputs);
+ group_verify_socket_list(ntree, node, &node->outputs, SOCK_OUT, &ngroup->outputs);
+ }
+}
+
+struct bNodeTree *node_group_edit_get(bNode *node)
+{
+ if (node->flag & NODE_GROUP_EDIT)
+ return (bNodeTree*)node->id;
+ else
+ return NULL;
+}
+
+struct bNodeTree *node_group_edit_set(bNode *node, int edit)
+{
+ if (edit) {
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ if (ngroup) {
+ if(ngroup->id.lib)
+ ntreeMakeLocal(ngroup);
+
+ node->flag |= NODE_GROUP_EDIT;
+ }
+ return ngroup;
+ }
+ else {
+ node->flag &= ~NODE_GROUP_EDIT;
+ return NULL;
+ }
+}
+
+void node_group_edit_clear(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNode *inode;
+
+ node->flag &= ~NODE_GROUP_EDIT;
+
+ if (ngroup)
+ for (inode=ngroup->nodes.first; inode; inode=inode->next)
+ nodeGroupEditClear(inode);
+}
+
+void node_group_link(bNodeTree *ntree, bNodeSocket *sock, int in_out)
+{
+ node_group_expose_socket(ntree, sock, in_out);
+}
+
+/**** For Loop ****/
+
+/* Essentially a group node with slightly different behavior.
+ * The internal tree is executed several times, with each output being re-used
+ * as an input in the next iteration. For this purpose, input and output socket
+ * lists are kept identical!
+ */
+
+bNodeTemplate node_forloop_template(bNode *node)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_FORLOOP;
+ ntemp.ngroup = (bNodeTree*)node->id;
+ return ntemp;
+}
+
+void node_forloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp)
+{
+ bNodeSocket *sock;
+
+ node->id = (ID*)ntemp->ngroup;
+
+ sock = nodeAddInputFloat(ntree, node, "Iterations", PROP_UNSIGNED, 1, 0, 10000);
+
+ /* NB: group socket input/output roles are inverted internally!
+ * Group "inputs" work as outputs in links and vice versa.
+ */
+ if (ntemp->ngroup) {
+ bNodeSocket *gsock;
+ for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock);
+ for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock);
+ }
+}
+
+void node_forloop_init_tree(bNodeTree *ntree)
+{
+ bNodeSocket *sock;
+ sock = node_group_add_socket(ntree, "Iteration", SOCK_FLOAT, SOCK_IN);
+ sock->flag |= SOCK_INTERNAL;
+}
+
+static void loop_sync(bNodeTree *ntree, int sync_in_out)
+{
+ bNodeSocket *sock, *sync, *nsync, *mirror;
+ ListBase *sync_lb;
+
+ if (sync_in_out==SOCK_IN) {
+ sock = ntree->outputs.first;
+
+ sync = ntree->inputs.first;
+ sync_lb = &ntree->inputs;
+ }
+ else {
+ sock = ntree->inputs.first;
+
+ sync = ntree->outputs.first;
+ sync_lb = &ntree->outputs;
+ }
+
+ /* NB: the sock->storage pointer is used here directly to store the own_index int
+ * out the mirrored socket counterpart!
+ */
+
+ while (sock) {
+ /* skip static and internal sockets on the sync side (preserves socket order!) */
+ while (sync && ((sync->flag & SOCK_INTERNAL) || !(sync->flag & SOCK_DYNAMIC)))
+ sync = sync->next;
+
+ if (sync && !(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) {
+ if (sock->storage==NULL) {
+ /* if mirror index is 0, the sockets is newly added and a new mirror must be created. */
+ mirror = node_group_expose_socket(ntree, sock, sync_in_out);
+ /* store the mirror index */
+ sock->storage = SET_INT_IN_POINTER(mirror->own_index);
+ mirror->storage = SET_INT_IN_POINTER(sock->own_index);
+ /* move mirror to the right place */
+ BLI_remlink(sync_lb, mirror);
+ if (sync)
+ BLI_insertlinkbefore(sync_lb, sync, mirror);
+ else
+ BLI_addtail(sync_lb, mirror);
+ }
+ else {
+ /* look up the mirror socket */
+ for (mirror=sync; mirror; mirror=mirror->next)
+ if (mirror->own_index == GET_INT_FROM_POINTER(sock->storage))
+ break;
+ /* make sure the name is the same (only for identification by user, no deeper meaning) */
+ strcpy(mirror->name, sock->name);
+ /* fix the socket order if necessary */
+ if (mirror != sync) {
+ BLI_remlink(sync_lb, mirror);
+ BLI_insertlinkbefore(sync_lb, sync, mirror);
+ }
+ else
+ sync = sync->next;
+ }
+ }
+
+ sock = sock->next;
+ }
+
+ /* remaining sockets in sync_lb are leftovers from deleted sockets, remove them */
+ while (sync) {
+ nsync = sync->next;
+ if (!(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC))
+ node_group_remove_socket(ntree, sync, sync_in_out);
+ sync = nsync;
+ }
+}
+
+void node_loop_update_tree(bNodeTree *ngroup)
+{
+ /* make sure inputs & outputs are identical */
+ if (ngroup->update & NTREE_UPDATE_GROUP_IN)
+ loop_sync(ngroup, SOCK_OUT);
+ if (ngroup->update & NTREE_UPDATE_GROUP_OUT)
+ loop_sync(ngroup, SOCK_IN);
+}
+
+void node_whileloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp)
+{
+ bNodeSocket *sock;
+
+ node->id = (ID*)ntemp->ngroup;
+
+ sock = nodeAddInputFloat(ntree, node, "Condition", PROP_NONE, 1, 0, 1);
+
+ /* max iterations */
+ node->custom1 = 10000;
+
+ /* NB: group socket input/output roles are inverted internally!
+ * Group "inputs" work as outputs in links and vice versa.
+ */
+ if (ntemp->ngroup) {
+ bNodeSocket *gsock;
+ for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock);
+ for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock);
+ }
+}
+
+void node_whileloop_init_tree(bNodeTree *ntree)
+{
+ bNodeSocket *sock;
+ sock = node_group_add_socket(ntree, "Condition", SOCK_FLOAT, SOCK_OUT);
+ sock->flag |= SOCK_INTERNAL;
+}
+
+bNodeTemplate node_whileloop_template(bNode *node)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_WHILELOOP;
+ ntemp.ngroup = (bNodeTree*)node->id;
+ return ntemp;
+}
+
+/**** FRAME ****/
+
+void register_node_type_frame(ListBase *lb)
+{
+ /* frame type is used for all tree types, needs dynamic allocation */
+ bNodeType *ntype= MEM_callocN(sizeof(bNodeType), "frame node type");
+
+ node_type_base(ntype, NODE_FRAME, "Frame", NODE_CLASS_LAYOUT, NODE_BACKGROUND);
+ node_type_size(ntype, 150, 100, 0);
+
+ ntype->needs_free = 1;
+ nodeRegisterType(lb, ntype);
+}
diff --git a/source/blender/nodes/intern/node_common.h b/source/blender/nodes/intern/node_common.h
new file mode 100644
index 00000000000..2723c595380
--- /dev/null
+++ b/source/blender/nodes/intern/node_common.h
@@ -0,0 +1,66 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_common.h
+ * \ingroup nodes
+ */
+
+
+#ifndef NODE_COMMON_H_
+#define NODE_COMMON_H_
+
+#include "DNA_listBase.h"
+
+struct bNodeTree;
+
+struct bNodeSocket *node_group_add_extern_socket(struct bNodeTree *ntree, ListBase *lb, int in_out, struct bNodeSocket *gsock);
+
+void node_group_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+void node_forloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+void node_whileloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+
+void node_forloop_init_tree(struct bNodeTree *ntree);
+void node_whileloop_init_tree(struct bNodeTree *ntree);
+
+const char *node_group_label(struct bNode *node);
+
+struct bNodeTemplate node_group_template(struct bNode *node);
+struct bNodeTemplate node_forloop_template(struct bNode *node);
+struct bNodeTemplate node_whileloop_template(struct bNode *node);
+
+int node_group_valid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
+void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
+
+struct bNodeTree *node_group_edit_get(struct bNode *node);
+struct bNodeTree *node_group_edit_set(struct bNode *node, int edit);
+void node_group_edit_clear(bNode *node);
+
+void node_loop_update_tree(struct bNodeTree *ngroup);
+
+#endif
diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c
new file mode 100644
index 00000000000..608347bc258
--- /dev/null
+++ b/source/blender/nodes/intern/node_exec.c
@@ -0,0 +1,309 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_exec.c
+ * \ingroup nodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_node.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "node_exec.h"
+
+
+/* for a given socket, find the actual stack entry */
+bNodeStack *node_get_socket_stack(bNodeStack *stack, bNodeSocket *sock)
+{
+ return stack + sock->stack_index;
+}
+
+void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out)
+{
+ bNodeSocket *sock;
+
+ /* build pointer stack */
+ if (in) {
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ *(in++) = node_get_socket_stack(stack, sock);
+ }
+ }
+
+ if (out) {
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ *(out++) = node_get_socket_stack(stack, sock);
+ }
+ }
+}
+
+void node_init_input_index(bNodeSocket *sock, int *index)
+{
+ if (sock->link && sock->link->fromsock) {
+ sock->stack_index = sock->link->fromsock->stack_index;
+ }
+ else {
+ sock->stack_index = (*index)++;
+ }
+}
+
+void node_init_output_index(bNodeSocket *sock, int *index)
+{
+ sock->stack_index = (*index)++;
+}
+
+/* basic preparation of socket stacks */
+static struct bNodeStack *setup_stack(bNodeStack *stack, bNodeSocket *sock)
+{
+ bNodeStack *ns = node_get_socket_stack(stack, sock);
+ float null_value[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+
+ /* don't mess with remote socket stacks, these are initialized by other nodes! */
+ if (sock->link)
+ return ns;
+
+ ns->sockettype = sock->type;
+
+ if (sock->default_value) {
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ ns->vec[0] = ((bNodeSocketValueFloat*)sock->default_value)->value;
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(ns->vec, ((bNodeSocketValueVector*)sock->default_value)->value);
+ break;
+ case SOCK_RGBA:
+ copy_v4_v4(ns->vec, ((bNodeSocketValueRGBA*)sock->default_value)->value);
+ break;
+ }
+ }
+ else {
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ ns->vec[0] = 0.0f;
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(ns->vec, null_value);
+ break;
+ case SOCK_RGBA:
+ copy_v4_v4(ns->vec, null_value);
+ break;
+ }
+ }
+
+ return ns;
+}
+
+bNodeTreeExec *ntree_exec_begin(bNodeTree *ntree)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+ bNodeExec *nodeexec;
+ bNodeSocket *sock, *gsock;
+ bNodeStack *ns;
+ int index= 0;
+ bNode **nodelist;
+ int totnodes, n;
+
+ if((ntree->init & NTREE_TYPE_INIT)==0)
+ ntreeInitTypes(ntree);
+
+ /* get a dependency-sorted list of nodes */
+ ntreeGetDependencyList(ntree, &nodelist, &totnodes);
+
+ /* XXX could let callbacks do this for specialized data */
+ exec = MEM_callocN(sizeof(bNodeTreeExec), "node tree execution data");
+ /* backpointer to node tree */
+ exec->nodetree = ntree;
+
+ /* group inputs essentially work as outputs */
+ for(gsock=ntree->inputs.first; gsock; gsock = gsock->next)
+ node_init_output_index(gsock, &index);
+ /* set stack indexes */
+ for(n=0; n < totnodes; ++n) {
+ node = nodelist[n];
+
+ node->stack_index = index;
+
+ /* init node socket stack indexes */
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ node_init_input_index(sock, &index);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ node_init_output_index(sock, &index);
+ }
+ /* group outputs essentially work as inputs */
+ for(gsock=ntree->outputs.first; gsock; gsock = gsock->next)
+ node_init_input_index(gsock, &index);
+
+ /* allocated exec data pointers for nodes */
+ exec->totnodes = totnodes;
+ exec->nodeexec = MEM_callocN(exec->totnodes * sizeof(bNodeExec), "node execution data");
+ /* allocate data pointer for node stack */
+ exec->stacksize = index;
+ exec->stack = MEM_callocN(exec->stacksize * sizeof(bNodeStack), "bNodeStack");
+
+ /* prepare group tree inputs */
+ for (sock=ntree->inputs.first; sock; sock=sock->next) {
+ ns = setup_stack(exec->stack, sock);
+ if (ns->hasoutput)
+ ns->hasinput = 1;
+ }
+ /* prepare all internal nodes for execution */
+ for(n=0, nodeexec= exec->nodeexec; n < totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node = nodelist[n];
+
+ /* tag inputs */
+ for (sock=node->inputs.first; sock; sock=sock->next) {
+ /* disable the node if an input link is invalid */
+ if(sock->link && !(sock->link->flag & NODE_LINK_VALID))
+ node->need_exec= 0;
+
+ ns = setup_stack(exec->stack, sock);
+ if (ns->hasoutput)
+ ns->hasinput = 1;
+ }
+
+ /* tag all outputs */
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ ns = setup_stack(exec->stack, sock);
+ ns->hasoutput = 1;
+ }
+
+ if(node->typeinfo->initexecfunc)
+ nodeexec->data = node->typeinfo->initexecfunc(node);
+ }
+ /* prepare group tree outputs */
+ for (sock=ntree->outputs.first; sock; sock=sock->next) {
+ ns = setup_stack(exec->stack, sock);
+ ns->hasoutput = 1;
+ }
+
+ if (nodelist)
+ MEM_freeN(nodelist);
+
+ return exec;
+}
+
+void ntree_exec_end(bNodeTreeExec *exec)
+{
+ bNodeExec *nodeexec;
+ int n;
+
+ if (exec->stack)
+ MEM_freeN(exec->stack);
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ if (nodeexec->node->typeinfo->freeexecfunc)
+ nodeexec->node->typeinfo->freeexecfunc(nodeexec->node, nodeexec->data);
+ }
+
+ if (exec->nodeexec)
+ MEM_freeN(exec->nodeexec);
+
+ MEM_freeN(exec);
+}
+
+/**** Compositor/Material/Texture trees ****/
+
+bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread)
+{
+ ListBase *lb= &exec->threadstack[thread];
+ bNodeThreadStack *nts;
+
+ for(nts=lb->first; nts; nts=nts->next) {
+ if(!nts->used) {
+ nts->used= 1;
+ break;
+ }
+ }
+
+ if (!nts) {
+ nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack");
+ nts->stack= MEM_dupallocN(exec->stack);
+ nts->used= 1;
+ BLI_addtail(lb, nts);
+ }
+
+ return nts;
+}
+
+void ntreeReleaseThreadStack(bNodeThreadStack *nts)
+{
+ nts->used = 0;
+}
+
+void ntreeExecNodes(bNodeTreeExec *exec, void *callerdata, int thread)
+{
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec;
+ bNode *node;
+ int n;
+
+ /* nodes are presorted, so exec is in order of list */
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->need_exec) {
+ node_get_stack(node, exec->stack, nsin, nsout);
+ if(node->typeinfo->execfunc)
+ node->typeinfo->execfunc(callerdata, node, nsin, nsout);
+ else if (node->typeinfo->newexecfunc)
+ node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout);
+ }
+ }
+}
+
+void ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *callerdata, int thread)
+{
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec;
+ bNode *node;
+ int n;
+
+ /* nodes are presorted, so exec is in order of list */
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->need_exec) {
+ node_get_stack(node, nts->stack, nsin, nsout);
+ if(node->typeinfo->execfunc)
+ node->typeinfo->execfunc(callerdata, node, nsin, nsout);
+ else if (node->typeinfo->newexecfunc)
+ node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout);
+ }
+ }
+}
diff --git a/source/blender/nodes/intern/node_exec.h b/source/blender/nodes/intern/node_exec.h
new file mode 100644
index 00000000000..567c6ae56cf
--- /dev/null
+++ b/source/blender/nodes/intern/node_exec.h
@@ -0,0 +1,90 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_exec.h
+ * \ingroup nodes
+ */
+
+
+#ifndef NODE_EXEC_H_
+#define NODE_EXEC_H_
+
+#include "DNA_listBase.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_node.h"
+
+#include "RNA_types.h"
+
+struct bNodeTree;
+struct bNode;
+struct bNodeStack;
+
+/* Node execution data */
+typedef struct bNodeExec {
+ struct bNode *node; /* backpointer to node */
+ void *data; /* custom data storage */
+} bNodeExec;
+
+/* Execution Data for each instance of node tree execution */
+typedef struct bNodeTreeExec {
+ struct bNodeTree *nodetree; /* backpointer to node tree */
+
+ int totnodes; /* total node count */
+ struct bNodeExec *nodeexec; /* per-node execution data */
+
+ int stacksize;
+ struct bNodeStack *stack; /* socket data stack */
+ /* only used by material and texture trees to keep one stack for each thread */
+ ListBase *threadstack; /* one instance of the stack for each thread */
+} bNodeTreeExec;
+
+/* stores one stack copy for each thread (material and texture trees) */
+typedef struct bNodeThreadStack {
+ struct bNodeThreadStack *next, *prev;
+ struct bNodeStack *stack;
+ int used;
+} bNodeThreadStack;
+
+struct bNodeStack *node_get_socket_stack(struct bNodeStack *stack, struct bNodeSocket *sock);
+void node_get_stack(struct bNode *node, struct bNodeStack *stack, struct bNodeStack **in, struct bNodeStack **out);
+void node_init_input_index(struct bNodeSocket *sock, int *index);
+void node_init_output_index(struct bNodeSocket *sock, int *index);
+
+struct bNodeTreeExec *ntree_exec_begin(struct bNodeTree *ntree);
+void ntree_exec_end(struct bNodeTreeExec *exec);
+
+void ntreeExecNodes(struct bNodeTreeExec *exec, void *callerdata, int thread);
+
+struct bNodeThreadStack *ntreeGetThreadStack(struct bNodeTreeExec *exec, int thread);
+void ntreeReleaseThreadStack(struct bNodeThreadStack *nts);
+void ntreeExecThreadNodes(struct bNodeTreeExec *exec, struct bNodeThreadStack *nts, void *callerdata, int thread);
+
+#endif
diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c
new file mode 100644
index 00000000000..aabaf5b86de
--- /dev/null
+++ b/source/blender/nodes/intern/node_socket.c
@@ -0,0 +1,433 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toennne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_socket.c
+ * \ingroup nodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_node.h"
+
+#include "RNA_access.h"
+#include "RNA_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "NOD_socket.h"
+
+/****************** FLOAT ******************/
+
+static bNodeSocketType node_socket_type_float = {
+ /* type */ SOCK_FLOAT,
+ /* ui_name */ "Float",
+ /* ui_description */ "Floating Point",
+ /* ui_icon */ 0,
+ /* ui_color */ {160,160,160,255},
+
+ /* value_structname */ "bNodeSocketValueFloat",
+ /* value_structsize */ sizeof(bNodeSocketValueFloat),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** VECTOR ******************/
+
+static bNodeSocketType node_socket_type_vector = {
+ /* type */ SOCK_VECTOR,
+ /* ui_name */ "Vector",
+ /* ui_description */ "3-dimensional floating point vector",
+ /* ui_icon */ 0,
+ /* ui_color */ {100,100,200,255},
+
+ /* value_structname */ "bNodeSocketValueVector",
+ /* value_structsize */ sizeof(bNodeSocketValueVector),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** RGBA ******************/
+
+static bNodeSocketType node_socket_type_rgba = {
+ /* type */ SOCK_RGBA,
+ /* ui_name */ "RGBA",
+ /* ui_description */ "RGBA color",
+ /* ui_icon */ 0,
+ /* ui_color */ {200,200,40,255},
+
+ /* value_structname */ "bNodeSocketValueRGBA",
+ /* value_structsize */ sizeof(bNodeSocketValueRGBA),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** INT ******************/
+
+static bNodeSocketType node_socket_type_int = {
+ /* type */ SOCK_INT,
+ /* ui_name */ "Int",
+ /* ui_description */ "Integer",
+ /* ui_icon */ 0,
+ /* ui_color */ {17,133,37,255},
+
+ /* value_structname */ "bNodeSocketValueInt",
+ /* value_structsize */ sizeof(bNodeSocketValueInt),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** BOOLEAN ******************/
+
+static bNodeSocketType node_socket_type_boolean = {
+ /* type */ SOCK_BOOLEAN,
+ /* ui_name */ "Boolean",
+ /* ui_description */ "Boolean",
+ /* ui_icon */ 0,
+ /* ui_color */ {158,139,63,255},
+
+ /* value_structname */ "bNodeSocketValueBoolean",
+ /* value_structsize */ sizeof(bNodeSocketValueBoolean),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** MESH ******************/
+
+static bNodeSocketType node_socket_type_mesh = {
+ /* type */ SOCK_MESH,
+ /* ui_name */ "Mesh",
+ /* ui_description */ "Mesh geometry data",
+ /* ui_icon */ 0,
+ /* ui_color */ {255,133,7,255},
+
+ /* value_structname */ NULL,
+ /* value_structsize */ 0,
+
+ /* buttonfunc */ NULL,
+};
+
+
+void node_socket_type_init(bNodeSocketType *types[])
+{
+ #define INIT_TYPE(name) types[node_socket_type_##name.type] = &node_socket_type_##name;
+
+ INIT_TYPE(float);
+ INIT_TYPE(vector);
+ INIT_TYPE(rgba);
+ INIT_TYPE(int);
+ INIT_TYPE(boolean);
+ INIT_TYPE(mesh);
+
+ #undef INIT_TYPE
+}
+
+struct bNodeSocket *nodeAddInputInt(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype,
+ int value, int min, int max)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_INT);
+ bNodeSocketValueInt *dval= (bNodeSocketValueInt*)sock->default_value;
+ dval->subtype = subtype;
+ dval->value = value;
+ dval->min = min;
+ dval->max = max;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputInt(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_INT);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype,
+ float value, float min, float max)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_FLOAT);
+ bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value;
+ dval->subtype = subtype;
+ dval->value = value;
+ dval->min = min;
+ dval->max = max;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_FLOAT);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name, char value)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_BOOLEAN);
+ bNodeSocketValueBoolean *dval= (bNodeSocketValueBoolean*)sock->default_value;
+ dval->value = value;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_BOOLEAN);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputVector(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype,
+ float x, float y, float z, float min, float max)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_VECTOR);
+ bNodeSocketValueVector *dval= (bNodeSocketValueVector*)sock->default_value;
+ dval->subtype = subtype;
+ dval->value[0] = x;
+ dval->value[1] = y;
+ dval->value[2] = z;
+ dval->min = min;
+ dval->max = max;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputVector(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_VECTOR);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name,
+ float r, float g, float b, float a)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_RGBA);
+ bNodeSocketValueRGBA *dval= (bNodeSocketValueRGBA*)sock->default_value;
+ dval->value[0] = r;
+ dval->value[1] = g;
+ dval->value[2] = b;
+ dval->value[3] = a;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_RGBA);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_MESH);
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_MESH);
+ return sock;
+}
+
+struct bNodeSocket *node_add_input_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp)
+{
+ bNodeSocket *sock;
+ switch (stemp->type) {
+ case SOCK_INT:
+ sock = nodeAddInputInt(ntree, node, stemp->name, stemp->subtype, (int)stemp->val1, (int)stemp->min, (int)stemp->max);
+ break;
+ case SOCK_FLOAT:
+ sock = nodeAddInputFloat(ntree, node, stemp->name, stemp->subtype, stemp->val1, stemp->min, stemp->max);
+ break;
+ case SOCK_BOOLEAN:
+ sock = nodeAddInputBoolean(ntree, node, stemp->name, (char)stemp->val1);
+ break;
+ case SOCK_VECTOR:
+ sock = nodeAddInputVector(ntree, node, stemp->name, stemp->subtype, stemp->val1, stemp->val2, stemp->val3, stemp->min, stemp->max);
+ break;
+ case SOCK_RGBA:
+ sock = nodeAddInputRGBA(ntree, node, stemp->name, stemp->val1, stemp->val2, stemp->val3, stemp->val4);
+ break;
+ case SOCK_MESH:
+ sock = nodeAddInputMesh(ntree, node, stemp->name);
+ break;
+ default:
+ sock = nodeAddSocket(ntree, node, SOCK_IN, stemp->name, stemp->type);
+ }
+ return sock;
+}
+
+struct bNodeSocket *node_add_output_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp)
+{
+ bNodeSocket *sock;
+ switch (stemp->type) {
+ case SOCK_INT:
+ sock = nodeAddOutputInt(ntree, node, stemp->name);
+ break;
+ case SOCK_FLOAT:
+ sock = nodeAddOutputFloat(ntree, node, stemp->name);
+ break;
+ case SOCK_BOOLEAN:
+ sock = nodeAddOutputBoolean(ntree, node, stemp->name);
+ break;
+ case SOCK_VECTOR:
+ sock = nodeAddOutputVector(ntree, node, stemp->name);
+ break;
+ case SOCK_RGBA:
+ sock = nodeAddOutputRGBA(ntree, node, stemp->name);
+ break;
+ case SOCK_MESH:
+ sock = nodeAddOutputMesh(ntree, node, stemp->name);
+ break;
+ default:
+ sock = nodeAddSocket(ntree, node, SOCK_OUT, stemp->name, stemp->type);
+ }
+ return sock;
+}
+
+static bNodeSocket *verify_socket_template(bNodeTree *ntree, bNode *node, int in_out, ListBase *socklist, bNodeSocketTemplate *stemp)
+{
+ bNodeSocket *sock;
+
+ for(sock= socklist->first; sock; sock= sock->next) {
+ if(!(sock->flag & SOCK_DYNAMIC) && strncmp(sock->name, stemp->name, NODE_MAXSTR)==0)
+ break;
+ }
+ if(sock) {
+ sock->type= stemp->type; /* in future, read this from tydefs! */
+ if(stemp->limit==0) sock->limit= 0xFFF;
+ else sock->limit= stemp->limit;
+
+ /* Copy the property range and subtype parameters in case the template changed.
+ * NOT copying the actual value here, only button behavior changes!
+ */
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ {
+ bNodeSocketValueFloat *dval= sock->default_value;
+ dval->min = stemp->min;
+ dval->max = stemp->max;
+ dval->subtype = stemp->subtype;
+ }
+ break;
+ case SOCK_INT:
+ {
+ bNodeSocketValueInt *dval= sock->default_value;
+ dval->min = stemp->min;
+ dval->max = stemp->max;
+ dval->subtype = stemp->subtype;
+ }
+ break;
+ case SOCK_VECTOR:
+ {
+ bNodeSocketValueVector *dval= sock->default_value;
+ dval->min = stemp->min;
+ dval->max = stemp->max;
+ dval->subtype = stemp->subtype;
+ }
+ break;
+ }
+
+ BLI_remlink(socklist, sock);
+
+ return sock;
+ }
+ else {
+ /* no socket for this template found, make a new one */
+ if (in_out==SOCK_IN)
+ sock = node_add_input_from_template(ntree, node, stemp);
+ else
+ sock = node_add_output_from_template(ntree, node, stemp);
+ /* remove the new socket from the node socket list first,
+ * will be added back after verification.
+ */
+ BLI_remlink(socklist, sock);
+ }
+
+ return sock;
+}
+
+static void verify_socket_template_list(bNodeTree *ntree, bNode *node, int in_out, ListBase *socklist, bNodeSocketTemplate *stemp_first)
+{
+ bNodeSocket *sock;
+ bNodeSocketTemplate *stemp;
+
+ /* no inputs anymore? */
+ if(stemp_first==NULL) {
+ while(socklist->first) {
+ sock = (bNodeSocket*)socklist->first;
+ if (!(sock->flag & SOCK_DYNAMIC))
+ nodeRemoveSocket(ntree, node, socklist->first);
+ }
+ }
+ else {
+ /* step by step compare */
+ stemp= stemp_first;
+ while(stemp->type != -1) {
+ stemp->sock= verify_socket_template(ntree, node, in_out, socklist, stemp);
+ stemp++;
+ }
+ /* leftovers are removed */
+ while(socklist->first) {
+ sock = (bNodeSocket*)socklist->first;
+ if (!(sock->flag & SOCK_DYNAMIC))
+ nodeRemoveSocket(ntree, node, socklist->first);
+ }
+
+ /* and we put back the verified sockets */
+ stemp= stemp_first;
+ if (socklist->first) {
+ /* some dynamic sockets left, store the list start
+ * so we can add static sockets infront of it.
+ */
+ sock = socklist->first;
+ while(stemp->type != -1) {
+ /* put static sockets infront of dynamic */
+ BLI_insertlinkbefore(socklist, sock, stemp->sock);
+ stemp++;
+ }
+ }
+ else {
+ while(stemp->type != -1) {
+ BLI_addtail(socklist, stemp->sock);
+ stemp++;
+ }
+ }
+ }
+}
+
+void node_verify_socket_templates(bNodeTree *ntree, bNode *node)
+{
+ bNodeType *ntype= node->typeinfo;
+ /* XXX Small trick: don't try to match socket lists when there are no templates.
+ * This also prevents group node sockets from being removed, without the need to explicitly
+ * check the node type here.
+ */
+ if(ntype && ((ntype->inputs && ntype->inputs[0].type>=0) || (ntype->outputs && ntype->outputs[0].type>=0))) {
+ verify_socket_template_list(ntree, node, SOCK_IN, &node->inputs, ntype->inputs);
+ verify_socket_template_list(ntree, node, SOCK_OUT, &node->outputs, ntype->outputs);
+ }
+}
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index 1cc8c282179..bdf53df06af 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -32,12 +32,24 @@
*/
-#include "CMP_util.h"
-#include "SHD_util.h"
+#include "DNA_action_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_colortools.h"
+#include "BKE_node.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
+#include "MEM_guardedalloc.h"
+
+#include "node_util.h"
+
+/**** Storage Data ****/
+
void node_free_curves(bNode *node)
{
curvemapping_free(node->storage);
@@ -58,6 +70,8 @@ void node_copy_standard_storage(bNode *orig_node, bNode *new_node)
new_node->storage= MEM_dupallocN(orig_node->storage);
}
+/**** Labels ****/
+
const char *node_blend_label(bNode *node)
{
const char *name;
diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h
index 5a78fc07883..8d38d57f577 100644
--- a/source/blender/nodes/intern/node_util.h
+++ b/source/blender/nodes/intern/node_util.h
@@ -35,14 +35,27 @@
#ifndef NODE_UTIL_H_
#define NODE_UTIL_H_
+#include "DNA_listBase.h"
+
+#include "BKE_node.h"
+
#include "MEM_guardedalloc.h"
+#include "NOD_socket.h"
+
+struct bNodeTree;
+struct bNode;
+
+/**** Storage Data ****/
+
extern void node_free_curves(struct bNode *node);
extern void node_free_standard_storage(struct bNode *node);
extern void node_copy_curves(struct bNode *orig_node, struct bNode *new_node);
extern void node_copy_standard_storage(struct bNode *orig_node, struct bNode *new_node);
+/**** Labels ****/
+
const char *node_blend_label(struct bNode *node);
const char *node_math_label(struct bNode *node);
const char *node_vect_math_label(struct bNode *node);
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
new file mode 100644
index 00000000000..c50005bef67
--- /dev/null
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -0,0 +1,226 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/shader/node_shader_tree.c
+ * \ingroup nodes
+ */
+
+
+#include <string.h>
+
+#include "DNA_material_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+
+#include "GPU_material.h"
+
+#include "RE_shader_ext.h"
+
+#include "node_exec.h"
+#include "node_util.h"
+#include "node_shader_util.h"
+
+static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
+{
+ Material *ma;
+ for(ma= main->mat.first; ma; ma= ma->id.next) {
+ if(ma->nodetree) {
+ func(calldata, &ma->id, ma->nodetree);
+ }
+ }
+}
+
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+
+ /* copy over contents of previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ bNode *node= lnode->new_node;
+
+ if(node->preview && node->preview->rect) {
+ if(lnode->preview && lnode->preview->rect) {
+ int xsize= node->preview->xsize;
+ int ysize= node->preview->ysize;
+ memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
+ }
+ }
+ }
+ }
+}
+
+bNodeTreeType ntreeType_Shader = {
+ /* type */ NTREE_SHADER,
+ /* id_name */ "NTShader Nodetree",
+
+ /* node_types */ { NULL, NULL },
+
+ /* free_cache */ NULL,
+ /* free_node_cache */ NULL,
+ /* foreach_nodetree */ foreach_nodetree,
+ /* localize */ NULL,
+ /* local_sync */ local_sync,
+ /* local_merge */ NULL,
+ /* update */ NULL,
+ /* update_node */ NULL
+};
+
+/* GPU material from shader nodes */
+
+void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
+{
+ bNodeTreeExec *exec;
+
+ if(!ntree->execdata)
+ exec = ntreeShaderBeginExecTree(ntree, 1);
+
+ ntreeExecGPUNodes(exec, mat, 1);
+
+ ntreeShaderEndExecTree(exec, 1);
+}
+
+/* **************** call to switch lamploop for material node ************ */
+
+void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
+
+void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult *))
+{
+ node_shader_lamp_loop= lamp_loop_func;
+}
+
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree, int use_tree_data)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+
+ if (use_tree_data) {
+ /* XXX hack: prevent exec data from being generated twice.
+ * this should be handled by the renderer!
+ */
+ if (ntree->execdata)
+ return ntree->execdata;
+ }
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
+ /* common base initialization */
+ exec = ntree_exec_begin(ntree);
+
+ /* allocate the thread stack listbase array */
+ exec->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next)
+ node->need_exec= 1;
+
+ if (use_tree_data) {
+ /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
+ * which only store the ntree pointer. Should be fixed at some point!
+ */
+ ntree->execdata = exec;
+ }
+
+ return exec;
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+void ntreeShaderEndExecTree(bNodeTreeExec *exec, int use_tree_data)
+{
+ if(exec) {
+ bNodeTree *ntree= exec->nodetree;
+ bNodeThreadStack *nts;
+ int a;
+
+ if(exec->threadstack) {
+ for(a=0; a<BLENDER_MAX_THREADS; a++) {
+ for(nts=exec->threadstack[a].first; nts; nts=nts->next)
+ if (nts->stack) MEM_freeN(nts->stack);
+ BLI_freelistN(&exec->threadstack[a]);
+ }
+
+ MEM_freeN(exec->threadstack);
+ exec->threadstack= NULL;
+ }
+
+ ntree_exec_end(exec);
+
+ if (use_tree_data) {
+ /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
+ ntree->execdata = NULL;
+ }
+ }
+}
+
+void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
+{
+ ShaderCallData scd;
+ /*
+ @note: preserve material from ShadeInput for material id, nodetree execs change it
+ fix for bug "[#28012] Mat ID messy with shader nodes"
+ */
+ Material *mat = shi->mat; bNodeThreadStack *nts = NULL;
+ bNodeTreeExec *exec = ntree->execdata;
+
+ /* convert caller data to struct */
+ scd.shi= shi;
+ scd.shr= shr;
+
+ /* each material node has own local shaderesult, with optional copying */
+ memset(shr, 0, sizeof(ShadeResult));
+
+ if (!exec)
+ exec = ntree->execdata = ntreeShaderBeginExecTree(ntree, 1);
+
+ nts= ntreeGetThreadStack(exec, shi->thread);
+ ntreeExecThreadNodes(exec, nts, &scd, shi->thread);
+ ntreeReleaseThreadStack(nts);
+
+ // @note: set material back to preserved material
+ shi->mat = mat;
+ /* better not allow negative for now */
+ if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f;
+ if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f;
+ if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f;
+}
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c
new file mode 100644
index 00000000000..01dd0f7d5a1
--- /dev/null
+++ b/source/blender/nodes/shader/node_shader_util.c
@@ -0,0 +1,287 @@
+/*
+ * $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 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/shader/node_shader_util.c
+ * \ingroup nodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "node_shader_util.h"
+
+#include "node_exec.h"
+
+/* ****** */
+
+void nodestack_get_vec(float *in, short type_in, bNodeStack *ns)
+{
+ float *from= ns->vec;
+
+ if(type_in==SOCK_FLOAT) {
+ if(ns->sockettype==SOCK_FLOAT)
+ *in= *from;
+ else
+ *in= 0.333333f*(from[0]+from[1]+from[2]);
+ }
+ else if(type_in==SOCK_VECTOR) {
+ if(ns->sockettype==SOCK_FLOAT) {
+ in[0]= from[0];
+ in[1]= from[0];
+ in[2]= from[0];
+ }
+ else {
+ VECCOPY(in, from);
+ }
+ }
+ else { /* type_in==SOCK_RGBA */
+ if(ns->sockettype==SOCK_RGBA) {
+ QUATCOPY(in, from);
+ }
+ else if(ns->sockettype==SOCK_FLOAT) {
+ in[0]= from[0];
+ in[1]= from[0];
+ in[2]= from[0];
+ in[3]= 1.0f;
+ }
+ else {
+ VECCOPY(in, from);
+ in[3]= 1.0f;
+ }
+ }
+}
+
+
+/* ******************* execute and parse ************ */
+
+/* go over all used Geometry and Texture nodes, and return a texco flag */
+/* no group inside needed, this function is called for groups too */
+void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mode)
+{
+ bNode *node;
+ bNodeSocket *sock;
+ int a;
+
+ ntreeSocketUseFlags(ntree);
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==SH_NODE_TEXTURE) {
+ if((r_mode & R_OSA) && node->id) {
+ Tex *tex= (Tex *)node->id;
+ if ELEM3(tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP)
+ *texco |= TEXCO_OSA|NEED_UV;
+ }
+ /* usability exception... without input we still give the node orcos */
+ sock= node->inputs.first;
+ if(sock==NULL || sock->link==NULL)
+ *texco |= TEXCO_ORCO|NEED_UV;
+ }
+ else if(node->type==SH_NODE_GEOMETRY) {
+ /* note; sockets always exist for the given type! */
+ for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
+ if(sock->flag & SOCK_IN_USE) {
+ switch(a) {
+ case GEOM_OUT_GLOB:
+ *texco |= TEXCO_GLOB|NEED_UV; break;
+ case GEOM_OUT_VIEW:
+ *texco |= TEXCO_VIEW|NEED_UV; break;
+ case GEOM_OUT_ORCO:
+ *texco |= TEXCO_ORCO|NEED_UV; break;
+ case GEOM_OUT_UV:
+ *texco |= TEXCO_UV|NEED_UV; break;
+ case GEOM_OUT_NORMAL:
+ *texco |= TEXCO_NORM|NEED_UV; break;
+ case GEOM_OUT_VCOL:
+ *texco |= NEED_UV; *mode |= MA_VERTEXCOL; break;
+ }
+ }
+ }
+ }
+ }
+}
+
+/* nodes that use ID data get synced with local data */
+void nodeShaderSynchronizeID(bNode *node, int copyto)
+{
+ if(node->id==NULL) return;
+
+ if(ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) {
+ bNodeSocket *sock;
+ Material *ma= (Material *)node->id;
+ int a;
+
+ /* hrmf, case in loop isnt super fast, but we dont edit 100s of material at same time either! */
+ for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
+ if(!(sock->flag & SOCK_HIDDEN)) {
+ if(copyto) {
+ switch(a) {
+ case MAT_IN_COLOR:
+ VECCOPY(&ma->r, ((bNodeSocketValueRGBA*)sock->default_value)->value); break;
+ case MAT_IN_SPEC:
+ VECCOPY(&ma->specr, ((bNodeSocketValueRGBA*)sock->default_value)->value); break;
+ case MAT_IN_REFL:
+ ma->ref= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_MIR:
+ VECCOPY(&ma->mirr, ((bNodeSocketValueRGBA*)sock->default_value)->value); break;
+ case MAT_IN_AMB:
+ ma->amb= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_EMIT:
+ ma->emit= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_SPECTRA:
+ ma->spectra= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_RAY_MIRROR:
+ ma->ray_mirror= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_ALPHA:
+ ma->alpha= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_TRANSLUCENCY:
+ ma->translucency= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ }
+ }
+ else {
+ switch(a) {
+ case MAT_IN_COLOR:
+ VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->r); break;
+ case MAT_IN_SPEC:
+ VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->specr); break;
+ case MAT_IN_REFL:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->ref; break;
+ case MAT_IN_MIR:
+ VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->mirr); break;
+ case MAT_IN_AMB:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->amb; break;
+ case MAT_IN_EMIT:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->emit; break;
+ case MAT_IN_SPECTRA:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->spectra; break;
+ case MAT_IN_RAY_MIRROR:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->ray_mirror; break;
+ case MAT_IN_ALPHA:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->alpha; break;
+ case MAT_IN_TRANSLUCENCY:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->translucency; break;
+ }
+ }
+ }
+ }
+ }
+
+}
+
+
+void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, bNodeStack *ns)
+{
+ memset(gs, 0, sizeof(*gs));
+
+ QUATCOPY(gs->vec, ns->vec);
+ gs->link= ns->data;
+
+ if (type == SOCK_FLOAT)
+ gs->type= GPU_FLOAT;
+ else if (type == SOCK_VECTOR)
+ gs->type= GPU_VEC3;
+ else if (type == SOCK_RGBA)
+ gs->type= GPU_VEC4;
+ else
+ gs->type= GPU_NONE;
+
+ gs->name = "";
+ gs->hasinput= ns->hasinput && ns->data;
+ gs->hasoutput= ns->hasoutput && ns->data;
+ gs->sockettype= ns->sockettype;
+}
+
+void node_data_from_gpu_stack(bNodeStack *ns, GPUNodeStack *gs)
+{
+ ns->data= gs->link;
+ ns->sockettype= gs->sockettype;
+}
+
+static void gpu_stack_from_data_list(GPUNodeStack *gs, ListBase *sockets, bNodeStack **ns)
+{
+ bNodeSocket *sock;
+ int i;
+
+ for (sock=sockets->first, i=0; sock; sock=sock->next, i++)
+ node_gpu_stack_from_data(&gs[i], sock->type, ns[i]);
+
+ gs[i].type= GPU_NONE;
+}
+
+static void data_from_gpu_stack_list(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs)
+{
+ bNodeSocket *sock;
+ int i;
+
+ for (sock=sockets->first, i=0; sock; sock=sock->next, i++)
+ node_data_from_gpu_stack(ns[i], &gs[i]);
+}
+
+void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs)
+{
+ bNodeExec *nodeexec;
+ bNode *node;
+ int n;
+ bNodeStack *stack;
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
+ int doit;
+
+ stack= exec->stack;
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+
+ doit = 0;
+ /* for groups, only execute outputs for edited group */
+ if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ if(do_outputs && (node->flag & NODE_DO_OUTPUT))
+ doit = 1;
+ }
+ else
+ doit = 1;
+
+ if (doit) {
+ if(node->typeinfo->gpufunc) {
+ node_get_stack(node, stack, nsin, nsout);
+ gpu_stack_from_data_list(gpuin, &node->inputs, nsin);
+ gpu_stack_from_data_list(gpuout, &node->outputs, nsout);
+ if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
+ data_from_gpu_stack_list(&node->outputs, nsout, gpuout);
+ }
+ else if(node->typeinfo->gpuextfunc) {
+ node_get_stack(node, stack, nsin, nsout);
+ gpu_stack_from_data_list(gpuin, &node->inputs, nsin);
+ gpu_stack_from_data_list(gpuout, &node->outputs, nsout);
+ if(node->typeinfo->gpuextfunc(mat, node, nodeexec->data, gpuin, gpuout))
+ data_from_gpu_stack_list(&node->outputs, nsout, gpuout);
+ }
+ }
+ }
+}
diff --git a/source/blender/nodes/intern/SHD_util.h b/source/blender/nodes/shader/node_shader_util.h
index e6b1377067d..4c929c93517 100644
--- a/source/blender/nodes/intern/SHD_util.h
+++ b/source/blender/nodes/shader/node_shader_util.h
@@ -27,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_util.h
+/** \file blender/nodes/shader/node_shader_util.h
* \ingroup nodes
*/
-#ifndef SHD_NODE_UTIL_H_
-#define SHD_NODE_UTIL_H_
+#ifndef NODE_SHADER_UTIL_H_
+#define NODE_SHADER_UTIL_H_
#include <math.h>
#include <float.h>
@@ -61,7 +61,7 @@
#include "BKE_library.h"
-#include "../SHD_node.h"
+#include "NOD_shader.h"
#include "node_util.h"
#include "BLI_math.h"
@@ -122,4 +122,9 @@ typedef struct ShaderCallData {
extern void node_ID_title_cb(void *node_v, void *unused_v);
void nodestack_get_vec(float *in, short type_in, bNodeStack *ns);
+void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, struct bNodeStack *ns);
+void node_data_from_gpu_stack(struct bNodeStack *ns, struct GPUNodeStack *gs);
+
+void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, int do_outputs);
+
#endif
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c b/source/blender/nodes/shader/nodes/node_shader_camera.c
index eea572bf271..c1e737fcb53 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
+++ b/source/blender/nodes/shader/nodes/node_shader_camera.c
@@ -27,18 +27,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_camera.c
+/** \file blender/nodes/shader/nodes/node_shader_camera.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** CAMERA INFO ******************** */
-static bNodeSocketType sh_node_camera_out[]= {
- { SOCK_VECTOR, 0, "View Vector", 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f}, /* None of these actually */
- { SOCK_VALUE, 0, "View Z Depth", 0.f, 0.0f, 0.0f, 0.0f, 0.0f, 99999999999.0f}, /* have any limits on their */
- { SOCK_VALUE, 0, "View Distance", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 99999999999.0f}, /* values. */
+static bNodeSocketTemplate sh_node_camera_out[]= {
+ { SOCK_VECTOR, 0, "View Vector"},
+ { SOCK_FLOAT, 0, "View Z Depth"},
+ { SOCK_FLOAT, 0, "View Distance"},
{ -1, 0, "" }
};
@@ -63,8 +63,8 @@ void register_node_type_sh_camera(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0,
- NULL, sh_node_camera_out);
+ node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0);
+ node_type_socket_templates(&ntype, NULL, sh_node_camera_out);
node_type_size(&ntype, 95, 95, 120);
node_type_storage(&ntype, "node_camera", NULL, NULL);
node_type_exec(&ntype, node_shader_exec_camera);
diff --git a/source/blender/nodes/shader/nodes/node_shader_common.c b/source/blender/nodes/shader/nodes/node_shader_common.c
new file mode 100644
index 00000000000..2dd15ab1e99
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_common.c
@@ -0,0 +1,327 @@
+/*
+ * $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 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva,
+ * Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/shader/nodes/node_shader_common.c
+ * \ingroup shdnodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
+
+#include "node_shader_util.h"
+#include "node_common.h"
+#include "node_exec.h"
+
+static void copy_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+
+ /* tag as copy to prevent freeing */
+ to->is_copy = 1;
+ }
+}
+
+static void move_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+ to->is_copy = from->is_copy;
+
+ zero_v4(from->vec);
+ from->data = NULL;
+ from->datatype = 0;
+ from->is_copy = 0;
+ }
+}
+
+/**** GROUP ****/
+
+static void *group_initexec(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNodeTreeExec *exec;
+
+ /* initialize the internal node tree execution */
+ exec = ntreeShaderBeginExecTree(ngroup, 0);
+
+ return exec;
+}
+
+static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+{
+ bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata;
+
+ ntreeShaderEndExecTree(gexec, 0);
+}
+
+/* Copy inputs to the internal stack.
+ */
+static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(ns, in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_move_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ move_stack(out[a], ns);
+ }
+ }
+}
+
+static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ group_copy_inputs(node, in, nts->stack);
+ ntreeExecThreadNodes(exec, nts, data, thread);
+ group_move_outputs(node, out, nts->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+static void group_gpu_copy_inputs(bNode *node, GPUNodeStack *in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ /* convert the external gpu stack back to internal node stack data */
+ node_data_from_gpu_stack(ns, &in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_gpu_move_outputs(bNode *node, GPUNodeStack *out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ /* convert the node stack data result back to gpu stack */
+ node_gpu_stack_from_data(&out[a], sock->type, ns);
+ }
+ }
+}
+
+static int gpu_group_execute(GPUMaterial *mat, bNode *node, void *nodedata, GPUNodeStack *in, GPUNodeStack *out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+
+ group_gpu_copy_inputs(node, in, exec->stack);
+ ntreeExecGPUNodes(exec, mat, (node->flag & NODE_GROUP_EDIT));
+ group_gpu_move_outputs(node, out, exec->stack);
+
+ return 1;
+}
+
+void register_node_type_sh_group(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_group_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_group_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute);
+ node_type_gpu_ext(&ntype, gpu_group_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+/**** FOR LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int iterations= (int)in[0]->vec[0];
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Iteration" socket */
+ sock = exec->nodetree->inputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+// group_copy_inputs(node, in, nts->stack);
+ for (iteration=0; iteration < iterations; ++iteration) {
+ /* first input contains current iteration counter */
+ ns->vec[0] = (float)iteration;
+ ns->vec[1]=ns->vec[2]=ns->vec[3] = 0.0f;
+
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_sh_forloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_forloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_forloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
+
+/**** WHILE LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int condition= (in[0]->vec[0] > 0.0f);
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Condition" socket */
+ sock = exec->nodetree->outputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+ iteration = 0;
+// group_copy_inputs(node, in, nts->stack);
+ while (condition && iteration < node->custom1) {
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+
+ condition = (ns->vec[0] > 0.0f);
+ ++iteration;
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_sh_whileloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_whileloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_whileloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c b/source/blender/nodes/shader/nodes/node_shader_curves.c
index a39a639897e..9dedeba6d39 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
+++ b/source/blender/nodes/shader/nodes/node_shader_curves.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_curves.c
+/** \file blender/nodes/shader/nodes/node_shader_curves.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** CURVE VEC ******************** */
-static bNodeSocketType sh_node_curve_vec_in[]= {
- { SOCK_VALUE, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_vec_in[]= {
+ { SOCK_FLOAT, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_curve_vec_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_vec_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
{ -1, 0, "" }
};
@@ -57,7 +57,7 @@ static void node_shader_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeSta
curvemapping_evaluate3F(node->storage, out[0]->vec, vec);
}
-static void node_shader_init_curve_vec(bNode* node)
+static void node_shader_init_curve_vec(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
}
@@ -75,8 +75,8 @@ void register_node_type_sh_curve_vec(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- sh_node_curve_vec_in, sh_node_curve_vec_out);
+ node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_curve_vec_in, sh_node_curve_vec_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_shader_init_curve_vec);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -88,14 +88,14 @@ void register_node_type_sh_curve_vec(ListBase *lb)
/* **************** CURVE RGB ******************** */
-static bNodeSocketType sh_node_curve_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_curve_rgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_rgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -112,7 +112,7 @@ static void node_shader_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeSta
}
}
-static void node_shader_init_curve_rgb(bNode *node)
+static void node_shader_init_curve_rgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
@@ -129,8 +129,8 @@ void register_node_type_sh_curve_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_curve_rgb_in, sh_node_curve_rgb_out);
+ node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_curve_rgb_in, sh_node_curve_rgb_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_shader_init_curve_rgb);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
index d5e5d5eeb93..5aae54d858b 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+++ b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
@@ -27,7 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+/** \file blender/nodes/shader/nodes/node_shader_dynamic.c
* \ingroup shdnodes
*/
@@ -54,7 +54,7 @@
#endif
#endif
-#include "../SHD_util.h"
+#include "node_shader_util.h"
// XXX
#if 0
@@ -95,7 +95,7 @@ static bNodeType *node_dynamic_find_typeinfo(ListBase *list, ID *id)
static void node_dynamic_free_typeinfo_sockets(bNodeType *tinfo)
{
- bNodeSocketType *sock;
+ bNodeSocketTemplate *sock;
if (!tinfo) return;
@@ -782,7 +782,7 @@ void register_node_type_sh_dynamic(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0, NULL, NULL);
+ node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0);
nodeRegisterType(lb, &ntype);
}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/shader/nodes/node_shader_geom.c
index 379f54bec57..585d1e59d15 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
+++ b/source/blender/nodes/shader/nodes/node_shader_geom.c
@@ -27,27 +27,27 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_geom.c
+/** \file blender/nodes/shader/nodes/node_shader_geom.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
#include "DNA_customdata_types.h"
/* **************** GEOMETRY ******************** */
/* output socket type definition */
-static bNodeSocketType sh_node_geom_out[]= {
- { SOCK_VECTOR, 0, "Global", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, /* btw; uses no limit */
- { SOCK_VECTOR, 0, "Local", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "View", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "Orco", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "UV", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 0, "Vertex Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Front/Back", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_geom_out[]= {
+ { SOCK_VECTOR, 0, "Global"},
+ { SOCK_VECTOR, 0, "Local"},
+ { SOCK_VECTOR, 0, "View"},
+ { SOCK_VECTOR, 0, "Orco"},
+ { SOCK_VECTOR, 0, "UV"},
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_RGBA, 0, "Vertex Color"},
+ { SOCK_FLOAT, 0, "Front/Back"},
{ -1, 0, "" }
};
@@ -118,7 +118,7 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(i
}
}
-static void node_shader_init_geometry(bNode *node)
+static void node_shader_init_geometry(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= MEM_callocN(sizeof(NodeGeometry), "NodeGeometry");
}
@@ -140,8 +140,8 @@ void register_node_type_sh_geom(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, sh_node_geom_out);
+ node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, sh_node_geom_out);
node_type_size(&ntype, 120, 80, 160);
node_type_init(&ntype, node_shader_init_geometry);
node_type_storage(&ntype, "NodeGeometry", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
index 91fd995dbbe..f4f69cf56fe 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+/** \file blender/nodes/shader/nodes/node_shader_hueSatVal.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** Hue Saturation ******************** */
-static bNodeSocketType sh_node_hue_sat_in[]= {
- { SOCK_VALUE, 1, "Hue", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f},
- { SOCK_VALUE, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f},
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_hue_sat_in[]= {
+ { SOCK_FLOAT, 1, "Hue", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_hue_sat_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_hue_sat_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -86,8 +86,8 @@ void register_node_type_sh_hue_sat(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_hue_sat_in, sh_node_hue_sat_out);
+ node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_hue_sat_in, sh_node_hue_sat_out);
node_type_size(&ntype, 150, 80, 250);
node_type_exec(&ntype, node_shader_exec_hue_sat);
node_type_gpu(&ntype, gpu_shader_hue_sat);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c b/source/blender/nodes/shader/nodes/node_shader_invert.c
index f8d6e54859e..5347d98b42e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
+++ b/source/blender/nodes/shader/nodes/node_shader_invert.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_invert.c
+/** \file blender/nodes/shader/nodes/node_shader_invert.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** INVERT ******************** */
-static bNodeSocketType sh_node_invert_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_invert_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_invert_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_invert_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -78,8 +78,8 @@ void register_node_type_sh_invert(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_invert_in, sh_node_invert_out);
+ node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_invert_in, sh_node_invert_out);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, node_shader_exec_invert);
node_type_gpu(&ntype, gpu_shader_invert);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c b/source/blender/nodes/shader/nodes/node_shader_mapping.c
index eb300301ce2..05432708b29 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mapping.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_mapping.c
+/** \file blender/nodes/shader/nodes/node_shader_mapping.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** MAPPING ******************** */
-static bNodeSocketType sh_node_mapping_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mapping_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_mapping_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mapping_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
{ -1, 0, "" }
};
@@ -69,7 +69,7 @@ static void node_shader_exec_mapping(void *UNUSED(data), bNode *node, bNodeStack
}
-static void node_shader_init_mapping(bNode *node)
+static void node_shader_init_mapping(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_mapping();
}
@@ -92,8 +92,8 @@ void register_node_type_sh_mapping(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- sh_node_mapping_in, sh_node_mapping_out);
+ node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_mapping_in, sh_node_mapping_out);
node_type_size(&ntype, 240, 160, 320);
node_type_init(&ntype, node_shader_init_mapping);
node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/shader/nodes/node_shader_material.c
index f78dd9ec727..984bfed3ff9 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c
+++ b/source/blender/nodes/shader/nodes/node_shader_material.c
@@ -27,54 +27,54 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_material.c
+/** \file blender/nodes/shader/nodes/node_shader_material.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** MATERIAL ******************** */
-static bNodeSocketType sh_node_material_in[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_material_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { SOCK_FLOAT, 0, "Alpha"},
+ { SOCK_VECTOR, 0, "Normal"},
{ -1, 0, "" }
};
/* **************** EXTENDED MATERIAL ******************** */
-static bNodeSocketType sh_node_material_ext_in[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Mirror", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Ambient", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Emit", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "SpecTra", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Ray Mirror", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Translucency", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_ext_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
+ { SOCK_RGBA, 1, "Mirror", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Ambient", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Emit", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "SpecTra", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Ray Mirror", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "Translucency", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_material_ext_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 0, "Diffuse", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, "AO", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_ext_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { SOCK_FLOAT, 0, "Alpha"},
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_RGBA, 0, "Diffuse"},
+ { SOCK_RGBA, 0, "Spec"},
+ { SOCK_RGBA, 0, "AO"},
{ -1, 0, "" }
};
@@ -112,7 +112,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in,
nodestack_get_vec(&shi->specr, SOCK_VECTOR, in[MAT_IN_SPEC]);
if(hasinput[MAT_IN_REFL])
- nodestack_get_vec(&shi->refl, SOCK_VALUE, in[MAT_IN_REFL]);
+ nodestack_get_vec(&shi->refl, SOCK_FLOAT, in[MAT_IN_REFL]);
/* retrieve normal */
if(hasinput[MAT_IN_NORMAL]) {
@@ -133,17 +133,17 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in,
if(hasinput[MAT_IN_MIR])
nodestack_get_vec(&shi->mirr, SOCK_VECTOR, in[MAT_IN_MIR]);
if(hasinput[MAT_IN_AMB])
- nodestack_get_vec(&shi->amb, SOCK_VALUE, in[MAT_IN_AMB]);
+ nodestack_get_vec(&shi->amb, SOCK_FLOAT, in[MAT_IN_AMB]);
if(hasinput[MAT_IN_EMIT])
- nodestack_get_vec(&shi->emit, SOCK_VALUE, in[MAT_IN_EMIT]);
+ nodestack_get_vec(&shi->emit, SOCK_FLOAT, in[MAT_IN_EMIT]);
if(hasinput[MAT_IN_SPECTRA])
- nodestack_get_vec(&shi->spectra, SOCK_VALUE, in[MAT_IN_SPECTRA]);
+ nodestack_get_vec(&shi->spectra, SOCK_FLOAT, in[MAT_IN_SPECTRA]);
if(hasinput[MAT_IN_RAY_MIRROR])
- nodestack_get_vec(&shi->ray_mirror, SOCK_VALUE, in[MAT_IN_RAY_MIRROR]);
+ nodestack_get_vec(&shi->ray_mirror, SOCK_FLOAT, in[MAT_IN_RAY_MIRROR]);
if(hasinput[MAT_IN_ALPHA])
- nodestack_get_vec(&shi->alpha, SOCK_VALUE, in[MAT_IN_ALPHA]);
+ nodestack_get_vec(&shi->alpha, SOCK_FLOAT, in[MAT_IN_ALPHA]);
if(hasinput[MAT_IN_TRANSLUCENCY])
- nodestack_get_vec(&shi->translucency, SOCK_VALUE, in[MAT_IN_TRANSLUCENCY]);
+ nodestack_get_vec(&shi->translucency, SOCK_FLOAT, in[MAT_IN_TRANSLUCENCY]);
}
shi->nodes= 1; /* temp hack to prevent trashadow recursion */
@@ -204,7 +204,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in,
}
-static void node_shader_init_material(bNode* node)
+static void node_shader_init_material(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC;
}
@@ -308,8 +308,8 @@ void register_node_type_sh_material(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- sh_node_material_in, sh_node_material_out);
+ node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_material_in, sh_node_material_out);
node_type_size(&ntype, 120, 80, 240);
node_type_init(&ntype, node_shader_init_material);
node_type_exec(&ntype, node_shader_exec_material);
@@ -323,8 +323,8 @@ void register_node_type_sh_material_ext(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- sh_node_material_ext_in, sh_node_material_ext_out);
+ node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_material_ext_in, sh_node_material_ext_out);
node_type_size(&ntype, 120, 80, 240);
node_type_init(&ntype, node_shader_init_material);
node_type_exec(&ntype, node_shader_exec_material);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c
index dd0a564dc4b..592779d6803 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_math.c
+++ b/source/blender/nodes/shader/nodes/node_shader_math.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_math.c
+/** \file blender/nodes/shader/nodes/node_shader_math.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** SCALAR MATH ******************** */
-static bNodeSocketType sh_node_math_in[]= {
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate sh_node_math_in[]= {
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_math_out[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_math_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -242,8 +242,8 @@ void register_node_type_sh_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_math_in, sh_node_math_out);
+ node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_math_in, sh_node_math_out);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
node_type_storage(&ntype, "node_math", NULL, NULL);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
index 8b3033a98ca..a9e4f2129be 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+/** \file blender/nodes/shader/nodes/node_shader_mixRgb.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** MIX RGB ******************** */
-static bNodeSocketType sh_node_mix_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mix_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f},
+ { SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_mix_rgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mix_rgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -54,7 +54,7 @@ static void node_shader_exec_mix_rgb(void *UNUSED(data), bNode *node, bNodeStack
float fac;
float vec[3];
- nodestack_get_vec(&fac, SOCK_VALUE, in[0]);
+ nodestack_get_vec(&fac, SOCK_FLOAT, in[0]);
CLAMP(fac, 0.0f, 1.0f);
nodestack_get_vec(col, SOCK_VECTOR, in[1]);
@@ -79,8 +79,8 @@ void register_node_type_sh_mix_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_mix_rgb_in, sh_node_mix_rgb_out);
+ node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_mix_rgb_in, sh_node_mix_rgb_out);
node_type_size(&ntype, 100, 60, 150);
node_type_label(&ntype, node_blend_label);
node_type_exec(&ntype, node_shader_exec_mix_rgb);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c b/source/blender/nodes/shader/nodes/node_shader_normal.c
index a4e39935cea..1ce7c61c593 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal.c
@@ -27,25 +27,36 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_normal.c
+/** \file blender/nodes/shader/nodes/node_shader_normal.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** NORMAL ******************** */
-static bNodeSocketType sh_node_normal_in[]= {
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_normal_in[]= {
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_normal_out[]= {
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VALUE, 0, "Dot", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_normal_out[]= {
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_FLOAT, 0, "Dot"},
{ -1, 0, "" }
};
+static void node_shader_init_normal(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueVector *dval= (bNodeSocketValueVector*)sock->default_value;
+
+ /* output value is used for normal vector */
+ dval->value[0] = 0.0f;
+ dval->value[1] = 0.0f;
+ dval->value[2] = 1.0f;
+}
+
/* generates normal, does dot product */
static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
@@ -57,7 +68,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack
nodestack_get_vec(vec, SOCK_VECTOR, in[0]);
- VECCOPY(out[0]->vec, sock->ns.vec);
+ VECCOPY(out[0]->vec, ((bNodeSocketValueVector*)sock->default_value)->value);
/* render normals point inside... the widget points outside */
out[1]->vec[0]= -INPR(out[0]->vec, vec);
}
@@ -65,7 +76,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack
static int gpu_shader_normal(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
bNodeSocket *sock= node->outputs.first;
- GPUNodeLink *vec = GPU_uniform(sock->ns.vec);
+ GPUNodeLink *vec = GPU_uniform(((bNodeSocketValueVector*)sock->default_value)->value);
return GPU_stack_link(mat, "normal", in, out, vec);
}
@@ -74,8 +85,9 @@ void register_node_type_sh_normal(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- sh_node_normal_in, sh_node_normal_out);
+ node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_normal_in, sh_node_normal_out);
+ node_type_init(&ntype, node_shader_init_normal);
node_type_exec(&ntype, node_shader_exec_normal);
node_type_gpu(&ntype, gpu_shader_normal);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_output.c b/source/blender/nodes/shader/nodes/node_shader_output.c
index e42caabff34..94990bd9cf1 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_output.c
+++ b/source/blender/nodes/shader/nodes/node_shader_output.c
@@ -27,17 +27,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_output.c
+/** \file blender/nodes/shader/nodes/node_shader_output.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** OUTPUT ******************** */
-static bNodeSocketType sh_node_output_in[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_output_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
@@ -49,7 +49,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN
/* stack order input sockets: col, alpha, normal */
nodestack_get_vec(col, SOCK_VECTOR, in[0]);
- nodestack_get_vec(col+3, SOCK_VALUE, in[1]);
+ nodestack_get_vec(col+3, SOCK_FLOAT, in[1]);
if(shi->do_preview) {
nodeAddToPreview(node, col, shi->xs, shi->ys, shi->do_manage);
@@ -84,8 +84,8 @@ void register_node_type_sh_output(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- sh_node_output_in, NULL);
+ node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_output_in, NULL);
node_type_size(&ntype, 80, 60, 200);
node_type_exec(&ntype, node_shader_exec_output);
node_type_gpu(&ntype, gpu_shader_output);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c b/source/blender/nodes/shader/nodes/node_shader_rgb.c
index 3d7f401b055..d612e5c228f 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_rgb.c
@@ -27,30 +27,43 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_rgb.c
+/** \file blender/nodes/shader/nodes/node_shader_rgb.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** RGB ******************** */
-static bNodeSocketType sh_node_rgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_rgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
+static void node_shader_init_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueRGBA *dval= (bNodeSocketValueRGBA*)sock->default_value;
+ /* uses the default value of the output socket, must be initialized here */
+ dval->value[0] = 0.5f;
+ dval->value[1] = 0.5f;
+ dval->value[2] = 0.5f;
+ dval->value[3] = 1.0f;
+}
+
static void node_shader_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
- VECCOPY(out[0]->vec, sock->ns.vec);
+ VECCOPY(out[0]->vec, col);
}
static int gpu_shader_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
bNodeSocket *sock= node->outputs.first;
- GPUNodeLink *vec = GPU_uniform(sock->ns.vec);
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
+ GPUNodeLink *vec = GPU_uniform(col);
return GPU_stack_link(mat, "set_rgba", in, out, vec);
}
@@ -59,8 +72,9 @@ void register_node_type_sh_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, sh_node_rgb_out);
+ node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, sh_node_rgb_out);
+ node_type_init(&ntype, node_shader_init_rgb);
node_type_size(&ntype, 140, 80, 140);
node_type_exec(&ntype, node_shader_exec_rgb);
node_type_gpu(&ntype, gpu_shader_rgb);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
index e4fa0b02521..15a8a4952fb 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+++ b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+/** \file blender/nodes/shader/nodes/node_shader_sepcombRGB.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** SEPARATE RGBA ******************** */
-static bNodeSocketType sh_node_seprgb_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_seprgb_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_seprgb_out[]= {
- { SOCK_VALUE, 0, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_seprgb_out[]= {
+ { SOCK_FLOAT, 0, "R"},
+ { SOCK_FLOAT, 0, "G"},
+ { SOCK_FLOAT, 0, "B"},
{ -1, 0, "" }
};
@@ -62,8 +62,8 @@ void register_node_type_sh_seprgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0,
- sh_node_seprgb_in, sh_node_seprgb_out);
+ node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, sh_node_seprgb_in, sh_node_seprgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_seprgb);
node_type_gpu(&ntype, gpu_shader_seprgb);
@@ -74,14 +74,14 @@ void register_node_type_sh_seprgb(ListBase *lb)
/* **************** COMBINE RGB ******************** */
-static bNodeSocketType sh_node_combrgb_in[]= {
- { SOCK_VALUE, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_combrgb_in[]= {
+ { SOCK_FLOAT, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_combrgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_combrgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -101,8 +101,8 @@ void register_node_type_sh_combrgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_combrgb_in, sh_node_combrgb_out);
+ node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_combrgb_in, sh_node_combrgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_combrgb);
node_type_gpu(&ntype, gpu_shader_combrgb);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c b/source/blender/nodes/shader/nodes/node_shader_squeeze.c
index 80693ff08f0..b9eb116b866 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+++ b/source/blender/nodes/shader/nodes/node_shader_squeeze.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+/** \file blender/nodes/shader/nodes/node_shader_squeeze.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VALUE SQUEEZE ******************** */
-static bNodeSocketType sh_node_squeeze_in[]= {
- { SOCK_VALUE, 1, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Width", 1.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Center", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate sh_node_squeeze_in[]= {
+ { SOCK_FLOAT, 1, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Width", 1.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Center", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_squeeze_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_squeeze_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -52,9 +52,9 @@ bNodeStack **out)
{
float vec[3];
- nodestack_get_vec(vec, SOCK_VALUE, in[0]);
- nodestack_get_vec(vec+1, SOCK_VALUE, in[1]);
- nodestack_get_vec(vec+2, SOCK_VALUE, in[2]);
+ nodestack_get_vec(vec, SOCK_FLOAT, in[0]);
+ nodestack_get_vec(vec+1, SOCK_FLOAT, in[1]);
+ nodestack_get_vec(vec+2, SOCK_FLOAT, in[2]);
out[0]->vec[0] = 1.0f / (1.0f + pow(2.71828183,-((vec[0]-vec[2])*vec[1]))) ;
}
@@ -68,8 +68,8 @@ void register_node_type_sh_squeeze(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_squeeze_in, sh_node_squeeze_out);
+ node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_squeeze_in, sh_node_squeeze_out);
node_type_size(&ntype, 120, 110, 160);
node_type_storage(&ntype, "node_squeeze", NULL, NULL);
node_type_exec(&ntype, node_shader_exec_squeeze);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c b/source/blender/nodes/shader/nodes/node_shader_texture.c
index 249e4eeca5d..09716820800 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
+++ b/source/blender/nodes/shader/nodes/node_shader_texture.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_texture.c
+/** \file blender/nodes/shader/nodes/node_shader_texture.c
* \ingroup shdnodes
*/
#include "DNA_texture_types.h"
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** TEXTURE ******************** */
-static bNodeSocketType sh_node_texture_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, /* no limit */
+static bNodeSocketTemplate sh_node_texture_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE}, /* no limit */
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_texture_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA , 0, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_texture_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
+ { SOCK_RGBA , 0, "Color"},
+ { SOCK_VECTOR, 0, "Normal"},
{ -1, 0, "" }
};
@@ -137,8 +137,8 @@ void register_node_type_sh_texture(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- sh_node_texture_in, sh_node_texture_out);
+ node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_texture_in, sh_node_texture_out);
node_type_size(&ntype, 120, 80, 240);
node_type_exec(&ntype, node_shader_exec_texture);
node_type_gpu(&ntype, gpu_shader_texture);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
index 86f832c12ee..5c1d3096a6e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+/** \file blender/nodes/shader/nodes/node_shader_valToRgb.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VALTORGB ******************** */
-static bNodeSocketType sh_node_valtorgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_valtorgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_valtorgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_valtorgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { SOCK_FLOAT, 0, "Alpha"},
{ -1, 0, "" }
};
@@ -52,14 +52,14 @@ static void node_shader_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStac
if(node->storage) {
float fac;
- nodestack_get_vec(&fac, SOCK_VALUE, in[0]);
+ nodestack_get_vec(&fac, SOCK_FLOAT, in[0]);
do_colorband(node->storage, fac, out[0]->vec);
out[1]->vec[0]= out[0]->vec[3];
}
}
-static void node_shader_init_valtorgb(bNode *node)
+static void node_shader_init_valtorgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_colorband(1);
}
@@ -77,8 +77,8 @@ void register_node_type_sh_valtorgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_valtorgb_in, sh_node_valtorgb_out);
+ node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_valtorgb_in, sh_node_valtorgb_out);
node_type_size(&ntype, 240, 200, 300);
node_type_init(&ntype, node_shader_init_valtorgb);
node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
@@ -90,12 +90,12 @@ void register_node_type_sh_valtorgb(ListBase *lb)
/* **************** RGBTOBW ******************** */
-static bNodeSocketType sh_node_rgbtobw_in[]= {
+static bNodeSocketTemplate sh_node_rgbtobw_in[]= {
{ SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_rgbtobw_out[]= {
- { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_rgbtobw_out[]= {
+ { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -117,8 +117,8 @@ void register_node_type_sh_rgbtobw(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
- sh_node_rgbtobw_in, sh_node_rgbtobw_out);
+ node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, sh_node_rgbtobw_in, sh_node_rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_shader_exec_rgbtobw);
node_type_gpu(&ntype, gpu_shader_rgbtobw);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c
index 29a75bbf36d..119a3664308 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_value.c
+++ b/source/blender/nodes/shader/nodes/node_shader_value.c
@@ -27,30 +27,43 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_value.c
+/** \file blender/nodes/shader/nodes/node_shader_value.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VALUE ******************** */
-static bNodeSocketType sh_node_value_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate sh_node_value_out[]= {
+ /* XXX value nodes use the output sockets for buttons, so we need explicit limits here! */
+ { SOCK_FLOAT, 0, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{ -1, 0, "" }
};
+static void node_shader_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value;
+ /* uses the default value of the output socket, must be initialized here */
+ dval->value = 0.5f;
+ dval->min = -FLT_MAX;
+ dval->max = FLT_MAX;
+}
+
static void node_shader_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float val= ((bNodeSocketValueFloat*)sock->default_value)->value;
- out[0]->vec[0]= sock->ns.vec[0];
+ out[0]->vec[0]= val;
}
static int gpu_shader_value(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
bNodeSocket *sock= node->outputs.first;
- GPUNodeLink *vec = GPU_uniform(sock->ns.vec);
+ float *val= &((bNodeSocketValueFloat*)sock->default_value)->value;
+ GPUNodeLink *vec = GPU_uniform(val);
return GPU_stack_link(mat, "set_value", in, out, vec);
}
@@ -59,8 +72,9 @@ void register_node_type_sh_value(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, sh_node_value_out);
+ node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, sh_node_value_out);
+ node_type_init(&ntype, node_shader_init_value);
node_type_size(&ntype, 80, 50, 120);
node_type_exec(&ntype, node_shader_exec_value);
node_type_gpu(&ntype, gpu_shader_value);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
index 9979e488a71..ca31d879e3e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+++ b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+/** \file blender/nodes/shader/nodes/node_shader_vectMath.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VECTOR MATH ******************** */
-static bNodeSocketType sh_node_vect_math_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_vect_math_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_vect_math_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_vect_math_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -136,8 +136,8 @@ void register_node_type_sh_vect_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_vect_math_in, sh_node_vect_math_out);
+ node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_vect_math_in, sh_node_vect_math_out);
node_type_size(&ntype, 80, 75, 140);
node_type_label(&ntype, node_vect_math_label);
node_type_storage(&ntype, "node_vect_math", NULL, NULL);
diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c
new file mode 100644
index 00000000000..603aa7ceb77
--- /dev/null
+++ b/source/blender/nodes/texture/node_texture_tree.c
@@ -0,0 +1,251 @@
+/**
+ * $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) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/texture/node_texture_tree.c
+ * \ingroup nodes
+ */
+
+
+#include <string.h>
+
+#include "DNA_texture_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_node.h"
+
+#include "node_exec.h"
+#include "node_util.h"
+#include "NOD_texture.h"
+#include "node_texture_util.h"
+
+#include "RE_pipeline.h"
+#include "RE_shader_ext.h"
+
+
+static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
+{
+ Tex *tx;
+ for(tx= main->tex.first; tx; tx= tx->id.next) {
+ if(tx->nodetree) {
+ func(calldata, &tx->id, tx->nodetree);
+ }
+ }
+}
+
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+
+ /* copy over contents of previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ bNode *node= lnode->new_node;
+
+ if(node->preview && node->preview->rect) {
+ if(lnode->preview && lnode->preview->rect) {
+ int xsize= node->preview->xsize;
+ int ysize= node->preview->ysize;
+ memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
+ }
+ }
+ }
+ }
+}
+
+bNodeTreeType ntreeType_Texture = {
+ /* type */ NTREE_TEXTURE,
+ /* id_name */ "NTTexture Nodetree",
+
+ /* node_types */ { NULL, NULL },
+
+ /* free_cache */ NULL,
+ /* free_node_cache */ NULL,
+ /* foreach_nodetree */ foreach_nodetree,
+ /* localize */ NULL,
+ /* local_sync */ local_sync,
+ /* local_merge */ NULL,
+ /* update */ NULL,
+ /* update_node */ NULL
+};
+
+int ntreeTexTagAnimated(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return 0;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==TEX_NODE_CURVE_TIME) {
+ NodeTagChanged(ntree, node);
+ return 1;
+ }
+ else if(node->type==NODE_GROUP) {
+ if( ntreeTexTagAnimated((bNodeTree *)node->id) ) {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+bNodeTreeExec *ntreeTexBeginExecTree(bNodeTree *ntree, int use_tree_data)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+
+ if (use_tree_data) {
+ /* XXX hack: prevent exec data from being generated twice.
+ * this should be handled by the renderer!
+ */
+ if (ntree->execdata)
+ return ntree->execdata;
+ }
+
+ /* common base initialization */
+ exec = ntree_exec_begin(ntree);
+
+ /* allocate the thread stack listbase array */
+ exec->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next)
+ node->need_exec= 1;
+
+ if (use_tree_data) {
+ /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
+ * which only store the ntree pointer. Should be fixed at some point!
+ */
+ ntree->execdata = exec;
+ }
+
+ return exec;
+}
+
+/* free texture delegates */
+static void tex_free_delegates(bNodeTreeExec *exec)
+{
+ bNodeThreadStack *nts;
+ bNodeStack *ns;
+ int th, a;
+
+ for(th=0; th<BLENDER_MAX_THREADS; th++)
+ for(nts=exec->threadstack[th].first; nts; nts=nts->next)
+ for(ns= nts->stack, a=0; a<exec->stacksize; a++, ns++)
+ if(ns->data && !ns->is_copy)
+ MEM_freeN(ns->data);
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+void ntreeTexEndExecTree(bNodeTreeExec *exec, int use_tree_data)
+{
+ if(exec) {
+ bNodeTree *ntree= exec->nodetree;
+ bNodeThreadStack *nts;
+ int a;
+
+ if(exec->threadstack) {
+ tex_free_delegates(exec);
+
+ for(a=0; a<BLENDER_MAX_THREADS; a++) {
+ for(nts=exec->threadstack[a].first; nts; nts=nts->next)
+ if (nts->stack) MEM_freeN(nts->stack);
+ BLI_freelistN(&exec->threadstack[a]);
+ }
+
+ MEM_freeN(exec->threadstack);
+ exec->threadstack= NULL;
+ }
+
+ ntree_exec_end(exec);
+
+ if (use_tree_data) {
+ /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
+ ntree->execdata = NULL;
+ }
+ }
+}
+
+int ntreeTexExecTree(
+ bNodeTree *nodes,
+ TexResult *texres,
+ float *co,
+ float *dxt, float *dyt,
+ int osatex,
+ short thread,
+ Tex *UNUSED(tex),
+ short which_output,
+ int cfra,
+ int preview,
+ ShadeInput *shi,
+ MTex *mtex
+){
+ TexCallData data;
+ float *nor= texres->nor;
+ int retval = TEX_INT;
+ bNodeThreadStack *nts = NULL;
+ bNodeTreeExec *exec= nodes->execdata;
+
+ data.co = co;
+ data.dxt = dxt;
+ data.dyt = dyt;
+ data.osatex = osatex;
+ data.target = texres;
+ data.do_preview = preview;
+ data.thread = thread;
+ data.which_output = which_output;
+ data.cfra= cfra;
+ data.mtex= mtex;
+ data.shi= shi;
+
+ if (!exec)
+ exec = ntreeTexBeginExecTree(nodes, 1);
+
+ nts= ntreeGetThreadStack(exec, thread);
+ ntreeExecThreadNodes(exec, nts, &data, thread);
+ ntreeReleaseThreadStack(nts);
+
+ if(texres->nor) retval |= TEX_NOR;
+ retval |= TEX_RGB;
+ /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set
+ however, the texture code checks this for other reasons (namely, a normal is required for material) */
+ texres->nor= nor;
+
+ return retval;
+}
diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/texture/node_texture_util.c
index b5e27ca2ccb..7b8f42aa925 100644
--- a/source/blender/nodes/intern/TEX_util.c
+++ b/source/blender/nodes/texture/node_texture_util.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_util.c
+/** \file blender/nodes/texture/node_texture_util.c
* \ingroup nodes
*/
@@ -48,11 +49,11 @@
*/
#include <assert.h>
-#include "TEX_util.h"
+#include "node_texture_util.h"
#define PREV_RES 128 /* default preview resolution */
-void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
+static void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
{
if(dg->node->need_exec) {
dg->fn(out, params, dg->node, dg->in, thread);
@@ -68,7 +69,7 @@ static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, sho
if(dg) {
tex_call_delegate(dg, in->vec, params, thread);
- if(in->hasoutput && in->sockettype == SOCK_VALUE)
+ if(in->hasoutput && in->sockettype == SOCK_FLOAT)
in->vec[1] = in->vec[2] = in->vec[0];
}
memcpy(out, in->vec, sz * sizeof(float));
@@ -83,7 +84,7 @@ void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread)
{
tex_input(out, 4, in, params, thread);
- if(in->hasoutput && in->sockettype == SOCK_VALUE)
+ if(in->hasoutput && in->sockettype == SOCK_FLOAT)
{
out[1] = out[2] = out[0];
out[3] = 1;
@@ -170,45 +171,3 @@ void ntreeTexCheckCyclics(struct bNodeTree *ntree)
}
}
-
-int ntreeTexExecTree(
- bNodeTree *nodes,
- TexResult *texres,
- float *co,
- float *dxt, float *dyt,
- int osatex,
- short thread,
- Tex *UNUSED(tex),
- short which_output,
- int cfra,
- int preview,
- ShadeInput *shi,
- MTex *mtex
-){
- TexCallData data;
- float *nor= texres->nor;
- int retval = TEX_INT;
-
- data.co = co;
- data.dxt = dxt;
- data.dyt = dyt;
- data.osatex = osatex;
- data.target = texres;
- data.do_preview = preview;
- data.thread = thread;
- data.which_output = which_output;
- data.cfra= cfra;
- data.mtex= mtex;
- data.shi= shi;
-
- ntreeExecTree(nodes, &data, thread);
-
- if(texres->nor) retval |= TEX_NOR;
- retval |= TEX_RGB;
- /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set
- however, the texture code checks this for other reasons (namely, a normal is required for material) */
- texres->nor= nor;
-
- return retval;
-}
-
diff --git a/source/blender/nodes/intern/TEX_util.h b/source/blender/nodes/texture/node_texture_util.h
index 0875bcd52bf..ccaf5df9897 100644
--- a/source/blender/nodes/intern/TEX_util.h
+++ b/source/blender/nodes/texture/node_texture_util.h
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_util.h
+/** \file blender/nodes/texture/node_texture_util.h
* \ingroup nodes
*/
-#ifndef TEX_NODE_UTIL_H_
-#define TEX_NODE_UTIL_H_
+#ifndef NODE_TEXTURE_UTIL_H_
+#define NODE_TEXTURE_UTIL_H_
#include <math.h>
#include <string.h>
@@ -60,7 +61,6 @@
#include "BKE_library.h"
-#include "../SHD_node.h"
#include "node_util.h"
#include "BLI_math.h"
@@ -112,8 +112,6 @@ typedef struct TexDelegate {
int type;
} TexDelegate;
-void tex_call_delegate(TexDelegate*, float *out, TexParams *params, short thread);
-
void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread);
void tex_input_vec(float *out, bNodeStack *in, TexParams *params, short thread);
float tex_input_value(bNodeStack *in, TexParams *params, short thread);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/texture/nodes/node_texture_at.c
index d5980b786b0..34993a93092 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_at.c
+++ b/source/blender/nodes/texture/nodes/node_texture_at.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_at.c
+/** \file blender/nodes/texture/nodes/node_texture_at.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Texture" },
{ -1, 0, "" }
};
@@ -63,8 +64,8 @@ void register_node_type_tex_at(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c b/source/blender/nodes/texture/nodes/node_texture_bricks.c
index 0eb982496a9..a9a82fe4d65 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
+++ b/source/blender/nodes/texture/nodes/node_texture_bricks.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,32 +27,33 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_bricks.c
+/** \file blender/nodes/texture/nodes/node_texture_bricks.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Bricks 1", 0.596f, 0.282f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Bricks 2", 0.632f, 0.504f, 0.05f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Mortar", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Thickness", 0.02f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Bias", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
- { SOCK_VALUE, 1, "Brick Width", 0.5f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f },
- { SOCK_VALUE, 1, "Row Height", 0.25f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Bricks 1", 0.596f, 0.282f, 0.0f, 1.0f },
+ { SOCK_RGBA, 1, "Bricks 2", 0.632f, 0.504f, 0.05f, 1.0f },
+ { SOCK_RGBA, 1, "Mortar", 0.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_FLOAT, 1, "Thickness", 0.02f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Bias", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "Brick Width", 0.5f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Row Height", 0.25f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
-static void init(bNode *node) {
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
node->custom3 = 0.5; /* offset */
node->custom4 = 1.0; /* squash */
}
@@ -123,8 +125,8 @@ void register_node_type_tex_bricks(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 150, 60, 150);
node_type_init(&ntype, init);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c b/source/blender/nodes/texture/nodes/node_texture_checker.c
index c6c25ba1a8a..7762c9ef992 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
+++ b/source/blender/nodes/texture/nodes/node_texture_checker.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_checker.c
+/** \file blender/nodes/texture/nodes/node_texture_checker.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color1", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color2", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Size", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color1", 1.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_RGBA, 1, "Color2", 1.0f, 1.0f, 1.0f, 1.0f },
+ { SOCK_FLOAT, 1, "Size", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -74,8 +75,8 @@ void register_node_type_tex_checker(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/texture/nodes/node_texture_common.c b/source/blender/nodes/texture/nodes/node_texture_common.c
new file mode 100644
index 00000000000..1b46b830909
--- /dev/null
+++ b/source/blender/nodes/texture/nodes/node_texture_common.c
@@ -0,0 +1,271 @@
+/*
+ * $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 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva,
+ * Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/texture/nodes/node_texture_common.c
+ * \ingroup texnodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
+
+#include "node_texture_util.h"
+#include "node_common.h"
+#include "node_exec.h"
+
+static void copy_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+
+ /* tag as copy to prevent freeing */
+ to->is_copy = 1;
+ }
+}
+
+/**** GROUP ****/
+
+static void *group_initexec(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ void *exec;
+
+ /* initialize the internal node tree execution */
+ exec = ntreeTexBeginExecTree(ngroup, 0);
+
+ return exec;
+}
+
+static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+{
+ bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata;
+
+ ntreeTexEndExecTree(gexec, 0);
+}
+
+/* Copy inputs to the internal stack.
+ * This is a shallow copy, no buffers are duplicated here!
+ */
+static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(ns, in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_copy_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(out[a], ns);
+ }
+ }
+}
+
+static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ group_copy_inputs(node, in, nts->stack);
+ ntreeExecThreadNodes(exec, nts, data, thread);
+ group_copy_outputs(node, out, nts->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_tex_group(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_group_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_group_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+/**** FOR LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int iterations= (int)in[0]->vec[0];
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Iteration" socket */
+ sock = exec->nodetree->inputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+// group_copy_inputs(node, in, nts->stack);
+ for (iteration=0; iteration < iterations; ++iteration) {
+ /* first input contains current iteration counter */
+ ns->vec[0] = (float)iteration;
+ ns->vec[1]=ns->vec[2]=ns->vec[3] = 0.0f;
+
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_tex_forloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_forloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_forloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
+
+/**** WHILE LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int condition= (in[0]->vec[0] > 0.0f);
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Condition" socket */
+ sock = exec->nodetree->outputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+ iteration = 0;
+// group_copy_inputs(node, in, nts->stack);
+ while (condition && iteration < node->custom1) {
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+
+ condition = (ns->vec[0] > 0.0f);
+ ++iteration;
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_tex_whileloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_whileloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_whileloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c b/source/blender/nodes/texture/nodes/node_texture_compose.c
index 6eae78ec3de..d224ae793e2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
+++ b/source/blender/nodes/texture/nodes/node_texture_compose.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_compose.c
+/** \file blender/nodes/texture/nodes/node_texture_compose.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -62,8 +63,8 @@ void register_node_type_tex_compose(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/texture/nodes/node_texture_coord.c
index 3c46971f0d4..2bfa2ff2314 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
+++ b/source/blender/nodes/texture/nodes/node_texture_coord.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,16 +27,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_coord.c
+/** \file blender/nodes/texture/nodes/node_texture_coord.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType outputs[]= {
- { SOCK_VECTOR, 0, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_VECTOR, 0, "Coordinates" },
{ -1, 0, "" }
};
@@ -55,8 +56,8 @@ void register_node_type_tex_coord(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, outputs);
+ node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, outputs);
node_type_size(&ntype, 120, 110, 160);
node_type_storage(&ntype, "node_coord", NULL, NULL);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/texture/nodes/node_texture_curves.c
index b7af6c748ff..dd65f979bbe 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
+++ b/source/blender/nodes/texture/nodes/node_texture_curves.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_curves.c
+/** \file blender/nodes/texture/nodes/node_texture_curves.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** CURVE Time ******************** */
/* custom1 = sfra, custom2 = efra */
-static bNodeSocketType time_outputs[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate time_outputs[]= {
+ { SOCK_FLOAT, 0, "Value" },
{ -1, 0, "" }
};
@@ -60,7 +61,7 @@ static void time_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out
}
-static void time_init(bNode* node)
+static void time_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= 1;
node->custom2= 250;
@@ -71,8 +72,8 @@ void register_node_type_tex_curve_time(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, time_outputs);
+ node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, time_outputs);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, time_init);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -82,13 +83,13 @@ void register_node_type_tex_curve_time(ListBase *lb)
}
/* **************** CURVE RGB ******************** */
-static bNodeSocketType rgb_inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate rgb_inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType rgb_outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate rgb_outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -106,7 +107,7 @@ static void rgb_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &rgb_colorfn, data);
}
-static void rgb_init(bNode *node)
+static void rgb_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
@@ -115,8 +116,8 @@ void register_node_type_tex_curve_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- rgb_inputs, rgb_outputs);
+ node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, rgb_inputs, rgb_outputs);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, rgb_init);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c b/source/blender/nodes/texture/nodes/node_texture_decompose.c
index f27d8c98716..016ee5498d8 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
+++ b/source/blender/nodes/texture/nodes/node_texture_decompose.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_decompose.c
+/** \file blender/nodes/texture/nodes/node_texture_decompose.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VALUE, 0, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 0, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 0, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_FLOAT, 0, "Red" },
+ { SOCK_FLOAT, 0, "Green" },
+ { SOCK_FLOAT, 0, "Blue" },
+ { SOCK_FLOAT, 0, "Alpha" },
{ -1, 0, "" }
};
@@ -83,8 +84,8 @@ void register_node_type_tex_decompose(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/texture/nodes/node_texture_distance.c
index b460844ba4a..ef3f701d8f3 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
+++ b/source/blender/nodes/texture/nodes/node_texture_distance.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_distance.c
+/** \file blender/nodes/texture/nodes/node_texture_distance.c
* \ingroup texnodes
*/
#include <math.h>
#include "BLI_math.h"
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
- { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
+ { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_FLOAT, 0, "Value" },
{ -1, 0, "" }
};
@@ -66,8 +67,8 @@ void register_node_type_tex_distance(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 120, 110, 160);
node_type_storage(&ntype, "node_distance", NULL, NULL);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c
index 471d8db2c03..cd7ebb18018 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+++ b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+/** \file blender/nodes/texture/nodes/node_texture_hueSatVal.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Hue", 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f },
- { SOCK_VALUE, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f },
- { SOCK_VALUE, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f },
- { SOCK_VALUE, 1, "Factor", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Hue", 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f, PROP_NONE },
+ { SOCK_FLOAT, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR },
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR },
+ { SOCK_FLOAT, 1, "Factor", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR },
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -97,8 +98,8 @@ void register_node_type_tex_hue_sat(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 150, 80, 250);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/texture/nodes/node_texture_image.c
index a54ca4bb119..6e749a80d99 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c
+++ b/source/blender/nodes/texture/nodes/node_texture_image.c
@@ -27,16 +27,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_image.c
+/** \file blender/nodes/texture/nodes/node_texture_image.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -88,7 +88,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-static void init(bNode* node)
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -101,8 +101,8 @@ void register_node_type_tex_image(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- NULL, outputs);
+ node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, outputs);
node_type_size(&ntype, 120, 80, 300);
node_type_init(&ntype, init);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c b/source/blender/nodes/texture/nodes/node_texture_invert.c
index e908bdcff07..d18bb86d5fa 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
+++ b/source/blender/nodes/texture/nodes/node_texture_invert.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_invert.c
+/** \file blender/nodes/texture/nodes/node_texture_invert.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** INVERT ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -68,8 +69,8 @@ void register_node_type_tex_invert(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/texture/nodes/node_texture_math.c
index 18468bdd55c..04f399069c1 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c
+++ b/source/blender/nodes/texture/nodes/node_texture_math.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_math.c
+/** \file blender/nodes/texture/nodes/node_texture_math.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** SCALAR MATH ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -189,8 +190,8 @@ void register_node_type_tex_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
node_type_storage(&ntype, "node_math", NULL, NULL);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c
index c7668c27b99..933a0302df8 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+++ b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+/** \file blender/nodes/texture/nodes/node_texture_mixRgb.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** MIX RGB ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA , 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR },
+ { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f },
+ { SOCK_RGBA , 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -69,8 +70,8 @@ void register_node_type_tex_mix_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_label(&ntype, node_blend_label);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_output.c b/source/blender/nodes/texture/nodes/node_texture_output.c
index 046ad724507..3095e224446 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_output.c
+++ b/source/blender/nodes/texture/nodes/node_texture_output.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,18 +27,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_output.c
+/** \file blender/nodes/texture/nodes/node_texture_output.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** COMPOSITE ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, PROP_DIRECTION},
{ -1, 0, "" }
};
@@ -141,7 +142,7 @@ static void assign_index(struct bNode *node)
node->custom1 = index;
}
-static void init(bNode *node)
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
TexNodeOutput *tno = MEM_callocN(sizeof(TexNodeOutput), "TEX_output");
node->storage= tno;
@@ -162,8 +163,8 @@ void register_node_type_tex_output(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- inputs, NULL);
+ node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, NULL);
node_type_size(&ntype, 150, 60, 200);
node_type_init(&ntype, init);
node_type_storage(&ntype, "TexNodeOutput", node_free_standard_storage, copy);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/texture/nodes/node_texture_proc.c
index 294c1f7322f..237e4d6923d 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
+++ b/source/blender/nodes/texture/nodes/node_texture_proc.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_proc.c
+/** \file blender/nodes/texture/nodes/node_texture_proc.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include "RE_shader_ext.h"
@@ -41,21 +42,21 @@
*/
-static bNodeSocketType outputs_both[]= {
- { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs_both[]= {
+ { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, PROP_DIRECTION },
{ -1, 0, "" }
};
-static bNodeSocketType outputs_color_only[]= {
- { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs_color_only[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
/* Inputs common to all, #defined because nodes will need their own inputs too */
#define I 2 /* count */
#define COMMON_INPUTS \
- { SOCK_RGBA, 1, "Color 1", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, \
- { SOCK_RGBA, 1, "Color 2", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }
+ { SOCK_RGBA, 1, "Color 1", 0.0f, 0.0f, 0.0f, 1.0f }, \
+ { SOCK_RGBA, 1, "Color 2", 1.0f, 1.0f, 1.0f, 1.0f }
/* Calls multitex and copies the result to the outputs. Called by xxx_exec, which handles inputs. */
static void do_proc(float *result, TexParams *p, float *col1, float *col2, char is_normal, Tex *tex, short thread)
@@ -139,15 +140,15 @@ static int count_outputs(bNode *node)
/* --- VORONOI -- */
-static bNodeSocketType voronoi_inputs[]= {
+static bNodeSocketTemplate voronoi_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "W1", 1.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
- { SOCK_VALUE, 1, "W2", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
- { SOCK_VALUE, 1, "W3", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
- { SOCK_VALUE, 1, "W4", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
+ { SOCK_FLOAT, 1, "W1", 1.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "W2", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "W3", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "W4", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
- { SOCK_VALUE, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.01f, 10.0f },
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 4.0f },
+ { SOCK_FLOAT, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.01f, 10.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 4.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
@@ -164,7 +165,7 @@ static void voronoi_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short th
ProcDef(voronoi)
/* --- BLEND -- */
-static bNodeSocketType blend_inputs[]= {
+static bNodeSocketTemplate blend_inputs[]= {
COMMON_INPUTS,
{ -1, 0, "" }
};
@@ -172,9 +173,9 @@ ProcNoInputs(blend)
ProcDef(blend)
/* -- MAGIC -- */
-static bNodeSocketType magic_inputs[]= {
+static bNodeSocketTemplate magic_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void magic_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -184,10 +185,10 @@ static void magic_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thre
ProcDef(magic)
/* --- MARBLE --- */
-static bNodeSocketType marble_inputs[]= {
+static bNodeSocketTemplate marble_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void marble_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -198,9 +199,9 @@ static void marble_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thr
ProcDef(marble)
/* --- CLOUDS --- */
-static bNodeSocketType clouds_inputs[]= {
+static bNodeSocketTemplate clouds_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void clouds_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -210,10 +211,10 @@ static void clouds_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thr
ProcDef(clouds)
/* --- DISTORTED NOISE --- */
-static bNodeSocketType distnoise_inputs[]= {
+static bNodeSocketTemplate distnoise_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Distortion", 1.00f, 0.0f, 0.0f, 0.0f, 0.0000f, 10.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Distortion", 1.00f, 0.0f, 0.0f, 0.0f, 0.0000f, 10.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void distnoise_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -224,10 +225,10 @@ static void distnoise_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short
ProcDef(distnoise)
/* --- WOOD --- */
-static bNodeSocketType wood_inputs[]= {
+static bNodeSocketTemplate wood_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void wood_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -238,14 +239,14 @@ static void wood_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short threa
ProcDef(wood)
/* --- MUSGRAVE --- */
-static bNodeSocketType musgrave_inputs[]= {
+static bNodeSocketTemplate musgrave_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "H", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Lacunarity", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f },
- { SOCK_VALUE, 1, "Octaves", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f },
+ { SOCK_FLOAT, 1, "H", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Lacunarity", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Octaves", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f, PROP_UNSIGNED },
- { SOCK_VALUE, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f },
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
+ { SOCK_FLOAT, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void musgrave_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -259,7 +260,7 @@ static void musgrave_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short t
ProcDef(musgrave)
/* --- NOISE --- */
-static bNodeSocketType noise_inputs[]= {
+static bNodeSocketTemplate noise_inputs[]= {
COMMON_INPUTS,
{ -1, 0, "" }
};
@@ -267,10 +268,10 @@ ProcNoInputs(noise)
ProcDef(noise)
/* --- STUCCI --- */
-static bNodeSocketType stucci_inputs[]= {
+static bNodeSocketTemplate stucci_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void stucci_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -282,7 +283,7 @@ ProcDef(stucci)
/* --- */
-static void init(bNode *node)
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
Tex *tex = MEM_callocN(sizeof(Tex), "Tex");
node->storage= tex;
@@ -301,7 +302,8 @@ void register_node_type_tex_proc_##name(ListBase *lb) \
{ \
static bNodeType ntype; \
\
- node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS, name##_inputs, outputs); \
+ node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS); \
+ node_type_socket_templates(&ntype, name##_inputs, outputs); \
node_type_size(&ntype, 140, 80, 140); \
node_type_init(&ntype, init); \
node_type_storage(&ntype, "Tex", node_free_standard_storage, node_copy_standard_storage); \
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/texture/nodes/node_texture_rotate.c
index 1be6152a2b3..afba9f199f9 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
+++ b/source/blender/nodes/texture/nodes/node_texture_rotate.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_rotate.c
+/** \file blender/nodes/texture/nodes/node_texture_rotate.c
* \ingroup texnodes
*/
#include <math.h>
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Turns", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
- { SOCK_VECTOR, 1, "Axis", 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Turns", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
+ { SOCK_VECTOR, 1, "Axis", 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, PROP_DIRECTION },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -100,8 +101,8 @@ void register_node_type_tex_rotate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/texture/nodes/node_texture_scale.c
index cfffcfda2e5..e3aee35977a 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
+++ b/source/blender/nodes/texture/nodes/node_texture_scale.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_scale.c
+/** \file blender/nodes/texture/nodes/node_texture_scale.c
* \ingroup texnodes
*/
#include <math.h>
-#include "../TEX_util.h"
+#include "node_texture_util.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f, PROP_FACTOR },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -73,8 +74,8 @@ void register_node_type_tex_scale(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/texture/nodes/node_texture_texture.c
index c58595866af..96d6325671a 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
+++ b/source/blender/nodes/texture/nodes/node_texture_texture.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_texture.c
+/** \file blender/nodes/texture/nodes/node_texture_texture.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include "RE_shader_ext.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color1", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color1", 1.0f, 1.0f, 1.0f, 1.0f },
+ { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -53,7 +54,7 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
static float red[] = {1,0,0,1};
static float white[] = {1,1,1,1};
float co[3], dxt[3], dyt[3];
-
+
copy_v3_v3(co, p->co);
copy_v3_v3(dxt, p->dxt);
copy_v3_v3(dyt, p->dyt);
@@ -70,7 +71,7 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
tex_input_rgba(col1, in[0], p, thread);
tex_input_rgba(col2, in[1], p, thread);
-
+
texres.nor = nor;
textype = multitex_nodes(nodetex, co, dxt, dyt, p->osatex,
&texres, thread, 0, p->shi, p->mtex);
@@ -94,8 +95,8 @@ void register_node_type_tex_texture(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 120, 80, 240);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c b/source/blender/nodes/texture/nodes/node_texture_translate.c
index 8f7d6d837d7..b970bfbff76 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
+++ b/source/blender/nodes/texture/nodes/node_texture_translate.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_translate.c
+/** \file blender/nodes/texture/nodes/node_texture_translate.c
* \ingroup texnodes
*/
#include <math.h>
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_TRANSLATION },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -69,8 +70,8 @@ void register_node_type_tex_translate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c b/source/blender/nodes/texture/nodes/node_texture_valToNor.c
index e430c0c9a95..523f416568c 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+++ b/source/blender/nodes/texture/nodes/node_texture_valToNor.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+/** \file blender/nodes/texture/nodes/node_texture_valToNor.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Nabla", 0.025f, 0.0f, 0.0f, 0.0f, 0.001f, 0.1f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "Nabla", 0.025f, 0.0f, 0.0f, 0.0f, 0.001f, 0.1f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_VECTOR, 0, "Normal" },
{ -1, 0, "" }
};
@@ -85,8 +86,8 @@ void register_node_type_tex_valtonor(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c
index 8f59828081c..6398a398b32 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+++ b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+/** \file blender/nodes/texture/nodes/node_texture_valToRgb.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** VALTORGB ******************** */
-static bNodeSocketType valtorgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate valtorgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType valtorgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate valtorgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -59,7 +59,7 @@ static void valtorgb_exec(void *data, bNode *node, bNodeStack **in, bNodeStack *
tex_output(node, in, out[0], &valtorgb_colorfn, data);
}
-static void valtorgb_init(bNode *node)
+static void valtorgb_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage = add_colorband(1);
}
@@ -68,8 +68,8 @@ void register_node_type_tex_valtorgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- valtorgb_in, valtorgb_out);
+ node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, valtorgb_in, valtorgb_out);
node_type_size(&ntype, 240, 200, 300);
node_type_init(&ntype, valtorgb_init);
node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
@@ -79,12 +79,12 @@ void register_node_type_tex_valtorgb(ListBase *lb)
}
/* **************** RGBTOBW ******************** */
-static bNodeSocketType rgbtobw_in[]= {
+static bNodeSocketTemplate rgbtobw_in[]= {
{ SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType rgbtobw_out[]= {
- { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate rgbtobw_out[]= {
+ { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -106,8 +106,8 @@ void register_node_type_tex_rgbtobw(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
- rgbtobw_in, rgbtobw_out);
+ node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, rgbtobw_in, rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, rgbtobw_exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c b/source/blender/nodes/texture/nodes/node_texture_viewer.c
index e917e525e17..b0aa74a83b2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
+++ b/source/blender/nodes/texture/nodes/node_texture_viewer.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_viewer.c
+/** \file blender/nodes/texture/nodes/node_texture_viewer.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 1.0f, 0.0f, 0.0f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
+static bNodeSocketTemplate outputs[]= {
{ -1, 0, "" }
};
@@ -61,8 +62,8 @@ void register_node_type_tex_viewer(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index bacd7550aef..07f987f4751 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -5,7 +5,7 @@
Import ('env')
incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes'
-incs += ' ../imbuf ../blenloader ../render/extern/include ../windowmanager'
+incs += ' ../imbuf ../blenloader ../gpu ../render/extern/include ../windowmanager'
incs += ' ../freestyle/intern/python'
incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include'
incs += ' #intern/audaspace/intern ' + env['BF_PYTHON_INC']
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index f0158fe72c3..67ed90c79eb 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -344,7 +344,7 @@ void bpy_text_clear_modules(int clear_all)
/* looping over the dict */
PyObject *key, *value;
- int pos= 0;
+ Py_ssize_t pos= 0;
/* new list */
PyObject *list;
@@ -374,7 +374,7 @@ void bpy_text_clear_modules(int clear_all)
}
/* remove all our modules */
- for(pos=0; pos < PyList_Size(list); pos++) {
+ for(pos=0; pos < PyList_GET_SIZE(list); pos++) {
/* PyObject_Print(key, stderr, 0); */
key= PyList_GET_ITEM(list, pos);
PyDict_DelItem(modules, key);
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index b7e67ec5a93..a1571dc028c 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -209,6 +209,10 @@ PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...)
}
/* returns the exception string as a new PyUnicode object, depends on external traceback module */
+#if 0
+
+/* this version uses traceback module but somehow fails on UI errors */
+
PyObject *PyC_ExceptionBuffer(void)
{
PyObject *traceback_mod= NULL;
@@ -236,6 +240,78 @@ error_cleanup:
return ret;
}
+#else /* verbose, non-threadsafe version */
+PyObject *PyC_ExceptionBuffer(void)
+{
+ PyObject *stdout_backup = PySys_GetObject("stdout"); /* borrowed */
+ PyObject *stderr_backup = PySys_GetObject("stderr"); /* borrowed */
+ PyObject *string_io = NULL;
+ PyObject *string_io_buf = NULL;
+ PyObject *string_io_mod= NULL;
+ PyObject *string_io_getvalue= NULL;
+
+ PyObject *error_type, *error_value, *error_traceback;
+
+ if (!PyErr_Occurred())
+ return NULL;
+
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+
+ PyErr_Clear();
+
+ /* import io
+ * string_io = io.StringIO()
+ */
+
+ if(! (string_io_mod= PyImport_ImportModule("io")) ) {
+ goto error_cleanup;
+ }
+ else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) {
+ goto error_cleanup;
+ }
+ else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
+ goto error_cleanup;
+ }
+
+ Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced.
+ Py_INCREF(stderr_backup);
+
+ PySys_SetObject("stdout", string_io); // both of these are free'd when restoring
+ PySys_SetObject("stderr", string_io);
+
+ PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_Print(); /* print the error */
+ PyErr_Clear();
+
+ string_io_buf = PyObject_CallObject(string_io_getvalue, NULL);
+
+ PySys_SetObject("stdout", stdout_backup);
+ PySys_SetObject("stderr", stderr_backup);
+
+ Py_DECREF(stdout_backup); /* now sys owns the ref again */
+ Py_DECREF(stderr_backup);
+
+ Py_DECREF(string_io_mod);
+ Py_DECREF(string_io_getvalue);
+ Py_DECREF(string_io); /* free the original reference */
+
+ PyErr_Clear();
+ return string_io_buf;
+
+
+error_cleanup:
+ /* could not import the module so print the error and close */
+ Py_XDECREF(string_io_mod);
+ Py_XDECREF(string_io);
+
+ PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_Print(); /* print the error */
+ PyErr_Clear();
+
+ return NULL;
+}
+#endif
+
/* string conversion, escape non-unicode chars, coerce must be set to NULL */
const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index d6a41b561fd..3ad5e000233 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -32,6 +32,7 @@ set(INC
../../makesdna
../../makesrna
../../windowmanager
+ ../../gpu
../../freestyle/intern/python
../../../../intern/guardedalloc
)
@@ -41,6 +42,7 @@ set(INC_SYS
)
set(SRC
+ gpu.c
bpy.c
bpy_app.c
bpy_app_handlers.c
@@ -59,6 +61,7 @@ set(SRC
bpy_util.c
stubs.c
+ gpu.h
bpy.h
bpy_app.h
bpy_app_handlers.h
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index d68fd9a9111..f3ef55d29c4 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -76,6 +76,13 @@ int bpy_pydriver_create_dict(void)
Py_DECREF(mod);
}
+ /* add noise to global namespace */
+ mod= PyImport_ImportModuleLevel((char *)"noise", NULL, NULL, NULL, 0);
+ if (mod) {
+ PyDict_SetItemString(bpy_pydriver_Dict, "noise", mod);
+ Py_DECREF(mod);
+ }
+
return 0;
}
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index e5e90380d61..e5bfc1d633f 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -40,6 +40,7 @@
#include "RNA_types.h"
#include "bpy.h"
+#include "gpu.h"
#include "bpy_rna.h"
#include "bpy_util.h"
#include "bpy_traceback.h"
@@ -181,6 +182,7 @@ static struct _inittab bpy_internal_modules[]= {
#ifdef WITH_AUDASPACE
{(char *)"aud", AUD_initPython},
#endif
+ {(char *)"gpu", GPU_initPython},
{NULL, NULL}
};
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index d10c8c843e8..4c382efdda3 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -4608,7 +4608,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
#ifdef DEBUG_STRING_FREE
- // if(PyList_Size(string_free_ls)) printf("%.200s.%.200s(): has %d strings\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), (int)PyList_Size(string_free_ls));
+ // if(PyList_GET_SIZE(string_free_ls)) printf("%.200s.%.200s(): has %d strings\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), (int)PyList_GET_SIZE(string_free_ls));
Py_DECREF(string_free_ls);
#undef DEBUG_STRING_FREE
#endif
@@ -5443,7 +5443,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
if(bpy_types==NULL) {
PyErr_Print();
PyErr_Clear();
- fprintf(stderr, "pyrna_srna_ExternalType: failed to find 'bpy_types' module\n");
+ fprintf(stderr, "%s: failed to find 'bpy_types' module\n", __func__);
return NULL;
}
bpy_types_dict= PyModule_GetDict(bpy_types); // borrow
@@ -5457,18 +5457,18 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
PyObject *base_compare= pyrna_srna_PyBase(srna);
//PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values!
//PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to.
- PyObject *bases= ((PyTypeObject *)newclass)->tp_bases;
- PyObject *slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
+ PyObject *tp_bases= ((PyTypeObject *)newclass)->tp_bases;
+ PyObject *tp_slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
- if(slots==NULL) {
- fprintf(stderr, "pyrna_srna_ExternalType: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", idname);
+ if(tp_slots==NULL) {
+ fprintf(stderr, "%s: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", __func__, idname);
newclass= NULL;
}
- else if(PyTuple_GET_SIZE(bases)) {
- PyObject *base= PyTuple_GET_ITEM(bases, 0);
+ else if(PyTuple_GET_SIZE(tp_bases)) {
+ PyObject *base= PyTuple_GET_ITEM(tp_bases, 0);
if(base_compare != base) {
- fprintf(stderr, "pyrna_srna_ExternalType: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", idname);
+ fprintf(stderr, "%s: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", __func__, idname);
PyC_ObSpit("Expected! ", base_compare);
newclass= NULL;
}
@@ -5538,7 +5538,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
}
else {
/* this should not happen */
- printf("Error registering '%s'\n", idname);
+ printf("%s: error registering '%s'\n", __func__, idname);
PyErr_Print();
PyErr_Clear();
}
@@ -5581,7 +5581,7 @@ PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr)
Py_DECREF(tp); /* srna owns, cant hold a ref */
}
else {
- fprintf(stderr, "Could not make type\n");
+ fprintf(stderr, "%s: could not make type\n", __func__);
pyrna= (BPy_StructRNA *) PyObject_GC_New(BPy_StructRNA, &pyrna_struct_Type);
#ifdef USE_WEAKREFS
pyrna->in_weakreflist= NULL;
@@ -6231,10 +6231,10 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
#endif
py_class= RNA_struct_py_type_get(ptr->type);
-
/* 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));
+ fprintf(stderr, "%s: unable to get python class for rna struct '%.200s'\n",
+ __func__, RNA_struct_identifier(ptr->type));
return -1;
}
diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c
new file mode 100644
index 00000000000..334bb1f725a
--- /dev/null
+++ b/source/blender/python/intern/gpu.c
@@ -0,0 +1,289 @@
+/*
+ * $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 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Benoit Bolsee.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/gpu.c
+ * \ingroup pythonintern
+ */
+
+/* python redefines */
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+
+#include <Python.h>
+
+#include "GPU_material.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_image_types.h"
+#include "DNA_material_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_object_types.h"
+#include "DNA_ID.h"
+#include "DNA_customdata_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
+#include "RNA_access.h"
+
+#include "bpy_rna.h"
+
+#define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, #name, name)
+
+PyDoc_STRVAR(M_gpu_doc,
+ "This module provides access to the GLSL shader.");
+
+static struct PyModuleDef gpumodule = {
+ PyModuleDef_HEAD_INIT,
+ "gpu", /* name of module */
+ M_gpu_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_gpu(void)
+{
+ PyObject* m;
+
+ m = PyModule_Create(&gpumodule);
+ if(m == NULL)
+ return NULL;
+
+ // device constants
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_MAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWIMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_IMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_COLOR);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNVEC);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCO);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNIMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNPERSMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNENERGY);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCOL);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DBUFFER);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DIMAGE);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DSHADOW);
+
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_1I);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_1F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_2F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_3F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_4F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_9F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_16F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_4UB);
+
+ PY_MODULE_ADD_CONSTANT(m, CD_MTFACE);
+ PY_MODULE_ADD_CONSTANT(m, CD_ORCO);
+ PY_MODULE_ADD_CONSTANT(m, CD_TANGENT);
+ PY_MODULE_ADD_CONSTANT(m, CD_MCOL);
+ return m;
+}
+
+#define PY_DICT_ADD_STRING(d,s,f) \
+ val = PyUnicode_FromString(s->f); \
+ PyDict_SetItemString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_DICT_ADD_LONG(d,s,f) \
+ val = PyLong_FromLong(s->f); \
+ PyDict_SetItemString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_DICT_ADD_ID(d,s,f) \
+ RNA_id_pointer_create((struct ID*)s->f, &tptr); \
+ val = pyrna_struct_CreatePyObject(&tptr); \
+ PyDict_SetItemString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_OBJ_ADD_ID(d,s,f) \
+ val = PyUnicode_FromString(&s->f->id.name[2]); \
+ PyObject_SetAttrString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_OBJ_ADD_LONG(d,s,f) \
+ val = PyLong_FromLong(s->f); \
+ PyObject_SetAttrString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_OBJ_ADD_STRING(d,s,f) \
+ val = PyUnicode_FromString(s->f); \
+ PyObject_SetAttrString(d, #f, val); \
+ Py_DECREF(val)
+
+static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObject *kwds)
+{
+ PyObject* pyscene;
+ PyObject* pymat;
+ PyObject* as_pointer;
+ PyObject* pointer;
+ PyObject* result;
+ PyObject* dict;
+ PyObject* val;
+ PyObject* seq;
+
+ int i;
+ Scene *scene;
+ PointerRNA tptr;
+ Material *material;
+ GPUShaderExport *shader;
+ GPUInputUniform *uniform;
+ GPUInputAttribute *attribute;
+
+ static const char *kwlist[] = {"scene", "material", NULL};
+
+ if(!PyArg_ParseTupleAndKeywords(args, kwds, "OO:export_shader", (char**)(kwlist), &pyscene, &pymat))
+ return NULL;
+
+ if (!strcmp(Py_TYPE(pyscene)->tp_name, "Scene") &&
+ (as_pointer = PyObject_GetAttrString(pyscene, "as_pointer")) != NULL &&
+ PyCallable_Check(as_pointer)) {
+ // must be a scene object
+ pointer = PyObject_CallObject(as_pointer, NULL);
+ if (!pointer) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ scene = (Scene*)PyLong_AsVoidPtr(pointer);
+ Py_DECREF(pointer);
+ if (!scene) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ } else {
+ PyErr_SetString(PyExc_TypeError, "gpu.export_shader() first argument should be of Scene type");
+ return NULL;
+ }
+
+ if (!strcmp(Py_TYPE(pymat)->tp_name, "Material") &&
+ (as_pointer = PyObject_GetAttrString(pymat, "as_pointer")) != NULL &&
+ PyCallable_Check(as_pointer)) {
+ // must be a material object
+ pointer = PyObject_CallObject(as_pointer, NULL);
+ if (!pointer) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ material = (Material*)PyLong_AsVoidPtr(pointer);
+ Py_DECREF(pointer);
+ if (!material) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ } else {
+ PyErr_SetString(PyExc_TypeError, "gpu.export_shader() second argument should be of Material type");
+ return NULL;
+ }
+ // we can call our internal function at last:
+ shader = GPU_shader_export(scene, material);
+ if (!shader) {
+ PyErr_SetString(PyExc_RuntimeError, "cannot export shader");
+ return NULL;
+ }
+ // build a dictionary
+ result = PyDict_New();
+ if (shader->fragment) {
+ PY_DICT_ADD_STRING(result,shader,fragment);
+ }
+ if (shader->vertex) {
+ PY_DICT_ADD_STRING(result,shader,vertex);
+ }
+ seq = PyList_New(BLI_countlist(&shader->uniforms));
+ for (i=0, uniform=shader->uniforms.first; uniform; uniform=uniform->next, i++) {
+ dict = PyDict_New();
+ PY_DICT_ADD_STRING(dict,uniform,varname);
+ PY_DICT_ADD_LONG(dict,uniform,datatype);
+ PY_DICT_ADD_LONG(dict,uniform,type);
+ if (uniform->lamp) {
+ PY_DICT_ADD_ID(dict,uniform,lamp);
+ }
+ if (uniform->image) {
+ PY_DICT_ADD_ID(dict,uniform,image);
+ }
+ if (uniform->type == GPU_DYNAMIC_SAMPLER_2DBUFFER ||
+ uniform->type == GPU_DYNAMIC_SAMPLER_2DIMAGE ||
+ uniform->type == GPU_DYNAMIC_SAMPLER_2DSHADOW) {
+ PY_DICT_ADD_LONG(dict,uniform,texnumber);
+ }
+ if (uniform->texpixels) {
+ val = PyByteArray_FromStringAndSize((const char *)uniform->texpixels, uniform->texsize);
+ PyDict_SetItemString(dict, "texpixels", val);
+ Py_DECREF(val);
+ PY_DICT_ADD_LONG(dict,uniform,texsize);
+ }
+ PyList_SET_ITEM(seq, i, dict);
+ }
+ PyDict_SetItemString(result, "uniforms", seq);
+ Py_DECREF(seq);
+
+ seq = PyList_New(BLI_countlist(&shader->attributes));
+ for (i=0, attribute=shader->attributes.first; attribute; attribute=attribute->next, i++) {
+ dict = PyDict_New();
+ PY_DICT_ADD_STRING(dict,attribute,varname);
+ PY_DICT_ADD_LONG(dict,attribute,datatype);
+ PY_DICT_ADD_LONG(dict,attribute,type);
+ PY_DICT_ADD_LONG(dict,attribute,number);
+ if (attribute->name) {
+ if (attribute->name[0] != 0) {
+ PY_DICT_ADD_STRING(dict,attribute,name);
+ } else {
+ val = PyLong_FromLong(0);
+ PyDict_SetItemString(dict, "name", val);
+ Py_DECREF(val);
+ }
+ }
+ PyList_SET_ITEM(seq, i, dict);
+ }
+ PyDict_SetItemString(result, "attributes", seq);
+ Py_DECREF(seq);
+
+ GPU_free_shader_export(shader);
+
+ return result;
+}
+
+static PyMethodDef meth_export_shader[] = {{ "export_shader", (PyCFunction)GPU_export_shader, METH_VARARGS | METH_KEYWORDS,
+ "export_shader(scene,material)\n\n"
+ "Returns the GLSL shader that produces the visual effect of material in scene.\n\n"
+ ":return: Dictionary defining the shader, uniforms and attributes.\n"
+ ":rtype: Dict"}};
+
+PyObject* GPU_initPython(void)
+{
+ PyObject* module = PyInit_gpu();
+ PyModule_AddObject(module, "export_shader", (PyObject *)PyCFunction_New(meth_export_shader, NULL));
+ PyDict_SetItemString(PyImport_GetModuleDict(), "gpu", module);
+
+ return module;
+}
+
diff --git a/source/blender/python/intern/gpu.h b/source/blender/python/intern/gpu.h
new file mode 100644
index 00000000000..d604c7c6201
--- /dev/null
+++ b/source/blender/python/intern/gpu.h
@@ -0,0 +1,41 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This shader is free software; you can redistribute it and/or
+ * modify it under the terms of the 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 shader is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this shader; 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): Benoit Bolsee.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/gpu.h
+ * \ingroup pythonintern
+ */
+
+/**
+ * Initalizes the gpu Python module.
+ */
+PyObject* GPU_initPython(void);
+
diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index bcdfe020e1a..0394d732ae3 100644
--- a/source/blender/python/mathutils/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -983,7 +983,7 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
{
- int len, i;
+ Py_ssize_t len, i;
PyObject *list_item, *item_1, *item_2;
boxPack *box;
@@ -995,14 +995,14 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
return -1;
}
- len= PyList_Size(value);
+ len= PyList_GET_SIZE(value);
(*boxarray)= MEM_mallocN(len*sizeof(boxPack), "boxPack box");
for(i= 0; i < len; i++) {
list_item= PyList_GET_ITEM(value, i);
- if(!PyList_Check(list_item) || PyList_Size(list_item) < 4) {
+ if(!PyList_Check(list_item) || PyList_GET_SIZE(list_item) < 4) {
MEM_freeN(*boxarray);
PyErr_SetString(PyExc_TypeError,
"can only pack a list of [x, y, w, h]");
@@ -1034,11 +1034,11 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
static void boxPack_ToPyObject(PyObject *value, boxPack **boxarray)
{
- int len, i;
+ Py_ssize_t len, i;
PyObject *list_item;
boxPack *box;
- len= PyList_Size(value);
+ len= PyList_GET_SIZE(value);
for(i= 0; i < len; i++) {
box= (*boxarray)+i;
@@ -1062,7 +1062,7 @@ PyDoc_STRVAR(M_Geometry_box_pack_2d_doc,
static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlist)
{
float tot_width= 0.0f, tot_height= 0.0f;
- int len;
+ Py_ssize_t len;
PyObject *ret;
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index fbbb33d0172..cf1fae81eb5 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -125,7 +125,7 @@ static void init_render_texture(Render *re, Tex *tex)
}
if(tex->nodetree && tex->use_nodes) {
- ntreeBeginExecTree(tex->nodetree); /* has internal flag to detect it only does it once */
+ ntreeTexBeginExecTree(tex->nodetree, 1); /* has internal flag to detect it only does it once */
}
}
@@ -144,8 +144,8 @@ void init_render_textures(Render *re)
static void end_render_texture(Tex *tex)
{
- if(tex && tex->use_nodes && tex->nodetree)
- ntreeEndExecTree(tex->nodetree);
+ if(tex && tex->use_nodes && tex->nodetree && tex->nodetree->execdata)
+ ntreeTexEndExecTree(tex->nodetree->execdata, 1);
}
void end_render_textures(Render *re)
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 27586525253..518ebeafc80 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -437,9 +437,23 @@ static void wm_operator_print(bContext *C, wmOperator *op)
static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int popup)
{
- if(popup)
- if(op->reports->list.first)
+ if(popup) {
+ if(op->reports->list.first) {
+ /* FIXME, temp setting window, see other call to uiPupMenuReports for why */
+ wmWindow *win_prev= CTX_wm_window(C);
+ ScrArea *area_prev= CTX_wm_area(C);
+ ARegion *ar_prev= CTX_wm_region(C);
+
+ if(win_prev==NULL)
+ CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
+
uiPupMenuReports(C, op->reports);
+
+ CTX_wm_window_set(C, win_prev);
+ CTX_wm_area_set(C, area_prev);
+ CTX_wm_region_set(C, ar_prev);
+ }
+ }
if(retval & OPERATOR_FINISHED) {
if(G.f & G_DEBUG)
@@ -877,8 +891,8 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA
CTX_wm_region_set(C, NULL);
CTX_wm_area_set(C, NULL);
retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
- CTX_wm_region_set(C, ar);
CTX_wm_area_set(C, area);
+ CTX_wm_region_set(C, ar);
return retval;
}
@@ -1385,6 +1399,9 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
* only have because lib linking errors need to be seen by users :(
* it can be removed without breaking anything but then no linking errors - campbell */
wmWindow *win_prev= CTX_wm_window(C);
+ ScrArea *area_prev= CTX_wm_area(C);
+ ARegion *ar_prev= CTX_wm_region(C);
+
if(win_prev==NULL)
CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
@@ -1396,6 +1413,8 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
BLI_movelisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list);
CTX_wm_window_set(C, win_prev);
+ CTX_wm_area_set(C, area_prev);
+ CTX_wm_region_set(C, ar_prev);
}
WM_operator_free(handler->op);
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 0e94ad72d35..854fa688ea4 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -47,6 +47,7 @@
#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_idprop.h"
+#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_screen.h"
@@ -680,6 +681,17 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, EnumPrope
wmKeyMap *km= WM_keymap_find(keyconf, idname, 0, 0);
km->flag |= KEYMAP_MODAL;
km->modal_items= items;
+
+ if(!items) {
+ /* init modal items from default config */
+ wmWindowManager *wm = G.main->wm.first;
+ wmKeyMap *defaultkm= WM_keymap_list_find(&wm->defaultconf->keymaps, km->idname, 0, 0);
+
+ if(defaultkm) {
+ km->modal_items = defaultkm->modal_items;
+ km->poll = defaultkm->poll;
+ }
+ }
return km;
}
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 0e0203543a4..68a4eebf93f 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -2082,7 +2082,9 @@ static int wm_collada_import_exec(bContext *C, wmOperator *op)
}
RNA_string_get(op->ptr, "filepath", filename);
- collada_import(C, filename);
+ if(collada_import(C, filename)) return OPERATOR_FINISHED;
+
+ BKE_report(op->reports, RPT_ERROR, "Errors found during parsing COLLADA document. Please see console for error log.");
return OPERATOR_FINISHED;
}
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index e513ac3e27b..a9f32e57495 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -250,6 +250,7 @@ void WM_cursor_wait (int val) {}
void ED_node_texture_default(struct Tex *tx){}
void ED_node_changed_update(struct bContext *C, struct bNode *node){}
void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node){}
+void ED_node_tree_update(struct SpaceNode *snode, 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){return 0;}
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar){}
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 608971338c5..184e7a87906 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -719,7 +719,6 @@ if(WITH_MOD_FLUID)
list(APPEND BLENDER_LINK_LIBS bf_intern_elbeem)
endif()
-
#if(UNIX)
# Sort libraries
set(BLENDER_SORTED_LIBS
@@ -800,6 +799,7 @@ endif()
bf_intern_smoke
extern_minilzo
extern_lzma
+ extern_recastnavigation
ge_logic_ketsji
ge_phys_common
ge_logic
@@ -821,6 +821,8 @@ endif()
bf_blenfont
bf_intern_audaspace
bf_intern_mikktspace
+ extern_recastnavigation
+ bf_editor_util # --- BAD LEVEL CALL HERE --- XXX, this should be removed before release!
)
if(WITH_MOD_CLOTH_ELTOPO)
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 40f1701e44a..810e9b6ddfb 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -507,9 +507,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
//PyDict_Clear(PyModule_GetDict(gameLogic));
// Keep original items, means python plugins will autocomplete members
- int listIndex;
PyObject *gameLogic_keys_new = PyDict_Keys(PyModule_GetDict(gameLogic));
- for (listIndex=0; listIndex < PyList_Size(gameLogic_keys_new); listIndex++) {
+ const Py_ssize_t numitems= PyList_GET_SIZE(gameLogic_keys_new);
+ Py_ssize_t listIndex;
+ for (listIndex=0; listIndex < numitems; listIndex++) {
PyObject* item = PyList_GET_ITEM(gameLogic_keys_new, listIndex);
if (!PySequence_Contains(gameLogic_keys, item)) {
PyDict_DelItem( PyModule_GetDict(gameLogic), item);
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index 063544932de..895def17e8e 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -88,10 +88,10 @@ BL_ActionActuator::BL_ActionActuator(SCA_IObject* gameobj,
m_blendin(blendin),
m_blendstart(0),
m_stridelength(stride),
+ m_layer_weight(layer_weight),
m_playtype(playtype),
m_priority(priority),
m_layer(layer),
- m_layer_weight(layer_weight),
m_ipo_flags(ipo_flags),
m_pose(NULL),
m_blendpose(NULL),
diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp
index 395cae4ba87..684bd3f341e 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.cpp
+++ b/source/gameengine/Converter/BL_ArmatureObject.cpp
@@ -231,10 +231,10 @@ BL_ArmatureObject::BL_ArmatureObject(
m_timestep(0.040),
m_activeAct(NULL),
m_activePriority(999),
+ m_vert_deform_type(vert_deform_type),
m_constraintNumber(0),
m_channelNumber(0),
- m_lastapplyframe(0.0),
- m_vert_deform_type(vert_deform_type)
+ m_lastapplyframe(0.0)
{
m_armature = (bArmature *)armature->data;
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index fcfc07e631e..d4b43cd7ac1 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -180,6 +180,9 @@ extern Material defmaterial; /* material.c */
#include "BL_ArmatureObject.h"
#include "BL_DeformableGameObject.h"
+#include "KX_NavMeshObject.h"
+#include "KX_ObstacleSimulation.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -1741,7 +1744,14 @@ static KX_GameObject *gameobject_from_blenderobject(
// needed for python scripting
kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
-
+
+ if (ob->gameflag & OB_NAVMESH)
+ {
+ gameobj = new KX_NavMeshObject(kxscene,KX_Scene::m_callbacks);
+ gameobj->AddMesh(meshobj);
+ break;
+ }
+
gameobj = new BL_DeformableGameObject(ob,kxscene,KX_Scene::m_callbacks);
// set transformation
@@ -2710,6 +2720,46 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
converter->RegisterWorldInfo(worldinfo);
kxscene->SetWorldInfo(worldinfo);
+ //create object representations for obstacle simulation
+ KX_ObstacleSimulation* obssimulation = kxscene->GetObstacleSimulation();
+ if (obssimulation)
+ {
+ for ( i=0;i<objectlist->GetCount();i++)
+ {
+ KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ if (blenderobject->gameflag & OB_HASOBSTACLE)
+ {
+ obssimulation->AddObstacleForObj(gameobj);
+ }
+ }
+ }
+
+ //process navigation mesh objects
+ for ( i=0; i<objectlist->GetCount();i++)
+ {
+ KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
+ {
+ KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+ navmesh->SetVisible(0, true);
+ navmesh->BuildNavMesh();
+ if (obssimulation)
+ obssimulation->AddObstaclesForNavMesh(navmesh);
+ }
+ }
+ for ( i=0; i<inactivelist->GetCount();i++)
+ {
+ KX_GameObject* gameobj = static_cast<KX_GameObject*>(inactivelist->GetValue(i));
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
+ {
+ KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+ navmesh->SetVisible(0, true);
+ }
+ }
+
#define CONVERT_LOGIC
#ifdef CONVERT_LOGIC
// convert logic bricks, sensors, controllers and actuators
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index 3a379e8b0ed..98afcf877a1 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -243,7 +243,6 @@ void BL_SkinDeformer::BGEDeformVerts()
for (int i=0; i<m_bmesh->totvert; ++i)
{
float contrib = 0.f, weight, max_weight=0.f;
- Bone *bone;
bPoseChannel *pchan=NULL;
MDeformVert *dvert;
Eigen::Map<Eigen::Vector3f> norm(m_transnors[i]);
@@ -266,7 +265,6 @@ void BL_SkinDeformer::BGEDeformVerts()
if (index < numGroups && (pchan=m_dfnrToPC[index]))
{
weight = dvert->dw[j].weight;
- bone = pchan->bone;
if (weight)
{
diff --git a/source/gameengine/Converter/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt
index 3a217ce9d74..039f454e870 100644
--- a/source/gameengine/Converter/CMakeLists.txt
+++ b/source/gameengine/Converter/CMakeLists.txt
@@ -56,6 +56,7 @@ set(INC
../../../intern/guardedalloc
../../../intern/moto/include
../../../intern/string
+ ../../../extern/recastnavigation/Detour/Include
)
set(INC_SYS
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 7191730187c..656dcfa3220 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -385,6 +385,12 @@ void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
//This cache mecanism is buggy so I leave it disable and the memory leak
//that would result from this is fixed in RemoveScene()
m_map_mesh_to_gamemesh.clear();
+
+#ifndef USE_BULLET
+ /* quiet compiler warning */
+ (void)useDbvtCulling;
+#endif
+
}
// This function removes all entities stored in the converter for that scene
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index 8fc224fba6f..a14e5fb5449 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -72,6 +72,7 @@
#include "KX_SCA_ReplaceMeshActuator.h"
#include "KX_ParentActuator.h"
#include "KX_SCA_DynamicActuator.h"
+#include "KX_SteeringActuator.h"
#include "KX_Scene.h"
#include "KX_KetsjiEngine.h"
@@ -100,6 +101,7 @@
#include "BL_ActionActuator.h"
#include "BL_ShapeActionActuator.h"
#include "BL_ArmatureActuator.h"
+#include "RNA_access.h"
#include "BL_Action.h"
/* end of blender include block */
@@ -413,14 +415,21 @@ void BL_ConvertActuators(char* maggiename,
// if sound shall be 3D but isn't mono, we have to make it mono!
if(is3d)
{
- AUD_Reference<AUD_IReader> reader = snd_sound->createReader();
- if(reader->getSpecs().channels != AUD_CHANNELS_MONO)
+ try
{
- AUD_DeviceSpecs specs;
- specs.channels = AUD_CHANNELS_MONO;
- specs.rate = AUD_RATE_INVALID;
- specs.format = AUD_FORMAT_INVALID;
- snd_sound = new AUD_ChannelMapperFactory(snd_sound, specs);
+ AUD_Reference<AUD_IReader> reader = snd_sound->createReader();
+ if(reader->getSpecs().channels != AUD_CHANNELS_MONO)
+ {
+ AUD_DeviceSpecs specs;
+ specs.channels = AUD_CHANNELS_MONO;
+ specs.rate = AUD_RATE_INVALID;
+ specs.format = AUD_FORMAT_INVALID;
+ snd_sound = new AUD_ChannelMapperFactory(snd_sound, specs);
+ }
+ }
+ catch(AUD_Exception&)
+ {
+ // sound cannot be played... ignore
}
}
}
@@ -1057,6 +1066,45 @@ void BL_ConvertActuators(char* maggiename,
baseact = tmparmact;
break;
}
+ case ACT_STEERING:
+ {
+ bSteeringActuator *stAct = (bSteeringActuator *) bact->data;
+ KX_GameObject *navmeshob = NULL;
+ if (stAct->navmesh)
+ {
+ PointerRNA settings_ptr;
+ RNA_pointer_create((ID *)stAct->navmesh, &RNA_GameObjectSettings, stAct->navmesh, &settings_ptr);
+ if (RNA_enum_get(&settings_ptr, "physics_type") == OB_BODY_TYPE_NAVMESH)
+ navmeshob = converter->FindGameObject(stAct->navmesh);
+ }
+ KX_GameObject *targetob = converter->FindGameObject(stAct->target);
+
+ int mode = KX_SteeringActuator::KX_STEERING_NODEF;
+ switch(stAct->type)
+ {
+ case ACT_STEERING_SEEK:
+ mode = KX_SteeringActuator::KX_STEERING_SEEK;
+ break;
+ case ACT_STEERING_FLEE:
+ mode = KX_SteeringActuator::KX_STEERING_FLEE;
+ break;
+ case ACT_STEERING_PATHFOLLOWING:
+ mode = KX_SteeringActuator::KX_STEERING_PATHFOLLOWING;
+ break;
+ }
+
+ bool selfTerminated = (stAct->flag & ACT_STEERING_SELFTERMINATED) !=0;
+ bool enableVisualization = (stAct->flag & ACT_STEERING_ENABLEVISUALIZATION) !=0;
+ short facingMode = (stAct->flag & ACT_STEERING_AUTOMATICFACING) ? stAct->facingaxis : 0;
+ bool normalup = (stAct->flag & ACT_STEERING_NORMALUP) !=0;
+ KX_SteeringActuator *tmpstact
+ = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist,
+ stAct->velocity, stAct->acceleration, stAct->turnspeed,
+ selfTerminated, stAct->updateTime,
+ scene->GetObstacleSimulation(), facingMode, normalup, enableVisualization);
+ baseact = tmpstact;
+ break;
+ }
default:
; /* generate some error */
}
diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Converter/KX_IpoConvert.cpp
index 0ee99f5335b..b13dbe324f5 100644
--- a/source/gameengine/Converter/KX_IpoConvert.cpp
+++ b/source/gameengine/Converter/KX_IpoConvert.cpp
@@ -257,7 +257,7 @@ SG_Controller *BL_CreateCameraIPO(struct bAction *action, KX_GameObject* camera
ipocontr->m_clipstart = blendercamera->clipsta;
ipocontr->m_clipend = blendercamera->clipend;
- BL_InterpolatorList *adtList= GetAdtList(blendercamera->adt->action, converter);
+ BL_InterpolatorList *adtList= GetAdtList(action, converter);
// For each active channel in the adtList add an
// interpolator to the game object.
diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript
index 0ae22d548c5..e155677e522 100644
--- a/source/gameengine/Converter/SConscript
+++ b/source/gameengine/Converter/SConscript
@@ -20,6 +20,7 @@ incs += ' #source/blender/misc #source/blender/blenloader #source/blender/gpu'
incs += ' #source/blender/windowmanager'
incs += ' #source/blender/makesrna'
incs += ' #source/blender/ikplugin'
+incs += ' #extern/recastnavigation/Detour/Include'
incs += ' #extern/Eigen2'
incs += ' ' + env['BF_BULLET_INC']
diff --git a/source/gameengine/Expressions/IfExpr.h b/source/gameengine/Expressions/IfExpr.h
index 5ac8d835afd..e67134c2271 100644
--- a/source/gameengine/Expressions/IfExpr.h
+++ b/source/gameengine/Expressions/IfExpr.h
@@ -20,7 +20,7 @@
#if !defined(AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_)
#define AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_
-#if _MSC_VER >= 1000
+#if defined(_MSC_VER) && _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp
index 271d5067dd9..934f2a8dd87 100644
--- a/source/gameengine/Expressions/ListValue.cpp
+++ b/source/gameengine/Expressions/ListValue.cpp
@@ -387,7 +387,7 @@ PyObject* listvalue_buffer_slice(PyObject* self,Py_ssize_t ilow, Py_ssize_t ihig
static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other)
{
CListValue *listval= static_cast<CListValue *>(BGE_PROXY_REF(self));
- int i, numitems, numitems_orig;
+ Py_ssize_t i, numitems, numitems_orig;
if (listval==NULL) {
PyErr_SetString(PyExc_SystemError, "CList+other, "BGE_PROXY_ERROR_MSG);
@@ -408,7 +408,7 @@ static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other)
CValue* listitemval;
bool error = false;
- numitems = PyList_Size(other);
+ numitems = PyList_GET_SIZE(other);
/* copy the first part of the list */
listval_new->Resize(numitems_orig + numitems);
diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp
index e60b380e95c..41c0850a779 100644
--- a/source/gameengine/Expressions/Value.cpp
+++ b/source/gameengine/Expressions/Value.cpp
@@ -546,8 +546,8 @@ CValue* CValue::ConvertPythonToValue(PyObject* pyobj, const char *error_prefix)
CListValue* listval = new CListValue();
bool error = false;
- int i;
- int numitems = PyList_Size(pyobj);
+ Py_ssize_t i;
+ Py_ssize_t numitems = PyList_GET_SIZE(pyobj);
for (i=0;i<numitems;i++)
{
PyObject* listitem = PyList_GetItem(pyobj,i); /* borrowed ref */
diff --git a/source/gameengine/GameLogic/SCA_IActuator.h b/source/gameengine/GameLogic/SCA_IActuator.h
index bfcec983e2a..d2a8de32895 100644
--- a/source/gameengine/GameLogic/SCA_IActuator.h
+++ b/source/gameengine/GameLogic/SCA_IActuator.h
@@ -90,6 +90,7 @@ public:
KX_ACT_SHAPEACTION,
KX_ACT_STATE,
KX_ACT_ARMATURE,
+ KX_ACT_STEERING,
};
SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type);
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index 99c9fb25a65..4b2d828fe81 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -57,6 +57,9 @@ set(INC
set(INC_SYS
${GLEW_INCLUDE_PATH}
+ ../../../extern/recastnavigation/Recast/Include
+ ../../../extern/recastnavigation/Detour/Include
+ ../../blender/editors/include
)
set(SRC
@@ -90,9 +93,11 @@ set(SRC
KX_MeshProxy.cpp
KX_MotionState.cpp
KX_MouseFocusSensor.cpp
+ KX_NavMeshObject.cpp
KX_NearSensor.cpp
KX_ObColorIpoSGController.cpp
KX_ObjectActuator.cpp
+ KX_ObstacleSimulation.cpp
KX_OrientationInterpolator.cpp
KX_ParentActuator.cpp
KX_PhysicsObjectWrapper.cpp
@@ -120,6 +125,7 @@ set(SRC
KX_SceneActuator.cpp
KX_SoundActuator.cpp
KX_StateActuator.cpp
+ KX_SteeringActuator.cpp
KX_TimeCategoryLogger.cpp
KX_TimeLogger.cpp
KX_TouchEventManager.cpp
@@ -167,9 +173,11 @@ set(SRC
KX_MeshProxy.h
KX_MotionState.h
KX_MouseFocusSensor.h
+ KX_NavMeshObject.h
KX_NearSensor.h
KX_ObColorIpoSGController.h
KX_ObjectActuator.h
+ KX_ObstacleSimulation.h
KX_OrientationInterpolator.h
KX_ParentActuator.h
KX_PhysicsEngineEnums.h
@@ -199,6 +207,7 @@ set(SRC
KX_SceneActuator.h
KX_SoundActuator.h
KX_StateActuator.h
+ KX_SteeringActuator.h
KX_TimeCategoryLogger.h
KX_TimeLogger.h
KX_TouchEventManager.h
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 6adaea2d6ad..ae8d7094015 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -73,6 +73,7 @@ typedef unsigned long uint_ptr;
#include "SCA_ISensor.h"
#include "SCA_IController.h"
#include "NG_NetworkScene.h" //Needed for sendMessage()
+#include "KX_ObstacleSimulation.h"
#include "BL_ActionManager.h"
@@ -110,7 +111,8 @@ KX_GameObject::KX_GameObject(
m_xray(false),
m_pHitObject(NULL),
m_actionManager(NULL),
- m_isDeformable(false)
+ m_isDeformable(false),
+ m_pObstacleSimulation(NULL)
#ifdef WITH_PYTHON
, m_attr_dict(NULL)
#endif
@@ -157,6 +159,12 @@ KX_GameObject::~KX_GameObject()
{
delete m_pGraphicController;
}
+
+ if (m_pObstacleSimulation)
+ {
+ m_pObstacleSimulation->DestroyObstacleForObj(this);
+ }
+
if (m_actionManager)
{
KX_GetActiveScene()->RemoveAnimatedObject(this);
@@ -428,6 +436,14 @@ void KX_GameObject::ProcessReplica()
m_actionManager = new BL_ActionManager(this);
m_state = 0;
+ KX_Scene* scene = KX_GetActiveScene();
+ KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation();
+ struct Object* blenderobject = GetBlenderObject();
+ if (obssimulation && (blenderobject->gameflag & OB_HASOBSTACLE))
+ {
+ obssimulation->AddObstacleForObj(this);
+ }
+
#ifdef WITH_PYTHON
if(m_attr_dict)
m_attr_dict= PyDict_Copy(m_attr_dict);
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index 6e79914172b..655bc9ff080 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -65,6 +65,7 @@ class PHY_IGraphicController;
class PHY_IPhysicsEnvironment;
class BL_ActionManager;
struct Object;
+class KX_ObstacleSimulation;
struct bAction;
#ifdef WITH_PYTHON
@@ -115,6 +116,9 @@ protected:
MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
+ KX_ObstacleSimulation* m_pObstacleSimulation;
+
+
// The action manager is used to play/stop/update actions
BL_ActionManager* m_actionManager;
@@ -864,6 +868,16 @@ public:
}
m_bSuspendDynamics = false;
}
+
+ void RegisterObstacle(KX_ObstacleSimulation* obstacleSimulation)
+ {
+ m_pObstacleSimulation = obstacleSimulation;
+ }
+
+ void UnregisterObstacle()
+ {
+ m_pObstacleSimulation = NULL;
+ }
KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; }
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index ca67333166c..db919b7bc5a 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -84,6 +84,8 @@
#include "DNA_world_types.h"
#include "DNA_scene_types.h"
+#include "KX_NavMeshObject.h"
+
// If define: little test for Nzc: guarded drawing. If the canvas is
// not valid, skip rendering this frame.
//#define NZC_GUARDED_OUTPUT
@@ -1343,7 +1345,7 @@ void KX_KetsjiEngine::PostRenderScene(KX_Scene* scene)
#ifdef WITH_PYTHON
scene->RunDrawingCallbacks(scene->GetPostDrawCB());
#endif
- m_rasterizer->FlushDebugLines();
+ m_rasterizer->FlushDebugShapes();
}
void KX_KetsjiEngine::StopEngine()
diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp
new file mode 100644
index 00000000000..9fd87b03d29
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp
@@ -0,0 +1,708 @@
+/**
+* $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_math_vector.h"
+#include "KX_NavMeshObject.h"
+#include "RAS_MeshObject.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+extern "C" {
+#include "BKE_scene.h"
+#include "BKE_customdata.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_DerivedMesh.h"
+
+
+#include "ED_navmesh_conversion.h"
+}
+
+#include "KX_PythonInit.h"
+#include "KX_PyMath.h"
+#include "Value.h"
+#include "Recast.h"
+#include "DetourStatNavMeshBuilder.h"
+#include "KX_ObstacleSimulation.h"
+
+static const int MAX_PATH_LEN = 256;
+static const float polyPickExt[3] = {2, 4, 2};
+
+static void calcMeshBounds(const float* vert, int nverts, float* bmin, float* bmax)
+{
+ bmin[0] = bmax[0] = vert[0];
+ bmin[1] = bmax[1] = vert[1];
+ bmin[2] = bmax[2] = vert[2];
+ for (int i=1; i<nverts; i++)
+ {
+ if (bmin[0]>vert[3*i+0]) bmin[0] = vert[3*i+0];
+ if (bmin[1]>vert[3*i+1]) bmin[1] = vert[3*i+1];
+ if (bmin[2]>vert[3*i+2]) bmin[2] = vert[3*i+2];
+
+ if (bmax[0]<vert[3*i+0]) bmax[0] = vert[3*i+0];
+ if (bmax[1]<vert[3*i+1]) bmax[1] = vert[3*i+1];
+ if (bmax[2]<vert[3*i+2]) bmax[2] = vert[3*i+2];
+ }
+}
+
+inline void flipAxes(float* vec)
+{
+ std::swap(vec[1],vec[2]);
+}
+KX_NavMeshObject::KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks)
+: KX_GameObject(sgReplicationInfo, callbacks)
+, m_navMesh(NULL)
+{
+
+}
+
+KX_NavMeshObject::~KX_NavMeshObject()
+{
+ if (m_navMesh)
+ delete m_navMesh;
+}
+
+CValue* KX_NavMeshObject::GetReplica()
+{
+ KX_NavMeshObject* replica = new KX_NavMeshObject(*this);
+ replica->ProcessReplica();
+ return replica;
+}
+
+void KX_NavMeshObject::ProcessReplica()
+{
+ KX_GameObject::ProcessReplica();
+
+ BuildNavMesh();
+ KX_Scene* scene = KX_GetActiveScene();
+ KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation();
+ if (obssimulation)
+ obssimulation->AddObstaclesForNavMesh(this);
+
+}
+
+bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts,
+ unsigned short* &polys, int& npolys, unsigned short *&dmeshes,
+ float *&dvertices, int &ndvertsuniq, unsigned short *&dtris,
+ int& ndtris, int &vertsPerPoly)
+{
+ DerivedMesh* dm = mesh_create_derived_no_virtual(KX_GetActiveScene()->GetBlenderScene(), GetBlenderObject(),
+ NULL, CD_MASK_MESH);
+ int* recastData = (int*) dm->getFaceDataArray(dm, CD_RECAST);
+ if (recastData)
+ {
+ int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL;
+ int nAllVerts = 0;
+ float *allVerts = NULL;
+ buildNavMeshDataByDerivedMesh(dm, vertsPerPoly, nAllVerts, allVerts, ndtris, dtris,
+ npolys, dmeshes, polys, dtrisToPolysMap, dtrisToTrisMap, trisToFacesMap);
+
+ unsigned short *verticesMap = new unsigned short[nAllVerts];
+ memset(verticesMap, 0xffff, sizeof(unsigned short)*nAllVerts);
+ int curIdx = 0;
+ //vertices - mesh verts
+ //iterate over all polys and create map for their vertices first...
+ for (int polyidx=0; polyidx<npolys; polyidx++)
+ {
+ unsigned short* poly = &polys[polyidx*vertsPerPoly*2];
+ for (int i=0; i<vertsPerPoly; i++)
+ {
+ unsigned short idx = poly[i];
+ if (idx==0xffff)
+ break;
+ if (verticesMap[idx]==0xffff)
+ {
+ verticesMap[idx] = curIdx++;
+ }
+ poly[i] = verticesMap[idx];
+ }
+ }
+ nverts = curIdx;
+ //...then iterate over detailed meshes
+ //transform indices to local ones (for each navigation polygon)
+ for (int polyidx=0; polyidx<npolys; polyidx++)
+ {
+ unsigned short *poly = &polys[polyidx*vertsPerPoly*2];
+ int nv = polyNumVerts(poly, vertsPerPoly);
+ unsigned short *dmesh = &dmeshes[4*polyidx];
+ unsigned short tribase = dmesh[2];
+ unsigned short trinum = dmesh[3];
+ unsigned short vbase = curIdx;
+ for (int j=0; j<trinum; j++)
+ {
+ unsigned short* dtri = &dtris[(tribase+j)*3*2];
+ for (int k=0; k<3; k++)
+ {
+ int newVertexIdx = verticesMap[dtri[k]];
+ if (newVertexIdx==0xffff)
+ {
+ newVertexIdx = curIdx++;
+ verticesMap[dtri[k]] = newVertexIdx;
+ }
+
+ if (newVertexIdx<nverts)
+ {
+ //it's polygon vertex ("shared")
+ int idxInPoly = polyFindVertex(poly, vertsPerPoly, newVertexIdx);
+ if (idxInPoly==-1)
+ {
+ printf("Building NavMeshObject: Error! Can't find vertex in polygon\n");
+ return false;
+ }
+ dtri[k] = idxInPoly;
+ }
+ else
+ {
+ dtri[k] = newVertexIdx - vbase + nv;
+ }
+ }
+ }
+ dmesh[0] = vbase-nverts; //verts base
+ dmesh[1] = curIdx-vbase; //verts num
+ }
+
+ vertices = new float[nverts*3];
+ ndvertsuniq = curIdx - nverts;
+ if (ndvertsuniq>0)
+ {
+ dvertices = new float[ndvertsuniq*3];
+ }
+ for (int vi=0; vi<nAllVerts; vi++)
+ {
+ int newIdx = verticesMap[vi];
+ if (newIdx!=0xffff)
+ {
+ if (newIdx<nverts)
+ {
+ //navigation mesh vertex
+ memcpy(vertices+3*newIdx, allVerts+3*vi, 3*sizeof(float));
+ }
+ else
+ {
+ //detailed mesh vertex
+ memcpy(dvertices+3*(newIdx-nverts), allVerts+3*vi, 3*sizeof(float));
+ }
+ }
+ }
+ }
+ else
+ {
+ //create from RAS_MeshObject (detailed mesh is fake)
+ RAS_MeshObject* meshobj = GetMesh(0);
+ vertsPerPoly = 3;
+ nverts = meshobj->m_sharedvertex_map.size();
+ if (nverts >= 0xffff)
+ return false;
+ //calculate count of tris
+ int nmeshpolys = meshobj->NumPolygons();
+ npolys = nmeshpolys;
+ for (int p=0; p<nmeshpolys; p++)
+ {
+ int vertcount = meshobj->GetPolygon(p)->VertexCount();
+ npolys+=vertcount-3;
+ }
+
+ //create verts
+ vertices = new float[nverts*3];
+ float* vert = vertices;
+ for (int vi=0; vi<nverts; vi++)
+ {
+ const float* pos = !meshobj->m_sharedvertex_map[vi].empty() ? meshobj->GetVertexLocation(vi) : NULL;
+ if (pos)
+ copy_v3_v3(vert, pos);
+ else
+ {
+ memset(vert, 0, 3*sizeof(float)); //vertex isn't in any poly, set dummy zero coordinates
+ }
+ vert+=3;
+ }
+
+ //create tris
+ polys = new unsigned short[npolys*3*2];
+ memset(polys, 0xff, sizeof(unsigned short)*3*2*npolys);
+ unsigned short *poly = polys;
+ RAS_Polygon* raspoly;
+ for (int p=0; p<nmeshpolys; p++)
+ {
+ raspoly = meshobj->GetPolygon(p);
+ for (int v=0; v<raspoly->VertexCount()-2; v++)
+ {
+ poly[0]= raspoly->GetVertex(0)->getOrigIndex();
+ for (size_t i=1; i<3; i++)
+ {
+ poly[i]= raspoly->GetVertex(v+i)->getOrigIndex();
+ }
+ poly += 6;
+ }
+ }
+ dmeshes = NULL;
+ dvertices = NULL;
+ ndvertsuniq = 0;
+ dtris = NULL;
+ ndtris = npolys;
+ }
+ dm->release(dm);
+
+ return true;
+}
+
+
+bool KX_NavMeshObject::BuildNavMesh()
+{
+ if (m_navMesh)
+ {
+ delete m_navMesh;
+ m_navMesh = NULL;
+ }
+
+ if (GetMeshCount()==0)
+ {
+ printf("Can't find mesh for navmesh object: %s \n", m_name.ReadPtr());
+ return false;
+ }
+
+ float *vertices = NULL, *dvertices = NULL;
+ unsigned short *polys = NULL, *dtris = NULL, *dmeshes = NULL;
+ int nverts = 0, npolys = 0, ndvertsuniq = 0, ndtris = 0;
+ int vertsPerPoly = 0;
+ if (!BuildVertIndArrays(vertices, nverts, polys, npolys,
+ dmeshes, dvertices, ndvertsuniq, dtris, ndtris, vertsPerPoly )
+ || vertsPerPoly<3)
+ {
+ printf("Can't build navigation mesh data for object:%s \n", m_name.ReadPtr());
+ return false;
+ }
+
+ MT_Point3 pos;
+ if (dmeshes==NULL)
+ {
+ for (int i=0; i<nverts; i++)
+ {
+ flipAxes(&vertices[i*3]);
+ }
+ for (int i=0; i<ndvertsuniq; i++)
+ {
+ flipAxes(&dvertices[i*3]);
+ }
+ }
+
+ buildMeshAdjacency(polys, npolys, nverts, vertsPerPoly);
+
+ float cs = 0.2f;
+
+ if (!nverts || !npolys)
+ return false;
+
+ float bmin[3], bmax[3];
+ calcMeshBounds(vertices, nverts, bmin, bmax);
+ //quantize vertex pos
+ unsigned short* vertsi = new unsigned short[3*nverts];
+ float ics = 1.f/cs;
+ for (int i=0; i<nverts; i++)
+ {
+ vertsi[3*i+0] = static_cast<unsigned short>((vertices[3*i+0]-bmin[0])*ics);
+ vertsi[3*i+1] = static_cast<unsigned short>((vertices[3*i+1]-bmin[1])*ics);
+ vertsi[3*i+2] = static_cast<unsigned short>((vertices[3*i+2]-bmin[2])*ics);
+ }
+
+ // Calculate data size
+ const int headerSize = sizeof(dtStatNavMeshHeader);
+ const int vertsSize = sizeof(float)*3*nverts;
+ const int polysSize = sizeof(dtStatPoly)*npolys;
+ const int nodesSize = sizeof(dtStatBVNode)*npolys*2;
+ const int detailMeshesSize = sizeof(dtStatPolyDetail)*npolys;
+ const int detailVertsSize = sizeof(float)*3*ndvertsuniq;
+ const int detailTrisSize = sizeof(unsigned char)*4*ndtris;
+
+ const int dataSize = headerSize + vertsSize + polysSize + nodesSize +
+ detailMeshesSize + detailVertsSize + detailTrisSize;
+ unsigned char* data = new unsigned char[dataSize];
+ if (!data)
+ return false;
+ memset(data, 0, dataSize);
+
+ unsigned char* d = data;
+ dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)d; d += headerSize;
+ float* navVerts = (float*)d; d += vertsSize;
+ dtStatPoly* navPolys = (dtStatPoly*)d; d += polysSize;
+ dtStatBVNode* navNodes = (dtStatBVNode*)d; d += nodesSize;
+ dtStatPolyDetail* navDMeshes = (dtStatPolyDetail*)d; d += detailMeshesSize;
+ float* navDVerts = (float*)d; d += detailVertsSize;
+ unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize;
+
+ // Store header
+ header->magic = DT_STAT_NAVMESH_MAGIC;
+ header->version = DT_STAT_NAVMESH_VERSION;
+ header->npolys = npolys;
+ header->nverts = nverts;
+ header->cs = cs;
+ header->bmin[0] = bmin[0];
+ header->bmin[1] = bmin[1];
+ header->bmin[2] = bmin[2];
+ header->bmax[0] = bmax[0];
+ header->bmax[1] = bmax[1];
+ header->bmax[2] = bmax[2];
+ header->ndmeshes = npolys;
+ header->ndverts = ndvertsuniq;
+ header->ndtris = ndtris;
+
+ // Store vertices
+ for (int i = 0; i < nverts; ++i)
+ {
+ const unsigned short* iv = &vertsi[i*3];
+ float* v = &navVerts[i*3];
+ v[0] = bmin[0] + iv[0] * cs;
+ v[1] = bmin[1] + iv[1] * cs;
+ v[2] = bmin[2] + iv[2] * cs;
+ }
+ //memcpy(navVerts, vertices, nverts*3*sizeof(float));
+
+ // Store polygons
+ const unsigned short* src = polys;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPoly* p = &navPolys[i];
+ p->nv = 0;
+ for (int j = 0; j < vertsPerPoly; ++j)
+ {
+ if (src[j] == 0xffff) break;
+ p->v[j] = src[j];
+ p->n[j] = src[vertsPerPoly+j]+1;
+ p->nv++;
+ }
+ src += vertsPerPoly*2;
+ }
+
+ header->nnodes = createBVTree(vertsi, nverts, polys, npolys, vertsPerPoly,
+ cs, cs, npolys*2, navNodes);
+
+
+ if (dmeshes==NULL)
+ {
+ //create fake detail meshes
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyDetail& dtl = navDMeshes[i];
+ dtl.vbase = 0;
+ dtl.nverts = 0;
+ dtl.tbase = i;
+ dtl.ntris = 1;
+ }
+ // setup triangles.
+ unsigned char* tri = navDTris;
+ for(size_t i=0; i<ndtris; i++)
+ {
+ for (size_t j=0; j<3; j++)
+ tri[4*i+j] = j;
+ }
+ }
+ else
+ {
+ //verts
+ memcpy(navDVerts, dvertices, ndvertsuniq*3*sizeof(float));
+ //tris
+ unsigned char* tri = navDTris;
+ for(size_t i=0; i<ndtris; i++)
+ {
+ for (size_t j=0; j<3; j++)
+ tri[4*i+j] = dtris[6*i+j];
+ }
+ //detailed meshes
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyDetail& dtl = navDMeshes[i];
+ dtl.vbase = dmeshes[i*4+0];
+ dtl.nverts = dmeshes[i*4+1];
+ dtl.tbase = dmeshes[i*4+2];
+ dtl.ntris = dmeshes[i*4+3];
+ }
+ }
+
+ m_navMesh = new dtStatNavMesh;
+ m_navMesh->init(data, dataSize, true);
+
+ delete [] vertices;
+ delete [] polys;
+ if (dvertices)
+ {
+ delete [] dvertices;
+ }
+
+ return true;
+}
+
+dtStatNavMesh* KX_NavMeshObject::GetNavMesh()
+{
+ return m_navMesh;
+}
+
+void KX_NavMeshObject::DrawNavMesh(NavMeshRenderMode renderMode)
+{
+ if (!m_navMesh)
+ return;
+ MT_Vector3 color(0.f, 0.f, 0.f);
+
+ switch (renderMode)
+ {
+ case RM_POLYS :
+ case RM_WALLS :
+ for (int pi=0; pi<m_navMesh->getPolyCount(); pi++)
+ {
+ const dtStatPoly* poly = m_navMesh->getPoly(pi);
+
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ if (poly->n[j] && renderMode==RM_WALLS)
+ continue;
+ const float* vif = m_navMesh->getVertex(poly->v[i]);
+ const float* vjf = m_navMesh->getVertex(poly->v[j]);
+ MT_Point3 vi(vif[0], vif[2], vif[1]);
+ MT_Point3 vj(vjf[0], vjf[2], vjf[1]);
+ vi = TransformToWorldCoords(vi);
+ vj = TransformToWorldCoords(vj);
+ KX_RasterizerDrawDebugLine(vi, vj, color);
+ }
+ }
+ break;
+ case RM_TRIS :
+ for (int i = 0; i < m_navMesh->getPolyDetailCount(); ++i)
+ {
+ const dtStatPoly* p = m_navMesh->getPoly(i);
+ const dtStatPolyDetail* pd = m_navMesh->getPolyDetail(i);
+
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = m_navMesh->getDetailTri(pd->tbase+j);
+ MT_Point3 tri[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ const float* v;
+ if (t[k] < p->nv)
+ v = m_navMesh->getVertex(p->v[t[k]]);
+ else
+ v = m_navMesh->getDetailVertex(pd->vbase+(t[k]-p->nv));
+ float pos[3];
+ vcopy(pos, v);
+ flipAxes(pos);
+ tri[k].setValue(pos);
+ }
+
+ for (int k=0; k<3; k++)
+ tri[k] = TransformToWorldCoords(tri[k]);
+
+ for (int k=0; k<3; k++)
+ KX_RasterizerDrawDebugLine(tri[k], tri[(k+1)%3], color);
+ }
+ }
+ break;
+ }
+}
+
+MT_Point3 KX_NavMeshObject::TransformToLocalCoords(const MT_Point3& wpos)
+{
+ MT_Matrix3x3 orientation = NodeGetWorldOrientation();
+ const MT_Vector3& scaling = NodeGetWorldScaling();
+ orientation.scale(scaling[0], scaling[1], scaling[2]);
+ MT_Transform worldtr(NodeGetWorldPosition(), orientation);
+ MT_Transform invworldtr;
+ invworldtr.invert(worldtr);
+ MT_Point3 lpos = invworldtr(wpos);
+ return lpos;
+}
+
+MT_Point3 KX_NavMeshObject::TransformToWorldCoords(const MT_Point3& lpos)
+{
+ MT_Matrix3x3 orientation = NodeGetWorldOrientation();
+ const MT_Vector3& scaling = NodeGetWorldScaling();
+ orientation.scale(scaling[0], scaling[1], scaling[2]);
+ MT_Transform worldtr(NodeGetWorldPosition(), orientation);
+ MT_Point3 wpos = worldtr(lpos);
+ return wpos;
+}
+
+int KX_NavMeshObject::FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen)
+{
+ if (!m_navMesh)
+ return 0;
+ MT_Point3 localfrom = TransformToLocalCoords(from);
+ MT_Point3 localto = TransformToLocalCoords(to);
+ float spos[3], epos[3];
+ localfrom.getValue(spos); flipAxes(spos);
+ localto.getValue(epos); flipAxes(epos);
+ dtStatPolyRef sPolyRef = m_navMesh->findNearestPoly(spos, polyPickExt);
+ dtStatPolyRef ePolyRef = m_navMesh->findNearestPoly(epos, polyPickExt);
+
+ int pathLen = 0;
+ if (sPolyRef && ePolyRef)
+ {
+ dtStatPolyRef* polys = new dtStatPolyRef[maxPathLen];
+ int npolys;
+ npolys = m_navMesh->findPath(sPolyRef, ePolyRef, spos, epos, polys, maxPathLen);
+ if (npolys)
+ {
+ pathLen = m_navMesh->findStraightPath(spos, epos, polys, npolys, path, maxPathLen);
+ for (int i=0; i<pathLen; i++)
+ {
+ flipAxes(&path[i*3]);
+ MT_Point3 waypoint(&path[i*3]);
+ waypoint = TransformToWorldCoords(waypoint);
+ waypoint.getValue(&path[i*3]);
+ }
+ }
+ }
+
+ return pathLen;
+}
+
+float KX_NavMeshObject::Raycast(const MT_Point3& from, const MT_Point3& to)
+{
+ if (!m_navMesh)
+ return 0.f;
+ MT_Point3 localfrom = TransformToLocalCoords(from);
+ MT_Point3 localto = TransformToLocalCoords(to);
+ float spos[3], epos[3];
+ localfrom.getValue(spos); flipAxes(spos);
+ localto.getValue(epos); flipAxes(epos);
+ dtStatPolyRef sPolyRef = m_navMesh->findNearestPoly(spos, polyPickExt);
+ float t=0;
+ static dtStatPolyRef polys[MAX_PATH_LEN];
+ m_navMesh->raycast(sPolyRef, spos, epos, t, polys, MAX_PATH_LEN);
+ return t;
+}
+
+void KX_NavMeshObject::DrawPath(const float *path, int pathLen, const MT_Vector3& color)
+{
+ MT_Vector3 a,b;
+ for (int i=0; i<pathLen-1; i++)
+ {
+ a.setValue(&path[3*i]);
+ b.setValue(&path[3*(i+1)]);
+ KX_RasterizerDrawDebugLine(a, b, color);
+ }
+}
+
+
+#ifndef DISABLE_PYTHON
+//----------------------------------------------------------------------------
+//Python
+
+PyTypeObject KX_NavMeshObject::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "KX_NavMeshObject",
+ 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,
+ &KX_GameObject::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyAttributeDef KX_NavMeshObject::Attributes[] = {
+ { NULL } //Sentinel
+};
+
+//KX_PYMETHODTABLE_NOARGS(KX_GameObject, getD),
+PyMethodDef KX_NavMeshObject::Methods[] = {
+ KX_PYMETHODTABLE(KX_NavMeshObject, findPath),
+ KX_PYMETHODTABLE(KX_NavMeshObject, raycast),
+ KX_PYMETHODTABLE(KX_NavMeshObject, draw),
+ KX_PYMETHODTABLE(KX_NavMeshObject, rebuild),
+ {NULL,NULL} //Sentinel
+};
+
+KX_PYMETHODDEF_DOC(KX_NavMeshObject, findPath,
+ "findPath(start, goal): find path from start to goal points\n"
+ "Returns a path as list of points)\n")
+{
+ PyObject *ob_from, *ob_to;
+ if (!PyArg_ParseTuple(args,"OO:getPath",&ob_from,&ob_to))
+ return NULL;
+ MT_Point3 from, to;
+ if (!PyVecTo(ob_from, from) || !PyVecTo(ob_to, to))
+ return NULL;
+
+ float path[MAX_PATH_LEN*3];
+ int pathLen = FindPath(from, to, path, MAX_PATH_LEN);
+ PyObject *pathList = PyList_New( pathLen );
+ for (int i=0; i<pathLen; i++)
+ {
+ MT_Point3 point(&path[3*i]);
+ PyList_SET_ITEM(pathList, i, PyObjectFrom(point));
+ }
+
+ return pathList;
+}
+
+KX_PYMETHODDEF_DOC(KX_NavMeshObject, raycast,
+ "raycast(start, goal): raycast from start to goal points\n"
+ "Returns hit factor)\n")
+{
+ PyObject *ob_from, *ob_to;
+ if (!PyArg_ParseTuple(args,"OO:getPath",&ob_from,&ob_to))
+ return NULL;
+ MT_Point3 from, to;
+ if (!PyVecTo(ob_from, from) || !PyVecTo(ob_to, to))
+ return NULL;
+ float hit = Raycast(from, to);
+ return PyFloat_FromDouble(hit);
+}
+
+KX_PYMETHODDEF_DOC(KX_NavMeshObject, draw,
+ "draw(mode): navigation mesh debug drawing\n"
+ "mode: WALLS, POLYS, TRIS\n")
+{
+ int arg;
+ NavMeshRenderMode renderMode = RM_TRIS;
+ if (PyArg_ParseTuple(args,"i:rebuild",&arg) && arg>=0 && arg<RM_MAX)
+ renderMode = (NavMeshRenderMode)arg;
+ DrawNavMesh(renderMode);
+ Py_RETURN_NONE;
+}
+
+KX_PYMETHODDEF_DOC_NOARGS(KX_NavMeshObject, rebuild,
+ "rebuild(): rebuild navigation mesh\n")
+{
+ BuildNavMesh();
+ Py_RETURN_NONE;
+}
+
+#endif // DISABLE_PYTHON
diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.h b/source/gameengine/Ketsji/KX_NavMeshObject.h
new file mode 100644
index 00000000000..78e9488ad1c
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_NavMeshObject.h
@@ -0,0 +1,83 @@
+/**
+* $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 __KX_NAVMESHOBJECT
+#define __KX_NAVMESHOBJECT
+#include "DetourStatNavMesh.h"
+#include "KX_GameObject.h"
+#include "PyObjectPlus.h"
+#include <vector>
+
+class RAS_MeshObject;
+class MT_Transform;
+
+class KX_NavMeshObject: public KX_GameObject
+{
+ Py_Header;
+
+protected:
+ dtStatNavMesh* m_navMesh;
+
+ bool BuildVertIndArrays(float *&vertices, int& nverts,
+ unsigned short* &polys, int& npolys, unsigned short *&dmeshes,
+ float *&dvertices, int &ndvertsuniq, unsigned short* &dtris,
+ int& ndtris, int &vertsPerPoly);
+
+public:
+ KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks);
+ ~KX_NavMeshObject();
+
+ virtual CValue* GetReplica();
+ virtual void ProcessReplica();
+
+
+ bool BuildNavMesh();
+ dtStatNavMesh* GetNavMesh();
+ int FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen);
+ float Raycast(const MT_Point3& from, const MT_Point3& to);
+
+ enum NavMeshRenderMode {RM_WALLS, RM_POLYS, RM_TRIS, RM_MAX};
+ void DrawNavMesh(NavMeshRenderMode mode);
+ void DrawPath(const float *path, int pathLen, const MT_Vector3& color);
+
+ MT_Point3 TransformToLocalCoords(const MT_Point3& wpos);
+ MT_Point3 TransformToWorldCoords(const MT_Point3& lpos);
+#ifndef DISABLE_PYTHON
+ /* --------------------------------------------------------------------- */
+ /* Python interface ---------------------------------------------------- */
+ /* --------------------------------------------------------------------- */
+
+ KX_PYMETHOD_DOC(KX_NavMeshObject, findPath);
+ KX_PYMETHOD_DOC(KX_NavMeshObject, raycast);
+ KX_PYMETHOD_DOC(KX_NavMeshObject, draw);
+ KX_PYMETHOD_DOC_NOARGS(KX_NavMeshObject, rebuild);
+#endif
+};
+
+#endif //__KX_NAVMESHOBJECT
+
diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
new file mode 100644
index 00000000000..5f78d9a3722
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
@@ -0,0 +1,869 @@
+/**
+* Simulation for obstacle avoidance behavior
+*
+* $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) 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 "KX_ObstacleSimulation.h"
+#include "KX_NavMeshObject.h"
+#include "KX_PythonInit.h"
+#include "DNA_object_types.h"
+#include "BLI_math.h"
+
+namespace
+{
+ inline float perp(const MT_Vector2& a, const MT_Vector2& b) { return a.x()*b.y() - a.y()*b.x(); }
+
+ inline float sqr(float x) { return x*x; }
+ inline float lerp(float a, float b, float t) { return a + (b-a)*t; }
+ inline float clamp(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); }
+
+ inline float vdistsqr(const float* a, const float* b) { return sqr(b[0]-a[0]) + sqr(b[1]-a[1]); }
+ inline float vdist(const float* a, const float* b) { return sqrtf(vdistsqr(a,b)); }
+ inline void vcpy(float* a, const float* b) { a[0]=b[0]; a[1]=b[1]; }
+ inline float vdot(const float* a, const float* b) { return a[0]*b[0] + a[1]*b[1]; }
+ inline float vperp(const float* a, const float* b) { return a[0]*b[1] - a[1]*b[0]; }
+ inline void vsub(float* v, const float* a, const float* b) { v[0] = a[0]-b[0]; v[1] = a[1]-b[1]; }
+ inline void vadd(float* v, const float* a, const float* b) { v[0] = a[0]+b[0]; v[1] = a[1]+b[1]; }
+ inline void vscale(float* v, const float* a, const float s) { v[0] = a[0]*s; v[1] = a[1]*s; }
+ inline void vset(float* v, float x, float y) { v[0]=x; v[1]=y; }
+ inline float vlensqr(const float* v) { return vdot(v,v); }
+ inline float vlen(const float* v) { return sqrtf(vlensqr(v)); }
+ inline void vlerp(float* v, const float* a, const float* b, float t) { v[0] = lerp(a[0], b[0], t); v[1] = lerp(a[1], b[1], t); }
+ inline void vmad(float* v, const float* a, const float* b, float s) { v[0] = a[0] + b[0]*s; v[1] = a[1] + b[1]*s; }
+ inline void vnorm(float* v)
+ {
+ float d = vlen(v);
+ if (d > 0.0001f)
+ {
+ d = 1.0f/d;
+ v[0] *= d;
+ v[1] *= d;
+ }
+ }
+}
+inline float triarea(const float* a, const float* b, const float* c)
+{
+ return (b[0]*a[1] - a[0]*b[1]) + (c[0]*b[1] - b[0]*c[1]) + (a[0]*c[1] - c[0]*a[1]);
+}
+
+static void closestPtPtSeg(const float* pt,
+ const float* sp, const float* sq,
+ float& t)
+{
+ float dir[2],diff[3];
+ vsub(dir,sq,sp);
+ vsub(diff,pt,sp);
+ t = vdot(diff,dir);
+ if (t <= 0.0f) { t = 0; return; }
+ float d = vdot(dir,dir);
+ if (t >= d) { t = 1; return; }
+ t /= d;
+}
+
+static float distPtSegSqr(const float* pt, const float* sp, const float* sq)
+{
+ float t;
+ closestPtPtSeg(pt, sp,sq, t);
+ float np[2];
+ vlerp(np, sp,sq, t);
+ return vdistsqr(pt,np);
+}
+
+static int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v,
+ const MT_Vector3& pos1, const MT_Scalar r1,
+ float& tmin, float& tmax)
+{
+ static const float EPS = 0.0001f;
+ MT_Vector2 c0(pos0.x(), pos0.y());
+ MT_Vector2 c1(pos1.x(), pos1.y());
+ MT_Vector2 s = c1 - c0;
+ MT_Scalar r = r0+r1;
+ float c = s.length2() - r*r;
+ float a = v.length2();
+ if (a < EPS) return 0; // not moving
+
+ // Overlap, calc time to exit.
+ float b = MT_dot(v,s);
+ float d = b*b - a*c;
+ if (d < 0.0f) return 0; // no intersection.
+ tmin = (b - sqrtf(d)) / a;
+ tmax = (b + sqrtf(d)) / a;
+ return 1;
+}
+
+static int sweepCircleSegment(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v,
+ const MT_Vector3& pa, const MT_Vector3& pb, const MT_Scalar sr,
+ float& tmin, float &tmax)
+{
+ // equation parameters
+ MT_Vector2 c0(pos0.x(), pos0.y());
+ MT_Vector2 sa(pa.x(), pa.y());
+ MT_Vector2 sb(pb.x(), pb.y());
+ MT_Vector2 L = sb-sa;
+ MT_Vector2 H = c0-sa;
+ MT_Scalar radius = r0+sr;
+ float l2 = L.length2();
+ float r2 = radius * radius;
+ float dl = perp(v, L);
+ float hl = perp(H, L);
+ float a = dl * dl;
+ float b = 2.0f * hl * dl;
+ float c = hl * hl - (r2 * l2);
+ float d = (b*b) - (4.0f * a * c);
+
+ // infinite line missed by infinite ray.
+ if (d < 0.0f)
+ return 0;
+
+ d = sqrtf(d);
+ tmin = (-b - d) / (2.0f * a);
+ tmax = (-b + d) / (2.0f * a);
+
+ // line missed by ray range.
+ /* if (tmax < 0.0f || tmin > 1.0f)
+ return 0;*/
+
+ // find what part of the ray was collided.
+ MT_Vector2 Pedge;
+ Pedge = c0+v*tmin;
+ H = Pedge - sa;
+ float e0 = MT_dot(H, L) / l2;
+ Pedge = c0 + v*tmax;
+ H = Pedge - sa;
+ float e1 = MT_dot(H, L) / l2;
+
+ if (e0 < 0.0f || e1 < 0.0f)
+ {
+ float ctmin, ctmax;
+ if (sweepCircleCircle(pos0, r0, v, pa, sr, ctmin, ctmax))
+ {
+ if (e0 < 0.0f && ctmin > tmin)
+ tmin = ctmin;
+ if (e1 < 0.0f && ctmax < tmax)
+ tmax = ctmax;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ if (e0 > 1.0f || e1 > 1.0f)
+ {
+ float ctmin, ctmax;
+ if (sweepCircleCircle(pos0, r0, v, pb, sr, ctmin, ctmax))
+ {
+ if (e0 > 1.0f && ctmin > tmin)
+ tmin = ctmin;
+ if (e1 > 1.0f && ctmax < tmax)
+ tmax = ctmax;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static bool inBetweenAngle(float a, float amin, float amax, float& t)
+{
+ if (amax < amin) amax += (float)M_PI*2;
+ if (a < amin-(float)M_PI) a += (float)M_PI*2;
+ if (a > amin+(float)M_PI) a -= (float)M_PI*2;
+ if (a >= amin && a < amax)
+ {
+ t = (a-amin) / (amax-amin);
+ return true;
+ }
+ return false;
+}
+
+static float interpolateToi(float a, const float* dir, const float* toi, const int ntoi)
+{
+ for (int i = 0; i < ntoi; ++i)
+ {
+ int next = (i+1) % ntoi;
+ float t;
+ if (inBetweenAngle(a, dir[i], dir[next], t))
+ {
+ return lerp(toi[i], toi[next], t);
+ }
+ }
+ return 0;
+}
+
+KX_ObstacleSimulation::KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization)
+: m_levelHeight(levelHeight)
+, m_enableVisualization(enableVisualization)
+{
+
+}
+
+KX_ObstacleSimulation::~KX_ObstacleSimulation()
+{
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ KX_Obstacle* obs = m_obstacles[i];
+ delete obs;
+ }
+ m_obstacles.clear();
+}
+KX_Obstacle* KX_ObstacleSimulation::CreateObstacle(KX_GameObject* gameobj)
+{
+ KX_Obstacle* obstacle = new KX_Obstacle();
+ obstacle->m_gameObj = gameobj;
+
+ vset(obstacle->vel, 0,0);
+ vset(obstacle->pvel, 0,0);
+ vset(obstacle->dvel, 0,0);
+ vset(obstacle->nvel, 0,0);
+ for (int i = 0; i < VEL_HIST_SIZE; ++i)
+ vset(&obstacle->hvel[i*2], 0,0);
+ obstacle->hhead = 0;
+
+ gameobj->RegisterObstacle(this);
+ m_obstacles.push_back(obstacle);
+ return obstacle;
+}
+
+void KX_ObstacleSimulation::AddObstacleForObj(KX_GameObject* gameobj)
+{
+ KX_Obstacle* obstacle = CreateObstacle(gameobj);
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ obstacle->m_type = KX_OBSTACLE_OBJ;
+ obstacle->m_shape = KX_OBSTACLE_CIRCLE;
+ obstacle->m_rad = blenderobject->obstacleRad;
+}
+
+void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj)
+{
+ dtStatNavMesh* navmesh = navmeshobj->GetNavMesh();
+ if (navmesh)
+ {
+ int npoly = navmesh->getPolyCount();
+ for (int pi=0; pi<npoly; pi++)
+ {
+ const dtStatPoly* poly = navmesh->getPoly(pi);
+
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ if (poly->n[j]) continue;
+ const float* vj = navmesh->getVertex(poly->v[j]);
+ const float* vi = navmesh->getVertex(poly->v[i]);
+
+ KX_Obstacle* obstacle = CreateObstacle(navmeshobj);
+ obstacle->m_type = KX_OBSTACLE_NAV_MESH;
+ obstacle->m_shape = KX_OBSTACLE_SEGMENT;
+ obstacle->m_pos = MT_Point3(vj[0], vj[2], vj[1]);
+ obstacle->m_pos2 = MT_Point3(vi[0], vi[2], vi[1]);
+ obstacle->m_rad = 0;
+ }
+ }
+ }
+}
+
+void KX_ObstacleSimulation::DestroyObstacleForObj(KX_GameObject* gameobj)
+{
+ for (size_t i=0; i<m_obstacles.size(); )
+ {
+ if (m_obstacles[i]->m_gameObj == gameobj)
+ {
+ KX_Obstacle* obstacle = m_obstacles[i];
+ obstacle->m_gameObj->UnregisterObstacle();
+ m_obstacles[i] = m_obstacles.back();
+ m_obstacles.pop_back();
+ delete obstacle;
+ }
+ else
+ i++;
+ }
+}
+
+void KX_ObstacleSimulation::UpdateObstacles()
+{
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ if (m_obstacles[i]->m_type==KX_OBSTACLE_NAV_MESH || m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT)
+ continue;
+
+ KX_Obstacle* obs = m_obstacles[i];
+ obs->m_pos = obs->m_gameObj->NodeGetWorldPosition();
+ obs->vel[0] = obs->m_gameObj->GetLinearVelocity().x();
+ obs->vel[1] = obs->m_gameObj->GetLinearVelocity().y();
+
+ // Update velocity history and calculate perceived (average) velocity.
+ vcpy(&obs->hvel[obs->hhead*2], obs->vel);
+ obs->hhead = (obs->hhead+1) % VEL_HIST_SIZE;
+ vset(obs->pvel,0,0);
+ for (int j = 0; j < VEL_HIST_SIZE; ++j)
+ vadd(obs->pvel, obs->pvel, &obs->hvel[j*2]);
+ vscale(obs->pvel, obs->pvel, 1.0f/VEL_HIST_SIZE);
+ }
+}
+
+KX_Obstacle* KX_ObstacleSimulation::GetObstacle(KX_GameObject* gameobj)
+{
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ if (m_obstacles[i]->m_gameObj == gameobj)
+ return m_obstacles[i];
+ }
+
+ return NULL;
+}
+
+void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle)
+{
+}
+
+void KX_ObstacleSimulation::DrawObstacles()
+{
+ if (!m_enableVisualization)
+ return;
+ static const MT_Vector3 bluecolor(0,0,1);
+ static const MT_Vector3 normal(0.,0.,1.);
+ static const int SECTORS_NUM = 32;
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ if (m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT)
+ {
+ MT_Point3 p1 = m_obstacles[i]->m_pos;
+ MT_Point3 p2 = m_obstacles[i]->m_pos2;
+ //apply world transform
+ if (m_obstacles[i]->m_type == KX_OBSTACLE_NAV_MESH)
+ {
+ KX_NavMeshObject* navmeshobj = static_cast<KX_NavMeshObject*>(m_obstacles[i]->m_gameObj);
+ p1 = navmeshobj->TransformToWorldCoords(p1);
+ p2 = navmeshobj->TransformToWorldCoords(p2);
+ }
+
+ KX_RasterizerDrawDebugLine(p1, p2, bluecolor);
+ }
+ else if (m_obstacles[i]->m_shape==KX_OBSTACLE_CIRCLE)
+ {
+ KX_RasterizerDrawDebugCircle(m_obstacles[i]->m_pos, m_obstacles[i]->m_rad, bluecolor,
+ normal, SECTORS_NUM);
+ }
+ }
+}
+
+static MT_Point3 nearestPointToObstacle(MT_Point3& pos ,KX_Obstacle* obstacle)
+{
+ switch (obstacle->m_shape)
+ {
+ case KX_OBSTACLE_SEGMENT :
+ {
+ MT_Vector3 ab = obstacle->m_pos2 - obstacle->m_pos;
+ if (!ab.fuzzyZero())
+ {
+ MT_Vector3 abdir = ab.normalized();
+ MT_Vector3 v = pos - obstacle->m_pos;
+ MT_Scalar proj = abdir.dot(v);
+ CLAMP(proj, 0, ab.length());
+ MT_Point3 res = obstacle->m_pos + abdir*proj;
+ return res;
+ }
+ }
+ case KX_OBSTACLE_CIRCLE :
+ default:
+ return obstacle->m_pos;
+ }
+}
+
+static bool filterObstacle(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObst,
+ float levelHeight)
+{
+ //filter obstacles by type
+ if ( (otherObst == activeObst) ||
+ (otherObst->m_type==KX_OBSTACLE_NAV_MESH && otherObst->m_gameObj!=activeNavMeshObj) )
+ return false;
+
+ //filter obstacles by position
+ MT_Point3 p = nearestPointToObstacle(activeObst->m_pos, otherObst);
+ if ( fabs(activeObst->m_pos.z() - p.z()) > levelHeight)
+ return false;
+
+ return true;
+}
+
+///////////*********TOI_rays**********/////////////////
+KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(MT_Scalar levelHeight, bool enableVisualization)
+: KX_ObstacleSimulation(levelHeight, enableVisualization),
+ m_maxSamples(32),
+ m_minToi(0.0f),
+ m_maxToi(0.0f),
+ m_velWeight(1.0f),
+ m_curVelWeight(1.0f),
+ m_toiWeight(1.0f),
+ m_collisionWeight(1.0f)
+{
+}
+
+
+void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed, MT_Scalar maxDeltaAngle)
+{
+ int nobs = m_obstacles.size();
+ int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), activeObst) - m_obstacles.begin();
+ if (obstidx == nobs)
+ return;
+
+ vset(activeObst->dvel, velocity.x(), velocity.y());
+
+ //apply RVO
+ sampleRVO(activeObst, activeNavMeshObj, maxDeltaAngle);
+
+ // Fake dynamic constraint.
+ float dv[2];
+ float vel[2];
+ vsub(dv, activeObst->nvel, activeObst->vel);
+ float ds = vlen(dv);
+ if (ds > maxDeltaSpeed || ds<-maxDeltaSpeed)
+ vscale(dv, dv, fabs(maxDeltaSpeed/ds));
+ vadd(vel, activeObst->vel, dv);
+
+ velocity.x() = vel[0];
+ velocity.y() = vel[1];
+}
+
+///////////*********TOI_rays**********/////////////////
+static const int AVOID_MAX_STEPS = 128;
+struct TOICircle
+{
+ TOICircle() : n(0), minToi(0), maxToi(1) {}
+ float toi[AVOID_MAX_STEPS]; // Time of impact (seconds)
+ float toie[AVOID_MAX_STEPS]; // Time of exit (seconds)
+ float dir[AVOID_MAX_STEPS]; // Direction (radians)
+ int n; // Number of samples
+ float minToi, maxToi; // Min/max TOI (seconds)
+};
+
+KX_ObstacleSimulationTOI_rays::KX_ObstacleSimulationTOI_rays(MT_Scalar levelHeight, bool enableVisualization):
+ KX_ObstacleSimulationTOI(levelHeight, enableVisualization)
+{
+ m_maxSamples = 32;
+ m_minToi = 0.5f;
+ m_maxToi = 1.2f;
+ m_velWeight = 4.0f;
+ m_toiWeight = 1.0f;
+ m_collisionWeight = 100.0f;
+}
+
+
+void KX_ObstacleSimulationTOI_rays::sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle)
+{
+ MT_Vector2 vel(activeObst->dvel[0], activeObst->dvel[1]);
+ float vmax = (float) vel.length();
+ float odir = (float) atan2(vel.y(), vel.x());
+
+ MT_Vector2 ddir = vel;
+ ddir.normalize();
+
+ float bestScore = FLT_MAX;
+ float bestDir = odir;
+ float bestToi = 0;
+
+ TOICircle tc;
+ tc.n = m_maxSamples;
+ tc.minToi = m_minToi;
+ tc.maxToi = m_maxToi;
+
+ const int iforw = m_maxSamples/2;
+ const float aoff = (float)iforw / (float)m_maxSamples;
+
+ size_t nobs = m_obstacles.size();
+ for (int iter = 0; iter < m_maxSamples; ++iter)
+ {
+ // Calculate sample velocity
+ const float ndir = ((float)iter/(float)m_maxSamples) - aoff;
+ const float dir = odir+ndir*M_PI*2;
+ MT_Vector2 svel;
+ svel.x() = cosf(dir) * vmax;
+ svel.y() = sinf(dir) * vmax;
+
+ // Find min time of impact and exit amongst all obstacles.
+ float tmin = m_maxToi;
+ float tmine = 0;
+ for (int i = 0; i < nobs; ++i)
+ {
+ KX_Obstacle* ob = m_obstacles[i];
+ bool res = filterObstacle(activeObst, activeNavMeshObj, ob, m_levelHeight);
+ if (!res)
+ continue;
+
+ float htmin,htmax;
+
+ if (ob->m_shape == KX_OBSTACLE_CIRCLE)
+ {
+ MT_Vector2 vab;
+ if (vlen(ob->vel) < 0.01f*0.01f)
+ {
+ // Stationary, use VO
+ vab = svel;
+ }
+ else
+ {
+ // Moving, use RVO
+ vab = 2*svel - vel - ob->vel;
+ }
+
+ if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad,
+ vab, ob->m_pos, ob->m_rad, htmin, htmax))
+ continue;
+ }
+ else if (ob->m_shape == KX_OBSTACLE_SEGMENT)
+ {
+ MT_Point3 p1 = ob->m_pos;
+ MT_Point3 p2 = ob->m_pos2;
+ //apply world transform
+ if (ob->m_type == KX_OBSTACLE_NAV_MESH)
+ {
+ KX_NavMeshObject* navmeshobj = static_cast<KX_NavMeshObject*>(ob->m_gameObj);
+ p1 = navmeshobj->TransformToWorldCoords(p1);
+ p2 = navmeshobj->TransformToWorldCoords(p2);
+ }
+ if (!sweepCircleSegment(activeObst->m_pos, activeObst->m_rad, svel,
+ p1, p2, ob->m_rad, htmin, htmax))
+ continue;
+ }
+
+ if (htmin > 0.0f)
+ {
+ // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle.
+ if (htmin < tmin)
+ tmin = htmin;
+ }
+ else if (htmax > 0.0f)
+ {
+ // The agent overlaps the obstacle, keep track of first safe exit.
+ if (htmax > tmine)
+ tmine = htmax;
+ }
+ }
+
+ // Calculate sample penalties and final score.
+ const float apen = m_velWeight * fabsf(ndir);
+ const float tpen = m_toiWeight * (1.0f/(0.0001f+tmin/m_maxToi));
+ const float cpen = m_collisionWeight * (tmine/m_minToi)*(tmine/m_minToi);
+ const float score = apen + tpen + cpen;
+
+ // Update best score.
+ if (score < bestScore)
+ {
+ bestDir = dir;
+ bestToi = tmin;
+ bestScore = score;
+ }
+
+ tc.dir[iter] = dir;
+ tc.toi[iter] = tmin;
+ tc.toie[iter] = tmine;
+ }
+
+ if (vlen(activeObst->vel) > 0.1)
+ {
+ // Constrain max turn rate.
+ float cura = atan2(activeObst->vel[1],activeObst->vel[0]);
+ float da = bestDir - cura;
+ if (da < -M_PI) da += (float)M_PI*2;
+ if (da > M_PI) da -= (float)M_PI*2;
+ if (da < -maxDeltaAngle)
+ {
+ bestDir = cura - maxDeltaAngle;
+ bestToi = min(bestToi, interpolateToi(bestDir, tc.dir, tc.toi, tc.n));
+ }
+ else if (da > maxDeltaAngle)
+ {
+ bestDir = cura + maxDeltaAngle;
+ bestToi = min(bestToi, interpolateToi(bestDir, tc.dir, tc.toi, tc.n));
+ }
+ }
+
+ // Adjust speed when time of impact is less than min TOI.
+ if (bestToi < m_minToi)
+ vmax *= bestToi/m_minToi;
+
+ // New steering velocity.
+ activeObst->nvel[0] = cosf(bestDir) * vmax;
+ activeObst->nvel[1] = sinf(bestDir) * vmax;
+}
+
+///////////********* TOI_cells**********/////////////////
+
+static void processSamples(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ KX_Obstacles& obstacles, float levelHeight, const float vmax,
+ const float* spos, const float cs, const int nspos, float* res,
+ float maxToi, float velWeight, float curVelWeight, float sideWeight,
+ float toiWeight)
+{
+ vset(res, 0,0);
+
+ const float ivmax = 1.0f / vmax;
+
+ float adir[2], adist;
+ vcpy(adir, activeObst->pvel);
+ if (vlen(adir) > 0.01f)
+ vnorm(adir);
+ else
+ vset(adir,0,0);
+ float activeObstPos[2];
+ vset(activeObstPos, activeObst->m_pos.x(), activeObst->m_pos.y());
+ adist = vdot(adir, activeObstPos);
+
+ float minPenalty = FLT_MAX;
+
+ for (int n = 0; n < nspos; ++n)
+ {
+ float vcand[2];
+ vcpy(vcand, &spos[n*2]);
+
+ // Find min time of impact and exit amongst all obstacles.
+ float tmin = maxToi;
+ float side = 0;
+ int nside = 0;
+
+ for (int i = 0; i < obstacles.size(); ++i)
+ {
+ KX_Obstacle* ob = obstacles[i];
+ bool res = filterObstacle(activeObst, activeNavMeshObj, ob, levelHeight);
+ if (!res)
+ continue;
+ float htmin, htmax;
+
+ if (ob->m_shape==KX_OBSTACLE_CIRCLE)
+ {
+ float vab[2];
+
+ // Moving, use RVO
+ vscale(vab, vcand, 2);
+ vsub(vab, vab, activeObst->vel);
+ vsub(vab, vab, ob->vel);
+
+ // Side
+ // NOTE: dp, and dv are constant over the whole calculation,
+ // they can be precomputed per object.
+ const float* pa = activeObstPos;
+ float pb[2];
+ vset(pb, ob->m_pos.x(), ob->m_pos.y());
+
+ const float orig[2] = {0,0};
+ float dp[2],dv[2],np[2];
+ vsub(dp,pb,pa);
+ vnorm(dp);
+ vsub(dv,ob->dvel, activeObst->dvel);
+
+ const float a = triarea(orig, dp,dv);
+ if (a < 0.01f)
+ {
+ np[0] = -dp[1];
+ np[1] = dp[0];
+ }
+ else
+ {
+ np[0] = dp[1];
+ np[1] = -dp[0];
+ }
+
+ side += clamp(min(vdot(dp,vab)*2,vdot(np,vab)*2), 0.0f, 1.0f);
+ nside++;
+
+ if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, vab, ob->m_pos, ob->m_rad,
+ htmin, htmax))
+ continue;
+
+ // Handle overlapping obstacles.
+ if (htmin < 0.0f && htmax > 0.0f)
+ {
+ // Avoid more when overlapped.
+ htmin = -htmin * 0.5f;
+ }
+ }
+ else if (ob->m_shape == KX_OBSTACLE_SEGMENT)
+ {
+ MT_Point3 p1 = ob->m_pos;
+ MT_Point3 p2 = ob->m_pos2;
+ //apply world transform
+ if (ob->m_type == KX_OBSTACLE_NAV_MESH)
+ {
+ KX_NavMeshObject* navmeshobj = static_cast<KX_NavMeshObject*>(ob->m_gameObj);
+ p1 = navmeshobj->TransformToWorldCoords(p1);
+ p2 = navmeshobj->TransformToWorldCoords(p2);
+ }
+ float p[2], q[2];
+ vset(p, p1.x(), p1.y());
+ vset(q, p2.x(), p2.y());
+
+ // NOTE: the segments are assumed to come from a navmesh which is shrunken by
+ // the agent radius, hence the use of really small radius.
+ // This can be handle more efficiently by using seg-seg test instead.
+ // If the whole segment is to be treated as obstacle, use agent->rad instead of 0.01f!
+ const float r = 0.01f; // agent->rad
+ if (distPtSegSqr(activeObstPos, p, q) < sqr(r+ob->m_rad))
+ {
+ float sdir[2], snorm[2];
+ vsub(sdir, q, p);
+ snorm[0] = sdir[1];
+ snorm[1] = -sdir[0];
+ // If the velocity is pointing towards the segment, no collision.
+ if (vdot(snorm, vcand) < 0.0f)
+ continue;
+ // Else immediate collision.
+ htmin = 0.0f;
+ htmax = 10.0f;
+ }
+ else
+ {
+ if (!sweepCircleSegment(activeObstPos, r, vcand, p, q, ob->m_rad, htmin, htmax))
+ continue;
+ }
+
+ // Avoid less when facing walls.
+ htmin *= 2.0f;
+ }
+
+ if (htmin >= 0.0f)
+ {
+ // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle.
+ if (htmin < tmin)
+ tmin = htmin;
+ }
+ }
+
+ // Normalize side bias, to prevent it dominating too much.
+ if (nside)
+ side /= nside;
+
+ const float vpen = velWeight * (vdist(vcand, activeObst->dvel) * ivmax);
+ const float vcpen = curVelWeight * (vdist(vcand, activeObst->vel) * ivmax);
+ const float spen = sideWeight * side;
+ const float tpen = toiWeight * (1.0f/(0.1f+tmin/maxToi));
+
+ const float penalty = vpen + vcpen + spen + tpen;
+
+ if (penalty < minPenalty)
+ {
+ minPenalty = penalty;
+ vcpy(res, vcand);
+ }
+ }
+}
+
+void KX_ObstacleSimulationTOI_cells::sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle)
+{
+ vset(activeObst->nvel, 0.f, 0.f);
+ float vmax = vlen(activeObst->dvel);
+
+ float* spos = new float[2*m_maxSamples];
+ int nspos = 0;
+
+ if (!m_adaptive)
+ {
+ const float cvx = activeObst->dvel[0]*m_bias;
+ const float cvy = activeObst->dvel[1]*m_bias;
+ float vmax = vlen(activeObst->dvel);
+ const float vrange = vmax*(1-m_bias);
+ const float cs = 1.0f / (float)m_sampleRadius*vrange;
+
+ for (int y = -m_sampleRadius; y <= m_sampleRadius; ++y)
+ {
+ for (int x = -m_sampleRadius; x <= m_sampleRadius; ++x)
+ {
+ if (nspos < m_maxSamples)
+ {
+ const float vx = cvx + (float)(x+0.5f)*cs;
+ const float vy = cvy + (float)(y+0.5f)*cs;
+ if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue;
+ spos[nspos*2+0] = vx;
+ spos[nspos*2+1] = vy;
+ nspos++;
+ }
+ }
+ }
+ processSamples(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, vmax, spos, cs/2,
+ nspos, activeObst->nvel, m_maxToi, m_velWeight, m_curVelWeight, m_collisionWeight, m_toiWeight);
+ }
+ else
+ {
+ int rad;
+ float res[2];
+ float cs;
+ // First sample location.
+ rad = 4;
+ res[0] = activeObst->dvel[0]*m_bias;
+ res[1] = activeObst->dvel[1]*m_bias;
+ cs = vmax*(2-m_bias*2) / (float)(rad-1);
+
+ for (int k = 0; k < 5; ++k)
+ {
+ const float half = (rad-1)*cs*0.5f;
+
+ nspos = 0;
+ for (int y = 0; y < rad; ++y)
+ {
+ for (int x = 0; x < rad; ++x)
+ {
+ const float vx = res[0] + x*cs - half;
+ const float vy = res[1] + y*cs - half;
+ if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue;
+ spos[nspos*2+0] = vx;
+ spos[nspos*2+1] = vy;
+ nspos++;
+ }
+ }
+
+ processSamples(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, vmax, spos, cs/2,
+ nspos, res, m_maxToi, m_velWeight, m_curVelWeight, m_collisionWeight, m_toiWeight);
+
+ cs *= 0.5f;
+ }
+ vcpy(activeObst->nvel, res);
+ }
+}
+
+KX_ObstacleSimulationTOI_cells::KX_ObstacleSimulationTOI_cells(MT_Scalar levelHeight, bool enableVisualization)
+: KX_ObstacleSimulationTOI(levelHeight, enableVisualization)
+, m_bias(0.4f)
+, m_adaptive(true)
+, m_sampleRadius(15)
+{
+ m_maxSamples = (m_sampleRadius*2+1)*(m_sampleRadius*2+1) + 100;
+ m_maxToi = 1.5f;
+ m_velWeight = 2.0f;
+ m_curVelWeight = 0.75f;
+ m_toiWeight = 2.5f;
+ m_collisionWeight = 0.75f; //side_weight
+}
diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h
new file mode 100644
index 00000000000..d926e8deb71
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h
@@ -0,0 +1,145 @@
+/**
+* Simulation for obstacle avoidance behavior
+* (based on Cane Project - http://code.google.com/p/cane by Mikko Mononen (c) 2009)
+*
+*
+* $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) 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 __KX_OBSTACLESIMULATION
+#define __KX_OBSTACLESIMULATION
+
+#include <vector>
+#include "MT_Point2.h"
+#include "MT_Point3.h"
+
+class KX_GameObject;
+class KX_NavMeshObject;
+
+enum KX_OBSTACLE_TYPE
+{
+ KX_OBSTACLE_OBJ,
+ KX_OBSTACLE_NAV_MESH,
+};
+
+enum KX_OBSTACLE_SHAPE
+{
+ KX_OBSTACLE_CIRCLE,
+ KX_OBSTACLE_SEGMENT,
+};
+
+#define VEL_HIST_SIZE 6
+struct KX_Obstacle
+{
+ KX_OBSTACLE_TYPE m_type;
+ KX_OBSTACLE_SHAPE m_shape;
+ MT_Point3 m_pos;
+ MT_Point3 m_pos2;
+ MT_Scalar m_rad;
+
+ float vel[2];
+ float pvel[2];
+ float dvel[2];
+ float nvel[2];
+ float hvel[VEL_HIST_SIZE*2];
+ int hhead;
+
+
+ KX_GameObject* m_gameObj;
+};
+typedef std::vector<KX_Obstacle*> KX_Obstacles;
+
+class KX_ObstacleSimulation
+{
+protected:
+ KX_Obstacles m_obstacles;
+
+ MT_Scalar m_levelHeight;
+ bool m_enableVisualization;
+
+ KX_Obstacle* CreateObstacle(KX_GameObject* gameobj);
+public:
+ KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization);
+ virtual ~KX_ObstacleSimulation();
+
+ void DrawObstacles();
+ //void DebugDraw();
+
+ void AddObstacleForObj(KX_GameObject* gameobj);
+ void DestroyObstacleForObj(KX_GameObject* gameobj);
+ void AddObstaclesForNavMesh(KX_NavMeshObject* navmesh);
+ KX_Obstacle* GetObstacle(KX_GameObject* gameobj);
+ void UpdateObstacles();
+ virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle);
+
+};
+class KX_ObstacleSimulationTOI: public KX_ObstacleSimulation
+{
+protected:
+ int m_maxSamples; // Number of sample steps
+ float m_minToi; // Min TOI
+ float m_maxToi; // Max TOI
+ float m_velWeight; // Sample selection angle weight
+ float m_curVelWeight; // Sample selection current velocity weight
+ float m_toiWeight; // Sample selection TOI weight
+ float m_collisionWeight; // Sample selection collision weight
+
+ virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle) = 0;
+public:
+ KX_ObstacleSimulationTOI(MT_Scalar levelHeight, bool enableVisualization);
+ virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle);
+};
+
+class KX_ObstacleSimulationTOI_rays: public KX_ObstacleSimulationTOI
+{
+protected:
+ virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle);
+public:
+ KX_ObstacleSimulationTOI_rays(MT_Scalar levelHeight, bool enableVisualization);
+};
+
+class KX_ObstacleSimulationTOI_cells: public KX_ObstacleSimulationTOI
+{
+protected:
+ float m_bias;
+ bool m_adaptive;
+ int m_sampleRadius;
+ virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle);
+public:
+ KX_ObstacleSimulationTOI_cells(MT_Scalar levelHeight, bool enableVisualization);
+};
+
+#endif
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 395e2048cb7..7ddaa97770b 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -87,6 +87,8 @@ extern "C" {
#include "KX_GameActuator.h"
#include "KX_ParentActuator.h"
#include "KX_SCA_DynamicActuator.h"
+#include "KX_SteeringActuator.h"
+#include "KX_NavMeshObject.h"
#include "SCA_IInputDevice.h"
#include "SCA_PropertySensor.h"
@@ -181,6 +183,13 @@ void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,cons
gp_Rasterizer->DrawDebugLine(from,to,color);
}
+void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector)
+{
+ if (gp_Rasterizer)
+ gp_Rasterizer->DrawDebugCircle(center, radius, color, normal, nsector);
+}
+
#ifdef WITH_PYTHON
static PyObject *gp_OrigPythonSysPath= NULL;
@@ -725,7 +734,7 @@ static PyObject *gLibNew(PyObject*, PyObject* args)
if(idcode==ID_ME) {
PyObject *ret= PyList_New(0);
PyObject *item;
- for(int i= 0; i < PyList_GET_SIZE(names); i++) {
+ for(Py_ssize_t i= 0; i < PyList_GET_SIZE(names); i++) {
name= _PyUnicode_AsString(PyList_GET_ITEM(names, i));
if(name) {
RAS_MeshObject *meshobj= kx_scene->GetSceneConverter()->ConvertMeshSpecial(kx_scene, maggie, name);
@@ -1655,6 +1664,16 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
KX_MACRO_addTypesToDict(d, ROT_MODE_ZXY, ROT_MODE_ZXY);
KX_MACRO_addTypesToDict(d, ROT_MODE_ZYX, ROT_MODE_ZYX);
+ /* Steering actuator */
+ KX_MACRO_addTypesToDict(d, KX_STEERING_SEEK, KX_SteeringActuator::KX_STEERING_SEEK);
+ KX_MACRO_addTypesToDict(d, KX_STEERING_FLEE, KX_SteeringActuator::KX_STEERING_FLEE);
+ KX_MACRO_addTypesToDict(d, KX_STEERING_PATHFOLLOWING, KX_SteeringActuator::KX_STEERING_PATHFOLLOWING);
+
+ /* KX_NavMeshObject render mode */
+ KX_MACRO_addTypesToDict(d, RM_WALLS, KX_NavMeshObject::RM_WALLS);
+ KX_MACRO_addTypesToDict(d, RM_POLYS, KX_NavMeshObject::RM_POLYS);
+ KX_MACRO_addTypesToDict(d, RM_TRIS, KX_NavMeshObject::RM_TRIS);
+
/* BL_Action play modes */
KX_MACRO_addTypesToDict(d, KX_ACTION_MODE_PLAY, BL_Action::ACT_MODE_PLAY);
KX_MACRO_addTypesToDict(d, KX_ACTION_MODE_LOOP, BL_Action::ACT_MODE_LOOP);
@@ -1751,7 +1770,7 @@ static void initPySysObjects(Main *maggie)
initPySysObjects__append(sys_path, gp_GamePythonPath);
-// fprintf(stderr, "\nNew Path: %d ", PyList_Size(sys_path));
+// fprintf(stderr, "\nNew Path: %d ", PyList_GET_SIZE(sys_path));
// PyObject_Print(sys_path, stderr, 0);
}
@@ -1775,7 +1794,7 @@ static void restorePySysObjects(void)
gp_OrigPythonSysModules= NULL;
-// fprintf(stderr, "\nRestore Path: %d ", PyList_Size(sys_path));
+// fprintf(stderr, "\nRestore Path: %d ", PyList_GET_SIZE(sys_path));
// PyObject_Print(sys_path, stderr, 0);
}
diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h
index 1b172c35eff..d76e8f913df 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.h
+++ b/source/gameengine/Ketsji/KX_PythonInit.h
@@ -72,6 +72,9 @@ class KX_KetsjiEngine* KX_GetActiveEngine();
#include "MT_Vector3.h"
void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color);
+void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector);
+
#endif //__KX_PYTHON_INIT
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index 1c4a17e31fc..49a08135c38 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -68,6 +68,7 @@
#include "KX_SCA_ReplaceMeshActuator.h"
#include "KX_SceneActuator.h"
#include "KX_StateActuator.h"
+#include "KX_SteeringActuator.h"
#include "KX_TrackToActuator.h"
#include "KX_VehicleWrapper.h"
#include "KX_VertexProxy.h"
@@ -99,6 +100,7 @@
#include "SCA_PythonController.h"
#include "SCA_RandomActuator.h"
#include "SCA_IController.h"
+#include "KX_NavMeshObject.h"
static void PyType_Attr_Set(PyGetSetDef *attr_getset, PyAttributeDef *attr)
{
@@ -217,9 +219,11 @@ void initPyTypes(void)
PyType_Ready_Attr(dict, KX_SCA_EndObjectActuator, init_getset);
PyType_Ready_Attr(dict, KX_SCA_ReplaceMeshActuator, init_getset);
PyType_Ready_Attr(dict, KX_Scene, init_getset);
+ PyType_Ready_Attr(dict, KX_NavMeshObject, init_getset);
PyType_Ready_Attr(dict, KX_SceneActuator, init_getset);
PyType_Ready_Attr(dict, KX_SoundActuator, init_getset);
PyType_Ready_Attr(dict, KX_StateActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_SteeringActuator, init_getset);
PyType_Ready_Attr(dict, KX_TouchSensor, init_getset);
PyType_Ready_Attr(dict, KX_TrackToActuator, init_getset);
PyType_Ready_Attr(dict, KX_VehicleWrapper, init_getset);
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index 06e343cedb2..bdc30810b9e 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -87,6 +87,7 @@
#include "BL_ModifierDeformer.h"
#include "BL_ShapeDeformer.h"
#include "BL_DeformableGameObject.h"
+#include "KX_ObstacleSimulation.h"
#ifdef USE_BULLET
#include "KX_SoftBodyDeformer.h"
@@ -214,6 +215,19 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_bucketmanager=new RAS_BucketManager();
+ bool showObstacleSimulation = scene->gm.flag & GAME_SHOW_OBSTACLE_SIMULATION;
+ switch (scene->gm.obstacleSimulation)
+ {
+ case OBSTSIMULATION_TOI_rays:
+ m_obstacleSimulation = new KX_ObstacleSimulationTOI_rays((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation);
+ break;
+ case OBSTSIMULATION_TOI_cells:
+ m_obstacleSimulation = new KX_ObstacleSimulationTOI_cells((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation);
+ break;
+ default:
+ m_obstacleSimulation = NULL;
+ }
+
#ifdef WITH_PYTHON
m_attr_dict = PyDict_New(); /* new ref */
m_draw_call_pre = NULL;
@@ -236,6 +250,9 @@ KX_Scene::~KX_Scene()
this->RemoveObject(parentobj);
}
+ if (m_obstacleSimulation)
+ delete m_obstacleSimulation;
+
if(m_objectlist)
m_objectlist->Release();
@@ -1545,6 +1562,10 @@ void KX_Scene::LogicEndFrame()
obj->Release();
RemoveObject(obj);
}
+
+ //prepare obstacle simulation for new frame
+ if (m_obstacleSimulation)
+ m_obstacleSimulation->UpdateObstacles();
}
@@ -1916,7 +1937,7 @@ void KX_Scene::Render2DFilters(RAS_ICanvas* canvas)
void KX_Scene::RunDrawingCallbacks(PyObject* cb_list)
{
- int len;
+ Py_ssize_t len;
if (cb_list && (len=PyList_GET_SIZE(cb_list)))
{
@@ -1925,7 +1946,7 @@ void KX_Scene::RunDrawingCallbacks(PyObject* cb_list)
PyObject* ret;
// Iterate the list and run the callbacks
- for (int pos=0; pos < len; pos++)
+ for (Py_ssize_t pos=0; pos < len; pos++)
{
func= PyList_GET_ITEM(cb_list, pos);
ret= PyObject_Call(func, args, NULL);
@@ -1977,6 +1998,8 @@ PyMethodDef KX_Scene::Methods[] = {
KX_PYMETHODTABLE(KX_Scene, replace),
KX_PYMETHODTABLE(KX_Scene, suspend),
KX_PYMETHODTABLE(KX_Scene, resume),
+ KX_PYMETHODTABLE(KX_Scene, drawObstacleSimulation),
+
/* dict style access */
KX_PYMETHODTABLE(KX_Scene, get),
@@ -2301,6 +2324,16 @@ KX_PYMETHODDEF_DOC(KX_Scene, resume,
Py_RETURN_NONE;
}
+KX_PYMETHODDEF_DOC(KX_Scene, drawObstacleSimulation,
+ "drawObstacleSimulation()\n"
+ "Draw debug visualization of obstacle simulation.\n")
+{
+ if (GetObstacleSimulation())
+ GetObstacleSimulation()->DrawObstacles();
+
+ Py_RETURN_NONE;
+}
+
/* Matches python dict.get(key, [default]) */
KX_PYMETHODDEF_DOC(KX_Scene, get, "")
{
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index 499861bce50..5954d5465ba 100644
--- a/source/gameengine/Ketsji/KX_Scene.h
+++ b/source/gameengine/Ketsji/KX_Scene.h
@@ -88,6 +88,7 @@ class SCA_JoystickManager;
class btCollisionShape;
class KX_BlenderSceneConverter;
struct KX_ClientObjectInfo;
+class KX_ObstacleSimulation;
#ifdef WITH_CXX_GUARDEDALLOC
#include "MEM_guardedalloc.h"
@@ -293,6 +294,9 @@ protected:
struct Scene* m_blenderScene;
RAS_2DFilterManager m_filtermanager;
+
+ KX_ObstacleSimulation* m_obstacleSimulation;
+
public:
KX_Scene(class SCA_IInputDevice* keyboarddevice,
class SCA_IInputDevice* mousedevice,
@@ -585,6 +589,8 @@ public:
void Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text);
void Render2DFilters(RAS_ICanvas* canvas);
+ KX_ObstacleSimulation* GetObstacleSimulation() {return m_obstacleSimulation;};
+
#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -597,6 +603,8 @@ public:
KX_PYMETHOD_DOC(KX_Scene, suspend);
KX_PYMETHOD_DOC(KX_Scene, resume);
KX_PYMETHOD_DOC(KX_Scene, get);
+ KX_PYMETHOD_DOC(KX_Scene, drawObstacleSimulation);
+
/* attributes */
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp
index 6c7b515c095..f24243fcdfc 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp
@@ -108,7 +108,15 @@ void KX_SoundActuator::play()
break;
}
- m_handle = AUD_getDevice()->play(sound, 0);
+ try
+ {
+ m_handle = AUD_getDevice()->play(sound, 0);
+ }
+ catch(AUD_Exception&)
+ {
+ // cannot play back, ignore
+ return;
+ }
AUD_Reference<AUD_I3DHandle> handle3d = AUD_Reference<AUD_I3DHandle>(m_handle);
diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp
new file mode 100644
index 00000000000..a0a2e148c1e
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp
@@ -0,0 +1,630 @@
+/**
+* Add steering behaviors
+*
+* $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) 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_math.h"
+#include "KX_SteeringActuator.h"
+#include "KX_GameObject.h"
+#include "KX_NavMeshObject.h"
+#include "KX_ObstacleSimulation.h"
+#include "KX_PythonInit.h"
+#include "KX_PyMath.h"
+#include "Recast.h"
+
+/* ------------------------------------------------------------------------- */
+/* Native functions */
+/* ------------------------------------------------------------------------- */
+
+KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj,
+ int mode,
+ KX_GameObject *target,
+ KX_GameObject *navmesh,
+ float distance,
+ float velocity,
+ float acceleration,
+ float turnspeed,
+ bool isSelfTerminated,
+ int pathUpdatePeriod,
+ KX_ObstacleSimulation* simulation,
+ short facingmode,
+ bool normalup,
+ bool enableVisualization) :
+ SCA_IActuator(gameobj, KX_ACT_STEERING),
+ m_mode(mode),
+ m_target(target),
+ m_distance(distance),
+ m_velocity(velocity),
+ m_acceleration(acceleration),
+ m_turnspeed(turnspeed),
+ m_isSelfTerminated(isSelfTerminated),
+ m_pathUpdatePeriod(pathUpdatePeriod),
+ m_updateTime(0),
+ m_isActive(false),
+ m_simulation(simulation),
+ m_enableVisualization(enableVisualization),
+ m_facingMode(facingmode),
+ m_normalUp(normalup),
+ m_obstacle(NULL),
+ m_pathLen(0),
+ m_wayPointIdx(-1),
+ m_steerVec(MT_Vector3(0, 0, 0))
+{
+ m_navmesh = static_cast<KX_NavMeshObject*>(navmesh);
+ if (m_navmesh)
+ m_navmesh->RegisterActuator(this);
+ if (m_target)
+ m_target->RegisterActuator(this);
+
+ if (m_simulation)
+ m_obstacle = m_simulation->GetObstacle((KX_GameObject*)gameobj);
+ KX_GameObject* parent = ((KX_GameObject*)gameobj)->GetParent();
+ if (m_facingMode>0 && parent)
+ {
+ m_parentlocalmat = parent->GetSGNode()->GetLocalOrientation();
+ }
+ else
+ m_parentlocalmat.setIdentity();
+}
+
+KX_SteeringActuator::~KX_SteeringActuator()
+{
+ if (m_navmesh)
+ m_navmesh->UnregisterActuator(this);
+ if (m_target)
+ m_target->UnregisterActuator(this);
+}
+
+CValue* KX_SteeringActuator::GetReplica()
+{
+ KX_SteeringActuator* replica = new KX_SteeringActuator(*this);
+ // replication just copy the m_base pointer => common random generator
+ replica->ProcessReplica();
+ return replica;
+}
+
+void KX_SteeringActuator::ProcessReplica()
+{
+ if (m_target)
+ m_target->RegisterActuator(this);
+ if (m_navmesh)
+ m_navmesh->RegisterActuator(this);
+ SCA_IActuator::ProcessReplica();
+}
+
+
+bool KX_SteeringActuator::UnlinkObject(SCA_IObject* clientobj)
+{
+ if (clientobj == m_target)
+ {
+ m_target = NULL;
+ return true;
+ }
+ else if (clientobj == m_navmesh)
+ {
+ m_navmesh = NULL;
+ return true;
+ }
+ return false;
+}
+
+void KX_SteeringActuator::Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map)
+{
+ void **h_obj = (*obj_map)[m_target];
+ if (h_obj) {
+ if (m_target)
+ m_target->UnregisterActuator(this);
+ m_target = (KX_GameObject*)(*h_obj);
+ m_target->RegisterActuator(this);
+ }
+
+ h_obj = (*obj_map)[m_navmesh];
+ if (h_obj) {
+ if (m_navmesh)
+ m_navmesh->UnregisterActuator(this);
+ m_navmesh = (KX_NavMeshObject*)(*h_obj);
+ m_navmesh->RegisterActuator(this);
+ }
+}
+
+bool KX_SteeringActuator::Update(double curtime, bool frame)
+{
+ if (frame)
+ {
+ double delta = curtime - m_updateTime;
+ m_updateTime = curtime;
+
+ if (m_posevent && !m_isActive)
+ {
+ delta = 0;
+ m_pathUpdateTime = -1;
+ m_updateTime = curtime;
+ m_isActive = true;
+ }
+ bool bNegativeEvent = IsNegativeEvent();
+ if (bNegativeEvent)
+ m_isActive = false;
+
+ RemoveAllEvents();
+
+ if (!delta)
+ return true;
+
+ if (bNegativeEvent || !m_target)
+ return false; // do nothing on negative events
+
+ KX_GameObject *obj = (KX_GameObject*) GetParent();
+ const MT_Point3& mypos = obj->NodeGetWorldPosition();
+ const MT_Point3& targpos = m_target->NodeGetWorldPosition();
+ MT_Vector3 vectotarg = targpos - mypos;
+ MT_Vector3 vectotarg2d = vectotarg;
+ vectotarg2d.z() = 0;
+ m_steerVec = MT_Vector3(0, 0, 0);
+ bool apply_steerforce = false;
+ bool terminate = true;
+
+ switch (m_mode) {
+ case KX_STEERING_SEEK:
+ if (vectotarg2d.length2()>m_distance*m_distance)
+ {
+ terminate = false;
+ m_steerVec = vectotarg;
+ m_steerVec.normalize();
+ apply_steerforce = true;
+ }
+ break;
+ case KX_STEERING_FLEE:
+ if (vectotarg2d.length2()<m_distance*m_distance)
+ {
+ terminate = false;
+ m_steerVec = -vectotarg;
+ m_steerVec.normalize();
+ apply_steerforce = true;
+ }
+ break;
+ case KX_STEERING_PATHFOLLOWING:
+ if (m_navmesh && vectotarg.length2()>m_distance*m_distance)
+ {
+ terminate = false;
+
+ static const MT_Scalar WAYPOINT_RADIUS(0.25);
+
+ if (m_pathUpdateTime<0 || (m_pathUpdatePeriod>=0 &&
+ curtime - m_pathUpdateTime>((double)m_pathUpdatePeriod/1000)))
+ {
+ m_pathUpdateTime = curtime;
+ m_pathLen = m_navmesh->FindPath(mypos, targpos, m_path, MAX_PATH_LENGTH);
+ m_wayPointIdx = m_pathLen > 1 ? 1 : -1;
+ }
+
+ if (m_wayPointIdx>0)
+ {
+ MT_Vector3 waypoint(&m_path[3*m_wayPointIdx]);
+ if ((waypoint-mypos).length2()<WAYPOINT_RADIUS*WAYPOINT_RADIUS)
+ {
+ m_wayPointIdx++;
+ if (m_wayPointIdx>=m_pathLen)
+ {
+ m_wayPointIdx = -1;
+ terminate = true;
+ }
+ else
+ waypoint.setValue(&m_path[3*m_wayPointIdx]);
+ }
+
+ m_steerVec = waypoint - mypos;
+ apply_steerforce = true;
+
+
+ if (m_enableVisualization)
+ {
+ //debug draw
+ static const MT_Vector3 PATH_COLOR(1,0,0);
+ m_navmesh->DrawPath(m_path, m_pathLen, PATH_COLOR);
+ }
+ }
+
+ }
+ break;
+ }
+
+ if (apply_steerforce)
+ {
+ bool isdyna = obj->IsDynamic();
+ if (isdyna)
+ m_steerVec.z() = 0;
+ if (!m_steerVec.fuzzyZero())
+ m_steerVec.normalize();
+ MT_Vector3 newvel = m_velocity*m_steerVec;
+
+ //adjust velocity to avoid obstacles
+ if (m_simulation && m_obstacle /*&& !newvel.fuzzyZero()*/)
+ {
+ if (m_enableVisualization)
+ KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(1.,0.,0.));
+ m_simulation->AdjustObstacleVelocity(m_obstacle, m_mode!=KX_STEERING_PATHFOLLOWING ? m_navmesh : NULL,
+ newvel, m_acceleration*delta, m_turnspeed/180.0f*M_PI*delta);
+ if (m_enableVisualization)
+ KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.));
+ }
+
+ HandleActorFace(newvel);
+ if (isdyna)
+ {
+ //temporary solution: set 2D steering velocity directly to obj
+ //correct way is to apply physical force
+ MT_Vector3 curvel = obj->GetLinearVelocity();
+ newvel.z() = curvel.z();
+ obj->setLinearVelocity(newvel, false);
+ }
+ else
+ {
+ MT_Vector3 movement = delta*newvel;
+ obj->ApplyMovement(movement, false);
+ }
+ }
+ else
+ {
+ if (m_simulation && m_obstacle)
+ {
+ m_obstacle->dvel[0] = 0.f;
+ m_obstacle->dvel[1] = 0.f;
+ }
+
+ }
+
+ if (terminate && m_isSelfTerminated)
+ return false;
+ }
+
+ return true;
+}
+
+const MT_Vector3& KX_SteeringActuator::GetSteeringVec()
+{
+ static MT_Vector3 ZERO_VECTOR(0, 0, 0);
+ if (m_isActive)
+ return m_steerVec;
+ else
+ return ZERO_VECTOR;
+}
+
+inline float vdot2(const float* a, const float* b)
+{
+ return a[0]*b[0] + a[2]*b[2];
+}
+static bool barDistSqPointToTri(const float* p, const float* a, const float* b, const float* c)
+{
+ float v0[3], v1[3], v2[3];
+ vsub(v0, c,a);
+ vsub(v1, b,a);
+ vsub(v2, p,a);
+
+ const float dot00 = vdot2(v0, v0);
+ const float dot01 = vdot2(v0, v1);
+ const float dot02 = vdot2(v0, v2);
+ const float dot11 = vdot2(v1, v1);
+ const float dot12 = vdot2(v1, v2);
+
+ // Compute barycentric coordinates
+ float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
+ float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ float ud = u<0.f ? -u : (u>1.f ? u-1.f : 0.f);
+ float vd = v<0.f ? -v : (v>1.f ? v-1.f : 0.f);
+ return ud*ud+vd*vd ;
+}
+
+inline void flipAxes(float* vec)
+{
+ std::swap(vec[1],vec[2]);
+}
+
+static bool getNavmeshNormal(dtStatNavMesh* navmesh, const MT_Vector3& pos, MT_Vector3& normal)
+{
+ static const float polyPickExt[3] = {2, 4, 2};
+ float spos[3];
+ pos.getValue(spos);
+ flipAxes(spos);
+ dtStatPolyRef sPolyRef = navmesh->findNearestPoly(spos, polyPickExt);
+ if (sPolyRef == 0)
+ return false;
+ const dtStatPoly* p = navmesh->getPoly(sPolyRef-1);
+ const dtStatPolyDetail* pd = navmesh->getPolyDetail(sPolyRef-1);
+
+ float distMin = FLT_MAX;
+ int idxMin = -1;
+ for (int i = 0; i < pd->ntris; ++i)
+ {
+ const unsigned char* t = navmesh->getDetailTri(pd->tbase+i);
+ const float* v[3];
+ for (int j = 0; j < 3; ++j)
+ {
+ if (t[j] < p->nv)
+ v[j] = navmesh->getVertex(p->v[t[j]]);
+ else
+ v[j] = navmesh->getDetailVertex(pd->vbase+(t[j]-p->nv));
+ }
+ float dist = barDistSqPointToTri(spos, v[0], v[1], v[2]);
+ if (dist<distMin)
+ {
+ distMin = dist;
+ idxMin = i;
+ }
+ }
+
+ if (idxMin>=0)
+ {
+ const unsigned char* t = navmesh->getDetailTri(pd->tbase+idxMin);
+ const float* v[3];
+ for (int j = 0; j < 3; ++j)
+ {
+ if (t[j] < p->nv)
+ v[j] = navmesh->getVertex(p->v[t[j]]);
+ else
+ v[j] = navmesh->getDetailVertex(pd->vbase+(t[j]-p->nv));
+ }
+ MT_Vector3 tri[3];
+ for (size_t j=0; j<3; j++)
+ tri[j].setValue(v[j][0],v[j][2],v[j][1]);
+ MT_Vector3 a,b;
+ a = tri[1]-tri[0];
+ b = tri[2]-tri[0];
+ normal = b.cross(a).safe_normalized();
+ return true;
+ }
+
+ return false;
+}
+
+void KX_SteeringActuator::HandleActorFace(MT_Vector3& velocity)
+{
+ if (m_facingMode==0 && (!m_navmesh || !m_normalUp))
+ return;
+ KX_GameObject* curobj = (KX_GameObject*) GetParent();
+ MT_Vector3 dir = m_facingMode==0 ? curobj->NodeGetLocalOrientation().getColumn(1) : velocity;
+ if (dir.fuzzyZero())
+ return;
+ dir.normalize();
+ MT_Vector3 up(0,0,1);
+ MT_Vector3 left;
+ MT_Matrix3x3 mat;
+
+ if (m_navmesh && m_normalUp)
+ {
+ dtStatNavMesh* navmesh = m_navmesh->GetNavMesh();
+ MT_Vector3 normal;
+ MT_Vector3 trpos = m_navmesh->TransformToLocalCoords(curobj->NodeGetWorldPosition());
+ if (getNavmeshNormal(navmesh, trpos, normal))
+ {
+
+ left = (dir.cross(up)).safe_normalized();
+ dir = (-left.cross(normal)).safe_normalized();
+ up = normal;
+ }
+ }
+
+ switch (m_facingMode)
+ {
+ case 1: // TRACK X
+ {
+ left = dir.safe_normalized();
+ dir = -(left.cross(up)).safe_normalized();
+ break;
+ };
+ case 2: // TRACK Y
+ {
+ left = (dir.cross(up)).safe_normalized();
+ break;
+ }
+
+ case 3: // track Z
+ {
+ left = up.safe_normalized();
+ up = dir.safe_normalized();
+ dir = left;
+ left = (dir.cross(up)).safe_normalized();
+ break;
+ }
+
+ case 4: // TRACK -X
+ {
+ left = -dir.safe_normalized();
+ dir = -(left.cross(up)).safe_normalized();
+ break;
+ };
+ case 5: // TRACK -Y
+ {
+ left = (-dir.cross(up)).safe_normalized();
+ dir = -dir;
+ break;
+ }
+ case 6: // track -Z
+ {
+ left = up.safe_normalized();
+ up = -dir.safe_normalized();
+ dir = left;
+ left = (dir.cross(up)).safe_normalized();
+ break;
+ }
+ }
+
+ mat.setValue (
+ left[0], dir[0],up[0],
+ left[1], dir[1],up[1],
+ left[2], dir[2],up[2]
+ );
+
+
+
+ KX_GameObject* parentObject = curobj->GetParent();
+ if(parentObject)
+ {
+ MT_Point3 localpos;
+ localpos = curobj->GetSGNode()->GetLocalPosition();
+ MT_Matrix3x3 parentmatinv;
+ parentmatinv = parentObject->NodeGetWorldOrientation ().inverse ();
+ mat = parentmatinv * mat;
+ mat = m_parentlocalmat * mat;
+ curobj->NodeSetLocalOrientation(mat);
+ curobj->NodeSetLocalPosition(localpos);
+ }
+ else
+ {
+ curobj->NodeSetLocalOrientation(mat);
+ }
+
+}
+
+#ifndef DISABLE_PYTHON
+
+/* ------------------------------------------------------------------------- */
+/* Python functions */
+/* ------------------------------------------------------------------------- */
+
+/* Integration hooks ------------------------------------------------------- */
+PyTypeObject KX_SteeringActuator::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "KX_SteeringActuator",
+ 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,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyMethodDef KX_SteeringActuator::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef KX_SteeringActuator::Attributes[] = {
+ KX_PYATTRIBUTE_INT_RW("behaviour", KX_STEERING_NODEF+1, KX_STEERING_MAX-1, true, KX_SteeringActuator, m_mode),
+ KX_PYATTRIBUTE_RW_FUNCTION("target", KX_SteeringActuator, pyattr_get_target, pyattr_set_target),
+ KX_PYATTRIBUTE_RW_FUNCTION("navmesh", KX_SteeringActuator, pyattr_get_navmesh, pyattr_set_navmesh),
+ KX_PYATTRIBUTE_FLOAT_RW("distance", 0.0f, 1000.0f, KX_SteeringActuator, m_distance),
+ KX_PYATTRIBUTE_FLOAT_RW("velocity", 0.0f, 1000.0f, KX_SteeringActuator, m_velocity),
+ KX_PYATTRIBUTE_FLOAT_RW("acceleration", 0.0f, 1000.0f, KX_SteeringActuator, m_acceleration),
+ KX_PYATTRIBUTE_FLOAT_RW("turnspeed", 0.0f, 720.0f, KX_SteeringActuator, m_turnspeed),
+ KX_PYATTRIBUTE_BOOL_RW("selfterminated", KX_SteeringActuator, m_isSelfTerminated),
+ KX_PYATTRIBUTE_BOOL_RW("enableVisualization", KX_SteeringActuator, m_enableVisualization),
+ KX_PYATTRIBUTE_RO_FUNCTION("steeringVec", KX_SteeringActuator, pyattr_get_steeringVec),
+ KX_PYATTRIBUTE_SHORT_RW("facingMode", 0, 6, true, KX_SteeringActuator, m_facingMode),
+ KX_PYATTRIBUTE_INT_RW("pathUpdatePeriod", -1, 100000, true, KX_SteeringActuator, m_pathUpdatePeriod),
+ { NULL } //Sentinel
+};
+
+PyObject* KX_SteeringActuator::pyattr_get_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ if (!actuator->m_target)
+ Py_RETURN_NONE;
+ else
+ return actuator->m_target->GetProxy();
+}
+
+int KX_SteeringActuator::pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ KX_GameObject *gameobj;
+
+ if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_SteeringActuator"))
+ return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
+
+ if (actuator->m_target != NULL)
+ actuator->m_target->UnregisterActuator(actuator);
+
+ actuator->m_target = (KX_GameObject*) gameobj;
+
+ if (actuator->m_target)
+ actuator->m_target->RegisterActuator(actuator);
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* KX_SteeringActuator::pyattr_get_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ if (!actuator->m_navmesh)
+ Py_RETURN_NONE;
+ else
+ return actuator->m_navmesh->GetProxy();
+}
+
+int KX_SteeringActuator::pyattr_set_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ KX_GameObject *gameobj;
+
+ if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_SteeringActuator"))
+ return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
+
+ if (!PyObject_TypeCheck(value, &KX_NavMeshObject::Type))
+ {
+ PyErr_Format(PyExc_TypeError, "KX_NavMeshObject is expected");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ if (actuator->m_navmesh != NULL)
+ actuator->m_navmesh->UnregisterActuator(actuator);
+
+ actuator->m_navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+
+ if (actuator->m_navmesh)
+ actuator->m_navmesh->RegisterActuator(actuator);
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* KX_SteeringActuator::pyattr_get_steeringVec(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ const MT_Vector3& steeringVec = actuator->GetSteeringVec();
+ return PyObjectFrom(steeringVec);
+}
+
+#endif // DISABLE_PYTHON
+
+/* eof */
+
diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h
new file mode 100644
index 00000000000..4f8303107f7
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_SteeringActuator.h
@@ -0,0 +1,130 @@
+/**
+* Add steering behaviors
+*
+*
+* $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) 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 __KX_STEERINGACTUATOR
+#define __KX_STEERINGACTUATOR
+
+#include "SCA_IActuator.h"
+#include "SCA_LogicManager.h"
+#include "MT_Matrix3x3.h"
+
+class KX_GameObject;
+class KX_NavMeshObject;
+struct KX_Obstacle;
+class KX_ObstacleSimulation;
+const int MAX_PATH_LENGTH = 128;
+
+class KX_SteeringActuator : public SCA_IActuator
+{
+ Py_Header;
+
+ /** Target object */
+ KX_GameObject *m_target;
+ KX_NavMeshObject *m_navmesh;
+ int m_mode;
+ float m_distance;
+ float m_velocity;
+ float m_acceleration;
+ float m_turnspeed;
+ KX_ObstacleSimulation* m_simulation;
+
+ KX_Obstacle* m_obstacle;
+ double m_updateTime;
+ bool m_isActive;
+ bool m_isSelfTerminated;
+ bool m_enableVisualization;
+ short m_facingMode;
+ bool m_normalUp;
+ float m_path[MAX_PATH_LENGTH*3];
+ int m_pathLen;
+ int m_pathUpdatePeriod;
+ double m_pathUpdateTime;
+ int m_wayPointIdx;
+ MT_Matrix3x3 m_parentlocalmat;
+ MT_Vector3 m_steerVec;
+ void HandleActorFace(MT_Vector3& velocity);
+public:
+ enum KX_STEERINGACT_MODE
+ {
+ KX_STEERING_NODEF = 0,
+ KX_STEERING_SEEK,
+ KX_STEERING_FLEE,
+ KX_STEERING_PATHFOLLOWING,
+ KX_STEERING_MAX
+ };
+
+ KX_SteeringActuator(class SCA_IObject* gameobj,
+ int mode,
+ KX_GameObject *target,
+ KX_GameObject *navmesh,
+ float distance,
+ float velocity,
+ float acceleration,
+ float turnspeed,
+ bool isSelfTerminated,
+ int pathUpdatePeriod,
+ KX_ObstacleSimulation* simulation,
+ short facingmode,
+ bool normalup,
+ bool enableVisualization);
+ virtual ~KX_SteeringActuator();
+ virtual bool Update(double curtime, bool frame);
+
+ virtual CValue* GetReplica();
+ virtual void ProcessReplica();
+ virtual void Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map);
+ virtual bool UnlinkObject(SCA_IObject* clientobj);
+ const MT_Vector3& GetSteeringVec();
+
+#ifndef DISABLE_PYTHON
+
+ /* --------------------------------------------------------------------- */
+ /* Python interface ---------------------------------------------------- */
+ /* --------------------------------------------------------------------- */
+
+ /* These are used to get and set m_target */
+ static PyObject* pyattr_get_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static PyObject* pyattr_get_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static PyObject* pyattr_get_steeringVec(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
+
+
+#endif // DISABLE_PYTHON
+
+}; /* end of class KX_SteeringActuator : public SCA_PropertyActuator */
+
+#endif
+
diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript
index c5509dd7de8..7c9785c24e7 100644
--- a/source/gameengine/Ketsji/SConscript
+++ b/source/gameengine/Ketsji/SConscript
@@ -20,6 +20,8 @@ incs += ' #source/gameengine/GameLogic #source/gameengine/Expressions #source/ga
incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common'
incs += ' #source/gameengine/Physics/Dummy'
incs += ' #source/blender/misc #source/blender/blenloader #extern/glew/include #source/blender/gpu'
+incs += ' #extern/recastnavigation/Recast/Include #extern/recastnavigation/Detour/Include'
+incs += ' #source/blender/editors/include'
incs += ' ' + env['BF_BULLET_INC']
incs += ' ' + env['BF_OPENGL_INC']
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index c46ebf742a0..877a7219a1c 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -393,7 +393,9 @@ public:
virtual void SetPolygonOffset(float mult, float add) = 0;
virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)=0;
- virtual void FlushDebugLines()=0;
+ virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector)=0;
+ virtual void FlushDebugShapes()=0;
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 50d034a5a5a..6ad9e591474 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -55,6 +55,10 @@
#include "BKE_DerivedMesh.h"
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
/**
* 32x32 bit masks for vinterlace stereo mode
*/
@@ -354,9 +358,9 @@ void RAS_OpenGLRasterizer::ClearCachingInfo(void)
m_materialCachingInfo = 0;
}
-void RAS_OpenGLRasterizer::FlushDebugLines()
+void RAS_OpenGLRasterizer::FlushDebugShapes()
{
- if(!m_debugLines.size())
+ if(!m_debugShapes.size())
return;
// DrawDebugLines
@@ -368,29 +372,67 @@ void RAS_OpenGLRasterizer::FlushDebugLines()
if(light) glDisable(GL_LIGHTING);
if(tex) glDisable(GL_TEXTURE_2D);
+ //draw lines
glBegin(GL_LINES);
- for (unsigned int i=0;i<m_debugLines.size();i++)
+ for (unsigned int i=0;i<m_debugShapes.size();i++)
{
- glColor4f(m_debugLines[i].m_color[0],m_debugLines[i].m_color[1],m_debugLines[i].m_color[2],1.f);
- const MT_Scalar* fromPtr = &m_debugLines[i].m_from.x();
- const MT_Scalar* toPtr= &m_debugLines[i].m_to.x();
-
+ if (m_debugShapes[i].m_type != OglDebugShape::LINE)
+ continue;
+ glColor4f(m_debugShapes[i].m_color[0],m_debugShapes[i].m_color[1],m_debugShapes[i].m_color[2],1.f);
+ const MT_Scalar* fromPtr = &m_debugShapes[i].m_pos.x();
+ const MT_Scalar* toPtr= &m_debugShapes[i].m_param.x();
glVertex3dv(fromPtr);
glVertex3dv(toPtr);
}
glEnd();
+ //draw circles
+ for (unsigned int i=0;i<m_debugShapes.size();i++)
+ {
+ if (m_debugShapes[i].m_type != OglDebugShape::CIRCLE)
+ continue;
+ glBegin(GL_LINE_LOOP);
+ glColor4f(m_debugShapes[i].m_color[0],m_debugShapes[i].m_color[1],m_debugShapes[i].m_color[2],1.f);
+
+ static const MT_Vector3 worldUp(0.,0.,1.);
+ MT_Vector3 norm = m_debugShapes[i].m_param;
+ MT_Matrix3x3 tr;
+ if (norm.fuzzyZero() || norm == worldUp)
+ {
+ tr.setIdentity();
+ }
+ else
+ {
+ MT_Vector3 xaxis, yaxis;
+ xaxis = MT_cross(norm, worldUp);
+ yaxis = MT_cross(xaxis, norm);
+ tr.setValue(xaxis.x(), xaxis.y(), xaxis.z(),
+ yaxis.x(), yaxis.y(), yaxis.z(),
+ norm.x(), norm.y(), norm.z());
+ }
+ MT_Scalar rad = m_debugShapes[i].m_param2.x();
+ int n = (int) m_debugShapes[i].m_param2.y();
+ for (int j = 0; j<n; j++)
+ {
+ MT_Scalar theta = j*M_PI*2/n;
+ MT_Vector3 pos(cos(theta)*rad, sin(theta)*rad, 0.);
+ pos = pos*tr;
+ pos += m_debugShapes[i].m_pos;
+ const MT_Scalar* posPtr = &pos.x();
+ glVertex3dv(posPtr);
+ }
+ glEnd();
+ }
+
if(light) glEnable(GL_LIGHTING);
if(tex) glEnable(GL_TEXTURE_2D);
- m_debugLines.clear();
+ m_debugShapes.clear();
}
void RAS_OpenGLRasterizer::EndFrame()
{
-
-
- FlushDebugLines();
+ FlushDebugShapes();
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
index 61568df91eb..c0e02f6df77 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
@@ -49,10 +49,15 @@ using namespace std;
#define RAS_MAX_TEXCO 8 // match in BL_Material
#define RAS_MAX_ATTRIB 16 // match in BL_BlenderShader
-struct OglDebugLine
+struct OglDebugShape
{
- MT_Vector3 m_from;
- MT_Vector3 m_to;
+ enum SHAPE_TYPE{
+ LINE, CIRCLE
+ };
+ SHAPE_TYPE m_type;
+ MT_Vector3 m_pos;
+ MT_Vector3 m_param;
+ MT_Vector3 m_param2;
MT_Vector3 m_color;
};
@@ -256,18 +261,32 @@ public:
virtual void SetPolygonOffset(float mult, float add);
- virtual void FlushDebugLines();
+ virtual void FlushDebugShapes();
- virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
+ virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
{
- OglDebugLine line;
- line.m_from = from;
- line.m_to = to;
+ OglDebugShape line;
+ line.m_type = OglDebugShape::LINE;
+ line.m_pos= from;
+ line.m_param = to;
line.m_color = color;
- m_debugLines.push_back(line);
+ m_debugShapes.push_back(line);
+ }
+
+ virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector)
+ {
+ OglDebugShape line;
+ line.m_type = OglDebugShape::CIRCLE;
+ line.m_pos= center;
+ line.m_param = normal;
+ line.m_color = color;
+ line.m_param2.x() = radius;
+ line.m_param2.y() = (float) nsector;
+ m_debugShapes.push_back(line);
}
- std::vector <OglDebugLine> m_debugLines;
+ std::vector <OglDebugShape> m_debugShapes;
virtual void SetTexCoordNum(int num);
virtual void SetAttribNum(int num);
diff --git a/source/gameengine/VideoTexture/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt
index 04683a5f99b..448fb307d2d 100644
--- a/source/gameengine/VideoTexture/CMakeLists.txt
+++ b/source/gameengine/VideoTexture/CMakeLists.txt
@@ -95,7 +95,6 @@ if(WITH_CODEC_FFMPEG)
${PTHREADS_INCLUDE_DIRS}
)
add_definitions(-DWITH_FFMPEG)
- add_definitions(-D__STDC_CONSTANT_MACROS)
endif()
blender_add_lib(ge_videotex "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/gameengine/VideoTexture/blendVideoTex.cpp b/source/gameengine/VideoTexture/blendVideoTex.cpp
index 2cb3831de52..e7244265fc4 100644
--- a/source/gameengine/VideoTexture/blendVideoTex.cpp
+++ b/source/gameengine/VideoTexture/blendVideoTex.cpp
@@ -112,7 +112,7 @@ static PyMethodDef moduleMethods[] =
{NULL} /* Sentinel */
};
-#if WITH_FFMPEG
+#ifdef WITH_FFMPEG
extern PyTypeObject VideoFFmpegType;
extern PyTypeObject ImageFFmpegType;
#endif
@@ -134,7 +134,7 @@ extern PyTypeObject ImageViewportType;
static void registerAllTypes(void)
{
-#if WITH_FFMPEG
+#ifdef WITH_FFMPEG
pyImageTypes.add(&VideoFFmpegType, "VideoFFmpeg");
pyImageTypes.add(&ImageFFmpegType, "ImageFFmpeg");
#endif