From fd1eb8eca9e20c994b861e59245b67debb36bc81 Mon Sep 17 00:00:00 2001 From: "n.savitchev" Date: Tue, 7 Nov 2023 10:55:56 +0300 Subject: [PATCH] updated from dagor4 repo on 2023/11/07, rev 734cc7c4ec4235531e627319981a91c135d4319f --- DagorEngine.rev.txt | 2 +- dabuild_all.cmd | 2 - .../daScript/include/daScript/das_config.h | 2 + .../daScript/include/daScript/misc/platform.h | 8 +- .../daScript/include/daScript/simulate/cast.h | 2 +- .../include/daScript/simulate/data_walker.h | 4 +- .../include/daScript/simulate/simulate.h | 1 + .../daScript/src/ast/ast_aot_cpp.cpp | 2 - .../builtin/module_builtin_ast_serialize.cpp | 2 +- .../src/builtin/module_builtin_dasbind.cpp | 2 +- .../src/builtin/module_builtin_uriparser.cpp | 2 +- .../daScript/src/hal/performance_time.cpp | 2 +- .../daScript/src/misc/job_que.cpp | 2 +- prog/1stPartyLibs/daScript/src/misc/sysos.cpp | 37 + .../daScript/src/simulate/simulate.cpp | 7 +- .../daScript/utils/daScript/main.cpp | 2 - .../quirrel/quirrel/squirrel/sqast.cpp | 8 +- .../quirrel/quirrel/squirrel/sqast.h | 20 +- .../quirrel/quirrel/squirrel/sqastcodegen.cpp | 8 +- .../quirrel/quirrel/squirrel/sqastparser.cpp | 49 +- .../quirrel/quirrel/squirrel/sqastparser.h | 2 +- .../quirrel/quirrel/squirrel/sqastrender.h | 6 +- .../quirrel/quirrel/squirrel/sqbinaryast.cpp | 14 +- .../quirrel/quirrel/squirrel/sqbinaryast.h | 4 +- .../quirrel/squirrel/sqcompilationcontext.h | 11 +- .../quirrel/quirrel/squirrel/sqfuncproto.h | 2 +- .../squirrel/static_analyser/analyser.cpp | 68 +- .../static_analyzer/compilation_context.cpp | 2 +- .../static_analyzer/quirrel_parser.cpp | 28 +- .../diagnostics/50k_access_member.diag.txt | 10 +- .../diagnostics/50k_access_member.nut | 441 --------- .../diagnostics/50k_access_member.nut.txt | 441 +++++++++ .../diagnostics/space_sep_name.diag.txt | 9 + .../diagnostics/space_sep_name.nut.txt | 11 + .../diagnostics/space_sep_name_space.diag.txt | 7 + .../diagnostics/space_sep_name_space.nut.txt | 8 + .../quirrel/testData/static_analyser/w190.nut | 2 +- .../testData/static_analyser/w255.diag.txt | 2 +- .../quirrel/testData/static_analyser/w255.nut | 10 +- .../testData/static_analyser/w255_2.diag.txt | 2 +- .../testData/static_analyser/w255_2.nut | 10 +- .../testData/static_analyser/w263.diag.txt | 24 +- .../testData/static_analyser/w267.diag.txt | 10 +- prog/1stPartyLibs/vecmath/dag_vecMath_trig.h | 2 +- prog/_jBuild/defaults.jam | 10 - prog/_jBuild/iOS/clang-link.jam | 46 +- prog/_jBuild/jBuild.jam | 35 - prog/_jBuild/msbuild/Gaijin.Utilities.dll | Bin 18944 -> 0 bytes .../msbuild/Gaijin.Utilities/.gitignore | 5 - .../Gaijin.Utilities/Gaijin.Utilities.sln | 25 - .../Gaijin.Utilities/src/CreateCppItems.cs | 128 --- .../Gaijin.Utilities/src/CreateLayout.cs | 49 - .../src/CreateShallowLayout.cs | 116 --- .../msbuild/Gaijin.Utilities/src/Exec.cs | 126 --- .../src/ExecShaderCompiler.cs | 30 - .../src/Gaijin.Utilities.csproj | 28 - .../src/GetCompileCmdOfSelectedFiles.cs | 135 --- .../Gaijin.Utilities/src/NativeMethods.cs | 87 -- .../msbuild/Gaijin.Utilities/src/RemoveDir.cs | 19 - .../src/UpdateExplicitCppSources.cs | 109 --- prog/_jBuild/msbuild/UI/bat.xml | 19 - .../msbuild/UI/debugger_remote_windows.xml | 65 -- prog/_jBuild/msbuild/UI/gaijin_items.xml | 39 - prog/_jBuild/msbuild/UI/general.xml | 89 -- prog/_jBuild/msbuild/UI/generaltrue.xml | 92 -- prog/_jBuild/msbuild/UI/isense.xml | 22 - prog/_jBuild/msbuild/UI/linux.xml | 181 ---- prog/_jBuild/msbuild/UI/natvis.xml | 8 - prog/_jBuild/msbuild/UI/shader.xml | 16 - prog/_jBuild/msbuild/UI/shader_compiler.xml | 14 - .../msbuild/UI/shader_compiler_item.xml | 15 - prog/_jBuild/msbuild/UI/tools_general.xml | 43 - prog/_jBuild/msbuild/after_user_import.props | 9 - prog/_jBuild/msbuild/android.targets | 20 - prog/_jBuild/msbuild/bat.targets | 24 - prog/_jBuild/msbuild/common.targets | 348 ------- prog/_jBuild/msbuild/config.daNetGames.props | 61 -- prog/_jBuild/msbuild/config.eden.props | 20 - .../msbuild/config.internal.daNetGames.props | 50 - .../msbuild/config.internal.eden.props | 18 - prog/_jBuild/msbuild/config.internal.props | 76 -- .../msbuild/config.internal.sample.props | 18 - .../msbuild/config.internal.skyquake.props | 50 - .../msbuild/config.internal.tool.props | 16 - prog/_jBuild/msbuild/config.props | 40 - prog/_jBuild/msbuild/config.sample.props | 20 - prog/_jBuild/msbuild/config.skyquake.props | 61 -- prog/_jBuild/msbuild/config.tool.props | 16 - prog/_jBuild/msbuild/daEditor.args.json | 42 - prog/_jBuild/msbuild/daEditor.vcxproj | 110 --- prog/_jBuild/msbuild/daViewer.vcxproj | 109 --- prog/_jBuild/msbuild/default.props | 211 ----- prog/_jBuild/msbuild/deploy.daNetGames.props | 86 -- prog/_jBuild/msbuild/deploy.skyquake.props | 93 -- prog/_jBuild/msbuild/fixDependencies.vcxproj | 80 -- prog/_jBuild/msbuild/isense/android.h | 17 - prog/_jBuild/msbuild/isense/android.json | 471 ---------- prog/_jBuild/msbuild/isense/clang.h | 2 - prog/_jBuild/msbuild/isense/clang.json | 20 - prog/_jBuild/msbuild/isense/gdk.h | 28 - prog/_jBuild/msbuild/isense/gdk.json | 858 ------------------ prog/_jBuild/msbuild/isense/readme | 18 - prog/_jBuild/msbuild/isense/win64.h | 33 - prog/_jBuild/msbuild/isense/win64.json | 795 ---------------- .../isense/workaround/math/dag_mathBase.h | 7 - prog/_jBuild/msbuild/linux64.targets | 99 -- prog/_jBuild/msbuild/natvis.vcxproj | 65 -- prog/_jBuild/msbuild/pc.targets | 20 - .../msbuild/projectConfigurations.props | 223 ----- .../msbuild/projects/enlisted_ded.args.json | 199 ---- .../msbuild/projects/enlisted_ded.vcxproj | 60 -- .../msbuild/projects/skyquake_vrt.args.json | 518 ----------- .../msbuild/projects/skyquake_vrt.vcxproj | 61 -- .../msbuild/projects/skyquake_wtm.args.json | 737 --------------- .../msbuild/projects/skyquake_wtm.vcxproj | 26 - .../projects/skyquake_wtm.vcxproj.filters | 29 - prog/_jBuild/msbuild/ps.targets | 18 - prog/_jBuild/msbuild/shaders/commands.json | 14 - prog/_jBuild/msbuild/shaders/shaders.vcxproj | 194 ---- .../msbuild/shaders/shaders.vcxproj.filters | 430 --------- prog/_jBuild/win32/clang-cpp.jam | 3 - prog/_jBuild/win32/clang-sets.jam | 1 - prog/_jBuild/win32/vc10-cpp.jam | 3 - prog/_jBuild/win32/vc10-link.jam | 3 - prog/_jBuild/win32/vc10-sets.jam | 1 - prog/_jBuild/win32/vc10u-cpp.jam | 3 - prog/_jBuild/win32/vc10u-link.jam | 2 - prog/_jBuild/win32/vc10u-sets.jam | 1 - prog/_jBuild/win32/vc11-cpp.jam | 3 - prog/_jBuild/win32/vc11-link.jam | 3 - prog/_jBuild/win32/vc11-sets.jam | 1 - prog/_jBuild/win32/vc11u-cpp.jam | 3 - prog/_jBuild/win32/vc11u-link.jam | 2 - prog/_jBuild/win32/vc11u-sets.jam | 1 - prog/_jBuild/win32/vc12-cpp.jam | 3 - prog/_jBuild/win32/vc12-link.jam | 3 - prog/_jBuild/win32/vc12-sets.jam | 1 - prog/_jBuild/win32/vc12u-cpp.jam | 3 - prog/_jBuild/win32/vc12u-link.jam | 2 - prog/_jBuild/win32/vc12u-sets.jam | 1 - prog/_jBuild/win32/vc14-cpp.jam | 3 - prog/_jBuild/win32/vc14-link.jam | 3 - prog/_jBuild/win32/vc14-sets.jam | 1 - prog/_jBuild/win32/vc15-cpp.jam | 3 - prog/_jBuild/win32/vc15-link.jam | 3 - prog/_jBuild/win32/vc15-sets.jam | 1 - prog/_jBuild/win32/vc16-sets.jam | 1 - prog/_jBuild/win32/vc17-sets.jam | 1 - prog/_jBuild/win64/clang-cpp.jam | 3 - prog/_jBuild/win64/clang-sets.jam | 1 - prog/_jBuild/win64/vc10-cpp.jam | 3 - prog/_jBuild/win64/vc10-link.jam | 3 - prog/_jBuild/win64/vc10-sets.jam | 1 - prog/_jBuild/win64/vc10u-cpp.jam | 2 - prog/_jBuild/win64/vc10u-link.jam | 3 - prog/_jBuild/win64/vc10u-sets.jam | 1 - prog/_jBuild/win64/vc11-cpp.jam | 3 - prog/_jBuild/win64/vc11-link.jam | 3 - prog/_jBuild/win64/vc11-sets.jam | 1 - prog/_jBuild/win64/vc11u-sets.jam | 1 - prog/_jBuild/win64/vc12-cpp.jam | 3 - prog/_jBuild/win64/vc12-link.jam | 3 - prog/_jBuild/win64/vc12-sets.jam | 1 - prog/_jBuild/win64/vc14-cpp.jam | 3 - prog/_jBuild/win64/vc14-link.jam | 3 - prog/_jBuild/win64/vc14-sets.jam | 1 - prog/_jBuild/win64/vc14u-sets.jam | 1 - prog/_jBuild/win64/vc15-cpp.jam | 3 - prog/_jBuild/win64/vc15-link.jam | 3 - prog/_jBuild/win64/vc15-sets.jam | 1 - prog/_jBuild/win64/vc15u-sets.jam | 1 - prog/_jBuild/win64/vc16-sets.jam | 1 - prog/_jBuild/win64/vc16u-sets.jam | 1 - prog/_jBuild/win64/vc17-sets.jam | 1 - prog/_jBuild/win64/vc17u-sets.jam | 1 - prog/commonFx/commonFxGame/compoundPs.cpp | 4 +- prog/commonFx/commonFxGame/dafxCompound.cpp | 4 +- prog/commonFx/commonFxGame/dafxModfx.cpp | 2 +- prog/commonFx/commonFxGame/dafxSparks.cpp | 2 +- prog/commonFx/commonFxGame/flowPs2.cpp | 4 +- prog/commonFx/commonFxGame/lightFx.cpp | 2 +- .../modfx/modfx_bboard_render.hlsl | 17 +- prog/dagorInclude/3d/dag_drv3d.h | 92 +- prog/dagorInclude/3d/dag_drv3dConsts.h | 63 +- .../dagorInclude/anim/dag_animPostBlendCtrl.h | 1 - prog/dagorInclude/anim/dag_animStateHolder.h | 10 + prog/dagorInclude/fx/dag_baseFxClasses.h | 2 +- prog/dagorInclude/fx/dag_leavesWind.h | 1 - prog/dagorInclude/gui/dag_stdGuiRender.h | 2 + prog/dagorInclude/math/dag_bits.h | 2 - prog/dagorInclude/math/dag_check_nan.h | 8 +- prog/dagorInclude/math/dag_hlsl_floatx.h | 4 - prog/dagorInclude/osApiWrappers/dag_threads.h | 5 + prog/dagorInclude/scene/dag_staticFxObjs.h | 2 +- prog/dagorInclude/shaders/dag_dynSceneRes.h | 4 +- prog/dagorInclude/shaders/dag_rendInstRes.h | 1 + prog/dagorInclude/shaders/dag_shaderMesh.h | 7 +- prog/dagorInclude/shaders/dag_shaderVarType.h | 10 + .../streaming/dag_streamingBase.h | 4 +- prog/engine/_docs/render/build_docs.sh | 6 + .../_docs/render/docs/source/index/d3dAPI.rst | 1 + .../docs/source/index/d3dAPI/RenderPass.rst | 31 + prog/engine/_docs/render/setup.sh | 2 + prog/engine/anim/animStateHolder.cpp | 10 - prog/engine/drv/drv3d_DX12/dx12.cpp | 1 - prog/engine/drv/drv3d_DX12/pipeline.h | 12 +- prog/engine/drv/drv3d_DX12/shader.h | 14 +- .../drv/drv3d_commonCode/dxgi_utils.cpp | 1 + .../genericSbufferImplementation.h | 2 +- prog/engine/drv/drv3d_vulkan/device_context.h | 10 +- .../device_context/base_context.cpp | 32 - .../device_context/execution_context.cpp | 72 +- .../device_context/render_pass.cpp | 86 +- .../engine/drv/drv3d_vulkan/device_resource.h | 1 + .../drv/drv3d_vulkan/execution_sync.cpp | 17 +- prog/engine/drv/drv3d_vulkan/execution_sync.h | 3 + .../drv/drv3d_vulkan/execution_sync_laddr.cpp | 25 +- .../drv/drv3d_vulkan/graphics_state.cpp | 1 + prog/engine/drv/drv3d_vulkan/graphics_state.h | 59 +- .../engine/drv/drv3d_vulkan/graphics_state2.h | 4 +- prog/engine/drv/drv3d_vulkan/render_pass.cpp | 46 +- prog/engine/drv/drv3d_vulkan/render_pass.h | 104 +-- .../drv3d_vulkan/state_field_framebuffer.cpp | 26 +- .../drv/drv3d_vulkan/state_field_graphics.cpp | 30 +- .../drv/drv3d_vulkan/state_field_graphics.h | 6 + .../state_field_resource_binds.cpp | 72 +- prog/engine/drv/drv3d_vulkan/texture.h | 17 +- .../drv/drv3d_vulkan/util/tracked_state.h | 3 + prog/engine/gameRes/collisionGameRes.cpp | 5 + prog/engine/gameRes/gameResSystem.cpp | 2 +- prog/engine/gameRes/stubGameResFactories.cpp | 2 +- prog/engine/guiBase/font.cpp | 13 + prog/engine/guiBase/stdGuiRender.cpp | 9 +- prog/engine/ioSys/zlibInline.h | 3 - prog/engine/ioSys/zlibIo.cpp | 12 - prog/engine/ioSys/zstdIo.cpp | 17 +- prog/engine/lib3d/picMgr.cpp | 6 +- prog/engine/math/mesh.cpp | 2 +- prog/engine/osApiWrappers/cpuJobs.cpp | 2 +- prog/engine/osApiWrappers/threads.cpp | 2 +- prog/engine/phys/physJolt/joltPhysics.cpp | 5 +- prog/engine/scene/staticFxObjs.cpp | 6 +- prog/engine/shaders/dynSceneRes.cpp | 7 +- prog/engine/shaders/matVdataLoad.cpp | 14 +- prog/engine/shaders/rendInstRes.cpp | 13 +- prog/engine/shaders/sh_vars.cpp | 2 +- prog/engine/shaders/shaderMesh.cpp | 63 +- prog/engine/shaders/shaderMeshSimple.cpp | 9 +- .../sharedInclude/shaders/shader_layout.h | 2 +- prog/gameLibs/breakpad/sender/dagorStubs.cpp | 4 - prog/gameLibs/camTrack/camTrack.cpp | 4 +- prog/gameLibs/daSkies2/panoramaCompressor.cpp | 2 +- .../daSkies2/shaders/clouds2/daCloudsApply.sh | 11 +- prog/gameLibs/dasModules/phys/physVars.cpp | 6 + .../dasModules/render/dagorDriver3dConsts.cpp | 1 - prog/gameLibs/ecs/scripts/das/das_ecs.h | 3 +- .../ecs/scripts/das/das_ecs_bindings.cpp | 2 + prog/gameLibs/ecs/scripts/das/das_es.cpp | 7 +- prog/gameLibs/ecs/scripts/das/das_es.h | 2 +- prog/gameLibs/fftWater/flowMap.cpp | 15 +- .../gamePhys/phys/destructableObject.cpp | 3 +- prog/gameLibs/gamePhys/phys/physVars.cpp | 6 - prog/gameLibs/gpuObjects/gpuObjects.cpp | 6 +- prog/gameLibs/hudprim/hudPrimitives.cpp | 2 + prog/gameLibs/landMesh/biomeQuery.cpp | 53 +- prog/gameLibs/landMesh/jamfile | 1 + prog/gameLibs/landMesh/lmeshManager.cpp | 32 +- prog/gameLibs/landMesh/lmeshRenderer.cpp | 12 +- prog/gameLibs/landMesh/virtualtexture.cpp | 25 +- .../publicInclude/camTrack/camTrack.h | 2 +- .../gameLibs/publicInclude/dasModules/aotDm.h | 2 + .../publicInclude/dasModules/aotEcs.h | 1 + .../publicInclude/dasModules/aotPhysVars.h | 7 + .../publicInclude/fftWater/fftWater.h | 2 + .../publicInclude/gamePhys/phys/physVars.h | 7 + .../publicInclude/landMesh/biomeQuery.h | 2 + .../publicInclude/landMesh/lmeshManager.h | 4 +- .../publicInclude/landMesh/lmeshRenderer.h | 1 + .../publicInclude/landMesh/virtualtexture.h | 3 +- .../quirrel/sqDebugConfig/sqDebugConfig.h | 10 + .../rendInst/rendInstCollision.h | 3 + .../rendInst/rendInstGenRender.h | 2 +- .../publicInclude/render/bcCompressor.h | 1 + .../render/daBfg/detail/access.h | 2 +- .../publicInclude/render/daBfg/stage.h | 2 +- .../publicInclude/render/daBfg/usage.h | 2 +- .../publicInclude/render/dstReadbackLights.h | 4 +- .../render/fluidDynamics/solver.h | 12 +- .../render/fluidDynamics/voxelizeDepthAbove.h | 25 + prog/gameLibs/publicInclude/render/gpuGrass.h | 5 +- .../render/toroidalStaticShadows.h | 2 + prog/gameLibs/publicInclude/render/tracer.h | 20 +- prog/gameLibs/publicInclude/render/variance.h | 3 +- prog/gameLibs/quirrel/sqDebugConfig/jamfile | 19 + .../sqDebugConfig/sqDebugConfigBind.cpp | 17 + .../rendInst/debug/collisionVisualization.cpp | 12 +- .../debug/drawShadedCollisionsFlags.h | 3 +- prog/gameLibs/rendInst/impostorTextureMgr.cpp | 2 +- .../rendInst/rendInstGenCollision.cpp | 53 +- prog/gameLibs/rendInst/rendInstStubRes.cpp | 2 + prog/gameLibs/rendInst/render/clipShadows.cpp | 2 +- .../gameLibs/rendInst/render/depthShadows.cpp | 2 +- prog/gameLibs/rendInst/render/genRender.cpp | 22 +- prog/gameLibs/rendInst/render/impostor.cpp | 42 +- prog/gameLibs/rendInst/riGen/riGenData.h | 1 + .../rendInst/visibility/genVisibility.cpp | 6 +- .../render/daBfg/api/internalRegistry.h | 8 +- prog/gameLibs/render/daBfg/backend.cpp | 9 +- prog/gameLibs/render/daBfg/backend.h | 2 +- .../daBfg/debug/globalStatesValidation.cpp | 77 ++ .../daBfg/intermediateRepresentation.cpp | 6 +- .../render/daBfg/intermediateRepresentation.h | 18 +- .../render/daBfg/nodes/nodeExecutor.cpp | 66 +- .../render/daBfg/nodes/nodeExecutor.h | 2 +- .../render/daBfg/nodes/nodeStateDeltas.cpp | 12 +- .../render/daBfg/nodes/nodeStateDeltas.h | 4 +- .../render/daBfg/nodes/nodeTracker.cpp | 53 +- .../resourceScheduling/resourceScheduler.cpp | 5 +- prog/gameLibs/render/daBfg/resourceUsage.cpp | 5 +- prog/gameLibs/render/daBfg/resourceUsage.h | 20 +- prog/gameLibs/render/dstReadbackLights.cpp | 3 +- prog/gameLibs/render/fluidDynamics/jamfile | 1 + .../fluidDynamics/shaders/euler_solver.sh | 506 ++++------- .../fluidDynamics/shaders/show_solution.sh | 18 +- .../shaders/voxelize_depth_above.sh | 53 ++ prog/gameLibs/render/fluidDynamics/solver.cpp | 118 +-- .../fluidDynamics/voxelizeDepthAbove.cpp | 25 + prog/gameLibs/render/gpuGrass.cpp | 107 ++- prog/gameLibs/render/grassify.cpp | 56 +- .../lightProbeSpecularCubesContainer.cpp | 2 +- prog/gameLibs/render/shaders/decals/decals.sh | 105 +-- .../shaders/flexible_scale_rasterization.sh | 60 +- prog/gameLibs/render/shaders/flow_map.sh | 1 + .../render/shaders/hardware_defines.sh | 6 + .../render/shaders/hudprim/gui_aces.sh | 21 +- prog/gameLibs/render/shaders/tracer.sh | 47 +- .../render/texcompressors/bcCompressor.cpp | 10 +- prog/gameLibs/render/tireTracks.cpp | 3 +- .../toroidalStaticShadowCascade.cpp | 2 + .../toroidalStaticShadows.cpp | 2 + prog/gameLibs/render/tracer/tracer.cpp | 66 +- prog/gameLibs/render/variance.cpp | 34 +- prog/gameLibs/render/wakePs/shipWakeFx.cpp | 22 +- prog/gameLibs/soundSystem/mixing.cpp | 3 +- prog/gameLibs/webui/httpserver.cpp | 2 +- prog/samples/commonFramework/de3_hmapTex.h | 20 +- .../shaders/compile_shaders_pc11.bat | 2 - .../shaders/compile_shaders_tools.bat | 3 +- prog/scripts/sq/stubs/debug.config | 3 + .../AssetViewer/Entity/entityMatEditor.cpp | 15 + .../Entity/entityMatFileResource.cpp | 8 +- prog/tools/AssetViewer/Textures/textures.cpp | 14 +- prog/tools/AssetViewer/av_appwnd.cpp | 5 - prog/tools/AssetViewer/av_environment.cpp | 6 +- prog/tools/AssetViewer/fxEdit/fxEditor.cpp | 9 +- prog/tools/ShaderCompiler2/assemblyShader.cpp | 18 +- prog/tools/ShaderCompiler2/main.cpp | 19 + prog/tools/ShaderCompiler2/makeShBinDump.cpp | 7 + prog/tools/ShaderCompiler2/shCompiler.cpp | 7 +- prog/tools/ShaderCompiler2/shCompiler.h | 2 +- prog/tools/ShaderCompiler2/shSemCode.cpp | 18 +- prog/tools/ShaderCompiler2/shSemCode.h | 4 +- prog/tools/ShaderCompiler2/shcode.h | 3 +- prog/tools/build_dagor3_cdk_mini.cmd | 2 + prog/tools/dargbox/shaders/shadersList.blk | 1 + .../IEditorCore/implementIEditorCore.h} | 27 +- .../IEditorCore/implementIEditorCoreBase.cpp} | 2 +- .../IEditorCore/implementIEditorCoreExt.cpp} | 16 +- .../libTools/EditorCore/IEditorCore/jamfile | 17 + .../EditorCore/IEditorCore/makeInstance.cpp | 7 + prog/tools/libTools/IEditorCore/jamfile | 18 - prog/tools/libTools/IEditorCoreBase/jamfile | 18 - .../libTools/assetMgrHlp/assetBuildCache.cpp | 18 +- prog/tools/libTools/staticGeom/geomObject.cpp | 2 +- prog/tools/maxplug/expUtil.cpp | 61 +- .../tools/sceneTools/assetExp/assetExport.cpp | 1 + .../assetExp/exporters/apexDestrExp.cpp | 15 +- .../assetExp/exporters/jamfile-model | 5 +- .../assetExp/exporters/modelExp.cpp | 46 + .../assetExp/exporters/modelExpUtil.cpp | 30 +- .../sceneTools/assetExp/exporters/texExp.cpp | 14 - .../HeightmapLand/importLandMesh.cpp | 47 +- .../HeightmapLand/landClassSlotsMgr.cpp | 3 + .../daEditorX/HeightmapLand/landMeshMap.h | 9 - .../daEditorX/binSceneView/strmLevel.cpp | 2 +- prog/tools/sceneTools/daEditorX/dagorEd.cpp | 6 - prog/tools/sceneTools/daEditorX/de_appwnd.cpp | 5 +- .../tools/sceneTools/daEditorX/jamfile-editor | 3 +- .../csgEntMgr/csgEntityMgrService.cpp | 4 +- .../daEditorX/services/fxMgr/fxMgrService.cpp | 8 +- .../daEditorX/services/hmapSrv/hmapSrv.cpp | 2 +- .../sharedInclude/EditorCore/ec_IEditorCore.h | 10 +- .../dafxToolsHelper/dafxToolsHelper.h | 1 + .../prog/shaders/compile_shaders_pc11.bat | 2 - .../prog/shaders/compile_shaders_spirv.bat | 2 - .../prog/shaders/compile_shaders_tools.bat | 2 +- .../prog/shaders/shaders_tools11.blk | 1 + samples/skiesSample/prog/test_app.cpp | 57 +- .../prog/shaders/compile_shaders_pc11.bat | 2 - .../prog/shaders/compile_shaders_tools.bat | 2 +- .../testGI/prog/shaders/shaders_tools11.blk | 1 + .../testGI/prog/shaders/shaders_tools_exp.blk | 2 +- 402 files changed, 2869 insertions(+), 10444 deletions(-) delete mode 100644 prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut create mode 100644 prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut.txt create mode 100644 prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.diag.txt create mode 100644 prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.nut.txt create mode 100644 prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.diag.txt create mode 100644 prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.nut.txt delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities.dll delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/.gitignore delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/Gaijin.Utilities.sln delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateCppItems.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateLayout.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateShallowLayout.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/Exec.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/ExecShaderCompiler.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/Gaijin.Utilities.csproj delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/GetCompileCmdOfSelectedFiles.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/NativeMethods.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/RemoveDir.cs delete mode 100644 prog/_jBuild/msbuild/Gaijin.Utilities/src/UpdateExplicitCppSources.cs delete mode 100644 prog/_jBuild/msbuild/UI/bat.xml delete mode 100644 prog/_jBuild/msbuild/UI/debugger_remote_windows.xml delete mode 100644 prog/_jBuild/msbuild/UI/gaijin_items.xml delete mode 100644 prog/_jBuild/msbuild/UI/general.xml delete mode 100644 prog/_jBuild/msbuild/UI/generaltrue.xml delete mode 100644 prog/_jBuild/msbuild/UI/isense.xml delete mode 100644 prog/_jBuild/msbuild/UI/linux.xml delete mode 100644 prog/_jBuild/msbuild/UI/natvis.xml delete mode 100644 prog/_jBuild/msbuild/UI/shader.xml delete mode 100644 prog/_jBuild/msbuild/UI/shader_compiler.xml delete mode 100644 prog/_jBuild/msbuild/UI/shader_compiler_item.xml delete mode 100644 prog/_jBuild/msbuild/UI/tools_general.xml delete mode 100644 prog/_jBuild/msbuild/after_user_import.props delete mode 100644 prog/_jBuild/msbuild/android.targets delete mode 100644 prog/_jBuild/msbuild/bat.targets delete mode 100644 prog/_jBuild/msbuild/common.targets delete mode 100644 prog/_jBuild/msbuild/config.daNetGames.props delete mode 100644 prog/_jBuild/msbuild/config.eden.props delete mode 100644 prog/_jBuild/msbuild/config.internal.daNetGames.props delete mode 100644 prog/_jBuild/msbuild/config.internal.eden.props delete mode 100644 prog/_jBuild/msbuild/config.internal.props delete mode 100644 prog/_jBuild/msbuild/config.internal.sample.props delete mode 100644 prog/_jBuild/msbuild/config.internal.skyquake.props delete mode 100644 prog/_jBuild/msbuild/config.internal.tool.props delete mode 100644 prog/_jBuild/msbuild/config.props delete mode 100644 prog/_jBuild/msbuild/config.sample.props delete mode 100644 prog/_jBuild/msbuild/config.skyquake.props delete mode 100644 prog/_jBuild/msbuild/config.tool.props delete mode 100644 prog/_jBuild/msbuild/daEditor.args.json delete mode 100644 prog/_jBuild/msbuild/daEditor.vcxproj delete mode 100644 prog/_jBuild/msbuild/daViewer.vcxproj delete mode 100644 prog/_jBuild/msbuild/default.props delete mode 100644 prog/_jBuild/msbuild/deploy.daNetGames.props delete mode 100644 prog/_jBuild/msbuild/deploy.skyquake.props delete mode 100644 prog/_jBuild/msbuild/fixDependencies.vcxproj delete mode 100644 prog/_jBuild/msbuild/isense/android.h delete mode 100644 prog/_jBuild/msbuild/isense/android.json delete mode 100644 prog/_jBuild/msbuild/isense/clang.h delete mode 100644 prog/_jBuild/msbuild/isense/clang.json delete mode 100644 prog/_jBuild/msbuild/isense/gdk.h delete mode 100644 prog/_jBuild/msbuild/isense/gdk.json delete mode 100644 prog/_jBuild/msbuild/isense/readme delete mode 100644 prog/_jBuild/msbuild/isense/win64.h delete mode 100644 prog/_jBuild/msbuild/isense/win64.json delete mode 100644 prog/_jBuild/msbuild/isense/workaround/math/dag_mathBase.h delete mode 100644 prog/_jBuild/msbuild/linux64.targets delete mode 100644 prog/_jBuild/msbuild/natvis.vcxproj delete mode 100644 prog/_jBuild/msbuild/pc.targets delete mode 100644 prog/_jBuild/msbuild/projectConfigurations.props delete mode 100644 prog/_jBuild/msbuild/projects/enlisted_ded.args.json delete mode 100644 prog/_jBuild/msbuild/projects/enlisted_ded.vcxproj delete mode 100644 prog/_jBuild/msbuild/projects/skyquake_vrt.args.json delete mode 100644 prog/_jBuild/msbuild/projects/skyquake_vrt.vcxproj delete mode 100644 prog/_jBuild/msbuild/projects/skyquake_wtm.args.json delete mode 100644 prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj delete mode 100644 prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj.filters delete mode 100644 prog/_jBuild/msbuild/ps.targets delete mode 100644 prog/_jBuild/msbuild/shaders/commands.json delete mode 100644 prog/_jBuild/msbuild/shaders/shaders.vcxproj delete mode 100644 prog/_jBuild/msbuild/shaders/shaders.vcxproj.filters create mode 100644 prog/engine/_docs/render/docs/source/index/d3dAPI/RenderPass.rst create mode 100644 prog/gameLibs/publicInclude/quirrel/sqDebugConfig/sqDebugConfig.h create mode 100644 prog/gameLibs/publicInclude/render/fluidDynamics/voxelizeDepthAbove.h create mode 100644 prog/gameLibs/quirrel/sqDebugConfig/jamfile create mode 100644 prog/gameLibs/quirrel/sqDebugConfig/sqDebugConfigBind.cpp create mode 100644 prog/gameLibs/render/fluidDynamics/shaders/voxelize_depth_above.sh create mode 100644 prog/gameLibs/render/fluidDynamics/voxelizeDepthAbove.cpp create mode 100644 prog/scripts/sq/stubs/debug.config rename prog/tools/{sharedInclude/EditorCore/ec_IEditorCoreImpl.h => libTools/EditorCore/IEditorCore/implementIEditorCore.h} (96%) rename prog/tools/libTools/{IEditorCoreBase/ec_IEditorCoreBaseImpl.cpp => EditorCore/IEditorCore/implementIEditorCoreBase.cpp} (99%) rename prog/tools/libTools/{IEditorCore/ec_IEditorCoreImpl.cpp => EditorCore/IEditorCore/implementIEditorCoreExt.cpp} (98%) create mode 100644 prog/tools/libTools/EditorCore/IEditorCore/jamfile create mode 100644 prog/tools/libTools/EditorCore/IEditorCore/makeInstance.cpp delete mode 100644 prog/tools/libTools/IEditorCore/jamfile delete mode 100644 prog/tools/libTools/IEditorCoreBase/jamfile diff --git a/DagorEngine.rev.txt b/DagorEngine.rev.txt index d742b6797..abe0179be 100644 --- a/DagorEngine.rev.txt +++ b/DagorEngine.rev.txt @@ -1 +1 @@ -15cc17d1f9d3b49624a81f7fbaf7aa63f0dc125d +734cc7c4ec4235531e627319981a91c135d4319f diff --git a/dabuild_all.cmd b/dabuild_all.cmd index 181030e2d..eb7d5a083 100644 --- a/dabuild_all.cmd +++ b/dabuild_all.cmd @@ -4,6 +4,4 @@ popd pushd samples\testGI\develop call dabuild.cmd -cd gui -call create_fonts.bat popd diff --git a/prog/1stPartyLibs/daScript/include/daScript/das_config.h b/prog/1stPartyLibs/daScript/include/daScript/das_config.h index e29456722..fbc27ef7a 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/das_config.h +++ b/prog/1stPartyLibs/daScript/include/daScript/das_config.h @@ -95,6 +95,8 @@ using das_safe_set = std::set; #define DAS_BIND_EXTERNAL 1 #elif defined(__linux__) #define DAS_BIND_EXTERNAL 1 + #elif defined __HAIKU__ + #define DAS_BIND_EXTERNAL 1 #else #define DAS_BIND_EXTERNAL 0 #endif diff --git a/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h b/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h index bf57e82e3..a8e26930a 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h +++ b/prog/1stPartyLibs/daScript/include/daScript/misc/platform.h @@ -1,5 +1,9 @@ #pragma once +#ifdef __HAIKU__ +#define _GNU_SOURCE 1 +#endif + #ifdef _MSC_VER #pragma warning(disable:4005) // macro redifinition (in flex file) #pragma warning(disable:4146) // unsigned unary minus @@ -75,7 +79,7 @@ #if _TARGET_PC_MACOSX && __SSE__ #define DAS_EVAL_ABI [[clang::vectorcall]] -#elif (defined(_MSC_VER) || defined(__clang__)) && __SSE__ +#elif (defined(_MSC_VER) || defined(__clang__)) && __SSE__ && !defined __HAIKU__ #define DAS_EVAL_ABI __vectorcall #else #define DAS_EVAL_ABI @@ -313,7 +317,7 @@ inline void das_aligned_free16(void *ptr) { } #if defined(__APPLE__) #include -#elif defined (__linux__) || defined (_EMSCRIPTEN_VER) +#elif defined (__linux__) || defined (_EMSCRIPTEN_VER) || defined __HAIKU__ #include #endif inline size_t das_aligned_memsize(void * ptr){ diff --git a/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h b/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h index 32055fc0f..243fa9db2 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h +++ b/prog/1stPartyLibs/daScript/include/daScript/simulate/cast.h @@ -269,7 +269,7 @@ namespace das static __forceinline vec4f from ( uint64_t x ) { return v_cast_vec4f(v_ldui_half(&x)); } }; -#if defined(__linux__) +#if defined(__linux__) || defined __HAIKU__ template <> struct cast { static __forceinline long long int to ( vec4f x ) { return v_extract_xi64(v_cast_vec4i(x)); } diff --git a/prog/1stPartyLibs/daScript/include/daScript/simulate/data_walker.h b/prog/1stPartyLibs/daScript/include/daScript/simulate/data_walker.h index 792f0df49..c62829dcf 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/simulate/data_walker.h +++ b/prog/1stPartyLibs/daScript/include/daScript/simulate/data_walker.h @@ -16,7 +16,7 @@ namespace das { #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" -#elif defined(__APPLE__) +#elif defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-parameter" #endif @@ -130,7 +130,7 @@ namespace das { #pragma warning(pop) #elif defined(__GNUC__) #pragma GCC diagnostic pop -#elif defined(__APPLE__) +#elif defined(__clang__) #pragma clang diagnostic pop #endif } diff --git a/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h b/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h index 10e40873d..b95a20237 100644 --- a/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h +++ b/prog/1stPartyLibs/daScript/include/daScript/simulate/simulate.h @@ -603,6 +603,7 @@ namespace das vector getAllFiles() const; char * intern ( const char * str ); + char * intern ( const char * str, uint32_t len ); void bpcallback ( const LineInfo & at ); void instrumentFunctionCallback ( SimFunction * sim, bool entering, uint64_t userData ); diff --git a/prog/1stPartyLibs/daScript/src/ast/ast_aot_cpp.cpp b/prog/1stPartyLibs/daScript/src/ast/ast_aot_cpp.cpp index acb374848..a3ace22ab 100644 --- a/prog/1stPartyLibs/daScript/src/ast/ast_aot_cpp.cpp +++ b/prog/1stPartyLibs/daScript/src/ast/ast_aot_cpp.cpp @@ -3721,9 +3721,7 @@ namespace das { ss << "#pragma clang diagnostic ignored \"-Wunused-parameter\"\n"; ss << "#pragma clang diagnostic ignored \"-Wwritable-strings\"\n"; ss << "#pragma clang diagnostic ignored \"-Wunused-variable\"\n"; - ss << "#if defined(__APPLE__)\n"; ss << "#pragma clang diagnostic ignored \"-Wunused-but-set-variable\"\n"; - ss << "#endif\n"; ss << "#pragma clang diagnostic ignored \"-Wunsequenced\"\n"; ss << "#pragma clang diagnostic ignored \"-Wunused-function\"\n"; ss << "#endif\n"; diff --git a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp index 3d9d6bad2..4c59709c9 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp +++ b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_ast_serialize.cpp @@ -2093,4 +2093,4 @@ namespace das { allocateStack(logs); } -} \ No newline at end of file +} diff --git a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_dasbind.cpp b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_dasbind.cpp index fe91ff478..815c83afd 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_dasbind.cpp +++ b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_dasbind.cpp @@ -62,7 +62,7 @@ namespace das { return nullptr; } #endif -#elif defined(__linux__) +#elif defined(__linux__) || defined __HAIKU__ void * openGlGetFunctionAddress ( const char * name ) { auto libName = "libGL.so"; void * libhandle = nullptr; diff --git a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_uriparser.cpp b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_uriparser.cpp index f6b24c355..92c60ee93 100644 --- a/prog/1stPartyLibs/daScript/src/builtin/module_builtin_uriparser.cpp +++ b/prog/1stPartyLibs/daScript/src/builtin/module_builtin_uriparser.cpp @@ -37,7 +37,7 @@ char * das::makeNewGuid( das::Context * context, LineInfoArg * at ) { return res; } -#elif defined(__linux__) && defined(LINUX_UUID) +#elif defined(__linux__) && defined(LINUX_UUID) || defined __HAIKU__ #include diff --git a/prog/1stPartyLibs/daScript/src/hal/performance_time.cpp b/prog/1stPartyLibs/daScript/src/hal/performance_time.cpp index bc5713ad8..6d02f94ce 100644 --- a/prog/1stPartyLibs/daScript/src/hal/performance_time.cpp +++ b/prog/1stPartyLibs/daScript/src/hal/performance_time.cpp @@ -47,7 +47,7 @@ extern "C" int64_t ref_time_delta_to_usec(int64_t ref) return ref * 1000000LL/freq.QuadPart; } -#elif __linux__ || defined(_EMSCRIPTEN_VER) +#elif __linux__ || defined(_EMSCRIPTEN_VER) || defined __HAIKU__ #include diff --git a/prog/1stPartyLibs/daScript/src/misc/job_que.cpp b/prog/1stPartyLibs/daScript/src/misc/job_que.cpp index a22eb88c0..9e39870e1 100644 --- a/prog/1stPartyLibs/daScript/src/misc/job_que.cpp +++ b/prog/1stPartyLibs/daScript/src/misc/job_que.cpp @@ -324,7 +324,7 @@ namespace das { } } -#elif defined(__linux__) +#elif defined(__linux__) || defined __HAIKU__ #include diff --git a/prog/1stPartyLibs/daScript/src/misc/sysos.cpp b/prog/1stPartyLibs/daScript/src/misc/sysos.cpp index 9923312ad..0a74f2ac4 100644 --- a/prog/1stPartyLibs/daScript/src/misc/sysos.cpp +++ b/prog/1stPartyLibs/daScript/src/misc/sysos.cpp @@ -399,6 +399,43 @@ return ""; } } +#elif defined __HAIKU__ + #include + #include + #include + namespace das { + static char executablePath[MAXPATHLEN]; + extern "C" void + initialize_before(image_id ourImage) + { + image_info ii; + get_image_info(ourImage, &ii); + snprintf(executablePath, sizeof(executablePath), "%s", ii.name); + } + void hwSetBreakpointHandler ( void (*) ( int, void * ) ) { } + int hwBreakpointSet ( void *, int, int ) { + return -1; + } + bool hwBreakpointClear ( int ) { + return false; + } + size_t getExecutablePathName(char* pathName, size_t pathNameCapacity) { + return snprintf(pathName, pathNameCapacity, "%s", executablePath); + } + void * loadDynamicLibrary ( const char * lib ) { + return dlopen(lib,RTLD_LAZY); + } + void * getFunctionAddress ( void * lib, const char * name ) { + return lib ? dlsym(lib, name) : nullptr; + } + void * getLibraryHandle ( const char * lib ) { + return dlopen(lib,RTLD_LAZY); + } + string normalizeFileName ( const char * fileName ) { + // TODO: implement + return ""; + } + } #else namespace das { void hwSetBreakpointHandler ( void (*) ( int, void * ) ) { } diff --git a/prog/1stPartyLibs/daScript/src/simulate/simulate.cpp b/prog/1stPartyLibs/daScript/src/simulate/simulate.cpp index 7b9d528a0..ce7607940 100644 --- a/prog/1stPartyLibs/daScript/src/simulate/simulate.cpp +++ b/prog/1stPartyLibs/daScript/src/simulate/simulate.cpp @@ -1195,9 +1195,14 @@ namespace das }); } - char * Context::intern(const char * str) { + char * Context::intern( const char * str ) { if ( !str ) return nullptr; uint32_t len = uint32_t(strlen(str)); + return intern(str, len); + } + + char * Context::intern ( const char * str, uint32_t len ) { + if ( !str || !len ) return nullptr; char * ist = constStringHeap->intern(str,len); if ( !ist ) ist = stringHeap->intern(str,len); return ist ? ist : stringHeap->allocateString(str,len); diff --git a/prog/1stPartyLibs/daScript/utils/daScript/main.cpp b/prog/1stPartyLibs/daScript/utils/daScript/main.cpp index b2f9ff9c4..472213923 100644 --- a/prog/1stPartyLibs/daScript/utils/daScript/main.cpp +++ b/prog/1stPartyLibs/daScript/utils/daScript/main.cpp @@ -132,9 +132,7 @@ bool compile ( const string & fn, const string & cppFn, bool dryRun ) { tw << "#pragma clang diagnostic ignored \"-Wunused-parameter\"\n"; tw << "#pragma clang diagnostic ignored \"-Wwritable-strings\"\n"; tw << "#pragma clang diagnostic ignored \"-Wunused-variable\"\n"; - tw << "#if defined(__APPLE__)\n"; tw << "#pragma clang diagnostic ignored \"-Wunused-but-set-variable\"\n"; - tw << "#endif\n"; tw << "#pragma clang diagnostic ignored \"-Wunsequenced\"\n"; tw << "#pragma clang diagnostic ignored \"-Wunused-function\"\n"; tw << "#endif\n"; diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.cpp b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.cpp index 04129c70b..667a0a9bc 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.cpp +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.cpp @@ -104,7 +104,7 @@ void Node::visitChildren(Visitor *visitor) { static_cast(this)->visitChildren(visitor); return; case TO_DECL_GROUP: static_cast(this)->visitChildren(visitor); return; - case TO_DESTRUCT: + case TO_DESTRUCTURE: static_cast(this)->visitChildren(visitor); return; case TO_FUNCTION: static_cast(this)->visitChildren(visitor); return; @@ -216,7 +216,7 @@ void Node::transformChildren(Transformer *transformer) { static_cast(this)->transformChildren(transformer); return; case TO_DECL_GROUP: static_cast(this)->transformChildren(transformer); return; - case TO_DESTRUCT: + case TO_DESTRUCTURE: static_cast(this)->transformChildren(transformer); return; case TO_FUNCTION: static_cast(this)->transformChildren(transformer); return; @@ -327,12 +327,12 @@ void CallExpr::transformChildren(Transformer *transformer) { } void ArrayExpr::visitChildren(Visitor *visitor) { - for (auto init : initialziers()) + for (auto init : initializers()) init->visit(visitor); } void ArrayExpr::transformChildren(Transformer *transformer) { - for (auto &init : initialziers()) + for (auto &init : initializers()) init = init->transform(transformer)->asExpression(); } diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.h b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.h index 0ff432cb8..2690ff6ca 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.h +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqast.h @@ -85,7 +85,7 @@ DEF_TREE_OP(PARAM), \ DEF_TREE_OP(CONST), \ DEF_TREE_OP(DECL_GROUP), \ - DEF_TREE_OP(DESTRUCT), \ + DEF_TREE_OP(DESTRUCTURE), \ DEF_TREE_OP(FUNCTION), \ DEF_TREE_OP(CONSTRUCTOR), \ DEF_TREE_OP(CLASS), \ @@ -221,7 +221,7 @@ class Id : public Expr { bool isLocal() const { return _outpos == ID_LOCAL; } SQInteger outerPos() const { return _outpos; } - void setAssiagnable(bool v) { _assignable = v; } + void setAssignable(bool v) { _assignable = v; } bool isAssignable() const { return _assignable; } bool isBinding() const { return (isOuter() || isLocal()) && !isAssignable(); } @@ -510,8 +510,8 @@ class ArrayExpr : public Expr { void visitChildren(Visitor *visitor); void transformChildren(Transformer *transformer); - const ArenaVector &initialziers() const { return _inits; } - ArenaVector &initialziers() { return _inits; } + const ArenaVector &initializers() const { return _inits; } + ArenaVector &initializers() { return _inits; } private: ArenaVector _inits; @@ -805,7 +805,7 @@ enum DestructuringType { class DestructuringDecl : public DeclGroup { public: - DestructuringDecl(Arena *arena, enum DestructuringType dt) : DeclGroup(arena, TO_DESTRUCT), _dt_type(dt), _expr(NULL) {} + DestructuringDecl(Arena *arena, enum DestructuringType dt) : DeclGroup(arena, TO_DESTRUCTURE), _dt_type(dt), _expr(NULL) {} void visitChildren(Visitor *visitor); void transformChildren(Transformer *transformer); @@ -815,7 +815,7 @@ class DestructuringDecl : public DeclGroup { setLineEndPos(expr->lineEnd()); setColumnEndPos(expr->columnEnd()); } - Expr *initiExpression() const { return _expr; } + Expr *initExpression() const { return _expr; } void setType(enum DestructuringType t) { _dt_type = t; } enum DestructuringType type() const { return _dt_type; } @@ -1195,7 +1195,7 @@ class Transformer { virtual Node *transformConstDecl(ConstDecl *cnst) { return transformDecl(cnst); } virtual Node *transformEnumDecl(EnumDecl *enm) { return transformDecl(enm); } virtual Node *transformDeclGroup(DeclGroup *grp) { return transformDecl(grp); } - virtual Node *transformDesctructingDecl(DestructuringDecl *destruct) { return transformDecl(destruct); } + virtual Node *transformDestructuringDecl(DestructuringDecl *destruct) { return transformDecl(destruct); } }; template @@ -1294,7 +1294,7 @@ void Node::visit(V *visitor) { visitor->visitConstDecl(static_cast(this)); return; case TO_DECL_GROUP: visitor->visitDeclGroup(static_cast(this)); return; - case TO_DESTRUCT: + case TO_DESTRUCTURE: visitor->visitDestructuringDecl(static_cast(this)); return; case TO_FUNCTION: visitor->visitFunctionDecl(static_cast(this)); return; @@ -1409,8 +1409,8 @@ Node *Node::transform(T *transformer) { return transformer->transformConstDecl(static_cast(this)); case TO_DECL_GROUP: return transformer->transformDeclGroup(static_cast(this)); - case TO_DESTRUCT: - return transformer->transformDesctructingDecl(static_cast(this)); + case TO_DESTRUCTURE: + return transformer->transformDestructuringDecl(static_cast(this)); case TO_FUNCTION: return transformer->transformFunctionDecl(static_cast(this)); case TO_CONSTRUCTOR: diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastcodegen.cpp b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastcodegen.cpp index 593768d51..f4b032a53 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastcodegen.cpp +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastcodegen.cpp @@ -759,7 +759,7 @@ void CodegenVisitor::visitDestructuringDecl(DestructuringDecl *destruct) { _last_pop = -1; } - visitForceGet(destruct->initiExpression()); + visitForceGet(destruct->initExpression()); SQInteger src = _fs->TopTarget(); SQInteger key_pos = _fs->PushTarget(); @@ -1026,7 +1026,7 @@ void CodegenVisitor::visitLiteralExpr(LiteralExpr *lit) { void CodegenVisitor::visitArrayExpr(ArrayExpr *expr) { maybeAddInExprLine(expr); - const auto inits = expr->initialziers(); + const auto inits = expr->initializers(); _fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(), inits.size(), 0, NOT_ARRAY); @@ -1600,7 +1600,7 @@ void CodegenVisitor::visitId(Id *id) { if ((pos = _fs->GetLocalVariable(idObj, assignable)) != -1) { _fs->PushTarget(pos); - id->setAssiagnable(assignable); + id->setAssignable(assignable); } else if ((pos = _fs->GetOuterVariable(idObj, assignable)) != -1) { @@ -1609,7 +1609,7 @@ void CodegenVisitor::visitId(Id *id) { SQInteger stkPos = _fs->PushTarget(); _fs->AddInstruction(_OP_GETOUTER, stkPos, pos); } - id->setAssiagnable(assignable); + id->setAssignable(assignable); } else if (IsConstant(idObj, constant)) { diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.cpp b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.cpp index 90ad1c70e..c6adb7998 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.cpp +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.cpp @@ -150,7 +150,7 @@ Statement* SQParser::parseDirectiveStatement() return d; } -void SQParser::checkBraceIdentationStyle() +void SQParser::checkBraceIndentationStyle() { if (_token == _SC('{') && (_lex._prevflags & TF_PREP_EOL)) reportDiagnostic(DiagnosticsId::DI_EGYPT_BRACES); @@ -707,12 +707,23 @@ void SQParser::checkSuspicciousBraket() { if (_lex._prevtoken != _SC(',')) { if (_lex._prevflags & (TF_PREP_EOL | TF_PREP_SPACE)) { char op[] = { (char)_token, '\0' }; - reportDiagnostic(DiagnosticsId::DI_SUSPICIOUS_BRAKET, op, _token == _SC('(') ? "function call" : "access to member"); + reportDiagnostic(DiagnosticsId::DI_SUSPICIOUS_BRACKET, op, _token == _SC('(') ? "function call" : "access to member"); } } } } +static const char *opname(SQInteger op) { + switch (op) + { + case _SC('.'): return "."; + case TK_NULLGETSTR: return "?."; + case TK_BUILT_IN_GETSTR: return ".$"; + case TK_NULLABLE_BUILT_IN_GETSTR: return "?.$"; + default: return ""; + } +} + Expr* SQParser::PrefixedExpr() { NestingChecker nc(this); @@ -734,8 +745,14 @@ Expr* SQParser::PrefixedExpr() bool isBuintInGet = _token == TK_BUILT_IN_GETSTR || _token == TK_NULLABLE_BUILT_IN_GETSTR; + SQInteger tok = _token; + Lex(); + if ((_lex._prevflags & (TF_PREP_SPACE | TF_PREP_EOL)) != 0) { + reportDiagnostic(DiagnosticsId::DI_SPACE_SEP_FIELD_NAME, opname(tok)); + } + SQInteger l = _lex._currentline, c = _lex._currentcolumn; Expr *receiver = e; Id *id = (Id *)Expect(TK_IDENTIFIER); @@ -1303,7 +1320,7 @@ IfStatement* SQParser::parseIfStatement() Expr *cond = Expression(SQE_IF); Expect(_SC(')')); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); bool wrapped = false; @@ -1316,7 +1333,7 @@ IfStatement* SQParser::parseIfStatement() if (_token != _SC('{') && prevTok != TK_ELSE && wrapped && l != el && c != ec) { _ctx.reportDiagnostic(DiagnosticsId::DI_SUSPICIOUS_FMT, el, ec, ew); } - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); elseB = IfLikeBlock(wrapped); if (!IsEndOfStatement()) { reportDiagnostic(DiagnosticsId::DI_STMT_SAME_LINE, "else"); @@ -1350,7 +1367,7 @@ WhileStatement* SQParser::parseWhileStatement() Expect(_SC(')')); bool wrapped = false; - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Statement *body = IfLikeBlock(wrapped); if (!IsEndOfStatement()) { @@ -1375,7 +1392,7 @@ DoWhileStatement* SQParser::parseDoWhileStatement() Consume(TK_DO); // DO bool wrapped = false; - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Statement *body = IfLikeBlock(wrapped); Expect(TK_WHILE); @@ -1517,7 +1534,7 @@ ForStatement* SQParser::parseForStatement() Expect(_SC(')')); bool wrapped = false; - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Statement *body = IfLikeBlock(wrapped); if (!IsEndOfStatement()) { @@ -1569,7 +1586,7 @@ ForeachStatement* SQParser::parseForEachStatement() Expect(_SC(')')); bool wrapped = false; - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Statement *body = IfLikeBlock(wrapped); if (!IsEndOfStatement()) { @@ -1600,7 +1617,7 @@ SwitchStatement* SQParser::parseSwitchStatement() Expr *switchExpr = Expression(SQE_SWITCH); Expect(_SC(')')); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Expect(_SC('{')); SwitchStatement *switchStmt = newNode(arena(), switchExpr); @@ -1611,7 +1628,7 @@ SwitchStatement* SQParser::parseSwitchStatement() Expr *cond = Expression(SQE_RVALUE); Expect(_SC(':')); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Statement *caseBody = parseStatements(); switchStmt->addCases(cond, caseBody); } @@ -1620,7 +1637,7 @@ SwitchStatement* SQParser::parseSwitchStatement() Consume(TK_DEFAULT); Expect(_SC(':')); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); switchStmt->addDefault(parseStatements()); } @@ -1701,7 +1718,7 @@ EnumDecl* SQParser::parseEnumStatement(bool global) EnumDecl *decl = newNode(arena(), id->id(), global); //-V522 - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Expect(_SC('{')); SQInteger nval = 0; @@ -1740,7 +1757,7 @@ TryStatement* SQParser::parseTryCatchStatement() Consume(TK_TRY); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Statement *t = parseStatement(); Expect(TK_CATCH); @@ -1749,7 +1766,7 @@ TryStatement* SQParser::parseTryCatchStatement() Id *exid = (Id *)Expect(TK_IDENTIFIER); Expect(_SC(')')); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Statement *cth = parseStatement(); return setCoordinates(newNode(t, exid, cth), l, c); @@ -1802,7 +1819,7 @@ ClassDecl* SQParser::ClassExp(Expr *key) baseExpr = Expression(SQE_RVALUE); Expect(_SC(')')); } - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Expect(_SC('{')); ClassDecl *d = newNode(arena(), key, baseExpr); ParseTableOrClass(d, _SC(';'),_SC('}')); @@ -1902,7 +1919,7 @@ FunctionDecl* SQParser::CreateFunction(Id *name, bool lambda, bool ctor) else { if (_token != '{') reportDiagnostic(DiagnosticsId::DI_EXPECTED_TOKEN, "{"); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); body = (Block *)parseStatement(false); } SQInteger line2 = _lex._prevtoken == _SC('\n') ? _lex._lasttokenline : _lex._currentline; diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.h b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.h index 8ecd8d03a..fe2bc2d08 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.h +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastparser.h @@ -84,7 +84,7 @@ class SQParser bool ProcessPosDirective(); void Lex(); - void checkBraceIdentationStyle(); + void checkBraceIndentationStyle(); void Consume(SQInteger tok) { assert(tok == _token); diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastrender.h b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastrender.h index ee3fd8c66..67238020f 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastrender.h +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqastrender.h @@ -179,9 +179,9 @@ class RenderVisitor : public Visitor { virtual void visitArrayExpr(ArrayExpr *expr) { _out->writeChar('['); - for (SQUnsignedInteger i = 0; i < expr->initialziers().size(); ++i) { + for (SQUnsignedInteger i = 0; i < expr->initializers().size(); ++i) { if (i) _out->writeString(", "); - expr->initialziers()[i]->visit(this); + expr->initializers()[i]->visit(this); } _out->writeChar(']'); } @@ -465,7 +465,7 @@ class RenderVisitor : public Visitor { destruct->declarations()[i]->visit(this); } _out->writeString(" } = "); - destruct->initiExpression()->visit(this); + destruct->initExpression()->visit(this); } }; diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.cpp b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.cpp index b9c796de1..8d2720ff6 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.cpp +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.cpp @@ -232,7 +232,7 @@ void SQASTWritingVisitor::visitDeclExpr(DeclExpr *expr) { void SQASTWritingVisitor::visitArrayExpr(ArrayExpr *expr) { writeNodeHeader(expr); - writeExprVector(expr->initialziers()); + writeExprVector(expr->initializers()); } void SQASTWritingVisitor::visitLiteralExpr(LiteralExpr *lit) { @@ -320,7 +320,7 @@ void SQASTWritingVisitor::visitDeclGroup(DeclGroup *group) { void SQASTWritingVisitor::visitDestructuringDecl(DestructuringDecl *destruct) { visitDeclGroup(destruct); stream->writeInt8(destruct->type()); - destruct->initiExpression()->visit(this); + destruct->initExpression()->visit(this); } void SQASTWritingVisitor::visitValueDecl(ValueDecl *value) { @@ -780,7 +780,7 @@ ForStatement *SQASTReader::readForStatement() { return newNode(init, condition, modifier, body); } -ForeachStatement *SQASTReader::readForeachStamenent() { +ForeachStatement *SQASTReader::readForeachStatement() { Decl *idx = readNullableDeclaration(); if (idx && idx->op() != TO_VAR) { error("At foreach 'idx' position should be Var node"); @@ -959,7 +959,7 @@ ArrayExpr *SQASTReader::readArrayExpr() { ArrayExpr *e = newNode(astArena); - e->initialziers().resize(size); + e->initializers().resize(size); for (size_t i = 0; i < size; ++i) { e->addValue(readExpression()); @@ -1099,7 +1099,7 @@ DeclGroup *SQASTReader::readDeclGroup() { return g; } -DestructuringDecl *SQASTReader::readDestructuringnDecl() { +DestructuringDecl *SQASTReader::readDestructuringDecl() { DestructuringDecl *g = newNode(astArena, DT_TABLE); readDeclGroupBody(g); @@ -1170,7 +1170,7 @@ Node *SQASTReader::readNode(enum TreeOp op) { case TO_WHILE: return readWhileStatement(); case TO_DOWHILE: return readDoWhileStatement(); case TO_FOR: return readForStatement(); - case TO_FOREACH: return readForeachStamenent(); + case TO_FOREACH: return readForeachStatement(); case TO_SWITCH: return readSwitchStatement(); case TO_RETURN: return readReturnStatement(); case TO_YIELD: return readYieldStatement(); @@ -1239,7 +1239,7 @@ Node *SQASTReader::readNode(enum TreeOp op) { case TO_PARAM: return readValueDecl(false); case TO_CONST: return readConstDecl(); case TO_DECL_GROUP: return readDeclGroup(); - case TO_DESTRUCT: return readDestructuringnDecl(); + case TO_DESTRUCTURE: return readDestructuringDecl(); case TO_FUNCTION: return readFunctionDecl(false); case TO_CONSTRUCTOR: return readFunctionDecl(true); case TO_CLASS: return readClassDecl(); diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.h b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.h index 11a48895a..24b175fa1 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.h +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqbinaryast.h @@ -83,7 +83,7 @@ class SQASTReader { WhileStatement *readWhileStatement(); DoWhileStatement *readDoWhileStatement(); ForStatement *readForStatement(); - ForeachStatement *readForeachStamenent(); + ForeachStatement *readForeachStatement(); SwitchStatement *readSwitchStatement(); ReturnStatement *readReturnStatement(); @@ -130,7 +130,7 @@ class SQASTReader { FunctionDecl *readFunctionDecl(bool); DeclGroup *readDeclGroup(); - DestructuringDecl *readDestructuringnDecl(); + DestructuringDecl *readDestructuringDecl(); TableDecl *readTableDecl(); diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqcompilationcontext.h b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqcompilationcontext.h index 8ca4db594..a99600ecb 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqcompilationcontext.h +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqcompilationcontext.h @@ -75,6 +75,7 @@ class KeyValueFile; DEF_DIAGNOSTIC(SUSPICIOUS_SYNTAX_RANGE_LOOP, ERROR, SEMA, -1, "", "Very suspicious range-loop syntax construction"), \ DEF_DIAGNOSTIC(ID_RANGE_LOOP, ERROR, SEMA, -1, "", "iterator name (identifier) is expected in 'for ([variable:] [from,] to[, step])', got 'expression'"), \ DEF_DIAGNOSTIC(COMMA_RANGE_LOOP, ERROR, SEMA, -1, "", "too many expressions separated by comma in '%s' - loop"), \ + DEF_DIAGNOSTIC(SPACE_SEP_FIELD_NAME, ERROR, SEMA, -1, "", "Separate access operator '%s' with it's following name is forbidden"), \ DEF_DIAGNOSTIC(TOO_MANY_SYMBOLS, ERROR, SEMA, -1, "", "internal compiler error: too many %s"), \ DEF_DIAGNOSTIC(PAREN_IS_FUNC_CALL, WARNING, SYNTAX, 190, "paren-is-function-call", "'(' on a new line parsed as function call."), \ DEF_DIAGNOSTIC(STMT_SAME_LINE, WARNING, SYNTAX, 192, "statement-on-same-line", "Next statement on the same line after '%s' statement."), \ @@ -119,17 +120,17 @@ class KeyValueFile; DEF_DIAGNOSTIC(ACCESS_POT_NULLABLE, WARNING, SEMA, 248, "access-potentially-nulled", "'%s' can be null, but is used as a %s without checking."), \ DEF_DIAGNOSTIC(CMP_WITH_CONTAINER, WARNING, SEMA, 250, "cmp-with-container", "Comparison with a %s."), \ DEF_DIAGNOSTIC(BOOL_PASSED_TO_STRANGE, WARNING, SEMA, 254, "bool-passed-to-strange", "Boolean passed to '%s' operator."), \ - DEF_DIAGNOSTIC(DUPLCIATE_FUNC, WARNING, SEMA, 255, "duplicate-function", "Duplicate function body. Consider functions '%s' and '%s'."), \ + DEF_DIAGNOSTIC(DUPLICATE_FUNC, WARNING, SEMA, 255, "duplicate-function", "Duplicate function body. Consider functions '%s' and '%s'."), \ DEF_DIAGNOSTIC(KEY_NAME_MISMATCH, WARNING, SEMA, 256, "key-and-function-name", "Key and function name are not the same ('%s' and '%s')."), \ DEF_DIAGNOSTIC(DUPLICATE_ASSIGN_EXPR, WARNING, SEMA, 257, "duplicate-assigned-expr", "Duplicate of the assigned expression."), \ DEF_DIAGNOSTIC(SIMILAR_FUNC, WARNING, SEMA, 258, "similar-function", "Function bodies are very similar. Consider functions '%s' and '%s'."), \ DEF_DIAGNOSTIC(SIMILAR_ASSIGN_EXPR, WARNING, SEMA, 259, "similar-assigned-expr", "Assigned expression is very similar to one of the previous ones."), \ DEF_DIAGNOSTIC(NAME_EXPECTS_RETURN, WARNING, SEMA, 260, "named-like-must-return-result", "Function '%s' has name like it should return a value, but not all control paths returns a value."), \ DEF_DIAGNOSTIC(SUSPICIOUS_FMT, WARNING, SYNTAX, 262, "suspicious-formatting", "Suspicious code formatting."), \ - DEF_DIAGNOSTIC(EGYPT_BRACES, WARNING, SYNTAX, 263, "egyptian-braces", "Identation style: 'egyptian braces' required."), \ + DEF_DIAGNOSTIC(EGYPT_BRACES, WARNING, SYNTAX, 263, "egyptian-braces", "Indentation style: 'egyptian braces' required."), \ DEF_DIAGNOSTIC(PLUS_STRING, WARNING, SEMA, 264, "plus-string", "Usage of '+' for string concatenation."), \ DEF_DIAGNOSTIC(FORGOTTEN_DO, WARNING, SEMA, 266, "forgotten-do", "'while' after the statement list (forgot 'do' ?)"), \ - DEF_DIAGNOSTIC(SUSPICIOUS_BRAKET, WARNING, SYNTAX, 267, "suspicious-braket", "'%s' will be parsed as '%s' (forgot ',' ?)"), \ + DEF_DIAGNOSTIC(SUSPICIOUS_BRACKET, WARNING, SYNTAX, 267, "suspicious-bracket", "'%s' will be parsed as '%s' (forgot ',' ?)"), \ DEF_DIAGNOSTIC(MIXED_SEPARATORS, WARNING, SYNTAX, 269, "mixed-separators", "Mixed spaces and commas to separate %s."), \ DEF_DIAGNOSTIC(EXTEND_TO_APPEND, HINT, SEMA, 270, "extent-to-append", "It is better to use 'append(A, B, ...)' instead of 'extend([A, B, ...])'."), \ DEF_DIAGNOSTIC(FORGOT_SUBST, WARNING, SEMA, 271, "forgot-subst", "'{}' found inside string (forgot 'subst' or '$' ?)."), \ @@ -138,9 +139,9 @@ class KeyValueFile; DEF_DIAGNOSTIC(ITER_IN_CLOSURE, WARNING, SEMA, 274, "iterator-in-lambda", "Iterator '%s' is trying to be captured in closure."), \ DEF_DIAGNOSTIC(MISSED_BREAK, WARNING, SEMA, 275, "missed-break", "A 'break' statement is probably missing in a 'switch' statement."), \ DEF_DIAGNOSTIC(SPACE_AT_EOL, WARNING, LEX, 277, "space-at-eol", "Whitespace at the end of line."), \ - DEF_DIAGNOSTIC(FORBIDEN_FUNC, WARNING, SEMA, 278, "forbidden-function", "It is forbidden to call '%s' function."), \ + DEF_DIAGNOSTIC(FORBIDDEN_FUNC, WARNING, SEMA, 278, "forbidden-function", "It is forbidden to call '%s' function."), \ DEF_DIAGNOSTIC(MISMATCH_LOOP_VAR, WARNING, SEMA, 279, "mismatch-loop-variable", "The variable used in for-loop does not match the initialized one."), \ - DEF_DIAGNOSTIC(FORBIDEN_PARENT_DIR, WARNING, SEMA, 280, "forbidden-parent-dir", "Access to the parent directory is forbidden in this function."), \ + DEF_DIAGNOSTIC(FORBIDDEN_PARENT_DIR, WARNING, SEMA, 280, "forbidden-parent-dir", "Access to the parent directory is forbidden in this function."), \ DEF_DIAGNOSTIC(UNWANTED_MODIFICATION, WARNING, SEMA, 281, "unwanted-modification", "Function '%s' modifies object. You probably didn't want to modify the object here."), \ DEF_DIAGNOSTIC(INEXPR_PRIORITY, WARNING, SEMA, 282, "inexpr-assign-priority", "Operator ':=' has lower priority. Perhaps parentheses are missing?."), \ DEF_DIAGNOSTIC(USELESS_NULLC, WARNING, SEMA, 283, "useless-null-coalescing", "The expression to the right of the '??""' is null."), \ diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqfuncproto.h b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqfuncproto.h index b270f820c..e50925e24 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqfuncproto.h +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/sqfuncproto.h @@ -9,7 +9,7 @@ enum SQOuterType { otOUTER = 1 }; -#define BIT(n) (1U << (n)) +#define BIT(n) (1ULL << (n)) enum SQLangFeature { // parsing stage diff --git a/prog/1stPartyLibs/quirrel/quirrel/squirrel/static_analyser/analyser.cpp b/prog/1stPartyLibs/quirrel/quirrel/squirrel/static_analyser/analyser.cpp index b99d3de8b..5bc12325b 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/squirrel/static_analyser/analyser.cpp +++ b/prog/1stPartyLibs/quirrel/quirrel/squirrel/static_analyser/analyser.cpp @@ -313,7 +313,7 @@ class NodeEqualChecker { } bool cmpArrayExpr(const ArrayExpr *l, const ArrayExpr *r) const { - return cmpNodeVector(l->initialziers(), r->initialziers()); + return cmpNodeVector(l->initializers(), r->initializers()); } bool cmpGetField(const GetFieldExpr *l, const GetFieldExpr *r) const { @@ -362,7 +362,7 @@ class NodeEqualChecker { } bool cmpDestructDecl(const DestructuringDecl *l, const DestructuringDecl *r) const { - return l->type() == r->type() && check(l->initiExpression(), r->initiExpression()); + return l->type() == r->type() && check(l->initExpression(), r->initExpression()); } bool cmpFunction(const FunctionDecl *l, const FunctionDecl *r) const { @@ -549,7 +549,7 @@ class NodeEqualChecker { return cmpConst((const ConstDecl *)lhs, (const ConstDecl *)rhs); case TO_DECL_GROUP: return cmpDeclGroup((const DeclGroup *)lhs, (const DeclGroup *)rhs); - case TO_DESTRUCT: + case TO_DESTRUCTURE: return cmpDestructDecl((const DestructuringDecl *)lhs, (const DestructuringDecl *)rhs); case TO_FUNCTION: case TO_CONSTRUCTOR: @@ -631,7 +631,7 @@ class NodeComplexityComputer : public Visitor { } void visitArrayExpr(ArrayExpr *arr) { - complexity += arr->initialziers().size(); + complexity += arr->initializers().size(); Visitor::visitArrayExpr(arr); } @@ -1083,8 +1083,8 @@ class NodeDiffComputer { } int32_t diffArrayExpr(const ArrayExpr *lhs, const ArrayExpr *rhs) { - const auto &leftInits = lhs->initialziers(); - const auto &rightInits = rhs->initialziers(); + const auto &leftInits = lhs->initializers(); + const auto &rightInits = rhs->initializers(); if (leftInits.size() != rightInits.size()) return sizeDiff(leftInits.size(), rightInits.size()); @@ -1238,7 +1238,7 @@ class NodeDiffComputer { } int32_t diffDestructDecl(const DestructuringDecl *lhs, const DestructuringDecl *rhs) { - int32_t valueDiff = diffNodes(lhs->initiExpression(), rhs->initiExpression()); + int32_t valueDiff = diffNodes(lhs->initExpression(), rhs->initExpression()); if (valueDiff > limit) return valueDiff; @@ -1472,7 +1472,7 @@ class NodeDiffComputer { return diffConst((const ConstDecl *)lhs, (const ConstDecl *)rhs); case TO_DECL_GROUP: return diffDeclGroup((const DeclGroup *)lhs, (const DeclGroup *)rhs); - case TO_DESTRUCT: + case TO_DESTRUCTURE: return diffDestructDecl((const DestructuringDecl *)lhs, (const DestructuringDecl *)rhs); case TO_FUNCTION: case TO_CONSTRUCTOR: @@ -2026,28 +2026,28 @@ class LoopTerminatorCollector : public Visitor { class AssignSeqTerminatorFinder : public Visitor { - const Expr *assigne; + const Expr *assignee; bool foundUsage; - bool foundInteruptor; + bool foundInterruptor; NodeEqualChecker eqChecker; public: - AssignSeqTerminatorFinder(const Expr *asg) : assigne(asg), foundUsage(false), foundInteruptor(false), eqChecker() {} + AssignSeqTerminatorFinder(const Expr *asg) : assignee(asg), foundUsage(false), foundInterruptor(false), eqChecker() {} void visitNode(Node *n) { - if (!foundInteruptor && !foundUsage) + if (!foundInterruptor && !foundUsage) Visitor::visitNode(n); } void visitCallExpr(CallExpr *c) { - foundInteruptor = true; // consider call as potenrial usage + foundInterruptor = true; // consider call as potential usage } void visitExpr(Expr *e) { Visitor::visitExpr(e); - if (eqChecker.check(assigne, e)) + if (eqChecker.check(assignee, e)) foundUsage = true; } @@ -2057,7 +2057,7 @@ class AssignSeqTerminatorFinder : public Visitor { tree->visit(this); - return foundUsage || foundInteruptor; + return foundUsage || foundInterruptor; } }; @@ -2373,7 +2373,7 @@ struct FunctionInfo { }; const FunctionDecl *owner; - std::vector modifible; + std::vector modifiable; const FunctionDecl *declaration; std::vector parameters; @@ -2383,7 +2383,7 @@ struct FunctionInfo { }; void FunctionInfo::joinModifiable(const FunctionInfo *other) { - for (auto &m : other->modifible) { + for (auto &m : other->modifiable) { if (owner == m.owner) continue; @@ -2392,12 +2392,12 @@ void FunctionInfo::joinModifiable(const FunctionInfo *other) { } void FunctionInfo::addModifiable(const SQChar *name, const FunctionDecl *o) { - for (auto &m : modifible) { + for (auto &m : modifiable) { if (m.owner == o && strcmp(name, m.name) == 0) return; } - modifible.push_back({ o, name }); + modifiable.push_back({ o, name }); } struct VarScope; @@ -2867,7 +2867,7 @@ class CheckerVisitor : public Visitor { void checkPersistCall(const CallExpr *callExpr); void checkForbiddenCall(const CallExpr *callExpr); void checkCallFromRoot(const CallExpr *callExpr); - void checkForbidenParentDir(const CallExpr *callExpr); + void checkForbiddenParentDir(const CallExpr *callExpr); void checkFormatArguments(const CallExpr *callExpr); void checkArguments(const CallExpr *callExpr); void checkContainerModification(const CallExpr *expr); @@ -2900,7 +2900,7 @@ class CheckerVisitor : public Visitor { void checkDuplicateSwitchCases(SwitchStatement *swtch); void checkDuplicateIfBranches(IfStatement *ifStmt); void checkDuplicateIfConditions(IfStatement *ifStmt); - void checkSuspiciousFormating(const Statement *body, const Statement *stmt); + void checkSuspiciousFormatting(const Statement *body, const Statement *stmt); bool onlyEmptyStatements(int32_t start, const ArenaVector &statements) { for (int32_t i = start; i < statements.size(); ++i) { @@ -4671,7 +4671,7 @@ void CheckerVisitor::checkForbiddenCall(const CallExpr *call) { return; if (isForbiddenFunctionName(fn)) { - report(call, DiagnosticsId::DI_FORBIDEN_FUNC, fn); + report(call, DiagnosticsId::DI_FORBIDDEN_FUNC, fn); } } @@ -4707,7 +4707,7 @@ void CheckerVisitor::checkCallFromRoot(const CallExpr *call) { } } -void CheckerVisitor::checkForbidenParentDir(const CallExpr *call) { +void CheckerVisitor::checkForbiddenParentDir(const CallExpr *call) { if (effectsOnly) return; @@ -4734,7 +4734,7 @@ void CheckerVisitor::checkForbidenParentDir(const CallExpr *call) { const char * p = strstr(path, ".."); if (p && (p[2] == '/' || p[2] == '\\')) { - report(call, DiagnosticsId::DI_FORBIDEN_PARENT_DIR); + report(call, DiagnosticsId::DI_FORBIDDEN_PARENT_DIR); } } @@ -5222,7 +5222,7 @@ void CheckerVisitor::visitCallExpr(CallExpr *expr) { checkPersistCall(expr); checkForbiddenCall(expr); checkCallFromRoot(expr); - checkForbidenParentDir(expr); + checkForbiddenParentDir(expr); checkFormatArguments(expr); checkContainerModification(expr); checkUnwantedModification(expr); @@ -5427,7 +5427,7 @@ bool wrappedBody(const Statement *stmt) { && stmt->columnEnd() == wp->columnEnd(); } -void CheckerVisitor::checkSuspiciousFormating(const Statement *body, const Statement *stmt) { +void CheckerVisitor::checkSuspiciousFormatting(const Statement *body, const Statement *stmt) { if (wrappedBody(body)) { if (stmt->lineStart() != body->lineStart() && stmt->columnStart() >= body->columnStart()) { @@ -5657,7 +5657,7 @@ void CheckerVisitor::checkFunctionSimilarity(const Block *b) { const SQChar *name2 = f2->name(); if (diff == 0) - report(f2, DiagnosticsId::DI_DUPLCIATE_FUNC, name1, name2); + report(f2, DiagnosticsId::DI_DUPLICATE_FUNC, name1, name2); else { f1Complexity = NodeComplexityComputer::compute(f1->body(), functionComplexityThreshold * 3); if (diff <= f1Complexity / functionComplexityThreshold) @@ -5870,7 +5870,7 @@ void CheckerVisitor::visitBlock(Block *b) { void CheckerVisitor::visitForStatement(ForStatement *loop) { checkUnterminatedLoop(loop); checkVariableMismatchForLoop(loop); - checkSuspiciousFormating(loop->body(), loop); + checkSuspiciousFormatting(loop->body(), loop); VarScope *trunkScope = currentScope; @@ -5942,7 +5942,7 @@ void CheckerVisitor::checkNullableContainer(const ForeachStatement *loop) { void CheckerVisitor::visitForeachStatement(ForeachStatement *loop) { checkUnterminatedLoop(loop); checkNullableContainer(loop); - checkSuspiciousFormating(loop->body(), loop); + checkSuspiciousFormatting(loop->body(), loop); VarScope *trunkScope = currentScope; @@ -6014,7 +6014,7 @@ void CheckerVisitor::visitForeachStatement(ForeachStatement *loop) { void CheckerVisitor::visitWhileStatement(WhileStatement *loop) { checkUnterminatedLoop(loop); checkEmptyWhileBody(loop); - checkSuspiciousFormating(loop->body(), loop); + checkSuspiciousFormatting(loop->body(), loop); loop->condition()->visit(this); @@ -6608,7 +6608,7 @@ void CheckerVisitor::visitIfStatement(IfStatement *ifstmt) { checkDuplicateIfConditions(ifstmt); checkDuplicateIfBranches(ifstmt); checkAlwaysTrueOrFalse(ifstmt->condition()); - checkSuspiciousFormating(ifstmt->thenBranch(), ifstmt); + checkSuspiciousFormatting(ifstmt->thenBranch(), ifstmt); VarScope *trunkScope = currentScope; VarScope *thenScope = trunkScope->copy(arena); @@ -6859,7 +6859,7 @@ void CheckerVisitor::checkFunctionSimilarity(const TableDecl *table) { const SQChar *name2 = f2->name(); if (diff == 0) - report(f2, DiagnosticsId::DI_DUPLCIATE_FUNC, name1, name2); + report(f2, DiagnosticsId::DI_DUPLICATE_FUNC, name1, name2); else { complexity = NodeComplexityComputer::compute(f1->body(), functionComplexityThreshold * 3); if (diff <= complexity / functionComplexityThreshold) @@ -6875,7 +6875,7 @@ void CheckerVisitor::checkAccessNullable(const DestructuringDecl *dd) { if (effectsOnly) return; - const Expr *i = dd->initiExpression(); + const Expr *i = dd->initExpression(); const Expr *initializer = i; if (isPotentiallyNullable(initializer)) { @@ -7494,7 +7494,7 @@ void CheckerVisitor::applyKnownInvocationToScope(const ValueRef *value) { return; } - for (auto s : info->modifible) { + for (auto s : info->modifiable) { VarScope *scope = currentScope->findScope(s.owner); if (!scope) continue; diff --git a/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/compilation_context.cpp b/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/compilation_context.cpp index 12d001060..275ea49b6 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/compilation_context.cpp +++ b/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/compilation_context.cpp @@ -298,7 +298,7 @@ AnalyzerMessage analyzer_messages[] = }, { 263, "egyptian-braces", - "Identation style: 'egyptian braces' required." + "Indentation style: 'egyptian braces' required." }, { 264, "plus-string", diff --git a/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/quirrel_parser.cpp b/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/quirrel_parser.cpp index ab7ed3d55..8c8b3b13e 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/quirrel_parser.cpp +++ b/prog/1stPartyLibs/quirrel/quirrel/static_analyzer/quirrel_parser.cpp @@ -1093,7 +1093,7 @@ struct Parser } } - void checkBraceIdentationStyle() + void checkBraceIndentationStyle() { if (pos > 0 && forwardToken(0) == TK_LBRACE && tokens[pos - 1].nextEol()) ctx.warning("egyptian-braces", tokens[pos]); @@ -1277,7 +1277,7 @@ struct Parser } else { - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); expect(TK_LBRACE); functionBody = parseStatementList(*tok, 1, false, false); expect(TK_RBRACE); @@ -1315,7 +1315,7 @@ struct Parser if (accept(TK_EXTENDS)) extends = parseTernaryOp(); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); expect(TK_LBRACE); while (!ctx.isError) @@ -1399,7 +1399,7 @@ struct Parser expect(TK_IDENTIFIER); enumName = createIdentifierNode(*tok); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); expect(TK_LBRACE); while (!ctx.isError) @@ -1527,14 +1527,14 @@ struct Parser else if (accept(TK_TRY)) { Token * tk = tok; - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * tryBody = parseStatement(false); expect(TK_CATCH); expect(TK_LPAREN); expect(TK_IDENTIFIER); Node * id = createIdentifierNode(*tok); expect(TK_RPAREN); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * catchBody = parseStatement(true); res = createTryCatchNode(*tok, tryBody, id, catchBody); } @@ -1554,7 +1554,7 @@ struct Parser Node * expression = parseInexprLocal(); expressionContext.pop_back(); expect(TK_RPAREN); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * ifTrue = parseStatement(true); if (forwardToken(0) != TK_ELSE && !isEndOfStatement()) ctx.warning("statement-on-same-line", *tok, "then"); @@ -1571,7 +1571,7 @@ struct Parser std::to_string(tk->line).c_str(), std::to_string(tok->line).c_str()); } - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); ifFalse = parseStatement(true); } @@ -1600,7 +1600,7 @@ struct Parser Node * expression = parseInexprLocal(); expressionContext.pop_back(); expect(TK_RPAREN); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * loopBody = parseStatement(true); if (loopBody && loopBody->nodeType != PNT_STATEMENT_LIST && !isEndOfStatement()) @@ -1621,7 +1621,7 @@ struct Parser else if (accept(TK_DO)) { Token * tk = tok; - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * loopBody = parseStatement(false); expect(TK_WHILE); expect(TK_LPAREN); @@ -1661,7 +1661,7 @@ struct Parser expect(TK_RPAREN); } - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * loopBody = parseStatement(true); if (loopBody && loopBody->nodeType != PNT_STATEMENT_LIST && !isEndOfStatement()) @@ -1700,7 +1700,7 @@ struct Parser expect(TK_RPAREN); } - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * loopBody = parseStatement(true); if (loopBody && loopBody->nodeType != PNT_STATEMENT_LIST && !isEndOfStatement()) @@ -1736,7 +1736,7 @@ struct Parser expect(TK_LPAREN); Node * expression = parseTernaryOp(); expect(TK_RPAREN); - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); expect(TK_LBRACE); bool defaultPresent = false; @@ -1768,7 +1768,7 @@ struct Parser expect(TK_COLON); } - checkBraceIdentationStyle(); + checkBraceIndentationStyle(); Node * caseBody = parseStatementList(*tok, 1, true, false); caseTestsTokens.push_back(caseTok); caseTests.push_back(test); diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.diag.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.diag.txt index 071d8efa5..f54139de3 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.diag.txt +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.diag.txt @@ -1,9 +1,9 @@ ERROR: AST too big. Consider simplifying it -testData/diagnostics/50k_access_member.nut:4:201 +testData/diagnostics/50k_access_member.nut.txt:4:202 -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - ^ -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + ^ +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut deleted file mode 100644 index 9f559e89f..000000000 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut +++ /dev/null @@ -1,441 +0,0 @@ -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. - -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x. -x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x - diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut.txt new file mode 100644 index 000000000..1a11d9adf --- /dev/null +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/50k_access_member.nut.txt @@ -0,0 +1,441 @@ +x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x +.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x + diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.diag.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.diag.txt new file mode 100644 index 000000000..ee9d06f93 --- /dev/null +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.diag.txt @@ -0,0 +1,9 @@ +ERROR: Separate access operator '.' with it's following name is forbidden +testData/diagnostics/space_sep_name.nut.txt:10:0 + +a1. +append(8). // NOT OK +^----- +extend(6) // NOT OK + + diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.nut.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.nut.txt new file mode 100644 index 000000000..98763226f --- /dev/null +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name.nut.txt @@ -0,0 +1,11 @@ + + + +let a1 = [1, 2, 3] + +a1.append(6) // OK +.extend(7) // OK + +a1. +append(8). // NOT OK +extend(6) // NOT OK diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.diag.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.diag.txt new file mode 100644 index 000000000..dede1b6d6 --- /dev/null +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.diag.txt @@ -0,0 +1,7 @@ +ERROR: Separate access operator '?.$' with it's following name is forbidden +testData/diagnostics/space_sep_name_space.nut.txt:8:10 + +t1?.$ foo // NOT OK + ^-- + + diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.nut.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.nut.txt new file mode 100644 index 000000000..eb03f1b90 --- /dev/null +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/diagnostics/space_sep_name_space.nut.txt @@ -0,0 +1,8 @@ +let t1 = {} + + +t1 ?.foo // OK +.bar // OK + + +t1?.$ foo // NOT OK \ No newline at end of file diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w190.nut b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w190.nut index 64658efeb..6622d9385 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w190.nut +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w190.nut @@ -1,4 +1,4 @@ -//-file:suspicious-braket +//-file:suspicious-bracket function foo(_p) { return "X" } diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.diag.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.diag.txt index b2ccfd454..d1015659b 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.diag.txt +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.diag.txt @@ -1,7 +1,7 @@ WARNING: w255 (duplicate-function) Duplicate function body. Consider functions 'onTimer2' and 'onTimer'. testData/static_analyser/w255.nut:29:21 - function onTimer(obj, dt, dt) { + function onTimer(obj, dt) { ^ local curOffs = obj.cur_slide_offs.tofloat() diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.nut b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.nut index cf6a4ee5a..3afdeac88 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.nut +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255.nut @@ -4,7 +4,7 @@ //-file:ident-hides-ident ::ClassName <- class { - function onTimer2(obj, dt, dt2) { + function onTimer2(obj, dt) { local curOffs = obj.cur_slide_offs.tofloat() // local pos = obj.getPos() @@ -12,7 +12,7 @@ local parentSize = obj.getParent().getSize() local speedCreditsScroll = (size[1] / parentSize[1] ) / ::timeToShowAll - if (::pos[1] + :: size[1] < 0) { + if (::pos[1] + ::size[1] < 0) { curOffs = -(0.9 * ::parentSize[1]).tointeger() if (obj?.inited == "yes") { ::on_credits_finish() @@ -26,7 +26,7 @@ obj.top = (-curOffs).tointeger().tostring() } - function onTimer(obj, dt, dt) { + function onTimer(obj, dt) { local curOffs = obj.cur_slide_offs.tofloat() // local pos = obj.getPos() @@ -34,7 +34,7 @@ local parentSize = obj.getParent().getSize() local speedCreditsScroll = (size[1] / parentSize[1] ) / ::timeToShowAll - if (::pos[1] + :: size[1] < 0) { + if (::pos[1] + ::size[1] < 0) { curOffs = -(0.9 * ::parentSize[1]).tointeger() if (obj?.inited == "yes") { ::on_credits_finish() @@ -47,4 +47,4 @@ obj.cur_slide_offs = ::format("%f", curOffs) obj.top = (-curOffs).tointeger().tostring() } - } \ No newline at end of file + } diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.diag.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.diag.txt index 986b17855..b51e54c8d 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.diag.txt +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.diag.txt @@ -1,7 +1,7 @@ WARNING: w255 (duplicate-function) Duplicate function body. Consider functions 'onTimer2' and 'onTimer'. testData/static_analyser/w255_2.nut:31:21 - function onTimer(obj, dt, dt) { + function onTimer(obj, dt) { ^ local curOffs = obj.cur_slide_offs.tofloat() diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.nut b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.nut index 18c8d1bd0..2e56bd3e9 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.nut +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w255_2.nut @@ -6,7 +6,7 @@ //expect:w255 local class ClassName { //-declared-never-used - function onTimer2(obj, dt, dt2) { + function onTimer2(obj, dt) { local curOffs = obj.cur_slide_offs.tofloat() // local pos = obj.getPos() @@ -14,7 +14,7 @@ local class ClassName { //-declared-never-used local parentSize = obj.getParent().getSize() local speedCreditsScroll = (size[1] / parentSize[1] ) / ::timeToShowAll - if (::pos[1] + :: size[1] < 0) { + if (::pos[1] + ::size[1] < 0) { curOffs = -(0.9 * ::parentSize[1]).tointeger() if (obj?.inited == "yes") { ::on_credits_finish() @@ -28,7 +28,7 @@ local class ClassName { //-declared-never-used obj.top = (-curOffs).tointeger().tostring() } - function onTimer(obj, dt, dt) { + function onTimer(obj, dt) { local curOffs = obj.cur_slide_offs.tofloat() // local pos = obj.getPos() @@ -36,7 +36,7 @@ local class ClassName { //-declared-never-used local parentSize = obj.getParent().getSize() local speedCreditsScroll = (size[1] / parentSize[1] ) / ::timeToShowAll - if (::pos[1] + :: size[1] < 0) { + if (::pos[1] + ::size[1] < 0) { curOffs = -(0.9 * ::parentSize[1]).tointeger() if (obj?.inited == "yes") { ::on_credits_finish() @@ -49,4 +49,4 @@ local class ClassName { //-declared-never-used obj.cur_slide_offs = ::format("%f", curOffs) obj.top = (-curOffs).tointeger().tostring() } - } \ No newline at end of file + } diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w263.diag.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w263.diag.txt index e5a1a5620..4ad6742ac 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w263.diag.txt +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w263.diag.txt @@ -1,4 +1,4 @@ -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:2:0 for (local i = 0; i < 5; i++) // EXPECTED @@ -7,7 +7,7 @@ for (local i = 0; i < 5; i++) // EXPECTED ::print(i) -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:7:0 function _foo(_p) // EXPECTED @@ -15,7 +15,7 @@ function _foo(_p) // EXPECTED ^ -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:21:0 class _B // EXPECTED @@ -23,7 +23,7 @@ class _B // EXPECTED ^ -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:30:0 enum _E2 // EXPECTED @@ -31,7 +31,7 @@ enum _E2 // EXPECTED ^ -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:41:0 try // EXPECTED @@ -40,7 +40,7 @@ try // EXPECTED print(8) -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:44:0 } catch (_e) // EXPECTED @@ -49,7 +49,7 @@ testData/static_analyser/w263.nut:44:0 print(9) -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:57:0 if (!t) // EXPECTED @@ -58,7 +58,7 @@ if (!t) // EXPECTED print(12) -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:60:0 } else // EXPECTED @@ -67,7 +67,7 @@ testData/static_analyser/w263.nut:60:0 print(13) -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:69:0 while (t) // EXPECTED @@ -76,7 +76,7 @@ while (t) // EXPECTED print(15) -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:78:0 do // EXPECTED @@ -85,7 +85,7 @@ do // EXPECTED print(17) -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:89:4 default: // EXPECTED @@ -94,7 +94,7 @@ testData/static_analyser/w263.nut:89:4 break; -WARNING: w263 (egyptian-braces) Identation style: 'egyptian braces' required. +WARNING: w263 (egyptian-braces) Indentation style: 'egyptian braces' required. testData/static_analyser/w263.nut:95:0 switch (t) // EXPECTED diff --git a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w267.diag.txt b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w267.diag.txt index 480746433..b11cef605 100644 --- a/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w267.diag.txt +++ b/prog/1stPartyLibs/quirrel/quirrel/testData/static_analyser/w267.diag.txt @@ -1,18 +1,18 @@ -WARNING: w267 (suspicious-braket) '(' will be parsed as 'function call' (forgot ',' ?) +WARNING: w267 (suspicious-bracket) '(' will be parsed as 'function call' (forgot ',' ?) testData/static_analyser/w267.nut:4:11 foo("sum=" (6+7)) // EXPECTED 1 ^ -WARNING: w267 (suspicious-braket) '[' will be parsed as 'access to member' (forgot ',' ?) +WARNING: w267 (suspicious-bracket) '[' will be parsed as 'access to member' (forgot ',' ?) testData/static_analyser/w267.nut:6:13 foo("array:" [6]) // EXPECTED 2 access ^ -WARNING: w267 (suspicious-braket) '[' will be parsed as 'access to member' (forgot ',' ?) +WARNING: w267 (suspicious-bracket) '[' will be parsed as 'access to member' (forgot ',' ?) testData/static_analyser/w267.nut:11:8 // [6] // compilation error @@ -21,7 +21,7 @@ testData/static_analyser/w267.nut:11:8 "y" (6+7) // EXPECTED 4 -WARNING: w267 (suspicious-braket) '(' will be parsed as 'function call' (forgot ',' ?) +WARNING: w267 (suspicious-bracket) '(' will be parsed as 'function call' (forgot ',' ?) testData/static_analyser/w267.nut:12:8 "t" [7] // EXPECTED 3 access @@ -30,7 +30,7 @@ testData/static_analyser/w267.nut:12:8 "z" -WARNING: w267 (suspicious-braket) '(' will be parsed as 'function call' (forgot ',' ?) +WARNING: w267 (suspicious-bracket) '(' will be parsed as 'function call' (forgot ',' ?) testData/static_analyser/w267.nut:14:4 "z" diff --git a/prog/1stPartyLibs/vecmath/dag_vecMath_trig.h b/prog/1stPartyLibs/vecmath/dag_vecMath_trig.h index dd2346a74..209cff2ec 100644 --- a/prog/1stPartyLibs/vecmath/dag_vecMath_trig.h +++ b/prog/1stPartyLibs/vecmath/dag_vecMath_trig.h @@ -300,7 +300,7 @@ VECTORCALL VECMATH_FINLINE vec4f v_atan2(vec4f y, vec4f x) tmp2 = v_and(maskYlt0, V_C_PI); vec4f offs = v_sub(tmp1, tmp2); - vec4f maskXeq0 = v_cmp_eq(x, v_zero()); + vec4f maskXeq0 = v_cmp_gt(v_cast_vec4f(v_splatsi(/* FLT_MIN */ 0x00800000)), v_abs(x)); vec4f atan = v_atan(v_div(y, x)); atan = v_add(atan, offs); diff --git a/prog/_jBuild/defaults.jam b/prog/_jBuild/defaults.jam index 6001093dc..7c456e807 100644 --- a/prog/_jBuild/defaults.jam +++ b/prog/_jBuild/defaults.jam @@ -94,7 +94,6 @@ if ! $(__DEFAULTS_INCLUDED) { AndroidApiMinVer ?= 28 ; NSwitchSdkVer ?= 1624 ; WinSdkVer ?= win.sdk.100 ; - DirectXVer ?= jun2010 ; UseD3DMulti ?= no ; MSVectorcall ?= no ; DefBulletSdkVer ?= 3 ; @@ -176,12 +175,6 @@ if ! $(__DEFAULTS_INCLUDED) { FastLink ?= yes ; # this speed-up linking but pdb become dependand on obj output } - switch $(Platform) { - case win32 : PhysXSdk ?= 2.8.4 ; - case win64 : PhysXSdk ?= 2.8.4 ; - case * : PhysXSdk ?= none ; - } - if $(OS) = MACOSX { if ! $(_DEVTOOL) && [ GLOB /devtools : * ] { _DEVTOOL = /devtools ; } _DEVTOOL ?= /var/devtools ; @@ -235,9 +228,6 @@ if ! $(__DEFAULTS_INCLUDED) { _DEVTOOL = $(_devtool_s) ; if $(GDEVTOOL) { GDEVTOOL = $(_devtool_s) ; } - PhysXSdkPath = $(_DEVTOOL)/PhysX.SDK.$(PhysXSdk) ; - _DXSDK_DIR = $(_DEVTOOL)/dx9.sdk ; - if $(FmodStudio) = src { local fmod_root = $(Root)/prog/3rdPartyLibs/fmodStudio ; FmodIncPath = $(fmod_root)/fsbank_api/src $(fmod_root)/core_api/src $(fmod_root)/studio_api/src ; diff --git a/prog/_jBuild/iOS/clang-link.jam b/prog/_jBuild/iOS/clang-link.jam index b638538b9..d2ab818bc 100644 --- a/prog/_jBuild/iOS/clang-link.jam +++ b/prog/_jBuild/iOS/clang-link.jam @@ -50,33 +50,35 @@ rule ProcessLinkTarget if $(Config) = rel { _LINK_OPT += -Wl,-S ; - local ExportSymbols = - _dagor_ios_main_init - _dagor_ios_delegate_init - _dagor_ios_delegate_main - _dagor_ios_delegate_createDisplayLink - _dagor_ios_delegate_step - _dagor_ios_delegate_applicationWillFinishLaunching - _dagor_ios_delegate_applicationDidFinishLaunching - _dagor_ios_delegate_applicationWillTerminate - _dagor_ios_delegate_applicationWillResignActive - _dagor_ios_delegate_applicationDidBecomeActive - _dagor_ios_delegate_applicationDidReceiveMemoryWarning - _dagor_ios_delegate_openURL - _dagor_ios_delegate_didRegisterForRemoteNotificationsWithDeviceToken - _dagor_ios_delegate_didFailToRegisterForRemoteNotificationsWithError - _dagor_ios_delegate_didReceiveRemoteNotification - _dagor_ios_delegate_didFinishLaunchingWithOptions - _dagor_ios_delegate_dealloc - ; - for symbol in $(ExportSymbols) { - _LINK_OPT += -Wl,-exported_symbol,$(symbol) ; - } + StripLibrary ?= yes ; if $(StripLibrary) = yes { $(Target)__IMGBUILD = call strip -x ; } } + + local ExportSymbols = + _dagor_ios_main_init + _dagor_ios_delegate_init + _dagor_ios_delegate_main + _dagor_ios_delegate_createDisplayLink + _dagor_ios_delegate_step + _dagor_ios_delegate_applicationWillFinishLaunching + _dagor_ios_delegate_applicationDidFinishLaunching + _dagor_ios_delegate_applicationWillTerminate + _dagor_ios_delegate_applicationWillResignActive + _dagor_ios_delegate_applicationDidBecomeActive + _dagor_ios_delegate_applicationDidReceiveMemoryWarning + _dagor_ios_delegate_openURL + _dagor_ios_delegate_didRegisterForRemoteNotificationsWithDeviceToken + _dagor_ios_delegate_didFailToRegisterForRemoteNotificationsWithError + _dagor_ios_delegate_didReceiveRemoteNotification + _dagor_ios_delegate_didFinishLaunchingWithOptions + _dagor_ios_delegate_dealloc + ; + for symbol in $(ExportSymbols) { + _LINK_OPT += -Wl,-exported_symbol,$(symbol) ; + } if $(CheckOnly) = yes { _LINK_OPT += -Wl,-S -Wl,-x ; } diff --git a/prog/_jBuild/jBuild.jam b/prog/_jBuild/jBuild.jam index f62ad9cfe..8e87dd4dc 100644 --- a/prog/_jBuild/jBuild.jam +++ b/prog/_jBuild/jBuild.jam @@ -470,15 +470,10 @@ rule ProcessTargetVariables } } - if $(Platform) in win32 win64 && $(UseDirectX) = yes { - if ! [ GLOB $(_DXSDK_DIR).$(DirectXVer) : * ] { exit FATAL\: \"$(_DXSDK_DIR).$(DirectXVer)\" not found! Please, update DEVTOOLS ; } - } - ProcessCompileTarget ; PreAddIncludes = ; AddIncludes = ; - UseDirectX = ; if $(TargetType) in exe dll { if $(IsProgArtifact) = yes && $(SignatureID) { @@ -643,7 +638,6 @@ rule ClearTargetVariables MultiTarget = ; PreAddIncludes = ; AddIncludes = ; - UseDirectX = ; UseQuirrel = ; AddLibs = ; Resources = ; @@ -1395,35 +1389,6 @@ rule LinkDllSetMapExpLib } } -# adds include switch to parameter -# params: ( post_opt : pre_opt ) -rule AddDirectXInclude -{ - if $(UseDirectX) = yes { - if $(DirectXVer) in $(C_preopt_DirectXVer) { - $(1) += $(IncludeMSVCDir)$(_DXSDK_DIR).$(DirectXVer)/include ; - } else { - $(2) += $(IncludeMSVCDir)$(_DXSDK_DIR).$(DirectXVer)/include ; - } - } -} - -# adds libpath switch to parameter -# params: ( cmd_line ) -rule AddDirectXLibs -{ - if $(UseDirectX) = yes && $(WinSdkVer) != win.sdk.81 { - switch $(Platform) { - case win32 : $(1) += -libpath:$(_DXSDK_DIR).$(DirectXVer)/lib/x86 ; - case win64 : $(1) += -libpath:$(_DXSDK_DIR).$(DirectXVer)/lib/x64 ; - } - } -} - -rule AddForceFastcall -{ -} - rule AddMissingDefaultOpts { for t in $(3) { if $(t) in $($(1)) { return ; } } diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities.dll b/prog/_jBuild/msbuild/Gaijin.Utilities.dll deleted file mode 100644 index 1b0e2312ee4f3741eb1205b82daee3f9615da1a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18944 zcmeHv3v?W3mFE4cyQ^R7M|E2-+p^nnY`3k4CEFx+;>4CE*-;`}jwRVnaFE+lS?aje z)vj*YRva67SRMf!CNN~c3pejvYzyH1WzyJMTRpsoy`A^A1L|$B%E)jhmcm8b``1)WL z#nI(oh|*_*-(2x|HSo<9!;{%!s$g3ac4jIymdWR>QtF7AvZwQ@Y(CXHIFy>Q#?6jM zBy_o}dT$@mfbvlI7th^Ww)Qk#mI|v*q8;Gq4)?YU?kQZexQOC{YmVQ{aK(ro0s%h% zJaqW2EXw~??=HzK{L;`n$jB_wK@PHMuTtZl6k5G zdbS$?WztsHZ&30}5gqQZi}n~O@og3ecT_K~n%{PGSBGupEC{l%bPq1pRcjFBcE<{^ z>hBQR#XlC+$VcgoME|p$ND23k2g|h6sOnvJndUho2pDk1VF&^S;_NU4p=76@wgH8_ zp``)!_K4hD)2N|0u5*}Y5r6Nh_Qus`mjHQ1??G8HMig2#%Oxz^s->YvKie`_67eca za*0S54b%*2X&=gL*eqBHFv7KrBp8lq*4kRv5ZRo8k%SgZ*P|%uHN1PR2F831N!@OR zlBD19Kq@2y4awlx_sa-sv^!TG!d< zQPOn24Lz``!H8U3)o9dROe3bD)~H(#6%e_QwG4nw-&HXkHKMhqs|7JO&7={XV>(tb z9i4AF#-^hc(@s4jHrMp$DyHK`+%?_HwyFh2nKX=wv3Tp^x$QLASllsIY1gwAf{8#n1^%}G@rO&7 zz={MDn!|W67&Qs$7dJKCS^?>HKaZ5wR$aF)1L=;GWmkN594$32KN-p@#70?=vGE#HjGUCyI=y3+%NnX9KI)=t?cU8h3k*qC&Y~4VS`5 ztCa@Uur9FIem{z3JVo?idM&tZ%Yqn6VQ3Ae*MW`%(-O{4A9k$0AyWTz&+!5_@02BeEuLNugXn{jK`8rJDNf$5m+FsJCnEvz^o zg>CVG6#3Ivf!PMphDd9>mX1L#ctO-~pE$BHKO)YGD#DVzj`W?`4UaUglN=jEq9W(u z3nojwP2&ljy^<7Yt8<9P^wqHF7D!Gsgf_RJrlU@O4^K~F|6ZxIh1UxIUi&JI3JvM4 z?0-Yj+j=x$cttMha}*iAz3FRE>LinHI40XS8#+pwokYT#At}v?B>dM&BEyRji}nZ5 zy7yJ=UkeM7hNQpsXwdLG_5-f{K&^cYbtjoO8$lzm*G=R(_L={B_L0R{Cj3FRuQwhH zVXfeMeDm-{P7Z@`3rVPJUd z%RLy!yhOFfJ$74}*z#dceEW(r-KN%Qr@6Yv>V_;xk3C!|yxL>unBbMCt;4gt&e{QN z)$)|pgL|k!w|a3;sB|B0t2OO(9W?n5p5dF8-U+7tHq79xgbmh znl8*&|DlTdn?1|Z(vrrTI5Qf$`W?-l1`HE!Syex0=p!+G*}1H>eXH z`=f0128gxaEYtPU^B6@~vh6Q9AwldSsDKnfrk`Qd&}A~bxT?wis>n1u;dQx-?T3ZC z#B(t{0KIY5+U2poQ8v>S6f@v1@z~#HE~i3Uv|>kWIBoKjL;qA76Pb<)9dn!BmR{7z z^OnB4p@HW-eRb;Fm`~HYp~sP1)Zmn3QJ^K5x8938BnZ+dI-dmTKX2;;Gi?lcF@o{LdOujsXWNu3BArB!;0x$m+aIj zi*hU!hIX1+PV$8?PFptaasuXLiQZh3fBNDJdea5_m+YlRf<8jjvFKq) z8O2e!gH`3Qc$EQk@J8!M1-H>l1wNR#Wm+0rAl-(RLV6rr%d9C{fgewSMKeT+kHOX}mjyUH4atxZu&-qoCAEW%$>8#MGSs>V?86nd4t5JfgInH;dVb4d zCE?BcKqSKH0#jIjB1Qnaa637qUacEx+Z)VvW8$|QLB=+1*8{=TUqs&|^%;t?aaU_3~fnO-(SyO5xV_JFz zA_*H&BW6S$CnWsEA~dE;45k5+*it(ivjC7baA4X%jKq5*{Y zU>q%RhN9oP4MpwRQ!Us_p9Z=r8MtZ_3)UI_HY|+phz(k|qcB--)Th&M)Tzc(vxA*a zVK7T6Mz!9MY-nAj@itXA8vI6sbp~}S-ig~6jRs^{1B%6g4UaXhGm`7NH}Sp;&rNWd zi1|1OjCT1k{|mUj3;uZ!bq<@#Th0yj#j`LoThGG_!>p-1%mlfprLTlLl?@UT6XcK;_~xLlD^KbM~j;3nnl0;MLGsIcH-FCFg8rp51_oa?b7o@`{eB zsC;_n68D^qZIym@<6Oyssw9`VlB`qC!+gA01N#Z`%K@5?7T6JnB9b;qtoE$bIXd%+ zdh@>^cnKeNZHN*^t>Jf%&H-$boRjlkL&6AP;l*YQ>x6q8#zxCInsptPV|U2&f#ph%129`qi}eRVfWAu z!{Pac>)3F(V%VvN>7WJLozp4|f39K}Glpw;2TWD@QI{$o(qSqx|EwBiQxV5hMfI~4 z)iE5voi^=L^~%H94#Q$eMU?Hgx?Cz&W&ALK;U$f1H8u|T8U9zhsE?mj1QIUY<>b$EYZiYlzj+G=gN^G>cv!p z6`5A<8tKOlk%mG4sTcH)9Iu@6!!S_?uDRF}#9*c0tBr(#f?Ox;AEhqF7h$;3c3iW# zSPZ)=UY7;eafb_Z87}COgCUo(4$P_vs+>m~+xUS*Ozz0w2?(buqdZP1WgT z{S5(~9`dgb>2y$Fy}%6u|6Jft^!1?-WrAOZhR^Dgby50JuqUX~2kAkTpp*10a6QKG zEbu6O(%%F4QJrNz>tp_3hhBiK_VA{-PX8?U#{e7XGwP+tV)}f%I~t`mUY36sbS|Tp zqeHR9bTJyO3(-?zHxPb-w$U%b?DNljtnDr@!yk(N{~cs2@6s7=6Hl6j^HBWRV1hcM z%)c?fa1-i==&fOH%L@V4aNJ;cG}sT$MQO{$2y^^(&juIMnb0(96~x66~W(Pi{cXoXIn5`Uf!ACBtuw_euyolq3E z>d_*dE(2Ul_3)Pa>3#<2NB)abQ}l_tt_t<_7*k$k0hc`{luj|BKBJzf%c7)NC_Btl zlv;%9jBvdeEvH#*a<8s?qOOnXsa?wc8zj4^iLMmt9VqL9j;qPDB2FJc>h#eP>ZS!HPXm1P0lopyLk~n=(mZrD{tDoo0fwgp zzgO@f!EY1%vjX1@j;? z)|ZM8dja>RI2+y;xWU`(QFPFyZt^Y%m2s)vMzcqwtV@j>%R$*LHQ`;2cHHJtw|no# z=Kenk^}omy=u%$#7G^G3X!?CvM`nG`p#r-j%^olPlS|zaSq|!7T%FX zrM@_*%|hKpKUG(Fg7mmh=jcYgONHq0YPRS25~6S6R9S9ch`u+6ievXk^mR(cuknQF z#&t~HO^*b7J$3YMp&q6@#(sphwsM&hr3eiR< zw;a?mm--pX7SU>#dI@EVs8c8>F7;GcUu_ZgU--?^`%;g4`#n|a5$`?^wwrF*&%Fmc zSe9Mt1M#CCUVWT;ok7bZogi9{$4+|IR?7N(XFXzC%C`94;%Tpx4Ts+j>Xi6$R}AXw*I35Rew@^+SI_b+!ndELK{k<#6W2KY6#+G^jFvfmwS2xeM%_Dvkmm6Ib{zE^%e@#dp#TI376Ui3I_-LJd!W_ z=n9v5Sl#En;MrWEKI*;4Bijo|KCCWy@Aqt_=WFa;L%*xBhrKgz3g|7g3Kp)Rq)Xid zY8&{9!dUqK82CkODlixOcn7h?%lI~ICFXMeJvuk~D5cT2VBJGs1N72&Ba~uaS=+xx zDW&KWB6AmT5B)1Fdg&p^_~=lGQaZf{tB0R{Cq6tN{=5sTi-%fJDr%tTu<*|UdgkbV zXN>*#is$tLZw)i&YQY!!-z4%afQoAIi13@lho8WTB8D2R5l^^O(ZGUQWeq|4eOO^f z#Phu3&=YuhW84*QN7>ThBM{w!~5t)^@Z3$S|t4A z^e1YHj#Ck<@lEPd(8fyfc<^m>2Mq?!Q$~e?ccJv%p}Qe}rS>6keiOI|sKC!CJ@l7= z%e|j~%$@4fz}H0Yf(DjZM0dv+ekuMSWn5eTRh_4-`iJPF;2a73cgTM~`Zyg|-wQtl z{O!h1Xhwb4_Z*!QnRDuw@fYY0^>^XlisVc50L@0i>H&HW=I?ve3n4?@t4)P0Iu z`XH<*)cvVi44KDON__>KIBGo{?NW~lejoiR_y%=OeOMm^{AAsTno+iI6!=tRL_H>c zJ|U7%kR9MQ9t>D2qm~9rfCmFJ>MnJi{$}-{V*ih;?eVv%Cun8ty!wi&$BaCqeij&o zq=7haeBP%XRlf;cP%qL4qW1&-L0zQB;4SuAYEkR~^^E#*>~rdJdOrLe)kbFQ$LdA( zc<@=Jw86mh&~q9wQQAH90_v{Negn7>yT72;8t+nuwq4ihD~i{XjCw4pv=_zy7wPMv ztF&hAxBl&bzl$*(!Wzdi&r!4X`Dh%FuwrZydG5g*v`x~#FVg+7E?D_V>_%;^_B_^~ zts)Z?pEtqJQLR_}+=OFvLCdJ7zzMBOlg!kfM9$2p4Dz!y=of%1>34vwwA0&x z>2M$5)ies&Lpi`3=p^6};C9j0E%30wjKEoe=LFs%R_+n}UV--s=OMwrBJfe+JR|r| z1y_o_O$l79*w5{P_X~bl@G*f|;mittpW=2sD)4FHJR|U@B10PMR02H$gBr^RHP)XJ z&I*Cs1$GNOEHEQ*R^T~-$|La<*e&pBf#em>1#TC3Sm3O{djvit@M(eM6M2E#1wO4a zhx`l=3!D{rkHCinw$n4%Z~wD)CGK13C)(Axw&Ci=bp!ZAxa#T49 zwR4(=`PGAU!OQ0^oMVF6J%zAKB6_>`(;lKpgW;_ALBLFe@lS;DVuaon{b~hI`Ir;- zGTdeejBx2M1a7F~T9*VKm(r?c$GXCN?~%&~Z@k#o@;5Vn;OvtoUMYAL1Rlnp!WWfiPh=6`1}KGRU@_oHPztlE0em?qh2<;>d<9Nl3TO9v;47&S_~n2aR(3wUtp>!p zLrZ|C0X3{8e2!ZOsNtNp9QbBHtZ~q!FfvyFzXqBVT?_cZ;9mxBprd$4{157fs!uzh zWwl;p+v8qE+tn@f2o}p;HA+91dxky`XL^h}`ALB?>39rpo7DvM`84WQS=xd-Ay0?H zSZ8N}qED*7C+c`Lul_!wT@V3|Liu+;PDPB*<@I1?b?Wk2mw$hwJ1hQqII0c zPwus?F|%0QWn0sQ{u%~w)N@OB%zzx8w9U*ob&roz23H|FPFr_OXLIA|%Bf6#{Muuq zqdPKV$MCFhXV%Q2w5L!QvZn1Zb77I|@assh%c6d$lqs1zv*`T=1_msvX!cKKCd}Tf zy|CDIthlgb=vcN;FvnTztCgA@*w-$WHoZpOzEfkl>2b5$o_ICIQWL(uN*TB?YS}Xj zy**&r$6lwn$I2hgPV6=9*Ou9bo*TCM^5c?DwY^3~uW%Sa!9Mf&G{(g^ z!fa=cV1<%(1Nv;q9@MQV>NSr{PfT!5RK>fCMRV#%Ze}=Js%5*e$M@alNer%q@*J}L zrd`DBy0EZ6f7G(4GCcKWa<3`n49jU-GmjH!2gdaP6} z7@RH@rfcZ3AS=w|XR3nxrt>9ai1161hW{m8R2!!^<2Hl9m{E$2NE4NV^@${Qn@YX+^PGESlmq*B3R`nt}}B5aGcbw+1EIWQSDC09jRy?r#24~C!Ds8 z4`raOPmuC@i9H32xtnmNI(VM}C^u}f_m<$fvpMd~W+w7h5wmeoJb|OUw<|h}dYRaR z&Xs*EHVVaZ)$*JGg$Q(E$h1#nF?8n_mz!QGA1RDu9`8FQY>7I9?5HorQx7qOk+$y%hrH5*a! zrk0++=*y~3eaELWIe3T>P%_aEJbi$)@}*2RkAP!&uxBb$M5SYSlyvMfC#G{58@*^_ zg28aF6jx^j$1mqZfSz=6s)o$SOwaw?Gi}?LR^0LItRFJPLANvp+iM&t^QCfAabgrt z$1)|_DQk1h7~PR6n$8SGlkR=~047UjFt$xO^Js}|tVt!DRk3zD=120t4rH<=sP8)k zyuX{5iG5}fdl!hv%^gHl?aml-S_9=cq;Y7gGeqABGy>hmS>fQENIe!-aKfSl!og)q zve_j)Dw6=#V%H!!)mL_PLY`mK&0cYMI z6)JdeK zus)m?@DgezE`0j7YNv3=z#WJF+L}8dn{%Ys?-d;dKnuEALs9DC>AbWhU*iL`ZySLo zw$AO$DY+NLvk86z85VlH%Jd%SoPrjbJ-5)IBF&)i2%O5H`WO`RJ&%X% z>zIP(4p=0-h9JD)C*Lh- z3*ki$Enf$Wd#iwK;C^?8jML-LeQXGR@*o<6ChnUQ9@TO$PXRk1o^GTKG%5q6I<&Zq z)0YQs3S}HAZgpv%Tt8Cw8aK-*SV`B|81#?BXQwwP$-}RzookVqM%3Ske($4w_#4D^ zJFIr&z6S$r5A8y{4k1_8!hzyM`s*m6swg0 z?dLXNs`IZDZ^_?|_*m%7YM%sz-WLec0_Pe?7*S+r#-7~lvSP$e=^55B<XC>6uMU?zdSZ*F zM?HEAuEdn42Q)nhtj+JHu17aE;o1z|cC-UkkeCWL#83dIAQJKS2fZCP@bN#8sIiIr-PkO$LFA&wbYiOpRQXd{ zAhAWVA0pwDCoy}ku{kmOF=VsSK={(^nKuoWJZTIVkkNp`+cN$w55}DKwdM}(0emg z;#S5}Rk{`{|Nj&m9(J~NZ!WhR$3T*IQ>H1;rnvOdD(IMRrdHMe1DxMc6TbDO*}2A@ z_pb=!0zS)KhwC6pUUs^dS-|-lxBXbsMge(|8p5JCh-Gh77Qdaq`S(TdFJ3|70pp8* z&Yizl;~$T$8nwdf1ys<=i*|W&>BsWLn?n9wF13bHngO?nrL1}e5CMF9eF#bwe8LIT zT`Cu9+AK1i*w{ILo3KGc46s1+8-G4$@WzF0%%ENFP8Q|6fM@Ae(aZL(m$&?7{k)?u zVv%LL)$<6;)z<5v5%|WN9p~&JX9~!4Vyvl3tM|*&%sXw~{_(F1-gQaCDqy z+&Sk|z5Tarc3|1(%>e(>=m~t|2AdOTA)d^_DsRi2Gt?w35K@}Z*KBkC*{a-r_CWUh z|7Lq@ZSRm6I@_#qY#({MS8c_=H+Gmi-3?w@$NUIZ<45?0f@9r{-r`dcA4PJq34QH4 a9Q*%Zzr)VIO}oA8KbYVD-`)Q!5%@nDHa*Ay diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/.gitignore b/prog/_jBuild/msbuild/Gaijin.Utilities/.gitignore deleted file mode 100644 index f29614119..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.vs/ -**/*.vcxproj.user -src/bin/ -src/obj/ -src/Properties/launchSettings.json \ No newline at end of file diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/Gaijin.Utilities.sln b/prog/_jBuild/msbuild/Gaijin.Utilities/Gaijin.Utilities.sln deleted file mode 100644 index 6407281f7..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/Gaijin.Utilities.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30523.141 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gaijin.Utilities", "src\Gaijin.Utilities.csproj", "{EE153C04-1847-4C86-804E-2E0983BAF50D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EE153C04-1847-4C86-804E-2E0983BAF50D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EE153C04-1847-4C86-804E-2E0983BAF50D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EE153C04-1847-4C86-804E-2E0983BAF50D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EE153C04-1847-4C86-804E-2E0983BAF50D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B304434E-32D7-45B1-9742-2A94C5B5ED10} - EndGlobalSection -EndGlobal diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateCppItems.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateCppItems.cs deleted file mode 100644 index b9b2c4847..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateCppItems.cs +++ /dev/null @@ -1,128 +0,0 @@ -using Microsoft.Build.Framework; -using System; -using System.Collections.Generic; - -namespace Gaijin.Utilities -{ - public class CreateCppItems : Microsoft.Build.Utilities.Task - { - [Output] - [Required] - public ITaskItem[] CppSource { get; set; } - public ITaskItem[] ConfigPerDirectory { get; set; } - public ITaskItem GenericCppSource { get; set; } - - public sealed override bool Execute() - { - if (CppSource == null) - { - CppSource = Array.Empty(); - return true; - } - - Array.Sort(CppSource, delegate (ITaskItem left, ITaskItem right) - { - return left.ToString().CompareTo(right.ToString()); - }); - - Array.Sort(ConfigPerDirectory, delegate (ITaskItem left, ITaskItem right) - { - return left.ToString().CompareTo(right.ToString()); - }); - - List newCppSource = new List(); - - string configurationOptions = GenericCppSource.GetMetadata("ConfigurationOptions"); - GenericCppSource.RemoveMetadata("ConfigurationOptions"); - - Span cppSource = CppSource.AsSpan(); - for (int i = 0; i < cppSource.Length; i++) - { - ref ITaskItem item = ref cppSource[i]; - string itemsDir = item.ToString(); - bool modified = false; - - string previousDir = ""; - Span configPerDirectory = ConfigPerDirectory.AsSpan(); - for (int j = 0; j < configPerDirectory.Length; j++) - { - ref ITaskItem configPerDir = ref configPerDirectory[j]; - string actualDir = configPerDir.ToString(); - if (itemsDir.StartsWith(actualDir)) - { - previousDir = actualDir; - - if (!modified) - { - modified = true; - GenericCppSource.CopyMetadataTo(item); - item.RemoveMetadata("OriginalItemSpec"); - newCppSource.Add(item); - } - - { - string additionalIncludeDirectories = configPerDir.GetMetadata("AdditionalIncludeDirectories"); - if (additionalIncludeDirectories.Length > 0) - { - string _additionalIncludeDirectories = item.GetMetadata("AdditionalIncludeDirectories"); - item.SetMetadata("AdditionalIncludeDirectories", - additionalIncludeDirectories.EndsWith("#") - ? additionalIncludeDirectories.Replace("#", _additionalIncludeDirectories) - : (_additionalIncludeDirectories.Length > 0 - ? string.Join(";", _additionalIncludeDirectories, additionalIncludeDirectories) - : additionalIncludeDirectories) - ); - } - } - - { - string forcedIncludeFiles = configPerDir.GetMetadata("ForcedIncludeFiles"); - if (forcedIncludeFiles.Length > 0) - { - string _forcedIncludeFiles = item.GetMetadata("ForcedIncludeFiles"); - item.SetMetadata("ForcedIncludeFiles", - forcedIncludeFiles.EndsWith("#") - ? forcedIncludeFiles.Replace("#", _forcedIncludeFiles) - : (_forcedIncludeFiles.Length > 0 - ? string.Join(";", _forcedIncludeFiles, forcedIncludeFiles) - : forcedIncludeFiles) - ); - } - } - - { - string preprocessorDefinitions = configPerDir.GetMetadata("PreprocessorDefinitions"); - if (preprocessorDefinitions.Length > 0) - { - string _preprocessorDefinitions = item.GetMetadata("PreprocessorDefinitions"); - item.SetMetadata("PreprocessorDefinitions", _preprocessorDefinitions.Length > 0 - ? string.Join(";", _preprocessorDefinitions, preprocessorDefinitions) - : preprocessorDefinitions); - } - } - - { - string undefinePreprocessorDefinitions = configPerDir.GetMetadata("UndefinePreprocessorDefinitions"); - if (undefinePreprocessorDefinitions.Length > 0) - { - string _undefinePreprocessorDefinitions = item.GetMetadata("UndefinePreprocessorDefinitions"); - item.SetMetadata("UndefinePreprocessorDefinitions", _undefinePreprocessorDefinitions.Length > 0 - ? string.Join(";", _undefinePreprocessorDefinitions, undefinePreprocessorDefinitions) - : undefinePreprocessorDefinitions); - } - } - } - else if (actualDir.Contains(previousDir)) - previousDir = ""; - else - break; - } - } - - GenericCppSource.SetMetadata("ConfigurationOptions", configurationOptions); - CppSource = newCppSource.Count != 0 ? newCppSource.ToArray() : Array.Empty(); - - return true; - } - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateLayout.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateLayout.cs deleted file mode 100644 index cd3662533..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateLayout.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Microsoft.Build.Framework; -using System.IO; -using System.Runtime.InteropServices; - -namespace Gaijin.Utilities -{ - public class CreateLayout : Microsoft.Build.Utilities.Task - { - [Required] - public ITaskItem[] SourceFiles { get; set; } - [Required] - public string LooseImageDir { get; set; } - - public sealed override bool Execute() - { - string lastLinkDir = @""; - for (int i = 0; i < SourceFiles.Length; i++) - { - ref var sourceFile = ref SourceFiles[i]; - if (!File.Exists(sourceFile.ItemSpec)) - { - Log.LogError(string.Format("Creating Loose Image Dir failed, the '{0}' is missing!", sourceFile.ItemSpec)); - return false; - } - - var linkDir = sourceFile.GetMetadata("LinkDir"); - if (lastLinkDir != linkDir) - { - lastLinkDir = linkDir; - linkDir = Path.Combine(LooseImageDir, linkDir); - if (!Directory.Exists(linkDir)) - Directory.CreateDirectory(linkDir); - } - - var linkName = Path.Combine(LooseImageDir, sourceFile.GetMetadata("LinkName")); - if (!File.Exists(linkName)) - { - if (!NativeMethods.CreateSymbolicLink(linkName, sourceFile.ItemSpec, NativeMethods.SymbolicLink.AllowUnprivilegedCreate)) - { - Log.LogError(string.Format("Creating symbolic link for {0} to {1} is failed. Error code: {2}", sourceFile.ItemSpec, linkName, Marshal.GetLastWin32Error())); - return false; - } - } - } - - return true; - } - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateShallowLayout.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateShallowLayout.cs deleted file mode 100644 index 609d2acb1..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/CreateShallowLayout.cs +++ /dev/null @@ -1,116 +0,0 @@ -using Microsoft.Build.Framework; -using System; -using System.ComponentModel; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; - -namespace Gaijin.Utilities -{ - public class CreateShallowLayout : Microsoft.Build.Utilities.Task - { - [Required] - public string[] SourceDirs { get; set; } - [Required] - public string LooseImageDir { get; set; } - public string LastBuildStateFile { get; set; } - - private static DateTime GetLastWriteTimeUtc(FileSystemInfo fsInfo) - { - if ((fsInfo.Attributes & FileAttributes.ReparsePoint) != 0) - { - var file = NativeMethods.CreateFile(fsInfo.FullName, NativeMethods.FILE_READ_EA, FileShare.ReadWrite | FileShare.Delete, IntPtr.Zero, FileMode.Open, NativeMethods.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); - if (file == NativeMethods.INVALID_HANDLE_VALUE) - throw new Win32Exception(); - - try - { - var sb = new StringBuilder(1024); - var res = NativeMethods.GetFinalPathNameByHandle(file, sb, 1024, 0); - if (res == 0) - throw new Win32Exception(); - - return Directory.GetLastWriteTimeUtc(sb.ToString()); - } - finally - { - NativeMethods.CloseHandle(file); - } - } - - return fsInfo.LastWriteTimeUtc; - } - - private bool CheckUptoDate() - { - var looseImageInfo = new DirectoryInfo(LooseImageDir); - if (!looseImageInfo.Exists) - return false; - - var looseImageDirTime = GetLastWriteTimeUtc(looseImageInfo); - - var lastBuildStateInfo = new FileInfo(LastBuildStateFile); - if (lastBuildStateInfo.Exists && GetLastWriteTimeUtc(lastBuildStateInfo) < looseImageDirTime) - return false; - - for (int i = 0; i < SourceDirs.Length; i++) - { - var sourceDirInfo = new DirectoryInfo(SourceDirs[i]); - if (!sourceDirInfo.Exists || looseImageDirTime < GetLastWriteTimeUtc(sourceDirInfo)) - return false; - } - - return true; - } - - public sealed override bool Execute() - { - if (CheckUptoDate()) - return true; - - if (Directory.Exists(LooseImageDir)) - Directory.Delete(LooseImageDir, true); - - Directory.CreateDirectory(LooseImageDir); - - for (int i = 0; i < SourceDirs.Length; i++) - { - ref var sourceDir = ref SourceDirs[i]; - if (!Directory.Exists(sourceDir)) - continue; - - var directories = Directory.GetDirectories(sourceDir, "*", SearchOption.TopDirectoryOnly); - for (int j = 0; j < directories.Length; j++) - { - ref var dir = ref directories[j]; - var targetDir = Path.Combine(LooseImageDir, Path.GetFileName(dir)); - if (Directory.Exists(targetDir)) - continue; - - if (NativeMethods.CreateSymbolicLink(targetDir, dir, NativeMethods.SymbolicLink.Directory | NativeMethods.SymbolicLink.AllowUnprivilegedCreate)) - continue; - - Log.LogError(string.Format("Creating symbolic link for {0} to {1} is failed. Error code: {2}", targetDir, dir, Marshal.GetLastWin32Error())); - return false; - } - - var files = Directory.GetFiles(sourceDir, "*", SearchOption.TopDirectoryOnly); - for (int j = 0; j < files.Length; j++) - { - ref var file = ref files[j]; - var targetFile = Path.Combine(LooseImageDir, Path.GetFileName(file)); - if (File.Exists(targetFile)) - continue; - - if (NativeMethods.CreateSymbolicLink(targetFile, file, NativeMethods.SymbolicLink.File | NativeMethods.SymbolicLink.AllowUnprivilegedCreate)) - continue; - - Log.LogError(string.Format("Creating symbolic link for {0} to {1} is failed. Error code: {2}", targetFile, file, Marshal.GetLastWin32Error())); - return false; - } - } - - return true; - } - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/Exec.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/Exec.cs deleted file mode 100644 index e79af5a40..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/Exec.cs +++ /dev/null @@ -1,126 +0,0 @@ -using Microsoft.Build.Framework; -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Management; -using System.Text.RegularExpressions; -using System.Threading; - -namespace Gaijin.Utilities -{ - public class Exec : Microsoft.Build.Tasks.Exec - { - readonly Regex regexrg; - readonly Regex regexUnit; - readonly Regex regexProgress; - - private int targetCount = 0; - private int targetIndex = 0; - - public Exec() : base() - { - regexrg = new Regex("(^\\.\\.?\\/[^\\n\" ?: *<>|]+\\.[A-z0 - 9]+)(.*)"); - regexUnit = new Regex(@"\.(?:cpp|c|cc|inl|lib|asm|masm|das|rc|exe)$"); - regexProgress = new Regex(@"^\.{3}on \d+th target\.{3}$"); - } - - protected override void LogEventsFromTextOutput(string singleLine, MessageImportance messageImportance) - { - if (singleLine.StartsWith("...") || singleLine.StartsWith("\f...")) - { - if (singleLine.StartsWith("...patience...")) - return; - if (regexProgress.IsMatch(singleLine)) - return; - - if (singleLine.StartsWith("...updating") && singleLine.EndsWith("target(s)...")) - { - var count = singleLine.Substring(12); - var space = count.IndexOf(' '); - int.TryParse(count.Substring(0, space), out int tmpTargetCount); - targetCount += tmpTargetCount; - } - - Log.LogMessageFromText(string.Join(" ", "JAM:", singleLine.Substring(3, singleLine.Length - 6)), messageImportance); - return; - } - else if (singleLine.StartsWith("../")) - { - var groups = regexrg.Split(singleLine); - if (groups.Length == 4) - { - var fullPath = Path.GetFullPath(Path.Combine(GetWorkingDirectory(), groups[1])); - Log.LogMessageFromText(string.Join("", fullPath, groups[2]), messageImportance); - return; - } - } - else if (singleLine.StartsWith(@"..\")) - { - int parentIndex = singleLine.IndexOf('(') - 1; - if (parentIndex > 0) - { - var fullPath = Path.GetFullPath(Path.Combine(GetWorkingDirectory(), singleLine.Substring(0, parentIndex))); - Log.LogMessageFromText(string.Join("", fullPath, singleLine.Substring(parentIndex)), messageImportance); - return; - } - } - - if (regexUnit.IsMatch(singleLine) && !singleLine.Equals("buildStamp.c")) - singleLine = string.Join("", "[", ++targetIndex, "/", targetCount, "] ", singleLine); - else if (singleLine.Equals(".")) - singleLine = ""; - else if (singleLine.StartsWith(@"* copy file to:")) - ++targetIndex; - - Log.LogMessageFromText(singleLine, messageImportance); - } - - public static void StopProgram(uint pid) - { - // It's impossible to be attached to 2 consoles at the same time, - // so release the current one. - NativeMethods.FreeConsole(); - - // This does not require the console window to be visible. - if (NativeMethods.AttachConsole(pid)) - { - // Disable Ctrl-C handling for our program - NativeMethods.SetConsoleCtrlHandler(null, true); - NativeMethods.GenerateConsoleCtrlEvent(NativeMethods.CtrlTypes.CTRL_C_EVENT, 0); - - // Must wait here. If we don't and re-enable Ctrl-C - // handling below too fast, we might terminate ourselves. - Thread.Sleep(2000); - - NativeMethods.FreeConsole(); - - // Re-enable Ctrl-C handling or any subsequently started - // programs will inherit the disabled state. - NativeMethods.SetConsoleCtrlHandler(null, false); - } - } - - public override void Cancel() - { - ManagementObjectSearcher mos = new ManagementObjectSearcher( - string.Format("Select * From Win32_Process Where ParentProcessID={0}", Process.GetCurrentProcess().Id)); - - foreach (ManagementObject mo in mos.Get().Cast()) - { - var name = Convert.ToString(mo["Name"]); - if (name == "cmd.exe") - { - int childProcessID = Convert.ToInt32(mo["ProcessID"]); - var childProcess = Process.GetProcessById(childProcessID); - StopProgram((uint)childProcessID); - childProcess.WaitForExit(); - - break; - } - } - - base.Cancel(); - } - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/ExecShaderCompiler.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/ExecShaderCompiler.cs deleted file mode 100644 index e725da21b..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/ExecShaderCompiler.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Microsoft.Build.Framework; -using System.IO; -using System.Text.RegularExpressions; - -namespace Gaijin.Utilities -{ - public class ExecShaderCompiler : Microsoft.Build.Tasks.Exec - { - readonly Regex regexrg; - - public ExecShaderCompiler() : base() - { - regexrg = new Regex("(\\[(ERROR|WARNING)\\]) ([\\S]*.sh)(\\(\\d*,\\d*\\)):(.*)"); - } - - protected override void LogEventsFromTextOutput(string singleLine, MessageImportance messageImportance) - { - var groups = regexrg.Split(singleLine); - - if (groups.Length == 7) - { - Log.LogMessageFromText(Path.GetFullPath(Path.Combine(GetWorkingDirectory(), groups[3])) + groups[4] + (groups[2].Equals("ERROR") ? ": error :" : ": warning :") + groups[5], MessageImportance.High); - } - else - { - Log.LogMessageFromText(singleLine, messageImportance); - } - } - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/Gaijin.Utilities.csproj b/prog/_jBuild/msbuild/Gaijin.Utilities/src/Gaijin.Utilities.csproj deleted file mode 100644 index 9d26e0c04..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/Gaijin.Utilities.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - net472 - Gaijin.Utilities - Andras Nyiscsak - Gaijin - $(SolutionDir)..\ - - - - none - - - - - - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/GetCompileCmdOfSelectedFiles.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/GetCompileCmdOfSelectedFiles.cs deleted file mode 100644 index dfd32e455..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/GetCompileCmdOfSelectedFiles.cs +++ /dev/null @@ -1,135 +0,0 @@ -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; - -namespace Gaijin.Utilities -{ - public class GetCompileCmdOfSelectedFiles : Microsoft.Build.Utilities.Task - { - [Required] - public string BuildCommand { get; set; } - [Required] - public string WorkDirectory { get; set; } - [Required] - public string[] SelectedFiles { get; set; } - public string[] ExcludeArgs { get; set; } - - [Output] - public ITaskItem[] Commands { get; set; } - [Output] - public ITaskItem[] SkippedFiles { get; set; } - - public sealed override bool Execute() - { - Process jamBuild = new Process(); - jamBuild.StartInfo.UseShellExecute = false; - jamBuild.StartInfo.RedirectStandardOutput = true; - jamBuild.StartInfo.FileName = "jam"; - jamBuild.StartInfo.Arguments = BuildCommand + " -a -n"; - jamBuild.StartInfo.WorkingDirectory = WorkDirectory; - - var selectedFiles = new List(); - foreach (var selectedFile in SelectedFiles) - { - selectedFiles.Add(selectedFile.Replace('\\', '/')); - } - - jamBuild.Start(); - string buildLog = jamBuild.StandardOutput.ReadToEnd(); - jamBuild.WaitForExit(); - - var commands = new List(); - - using (StringReader reader = new StringReader(buildLog)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - bool executionLine = false; - int skipLeadingChar = 0; - - if (line.StartsWith(" call_filtered ")) - { - executionLine = true; - skipLeadingChar = 16; - } - else if (line.StartsWith(" call ")) - { - executionLine = true; - skipLeadingChar = 7; - } - - if (executionLine) - { - foreach (var selectedFile in selectedFiles) - { - bool rightLine = false; - - if (line.EndsWith(selectedFile + ")\\#")) - { - rightLine = true; - line = line.Substring(0, line.Length - 3).Replace("#\\(", ""); - } - else if (line.EndsWith(selectedFile)) - { - rightLine = true; - } - - if (rightLine) - { - selectedFiles.Remove(selectedFile); - - int outputPosition = line.LastIndexOf("-Fo") + 3; - if (outputPosition == 2) - outputPosition = line.LastIndexOf(" -o ") + 4; - if (outputPosition == 3) - return false; - int lastSpace = line.LastIndexOf(" "); - - var outDir = Path.GetDirectoryName(new Uri(WorkDirectory + line.Substring(outputPosition, lastSpace - outputPosition)).LocalPath); - if (!Directory.Exists(outDir)) - { - Directory.CreateDirectory(outDir); - } - - var command = line.Substring(skipLeadingChar, line.Length - skipLeadingChar); - - foreach (var excludeArg in ExcludeArgs) - { - command = command.Replace(excludeArg, ""); - } - - var commandItem = new TaskItem(command); - commandItem.SetMetadata("File", selectedFile.Replace('/', '\\')); - commands.Add(commandItem); - - break; - } - } - - if (selectedFiles.Count == 0) - { - break; - } - } - } - } - - Commands = commands.ToArray(); - - if (selectedFiles.Count > 0) - { - SkippedFiles = new TaskItem[selectedFiles.Count]; - for (int i = 0; i < selectedFiles.Count; i++) - { - SkippedFiles[i] = new TaskItem(selectedFiles[i].Replace('/', '\\')); - } - } - - return true; - } - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/NativeMethods.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/NativeMethods.cs deleted file mode 100644 index 86c9f05a7..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/NativeMethods.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; - -namespace Gaijin.Utilities -{ - internal static class NativeMethods - { - internal static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); - - internal const uint FILE_READ_EA = 0x0008; - internal const uint FILE_FLAG_BACKUP_SEMANTICS = 0x2000000; - - [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern uint GetFinalPathNameByHandle(IntPtr hFile, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder lpszFilePath, uint cchFilePath, uint dwFlags); - - [DllImport("kernel32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool CloseHandle(IntPtr hObject); - - [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern IntPtr CreateFile( - [MarshalAs(UnmanagedType.LPWStr)] string filename, - [MarshalAs(UnmanagedType.U4)] uint access, - [MarshalAs(UnmanagedType.U4)] FileShare share, - IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero - [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, - [MarshalAs(UnmanagedType.U4)] uint flagsAndAttributes, - IntPtr templateFile); - - [StructLayout(LayoutKind.Sequential)] - internal struct WIN32_FILE_ATTRIBUTE_DATA - { - internal int fileAttributes; - internal uint ftCreationTimeLow; - internal uint ftCreationTimeHigh; - internal uint ftLastAccessTimeLow; - internal uint ftLastAccessTimeHigh; - internal uint ftLastWriteTimeLow; - internal uint ftLastWriteTimeHigh; - internal uint fileSizeHigh; - internal uint fileSizeLow; - } - - [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern bool GetFileAttributesEx(string name, int fileInfoLevel, ref WIN32_FILE_ATTRIBUTE_DATA lpFileInformation); - - internal enum SymbolicLink - { - File = 0, - Directory = 1, - AllowUnprivilegedCreate = 2 - } - - [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, SymbolicLink dwFlags); - - - // Enumerated type for the control messages sent to the handler routine - internal enum CtrlTypes : uint - { - CTRL_C_EVENT = 0, - CTRL_BREAK_EVENT, - CTRL_CLOSE_EVENT, - CTRL_LOGOFF_EVENT = 5, - CTRL_SHUTDOWN_EVENT - } - - [DllImport("kernel32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool GenerateConsoleCtrlEvent(CtrlTypes dwCtrlEvent, uint dwProcessGroupId); - - [DllImport("kernel32.dll", SetLastError = true)] - internal static extern bool AttachConsole(uint dwProcessId); - - [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] - internal static extern bool FreeConsole(); - - [DllImport("kernel32.dll")] - internal static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate handler, bool add); - - // Delegate type to be used as the Handler Routine for SCCH - internal delegate bool ConsoleCtrlDelegate(CtrlTypes type); - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/RemoveDir.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/RemoveDir.cs deleted file mode 100644 index 9d73adc14..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/RemoveDir.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.Build.Framework; - -namespace Gaijin.Utilities -{ - public class RemoveDir : Microsoft.Build.Utilities.Task - { - [Required] - public string Directory { get; set; } - - public sealed override bool Execute() - { - if (System.IO.Directory.Exists(Directory)) - { - System.IO.Directory.Delete(Directory, true); - } - return !System.IO.Directory.Exists(Directory); - } - } -} diff --git a/prog/_jBuild/msbuild/Gaijin.Utilities/src/UpdateExplicitCppSources.cs b/prog/_jBuild/msbuild/Gaijin.Utilities/src/UpdateExplicitCppSources.cs deleted file mode 100644 index a37ee3280..000000000 --- a/prog/_jBuild/msbuild/Gaijin.Utilities/src/UpdateExplicitCppSources.cs +++ /dev/null @@ -1,109 +0,0 @@ -using Microsoft.Build.Framework; -using System; - -namespace Gaijin.Utilities -{ - public class UpdateExplicitCppSources : Microsoft.Build.Utilities.Task - { - [Output] - [Required] - public ITaskItem[] CppSource { get; set; } - public ITaskItem[] ConfigPerDirectory { get; set; } - - public sealed override bool Execute() - { - if (CppSource == null) - { - CppSource = Array.Empty(); - return true; - } - - Array.Sort(CppSource, delegate (ITaskItem left, ITaskItem right) - { - return left.ToString().CompareTo(right.ToString()); - }); - - Array.Sort(ConfigPerDirectory, delegate (ITaskItem left, ITaskItem right) - { - return left.ToString().CompareTo(right.ToString()); - }); - - Span cppSource = CppSource.AsSpan(); - for (int i = 0; i < cppSource.Length; i++) - { - ref ITaskItem item = ref cppSource[i]; - string itemsDir = item.ToString(); - - string previousDir = ""; - Span configPerDirectory = ConfigPerDirectory.AsSpan(); - for (int j = 0; j < configPerDirectory.Length; j++) - { - ref ITaskItem configPerDir = ref configPerDirectory[j]; - string actualDir = configPerDir.ToString(); - if (itemsDir.StartsWith(actualDir)) - { - previousDir = actualDir; - - { - string additionalIncludeDirectories = configPerDir.GetMetadata("AdditionalIncludeDirectories"); - if (additionalIncludeDirectories.Length > 0) - { - string _additionalIncludeDirectories = item.GetMetadata("AdditionalIncludeDirectories"); - item.SetMetadata("AdditionalIncludeDirectories", - additionalIncludeDirectories.EndsWith("#") - ? additionalIncludeDirectories.Replace("#", _additionalIncludeDirectories) - : (_additionalIncludeDirectories.Length > 0 - ? string.Join(";", _additionalIncludeDirectories, additionalIncludeDirectories) - : additionalIncludeDirectories) - ); - } - } - - { - string forcedIncludeFiles = configPerDir.GetMetadata("ForcedIncludeFiles"); - if (forcedIncludeFiles.Length > 0) - { - string _forcedIncludeFiles = item.GetMetadata("ForcedIncludeFiles"); - item.SetMetadata("ForcedIncludeFiles", - forcedIncludeFiles.EndsWith("#") - ? forcedIncludeFiles.Replace("#", _forcedIncludeFiles) - : (_forcedIncludeFiles.Length > 0 - ? string.Join(";", _forcedIncludeFiles, forcedIncludeFiles) - : forcedIncludeFiles) - ); - } - } - - { - string preprocessorDefinitions = configPerDir.GetMetadata("PreprocessorDefinitions"); - if (preprocessorDefinitions.Length > 0) - { - string _preprocessorDefinitions = item.GetMetadata("PreprocessorDefinitions"); - item.SetMetadata("PreprocessorDefinitions", _preprocessorDefinitions.Length > 0 - ? string.Join(";", _preprocessorDefinitions, preprocessorDefinitions) - : preprocessorDefinitions); - } - } - - { - string undefinePreprocessorDefinitions = configPerDir.GetMetadata("UndefinePreprocessorDefinitions"); - if (undefinePreprocessorDefinitions.Length > 0) - { - string _undefinePreprocessorDefinitions = item.GetMetadata("UndefinePreprocessorDefinitions"); - item.SetMetadata("UndefinePreprocessorDefinitions", _undefinePreprocessorDefinitions.Length > 0 - ? string.Join(";", _undefinePreprocessorDefinitions, undefinePreprocessorDefinitions) - : undefinePreprocessorDefinitions); - } - } - } - else if (actualDir.Contains(previousDir)) - previousDir = ""; - else - break; - } - } - - return true; - } - } -} diff --git a/prog/_jBuild/msbuild/UI/bat.xml b/prog/_jBuild/msbuild/UI/bat.xml deleted file mode 100644 index df23794f4..000000000 --- a/prog/_jBuild/msbuild/UI/bat.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/UI/debugger_remote_windows.xml b/prog/_jBuild/msbuild/UI/debugger_remote_windows.xml deleted file mode 100644 index 8e35ccedf..000000000 --- a/prog/_jBuild/msbuild/UI/debugger_remote_windows.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/gaijin_items.xml b/prog/_jBuild/msbuild/UI/gaijin_items.xml deleted file mode 100644 index 9e2693b34..000000000 --- a/prog/_jBuild/msbuild/UI/gaijin_items.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/UI/general.xml b/prog/_jBuild/msbuild/UI/general.xml deleted file mode 100644 index bac584a75..000000000 --- a/prog/_jBuild/msbuild/UI/general.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/generaltrue.xml b/prog/_jBuild/msbuild/UI/generaltrue.xml deleted file mode 100644 index fc9dc84f5..000000000 --- a/prog/_jBuild/msbuild/UI/generaltrue.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/isense.xml b/prog/_jBuild/msbuild/UI/isense.xml deleted file mode 100644 index 882bb13f7..000000000 --- a/prog/_jBuild/msbuild/UI/isense.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/linux.xml b/prog/_jBuild/msbuild/UI/linux.xml deleted file mode 100644 index 71be3fd5a..000000000 --- a/prog/_jBuild/msbuild/UI/linux.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/natvis.xml b/prog/_jBuild/msbuild/UI/natvis.xml deleted file mode 100644 index 66c5c1677..000000000 --- a/prog/_jBuild/msbuild/UI/natvis.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/UI/shader.xml b/prog/_jBuild/msbuild/UI/shader.xml deleted file mode 100644 index fcf1a9582..000000000 --- a/prog/_jBuild/msbuild/UI/shader.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/shader_compiler.xml b/prog/_jBuild/msbuild/UI/shader_compiler.xml deleted file mode 100644 index 9494ce459..000000000 --- a/prog/_jBuild/msbuild/UI/shader_compiler.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/shader_compiler_item.xml b/prog/_jBuild/msbuild/UI/shader_compiler_item.xml deleted file mode 100644 index 29b0c6730..000000000 --- a/prog/_jBuild/msbuild/UI/shader_compiler_item.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/prog/_jBuild/msbuild/UI/tools_general.xml b/prog/_jBuild/msbuild/UI/tools_general.xml deleted file mode 100644 index 7a5ef675b..000000000 --- a/prog/_jBuild/msbuild/UI/tools_general.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/after_user_import.props b/prog/_jBuild/msbuild/after_user_import.props deleted file mode 100644 index 035908d0e..000000000 --- a/prog/_jBuild/msbuild/after_user_import.props +++ /dev/null @@ -1,9 +0,0 @@ - - - - $(MSPlatform) - true - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/android.targets b/prog/_jBuild/msbuild/android.targets deleted file mode 100644 index edecfe871..000000000 --- a/prog/_jBuild/msbuild/android.targets +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/bat.targets b/prog/_jBuild/msbuild/bat.targets deleted file mode 100644 index e9ae99cf9..000000000 --- a/prog/_jBuild/msbuild/bat.targets +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - SelectedBat - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/common.targets b/prog/_jBuild/msbuild/common.targets deleted file mode 100644 index 1a784290a..000000000 --- a/prog/_jBuild/msbuild/common.targets +++ /dev/null @@ -1,348 +0,0 @@ - - - - - - - - - - - - - - - - - - $(RemoteRootDir) - $(RemoteRootDir)$(RelativeExeDir)$(ExeName) - $(RemoteRootDir)$(RelativeExeDir) - $(JamOutput) - - - - $(JamBuildCommandLine) - $(JamReBuildCommandLine) - $(JamCleanCommandLine) - - - - false - - Use - - - - - $(AdditionalOptions) - $(NMakeForcedIncludes);$(PrecompiledHeaderFile) - $(NMakeForcedUsingAssemblies) - $(NMakePreprocessorDefinitions) - - - - - - - - - - - - - - - - - - - - false - - - - - <_ProjectDirectories Include="dummy"> - $(NMakeIncludeSearchPath);$(CommonIncludeDirs) - - $(ExcludePath) - $(NMakeAssemblySearchPath) - $(ProjectRootDir) - $(ToolsetISenseIdentifier) - - - - - - - $(IntDir)$(ProjectGuid) - $([MSBuild]::MakeRelative($(SolutionDir), $(ProjectPath))) - - - - - - - - - - $(AdditionalOptions) - CompileAsCpp - true - $(NMakeForcedIncludes);$(PrecompiledHeaderFile) - $(NMakeForcedUsingAssemblies) - $(NMakePreprocessorDefinitions) - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - Set_DEVTOOLEnvironmentVariables; - $(SetBuildDefaultEnvironmentVariablesDependsOn) - - - - SetBuildDefaultEnvironmentVariables - - - - - - Application - - - - - CompileSelectedFiles - - - - - - - File - - - - - - Project - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(NMakeBuildCommandLine.Replace('jam', '')) - -sPlatform=$(daPlatform) -sConfig=$(daConfig) $(AdjunctOptions) $(daBuildAdditionalOptions) - - $(ProjectRootDir) - $(DefaultProjectDir) - - - - - - - - - - - - - - - - - - - - - - $(Configuration)|$(Platform)|$(SolutionDir)|$(ProjectEvaluationFingerprint) - - - $(Configuration)|$(Platform)|$(ProjectEvaluationFingerprint) - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.daNetGames.props b/prog/_jBuild/msbuild/config.daNetGames.props deleted file mode 100644 index 0e3e74d7e..000000000 --- a/prog/_jBuild/msbuild/config.daNetGames.props +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - $(GameDir)$(daPlatform)\ - $(daPlatform)\ - $(GameDir) - - - - - - $(GameDir)$(daPlatform)\$(daConfig)\ - $(IntDir)$(ProjectName)\xb1_gdk\ - $(OutDir)gameos.xvd - RegisterNetworkShare - - - - - - $(GameDir)$(daPlatform)\$(daConfig)\ - $(IntDir)$(ProjectName)\xsx\ - $(OutDir)gameos.xvd - RegisterNetworkShare - - - - - - $(IntDir)$(ProjectName)\ps4\ - $(GameDir)$(daPlatform)\$(ProjectName)\ - $(LayoutDir) - - - - - - $(GameDir)$(daPlatform)\$(ProjectName)\ - UseGP5File - $(OutDir)scee\workspace_layout.gp5 - - - - - - $(GameDir)$(daPlatform)\$(ProjectName)\ - $(JamOutput) - $(OutDir) - - - - - - $(GameDir)$(daPlatform)\ - LinuxDebugger - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.eden.props b/prog/_jBuild/msbuild/config.eden.props deleted file mode 100644 index e8eb1f4d5..000000000 --- a/prog/_jBuild/msbuild/config.eden.props +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - $(GameDir) - - - - - - - - - - LinuxDebugger - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.internal.daNetGames.props b/prog/_jBuild/msbuild/config.internal.daNetGames.props deleted file mode 100644 index a3db6fc90..000000000 --- a/prog/_jBuild/msbuild/config.internal.daNetGames.props +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - $(OutDir)$(GameName)$(NameSuffix).exe - $(GameName)$(NameSuffix).exe - - - - - - $(OutDir)$(GameName)$(NameSuffix).exe - - - - - - $(OutDir)$(GameName)$(NameSuffix).exe - - - - - - $(OutDir)$(GameName)$(NameSuffix).self - - - - - - $(OutDir)$(GameName)$(NameSuffix).self - - - - - - $(OutDir)$(GameName)$(NameSuffix).apk - $(JamOutput) - - - - - - $(RemoteDeployDir)$(RelativeGameDir.Replace('\', '/')) - $(RemoteGameDir)$(daPlatform)/ - $(RemoteOutDir)$(GameName)$(NameSuffix) - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.internal.eden.props b/prog/_jBuild/msbuild/config.internal.eden.props deleted file mode 100644 index a5129d4d5..000000000 --- a/prog/_jBuild/msbuild/config.internal.eden.props +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - $(GameDir)$(daPlatform)\ - $(OutDir)$(GameName)$(NameSuffix).exe - $(GameName)$(NameSuffix).exe - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.internal.props b/prog/_jBuild/msbuild/config.internal.props deleted file mode 100644 index 5dc3d3427..000000000 --- a/prog/_jBuild/msbuild/config.internal.props +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - $(AdjunctOptions) -sDedicated=no - - - - - - $(AdjunctOptions) -sDedicated=yes - $(NameSuffix)-ded - - - - - - - - $(AdjunctOptions) -sSanitize=address - $(NameSuffix)-asan - $(NMakePreprocessorDefinitions);DAGOR_PREFER_HEAP_ALLOCATION=1;DAGOR_ADDRESS_SANITIZER=1;__SANITIZE_ADDRESS__=1 - - - - - - $(AdjunctOptions) -sSanitize=thread - $(NameSuffix)-tsan - $(NMakePreprocessorDefinitions);__SANITIZE_THREAD__ - - - - - - $(AdjunctOptions) -sNeedDasAotCompile=no - $(AdjunctOptions) -sNeedDasAotCompile=yes - - - - - - $(NameSuffix)-dbg - $(NMakePreprocessorDefinitions);DAGOR_DBGLEVEL=2;_DEBUG_TAB_ - - - - - - $(NameSuffix)-dev - $(NMakePreprocessorDefinitions);DAGOR_DBGLEVEL=1 - - - - - - $(NMakePreprocessorDefinitions);DAGOR_DBGLEVEL=0;NDEBUG=1;DAGOR_FORCE_LOGS=1 - - - - - - jam -sPlatform=$(daPlatform) -sConfig=$(daConfig) $(AdjunctOptions) $(daBuildAdditionalOptions) - jam -sGame=$(GameName) -sPlatform=$(daPlatform) -sConfig=$(daConfig) $(AdjunctOptions) $(daBuildAdditionalOptions) - $(JamBuildCommandLine) -a - $(JamBuildCommandLine) clean_all - - - - - - $(JamOutput) - $(JamOutput) - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.internal.sample.props b/prog/_jBuild/msbuild/config.internal.sample.props deleted file mode 100644 index eca139c5f..000000000 --- a/prog/_jBuild/msbuild/config.internal.sample.props +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - $(GameDir)\ - $(OutDir)$(GameName)-$(daPlatform)$(NameSuffix).exe - $(GameName)$(NameSuffix).exe - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.internal.skyquake.props b/prog/_jBuild/msbuild/config.internal.skyquake.props deleted file mode 100644 index a3db6fc90..000000000 --- a/prog/_jBuild/msbuild/config.internal.skyquake.props +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - $(OutDir)$(GameName)$(NameSuffix).exe - $(GameName)$(NameSuffix).exe - - - - - - $(OutDir)$(GameName)$(NameSuffix).exe - - - - - - $(OutDir)$(GameName)$(NameSuffix).exe - - - - - - $(OutDir)$(GameName)$(NameSuffix).self - - - - - - $(OutDir)$(GameName)$(NameSuffix).self - - - - - - $(OutDir)$(GameName)$(NameSuffix).apk - $(JamOutput) - - - - - - $(RemoteDeployDir)$(RelativeGameDir.Replace('\', '/')) - $(RemoteGameDir)$(daPlatform)/ - $(RemoteOutDir)$(GameName)$(NameSuffix) - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.internal.tool.props b/prog/_jBuild/msbuild/config.internal.tool.props deleted file mode 100644 index d7a0209d1..000000000 --- a/prog/_jBuild/msbuild/config.internal.tool.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - $(OutDir)$(ProjectName)-$(ToolAdditionalName)$(NameSuffix).exe - $(ProjectName)-$(ToolAdditionalName)$(NameSuffix).exe - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.props b/prog/_jBuild/msbuild/config.props deleted file mode 100644 index f4777b3dd..000000000 --- a/prog/_jBuild/msbuild/config.props +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - jam -sPlatform=$(daPlatform) -sConfig=$(daConfig) $(AdjunctOptions) $(daBuildAdditionalOptions) - jam -sGame=$(GameName) -sPlatform=$(daPlatform) -sConfig=$(daConfig) $(AdjunctOptions) $(daBuildAdditionalOptions) - $(JamBuildCommandLine) -a - $(JamBuildCommandLine) clean_all - $(JamOutput) - - - - $(RemoteRootDir)$(RelativeExeDir)$(ExeName) - $(RemoteDebuggerCommand) - $(RemoteRootDir)$(RelativeExeDir) - $(DeploymentDirectory) - $(JamOutput) - $(AdditionalFiles) - - - - /opt/devtools/ - /opt/dagor2/ - $(RemoteDeployDir)$(RelativeGameDir.Replace('\', '/')) - $(RemoteGameDir)$(daPlatform)/ - $(JamOutput) - $(RemoteGameDir) - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.sample.props b/prog/_jBuild/msbuild/config.sample.props deleted file mode 100644 index e8eb1f4d5..000000000 --- a/prog/_jBuild/msbuild/config.sample.props +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - $(GameDir) - - - - - - - - - - LinuxDebugger - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.skyquake.props b/prog/_jBuild/msbuild/config.skyquake.props deleted file mode 100644 index 5d8af9cbe..000000000 --- a/prog/_jBuild/msbuild/config.skyquake.props +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - $(GameDir)$(daPlatform)\ - $(daPlatform)\ - $(GameDir) - - - - - - $(GameDir)$(daPlatform)\$(Configuration)\ - $(IntDir)$(ProjectName)\xb1_gdk\ - $(OutDir)gameos.xvd - RegisterNetworkShare - - - - - - $(GameDir)$(daPlatform)\$(daConfig)\ - $(IntDir)$(ProjectName)\xsx\ - $(OutDir)gameos.xvd - RegisterNetworkShare - - - - - - $(IntDir)$(ProjectName)\ps4\ - $(GameDir)$(daPlatform)\ - $(LayoutDir) - - - - - - $(GameDir)$(daPlatform)\ - UseGP5File - $(OutDir)scee\workspace_layout.gp5 - - - - - - $(GameDir) - $(JamOutput) - $(OutDir) - - - - - - $(GameDir)$(daPlatform)\ - LinuxDebugger - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/config.tool.props b/prog/_jBuild/msbuild/config.tool.props deleted file mode 100644 index 40fdf6977..000000000 --- a/prog/_jBuild/msbuild/config.tool.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - LinuxDebugger - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/daEditor.args.json b/prog/_jBuild/msbuild/daEditor.args.json deleted file mode 100644 index a50d2db97..000000000 --- a/prog/_jBuild/msbuild/daEditor.args.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "FileVersion": 2, - "Id": "ecd2b489-d18f-421c-ba49-b13f89775ba3", - "Items": [ - { - "Id": "ef947010-a423-4014-8815-fd3fa3f942e9", - "Command": "Driver", - "ExclusiveMode": true, - "Items": [ - { - "Id": "ff2f3bb1-42bc-4d94-9a03-5be8cef52506", - "Command": "DX11", - "Items": [ - { - "Id": "421f75c4-122f-439f-b103-1686127c820f", - "Command": "Debug", - "ExclusiveMode": true, - "Items": [ - { - "Id": "afa21d18-5828-4364-8713-140b9237e7ba", - "Command": "" - }, - { - "Id": "5108fcdd-9dd1-467f-a3e5-765d6298b092", - "Command": "-config:directx/debug:b=no" - }, - { - "Id": "06b21892-2546-4384-a5d0-8dcd0d72bbb2", - "Command": "-config:directx/debug:b=yes" - } - ] - } - ] - } - ] - }, - { - "Id": "980b6308-7eb6-4490-abd6-faab874c85f6", - "Command": "-ws:enlisted" - } - ] -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/daEditor.vcxproj b/prog/_jBuild/msbuild/daEditor.vcxproj deleted file mode 100644 index 2269a2f4e..000000000 --- a/prog/_jBuild/msbuild/daEditor.vcxproj +++ /dev/null @@ -1,110 +0,0 @@ - - - - - Any - x64 - - - - - {ecd2b489-d18f-421c-ba49-b13f89775ba3} - - Microsoft.VisualStudio.Component.VC.Tools.x86.x64 - - GPURefBreakOncePerWarp - {F4453496-1DB8-47F8-A7D5-31EBDDC2EC96} - {F4453496-1DB8-47F8-A7D5-31EBDDC2EC96} - - true - - $(SolutionDir)_output\ - $(OutDir)msbuild\$(MSBuildProjectName)\ - - $(SolutionDir)prog\tools\ - - daNetGames - - $(SolutionDir)tools\dagor3_cdk\bin64\daEditor3x-dev.exe - $(SolutionDir)tools\dagor3_cdk\bin64\daEditor3x-dev.exe - - -ws:enlisted - $(SolutionDir)enlisted\ - - true - WindowsLocalDebugger - NativeOnly - true - true - Auto - true - false - - Application - - - - - - -ws:skyquake - $(SolutionDir)skyquake\ - - - - $(GameRootDir)develop - - - - - $(IntDir)$(Configuration).log - - - - - - - - - Project - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectDirectories Include="dummy"> - $(ProjectDir) - - - - - - - true - - $(ProjectDir) - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/daViewer.vcxproj b/prog/_jBuild/msbuild/daViewer.vcxproj deleted file mode 100644 index eb6704358..000000000 --- a/prog/_jBuild/msbuild/daViewer.vcxproj +++ /dev/null @@ -1,109 +0,0 @@ - - - - - Any - x64 - - - - - {01A47C18-B7A4-48E1-8F19-97E03A67326E} - - Microsoft.VisualStudio.Component.VC.Tools.x86.x64 - - GPURefBreakOncePerWarp - {F4453496-1DB8-47F8-A7D5-31EBDDC2EC96} - {F4453496-1DB8-47F8-A7D5-31EBDDC2EC96} - - true - - $(SolutionDir)_output\ - $(OutDir)msbuild\$(MSBuildProjectName)\ - - $(SolutionDir)prog\tools\ - - daNetGames - - $(SolutionDir)tools\dagor3_cdk\bin64\assetViewer2-dev.exe - $(SolutionDir)tools\dagor3_cdk\bin64\assetViewer2-dev.exe - - $(SolutionDir)enlisted\ - - true - WindowsLocalDebugger - NativeOnly - true - true - Auto - true - false - - Application - - - - - - $(SolutionDir)skyquake\ - - - - $(GameRootDir)application.blk - $(GameRootDir)develop - - - - - $(IntDir)$(Configuration).log - - - - - - - - - Project - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectDirectories Include="dummy"> - $(ProjectDir) - - - - - - - true - - $(ProjectDir) - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/default.props b/prog/_jBuild/msbuild/default.props deleted file mode 100644 index c9ddfff50..000000000 --- a/prog/_jBuild/msbuild/default.props +++ /dev/null @@ -1,211 +0,0 @@ - - - - false - - - false - false - false - - - - - - Makefile - - $(DefaultPlatformToolset) - - - - - - - $(OriginPlatform) - $(MSBuildThisFileDirectory)after_user_import.props - - $(ProjectDir) - $(SolutionDir)enlisted\prog\ - false - true - $(ProjectName) - -$(daPlatform) - $(SolutionDir)prog\ - <_1stPartyDir Condition="'$(_1stPartyDir)' == ''">$(CommonProgDir)1stPartyLibs\ - <_3rdPartyDir Condition="'$(_3rdPartyDir)' == ''">$(CommonProgDir)3rdPartyLibs\ - $(SolutionDir)_output\ - $(OutDir)msbuild\ - $(GDEVTOOL);$(PATH);$(GDEVTOOL)\python;$(GDEVTOOL)\python3 - - - $(GDEVTOOL) - C:\Games\$(ProjectName)\ - false - export DISPLAY=:0 - /opt/devtools/ - /opt/dagor2/ - yes - - $(IntDir)$(ProjectName)\$(Configuration).tlog\ - $(TLogLocation)unsuccessfulbuild - $(TLogLocation)$(ProjectName).lastbuildstate - - 16.10.3 - $(GDEVTOOL)\vc2019_$(VCUpdateVer)\ - 14.0.6 - $(GDEVTOOL)\LLVM-$(ClangVer)\lib\clang\$(ClangVer)\ - $(GDEVTOOL)\win.sdk.100\Include\10.0.19041.0\ - $(GDEVTOOL)\xbox.gdk.221000\221000\ - 850 - $(GDEVTOOL)\ps4.sdk.$(PS4SdkVer) - 700 - $(GDEVTOOL)\ps5.sdk.$(PS5SdkVer)\ - $(GDEVTOOL)\android-ndk-r23b\ - 2.82 - 14316386-1.8 - 1.12.5 - 1.0.16 - 140 - 2.01.06 - $(_3rdPartyDir)apex\ - $(_3rdPartyDir)physx\ - $(GDEVTOOL)\boost-1.51\ - - - - - - $(CommonProgDir)dagorInclude;$(_1stPartyDir);$(_3rdPartyDir);$(_3rdPartyDir)eastl\include;$(WinSDKROOT)um;$(WinSDKROOT)shared;$(VCRoot)include;$(WinSDKROOT)ucrt - _TARGET_D3D_MULTI;_TARGET_SIMD_SSE=2;_TARGET_PC=1;_TARGET_PC_WIN=1;_TARGET_CPU_IA32=1;_TARGET_STATIC_LIB=1;__IA32__=1;WIN32;asm=__asm;WIN32_LEAN_AND_MEAN=;_USE_MATH_DEFINES;_ALLOW_KEYWORD_MACROS=;_USING_V110_SDK71_;i_strlen=(int)strlen;NV_WINDOWS;NOMINMAX;EA_COMPILER_RVCT;FMOD_SRC_VERSION=1;_CRT_DECLARE_NONSTDC_NAMES=1 - - <_3rdPartyLibs>$(_3rdPartyDir)posix\include\win32 - - - - - - $(MSBuildToolsDir)isense\workaround;$(ClangRoot)include;$(CommonProgDir)dagorInclude;$(_1stPartyDir);$(_3rdPartyDir);$(_3rdPartyDir)eastl\include;$(WinSDKROOT)ucrt;$(WinSDKROOT)um;$(WinSDKROOT)shared;$(VCRoot)include - _TARGET_D3D_MULTI;_TARGET_SIMD_SSE=4;_TARGET_PC=1;_TARGET_PC_WIN=1;_TARGET_64BIT=1;_TARGET_STATIC_LIB=1;WIN64;asm=__asm;WIN32_LEAN_AND_MEAN=;_USE_MATH_DEFINES;_USING_V110_SDK71_;i_strlen=(int)strlen;__cdecl=;__forceinline=inline;NV_WINDOWS;NOMINMAX;EA_COMPILER_RVCT;FMOD_SRC_VERSION=1;_CRT_DECLARE_NONSTDC_NAMES=1 - $(MSBuildThisFileDirectory)isense\win64.h - Clang.Windows;$(MSBuildThisFileDirectory)isense\win64.json - - <_3rdPartyLibs>$(_3rdPartyDir)posix\include\win32 - - - - - - $(ClangRoot)include;$(CommonProgDir)dagorInclude;$(_1stPartyDir);$(_3rdPartyDir);$(_3rdPartyDir)eastl\include;$(GDKROOT)GRDK\ExtensionLibraries\Xbox.XCurl.API\DesignTime\CommonConfiguration\neutral\Include;$(GDKROOT)GRDK\ExtensionLibraries\Xbox.Services.API.C\DesignTime\CommonConfiguration\Neutral\Include;$(GDKROOT)GRDK\ExtensionLibraries\Xbox.Game.Chat.2.Cpp.API\DesignTime\CommonConfiguration\neutral\Include;$(GDKROOT)GXDK\gameKit\Include\;$(GDKROOT)GXDK\gameKit\Include\XboxOne;$(GDKROOT)GRDK\gameKit\Include\;$(GDKROOT)GRDK\gameKit\Include\XboxOne;$(WinSDKROOT)um;$(WinSDKROOT)shared;$(WinSDKROOT)winrt;$(WinSDKROOT)cppwinrt;$(WinSDKROOT)ucrt;$(VCRoot)include - _TARGET_XBOX=1;_TARGET_XBOXONE=1;_TARGET_XBOX_GDK=1;_TARGET_64BIT=1;_TARGET_STATIC_LIB=1;_GAMING_XBOX=1;_GAMING_XBOX_XBOXONE=1;WINAPI_FAMILY=WINAPI_FAMILY_GAMES;_ATL_NO_DEFAULT_LIBS;__WRL_NO_DEFAULT_LIB__;_UITHREADCTXT_SUPPORT=0;WIN32_LEAN_AND_MEAN=;_USE_MATH_DEFINES;_WIN32_WINNT=0x0602;_TARGET_SIMD_SSE=5;i_strlen=(int)strlen;__cdecl=;__forceinline=inline;MONOLITHIC=1;NOMINMAX;FMOD_SRC_VERSION=0;_CRT_DECLARE_NONSTDC_NAMES=1 - $(MSBuildThisFileDirectory)isense\gdk.h - Clang.Windows;$(MSBuildThisFileDirectory)isense\gdk.json - - - - - - $(ClangRoot)include;$(CommonProgDir)dagorInclude;$(_1stPartyDir);$(_3rdPartyDir);$(_3rdPartyDir)eastl\include;$(GDKROOT)GRDK\ExtensionLibraries\Xbox.XCurl.API\DesignTime\CommonConfiguration\neutral\Include;$(GDKROOT)GRDK\ExtensionLibraries\Xbox.Services.API.C\DesignTime\CommonConfiguration\Neutral\Include;$(GDKROOT)GRDK\ExtensionLibraries\Xbox.Game.Chat.2.Cpp.API\DesignTime\CommonConfiguration\neutral\Include;$(GDKROOT)GXDK\gameKit\Include\;$(GDKROOT)GXDK\gameKit\Include\Scarlett;$(GDKROOT)GRDK\gameKit\Include\;$(GDKROOT)GRDK\gameKit\Include\Scarlett;$(WinSDKROOT)um;$(WinSDKROOT)shared;$(WinSDKROOT)winrt;$(WinSDKROOT)cppwinrt;$(WinSDKROOT)ucrt;$(VCRoot)include - _TARGET_XBOX=1;_TARGET_SCARLETT=1;_TARGET_XBOX_GDK=1;_TARGET_64BIT=1;_TARGET_STATIC_LIB=1;_GAMING_XBOX=1;_GAMING_XBOX_SCARLETT=1;WINAPI_FAMILY=WINAPI_FAMILY_GAMES;_ATL_NO_DEFAULT_LIBS;__WRL_NO_DEFAULT_LIB__;_UITHREADCTXT_SUPPORT=0;WIN32_LEAN_AND_MEAN=;_USE_MATH_DEFINES;_WIN32_WINNT=0x0602;_TARGET_SIMD_SSE=5;i_strlen=(int)strlen;__cdecl=;__forceinline=inline;MONOLITHIC=1;NOMINMAX;FMOD_SRC_VERSION=0;_CRT_DECLARE_NONSTDC_NAMES=1 - $(MSBuildThisFileDirectory)isense\gdk.h - Clang.Windows;$(MSBuildThisFileDirectory)isense\gdk.json - - - - - - $(PS4SDKROOT)\ - $(CommonProgDir)dagorInclude;$(_1stPartyDir);$(_3rdPartyDir);$(_3rdPartyDir)eastl\include;$(PS4SDKROOT).cg.300\target\include;$(PS4SDKROOT)\target\include_common;$(PS4SDKROOT)\target\include;$(PS4SDKROOT)\host_tools\lib\clang\include - "__forceinline=inline __attribute__((always_inline))";__cdecl=;__stdcall=;__fastcall=;__vectorcall=;VECTORCALL=;_TARGET_PS4=1;_TARGET_STATIC_LIB=1;_TARGET_SIMD_SSE=4;_TARGET_64BIT=1;_snprintf=snprintf;_vsnprintf=vsnprintf;stricmp=strcasecmp;strnicmp=strncasecmp;i_strlen=strlen;intptr_t=__intptr_t;EA_COMPILER_RVCT;__ORBIS__;CHAR8_T_DEFINED;char8_t=char;__restrict=;FMOD_SRC_VERSION=1;PS4_CLIENT_ID="69965321-b000-4c37-a85c-90d3d09c0613" - $(MSBuildThisFileDirectory)isense\ps4.h - Linux;$(MSBuildThisFileDirectory)isense\ps4.json - - <_3rdPartyLibs>$(_3rdPartyDir)posix\include\ps4 - 5.03 - - - - - - $(PS5SDKROOT) - $(CommonProgDir)dagorInclude;$(_1stPartyDir);$(_3rdPartyDir);$(_3rdPartyDir)eastl\include;$(PS5SDKROOT)target\include_common;$(PS5SDKROOT)target\include;$(PS5SDKROOT)host_tools\lib\clang\include - "__forceinline=inline __attribute__((always_inline))";__cdecl=;__stdcall=;__fastcall;__vectorcall=;VECTORCALL=;__PROSPERO__=1;_TARGET_PS5=1;_TARGET_STATIC_LIB=1;_TARGET_SIMD_SSE=5;_TARGET_64BIT=1;DAGOR_EXCEPTIONS_DISABLED=1;_snprintf=snprintf;_vsnprintf=vsnprintf;stricmp=strcasecmp;strnicmp=strncasecmp;i_strlen=strlen;intptr_t=__intptr_t;EA_COMPILER_RVCT;CHAR8_T_DEFINED;char8_t=char;__restrict=;FMOD_SRC_VERSION=0 - $(MSBuildThisFileDirectory)isense\ps5.h - Linux;$(MSBuildThisFileDirectory)isense\ps5.json - - <_3rdPartyLibs>$(_3rdPartyDir)posix\include\ps4 - 5.04 - - - - - - $(NDKROOT)sources\cxx-stl\llvm-libc++\include;$(NDKROOT)sources\cxx-stl\llvm-libc++abi\include;$(NDKROOT)sysroot;$(NDKROOT)toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\12.0.8\include;$(NDKROOT)sysroot\usr\include;$(NDKROOT)toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\include;$(NDKROOT)toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\include\aarch64-linux-android;$(NDKROOT)sysroot\usr\include\aarch64-linux-android;$(CommonProgDir)dagorInclude;$(_1stPartyDir);$(_3rdPartyDir)eastl\include;$(_3rdPartyDir);$(NDKROOT)sources\android\support\include;$(NDKROOT)sources\android\native_app_glue - _TARGET_ANDROID=1;_TARGET_64BIT=1;_TARGET_SIMD_NEON=1;_TARGET_STATIC_LIB=1;__ANDROID_API__=28;ANDROID_NDK;ANDROID;__ANDROID__;__ARM_EABI__;__STDC_INT64__;__forceinline=;__cdecl=;__stdcall=;__fastcall=;_snprintf=snprintf;_vsnprintf=vsnprintf;stricmp=strcasecmp;strnicmp=strncasecmp;i_strlen=strlen;strcpy_s=strcpy;_countof=countof;EA_COMPILER_RVCT;FMOD_SRC_VERSION=0 - $(MSBuildThisFileDirectory)isense\android.h - Android;$(MSBuildThisFileDirectory)isense\android.json - - $(ProjectDir)platform\android.bundle\common\;$(ProjectDir)platform\android.bundle\$(GameName)\ - - - - - - /usr/include - __LINUX__=64;_TARGET_PC_LINUX=3;_TARGET_PC=3;_TARGET_64BIT=1;_TARGET_SIMD_SSE=2;_TARGET_STATIC_LIB=1;_POSIX_C_SOURCE=200809L;_GNU_SOURCE;__STDC_CONSTANT_MACROS;__forceinline=inline __attribute__((always_inline));__cdecl=;__stdcall=;__fastcall=;_snprintf=snprintf;_vsnprintf=vsnprintf;stricmp=strcasecmp;strnicmp=strncasecmp;i_strlen=(int)strlen;_TARGET_D3D_MULTI - Linux;$(IntDir)iconfig.json - - - - - - - - - - - - - $(NMakeIncludeSearchPath);$(CommonProgDir)daNetGame;. - - - - - $(NMakeIncludeSearchPath);. - $(NMakeForcedIncludes);config.h - - - - - $(NMakeIncludeSearchPath);$(ProjectDir)..\dagorEngine3\de3Common;. - - - - - - - - - <_1stPartyLibs>$(_1stPartyDir)quirrel;$(_1stPartyDir)quirrel\quirrel;$(_1stPartyDir)quirrel\quirrel\include;$(_1stPartyDir)quirrel\sqplus;$(_1stPartyDir)quirrel\sqrat\include;$(_1stPartyDir)jsoncpp\include;$(_1stPartyDir)daScript\include;$(_1stPartyDir)daScript\modules\dasQuirrel\src;$(_1stPartyDir)yuload\include;$(_1stPartyDir)yuplay2;$(_1stPartyDir)yuplay2\include;$(_1stPartyDir)sysinfo;$(_1stPartyDir)rapidJsonUtils\include - <_3rdPartyLibs>$(_3rdPartyLibs);$(_3rdPartyDir)phys\bullet-$(BulletSdkVer)\src;$(_3rdPartyDir)hash;$(_3rdPartyDir)libcurl\include;$(_3rdPartyDir)Detour\Include;$(_3rdPartyDir)Recast\Include;$(_3rdPartyDir)arc;$(_3rdPartyDir)arc\brotli\include;$(_3rdPartyDir)arc\lz4;$(_3rdPartyDir)arc\zlib-ng;$(_3rdPartyDir)arc\libzip\lib;$(_3rdPartyDir)arc\zstd-1.4.5;$(_3rdPartyDir)libb64\include;$(_3rdPartyDir)rapidjson\include;$(_3rdPartyDir)openssl-1.1\include;$(_3rdPartyDir)codecs\include;$(_3rdPartyDir)codecs\dav1d\include;$(_3rdPartyDir)ska_hash_map;$(_3rdPartyDir)mongoose;$(_3rdPartyDir)enet\include;$(_3rdPartyDir)libircclient\include;$(_3rdPartyDir)cef3\v3538;$(_3rdPartyDir)cef3\v3538\include;$(_3rdPartyDir)binPack2D\include;$(_3rdPartyDir)breakpad;$(_3rdPartyDir)pcre\pcre;$(_3rdPartyDir)utf8;$(_3rdPartyDir)libev;$(_3rdPartyDir)freetype\freetype-2.8\include;$(_3rdPartyDir)freetype\harfbuzz-2.6.4\src;$(_3rdPartyDir)scripts\angelscript\include;$(_3rdPartyDir)scripts\angelscript\add_on;$(_3rdPartyDir)convert\fastDXT;$(_3rdPartyDir)bencode;$(_3rdPartyDir)imgui;$(GDEVTOOL)\oodle.2.8\include;$(GDEVTOOL)\fltk-1.3.4 - - $(NMakeIncludeSearchPath);$(CommonProgDir)engine\sharedInclude;$(CommonProgDir)tools\sharedInclude;$(CommonProgDir)gameLibs\publicInclude;$(CommonProgDir)gameLibs\publicInclude\quirrel;$(CommonProgDir)gameLibs\ecs\input;$(CommonProgDir)commonFx\commonFxGame;$(_1stPartyLibs);$(_3rdPartyLibs);$(CommonProgDir)engine;$(SolutionDir)launcher\client\updater\include - $(NMakePreprocessorDefinitions);_HAS_EXCEPTIONS=0;EA_COMPILER_NO_NOEXCEPT;USE_SQRAT_CONFIG;USE_BULLET_PHYSICS - $(NMakeForcedIncludes);memory\dag_memBase.h - - false - true - stdcpp17 - c++17 - - $([MSBuild]::NormalizePath('$(GameDir)')) - $([MSBuild]::MakeRelative($(SolutionDir), $(GameDir))) - - false - - - - - $(IntDir)$(ProjectName)\$(Configuration).log - - - diff --git a/prog/_jBuild/msbuild/deploy.daNetGames.props b/prog/_jBuild/msbuild/deploy.daNetGames.props deleted file mode 100644 index 1103c59f5..000000000 --- a/prog/_jBuild/msbuild/deploy.daNetGames.props +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - %(Filename)%(Extension) - - - - - - - - - - - - - - - - - - - - - compiledShaders\ - %(LinkDir)%(Filename)%(Extension) - - - - - - compiledShaders\ - %(LinkDir)%(Filename)%(Extension) - - - - - - - - - - - - - compiledShaders\ - %(LinkDir)%(Filename)%(Extension) - - - - compiledShaders\ - %(LinkDir)%(Filename)%(Extension) - - - - - - - - content\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - content.hq\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - locales\ - %(LinkDir)%(Filename)%(Extension) - - - media\ - %(LinkDir)%(Filename)%(Extension) - - - sound\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - ui\ - %(LinkDir)%(Filename)%(Extension) - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/deploy.skyquake.props b/prog/_jBuild/msbuild/deploy.skyquake.props deleted file mode 100644 index adb371ea6..000000000 --- a/prog/_jBuild/msbuild/deploy.skyquake.props +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - %(Filename)%(Extension) - - - - - - - - - - - - - - - - - - - - - - compiledShaders\ - %(LinkDir)%(Filename)%(Extension) - - - - - - compiledShaders\ - %(LinkDir)%(Filename)%(Extension) - - - - - - - - - - content.hq\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - - - - - - content.hq\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - - - - - - content\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - levels\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - media\ - %(LinkDir)%(Filename)%(Extension) - - - patch\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - sound\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - ui\ - %(LinkDir)%(Filename)%(Extension) - - - video\%(RecursiveDir) - %(LinkDir)%(Filename)%(Extension) - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/fixDependencies.vcxproj b/prog/_jBuild/msbuild/fixDependencies.vcxproj deleted file mode 100644 index b95bb35d7..000000000 --- a/prog/_jBuild/msbuild/fixDependencies.vcxproj +++ /dev/null @@ -1,80 +0,0 @@ - - - - - Any - x64 - - - - {be418570-77ca-4379-9ba1-157cc6c71bcb} - true - $(SolutionDir)_output\ - $(OutDir)msbuild\ - $(MSBuildThisFileDirectory) - $(SolutionDir)prog\ - - - - - $(IntDir)$(MSBuildProjectName).log - - - - - - - - - - - - - - - - - - - - - - - - @(ProjectFiles) - - - - - - - - - - - - - - - - - - - - - - <_ProjectDirectories Include="dummy"> - $(ProjectDir) - - - - - - - true - - $(ProjectDir) - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/isense/android.h b/prog/_jBuild/msbuild/isense/android.h deleted file mode 100644 index 95bb0f9eb..000000000 --- a/prog/_jBuild/msbuild/isense/android.h +++ /dev/null @@ -1,17 +0,0 @@ -#undef __STDC__ -#define __STDC__ 0 -#undef _WIN32 -#undef _MSC_VER -#undef _MSC_FULL_VER -#undef _MSC_BUILD -#undef _M_IX86 -#undef __EDG__ -#undef __EDG_VERSION__ -#undef __EDG_SIZE_TYPE__ -#undef __EDG_PTRDIFF_TYPE__ -#undef __EDG_TYPE_TRAITS_ENABLED - -typedef __int128 __int128_t; -typedef unsigned __int128 __uint128_t; -typedef long double __fp16; -typedef long double _Float16; diff --git a/prog/_jBuild/msbuild/isense/android.json b/prog/_jBuild/msbuild/isense/android.json deleted file mode 100644 index a715fc66a..000000000 --- a/prog/_jBuild/msbuild/isense/android.json +++ /dev/null @@ -1,471 +0,0 @@ -{ - "predefines": { - "cpp_compiler_defines": { - "_GNU_SOURCE": "1", - "_LP64": "1", - "__AARCH64EL__": "1", - "__AARCH64_CMODEL_SMALL__": "1", - "__ANDROID__": "1", - "__ARM_64BIT_STATE": "1", - "__ARM_ACLE": "200", - "__ARM_ALIGN_MAX_STACK_PWR": "4", - "__ARM_ARCH": "8", - "__ARM_ARCH_ISA_A64": "1", - "__ARM_ARCH_PROFILE": "'A'", - "__ARM_FEATURE_CLZ": "1", - "__ARM_FEATURE_DIRECTED_ROUNDING": "1", - "__ARM_FEATURE_DIV": "1", - "__ARM_FEATURE_FMA": "1", - "__ARM_FEATURE_IDIV": "1", - "__ARM_FEATURE_LDREX": "0xF", - "__ARM_FEATURE_NUMERIC_MAXMIN": "1", - "__ARM_FEATURE_UNALIGNED": "1", - "__ARM_FP": "0xE", - "__ARM_FP16_ARGS": "1", - "__ARM_FP16_FORMAT_IEEE": "1", - "__ARM_FP_FAST": "1", - "__ARM_NEON": "1", - "__ARM_NEON_FP": "0xE", - "__ARM_PCS_AAPCS64": "1", - "__ARM_SIZEOF_MINIMAL_ENUM": "4", - "__ARM_SIZEOF_WCHAR_T": "4", - "__ATOMIC_ACQUIRE": "2", - "__ATOMIC_ACQ_REL": "4", - "__ATOMIC_CONSUME": "1", - "__ATOMIC_RELAXED": "0", - "__ATOMIC_RELEASE": "3", - "__ATOMIC_SEQ_CST": "5", - "__BIGGEST_ALIGNMENT__": "16", - "__BYTE_ORDER__": "__ORDER_LITTLE_ENDIAN__", - "__CHAR16_TYPE__": "unsigned short", - "__CHAR32_TYPE__": "unsigned int", - "__CHAR_BIT__": "8", - "__CHAR_UNSIGNED__": "1", - "__CLANG_ATOMIC_BOOL_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR16_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR32_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR_LOCK_FREE": "2", - "__CLANG_ATOMIC_INT_LOCK_FREE": "2", - "__CLANG_ATOMIC_LLONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_LONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_POINTER_LOCK_FREE": "2", - "__CLANG_ATOMIC_SHORT_LOCK_FREE": "2", - "__CLANG_ATOMIC_WCHAR_T_LOCK_FREE": "2", - "__CLANG_CUDA_APPROX_TRANSCENDENTALS__": "1", - "__CONSTANT_CFSTRINGS__": "1", - "__DBL_DECIMAL_DIG__": "17", - "__DBL_DENORM_MIN__": "4.9406564584124654e-324", - "__DBL_DIG__": "15", - "__DBL_EPSILON__": "2.2204460492503131e-16", - "__DBL_HAS_DENORM__": "1", - "__DBL_HAS_INFINITY__": "1", - "__DBL_HAS_QUIET_NAN__": "1", - "__DBL_MANT_DIG__": "53", - "__DBL_MAX_10_EXP__": "308", - "__DBL_MAX_EXP__": "1024", - "__DBL_MAX__": "1.7976931348623157e+308", - "__DBL_MIN_10_EXP__": "(-307)", - "__DBL_MIN_EXP__": "(-1021)", - "__DBL_MIN__": "2.2250738585072014e-308", - "__DECIMAL_DIG__": "__LDBL_DECIMAL_DIG__", - "__DEPRECATED": "1", - "__ELF__": "1", - "__FAST_MATH__": "1", - "__FINITE_MATH_ONLY__": "1", - "__FLT16_DECIMAL_DIG__": "5", - "__FLT16_DENORM_MIN__": "5.9604644775390625e-8F16", - "__FLT16_DIG__": "3", - "__FLT16_EPSILON__": "9.765625e-4F16", - "__FLT16_HAS_DENORM__": "1", - "__FLT16_HAS_INFINITY__": "1", - "__FLT16_HAS_QUIET_NAN__": "1", - "__FLT16_MANT_DIG__": "11", - "__FLT16_MAX_10_EXP__": "4", - "__FLT16_MAX_EXP__": "16", - "__FLT16_MAX__": "6.5504e+4F16", - "__FLT16_MIN_10_EXP__": "(-4)", - "__FLT16_MIN_EXP__": "(-13)", - "__FLT16_MIN__": "6.103515625e-5F16", - "__FLT_DECIMAL_DIG__": "9", - "__FLT_DENORM_MIN__": "1.40129846e-45F", - "__FLT_DIG__": "6", - "__FLT_EPSILON__": "1.19209290e-7F", - "__FLT_EVAL_METHOD__": "0", - "__FLT_HAS_DENORM__": "1", - "__FLT_HAS_INFINITY__": "1", - "__FLT_HAS_QUIET_NAN__": "1", - "__FLT_MANT_DIG__": "24", - "__FLT_MAX_10_EXP__": "38", - "__FLT_MAX_EXP__": "128", - "__FLT_MAX__": "3.40282347e+38F", - "__FLT_MIN_10_EXP__": "(-37)", - "__FLT_MIN_EXP__": "(-125)", - "__FLT_MIN__": "1.17549435e-38F", - "__FLT_RADIX__": "2", - "__GCC_ATOMIC_BOOL_LOCK_FREE": "2", - "__GCC_ATOMIC_CHAR16_T_LOCK_FREE": "2", - "__GCC_ATOMIC_CHAR32_T_LOCK_FREE": "2", - "__GCC_ATOMIC_CHAR_LOCK_FREE": "2", - "__GCC_ATOMIC_INT_LOCK_FREE": "2", - "__GCC_ATOMIC_LLONG_LOCK_FREE": "2", - "__GCC_ATOMIC_LONG_LOCK_FREE": "2", - "__GCC_ATOMIC_POINTER_LOCK_FREE": "2", - "__GCC_ATOMIC_SHORT_LOCK_FREE": "2", - "__GCC_ATOMIC_TEST_AND_SET_TRUEVAL": "1", - "__GCC_ATOMIC_WCHAR_T_LOCK_FREE": "2", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8": "1", - "__GNUC_GNU_INLINE__": "1", - "__GNUC_MINOR__": "2", - "__GNUC_PATCHLEVEL__": "1", - "__GNUC__": "4", - "__GNUG__": "4", - "__GXX_ABI_VERSION": "1002", - "__GXX_EXPERIMENTAL_CXX0X__": "1", - "__GXX_WEAK__": "1", - "__INT16_C_SUFFIX_": " ", - "__INT16_FMTd__": "\"hd\"", - "__INT16_FMTi__": "\"hi\"", - "__INT16_MAX__": "32767", - "__INT16_TYPE__": "short", - "__INT32_C_SUFFIX_": " ", - "__INT32_FMTd__": "\"d\"", - "__INT32_FMTi__": "\"i\"", - "__INT32_MAX__": "2147483647", - "__INT32_TYPE__": "int", - "__INT64_C_SUFFIX__": "L", - "__INT64_FMTd__": "\"ld\"", - "__INT64_FMTi__": "\"li\"", - "__INT64_MAX__": "9223372036854775807L", - "__INT64_TYPE__": "long int", - "__INT8_C_SUFFIX_": " ", - "__INT8_FMTd__": "\"hhd\"", - "__INT8_FMTi__": "\"hhi\"", - "__INT8_MAX__": "127", - "__INT8_TYPE__": "signed char", - "__INTMAX_C_SUFFIX__": "L", - "__INTMAX_FMTd__": "\"ld\"", - "__INTMAX_FMTi__": "\"li\"", - "__INTMAX_MAX__": "9223372036854775807L", - "__INTMAX_TYPE__": "long int", - "__INTMAX_WIDTH__": "64", - "__INTPTR_FMTd__": "\"ld\"", - "__INTPTR_FMTi__": "\"li\"", - "__INTPTR_MAX__": "9223372036854775807L", - "__INTPTR_TYPE__": "long int", - "__INTPTR_WIDTH__": "64", - "__INT_FAST16_FMTd__": "\"hd\"", - "__INT_FAST16_FMTi__": "\"hi\"", - "__INT_FAST16_MAX__": "32767", - "__INT_FAST16_TYPE__": "short", - "__INT_FAST32_FMTd__": "\"d\"", - "__INT_FAST32_FMTi__": "\"i\"", - "__INT_FAST32_MAX__": "2147483647", - "__INT_FAST32_TYPE__": "int", - "__INT_FAST64_FMTd__": "\"ld\"", - "__INT_FAST64_FMTi__": "\"li\"", - "__INT_FAST64_MAX__": "9223372036854775807L", - "__INT_FAST64_TYPE__": "long int", - "__INT_FAST8_FMTd__": "\"hhd\"", - "__INT_FAST8_FMTi__": "\"hhi\"", - "__INT_FAST8_MAX__": "127", - "__INT_FAST8_TYPE__": "signed char", - "__INT_LEAST16_FMTd__": "\"hd\"", - "__INT_LEAST16_FMTi__": "\"hi\"", - "__INT_LEAST16_MAX__": "32767", - "__INT_LEAST16_TYPE__": "short", - "__INT_LEAST32_FMTd__": "\"d\"", - "__INT_LEAST32_FMTi__": "\"i\"", - "__INT_LEAST32_MAX__": "2147483647", - "__INT_LEAST32_TYPE__": "int", - "__INT_LEAST64_FMTd__": "\"ld\"", - "__INT_LEAST64_FMTi__": "\"li\"", - "__INT_LEAST64_MAX__": "9223372036854775807L", - "__INT_LEAST64_TYPE__": "long int", - "__INT_LEAST8_FMTd__": "\"hhd\"", - "__INT_LEAST8_FMTi__": "\"hhi\"", - "__INT_LEAST8_MAX__": "127", - "__INT_LEAST8_TYPE__": "signed char", - "__INT_MAX__": "2147483647", - "__LDBL_DECIMAL_DIG__": "36", - "__LDBL_DENORM_MIN__": "6.47517511943802511092443895822764655e-4966L", - "__LDBL_DIG__": "33", - "__LDBL_EPSILON__": "1.92592994438723585305597794258492732e-34L", - "__LDBL_HAS_DENORM__": "1", - "__LDBL_HAS_INFINITY__": "1", - "__LDBL_HAS_QUIET_NAN__": "1", - "__LDBL_MANT_DIG__": "113", - "__LDBL_MAX_10_EXP__": "4932", - "__LDBL_MAX_EXP__": "16384", - "__LDBL_MAX__": "1.18973149535723176508575932662800702e+4932L", - "__LDBL_MIN_10_EXP__": "(-4931)", - "__LDBL_MIN_EXP__": "(-16381)", - "__LDBL_MIN__": "3.36210314311209350626267781732175260e-4932L", - "__LITTLE_ENDIAN__": "1", - "__LONG_LONG_MAX__": "9223372036854775807LL", - "__LONG_MAX__": "9223372036854775807L", - "__LP64__": "1", - "__OBJC_BOOL_IS_BOOL": "0", - "__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES": "3", - "__OPENCL_MEMORY_SCOPE_DEVICE": "2", - "__OPENCL_MEMORY_SCOPE_SUB_GROUP": "4", - "__OPENCL_MEMORY_SCOPE_WORK_GROUP": "1", - "__OPENCL_MEMORY_SCOPE_WORK_ITEM": "0", - "__ORDER_BIG_ENDIAN__": "4321", - "__ORDER_LITTLE_ENDIAN__": "1234", - "__ORDER_PDP_ENDIAN__": "3412", - "__PIC__": "1", - "__POINTER_WIDTH__": "64", - "__PRAGMA_REDEFINE_EXTNAME": "1", - "__PTRDIFF_FMTd__": "\"ld\"", - "__PTRDIFF_FMTi__": "\"li\"", - "__PTRDIFF_MAX__": "9223372036854775807L", - "__PTRDIFF_TYPE__": "long int", - "__PTRDIFF_WIDTH__": "64", - "__SCHAR_MAX__": "127", - "__SHRT_MAX__": "32767", - "__SIG_ATOMIC_MAX__": "2147483647", - "__SIG_ATOMIC_WIDTH__": "32", - "__SIZEOF_DOUBLE__": "8", - "__SIZEOF_FLOAT__": "4", - "__SIZEOF_INT128__": "16", - "__SIZEOF_INT__": "4", - "__SIZEOF_LONG_DOUBLE__": "16", - "__SIZEOF_LONG_LONG__": "8", - "__SIZEOF_LONG__": "8", - "__SIZEOF_POINTER__": "8", - "__SIZEOF_PTRDIFF_T__": "8", - "__SIZEOF_SHORT__": "2", - "__SIZEOF_SIZE_T__": "8", - "__SIZEOF_WCHAR_T__": "4", - "__SIZEOF_WINT_T__": "4", - "__SIZE_FMTX__": "\"lX\"", - "__SIZE_FMTo__": "\"lo\"", - "__SIZE_FMTu__": "\"lu\"", - "__SIZE_FMTx__": "\"lx\"", - "__SIZE_MAX__": "18446744073709551615UL", - "__SIZE_TYPE__": "long unsigned int", - "__SIZE_WIDTH__": "64", - "__SSP__": "1", - "__STDCPP_DEFAULT_NEW_ALIGNMENT__": "16UL", - "__STDCPP_THREADS__": "1", - "__STDC_HOSTED__": "1", - "__STDC_UTF_16__": "1", - "__STDC_UTF_32__": "1", - "__STDC__": "1", - "__STRICT_ANSI__": "1", - "__UINT16_C_SUFFIX_": " ", - "__UINT16_FMTX__": "\"hX\"", - "__UINT16_FMTo__": "\"ho\"", - "__UINT16_FMTu__": "\"hu\"", - "__UINT16_FMTx__": "\"hx\"", - "__UINT16_MAX__": "65535", - "__UINT16_TYPE__": "unsigned short", - "__UINT32_C_SUFFIX__": "U", - "__UINT32_FMTX__": "\"X\"", - "__UINT32_FMTo__": "\"o\"", - "__UINT32_FMTu__": "\"u\"", - "__UINT32_FMTx__": "\"x\"", - "__UINT32_MAX__": "4294967295U", - "__UINT32_TYPE__": "unsigned int", - "__UINT64_C_SUFFIX__": "UL", - "__UINT64_FMTX__": "\"lX\"", - "__UINT64_FMTo__": "\"lo\"", - "__UINT64_FMTu__": "\"lu\"", - "__UINT64_FMTx__": "\"lx\"", - "__UINT64_MAX__": "18446744073709551615UL", - "__UINT64_TYPE__": "long unsigned int", - "__UINT8_C_SUFFIX_": " ", - "__UINT8_FMTX__": "\"hhX\"", - "__UINT8_FMTo__": "\"hho\"", - "__UINT8_FMTu__": "\"hhu\"", - "__UINT8_FMTx__": "\"hhx\"", - "__UINT8_MAX__": "255", - "__UINT8_TYPE__": "unsigned char", - "__UINTMAX_C_SUFFIX__": "UL", - "__UINTMAX_FMTX__": "\"lX\"", - "__UINTMAX_FMTo__": "\"lo\"", - "__UINTMAX_FMTu__": "\"lu\"", - "__UINTMAX_FMTx__": "\"lx\"", - "__UINTMAX_MAX__": "18446744073709551615UL", - "__UINTMAX_TYPE__": "long unsigned int", - "__UINTMAX_WIDTH__": "64", - "__UINTPTR_FMTX__": "\"lX\"", - "__UINTPTR_FMTo__": "\"lo\"", - "__UINTPTR_FMTu__": "\"lu\"", - "__UINTPTR_FMTx__": "\"lx\"", - "__UINTPTR_MAX__": "18446744073709551615UL", - "__UINTPTR_TYPE__": "long unsigned int", - "__UINTPTR_WIDTH__": "64", - "__UINT_FAST16_FMTX__": "\"hX\"", - "__UINT_FAST16_FMTo__": "\"ho\"", - "__UINT_FAST16_FMTu__": "\"hu\"", - "__UINT_FAST16_FMTx__": "\"hx\"", - "__UINT_FAST16_MAX__": "65535", - "__UINT_FAST16_TYPE__": "unsigned short", - "__UINT_FAST32_FMTX__": "\"X\"", - "__UINT_FAST32_FMTo__": "\"o\"", - "__UINT_FAST32_FMTu__": "\"u\"", - "__UINT_FAST32_FMTx__": "\"x\"", - "__UINT_FAST32_MAX__": "4294967295U", - "__UINT_FAST32_TYPE__": "unsigned int", - "__UINT_FAST64_FMTX__": "\"lX\"", - "__UINT_FAST64_FMTo__": "\"lo\"", - "__UINT_FAST64_FMTu__": "\"lu\"", - "__UINT_FAST64_FMTx__": "\"lx\"", - "__UINT_FAST64_MAX__": "18446744073709551615UL", - "__UINT_FAST64_TYPE__": "long unsigned int", - "__UINT_FAST8_FMTX__": "\"hhX\"", - "__UINT_FAST8_FMTo__": "\"hho\"", - "__UINT_FAST8_FMTu__": "\"hhu\"", - "__UINT_FAST8_FMTx__": "\"hhx\"", - "__UINT_FAST8_MAX__": "255", - "__UINT_FAST8_TYPE__": "unsigned char", - "__UINT_LEAST16_FMTX__": "\"hX\"", - "__UINT_LEAST16_FMTo__": "\"ho\"", - "__UINT_LEAST16_FMTu__": "\"hu\"", - "__UINT_LEAST16_FMTx__": "\"hx\"", - "__UINT_LEAST16_MAX__": "65535", - "__UINT_LEAST16_TYPE__": "unsigned short", - "__UINT_LEAST32_FMTX__": "\"X\"", - "__UINT_LEAST32_FMTo__": "\"o\"", - "__UINT_LEAST32_FMTu__": "\"u\"", - "__UINT_LEAST32_FMTx__": "\"x\"", - "__UINT_LEAST32_MAX__": "4294967295U", - "__UINT_LEAST32_TYPE__": "unsigned int", - "__UINT_LEAST64_FMTX__": "\"lX\"", - "__UINT_LEAST64_FMTo__": "\"lo\"", - "__UINT_LEAST64_FMTu__": "\"lu\"", - "__UINT_LEAST64_FMTx__": "\"lx\"", - "__UINT_LEAST64_MAX__": "18446744073709551615UL", - "__UINT_LEAST64_TYPE__": "long unsigned int", - "__UINT_LEAST8_FMTX__": "\"hhX\"", - "__UINT_LEAST8_FMTo__": "\"hho\"", - "__UINT_LEAST8_FMTu__": "\"hhu\"", - "__UINT_LEAST8_FMTx__": "\"hhx\"", - "__UINT_LEAST8_MAX__": "255", - "__UINT_LEAST8_TYPE__": "unsigned char", - "__USER_LABEL_PREFIX_": " ", - "__VERSION__": "\"Android (7714059, based on r416183c1) Clang 12.0.8 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee)\"", - "__WCHAR_MAX__": "4294967295U", - "__WCHAR_TYPE__": "unsigned int", - "__WCHAR_UNSIGNED__": "1", - "__WCHAR_WIDTH__": "32", - "__WINT_MAX__": "4294967295U", - "__WINT_TYPE__": "unsigned int", - "__WINT_UNSIGNED__": "1", - "__WINT_WIDTH__": "32", - "__aarch64__": "1", - "__clang__": "1", - "__clang_major__": "12", - "__clang_minor__": "0", - "__clang_patchlevel__": "8", - "__clang_version__": "\"12.0.8 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee)\"", - "__cplusplus": "201703L", - "__cpp_aggregate_bases": "201603L", - "__cpp_aggregate_nsdmi": "201304L", - "__cpp_alias_templates": "200704L", - "__cpp_aligned_new": "201606L", - "__cpp_attributes": "200809L", - "__cpp_binary_literals": "201304L", - "__cpp_capture_star_this": "201603L", - "__cpp_constexpr": "201603L", - "__cpp_constexpr_in_decltype": "201711L", - "__cpp_decltype": "200707L", - "__cpp_decltype_auto": "201304L", - "__cpp_deduction_guides": "201703L", - "__cpp_delegating_constructors": "200604L", - "__cpp_digit_separators": "201309L", - "__cpp_enumerator_attributes": "201411L", - "__cpp_fold_expressions": "201603L", - "__cpp_generic_lambdas": "201304L", - "__cpp_guaranteed_copy_elision": "201606L", - "__cpp_hex_float": "201603L", - "__cpp_if_constexpr": "201606L", - "__cpp_impl_destroying_delete": "201806L", - "__cpp_inheriting_constructors": "201511L", - "__cpp_init_captures": "201304L", - "__cpp_initializer_lists": "200806L", - "__cpp_inline_variables": "201606L", - "__cpp_lambdas": "200907L", - "__cpp_namespace_attributes": "201411L", - "__cpp_nested_namespace_definitions": "201411L", - "__cpp_noexcept_function_type": "201510L", - "__cpp_nontype_template_args": "201411L", - "__cpp_nontype_template_parameter_auto": "201606L", - "__cpp_nsdmi": "200809L", - "__cpp_range_based_for": "201603L", - "__cpp_raw_strings": "200710L", - "__cpp_ref_qualifiers": "200710L", - "__cpp_return_type_deduction": "201304L", - "__cpp_rvalue_references": "200610L", - "__cpp_static_assert": "201411L", - "__cpp_structured_bindings": "201606L", - "__cpp_template_auto": "201606L", - "__cpp_threadsafe_static_init": "200806L", - "__cpp_unicode_characters": "200704L", - "__cpp_unicode_literals": "200710L", - "__cpp_user_defined_literals": "200809L", - "__cpp_variable_templates": "201304L", - "__cpp_variadic_templates": "200704L", - "__cpp_variadic_using": "201611L", - "__linux": "1", - "__linux__": "1", - "__llvm__": "1", - "__pic__": "1", - "__private_extern__": "extern", - "__unix": "1", - "__unix__": "1" - }, - "cpp_user_defines": { - "__inline__": "inline", - "__restrict__": "__restrict", - "__asm__": "__asm", - "__null": "nullptr", - "__thread": "", - "__has_builtin(x)": "0", - "__has_cpp_attribute(x)": "0", - "__has_attribute(x)": "0", - "__has_declspec_attribute(x)": "0", - "__is_identifier(x)": "0", - "__has_include_next(x)": "0", - "__has_warning(x)": "0", - "__building_module(x)": "0", - "_HAS_FUNCTION_DELETE": "0", - "__declspec(x)": "", - "offsetof": "__builtin_offsetof", - "EA_COMPILER_GNUC": "1" - }, - "cpp_user_undefines": [ - ], - "c_compiler_defines": { - - }, - "c_user_defines": { - "__declspec(x)": "", - "offsetof": "__builtin_offsetof", - "__int128": "long long", - "EA_COMPILER_GNUC": "1" - }, - "c_user_undefines": [ - ] - }, - "target_sizes": { - "char_bit": 8, - "short": 2, - "int": 4, - "long": 8, - "float": 4, - "double": 8, - "long_double": 16, - "pointer": 8, - "ldbl_mant_dig": 64, - "char": 1 - }, - "wchar_t_type": "short", - "ptrdiff_t_type": "long", - "size_t_type": "unsigned long", - "supports_x86_64": true -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/isense/clang.h b/prog/_jBuild/msbuild/isense/clang.h deleted file mode 100644 index 5f4df37fc..000000000 --- a/prog/_jBuild/msbuild/isense/clang.h +++ /dev/null @@ -1,2 +0,0 @@ -#undef __STDC__ -#define __STDC__ 0 diff --git a/prog/_jBuild/msbuild/isense/clang.json b/prog/_jBuild/msbuild/isense/clang.json deleted file mode 100644 index b2a025c61..000000000 --- a/prog/_jBuild/msbuild/isense/clang.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "predefines": { - "cpp_compiler_defines": { - "__building_module(X)": "false", - "__has_warning(X)": "false", - "_HAS_CONDITIONAL_EXPLICIT": "0", - "_CRT_USE_BUILTIN_OFFSETOF": "" - }, - "cpp_user_defines": {}, - "cpp_user_undefines": [], - "c_compiler_defines": { - "__building_module(X)": "false", - "__has_warning(X)": "false", - "_HAS_CONDITIONAL_EXPLICIT": "0", - "_CRT_USE_BUILTIN_OFFSETOF": "" - }, - "c_user_defines": {}, - "c_user_undefines": [] - } -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/isense/gdk.h b/prog/_jBuild/msbuild/isense/gdk.h deleted file mode 100644 index ec8933fe6..000000000 --- a/prog/_jBuild/msbuild/isense/gdk.h +++ /dev/null @@ -1,28 +0,0 @@ -template -v4si __builtin_ia32_pshufd (v4si, int); - -template -v4si __builtin_ia32_shufps (v4si, v4si, int); - -template -__v16qu __builtin_elementwise_min (__v16qu, __v16qu); - -template -__v16qu __builtin_elementwise_max (__v16qu, __v16qu); - -// Forward declaration for BuiltinStringId, because the EDG in clang mode doesn't like the typeless enum; -// and give "declaration of enum type is nonstandard" error. -// https://stackoverflow.com/a/72599 - -namespace dagui -{ - enum BuiltinStringId : int; -} - -// Forward declaration for normalizeDef with rvalue override, because the EDG in clang mode falsely -// selects the (Point3 &, const Point3 &) in case of xvalue is the first parameter. - -class Point3; -inline Point3 normalizeDef(const Point3 &a, const Point3 & def); -inline Point3 normalizeDef(Point3 &&a, const Point3 & def); -inline void normalizeDef(Point3 &a, const Point3 & def); diff --git a/prog/_jBuild/msbuild/isense/gdk.json b/prog/_jBuild/msbuild/isense/gdk.json deleted file mode 100644 index 1dca1fd9f..000000000 --- a/prog/_jBuild/msbuild/isense/gdk.json +++ /dev/null @@ -1,858 +0,0 @@ -{ - "predefines": { - "cpp_compiler_defines": { - "_CHAR_UNSIGNED": "1", - "_DLL": "1", - "_HAS_CHAR16_T_LANGUAGE_SUPPORT": "1", - "_INTEGRAL_MAX_BITS": "64", - "_MSC_BUILD": "1", - "_MSC_EXTENSIONS": "1", - "_MSC_FULL_VER": "192930038", - "_MSC_VER": "1929", - "_MSVC_EXECUTION_CHARACTER_SET": "65001", - "_MSVC_LANG": "201703L", - "_MT": "1", - "_M_AMD64": "100", - "_M_X64": "100", - "_NATIVE_NULLPTR_SUPPORTED": "1", - "_NATIVE_WCHAR_T_DEFINED": "1", - "_RVALUE_REFERENCES_SUPPORTED": "1", - "_RVALUE_REFERENCES_V2_SUPPORTED": "1", - "_WCHAR_T_DEFINED": "1", - "_WIN32": "1", - "_WIN64": "1", - "__ADX__": "1", - "__AES__": "1", - "__ATOMIC_ACQUIRE": "2", - "__ATOMIC_ACQ_REL": "4", - "__ATOMIC_CONSUME": "1", - "__ATOMIC_RELAXED": "0", - "__ATOMIC_RELEASE": "3", - "__ATOMIC_SEQ_CST": "5", - "__AVX2__": "1", - "__AVX__": "1", - "__BIGGEST_ALIGNMENT__": "16", - "__BITINT_MAXWIDTH__": "128", - "__BMI2__": "1", - "__BMI__": "1", - "__BOOL_DEFINED": "1", - "__BOOL_WIDTH__": "8", - "__BYTE_ORDER__": "__ORDER_LITTLE_ENDIAN__", - "__CHAR16_TYPE__": "unsigned short", - "__CHAR32_TYPE__": "unsigned int", - "__CHAR_BIT__": "8", - "__CHAR_UNSIGNED__": "1", - "__CLANG_ATOMIC_BOOL_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR16_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR32_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR_LOCK_FREE": "2", - "__CLANG_ATOMIC_INT_LOCK_FREE": "2", - "__CLANG_ATOMIC_LLONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_LONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_POINTER_LOCK_FREE": "2", - "__CLANG_ATOMIC_SHORT_LOCK_FREE": "2", - "__CLANG_ATOMIC_WCHAR_T_LOCK_FREE": "2", - "__CLANG_CUDA_APPROX_TRANSCENDENTALS__": "1", - "__CLFLUSHOPT__": "1", - "__CLWB__": "1", - "__CLZERO__": "1", - "__CONSTANT_CFSTRINGS__": "1", - "__CRC32__": "1", - "__DBL_DECIMAL_DIG__": "17", - "__DBL_DENORM_MIN__": "4.9406564584124654e-324", - "__DBL_DIG__": "15", - "__DBL_EPSILON__": "2.2204460492503131e-16", - "__DBL_HAS_DENORM__": "1", - "__DBL_HAS_INFINITY__": "1", - "__DBL_HAS_QUIET_NAN__": "1", - "__DBL_MANT_DIG__": "53", - "__DBL_MAX_10_EXP__": "308", - "__DBL_MAX_EXP__": "1024", - "__DBL_MAX__": "1.7976931348623157e+308", - "__DBL_MIN_10_EXP__": "(-307)", - "__DBL_MIN_EXP__": "(-1021)", - "__DBL_MIN__": "2.2250738585072014e-308", - "__DECIMAL_DIG__": "__LDBL_DECIMAL_DIG__", - "__DEPRECATED": "1", - "__F16C__": "1", - "__FAST_MATH__": "1", - "__FINITE_MATH_ONLY__": "1", - "__FLT_DECIMAL_DIG__": "9", - "__FLT_DENORM_MIN__": "1.40129846e-45F", - "__FLT_DIG__": "6", - "__FLT_EPSILON__": "1.19209290e-7F", - "__FLT_EVAL_METHOD__": "0", - "__FLT_HAS_DENORM__": "1", - "__FLT_HAS_INFINITY__": "1", - "__FLT_HAS_QUIET_NAN__": "1", - "__FLT_MANT_DIG__": "24", - "__FLT_MAX_10_EXP__": "38", - "__FLT_MAX_EXP__": "128", - "__FLT_MAX__": "3.40282347e+38F", - "__FLT_MIN_10_EXP__": "(-37)", - "__FLT_MIN_EXP__": "(-125)", - "__FLT_MIN__": "1.17549435e-38F", - "__FLT_RADIX__": "2", - "__FMA__": "1", - "__FSGSBASE__": "1", - "__FXSR__": "1", - "__GCC_ASM_FLAG_OUTPUTS__": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8": "1", - "__INT16_C_SUFFIX_": " ", - "__INT16_FMTd__": "\"hd\"", - "__INT16_FMTi__": "\"hi\"", - "__INT16_MAX__": "32767", - "__INT16_TYPE__": "short", - "__INT32_C_SUFFIX_": " ", - "__INT32_FMTd__": "\"d\"", - "__INT32_FMTi__": "\"i\"", - "__INT32_MAX__": "2147483647", - "__INT32_TYPE__": "int", - "__INT64_C_SUFFIX__": "LL", - "__INT64_FMTd__": "\"lld\"", - "__INT64_FMTi__": "\"lli\"", - "__INT64_MAX__": "9223372036854775807LL", - "__INT64_TYPE__": "long long int", - "__INT8_C_SUFFIX_": " ", - "__INT8_FMTd__": "\"hhd\"", - "__INT8_FMTi__": "\"hhi\"", - "__INT8_MAX__": "127", - "__INT8_TYPE__": "signed char", - "__INTMAX_C_SUFFIX__": "LL", - "__INTMAX_FMTd__": "\"lld\"", - "__INTMAX_FMTi__": "\"lli\"", - "__INTMAX_MAX__": "9223372036854775807LL", - "__INTMAX_TYPE__": "long long int", - "__INTMAX_WIDTH__": "64", - "__INTPTR_FMTd__": "\"lld\"", - "__INTPTR_FMTi__": "\"lli\"", - "__INTPTR_MAX__": "9223372036854775807LL", - "__INTPTR_TYPE__": "long long int", - "__INTPTR_WIDTH__": "64", - "__INT_FAST16_FMTd__": "\"hd\"", - "__INT_FAST16_FMTi__": "\"hi\"", - "__INT_FAST16_MAX__": "32767", - "__INT_FAST16_TYPE__": "short", - "__INT_FAST16_WIDTH__": "16", - "__INT_FAST32_FMTd__": "\"d\"", - "__INT_FAST32_FMTi__": "\"i\"", - "__INT_FAST32_MAX__": "2147483647", - "__INT_FAST32_TYPE__": "int", - "__INT_FAST32_WIDTH__": "32", - "__INT_FAST64_FMTd__": "\"lld\"", - "__INT_FAST64_FMTi__": "\"lli\"", - "__INT_FAST64_MAX__": "9223372036854775807LL", - "__INT_FAST64_TYPE__": "long long int", - "__INT_FAST64_WIDTH__": "64", - "__INT_FAST8_FMTd__": "\"hhd\"", - "__INT_FAST8_FMTi__": "\"hhi\"", - "__INT_FAST8_MAX__": "127", - "__INT_FAST8_TYPE__": "signed char", - "__INT_FAST8_WIDTH__": "8", - "__INT_LEAST16_FMTd__": "\"hd\"", - "__INT_LEAST16_FMTi__": "\"hi\"", - "__INT_LEAST16_MAX__": "32767", - "__INT_LEAST16_TYPE__": "short", - "__INT_LEAST16_WIDTH__": "16", - "__INT_LEAST32_FMTd__": "\"d\"", - "__INT_LEAST32_FMTi__": "\"i\"", - "__INT_LEAST32_MAX__": "2147483647", - "__INT_LEAST32_TYPE__": "int", - "__INT_LEAST32_WIDTH__": "32", - "__INT_LEAST64_FMTd__": "\"lld\"", - "__INT_LEAST64_FMTi__": "\"lli\"", - "__INT_LEAST64_MAX__": "9223372036854775807LL", - "__INT_LEAST64_TYPE__": "long long int", - "__INT_LEAST64_WIDTH__": "64", - "__INT_LEAST8_FMTd__": "\"hhd\"", - "__INT_LEAST8_FMTi__": "\"hhi\"", - "__INT_LEAST8_MAX__": "127", - "__INT_LEAST8_TYPE__": "signed char", - "__INT_LEAST8_WIDTH__": "8", - "__INT_MAX__": "2147483647", - "__INT_WIDTH__": "32", - "__LAHF_SAHF__": "1", - "__LDBL_DECIMAL_DIG__": "17", - "__LDBL_DENORM_MIN__": "4.9406564584124654e-324L", - "__LDBL_DIG__": "15", - "__LDBL_EPSILON__": "2.2204460492503131e-16L", - "__LDBL_HAS_DENORM__": "1", - "__LDBL_HAS_INFINITY__": "1", - "__LDBL_HAS_QUIET_NAN__": "1", - "__LDBL_MANT_DIG__": "53", - "__LDBL_MAX_10_EXP__": "308", - "__LDBL_MAX_EXP__": "1024", - "__LDBL_MAX__": "1.7976931348623157e+308L", - "__LDBL_MIN_10_EXP__": "(-307)", - "__LDBL_MIN_EXP__": "(-1021)", - "__LDBL_MIN__": "2.2250738585072014e-308L", - "__LITTLE_ENDIAN__": "1", - "__LLONG_WIDTH__": "64", - "__LONG_LONG_MAX__": "9223372036854775807LL", - "__LONG_MAX__": "2147483647L", - "__LONG_WIDTH__": "32", - "__LZCNT__": "1", - "__MMX__": "1", - "__MOVBE__": "1", - "__MWAITX__": "1", - "__NO_MATH_ERRNO__": "1", - "__NO_MATH_INLINES": "1", - "__OBJC_BOOL_IS_BOOL": "0", - "__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES": "3", - "__OPENCL_MEMORY_SCOPE_DEVICE": "2", - "__OPENCL_MEMORY_SCOPE_SUB_GROUP": "4", - "__OPENCL_MEMORY_SCOPE_WORK_GROUP": "1", - "__OPENCL_MEMORY_SCOPE_WORK_ITEM": "0", - "__ORDER_BIG_ENDIAN__": "4321", - "__ORDER_LITTLE_ENDIAN__": "1234", - "__ORDER_PDP_ENDIAN__": "3412", - "__PCLMUL__": "1", - "__PIC__": "2", - "__POINTER_WIDTH__": "64", - "__POPCNT__": "1", - "__PRAGMA_REDEFINE_EXTNAME": "1", - "__PRFCHW__": "1", - "__PTRDIFF_FMTd__": "\"lld\"", - "__PTRDIFF_FMTi__": "\"lli\"", - "__PTRDIFF_MAX__": "9223372036854775807LL", - "__PTRDIFF_TYPE__": "long long int", - "__PTRDIFF_WIDTH__": "64", - "__RDPID__": "1", - "__RDRND__": "1", - "__RDSEED__": "1", - "__REGISTER_PREFIX_": " ", - "__SCHAR_MAX__": "127", - "__SEG_FS": "1", - "__SEG_GS": "1", - "__SHA__": "1", - "__SHRT_MAX__": "32767", - "__SHRT_WIDTH__": "16", - "__SIG_ATOMIC_MAX__": "2147483647", - "__SIG_ATOMIC_WIDTH__": "32", - "__SIZEOF_DOUBLE__": "8", - "__SIZEOF_FLOAT__": "4", - "__SIZEOF_INT128__": "16", - "__SIZEOF_INT__": "4", - "__SIZEOF_LONG_DOUBLE__": "8", - "__SIZEOF_LONG_LONG__": "8", - "__SIZEOF_LONG__": "4", - "__SIZEOF_POINTER__": "8", - "__SIZEOF_PTRDIFF_T__": "8", - "__SIZEOF_SHORT__": "2", - "__SIZEOF_SIZE_T__": "8", - "__SIZEOF_WCHAR_T__": "2", - "__SIZEOF_WINT_T__": "2", - "__SIZE_FMTX__": "\"llX\"", - "__SIZE_FMTo__": "\"llo\"", - "__SIZE_FMTu__": "\"llu\"", - "__SIZE_FMTx__": "\"llx\"", - "__SIZE_MAX__": "18446744073709551615ULL", - "__SIZE_TYPE__": "long long unsigned int", - "__SIZE_WIDTH__": "64", - "__SSE2_MATH__": "1", - "__SSE2__": "1", - "__SSE3__": "1", - "__SSE4A__": "1", - "__SSE4_1__": "1", - "__SSE4_2__": "1", - "__SSE_MATH__": "1", - "__SSE__": "1", - "__SSSE3__": "1", - "__STDCPP_DEFAULT_NEW_ALIGNMENT__": "16ULL", - "__STDCPP_THREADS__": "1", - "__STDC_HOSTED__": "1", - "__STDC_NO_THREADS__": "1", - "__STDC_UTF_16__": "1", - "__STDC_UTF_32__": "1", - "__UINT16_C_SUFFIX_": " ", - "__UINT16_FMTX__": "\"hX\"", - "__UINT16_FMTo__": "\"ho\"", - "__UINT16_FMTu__": "\"hu\"", - "__UINT16_FMTx__": "\"hx\"", - "__UINT16_MAX__": "65535", - "__UINT16_TYPE__": "unsigned short", - "__UINT32_C_SUFFIX__": "U", - "__UINT32_FMTX__": "\"X\"", - "__UINT32_FMTo__": "\"o\"", - "__UINT32_FMTu__": "\"u\"", - "__UINT32_FMTx__": "\"x\"", - "__UINT32_MAX__": "4294967295U", - "__UINT32_TYPE__": "unsigned int", - "__UINT64_C_SUFFIX__": "ULL", - "__UINT64_FMTX__": "\"llX\"", - "__UINT64_FMTo__": "\"llo\"", - "__UINT64_FMTu__": "\"llu\"", - "__UINT64_FMTx__": "\"llx\"", - "__UINT64_MAX__": "18446744073709551615ULL", - "__UINT64_TYPE__": "long long unsigned int", - "__UINT8_C_SUFFIX_": " ", - "__UINT8_FMTX__": "\"hhX\"", - "__UINT8_FMTo__": "\"hho\"", - "__UINT8_FMTu__": "\"hhu\"", - "__UINT8_FMTx__": "\"hhx\"", - "__UINT8_MAX__": "255", - "__UINT8_TYPE__": "unsigned char", - "__UINTMAX_C_SUFFIX__": "ULL", - "__UINTMAX_FMTX__": "\"llX\"", - "__UINTMAX_FMTo__": "\"llo\"", - "__UINTMAX_FMTu__": "\"llu\"", - "__UINTMAX_FMTx__": "\"llx\"", - "__UINTMAX_MAX__": "18446744073709551615ULL", - "__UINTMAX_TYPE__": "long long unsigned int", - "__UINTMAX_WIDTH__": "64", - "__UINTPTR_FMTX__": "\"llX\"", - "__UINTPTR_FMTo__": "\"llo\"", - "__UINTPTR_FMTu__": "\"llu\"", - "__UINTPTR_FMTx__": "\"llx\"", - "__UINTPTR_MAX__": "18446744073709551615ULL", - "__UINTPTR_TYPE__": "long long unsigned int", - "__UINTPTR_WIDTH__": "64", - "__UINT_FAST16_FMTX__": "\"hX\"", - "__UINT_FAST16_FMTo__": "\"ho\"", - "__UINT_FAST16_FMTu__": "\"hu\"", - "__UINT_FAST16_FMTx__": "\"hx\"", - "__UINT_FAST16_MAX__": "65535", - "__UINT_FAST16_TYPE__": "unsigned short", - "__UINT_FAST32_FMTX__": "\"X\"", - "__UINT_FAST32_FMTo__": "\"o\"", - "__UINT_FAST32_FMTu__": "\"u\"", - "__UINT_FAST32_FMTx__": "\"x\"", - "__UINT_FAST32_MAX__": "4294967295U", - "__UINT_FAST32_TYPE__": "unsigned int", - "__UINT_FAST64_FMTX__": "\"llX\"", - "__UINT_FAST64_FMTo__": "\"llo\"", - "__UINT_FAST64_FMTu__": "\"llu\"", - "__UINT_FAST64_FMTx__": "\"llx\"", - "__UINT_FAST64_MAX__": "18446744073709551615ULL", - "__UINT_FAST64_TYPE__": "long long unsigned int", - "__UINT_FAST8_FMTX__": "\"hhX\"", - "__UINT_FAST8_FMTo__": "\"hho\"", - "__UINT_FAST8_FMTu__": "\"hhu\"", - "__UINT_FAST8_FMTx__": "\"hhx\"", - "__UINT_FAST8_MAX__": "255", - "__UINT_FAST8_TYPE__": "unsigned char", - "__UINT_LEAST16_FMTX__": "\"hX\"", - "__UINT_LEAST16_FMTo__": "\"ho\"", - "__UINT_LEAST16_FMTu__": "\"hu\"", - "__UINT_LEAST16_FMTx__": "\"hx\"", - "__UINT_LEAST16_MAX__": "65535", - "__UINT_LEAST16_TYPE__": "unsigned short", - "__UINT_LEAST32_FMTX__": "\"X\"", - "__UINT_LEAST32_FMTo__": "\"o\"", - "__UINT_LEAST32_FMTu__": "\"u\"", - "__UINT_LEAST32_FMTx__": "\"x\"", - "__UINT_LEAST32_MAX__": "4294967295U", - "__UINT_LEAST32_TYPE__": "unsigned int", - "__UINT_LEAST64_FMTX__": "\"llX\"", - "__UINT_LEAST64_FMTo__": "\"llo\"", - "__UINT_LEAST64_FMTu__": "\"llu\"", - "__UINT_LEAST64_FMTx__": "\"llx\"", - "__UINT_LEAST64_MAX__": "18446744073709551615ULL", - "__UINT_LEAST64_TYPE__": "long long unsigned int", - "__UINT_LEAST8_FMTX__": "\"hhX\"", - "__UINT_LEAST8_FMTo__": "\"hho\"", - "__UINT_LEAST8_FMTu__": "\"hhu\"", - "__UINT_LEAST8_FMTx__": "\"hhx\"", - "__UINT_LEAST8_MAX__": "255", - "__UINT_LEAST8_TYPE__": "unsigned char", - "__USER_LABEL_PREFIX_": " ", - "__VERSION__": "\"Clang 14.0.6\"", - "__WBNOINVD__": "1", - "__WCHAR_MAX__": "65535", - "__WCHAR_TYPE__": "unsigned short", - "__WCHAR_UNSIGNED__": "1", - "__WCHAR_WIDTH__": "16", - "__WINT_MAX__": "65535", - "__WINT_TYPE__": "unsigned short", - "__WINT_UNSIGNED__": "1", - "__WINT_WIDTH__": "16", - "__XSAVEC__": "1", - "__XSAVEOPT__": "1", - "__XSAVES__": "1", - "__XSAVE__": "1", - "__amd64": "1", - "__amd64__": "1", - "__clang__": "1", - "__clang_literal_encoding__": "\"UTF-8\"", - "__clang_major__": "14", - "__clang_minor__": "0", - "__clang_patchlevel__": "6", - "__clang_version__": "\"14.0.6 \"", - "__clang_wide_literal_encoding__": "\"UTF-16\"", - "__code_model_small__": "1", - "__cplusplus": "201703L", - "__cpp_aggregate_bases": "201603L", - "__cpp_aggregate_nsdmi": "201304L", - "__cpp_alias_templates": "200704L", - "__cpp_aligned_new": "201606L", - "__cpp_attributes": "200809L", - "__cpp_binary_literals": "201304L", - "__cpp_capture_star_this": "201603L", - "__cpp_constexpr": "201603L", - "__cpp_constexpr_in_decltype": "201711L", - "__cpp_decltype": "200707L", - "__cpp_decltype_auto": "201304L", - "__cpp_deduction_guides": "201703L", - "__cpp_delegating_constructors": "200604L", - "__cpp_digit_separators": "201309L", - "__cpp_enumerator_attributes": "201411L", - "__cpp_fold_expressions": "201603L", - "__cpp_generic_lambdas": "201304L", - "__cpp_guaranteed_copy_elision": "201606L", - "__cpp_hex_float": "201603L", - "__cpp_if_constexpr": "201606L", - "__cpp_impl_destroying_delete": "201806L", - "__cpp_inheriting_constructors": "201511L", - "__cpp_init_captures": "201304L", - "__cpp_initializer_lists": "200806L", - "__cpp_inline_variables": "201606L", - "__cpp_lambdas": "200907L", - "__cpp_namespace_attributes": "201411L", - "__cpp_nested_namespace_definitions": "201411L", - "__cpp_noexcept_function_type": "201510L", - "__cpp_nontype_template_args": "201411L", - "__cpp_nontype_template_parameter_auto": "201606L", - "__cpp_nsdmi": "200809L", - "__cpp_range_based_for": "201603L", - "__cpp_raw_strings": "200710L", - "__cpp_ref_qualifiers": "200710L", - "__cpp_return_type_deduction": "201304L", - "__cpp_rtti": "199711L", - "__cpp_rvalue_references": "200610L", - "__cpp_static_assert": "201411L", - "__cpp_structured_bindings": "201606L", - "__cpp_template_auto": "201606L", - "__cpp_threadsafe_static_init": "200806L", - "__cpp_unicode_characters": "200704L", - "__cpp_unicode_literals": "200710L", - "__cpp_user_defined_literals": "200809L", - "__cpp_variable_templates": "201304L", - "__cpp_variadic_templates": "200704L", - "__cpp_variadic_using": "201611L", - "__llvm__": "1", - "__pic__": "2", - "__seg_fs": "__attribute__((address_space(257)))", - "__seg_gs": "__attribute__((address_space(256)))", - "__tune_znver2__": "1", - "__x86_64": "1", - "__x86_64__": "1", - "__znver2": "1", - "__znver2__": "1", - "__builtin_expect(x,y)": "0", - "__building_module(x)": "0", - "__has_warning(x)": "0" - }, - "cpp_user_defines": { - }, - "cpp_user_undefines": [ - ], - "c_compiler_defines": { - "_CHAR_UNSIGNED": "1", - "_DLL": "1", - "_INTEGRAL_MAX_BITS": "64", - "_MSC_BUILD": "1", - "_MSC_EXTENSIONS": "1", - "_MSC_FULL_VER": "192930038", - "_MSC_VER": "1929", - "_MSVC_EXECUTION_CHARACTER_SET": "65001", - "_MT": "1", - "_M_AMD64": "100", - "_M_X64": "100", - "_WIN32": "1", - "_WIN64": "1", - "__ADX__": "1", - "__AES__": "1", - "__ATOMIC_ACQUIRE": "2", - "__ATOMIC_ACQ_REL": "4", - "__ATOMIC_CONSUME": "1", - "__ATOMIC_RELAXED": "0", - "__ATOMIC_RELEASE": "3", - "__ATOMIC_SEQ_CST": "5", - "__AVX2__": "1", - "__AVX__": "1", - "__BIGGEST_ALIGNMENT__": "16", - "__BITINT_MAXWIDTH__": "128", - "__BMI2__": "1", - "__BMI__": "1", - "__BOOL_WIDTH__": "8", - "__BYTE_ORDER__": "__ORDER_LITTLE_ENDIAN__", - "__CHAR16_TYPE__": "unsigned short", - "__CHAR32_TYPE__": "unsigned int", - "__CHAR_BIT__": "8", - "__CHAR_UNSIGNED__": "1", - "__CLANG_ATOMIC_BOOL_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR16_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR32_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR_LOCK_FREE": "2", - "__CLANG_ATOMIC_INT_LOCK_FREE": "2", - "__CLANG_ATOMIC_LLONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_LONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_POINTER_LOCK_FREE": "2", - "__CLANG_ATOMIC_SHORT_LOCK_FREE": "2", - "__CLANG_ATOMIC_WCHAR_T_LOCK_FREE": "2", - "__CLANG_CUDA_APPROX_TRANSCENDENTALS__": "1", - "__CLFLUSHOPT__": "1", - "__CLWB__": "1", - "__CLZERO__": "1", - "__CONSTANT_CFSTRINGS__": "1", - "__CRC32__": "1", - "__DBL_DECIMAL_DIG__": "17", - "__DBL_DENORM_MIN__": "4.9406564584124654e-324", - "__DBL_DIG__": "15", - "__DBL_EPSILON__": "2.2204460492503131e-16", - "__DBL_HAS_DENORM__": "1", - "__DBL_HAS_INFINITY__": "1", - "__DBL_HAS_QUIET_NAN__": "1", - "__DBL_MANT_DIG__": "53", - "__DBL_MAX_10_EXP__": "308", - "__DBL_MAX_EXP__": "1024", - "__DBL_MAX__": "1.7976931348623157e+308", - "__DBL_MIN_10_EXP__": "(-307)", - "__DBL_MIN_EXP__": "(-1021)", - "__DBL_MIN__": "2.2250738585072014e-308", - "__DECIMAL_DIG__": "__LDBL_DECIMAL_DIG__", - "__F16C__": "1", - "__FAST_MATH__": "1", - "__FINITE_MATH_ONLY__": "1", - "__FLT_DECIMAL_DIG__": "9", - "__FLT_DENORM_MIN__": "1.40129846e-45F", - "__FLT_DIG__": "6", - "__FLT_EPSILON__": "1.19209290e-7F", - "__FLT_EVAL_METHOD__": "0", - "__FLT_HAS_DENORM__": "1", - "__FLT_HAS_INFINITY__": "1", - "__FLT_HAS_QUIET_NAN__": "1", - "__FLT_MANT_DIG__": "24", - "__FLT_MAX_10_EXP__": "38", - "__FLT_MAX_EXP__": "128", - "__FLT_MAX__": "3.40282347e+38F", - "__FLT_MIN_10_EXP__": "(-37)", - "__FLT_MIN_EXP__": "(-125)", - "__FLT_MIN__": "1.17549435e-38F", - "__FLT_RADIX__": "2", - "__FMA__": "1", - "__FSGSBASE__": "1", - "__FXSR__": "1", - "__GCC_ASM_FLAG_OUTPUTS__": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8": "1", - "__INT16_C_SUFFIX_": " ", - "__INT16_FMTd__": "\"hd\"", - "__INT16_FMTi__": "\"hi\"", - "__INT16_MAX__": "32767", - "__INT16_TYPE__": "short", - "__INT32_C_SUFFIX_": " ", - "__INT32_FMTd__": "\"d\"", - "__INT32_FMTi__": "\"i\"", - "__INT32_MAX__": "2147483647", - "__INT32_TYPE__": "int", - "__INT64_C_SUFFIX__": "LL", - "__INT64_FMTd__": "\"lld\"", - "__INT64_FMTi__": "\"lli\"", - "__INT64_MAX__": "9223372036854775807LL", - "__INT64_TYPE__": "long long int", - "__INT8_C_SUFFIX_": " ", - "__INT8_FMTd__": "\"hhd\"", - "__INT8_FMTi__": "\"hhi\"", - "__INT8_MAX__": "127", - "__INT8_TYPE__": "signed char", - "__INTMAX_C_SUFFIX__": "LL", - "__INTMAX_FMTd__": "\"lld\"", - "__INTMAX_FMTi__": "\"lli\"", - "__INTMAX_MAX__": "9223372036854775807LL", - "__INTMAX_TYPE__": "long long int", - "__INTMAX_WIDTH__": "64", - "__INTPTR_FMTd__": "\"lld\"", - "__INTPTR_FMTi__": "\"lli\"", - "__INTPTR_MAX__": "9223372036854775807LL", - "__INTPTR_TYPE__": "long long int", - "__INTPTR_WIDTH__": "64", - "__INT_FAST16_FMTd__": "\"hd\"", - "__INT_FAST16_FMTi__": "\"hi\"", - "__INT_FAST16_MAX__": "32767", - "__INT_FAST16_TYPE__": "short", - "__INT_FAST16_WIDTH__": "16", - "__INT_FAST32_FMTd__": "\"d\"", - "__INT_FAST32_FMTi__": "\"i\"", - "__INT_FAST32_MAX__": "2147483647", - "__INT_FAST32_TYPE__": "int", - "__INT_FAST32_WIDTH__": "32", - "__INT_FAST64_FMTd__": "\"lld\"", - "__INT_FAST64_FMTi__": "\"lli\"", - "__INT_FAST64_MAX__": "9223372036854775807LL", - "__INT_FAST64_TYPE__": "long long int", - "__INT_FAST64_WIDTH__": "64", - "__INT_FAST8_FMTd__": "\"hhd\"", - "__INT_FAST8_FMTi__": "\"hhi\"", - "__INT_FAST8_MAX__": "127", - "__INT_FAST8_TYPE__": "signed char", - "__INT_FAST8_WIDTH__": "8", - "__INT_LEAST16_FMTd__": "\"hd\"", - "__INT_LEAST16_FMTi__": "\"hi\"", - "__INT_LEAST16_MAX__": "32767", - "__INT_LEAST16_TYPE__": "short", - "__INT_LEAST16_WIDTH__": "16", - "__INT_LEAST32_FMTd__": "\"d\"", - "__INT_LEAST32_FMTi__": "\"i\"", - "__INT_LEAST32_MAX__": "2147483647", - "__INT_LEAST32_TYPE__": "int", - "__INT_LEAST32_WIDTH__": "32", - "__INT_LEAST64_FMTd__": "\"lld\"", - "__INT_LEAST64_FMTi__": "\"lli\"", - "__INT_LEAST64_MAX__": "9223372036854775807LL", - "__INT_LEAST64_TYPE__": "long long int", - "__INT_LEAST64_WIDTH__": "64", - "__INT_LEAST8_FMTd__": "\"hhd\"", - "__INT_LEAST8_FMTi__": "\"hhi\"", - "__INT_LEAST8_MAX__": "127", - "__INT_LEAST8_TYPE__": "signed char", - "__INT_LEAST8_WIDTH__": "8", - "__INT_MAX__": "2147483647", - "__INT_WIDTH__": "32", - "__LAHF_SAHF__": "1", - "__LDBL_DECIMAL_DIG__": "17", - "__LDBL_DENORM_MIN__": "4.9406564584124654e-324L", - "__LDBL_DIG__": "15", - "__LDBL_EPSILON__": "2.2204460492503131e-16L", - "__LDBL_HAS_DENORM__": "1", - "__LDBL_HAS_INFINITY__": "1", - "__LDBL_HAS_QUIET_NAN__": "1", - "__LDBL_MANT_DIG__": "53", - "__LDBL_MAX_10_EXP__": "308", - "__LDBL_MAX_EXP__": "1024", - "__LDBL_MAX__": "1.7976931348623157e+308L", - "__LDBL_MIN_10_EXP__": "(-307)", - "__LDBL_MIN_EXP__": "(-1021)", - "__LDBL_MIN__": "2.2250738585072014e-308L", - "__LITTLE_ENDIAN__": "1", - "__LLONG_WIDTH__": "64", - "__LONG_LONG_MAX__": "9223372036854775807LL", - "__LONG_MAX__": "2147483647L", - "__LONG_WIDTH__": "32", - "__LZCNT__": "1", - "__MMX__": "1", - "__MOVBE__": "1", - "__MWAITX__": "1", - "__NO_MATH_ERRNO__": "1", - "__NO_MATH_INLINES": "1", - "__OBJC_BOOL_IS_BOOL": "0", - "__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES": "3", - "__OPENCL_MEMORY_SCOPE_DEVICE": "2", - "__OPENCL_MEMORY_SCOPE_SUB_GROUP": "4", - "__OPENCL_MEMORY_SCOPE_WORK_GROUP": "1", - "__OPENCL_MEMORY_SCOPE_WORK_ITEM": "0", - "__ORDER_BIG_ENDIAN__": "4321", - "__ORDER_LITTLE_ENDIAN__": "1234", - "__ORDER_PDP_ENDIAN__": "3412", - "__PCLMUL__": "1", - "__PIC__": "2", - "__POINTER_WIDTH__": "64", - "__POPCNT__": "1", - "__PRAGMA_REDEFINE_EXTNAME": "1", - "__PRFCHW__": "1", - "__PTRDIFF_FMTd__": "\"lld\"", - "__PTRDIFF_FMTi__": "\"lli\"", - "__PTRDIFF_MAX__": "9223372036854775807LL", - "__PTRDIFF_TYPE__": "long long int", - "__PTRDIFF_WIDTH__": "64", - "__RDPID__": "1", - "__RDRND__": "1", - "__RDSEED__": "1", - "__REGISTER_PREFIX_": " ", - "__SCHAR_MAX__": "127", - "__SEG_FS": "1", - "__SEG_GS": "1", - "__SHA__": "1", - "__SHRT_MAX__": "32767", - "__SHRT_WIDTH__": "16", - "__SIG_ATOMIC_MAX__": "2147483647", - "__SIG_ATOMIC_WIDTH__": "32", - "__SIZEOF_DOUBLE__": "8", - "__SIZEOF_FLOAT__": "4", - "__SIZEOF_INT128__": "16", - "__SIZEOF_INT__": "4", - "__SIZEOF_LONG_DOUBLE__": "8", - "__SIZEOF_LONG_LONG__": "8", - "__SIZEOF_LONG__": "4", - "__SIZEOF_POINTER__": "8", - "__SIZEOF_PTRDIFF_T__": "8", - "__SIZEOF_SHORT__": "2", - "__SIZEOF_SIZE_T__": "8", - "__SIZEOF_WCHAR_T__": "2", - "__SIZEOF_WINT_T__": "2", - "__SIZE_FMTX__": "\"llX\"", - "__SIZE_FMTo__": "\"llo\"", - "__SIZE_FMTu__": "\"llu\"", - "__SIZE_FMTx__": "\"llx\"", - "__SIZE_MAX__": "18446744073709551615ULL", - "__SIZE_TYPE__": "long long unsigned int", - "__SIZE_WIDTH__": "64", - "__SSE2_MATH__": "1", - "__SSE2__": "1", - "__SSE3__": "1", - "__SSE4A__": "1", - "__SSE4_1__": "1", - "__SSE4_2__": "1", - "__SSE_MATH__": "1", - "__SSE__": "1", - "__SSSE3__": "1", - "__STDC_HOSTED__": "1", - "__STDC_NO_THREADS__": "1", - "__STDC_UTF_16__": "1", - "__STDC_UTF_32__": "1", - "__STDC_VERSION__": "201710L", - "__UINT16_C_SUFFIX_": " ", - "__UINT16_FMTX__": "\"hX\"", - "__UINT16_FMTo__": "\"ho\"", - "__UINT16_FMTu__": "\"hu\"", - "__UINT16_FMTx__": "\"hx\"", - "__UINT16_MAX__": "65535", - "__UINT16_TYPE__": "unsigned short", - "__UINT32_C_SUFFIX__": "U", - "__UINT32_FMTX__": "\"X\"", - "__UINT32_FMTo__": "\"o\"", - "__UINT32_FMTu__": "\"u\"", - "__UINT32_FMTx__": "\"x\"", - "__UINT32_MAX__": "4294967295U", - "__UINT32_TYPE__": "unsigned int", - "__UINT64_C_SUFFIX__": "ULL", - "__UINT64_FMTX__": "\"llX\"", - "__UINT64_FMTo__": "\"llo\"", - "__UINT64_FMTu__": "\"llu\"", - "__UINT64_FMTx__": "\"llx\"", - "__UINT64_MAX__": "18446744073709551615ULL", - "__UINT64_TYPE__": "long long unsigned int", - "__UINT8_C_SUFFIX_": " ", - "__UINT8_FMTX__": "\"hhX\"", - "__UINT8_FMTo__": "\"hho\"", - "__UINT8_FMTu__": "\"hhu\"", - "__UINT8_FMTx__": "\"hhx\"", - "__UINT8_MAX__": "255", - "__UINT8_TYPE__": "unsigned char", - "__UINTMAX_C_SUFFIX__": "ULL", - "__UINTMAX_FMTX__": "\"llX\"", - "__UINTMAX_FMTo__": "\"llo\"", - "__UINTMAX_FMTu__": "\"llu\"", - "__UINTMAX_FMTx__": "\"llx\"", - "__UINTMAX_MAX__": "18446744073709551615ULL", - "__UINTMAX_TYPE__": "long long unsigned int", - "__UINTMAX_WIDTH__": "64", - "__UINTPTR_FMTX__": "\"llX\"", - "__UINTPTR_FMTo__": "\"llo\"", - "__UINTPTR_FMTu__": "\"llu\"", - "__UINTPTR_FMTx__": "\"llx\"", - "__UINTPTR_MAX__": "18446744073709551615ULL", - "__UINTPTR_TYPE__": "long long unsigned int", - "__UINTPTR_WIDTH__": "64", - "__UINT_FAST16_FMTX__": "\"hX\"", - "__UINT_FAST16_FMTo__": "\"ho\"", - "__UINT_FAST16_FMTu__": "\"hu\"", - "__UINT_FAST16_FMTx__": "\"hx\"", - "__UINT_FAST16_MAX__": "65535", - "__UINT_FAST16_TYPE__": "unsigned short", - "__UINT_FAST32_FMTX__": "\"X\"", - "__UINT_FAST32_FMTo__": "\"o\"", - "__UINT_FAST32_FMTu__": "\"u\"", - "__UINT_FAST32_FMTx__": "\"x\"", - "__UINT_FAST32_MAX__": "4294967295U", - "__UINT_FAST32_TYPE__": "unsigned int", - "__UINT_FAST64_FMTX__": "\"llX\"", - "__UINT_FAST64_FMTo__": "\"llo\"", - "__UINT_FAST64_FMTu__": "\"llu\"", - "__UINT_FAST64_FMTx__": "\"llx\"", - "__UINT_FAST64_MAX__": "18446744073709551615ULL", - "__UINT_FAST64_TYPE__": "long long unsigned int", - "__UINT_FAST8_FMTX__": "\"hhX\"", - "__UINT_FAST8_FMTo__": "\"hho\"", - "__UINT_FAST8_FMTu__": "\"hhu\"", - "__UINT_FAST8_FMTx__": "\"hhx\"", - "__UINT_FAST8_MAX__": "255", - "__UINT_FAST8_TYPE__": "unsigned char", - "__UINT_LEAST16_FMTX__": "\"hX\"", - "__UINT_LEAST16_FMTo__": "\"ho\"", - "__UINT_LEAST16_FMTu__": "\"hu\"", - "__UINT_LEAST16_FMTx__": "\"hx\"", - "__UINT_LEAST16_MAX__": "65535", - "__UINT_LEAST16_TYPE__": "unsigned short", - "__UINT_LEAST32_FMTX__": "\"X\"", - "__UINT_LEAST32_FMTo__": "\"o\"", - "__UINT_LEAST32_FMTu__": "\"u\"", - "__UINT_LEAST32_FMTx__": "\"x\"", - "__UINT_LEAST32_MAX__": "4294967295U", - "__UINT_LEAST32_TYPE__": "unsigned int", - "__UINT_LEAST64_FMTX__": "\"llX\"", - "__UINT_LEAST64_FMTo__": "\"llo\"", - "__UINT_LEAST64_FMTu__": "\"llu\"", - "__UINT_LEAST64_FMTx__": "\"llx\"", - "__UINT_LEAST64_MAX__": "18446744073709551615ULL", - "__UINT_LEAST64_TYPE__": "long long unsigned int", - "__UINT_LEAST8_FMTX__": "\"hhX\"", - "__UINT_LEAST8_FMTo__": "\"hho\"", - "__UINT_LEAST8_FMTu__": "\"hhu\"", - "__UINT_LEAST8_FMTx__": "\"hhx\"", - "__UINT_LEAST8_MAX__": "255", - "__UINT_LEAST8_TYPE__": "unsigned char", - "__USER_LABEL_PREFIX_": " ", - "__VERSION__": "\"Clang 14.0.6\"", - "__WBNOINVD__": "1", - "__WCHAR_MAX__": "65535", - "__WCHAR_TYPE__": "unsigned short", - "__WCHAR_UNSIGNED__": "1", - "__WCHAR_WIDTH__": "16", - "__WINT_MAX__": "65535", - "__WINT_TYPE__": "unsigned short", - "__WINT_UNSIGNED__": "1", - "__WINT_WIDTH__": "16", - "__XSAVEC__": "1", - "__XSAVEOPT__": "1", - "__XSAVES__": "1", - "__XSAVE__": "1", - "__amd64": "1", - "__amd64__": "1", - "__clang__": "1", - "__clang_literal_encoding__": "\"UTF-8\"", - "__clang_major__": "14", - "__clang_minor__": "0", - "__clang_patchlevel__": "6", - "__clang_version__": "\"14.0.6 \"", - "__clang_wide_literal_encoding__": "\"UTF-16\"", - "__code_model_small__": "1", - "__llvm__": "1", - "__pic__": "2", - "__seg_fs": "__attribute__((address_space(257)))", - "__seg_gs": "__attribute__((address_space(256)))", - "__tune_znver2__": "1", - "__x86_64": "1", - "__x86_64__": "1", - "__znver2": "1", - "__znver2__": "1" - }, - "c_user_defines": { - }, - "c_user_undefines": [ - ] - }, - "target_sizes": { - "char_bit": 8, - "short": 2, - "int": 4, - "long": 4, - "float": 4, - "double": 8, - "long_double": 8, - "pointer": 8, - "ldbl_mant_dig": 53, - "char": 1 - }, - "wchar_t_type": "short", - "ptrdiff_t_type": "long long", - "size_t_type": "unsigned long long", - "supports_x86_64": true -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/isense/readme b/prog/_jBuild/msbuild/isense/readme deleted file mode 100644 index ef0afc7c0..000000000 --- a/prog/_jBuild/msbuild/isense/readme +++ /dev/null @@ -1,18 +0,0 @@ -To set valid values in the .json file this steps needed. - -- extract relevant C and C++ command line arguments from jam build. - e.g. jam -sPlatform=ps5 -sConfig=dev -sGame=cuisine_royale -a -n > ps5.log -- create empty files - type nul > temp.c - type nul > temp.cpp -- call the compiler with -dM -E - e.g. - prospero-clang.exe -c -MD -ffunction-sections -fdata-sections -ffast-math -fdiagnostics-absolute-paths -g -dM -E temp.c > c.defines - prospero-clang.exe -c -MD -ffunction-sections -fdata-sections -ffast-math -fdiagnostics-absolute-paths -std=c++14 -fno-rtti -fno-exceptions -Wno-c++1z-compat -O3 -g -dM -E temp.cpp > cpp.defines - convert json from defines -- replace all `"` to `\"` in .defines file -- in notepad++ execute this regex replace. - from: \S+.(\S+).(.+) - to: "\1": "\2", -- copy the result json elements to the corresponding json file, corresponding json array - e.g ps5.json , { "predefines": { "cpp_compiler_defines": {... diff --git a/prog/_jBuild/msbuild/isense/win64.h b/prog/_jBuild/msbuild/isense/win64.h deleted file mode 100644 index ad3815c88..000000000 --- a/prog/_jBuild/msbuild/isense/win64.h +++ /dev/null @@ -1,33 +0,0 @@ -template -v4si __builtin_ia32_pshufd (v4si, int); - -template -v4si __builtin_ia32_shufps (v4si, v4si, int); - -template -__v16qu __builtin_elementwise_min (__v16qu, __v16qu); - -template -__v16qu __builtin_elementwise_max (__v16qu, __v16qu); - -// Forward declaration for BuiltinStringId, because the EDG in clang mode doesn't like the typeless enum; -// and give "declaration of enum type is nonstandard" error. -// https://stackoverflow.com/a/72599 - -namespace dagui -{ - enum BuiltinStringId : int; -} - -// Forward declaration for normalizeDef with rvalue override, because the EDG in clang mode falsely -// selects the (Point3 &, const Point3 &) in case of xvalue is the first parameter. - -class Point2; -inline Point2 normalizeDef(const Point2& a, const Point2& def); -inline Point2 normalizeDef(Point2&& a, const Point2& def); -inline void normalizeDef(Point2& a, const Point2& def); - -class Point3; -inline Point3 normalizeDef(const Point3 &a, const Point3 & def); -inline Point3 normalizeDef(Point3 &&a, const Point3 & def); -inline void normalizeDef(Point3 &a, const Point3 & def); diff --git a/prog/_jBuild/msbuild/isense/win64.json b/prog/_jBuild/msbuild/isense/win64.json deleted file mode 100644 index ce2f904a8..000000000 --- a/prog/_jBuild/msbuild/isense/win64.json +++ /dev/null @@ -1,795 +0,0 @@ -{ - "predefines": { - "cpp_compiler_defines": { - "_CHAR_UNSIGNED": "1", - "_HAS_CHAR16_T_LANGUAGE_SUPPORT": "1", - "_INTEGRAL_MAX_BITS": "64", - "_MSC_BUILD": "1", - "_MSC_EXTENSIONS": "1", - "_MSC_FULL_VER": "192930038", - "_MSC_VER": "1929", - "_MSVC_EXECUTION_CHARACTER_SET": "65001", - "_MSVC_LANG": "201703L", - "_MT": "1", - "_M_AMD64": "100", - "_M_X64": "100", - "_NATIVE_NULLPTR_SUPPORTED": "1", - "_NATIVE_WCHAR_T_DEFINED": "1", - "_RVALUE_REFERENCES_SUPPORTED": "1", - "_RVALUE_REFERENCES_V2_SUPPORTED": "1", - "_WCHAR_T_DEFINED": "1", - "_WIN32": "1", - "_WIN64": "1", - "__ATOMIC_ACQUIRE": "2", - "__ATOMIC_ACQ_REL": "4", - "__ATOMIC_CONSUME": "1", - "__ATOMIC_RELAXED": "0", - "__ATOMIC_RELEASE": "3", - "__ATOMIC_SEQ_CST": "5", - "__BIGGEST_ALIGNMENT__": "16", - "__BITINT_MAXWIDTH__": "128", - "__BOOL_DEFINED": "1", - "__BOOL_WIDTH__": "8", - "__BYTE_ORDER__": "__ORDER_LITTLE_ENDIAN__", - "__CHAR16_TYPE__": "unsigned short", - "__CHAR32_TYPE__": "unsigned int", - "__CHAR_BIT__": "8", - "__CHAR_UNSIGNED__": "1", - "__CLANG_ATOMIC_BOOL_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR16_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR32_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR_LOCK_FREE": "2", - "__CLANG_ATOMIC_INT_LOCK_FREE": "2", - "__CLANG_ATOMIC_LLONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_LONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_POINTER_LOCK_FREE": "2", - "__CLANG_ATOMIC_SHORT_LOCK_FREE": "2", - "__CLANG_ATOMIC_WCHAR_T_LOCK_FREE": "2", - "__CLANG_CUDA_APPROX_TRANSCENDENTALS__": "1", - "__CONSTANT_CFSTRINGS__": "1", - "__DBL_DECIMAL_DIG__": "17", - "__DBL_DENORM_MIN__": "4.9406564584124654e-324", - "__DBL_DIG__": "15", - "__DBL_EPSILON__": "2.2204460492503131e-16", - "__DBL_HAS_DENORM__": "1", - "__DBL_HAS_INFINITY__": "1", - "__DBL_HAS_QUIET_NAN__": "1", - "__DBL_MANT_DIG__": "53", - "__DBL_MAX_10_EXP__": "308", - "__DBL_MAX_EXP__": "1024", - "__DBL_MAX__": "1.7976931348623157e+308", - "__DBL_MIN_10_EXP__": "(-307)", - "__DBL_MIN_EXP__": "(-1021)", - "__DBL_MIN__": "2.2250738585072014e-308", - "__DECIMAL_DIG__": "__LDBL_DECIMAL_DIG__", - "__DEPRECATED": "1", - "__FAST_MATH__": "1", - "__FINITE_MATH_ONLY__": "1", - "__FLT_DECIMAL_DIG__": "9", - "__FLT_DENORM_MIN__": "1.40129846e-45F", - "__FLT_DIG__": "6", - "__FLT_EPSILON__": "1.19209290e-7F", - "__FLT_EVAL_METHOD__": "0", - "__FLT_HAS_DENORM__": "1", - "__FLT_HAS_INFINITY__": "1", - "__FLT_HAS_QUIET_NAN__": "1", - "__FLT_MANT_DIG__": "24", - "__FLT_MAX_10_EXP__": "38", - "__FLT_MAX_EXP__": "128", - "__FLT_MAX__": "3.40282347e+38F", - "__FLT_MIN_10_EXP__": "(-37)", - "__FLT_MIN_EXP__": "(-125)", - "__FLT_MIN__": "1.17549435e-38F", - "__FLT_RADIX__": "2", - "__FXSR__": "1", - "__GCC_ASM_FLAG_OUTPUTS__": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8": "1", - "__INT16_C_SUFFIX_": " ", - "__INT16_FMTd__": "\"hd\"", - "__INT16_FMTi__": "\"hi\"", - "__INT16_MAX__": "32767", - "__INT16_TYPE__": "short", - "__INT32_C_SUFFIX_": " ", - "__INT32_FMTd__": "\"d\"", - "__INT32_FMTi__": "\"i\"", - "__INT32_MAX__": "2147483647", - "__INT32_TYPE__": "int", - "__INT64_C_SUFFIX__": "LL", - "__INT64_FMTd__": "\"lld\"", - "__INT64_FMTi__": "\"lli\"", - "__INT64_MAX__": "9223372036854775807LL", - "__INT64_TYPE__": "long long int", - "__INT8_C_SUFFIX_": " ", - "__INT8_FMTd__": "\"hhd\"", - "__INT8_FMTi__": "\"hhi\"", - "__INT8_MAX__": "127", - "__INT8_TYPE__": "signed char", - "__INTMAX_C_SUFFIX__": "LL", - "__INTMAX_FMTd__": "\"lld\"", - "__INTMAX_FMTi__": "\"lli\"", - "__INTMAX_MAX__": "9223372036854775807LL", - "__INTMAX_TYPE__": "long long int", - "__INTMAX_WIDTH__": "64", - "__INTPTR_FMTd__": "\"lld\"", - "__INTPTR_FMTi__": "\"lli\"", - "__INTPTR_MAX__": "9223372036854775807LL", - "__INTPTR_TYPE__": "long long int", - "__INTPTR_WIDTH__": "64", - "__INT_FAST16_FMTd__": "\"hd\"", - "__INT_FAST16_FMTi__": "\"hi\"", - "__INT_FAST16_MAX__": "32767", - "__INT_FAST16_TYPE__": "short", - "__INT_FAST16_WIDTH__": "16", - "__INT_FAST32_FMTd__": "\"d\"", - "__INT_FAST32_FMTi__": "\"i\"", - "__INT_FAST32_MAX__": "2147483647", - "__INT_FAST32_TYPE__": "int", - "__INT_FAST32_WIDTH__": "32", - "__INT_FAST64_FMTd__": "\"lld\"", - "__INT_FAST64_FMTi__": "\"lli\"", - "__INT_FAST64_MAX__": "9223372036854775807LL", - "__INT_FAST64_TYPE__": "long long int", - "__INT_FAST64_WIDTH__": "64", - "__INT_FAST8_FMTd__": "\"hhd\"", - "__INT_FAST8_FMTi__": "\"hhi\"", - "__INT_FAST8_MAX__": "127", - "__INT_FAST8_TYPE__": "signed char", - "__INT_FAST8_WIDTH__": "8", - "__INT_LEAST16_FMTd__": "\"hd\"", - "__INT_LEAST16_FMTi__": "\"hi\"", - "__INT_LEAST16_MAX__": "32767", - "__INT_LEAST16_TYPE__": "short", - "__INT_LEAST16_WIDTH__": "16", - "__INT_LEAST32_FMTd__": "\"d\"", - "__INT_LEAST32_FMTi__": "\"i\"", - "__INT_LEAST32_MAX__": "2147483647", - "__INT_LEAST32_TYPE__": "int", - "__INT_LEAST32_WIDTH__": "32", - "__INT_LEAST64_FMTd__": "\"lld\"", - "__INT_LEAST64_FMTi__": "\"lli\"", - "__INT_LEAST64_MAX__": "9223372036854775807LL", - "__INT_LEAST64_TYPE__": "long long int", - "__INT_LEAST64_WIDTH__": "64", - "__INT_LEAST8_FMTd__": "\"hhd\"", - "__INT_LEAST8_FMTi__": "\"hhi\"", - "__INT_LEAST8_MAX__": "127", - "__INT_LEAST8_TYPE__": "signed char", - "__INT_LEAST8_WIDTH__": "8", - "__INT_MAX__": "2147483647", - "__INT_WIDTH__": "32", - "__LDBL_DECIMAL_DIG__": "17", - "__LDBL_DENORM_MIN__": "4.9406564584124654e-324L", - "__LDBL_DIG__": "15", - "__LDBL_EPSILON__": "2.2204460492503131e-16L", - "__LDBL_HAS_DENORM__": "1", - "__LDBL_HAS_INFINITY__": "1", - "__LDBL_HAS_QUIET_NAN__": "1", - "__LDBL_MANT_DIG__": "53", - "__LDBL_MAX_10_EXP__": "308", - "__LDBL_MAX_EXP__": "1024", - "__LDBL_MAX__": "1.7976931348623157e+308L", - "__LDBL_MIN_10_EXP__": "(-307)", - "__LDBL_MIN_EXP__": "(-1021)", - "__LDBL_MIN__": "2.2250738585072014e-308L", - "__LITTLE_ENDIAN__": "1", - "__LLONG_WIDTH__": "64", - "__LONG_LONG_MAX__": "9223372036854775807LL", - "__LONG_MAX__": "2147483647L", - "__LONG_WIDTH__": "32", - "__MMX__": "1", - "__NO_MATH_ERRNO__": "1", - "__NO_MATH_INLINES": "1", - "__OBJC_BOOL_IS_BOOL": "0", - "__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES": "3", - "__OPENCL_MEMORY_SCOPE_DEVICE": "2", - "__OPENCL_MEMORY_SCOPE_SUB_GROUP": "4", - "__OPENCL_MEMORY_SCOPE_WORK_GROUP": "1", - "__OPENCL_MEMORY_SCOPE_WORK_ITEM": "0", - "__OPTIMIZE__": "1", - "__ORDER_BIG_ENDIAN__": "4321", - "__ORDER_LITTLE_ENDIAN__": "1234", - "__ORDER_PDP_ENDIAN__": "3412", - "__PIC__": "2", - "__POINTER_WIDTH__": "64", - "__POPCNT__": "1", - "__PRAGMA_REDEFINE_EXTNAME": "1", - "__PTRDIFF_FMTd__": "\"lld\"", - "__PTRDIFF_FMTi__": "\"lli\"", - "__PTRDIFF_MAX__": "9223372036854775807LL", - "__PTRDIFF_TYPE__": "long long int", - "__PTRDIFF_WIDTH__": "64", - "__REGISTER_PREFIX_": " ", - "__SCHAR_MAX__": "127", - "__SEG_FS": "1", - "__SEG_GS": "1", - "__SHRT_MAX__": "32767", - "__SHRT_WIDTH__": "16", - "__SIG_ATOMIC_MAX__": "2147483647", - "__SIG_ATOMIC_WIDTH__": "32", - "__SIZEOF_DOUBLE__": "8", - "__SIZEOF_FLOAT__": "4", - "__SIZEOF_INT128__": "16", - "__SIZEOF_INT__": "4", - "__SIZEOF_LONG_DOUBLE__": "8", - "__SIZEOF_LONG_LONG__": "8", - "__SIZEOF_LONG__": "4", - "__SIZEOF_POINTER__": "8", - "__SIZEOF_PTRDIFF_T__": "8", - "__SIZEOF_SHORT__": "2", - "__SIZEOF_SIZE_T__": "8", - "__SIZEOF_WCHAR_T__": "2", - "__SIZEOF_WINT_T__": "2", - "__SIZE_FMTX__": "\"llX\"", - "__SIZE_FMTo__": "\"llo\"", - "__SIZE_FMTu__": "\"llu\"", - "__SIZE_FMTx__": "\"llx\"", - "__SIZE_MAX__": "18446744073709551615ULL", - "__SIZE_TYPE__": "long long unsigned int", - "__SIZE_WIDTH__": "64", - "__SSE2_MATH__": "1", - "__SSE2__": "1", - "__SSE3__": "1", - "__SSE4_1__": "1", - "__SSE_MATH__": "1", - "__SSE__": "1", - "__SSSE3__": "1", - "__STDCPP_DEFAULT_NEW_ALIGNMENT__": "16ULL", - "__STDCPP_THREADS__": "1", - "__STDC_HOSTED__": "1", - "__STDC_NO_THREADS__": "1", - "__STDC_UTF_16__": "1", - "__STDC_UTF_32__": "1", - "__UINT16_C_SUFFIX_": " ", - "__UINT16_FMTX__": "\"hX\"", - "__UINT16_FMTo__": "\"ho\"", - "__UINT16_FMTu__": "\"hu\"", - "__UINT16_FMTx__": "\"hx\"", - "__UINT16_MAX__": "65535", - "__UINT16_TYPE__": "unsigned short", - "__UINT32_C_SUFFIX__": "U", - "__UINT32_FMTX__": "\"X\"", - "__UINT32_FMTo__": "\"o\"", - "__UINT32_FMTu__": "\"u\"", - "__UINT32_FMTx__": "\"x\"", - "__UINT32_MAX__": "4294967295U", - "__UINT32_TYPE__": "unsigned int", - "__UINT64_C_SUFFIX__": "ULL", - "__UINT64_FMTX__": "\"llX\"", - "__UINT64_FMTo__": "\"llo\"", - "__UINT64_FMTu__": "\"llu\"", - "__UINT64_FMTx__": "\"llx\"", - "__UINT64_MAX__": "18446744073709551615ULL", - "__UINT64_TYPE__": "long long unsigned int", - "__UINT8_C_SUFFIX_": " ", - "__UINT8_FMTX__": "\"hhX\"", - "__UINT8_FMTo__": "\"hho\"", - "__UINT8_FMTu__": "\"hhu\"", - "__UINT8_FMTx__": "\"hhx\"", - "__UINT8_MAX__": "255", - "__UINT8_TYPE__": "unsigned char", - "__UINTMAX_C_SUFFIX__": "ULL", - "__UINTMAX_FMTX__": "\"llX\"", - "__UINTMAX_FMTo__": "\"llo\"", - "__UINTMAX_FMTu__": "\"llu\"", - "__UINTMAX_FMTx__": "\"llx\"", - "__UINTMAX_MAX__": "18446744073709551615ULL", - "__UINTMAX_TYPE__": "long long unsigned int", - "__UINTMAX_WIDTH__": "64", - "__UINTPTR_FMTX__": "\"llX\"", - "__UINTPTR_FMTo__": "\"llo\"", - "__UINTPTR_FMTu__": "\"llu\"", - "__UINTPTR_FMTx__": "\"llx\"", - "__UINTPTR_MAX__": "18446744073709551615ULL", - "__UINTPTR_TYPE__": "long long unsigned int", - "__UINTPTR_WIDTH__": "64", - "__UINT_FAST16_FMTX__": "\"hX\"", - "__UINT_FAST16_FMTo__": "\"ho\"", - "__UINT_FAST16_FMTu__": "\"hu\"", - "__UINT_FAST16_FMTx__": "\"hx\"", - "__UINT_FAST16_MAX__": "65535", - "__UINT_FAST16_TYPE__": "unsigned short", - "__UINT_FAST32_FMTX__": "\"X\"", - "__UINT_FAST32_FMTo__": "\"o\"", - "__UINT_FAST32_FMTu__": "\"u\"", - "__UINT_FAST32_FMTx__": "\"x\"", - "__UINT_FAST32_MAX__": "4294967295U", - "__UINT_FAST32_TYPE__": "unsigned int", - "__UINT_FAST64_FMTX__": "\"llX\"", - "__UINT_FAST64_FMTo__": "\"llo\"", - "__UINT_FAST64_FMTu__": "\"llu\"", - "__UINT_FAST64_FMTx__": "\"llx\"", - "__UINT_FAST64_MAX__": "18446744073709551615ULL", - "__UINT_FAST64_TYPE__": "long long unsigned int", - "__UINT_FAST8_FMTX__": "\"hhX\"", - "__UINT_FAST8_FMTo__": "\"hho\"", - "__UINT_FAST8_FMTu__": "\"hhu\"", - "__UINT_FAST8_FMTx__": "\"hhx\"", - "__UINT_FAST8_MAX__": "255", - "__UINT_FAST8_TYPE__": "unsigned char", - "__UINT_LEAST16_FMTX__": "\"hX\"", - "__UINT_LEAST16_FMTo__": "\"ho\"", - "__UINT_LEAST16_FMTu__": "\"hu\"", - "__UINT_LEAST16_FMTx__": "\"hx\"", - "__UINT_LEAST16_MAX__": "65535", - "__UINT_LEAST16_TYPE__": "unsigned short", - "__UINT_LEAST32_FMTX__": "\"X\"", - "__UINT_LEAST32_FMTo__": "\"o\"", - "__UINT_LEAST32_FMTu__": "\"u\"", - "__UINT_LEAST32_FMTx__": "\"x\"", - "__UINT_LEAST32_MAX__": "4294967295U", - "__UINT_LEAST32_TYPE__": "unsigned int", - "__UINT_LEAST64_FMTX__": "\"llX\"", - "__UINT_LEAST64_FMTo__": "\"llo\"", - "__UINT_LEAST64_FMTu__": "\"llu\"", - "__UINT_LEAST64_FMTx__": "\"llx\"", - "__UINT_LEAST64_MAX__": "18446744073709551615ULL", - "__UINT_LEAST64_TYPE__": "long long unsigned int", - "__UINT_LEAST8_FMTX__": "\"hhX\"", - "__UINT_LEAST8_FMTo__": "\"hho\"", - "__UINT_LEAST8_FMTu__": "\"hhu\"", - "__UINT_LEAST8_FMTx__": "\"hhx\"", - "__UINT_LEAST8_MAX__": "255", - "__UINT_LEAST8_TYPE__": "unsigned char", - "__USER_LABEL_PREFIX_": " ", - "__VERSION__": "\"Clang 14.0.6\"", - "__WCHAR_MAX__": "65535", - "__WCHAR_TYPE__": "unsigned short", - "__WCHAR_UNSIGNED__": "1", - "__WCHAR_WIDTH__": "16", - "__WINT_MAX__": "65535", - "__WINT_TYPE__": "unsigned short", - "__WINT_UNSIGNED__": "1", - "__WINT_WIDTH__": "16", - "__amd64": "1", - "__amd64__": "1", - "__clang__": "1", - "__clang_literal_encoding__": "\"UTF-8\"", - "__clang_major__": "14", - "__clang_minor__": "0", - "__clang_patchlevel__": "6", - "__clang_version__": "\"14.0.6 \"", - "__clang_wide_literal_encoding__": "\"UTF-16\"", - "__code_model_small__": "1", - "__cplusplus": "201703L", - "__cpp_aggregate_bases": "201603L", - "__cpp_aggregate_nsdmi": "201304L", - "__cpp_alias_templates": "200704L", - "__cpp_aligned_new": "201606L", - "__cpp_attributes": "200809L", - "__cpp_binary_literals": "201304L", - "__cpp_capture_star_this": "201603L", - "__cpp_constexpr": "201603L", - "__cpp_constexpr_in_decltype": "201711L", - "__cpp_decltype": "200707L", - "__cpp_decltype_auto": "201304L", - "__cpp_deduction_guides": "201703L", - "__cpp_delegating_constructors": "200604L", - "__cpp_digit_separators": "201309L", - "__cpp_enumerator_attributes": "201411L", - "__cpp_fold_expressions": "201603L", - "__cpp_generic_lambdas": "201304L", - "__cpp_guaranteed_copy_elision": "201606L", - "__cpp_hex_float": "201603L", - "__cpp_if_constexpr": "201606L", - "__cpp_impl_destroying_delete": "201806L", - "__cpp_inheriting_constructors": "201511L", - "__cpp_init_captures": "201304L", - "__cpp_initializer_lists": "200806L", - "__cpp_inline_variables": "201606L", - "__cpp_lambdas": "200907L", - "__cpp_namespace_attributes": "201411L", - "__cpp_nested_namespace_definitions": "201411L", - "__cpp_noexcept_function_type": "201510L", - "__cpp_nontype_template_args": "201411L", - "__cpp_nontype_template_parameter_auto": "201606L", - "__cpp_nsdmi": "200809L", - "__cpp_range_based_for": "201603L", - "__cpp_raw_strings": "200710L", - "__cpp_ref_qualifiers": "200710L", - "__cpp_return_type_deduction": "201304L", - "__cpp_rtti": "199711L", - "__cpp_rvalue_references": "200610L", - "__cpp_static_assert": "201411L", - "__cpp_structured_bindings": "201606L", - "__cpp_template_auto": "201606L", - "__cpp_threadsafe_static_init": "200806L", - "__cpp_unicode_characters": "200704L", - "__cpp_unicode_literals": "200710L", - "__cpp_user_defined_literals": "200809L", - "__cpp_variable_templates": "201304L", - "__cpp_variadic_templates": "200704L", - "__cpp_variadic_using": "201611L", - "__k8": "1", - "__k8__": "1", - "__llvm__": "1", - "__pic__": "2", - "__seg_fs": "__attribute__((address_space(257)))", - "__seg_gs": "__attribute__((address_space(256)))", - "__tune_k8__": "1", - "__x86_64": "1", - "__x86_64__": "1", - "__builtin_expect(x,y)": "0", - "__building_module(x)": "0", - "__has_warning(x)": "0" - }, - "cpp_user_defines": { - }, - "cpp_user_undefines": [ - ], - "c_compiler_defines": { - "_CHAR_UNSIGNED": "1", - "_INTEGRAL_MAX_BITS": "64", - "_MSC_BUILD": "1", - "_MSC_EXTENSIONS": "1", - "_MSC_FULL_VER": "192930038", - "_MSC_VER": "1929", - "_MSVC_EXECUTION_CHARACTER_SET": "65001", - "_MT": "1", - "_M_AMD64": "100", - "_M_X64": "100", - "_WIN32": "1", - "_WIN64": "1", - "__ATOMIC_ACQUIRE": "2", - "__ATOMIC_ACQ_REL": "4", - "__ATOMIC_CONSUME": "1", - "__ATOMIC_RELAXED": "0", - "__ATOMIC_RELEASE": "3", - "__ATOMIC_SEQ_CST": "5", - "__BIGGEST_ALIGNMENT__": "16", - "__BITINT_MAXWIDTH__": "128", - "__BOOL_WIDTH__": "8", - "__BYTE_ORDER__": "__ORDER_LITTLE_ENDIAN__", - "__CHAR16_TYPE__": "unsigned short", - "__CHAR32_TYPE__": "unsigned int", - "__CHAR_BIT__": "8", - "__CHAR_UNSIGNED__": "1", - "__CLANG_ATOMIC_BOOL_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR16_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR32_T_LOCK_FREE": "2", - "__CLANG_ATOMIC_CHAR_LOCK_FREE": "2", - "__CLANG_ATOMIC_INT_LOCK_FREE": "2", - "__CLANG_ATOMIC_LLONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_LONG_LOCK_FREE": "2", - "__CLANG_ATOMIC_POINTER_LOCK_FREE": "2", - "__CLANG_ATOMIC_SHORT_LOCK_FREE": "2", - "__CLANG_ATOMIC_WCHAR_T_LOCK_FREE": "2", - "__CLANG_CUDA_APPROX_TRANSCENDENTALS__": "1", - "__CONSTANT_CFSTRINGS__": "1", - "__DBL_DECIMAL_DIG__": "17", - "__DBL_DENORM_MIN__": "4.9406564584124654e-324", - "__DBL_DIG__": "15", - "__DBL_EPSILON__": "2.2204460492503131e-16", - "__DBL_HAS_DENORM__": "1", - "__DBL_HAS_INFINITY__": "1", - "__DBL_HAS_QUIET_NAN__": "1", - "__DBL_MANT_DIG__": "53", - "__DBL_MAX_10_EXP__": "308", - "__DBL_MAX_EXP__": "1024", - "__DBL_MAX__": "1.7976931348623157e+308", - "__DBL_MIN_10_EXP__": "(-307)", - "__DBL_MIN_EXP__": "(-1021)", - "__DBL_MIN__": "2.2250738585072014e-308", - "__DECIMAL_DIG__": "__LDBL_DECIMAL_DIG__", - "__FAST_MATH__": "1", - "__FINITE_MATH_ONLY__": "1", - "__FLT_DECIMAL_DIG__": "9", - "__FLT_DENORM_MIN__": "1.40129846e-45F", - "__FLT_DIG__": "6", - "__FLT_EPSILON__": "1.19209290e-7F", - "__FLT_EVAL_METHOD__": "0", - "__FLT_HAS_DENORM__": "1", - "__FLT_HAS_INFINITY__": "1", - "__FLT_HAS_QUIET_NAN__": "1", - "__FLT_MANT_DIG__": "24", - "__FLT_MAX_10_EXP__": "38", - "__FLT_MAX_EXP__": "128", - "__FLT_MAX__": "3.40282347e+38F", - "__FLT_MIN_10_EXP__": "(-37)", - "__FLT_MIN_EXP__": "(-125)", - "__FLT_MIN__": "1.17549435e-38F", - "__FLT_RADIX__": "2", - "__FXSR__": "1", - "__GCC_ASM_FLAG_OUTPUTS__": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4": "1", - "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8": "1", - "__INT16_C_SUFFIX_": " ", - "__INT16_FMTd__": "\"hd\"", - "__INT16_FMTi__": "\"hi\"", - "__INT16_MAX__": "32767", - "__INT16_TYPE__": "short", - "__INT32_C_SUFFIX_": " ", - "__INT32_FMTd__": "\"d\"", - "__INT32_FMTi__": "\"i\"", - "__INT32_MAX__": "2147483647", - "__INT32_TYPE__": "int", - "__INT64_C_SUFFIX__": "LL", - "__INT64_FMTd__": "\"lld\"", - "__INT64_FMTi__": "\"lli\"", - "__INT64_MAX__": "9223372036854775807LL", - "__INT64_TYPE__": "long long int", - "__INT8_C_SUFFIX_": " ", - "__INT8_FMTd__": "\"hhd\"", - "__INT8_FMTi__": "\"hhi\"", - "__INT8_MAX__": "127", - "__INT8_TYPE__": "signed char", - "__INTMAX_C_SUFFIX__": "LL", - "__INTMAX_FMTd__": "\"lld\"", - "__INTMAX_FMTi__": "\"lli\"", - "__INTMAX_MAX__": "9223372036854775807LL", - "__INTMAX_TYPE__": "long long int", - "__INTMAX_WIDTH__": "64", - "__INTPTR_FMTd__": "\"lld\"", - "__INTPTR_FMTi__": "\"lli\"", - "__INTPTR_MAX__": "9223372036854775807LL", - "__INTPTR_TYPE__": "long long int", - "__INTPTR_WIDTH__": "64", - "__INT_FAST16_FMTd__": "\"hd\"", - "__INT_FAST16_FMTi__": "\"hi\"", - "__INT_FAST16_MAX__": "32767", - "__INT_FAST16_TYPE__": "short", - "__INT_FAST16_WIDTH__": "16", - "__INT_FAST32_FMTd__": "\"d\"", - "__INT_FAST32_FMTi__": "\"i\"", - "__INT_FAST32_MAX__": "2147483647", - "__INT_FAST32_TYPE__": "int", - "__INT_FAST32_WIDTH__": "32", - "__INT_FAST64_FMTd__": "\"lld\"", - "__INT_FAST64_FMTi__": "\"lli\"", - "__INT_FAST64_MAX__": "9223372036854775807LL", - "__INT_FAST64_TYPE__": "long long int", - "__INT_FAST64_WIDTH__": "64", - "__INT_FAST8_FMTd__": "\"hhd\"", - "__INT_FAST8_FMTi__": "\"hhi\"", - "__INT_FAST8_MAX__": "127", - "__INT_FAST8_TYPE__": "signed char", - "__INT_FAST8_WIDTH__": "8", - "__INT_LEAST16_FMTd__": "\"hd\"", - "__INT_LEAST16_FMTi__": "\"hi\"", - "__INT_LEAST16_MAX__": "32767", - "__INT_LEAST16_TYPE__": "short", - "__INT_LEAST16_WIDTH__": "16", - "__INT_LEAST32_FMTd__": "\"d\"", - "__INT_LEAST32_FMTi__": "\"i\"", - "__INT_LEAST32_MAX__": "2147483647", - "__INT_LEAST32_TYPE__": "int", - "__INT_LEAST32_WIDTH__": "32", - "__INT_LEAST64_FMTd__": "\"lld\"", - "__INT_LEAST64_FMTi__": "\"lli\"", - "__INT_LEAST64_MAX__": "9223372036854775807LL", - "__INT_LEAST64_TYPE__": "long long int", - "__INT_LEAST64_WIDTH__": "64", - "__INT_LEAST8_FMTd__": "\"hhd\"", - "__INT_LEAST8_FMTi__": "\"hhi\"", - "__INT_LEAST8_MAX__": "127", - "__INT_LEAST8_TYPE__": "signed char", - "__INT_LEAST8_WIDTH__": "8", - "__INT_MAX__": "2147483647", - "__INT_WIDTH__": "32", - "__LDBL_DECIMAL_DIG__": "17", - "__LDBL_DENORM_MIN__": "4.9406564584124654e-324L", - "__LDBL_DIG__": "15", - "__LDBL_EPSILON__": "2.2204460492503131e-16L", - "__LDBL_HAS_DENORM__": "1", - "__LDBL_HAS_INFINITY__": "1", - "__LDBL_HAS_QUIET_NAN__": "1", - "__LDBL_MANT_DIG__": "53", - "__LDBL_MAX_10_EXP__": "308", - "__LDBL_MAX_EXP__": "1024", - "__LDBL_MAX__": "1.7976931348623157e+308L", - "__LDBL_MIN_10_EXP__": "(-307)", - "__LDBL_MIN_EXP__": "(-1021)", - "__LDBL_MIN__": "2.2250738585072014e-308L", - "__LITTLE_ENDIAN__": "1", - "__LLONG_WIDTH__": "64", - "__LONG_LONG_MAX__": "9223372036854775807LL", - "__LONG_MAX__": "2147483647L", - "__LONG_WIDTH__": "32", - "__MMX__": "1", - "__NO_MATH_ERRNO__": "1", - "__NO_MATH_INLINES": "1", - "__OBJC_BOOL_IS_BOOL": "0", - "__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES": "3", - "__OPENCL_MEMORY_SCOPE_DEVICE": "2", - "__OPENCL_MEMORY_SCOPE_SUB_GROUP": "4", - "__OPENCL_MEMORY_SCOPE_WORK_GROUP": "1", - "__OPENCL_MEMORY_SCOPE_WORK_ITEM": "0", - "__ORDER_BIG_ENDIAN__": "4321", - "__ORDER_LITTLE_ENDIAN__": "1234", - "__ORDER_PDP_ENDIAN__": "3412", - "__PIC__": "2", - "__POINTER_WIDTH__": "64", - "__POPCNT__": "1", - "__PRAGMA_REDEFINE_EXTNAME": "1", - "__PTRDIFF_FMTd__": "\"lld\"", - "__PTRDIFF_FMTi__": "\"lli\"", - "__PTRDIFF_MAX__": "9223372036854775807LL", - "__PTRDIFF_TYPE__": "long long int", - "__PTRDIFF_WIDTH__": "64", - "__REGISTER_PREFIX_": " ", - "__SCHAR_MAX__": "127", - "__SEG_FS": "1", - "__SEG_GS": "1", - "__SHRT_MAX__": "32767", - "__SHRT_WIDTH__": "16", - "__SIG_ATOMIC_MAX__": "2147483647", - "__SIG_ATOMIC_WIDTH__": "32", - "__SIZEOF_DOUBLE__": "8", - "__SIZEOF_FLOAT__": "4", - "__SIZEOF_INT128__": "16", - "__SIZEOF_INT__": "4", - "__SIZEOF_LONG_DOUBLE__": "8", - "__SIZEOF_LONG_LONG__": "8", - "__SIZEOF_LONG__": "4", - "__SIZEOF_POINTER__": "8", - "__SIZEOF_PTRDIFF_T__": "8", - "__SIZEOF_SHORT__": "2", - "__SIZEOF_SIZE_T__": "8", - "__SIZEOF_WCHAR_T__": "2", - "__SIZEOF_WINT_T__": "2", - "__SIZE_FMTX__": "\"llX\"", - "__SIZE_FMTo__": "\"llo\"", - "__SIZE_FMTu__": "\"llu\"", - "__SIZE_FMTx__": "\"llx\"", - "__SIZE_MAX__": "18446744073709551615ULL", - "__SIZE_TYPE__": "long long unsigned int", - "__SIZE_WIDTH__": "64", - "__SSE2_MATH__": "1", - "__SSE2__": "1", - "__SSE3__": "1", - "__SSE4_1__": "1", - "__SSE_MATH__": "1", - "__SSE__": "1", - "__SSSE3__": "1", - "__STDC_HOSTED__": "1", - "__STDC_NO_THREADS__": "1", - "__STDC_UTF_16__": "1", - "__STDC_UTF_32__": "1", - "__STDC_VERSION__": "201710L", - "__UINT16_C_SUFFIX_": " ", - "__UINT16_FMTX__": "\"hX\"", - "__UINT16_FMTo__": "\"ho\"", - "__UINT16_FMTu__": "\"hu\"", - "__UINT16_FMTx__": "\"hx\"", - "__UINT16_MAX__": "65535", - "__UINT16_TYPE__": "unsigned short", - "__UINT32_C_SUFFIX__": "U", - "__UINT32_FMTX__": "\"X\"", - "__UINT32_FMTo__": "\"o\"", - "__UINT32_FMTu__": "\"u\"", - "__UINT32_FMTx__": "\"x\"", - "__UINT32_MAX__": "4294967295U", - "__UINT32_TYPE__": "unsigned int", - "__UINT64_C_SUFFIX__": "ULL", - "__UINT64_FMTX__": "\"llX\"", - "__UINT64_FMTo__": "\"llo\"", - "__UINT64_FMTu__": "\"llu\"", - "__UINT64_FMTx__": "\"llx\"", - "__UINT64_MAX__": "18446744073709551615ULL", - "__UINT64_TYPE__": "long long unsigned int", - "__UINT8_C_SUFFIX_": " ", - "__UINT8_FMTX__": "\"hhX\"", - "__UINT8_FMTo__": "\"hho\"", - "__UINT8_FMTu__": "\"hhu\"", - "__UINT8_FMTx__": "\"hhx\"", - "__UINT8_MAX__": "255", - "__UINT8_TYPE__": "unsigned char", - "__UINTMAX_C_SUFFIX__": "ULL", - "__UINTMAX_FMTX__": "\"llX\"", - "__UINTMAX_FMTo__": "\"llo\"", - "__UINTMAX_FMTu__": "\"llu\"", - "__UINTMAX_FMTx__": "\"llx\"", - "__UINTMAX_MAX__": "18446744073709551615ULL", - "__UINTMAX_TYPE__": "long long unsigned int", - "__UINTMAX_WIDTH__": "64", - "__UINTPTR_FMTX__": "\"llX\"", - "__UINTPTR_FMTo__": "\"llo\"", - "__UINTPTR_FMTu__": "\"llu\"", - "__UINTPTR_FMTx__": "\"llx\"", - "__UINTPTR_MAX__": "18446744073709551615ULL", - "__UINTPTR_TYPE__": "long long unsigned int", - "__UINTPTR_WIDTH__": "64", - "__UINT_FAST16_FMTX__": "\"hX\"", - "__UINT_FAST16_FMTo__": "\"ho\"", - "__UINT_FAST16_FMTu__": "\"hu\"", - "__UINT_FAST16_FMTx__": "\"hx\"", - "__UINT_FAST16_MAX__": "65535", - "__UINT_FAST16_TYPE__": "unsigned short", - "__UINT_FAST32_FMTX__": "\"X\"", - "__UINT_FAST32_FMTo__": "\"o\"", - "__UINT_FAST32_FMTu__": "\"u\"", - "__UINT_FAST32_FMTx__": "\"x\"", - "__UINT_FAST32_MAX__": "4294967295U", - "__UINT_FAST32_TYPE__": "unsigned int", - "__UINT_FAST64_FMTX__": "\"llX\"", - "__UINT_FAST64_FMTo__": "\"llo\"", - "__UINT_FAST64_FMTu__": "\"llu\"", - "__UINT_FAST64_FMTx__": "\"llx\"", - "__UINT_FAST64_MAX__": "18446744073709551615ULL", - "__UINT_FAST64_TYPE__": "long long unsigned int", - "__UINT_FAST8_FMTX__": "\"hhX\"", - "__UINT_FAST8_FMTo__": "\"hho\"", - "__UINT_FAST8_FMTu__": "\"hhu\"", - "__UINT_FAST8_FMTx__": "\"hhx\"", - "__UINT_FAST8_MAX__": "255", - "__UINT_FAST8_TYPE__": "unsigned char", - "__UINT_LEAST16_FMTX__": "\"hX\"", - "__UINT_LEAST16_FMTo__": "\"ho\"", - "__UINT_LEAST16_FMTu__": "\"hu\"", - "__UINT_LEAST16_FMTx__": "\"hx\"", - "__UINT_LEAST16_MAX__": "65535", - "__UINT_LEAST16_TYPE__": "unsigned short", - "__UINT_LEAST32_FMTX__": "\"X\"", - "__UINT_LEAST32_FMTo__": "\"o\"", - "__UINT_LEAST32_FMTu__": "\"u\"", - "__UINT_LEAST32_FMTx__": "\"x\"", - "__UINT_LEAST32_MAX__": "4294967295U", - "__UINT_LEAST32_TYPE__": "unsigned int", - "__UINT_LEAST64_FMTX__": "\"llX\"", - "__UINT_LEAST64_FMTo__": "\"llo\"", - "__UINT_LEAST64_FMTu__": "\"llu\"", - "__UINT_LEAST64_FMTx__": "\"llx\"", - "__UINT_LEAST64_MAX__": "18446744073709551615ULL", - "__UINT_LEAST64_TYPE__": "long long unsigned int", - "__UINT_LEAST8_FMTX__": "\"hhX\"", - "__UINT_LEAST8_FMTo__": "\"hho\"", - "__UINT_LEAST8_FMTu__": "\"hhu\"", - "__UINT_LEAST8_FMTx__": "\"hhx\"", - "__UINT_LEAST8_MAX__": "255", - "__UINT_LEAST8_TYPE__": "unsigned char", - "__USER_LABEL_PREFIX_": " ", - "__VERSION__": "\"Clang 14.0.6\"", - "__WCHAR_MAX__": "65535", - "__WCHAR_TYPE__": "unsigned short", - "__WCHAR_UNSIGNED__": "1", - "__WCHAR_WIDTH__": "16", - "__WINT_MAX__": "65535", - "__WINT_TYPE__": "unsigned short", - "__WINT_UNSIGNED__": "1", - "__WINT_WIDTH__": "16", - "__amd64": "1", - "__amd64__": "1", - "__clang__": "1", - "__clang_literal_encoding__": "\"UTF-8\"", - "__clang_major__": "14", - "__clang_minor__": "0", - "__clang_patchlevel__": "6", - "__clang_version__": "\"14.0.6 \"", - "__clang_wide_literal_encoding__": "\"UTF-16\"", - "__code_model_small__": "1", - "__k8": "1", - "__k8__": "1", - "__llvm__": "1", - "__pic__": "2", - "__seg_fs": "__attribute__((address_space(257)))", - "__seg_gs": "__attribute__((address_space(256)))", - "__tune_k8__": "1", - "__x86_64": "1", - "__x86_64__": "1" - }, - "c_user_defines": { - }, - "c_user_undefines": [ - ] - }, - "target_sizes": { - "char_bit": 8, - "short": 2, - "int": 4, - "long": 4, - "float": 4, - "double": 8, - "long_double": 8, - "pointer": 8, - "ldbl_mant_dig": 53, - "char": 1 - }, - "wchar_t_type": "short", - "ptrdiff_t_type": "long long", - "size_t_type": "unsigned long long", - "supports_x86_64": true -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/isense/workaround/math/dag_mathBase.h b/prog/_jBuild/msbuild/isense/workaround/math/dag_mathBase.h deleted file mode 100644 index 87f11894b..000000000 --- a/prog/_jBuild/msbuild/isense/workaround/math/dag_mathBase.h +++ /dev/null @@ -1,7 +0,0 @@ -// the EDG in clang mode doesn't like define X /undef X + define X in another header, e.g in dagorInclude\math\dag_Point2.h the INLINE -// I guess the EDG using a token based preprocessor and falsely identifies the undef as last, and doesn't handle the same define later. - -#define INLINE inline -#pragma push_macro("INLINE") -#include_next -#pragma pop_macro("INLINE") \ No newline at end of file diff --git a/prog/_jBuild/msbuild/linux64.targets b/prog/_jBuild/msbuild/linux64.targets deleted file mode 100644 index e30ba3418..000000000 --- a/prog/_jBuild/msbuild/linux64.targets +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - jam-2.5-G8-binaries-2019/centos-7-64/ - $(RemoteGDEVTOOL)$(RelativeRemoteJamDir) - - _DEVTOOL=$(RemoteGDEVTOOL) $(RemoteJamDir)$(JamBuildCommandLine) - _DEVTOOL=$(RemoteGDEVTOOL) $(RemoteJamDir)$(JamReBuildCommandLine) - _DEVTOOL=$(RemoteGDEVTOOL) $(RemoteJamDir)$(JamCleanCommandLine) - - $([MSBuild]::MakeRelative($(SolutionDir), $(ProjectDir))) - $(RelativeProjectPath.Replace('\', '/')) - $(RemoteDeployDir)$(RelativeProjectPath) - $(RemoteDeployDir)_output/ - - $(JamOutput) - $(RemoteGameDir) - - - - - - - - - - $(CppIntelliSenseIncludePath);@(CppSource->'%(AdditionalIncludeDirectories)') - - - $(CppIntelliSenseIncludePath);@(CppSource2->'%(AdditionalIncludeDirectories)') - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/natvis.vcxproj b/prog/_jBuild/msbuild/natvis.vcxproj deleted file mode 100644 index 2db980308..000000000 --- a/prog/_jBuild/msbuild/natvis.vcxproj +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Any - x64 - - - - {4ee8cf3a-7339-4469-a8b9-e62584192c8e} - Makefile - $(GDEVTOOL)\ps4.sdk.850\ - $(GDEVTOOL)\ps5.sdk.500\ - - - - $(TEMP)\$(ProjectGuid).log - - - - - - - - - - - - - - - - - - - <_ProjectDirectories Include="dummy"> - $(ProjectDir) - - - - - - - true - - $(ProjectDir) - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/pc.targets b/prog/_jBuild/msbuild/pc.targets deleted file mode 100644 index 91a0950db..000000000 --- a/prog/_jBuild/msbuild/pc.targets +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/projectConfigurations.props b/prog/_jBuild/msbuild/projectConfigurations.props deleted file mode 100644 index 8d949a512..000000000 --- a/prog/_jBuild/msbuild/projectConfigurations.props +++ /dev/null @@ -1,223 +0,0 @@ - - - - - dbg_win32 - x64 - - - dev_win32 - x64 - - - rel_win32 - x64 - - - - dbg_win64 - x64 - - - dev_win64 - x64 - - - rel_win64 - x64 - - - - dbg_gdk - x64 - - - dev_gdk - x64 - - - rel_gdk - x64 - - - - dbg_scarlett - x64 - - - dev_scarlett - x64 - - - rel_scarlett - x64 - - - - dbg_ps4 - x64 - - - dev_ps4 - x64 - - - rel_ps4 - x64 - - - - dbg_ps5 - x64 - - - dev_ps5 - x64 - - - rel_ps5 - x64 - - - - dbg_android - ARM64 - - - dev_android - ARM64 - - - rel_android - ARM64 - - - - dbg_linux64 - x64 - - - dev_linux64 - x64 - - - rel_linux64 - x64 - - - - dbg_nswitch - x64 - - - dev_nswitch - x64 - - - rel_nswitch - x64 - - - - - - - <_Platform>win32 - win32 - Win32 - - - - - <_Platform>win64 - win64 - x64 - - - - - <_Platform>gdk - xboxOne - Gaming.Xbox.XboxOne.x64 - - - - - <_Platform>scarlett - scarlett - Gaming.Xbox.Scarlett.x64 - - - - - <_Platform>ps4 - ps4 - ORBIS - - - - - <_Platform>ps5 - ps5 - Prospero - - - - - <_Platform>android - android - ARM64 - - - - - <_Platform>linux64 - linux64 - x64 - - - - - <_Platform>nswitch - nswitch - x64 - - - - - - $(Platform) - $(MSPlatform) - - dbg - dev - rel - - $(MSBuildThisFileDirectory) - - - - - - Android - 3.0 - arm64-v8a - android-30 - - - - - Linux - 1.0 - Generic - {FC1A4D80-50E9-41DA-9192-61C0DBAA00D2} - - - - - 16.0 - 10.0 - - - - diff --git a/prog/_jBuild/msbuild/projects/enlisted_ded.args.json b/prog/_jBuild/msbuild/projects/enlisted_ded.args.json deleted file mode 100644 index d0b4231f1..000000000 --- a/prog/_jBuild/msbuild/projects/enlisted_ded.args.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "FileVersion": 2, - "Id": "5a310407-ec21-43aa-94bb-0fa95e66b55e", - "Items": [ - { - "Id": "8b7e97c9-8f3a-4918-ab3b-5b2b18959f09", - "Command": "Bots", - "ExclusiveMode": true, - "Items": [ - { - "Id": "6b5e5489-5afd-4cb3-a88b-feb85492de8b", - "Command": "2", - "Items": [ - { - "Id": "90ee08cc-a448-4136-a275-a952b2d26fff", - "Command": "-botpop:2" - } - ] - }, - { - "Id": "328f24b1-dc6a-4677-b921-77b0a344d1d8", - "Command": "4", - "Items": [ - { - "Id": "a8443baa-e74e-4b98-ab60-f27ea9e4f5d3", - "Command": "-botpop:4" - } - ] - }, - { - "Id": "634b7194-4698-4062-968d-3a234d3261f2", - "Command": "6", - "Items": [ - { - "Id": "c9e5e648-0e8b-43a8-ac1f-9ae3609956df", - "Command": "-botpop:6" - } - ] - }, - { - "Id": "2fae8715-de8d-437c-926e-67b953e63981", - "Command": "10", - "Items": [ - { - "Id": "71e53a13-1cae-4467-aef6-b704c5485688", - "Command": "-botpop:10" - } - ] - }, - { - "Id": "a0adcc78-3712-4b66-ad72-e5ac97340627", - "Command": "20", - "Items": [ - { - "Id": "8a58ec99-7d0d-4556-b9f7-e46b31dd9a3d", - "Command": "-botpop:20" - } - ] - } - ] - }, - { - "Id": "b200e1a1-545b-47e2-a5ff-bfbe3b2d6d46", - "Command": "Circuit", - "ExclusiveMode": true, - "Items": [ - { - "Id": "a8ddb756-40a5-4f4d-8262-8f5087688a5b", - "Command": "-config:circuit:t=moon" - }, - { - "Id": "600214f8-3a76-470e-bcf2-cfb87a158143", - "Command": "-config:circuit:t=sun" - }, - { - "Id": "f8ade4d1-4256-4492-8317-c75956b427d0", - "Command": "-config:circuit:t=ganymede" - }, - { - "Id": "a3ee3d79-ebcf-48bc-86d6-7b6d18ffd4cf", - "Command": "-config:circuit:t=jupiter " - } - ] - }, - { - "Id": "9f9f79ac-3386-4da3-840e-d1bc74affabc", - "Command": "Dedicated server", - "Items": [ - { - "Id": "ada9fe1e-ecbb-4aec-9106-b926dc2ec326", - "Command": "--listen" - }, - { - "Id": "8dd47da9-d072-48da-9e2f-8041d7e1fab6", - "Command": "-noeac" - } - ] - }, - { - "Id": "b14edf8b-60d0-4f28-b4ed-6d98dcea6235", - "Command": "Enable menu", - "ExclusiveMode": true, - "Items": [ - { - "Id": "c3d3f342-7acc-492f-988d-cbde8733efb7", - "Command": "-config:disableMenu:b=no" - }, - { - "Id": "f9e2f848-24ea-4770-a867-4948152b425b", - "Command": "-config:disableMenu:b=yes" - } - ] - }, - { - "Id": "399149ba-0049-4938-b3fc-a5e241781cb5", - "Command": "Map selection", - "ExclusiveMode": true, - "Items": [ - { - "Id": "b81dd5cf-cf94-4bcc-b3ca-305125a4eefa", - "Command": "-scene:gameData/scenes/berlin_chancellery_dom.blk" - }, - { - "Id": "366d03e2-f181-4954-9213-0fd1c64e479e", - "Command": "-scene:gameData/scenes/tunisia_gorge_dom.blk" - }, - { - "Id": "2a12dfd9-7ac0-496c-9052-9b79ec3ddc02", - "Command": "-scene:gamedata/scenes/enlisted_berlin_benchmark.blk" - }, - { - "Id": "ab69b893-6e5e-4332-81de-e23bd0f34114", - "Command": "-scene:gamedata/scenes/enlisted_berlin_benchmark_clear.blk" - }, - { - "Id": "b2e847ea-eb77-450d-8b9a-aa1fa0b6839d", - "Command": "-scene:gamedata/scenes/enlisted_moscow_benchmark.blk" - }, - { - "Id": "7a746448-b93a-4efd-993e-a0e74fe96c87", - "Command": "-scene:gamedata/scenes/enlisted_moscow_benchmark_clear.blk" - }, - { - "Id": "c0f69d12-346a-4673-ab48-2477e7fd197c", - "Command": "-scene:gamedata/scenes/enlisted_normandy_coast_benchmark.blk" - }, - { - "Id": "243558e6-f72d-402b-b612-ab9d0a17b192", - "Command": "-scene:gamedata/scenes/enlisted_normandy_coast_benchmark_clear.blk" - }, - { - "Id": "abce43d3-3826-4ced-8937-77748324e97e", - "Command": "-scene:gamedata/scenes/normandy_beach_inv.blk" - }, - { - "Id": "61a56d01-66cd-457a-86fc-c3424ff2dc9b", - "Command": "-scene:gamedata/scenes/volokolamsk_forestry_inv.blk" - }, - { - "Id": "1e776325-eb91-45ca-8eeb-b16e84d71f4b", - "Command": "-scene:gamedata/scenes/tank_phys_test_level.blk" - } - ] - }, - { - "Id": "128b9adb-cd38-49d6-9c61-b0c1d2b41b9f", - "Command": "Miscellaneous", - "Items": [ - { - "Id": "829c8184-7f8c-4b06-831b-52bdae2244d2", - "Command": "-es_tag:dasDebug" - }, - { - "Id": "4b2f1c6e-b13b-4c34-a72a-91ae87f7dbbc", - "Command": "-es_tag:ecsDebug" - } - ] - }, - { - "Id": "197b711d-f1a0-44f7-bf99-5846507f1cb4", - "Command": "Use addon VromSrc", - "ExclusiveMode": true, - "Items": [ - { - "Id": "a84f00dd-716e-46f2-8301-852eedee1fc2", - "Command": "-config:debug/useAddonVromSrc:b=no" - }, - { - "Id": "4d219803-f300-494b-9a9e-8e5fc10e8ba6", - "Command": "-config:debug/useAddonVromSrc:b=yes" - }, - { - "Id": "9b1d574d-7a62-4bf7-b7c9-af9850982db3", - "Command": "-config:debug/useAddonVromSrc:b=yes -config:debug/vromfsFirstPriority:b=no" - } - ] - } - ] -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/projects/enlisted_ded.vcxproj b/prog/_jBuild/msbuild/projects/enlisted_ded.vcxproj deleted file mode 100644 index e0e3badc4..000000000 --- a/prog/_jBuild/msbuild/projects/enlisted_ded.vcxproj +++ /dev/null @@ -1,60 +0,0 @@ - - - - - dbg_win32 - x64 - - - dev_win32 - x64 - - - rel_win32 - x64 - - - - dbg_win64 - x64 - - - dev_win64 - x64 - - - rel_win64 - x64 - - - - dbg_linux64 - x64 - - - dev_linux64 - x64 - - - rel_linux64 - x64 - - - - - {5a310407-ec21-43aa-94bb-0fa95e66b55e} - enlisted - daNetGames - $(SolutionDir)enlisted\ - $(EnlistedDir)game\ - $(EnlistedDir)prog\ - yes - true - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/projects/skyquake_vrt.args.json b/prog/_jBuild/msbuild/projects/skyquake_vrt.args.json deleted file mode 100644 index 777412a8f..000000000 --- a/prog/_jBuild/msbuild/projects/skyquake_vrt.args.json +++ /dev/null @@ -1,518 +0,0 @@ -{ - "FileVersion": 2, - "Id": "2825dbf0-b3ef-4f8c-b711-ce665007425a", - "Items": [ - { - "Id": "543f5494-b8eb-4cd7-b69b-ca9c91a7a9ef", - "Command": "Map selection", - "ExclusiveMode": true, - "Items": [ - { - "Id": "b43483d9-2356-4cc1-a125-3acb2798a316", - "Command": "benchmark_vr_normandy_realtime", - "ExclusiveMode": true, - "Items": [ - { - "Id": "8c0b835d-ce7d-4510-9574-0c76d199ca51", - "Command": "-config:game_start/missionFile:t=gameData/missions/singlemissions/benchmark/benchmark_vr_normandy_realtime.blk -config:debug/disableMenu:b=yes" - } - ] - } - ] - }, - { - "Id": "76b12951-db60-48d6-be6e-21f40060325b", - "Command": "Profiler", - "Items": [ - { - "Id": "89123b65-af0c-40bd-a42f-f15285c6749b", - "Command": "-config:debug/profiler:t=\"gpu\"" - }, - { - "Id": "406b24f5-8415-4ce6-b973-48c6b4f2cc0f", - "Command": "-config:debug/profiler:t=\"cpu\"" - } - ] - }, - { - "Id": "88c54fb9-95f5-47f3-835e-912d04f40b5c", - "Command": "Network", - "ExclusiveMode": true, - "Items": [ - { - "Id": "31b0bc72-67e5-451f-827c-aa8217e04e04", - "Command": "-config:debug/disableNetwork:b=no" - }, - { - "Id": "e37e681c-c9bc-404b-a53b-7048e6cac444", - "Command": "-config:debug/disableNetwork:b=yes" - } - ] - }, - { - "Id": "ee645541-c0df-479f-9eb2-76029e249aa5", - "Command": "Driver", - "ExclusiveMode": true, - "Items": [ - { - "Id": "13715e9c-1f0e-4f12-a640-232f97e45f67", - "Command": "DX11", - "Items": [ - { - "Id": "f73aa58b-b97e-4409-a3de-46ea5cf31c6f", - "Command": "-config:video/driver:t=dx11" - }, - { - "Id": "05c6c079-73cd-4fe0-b2cb-09db699816ca", - "Command": "Debug", - "ExclusiveMode": true, - "Items": [ - { - "Id": "e35dca7f-9fc7-4ed0-935d-436fa54f028c", - "Command": "" - }, - { - "Id": "379b54b3-61dd-42e0-922e-df80c1b8d6fd", - "Command": "-config:directx/debug:b=no" - }, - { - "Id": "d4505c0e-f1bb-48c0-a4cb-7d44f886cec2", - "Command": "-config:directx/debug:b=yes" - } - ] - }, - { - "Id": "d6233d39-d09e-41e1-97ad-fa792efdfb32", - "Command": "ForceDx10", - "ExclusiveMode": true, - "Items": [ - { - "Id": "b7c0c569-dfdf-4803-aab8-6468b5ce9275", - "Command": "" - }, - { - "Id": "2b1164ab-933a-4537-a8eb-b19f5f116022", - "Command": "-config:directx/forceUseDx10:b=no" - }, - { - "Id": "cc5b3cff-a926-4108-be33-d5a116b81475", - "Command": "-config:directx/forceUseDx10:b=yes" - } - ] - } - ] - }, - { - "Id": "51c4db11-c371-4430-ac42-91115e3c6e73", - "Command": "DX12", - "Items": [ - { - "Id": "16d5ad14-1271-43eb-83c9-aae8b712e7c5", - "Command": "-config:video/driver:t=dx12" - }, - { - "Id": "928cdc5c-8a16-4bee-9f92-e2eca9b171c2", - "Command": "Debug level", - "ExclusiveMode": true, - "Items": [ - { - "Id": "46e40cf9-c797-4e67-9297-756c6734fe54", - "Command": "" - }, - { - "Id": "fac93c69-d892-4b25-a129-25540f94427a", - "Command": "-config:dx12/debugLevel:i=0" - }, - { - "Id": "e18b7ba4-ae8d-4754-b349-f8bf21a8cacf", - "Command": "-config:dx12/debugLevel:i=1" - }, - { - "Id": "d10a2c4e-2780-4ba0-9142-d80b9c64e22f", - "Command": "-config:dx12/debugLevel:i=2" - }, - { - "Id": "887b7218-566e-4968-b9b8-ed4a3bfc803d", - "Command": "-config:dx12/debugLevel:i=3" - } - ] - }, - { - "Id": "b4a97d3e-7bcd-441a-a1f5-3acebcb2128a", - "Command": "Execution mode", - "ExclusiveMode": true, - "Items": [ - { - "Id": "4560438e-ccfb-4aa4-b7e3-a269a7dcc53b", - "Command": "" - }, - { - "Id": "346b055f-6ddc-40ef-8d3d-5c4102c47ae1", - "Command": "-config:dx12/executionMode:t=concurrent" - }, - { - "Id": "688a9ec9-03c8-46a1-b39f-a7bff6020367", - "Command": "-config:dx12/executionMode:t=immediate" - } - ] - }, - { - "Id": "cc367596-2089-4e7f-a654-e5bfee5dbb86", - "Command": "CPU Validation", - "ExclusiveMode": true, - "Items": [ - { - "Id": "abb79c6c-b480-4788-8eaa-1240681cf74f", - "Command": "" - }, - { - "Id": "173d62cc-6b12-407a-8d61-72dc335d6437", - "Command": "-config:dx12/cpuValidation:b=no" - }, - { - "Id": "0aa33a0e-b908-4fd5-ad14-1fb507b0ad3d", - "Command": "-config:dx12/cpuValidation:b=yes" - } - ] - }, - { - "Id": "f3cff78d-f03d-47e3-b771-d5823187863a", - "Command": "GPU Validation", - "ExclusiveMode": true, - "Items": [ - { - "Id": "6dfea2ba-ac06-486a-982b-025f424284c8", - "Command": "" - }, - { - "Id": "f416fd39-8074-425d-9942-fa9dd142fad5", - "Command": "-config:dx12/gpuValidation:b=no" - }, - { - "Id": "0a9766cc-aeb1-4a57-8f7a-5280fdf8c81e", - "Command": "-config:dx12/gpuValidation:b=yes" - } - ] - }, - { - "Id": "a3a1323c-4f6a-42ad-b0ad-0978390ccb01", - "Command": "Track PageFaults", - "ExclusiveMode": true, - "Items": [ - { - "Id": "8e0a23fa-32e9-4aa5-8bda-a3aaa2b575f1", - "Command": "" - }, - { - "Id": "c75b4f1e-585a-4bce-a961-0ad2a974303d", - "Command": "-config:dx12/trackPageFaults:b=no" - }, - { - "Id": "9ee7c6db-b25d-42e0-be01-ee9a5efcc5fb", - "Command": "-config:dx12/trackPageFaults:b=yes" - } - ] - }, - { - "Id": "1e10310c-1b77-4615-97d4-86f02aaf9ba3", - "Command": "Breadcrumbs", - "ExclusiveMode": true, - "Items": [ - { - "Id": "c84bb87e-b1f9-4de2-974c-dcb23e6a631f", - "Command": "" - }, - { - "Id": "2b9c94f0-5b55-48a9-99fe-110b54453089", - "Command": "-config:dx12/placeBreadcrumbs:b=no" - }, - { - "Id": "13b92200-d303-45db-9e57-711456801e85", - "Command": "-config:dx12/placeBreadcrumbs:b=yes" - } - ] - }, - { - "Id": "28d636cf-d2a9-4be8-9c0f-66a6ddc695f0", - "Command": "User barriers", - "ExclusiveMode": true, - "Items": [ - { - "Id": "fb673140-6579-4224-8d63-2156f52f5d88", - "Command": "" - }, - { - "Id": "82ed9631-b3a6-4559-bf64-b4bc8326d854", - "Command": "-config:dx12/processUserBarriers:b=no" - }, - { - "Id": "d0909928-c8bf-4674-ad15-1e730402acda", - "Command": "-config:dx12/processUserBarriers:b=yes" - } - ] - }, - { - "Id": "1b3e4bc5-9933-4727-98f9-45c9efb93f4f", - "Command": "Name Objects", - "ExclusiveMode": true, - "Items": [ - { - "Id": "e37e8727-22a9-4221-bd8f-45cdb52cbdc2", - "Command": "" - }, - { - "Id": "4a2b62c2-3e1e-44d1-8035-806afbc17392", - "Command": "-config:dx12/nameObjects:b=no" - }, - { - "Id": "e88c4149-55ff-41f8-8be7-db80d445c869", - "Command": "-config:dx12/nameObjects:b=yes" - } - ] - }, - { - "Id": "6bfe7154-0a7f-4070-91bb-fb17a5cc8243", - "Command": "Enable Markers", - "ExclusiveMode": true, - "Items": [ - { - "Id": "12f8697a-faa2-4f8f-9308-6e1e7c369c14", - "Command": "" - }, - { - "Id": "20b775a2-545f-4fc2-bf86-a8eae5901160", - "Command": "-config:dx12/enableMarkers:b=no" - }, - { - "Id": "8c7e0c45-9fcb-429d-ad94-9a8f3a641c99", - "Command": "-config:dx12/enableMarkers:b=yes" - } - ] - }, - { - "Id": "a15871b3-5a33-4b37-8ae1-7a1dbc10331d", - "Command": "Write Markers", - "ExclusiveMode": true, - "Items": [ - { - "Id": "82bba504-f4b0-4ed4-9127-ad82a6b6c65e", - "Command": "" - }, - { - "Id": "f1439189-38c3-448e-9bba-20441f8df844", - "Command": "-config:dx12/writeMarkers:b=no" - }, - { - "Id": "2506cc75-6f2c-4286-ba2a-4ee5ec509192", - "Command": "-config:dx12/writeMarkers:b=yes" - } - ] - }, - { - "Id": "74aa168d-1a4e-4e2c-909b-6d582ed772e3", - "Command": "Enable PIX Capture", - "ExclusiveMode": true, - "Items": [ - { - "Id": "4abeb4c8-7cff-42ab-bac2-c150a5b2a5a0", - "Command": "" - }, - { - "Id": "401dea05-3e34-47f3-a14b-7df08c4e5492", - "Command": "-config:dx12/loadPixCapturer:b=no" - }, - { - "Id": "b14ec773-4f02-4ad4-bbdb-bf27d974da9d", - "Command": "-config:dx12/loadPixCapturer:b=yes" - } - ] - }, - { - "Id": "a487dd2e-ca38-44ba-a4ee-ac593da55383", - "Command": "HDR", - "ExclusiveMode": true, - "Items": [ - { - "Id": "60c49e32-bfa6-483e-abb0-264218b884d6", - "Command": "" - }, - { - "Id": "a1630ab2-08ca-4166-9e53-ae3d0b06afd7", - "Command": "-config:dx12/forceHdr:b=no" - }, - { - "Id": "3c73fea0-914d-442b-8833-5049ad897abb", - "Command": "-config:dx12/forceHdr:b=yes" - } - ] - } - ] - }, - { - "Id": "875f7784-9d2a-439a-a307-38763809248b", - "Command": "Vulkan", - "Items": [ - { - "Id": "02671795-7877-49a8-81e7-851194bf9f7b", - "Command": "-config:video/driver:t=vulkan" - }, - { - "Id": "72e04553-ed60-4369-b528-7ec46b1de1f6", - "Command": "-config:vulkan/enableRenderDocLayer:b=yes" - }, - { - "Id": "90a2b71e-e2a3-4a8a-91b2-0b8480ab95b1", - "Command": "Debug level", - "ExclusiveMode": true, - "Items": [ - { - "Id": "0993cb2d-2cd9-402b-91fd-1c3881529432", - "Command": "" - }, - { - "Id": "7afa206c-0dc7-43ca-9bc0-9e67b9863dac", - "Command": "-config:vulkan/debugLevel:i=2" - } - ] - } - ] - } - ] - }, - { - "Id": "b21d40df-fb12-47e6-9f35-f68dffd05902", - "Command": "Enable menu", - "ExclusiveMode": true, - "Items": [ - { - "Id": "de2ee486-0147-42a2-b7f1-f0c51bb3d7d6", - "Command": "-config:debug/disableMenu:b=no" - }, - { - "Id": "01fde6f0-408a-426b-85de-ad30309f56fb", - "Command": "-config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "f9ded7cf-01d9-4710-a336-81a1b004cb77", - "Command": "Resolution", - "ExclusiveMode": true, - "Items": [ - { - "Id": "f8a6a609-91d1-4f12-a24e-f11cc4b49427", - "Command": "-config:video/resolution:t=\"2560x1440\"" - }, - { - "Id": "20bf2e0b-5253-4329-ae45-0240303beca5", - "Command": "-config:video/resolution:t=\"1920x1080\"" - }, - { - "Id": "52832313-fcd7-4c12-91f0-a0f642f1bc85", - "Command": "-config:video/resolution:t=\"1280x720\"" - }, - { - "Id": "6f574bb3-4da7-417e-a63a-47f21db55125", - "Command": "-config:video/resolution:t=\"1024x768\"" - }, - { - "Id": "19e6e63f-cc2d-4aae-b334-f8913a94338c", - "Command": "-config:video/resolution:t=\"854x480\"" - } - ] - }, - { - "Id": "d6973442-852c-4bf0-a21f-85affce07cc1", - "Command": "WindowMode", - "ExclusiveMode": true, - "Items": [ - { - "Id": "17166c20-577c-4a8e-8c6b-6af23b8ca2f5", - "Command": "-config:video/mode:t=\"windowed\"" - }, - { - "Id": "7099a7c1-8487-4185-b9fe-39c7db967cde", - "Command": "-config:video/mode:t=\"fullscreenwindowed\"" - }, - { - "Id": "6cba4391-eba7-4e07-853b-174c3e7753e2", - "Command": "-config:video/mode:t=\"fullscreen\"" - } - ] - }, - { - "Id": "ca255687-abf5-4f83-acbe-b864d1d3e29c", - "Command": "Use addon VromSrc", - "ExclusiveMode": true, - "Items": [ - { - "Id": "88e426b2-5c7b-4c8c-adcd-d2ae3adc266c", - "Command": "-config:debug/useAddonVromSrc:b=no" - }, - { - "Id": "0151c503-831a-46cb-b6c1-65b2425455fa", - "Command": "-config:debug/useAddonVromSrc:b=yes" - } - ] - }, - { - "Id": "3851ff0e-4af7-4fc0-bfd5-98a7cccb3e61", - "Command": "VR", - "Items": [ - { - "Id": "90259d3a-5519-4d03-a55d-a38d01f56cba", - "Command": "VREmulator", - "Items": [ - { - "Id": "4ed05e42-35b0-425c-bccb-027c5410da3b", - "Command": "VRRefresh", - "ExclusiveMode": true, - "Items": [ - { - "Id": "ca0fe1a2-f53b-4fb6-8d20-5acd36b92916", - "Command": "-config:xr/targetFramerate:i=60" - }, - { - "Id": "67abef3f-4648-4fb4-ab6f-f443b1baa00b", - "Command": "-config:xr/targetFramerate:i=90" - }, - { - "Id": "ee41cf41-5fc1-47f2-a754-520b1b6693b0", - "Command": "-config:xr/targetFramerate:i=120" - } - ] - }, - { - "Id": "06bde3b1-68f2-4b82-adfe-a87be48eac02", - "Command": "-config:video/vreye:t=both" - }, - { - "Id": "683760d6-a8e2-4d4c-9308-7b78056b0a29", - "Command": "-OculusQuest2 -config:gameplay/enableVR:b=yes -config:video/vsync:b=no -config:xr/emulatorProfile:t=2064,2096,0.0681346512074297,-0.907571197,0.785398185,0.837758064,-0.872664630,-0.785398185,0.907571197,0.837758064,-0.872664630" - } - ] - }, - { - "Id": "a66405d6-404f-4c7b-b111-5a71d5e2e019", - "Command": "-config:xr/forcePresence:b=yes" - }, - { - "Id": "a2eacb1f-a6f4-4aa7-a723-7eb623600cad", - "Command": "-config:xr/emulatorHDR:b=yes" - }, - { - "Id": "72e8a272-77b8-466a-b8af-c39fee270bde", - "Command": "-config:xr/useVrMultiview:b=no" - }, - { - "Id": "a6bfe40b-083f-42f9-8775-51402c27a63e", - "Command": "-config:xr/useFsr:b=yes" - }, - { - "Id": "f2b493f7-4443-42be-a834-d1e92b99881d", - "Command": "-config:xr/vrMultiviewStereoMode:t=horizontal" - } - ] - } - ] -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/projects/skyquake_vrt.vcxproj b/prog/_jBuild/msbuild/projects/skyquake_vrt.vcxproj deleted file mode 100644 index c5608ca15..000000000 --- a/prog/_jBuild/msbuild/projects/skyquake_vrt.vcxproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - dbg_win32 - x64 - - - dev_win32 - x64 - - - rel_win32 - x64 - - - - dbg_win64 - x64 - - - dev_win64 - x64 - - - rel_win64 - x64 - - - - dbg_ps5 - x64 - - - dev_ps5 - x64 - - - rel_ps5 - x64 - - - - - {2825dbf0-b3ef-4f8c-b711-ce665007425a} - aces - skyquake - $(SolutionDir)skyquake_vrt\ - $(SolutionDir)skyquake\prog\ - $(SkyQuakeDir)game\ - true - - - - - $(AdjunctOptions) -fjamfile-vrt - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/projects/skyquake_wtm.args.json b/prog/_jBuild/msbuild/projects/skyquake_wtm.args.json deleted file mode 100644 index 12c67d518..000000000 --- a/prog/_jBuild/msbuild/projects/skyquake_wtm.args.json +++ /dev/null @@ -1,737 +0,0 @@ -{ - "FileVersion": 2, - "Id": "60740a81-1a48-47aa-a5a7-72a560eda3b9", - "Items": [ - { - "Id": "039b242c-fed3-4239-8dc4-7be44529f2fe", - "Command": "Network", - "Items": [ - { - "Id": "132ecce9-f61d-4364-9404-a3d46a96e982", - "Command": "-config:debug/disableNetwork:b=yes" - } - ] - }, - { - "Id": "9d400b2c-c942-4504-89cc-ade420885434", - "Command": "Difficulty", - "Items": [ - { - "Id": "5abe7c99-844a-4d9f-960f-7f08276aa24c", - "Command": "-config:gameplay/difficulty:t=arcade" - }, - { - "Id": "c5cba23c-96a7-481f-8cff-249f3fb32a9e", - "Command": "-config:gameplay/difficulty:t=realistic" - }, - { - "Id": "01e9a28a-6723-41ea-a884-d17aa8e263cc", - "Command": "-config:gameplay/difficulty:t=hardcore" - }, - { - "Id": "11edbb23-bebd-45e9-85e1-abca74d33242", - "Command": "-config:gameplay/difficulty:t=custom" - } - ] - }, - { - "Id": "4b348f53-c697-4b89-913f-ef8356bc1874", - "Command": "Binaries", - "ExclusiveMode": true, - "Items": [ - { - "Id": "76dfd842-77c6-426c-a9c9-50665be097d7", - "Command": "-config:debug/offlineBinaries:b=yes" - }, - { - "Id": "3ce18dcf-b251-425c-9aad-0dc59d6258e1", - "Command": "-config:debug/offlineBinaries:b=yes -addpath:../gameOnline/ -addpath:../develop/gameBase/pkg_dev/ -addpath:../develop/gameBase/_pc/ -addpath:../develop/gameBase/ -addpath:../develop/gameBase/lang_src/" - }, - { - "Id": "701a213f-c67b-4e3f-b236-be19a15239b2", - "Command": "-config:debug/offlineBinaries:b=no" - } - ] - }, - { - "Id": "a7345ee9-038e-4864-a5c8-452b0f22ab72", - "Command": "Console graphics preset", - "ExclusiveMode": true, - "Items": [ - { - "Id": "2415164f-f428-4a46-a6ce-8896bff939e0", - "Command": "-graphicPreset:HighFPS" - }, - { - "Id": "6201449a-56a1-44a4-88ce-08bf05bf5e1d", - "Command": "-graphicPreset:HighQuality" - } - ] - }, - { - "Id": "c1c87d75-52d4-476e-a7a5-385ada46da52", - "Command": "Driver", - "ExclusiveMode": true, - "Items": [ - { - "Id": "5c18e4f4-693b-4ba1-a870-9dd776474e7b", - "Command": "DX11", - "Items": [ - { - "Id": "ec80cbf7-05ff-4d8a-8d90-82f2838371c4", - "Command": "-config:video/driver:t=dx11" - }, - { - "Id": "874cb652-bda3-4c70-8bce-6f1df4ef9ce1", - "Command": "Debug", - "ExclusiveMode": true, - "Items": [ - { - "Id": "3685fde5-8d21-40bf-b68e-d1089027af59", - "Command": "" - }, - { - "Id": "22a282de-e8a1-4bdf-a45c-932a6510be98", - "Command": "-config:directx/debug:b=no" - }, - { - "Id": "292a23d9-4286-4c86-bc08-63368439a8a5", - "Command": "-config:directx/debug:b=yes" - } - ] - }, - { - "Id": "d0cfa318-c905-4cdb-abf6-d94e13334a2d", - "Command": "ForceDx10", - "ExclusiveMode": true, - "Items": [ - { - "Id": "7bb9e37e-53f5-415a-b931-53e99030b68c", - "Command": "" - }, - { - "Id": "5b1437d5-2ca4-4db7-80ba-aa7c79e325f8", - "Command": "-config:directx/forceUseDx10:b=no" - }, - { - "Id": "49a086e1-e00f-4ac4-9ec8-cfaa4a9e393b", - "Command": "-config:directx/forceUseDx10:b=yes" - } - ] - } - ] - }, - { - "Id": "24a553cd-d809-405d-9732-3291a224d2fb", - "Command": "DX12", - "Items": [ - { - "Id": "3679ac73-7054-49ce-bee9-91986427feef", - "Command": "-config:video/driver:t=dx12" - }, - { - "Id": "d8003583-9ed9-4047-9f49-459832090280", - "Command": "Debug level", - "ExclusiveMode": true, - "Items": [ - { - "Id": "7579e021-ce6a-4c13-adb9-34e5a536dddf", - "Command": "" - }, - { - "Id": "6bba0ba2-486d-423b-9493-28f5621bf697", - "Command": "-config:dx12/debugLevel:i=0" - }, - { - "Id": "dabca630-960b-4863-9dd4-6b2398634407", - "Command": "-config:dx12/debugLevel:i=1" - }, - { - "Id": "64a0769f-2a7e-4003-b7b7-3ce4b2bf5f14", - "Command": "-config:dx12/debugLevel:i=2" - }, - { - "Id": "567f367d-d5ee-4109-a8cd-4d2a88fe76b7", - "Command": "-config:dx12/debugLevel:i=3" - } - ] - }, - { - "Id": "83aa8cc6-83f6-479f-b4d4-161521e2b2b3", - "Command": "Execution mode", - "ExclusiveMode": true, - "Items": [ - { - "Id": "540d33e8-5239-4868-a449-7a0343c1556c", - "Command": "" - }, - { - "Id": "e7c480df-f31d-4432-bbc0-1ef67f10c91b", - "Command": "-config:dx12/executionMode:t=concurrent" - }, - { - "Id": "05e041de-a6a6-450e-a4f7-7775a543ebd9", - "Command": "-config:dx12/executionMode:t=immediate" - } - ] - }, - { - "Id": "f94edee9-8a45-4d37-818d-f2a155df053b", - "Command": "CPU Validation", - "ExclusiveMode": true, - "Items": [ - { - "Id": "bfbbe853-92c6-4870-8433-01bfcf898c97", - "Command": "" - }, - { - "Id": "e65e1955-34dc-4a56-98cf-2d308be30e22", - "Command": "-config:dx12/cpuValidation:b=no" - }, - { - "Id": "90ea1c32-267d-40c7-8f6d-f464398938eb", - "Command": "-config:dx12/cpuValidation:b=yes" - } - ] - }, - { - "Id": "e606d2b8-04c2-4158-8a99-12289abb1c40", - "Command": "GPU Validation", - "ExclusiveMode": true, - "Items": [ - { - "Id": "9432ed0e-9f72-4dc1-a881-d306fb4b148f", - "Command": "" - }, - { - "Id": "6622c2a6-9c0b-4e45-9db1-6826528c1ac0", - "Command": "-config:dx12/gpuValidation:b=no" - }, - { - "Id": "2778ae67-26c1-4c5c-91cb-dcb264039d03", - "Command": "-config:dx12/gpuValidation:b=yes" - } - ] - }, - { - "Id": "7e58624d-c4de-4389-a1b1-4ec891bd2788", - "Command": "Track PageFaults", - "ExclusiveMode": true, - "Items": [ - { - "Id": "770e803d-7595-413a-9b4b-694ba026e09b", - "Command": "" - }, - { - "Id": "e8c09bc8-0ef7-4467-842d-7e3761f0e364", - "Command": "-config:dx12/trackPageFaults:b=no" - }, - { - "Id": "6e131857-7b29-49ac-9a32-0c51e878cbd7", - "Command": "-config:dx12/trackPageFaults:b=yes" - } - ] - }, - { - "Id": "1a6f41f3-08e2-473c-9fc4-870108488814", - "Command": "Breadcrumbs", - "ExclusiveMode": true, - "Items": [ - { - "Id": "702182e8-4496-4dec-9cc3-c125fa6a1209", - "Command": "" - }, - { - "Id": "dd67f3a8-f507-4517-9941-79dcc7086854", - "Command": "-config:dx12/placeBreadcrumbs:b=no" - }, - { - "Id": "499a19bc-b80b-4965-b535-8cd791b8e0fa", - "Command": "-config:dx12/placeBreadcrumbs:b=yes" - } - ] - }, - { - "Id": "f204aa9c-646e-46f9-a76d-b24279162f4c", - "Command": "User barriers", - "ExclusiveMode": true, - "Items": [ - { - "Id": "49606f03-0c30-4e48-b0cc-7b9ccbf40238", - "Command": "" - }, - { - "Id": "53eb7695-b5be-4c24-92c6-35c69df560f7", - "Command": "-config:dx12/processUserBarriers:b=no" - }, - { - "Id": "6b91715d-6074-4e18-8394-1631f306dc1e", - "Command": "-config:dx12/processUserBarriers:b=yes" - } - ] - }, - { - "Id": "a07beb14-ca74-4efb-b6bb-245e62a8d707", - "Command": "Name Objects", - "ExclusiveMode": true, - "Items": [ - { - "Id": "da72815b-1390-4f83-8c01-f61de91bc079", - "Command": "" - }, - { - "Id": "955a216c-79c2-4acd-b7eb-bee1d117a35b", - "Command": "-config:dx12/nameObjects:b=no" - }, - { - "Id": "31aee53f-3c7a-4d39-b915-3732454c8b3d", - "Command": "-config:dx12/nameObjects:b=yes" - } - ] - }, - { - "Id": "0e89901b-f9ef-47da-b44d-1d03d3a42b0b", - "Command": "Enable Markers", - "ExclusiveMode": true, - "Items": [ - { - "Id": "ce41fb86-5cb4-409b-926f-edb80f32dac5", - "Command": "" - }, - { - "Id": "73c3d98f-a56f-4623-8c48-b99d090cf3d3", - "Command": "-config:dx12/enableMarkers:b=no" - }, - { - "Id": "18cb74d1-ff99-4df1-8698-b00278215753", - "Command": "-config:dx12/enableMarkers:b=yes" - } - ] - }, - { - "Id": "12b2b0a8-c8ca-4dc9-ae2e-38b7b5e7dea6", - "Command": "Write Markers", - "ExclusiveMode": true, - "Items": [ - { - "Id": "7cc66f2f-c0ca-4ea8-ae1a-a3e9bd2f237d", - "Command": "" - }, - { - "Id": "4922dd20-27e7-46a5-a5e8-8f737c3b632b", - "Command": "-config:dx12/writeMarkers:b=no" - }, - { - "Id": "6ec7164f-51c0-49b4-a539-f71d56b81d4c", - "Command": "-config:dx12/writeMarkers:b=yes" - } - ] - }, - { - "Id": "ad0e46ad-330a-4769-aa20-941a63bbf99a", - "Command": "Enable PIX Capture", - "ExclusiveMode": true, - "Items": [ - { - "Id": "c2b776c7-d93b-43ed-96cd-7aa417ce5680", - "Command": "" - }, - { - "Id": "e347b3f2-21a3-4568-985a-4bed3b9c9fa0", - "Command": "-config:dx12/loadPixCapturer:b=no" - }, - { - "Id": "2f4e7605-7552-45bd-8e7e-0d8fd7e0b24d", - "Command": "-config:dx12/loadPixCapturer:b=yes" - } - ] - }, - { - "Id": "07526d7e-f8b8-48dc-9e35-30920b69ce93", - "Command": "HDR", - "ExclusiveMode": true, - "Items": [ - { - "Id": "f4514863-83c3-4227-82a4-8c3113b1edc3", - "Command": "" - }, - { - "Id": "0dbdd783-9be9-418d-90e6-7a5f3be0fc3e", - "Command": "-config:dx12/forceHdr:b=no" - }, - { - "Id": "da7ddef0-d79a-46f8-ba34-dc962f90221f", - "Command": "-config:dx12/forceHdr:b=yes" - } - ] - } - ] - }, - { - "Id": "88f61f06-ed7e-4bf8-8ffd-b6deee1824ae", - "Command": "Vulkan", - "Items": [ - { - "Id": "bb1b855e-a226-45bb-944a-08d90cd77aae", - "Command": "-config:video/driver:t=vulkan" - }, - { - "Id": "7b25aeea-be63-4349-b9ae-2a19fd9546f2", - "Command": "-config:vulkan/enableRenderDocLayer:b=yes" - }, - { - "Id": "e633eb98-e563-4723-ae87-9c650cf7b4bb", - "Command": "Debug level", - "ExclusiveMode": true, - "Items": [ - { - "Id": "a6f71623-e276-47fb-9553-a23594709ae3", - "Command": "" - }, - { - "Id": "e6b23c1a-8c1c-4441-90b5-7b2b6ede5a83", - "Command": "-config:vulkan/debugLevel:i=2" - } - ] - } - ] - } - ] - }, - { - "Id": "717a5203-8181-492a-8b32-9a7ef663dd62", - "Command": "Graphics", - "Items": [ - { - "Id": "14968fe9-9735-4071-b784-99efb71b01ce", - "Command": "-config:graphics/consoleGfxSettings:b=yes" - }, - { - "Id": "a325bf92-140c-4740-8f75-743d53b95dbb", - "Command": "-config:graphics/fluidWind:b=no" - }, - { - "Id": "67e654c2-e6aa-41e3-a09e-d3104311eba1", - "Command": "-config:graphics/prepass:b=no" - }, - { - "Id": "283e7ff0-bbad-4440-8daa-b76cc93e4c2e", - "Command": "-config:graphics/fxTarget:t=highres" - } - ] - }, - { - "Id": "8345b90f-92c3-4951-80f6-57209c73e9f7", - "Command": "WindowMode", - "ExclusiveMode": true, - "Items": [ - { - "Id": "3dc621aa-8a9a-45b0-9623-e88467a37838", - "Command": "-config:video/mode:t=windowed" - }, - { - "Id": "a7bcd389-26a2-4e39-a74b-bb0f572a932d", - "Command": "-config:video/mode:t=fullscreenwindowed" - }, - { - "Id": "e90ba9ef-f7cd-4277-a258-743ba354acdb", - "Command": "-config:video/mode:t=fullscreen" - } - ] - }, - { - "Id": "f2e43cff-37d9-489b-bd91-2ba63d6a711d", - "Command": "WindowPosition", - "ExclusiveMode": true, - "Items": [ - { - "Id": "0ad76123-6014-4182-bb45-406fb69bfd49", - "Command": "-config:video/position:ip2=0,0" - } - ] - }, - { - "Id": "caf756e6-c739-47d5-82fd-86bfe50faccc", - "Command": "Resolution", - "ExclusiveMode": true, - "Items": [ - { - "Id": "f1237617-bfeb-49d6-82c0-d432bdc37e83", - "Command": "-config:video/resolution:t=1920x1080" - }, - { - "Id": "315fd12c-023b-48c1-ba5c-fd254552d6f5", - "Command": "-config:video/resolution:t=1280x720" - }, - { - "Id": "807491d3-1c56-4f9c-aa95-282a825f7af0", - "Command": "-config:video/resolution:t=1024x768" - }, - { - "Id": "5035e45f-77c4-4ca7-bd36-c863d227a8b7", - "Command": "-config:video/resolution:t=854x480" - } - ] - }, - { - "Id": "973ccf5b-dd6d-422f-9434-2d5d0cc75570", - "Command": "Map selection", - "ExclusiveMode": true, - "Items": [ - { - "Id": "21160aaa-78d4-44a3-b5dd-f139879a5f14", - "Command": "training/testFlight/tank/testFlight_ussr_tft", - "Items": [ - { - "Id": "e9af2c19-abbf-4d36-b429-3406b310baf2", - "Command": "-config:game_start/missionFile:t=gameData/missions/training/testFlight/tank/testFlight_ussr_tft.blk -config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "daea7ef8-6ac3-4902-adf1-ecc15e7f337b", - "Command": "small_mission", - "Items": [ - { - "Id": "e111cab8-dbee-42cc-8ed8-2a0cb8af6662", - "Command": "-config:game_start/missionFile:t=gameData/missions/small_mission.blk -config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "441480fe-4a1e-458d-9f85-6d7d09d9fcdd", - "Command": "singlemissions/benchmark/benchmark_tank_corpses", - "Items": [ - { - "Id": "85326a25-ffa1-43a3-8c09-df851be5b356", - "Command": "-config:game_start/missionFile:t=gameData/missions/singlemissions/benchmark/benchmark_tank_corpses.blk -config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "7197dfef-25fd-4f2b-a505-159cfdc15f98", - "Command": "singlemissions/benchmark/benchmark_tank", - "Items": [ - { - "Id": "f1ea89d5-4181-4616-95e8-32bac9ed23d8", - "Command": "-config:game_start/missionFile:t=gameData/missions/singlemissions/benchmark/benchmark_tank.blk -config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "d485de14-90ad-434d-9622-119ed85723a8", - "Command": "singlemissions/benchmark/benchmark_non-optimized", - "Items": [ - { - "Id": "88a74ce0-9594-4087-aff1-6413aee816de", - "Command": "-config:game_start/missionFile:t=gameData/missions/singlemissions/benchmark/benchmark_non-optimized.blk -config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "38c44602-0db1-4186-ad18-d1dd7550d72e", - "Command": "singlemissions/tutorial/tutorial_ship_basic", - "Items": [ - { - "Id": "3e103014-e63b-4bac-bc8e-2085bd0c3143", - "Command": "-config:game_start/missionFile:t=gameData/missions/singlemissions/tutorial/tutorial_ship_basic.blk -config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "decd0c2f-8b15-440b-830a-c7bce770e543", - "Command": "singlemissions/tutorial/tutorial_tank_basic", - "Items": [ - { - "Id": "ec130e94-a0db-41fa-a9da-ca5383eabbdd", - "Command": "-config:game_start/missionFile:t=gameData/missions/singlemissions/tutorial/tutorial_tank_basic.blk -config:debug/disableMenu:b=yes" - } - ] - }, - { - "Id": "4dbbdaf4-e965-4cbe-8209-fbb569bb1c0d", - "Command": "singlemissions/qualcomm_demo", - "Items": [ - { - "Id": "1e19f5c0-7ac5-4fd3-9c75-d52f9f69801e", - "Command": "-config:game_start/missionFile:t=gameData/missions/singlemissions/qualcomm_demo.blk -config:debug/disableMenu:b=yes" - } - ] - } - ] - }, - { - "Id": "de575d56-dc76-44bf-a605-b9b1e8f68ee6", - "Command": "Miscellaneous", - "Items": [ - { - "Id": "adf9fa36-4332-413f-bb10-f91163ba6f85", - "Command": "android_preset", - "ExclusiveMode": true, - "Items": [ - { - "Id": "2b74aefc-2d2c-4634-8b82-113c97c860d2", - "Command": "-config:shadersPath:t=compiledShaders/gameOculus -config:renderFeaturesPlatform:t=android -config:graphics/use_occlusion:b=no -config:graphics/fluidWind:b=no -config:graphics/prepass:b=no -config:graphics/fxTarget:t=highres -config:graphics/low_res_lut:b=yes" - } - ] - }, - { - "Id": "ea63b087-10b6-4b3a-bc30-8019283214f7", - "Command": "-config:debug/devmodeEnabled:b=yes" - }, - { - "Id": "d355251c-c953-4795-baf8-fe07d21c7e1f", - "Command": "-config:debug/ttyconsole:b=yes" - }, - { - "Id": "486bb4df-ad42-4f6c-8a37-77f83fb2dbee", - "Command": "-config:clipmap/cacheWidth:i=8192" - }, - { - "Id": "ae3c2022-2397-41ca-a466-4fe37886b77f", - "Command": "-config:video/forceMSAA:b=yes" - }, - { - "Id": "a9284a08-5cba-4664-95ce-9d81484df5c6", - "Command": "-config:video/preferiGPU:b=yes" - }, - { - "Id": "aeb94ea0-44e1-4cd4-a8c2-05541fe43539", - "Command": "-config:video/threaded_window:b=yes" - }, - { - "Id": "044325c5-9ad5-4b5d-b52d-e78395300a97", - "Command": "-config:video/vsync:b=no" - }, - { - "Id": "cf364613-b563-4b0e-b92b-7098e06614b6", - "Command": "-config:yunetwork/forceAutoLogin:b=yes" - }, - { - "Id": "894c933c-2a6d-43fe-bc71-c6423879d0ce", - "Command": "-rdp_mode" - } - ] - }, - { - "Id": "c90d23ed-30ed-4858-aaf6-358a02d6f42b", - "Command": "Profiler", - "ExclusiveMode": true, - "Items": [ - { - "Id": "bc84c548-d76a-47ad-9caf-3fc0cf3d6617", - "Command": "-config:debug/profiler:t=off" - }, - { - "Id": "d186d968-29e2-47cb-aeaa-1c58fa7ab6f6", - "Command": "-config:debug/profiler:t=cpu" - }, - { - "Id": "81d27de6-fc81-4036-b966-aa954d1f6837", - "Command": "-config:debug/profiler:t=gpu" - } - ] - }, - { - "Id": "dc7059ac-4287-45a5-adb5-149c9af80e89", - "Command": "Replay", - "ExclusiveMode": true, - "Items": [ - { - "Id": "1b60fa52-0902-4339-bd61-b0e19f619015", - "Command": "-play:replay.rpl" - }, - { - "Id": "c50fcfac-ba11-46da-b960-5845db44997c", - "Command": "-record:replay.rpl" - } - ] - }, - { - "Id": "41b4d135-90cd-4ac3-9c92-9f497d9cd837", - "Command": "Use addon VromSrc", - "ExclusiveMode": true, - "Items": [ - { - "Id": "480921c8-d3b5-4617-8748-e580749c8fbc", - "Command": "-config:debug/useAddonVromSrc:b=no" - }, - { - "Id": "c7605c34-1f09-49bb-9087-de22c2479d38", - "Command": "-config:debug/useAddonVromSrc:b=yes" - }, - { - "Id": "90bb915f-fb71-4c30-b6bf-2614325c1301", - "Command": "-config:debug/useAddonVromSrc:b=yes -config:debug/vromfsFirstPriority:b=no" - } - ] - }, - { - "Id": "a464725b-89d3-4207-83c3-a8e0cab75344", - "Command": "Webview", - "Items": [ - { - "Id": "0fc4d54d-9ea6-424a-b487-4fe5ba504076", - "Command": "-config:debug/enableWebSocketStream:b=yes" - }, - { - "Id": "69420f7f-5a27-43a6-9299-463bde19dffb", - "Command": "-config:debug/dedicatedWebSocketPort:i=9114" - }, - { - "Id": "723f95a1-6d08-4e0b-8141-85231570da89", - "Command": "-config:debug/WebSocketPort:i=9113" - }, - { - "Id": "5eb45a68-b86b-4145-8092-ecace6dbeaed", - "Command": "-config:debug/dedicatedWebUIPort:i=23457" - } - ] - }, - { - "Id": "8cb7c892-c547-41b6-9176-cc14947e9c12", - "Command": "VR mirror", - "ExclusiveMode": true, - "Items": [ - { - "Id": "b6cfda99-1757-43e5-82ce-27fc7f7ef5af", - "Command": "-config:video/vreye:t=left" - }, - { - "Id": "80caa78d-640a-4a73-9638-d56490e8585c", - "Command": "-config:video/vreye:t=right" - }, - { - "Id": "a7db904e-998c-41d5-86ba-8715c2b68245", - "Command": "-config:video/vreye:t=both" - } - ] - }, - { - "Id": "0c232f17-22e3-40dd-bc06-9f8dda72dd70", - "Command": "VR", - "ExclusiveMode": true, - "Items": [ - { - "Id": "f53dab72-5ec6-4615-aebf-803def290b62", - "Command": "-config:gameplay/enableVR:b=no" - }, - { - "Id": "523612af-4c25-483c-a749-3d7886b5d44f", - "Command": "-config:gameplay/enableVR:b=yes" - }, - { - "Id": "e1ca2464-99f0-4bff-bc27-023a5588d9c5", - "Command": "Emulator", - "ExclusiveMode": true, - "Items": [ - { - "Id": "9410f5dd-f944-45e8-96e0-a61a25441b0f", - "Command": "-OculusQuest2 -config:gameplay/enableVR:b=yes -config:xr/emulatorProfile:t=2064,2096,0.0681346512074297,-0.907571197,0.785398185,0.837758064,-0.872664630,-0.785398185,0.907571197,0.837758064,-0.872664630" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj b/prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj deleted file mode 100644 index 47b26390e..000000000 --- a/prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - - {60740a81-1a48-47aa-a5a7-72a560eda3b9} - aces - skyquake - $(SolutionDir)skyquake_wtm\ - $(SolutionDir)skyquake\prog\ - $(SkyQuakeDir)game.PC\ - $(SkyQuakeDir)game.and\ - - - - $(AdjunctOptions) -fjamfile-wtm -sUseAndroidUpdater=no - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj.filters b/prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj.filters deleted file mode 100644 index 2457cd314..000000000 --- a/prog/_jBuild/msbuild/projects/skyquake_wtm.vcxproj.filters +++ /dev/null @@ -1,29 +0,0 @@ - - - - - {8cbdfa18-5207-4b61-b7b5-0973180f564a} - - - {3ed34d50-0e22-45cf-ab1d-d7c616869ee3} - - - {972ed196-eeb9-4282-939d-db7dfbf52d14} - - - {8bc7fa8d-7afd-40b6-a17e-c1c836a05574} - - - - - - develop\gameBase - - - scripts - - - gameBase - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/ps.targets b/prog/_jBuild/msbuild/ps.targets deleted file mode 100644 index 199f0c431..000000000 --- a/prog/_jBuild/msbuild/ps.targets +++ /dev/null @@ -1,18 +0,0 @@ - - - - $(MSPlatform) - - - - - - $(OriginPlatform) - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/shaders/commands.json b/prog/_jBuild/msbuild/shaders/commands.json deleted file mode 100644 index 083869bac..000000000 --- a/prog/_jBuild/msbuild/shaders/commands.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "commands": { - "enlisted_compile_shaders_dx12_fast": { - "fileName": "$(SolutionDir)\\asd.bat", - "workingDirectory": "../ ", - "arguments": "" - }, - "compile_shaders_dx12_fast": { - "fileName": "cmd.exe", - "workingDirectory": ".", - "arguments": "/c ..\\..\\..\\..\\enlisted\\prog\\shaders\\compile_shaders_dx12_fast.bat" - } - } -} \ No newline at end of file diff --git a/prog/_jBuild/msbuild/shaders/shaders.vcxproj b/prog/_jBuild/msbuild/shaders/shaders.vcxproj deleted file mode 100644 index a3f7baa7d..000000000 --- a/prog/_jBuild/msbuild/shaders/shaders.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Any - x64 - - - - {d33f408d-5c0a-48c9-8b0a-06206fa00293} - StaticLibrary - - - - -belownormal - - - $(TEMP)\$(ProjectGuid).log - - - - - - File - - - - - - <_ProjectDirectories Include="dummy"> - $(ProjectDir) - - - - - - - true - - $(ProjectDir) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/prog/_jBuild/msbuild/shaders/shaders.vcxproj.filters b/prog/_jBuild/msbuild/shaders/shaders.vcxproj.filters deleted file mode 100644 index c33ae28e8..000000000 --- a/prog/_jBuild/msbuild/shaders/shaders.vcxproj.filters +++ /dev/null @@ -1,430 +0,0 @@ - - - - - {bdb41e7a-6baf-4bf7-9b83-20d8bb0635a3} - - - {e0008278-4cb4-4880-9864-aa54cda46842} - - - {77a21268-791d-46ca-9e81-5fdf62409966} - - - {2964F9BB-E01D-499B-A6E6-6CC9F73563C3} - - - {ed1d6d5e-1d2d-4792-8a7e-fc448aafdd50} - - - {b446692e-6631-461c-ad8a-9ac8e8e0e9d8} - - - {5b5f1805-6487-446b-99b1-159d7bcb3304} - - - {b0ba0875-156a-4966-b3dd-f91fb5b4ac98} - - - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - enlisted - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - active_matter - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - cuisine_royale - - - outer_space - - - outer_space - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake - - - skyquake_wtm - - - skyquake_wtm - - - skyquake_wtm - - - skyquake_wtm - - - skyquake_wtm - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - to_the_sky - - - beyond_the_door - - - beyond_the_door - - - \ No newline at end of file diff --git a/prog/_jBuild/win32/clang-cpp.jam b/prog/_jBuild/win32/clang-cpp.jam index cf63cb792..b182042f8 100644 --- a/prog/_jBuild/win32/clang-cpp.jam +++ b/prog/_jBuild/win32/clang-cpp.jam @@ -64,9 +64,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; diff --git a/prog/_jBuild/win32/clang-sets.jam b/prog/_jBuild/win32/clang-sets.jam index f4a27ebdd..f7ae93e81 100644 --- a/prog/_jBuild/win32/clang-sets.jam +++ b/prog/_jBuild/win32/clang-sets.jam @@ -7,7 +7,6 @@ _CLANG_DIR = $(_DEVTOOL)/LLVM-$(CLangVer) ; if ! [ GLOB $(_CLANG_DIR) : * ] { exit FATAL\: \"$(_CLANG_DIR)\" not found! ; } if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc10-cpp.jam b/prog/_jBuild/win32/vc10-cpp.jam index c75cf603b..34be4fc10 100644 --- a/prog/_jBuild/win32/vc10-cpp.jam +++ b/prog/_jBuild/win32/vc10-cpp.jam @@ -127,9 +127,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win32/vc10-link.jam b/prog/_jBuild/win32/vc10-link.jam index 7f071cad9..4327fa64c 100644 --- a/prog/_jBuild/win32/vc10-link.jam +++ b/prog/_jBuild/win32/vc10-link.jam @@ -10,8 +10,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; } @@ -63,7 +61,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc10-sets.jam b/prog/_jBuild/win32/vc10-sets.jam index 8f9ada6e8..dcc779629 100644 --- a/prog/_jBuild/win32/vc10-sets.jam +++ b/prog/_jBuild/win32/vc10-sets.jam @@ -6,7 +6,6 @@ _VC_DIR = $(_DEVTOOL)/vc2010 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc10u-cpp.jam b/prog/_jBuild/win32/vc10u-cpp.jam index 6cd26a8c7..c294c5c89 100644 --- a/prog/_jBuild/win32/vc10u-cpp.jam +++ b/prog/_jBuild/win32/vc10u-cpp.jam @@ -133,9 +133,6 @@ rule ProcessCompileTarget _CPP_OPT = $(_DEF_CPP_OPT) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddDirectXInclude pre_opt : post_opt ; - - $(Target)__CPP_OPT = $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; $(Target)__ASM_OPT = $(_DEF_ASM_OPT) $(ASMopt) ; diff --git a/prog/_jBuild/win32/vc10u-link.jam b/prog/_jBuild/win32/vc10u-link.jam index 120f06c63..ee5105ee3 100644 --- a/prog/_jBuild/win32/vc10u-link.jam +++ b/prog/_jBuild/win32/vc10u-link.jam @@ -9,7 +9,6 @@ rule ProcessLinkTarget if $(TargetType) = exe { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; @@ -43,7 +42,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc10u-sets.jam b/prog/_jBuild/win32/vc10u-sets.jam index 0bf79c732..5b95c44a3 100644 --- a/prog/_jBuild/win32/vc10u-sets.jam +++ b/prog/_jBuild/win32/vc10u-sets.jam @@ -4,7 +4,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2010 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc11-cpp.jam b/prog/_jBuild/win32/vc11-cpp.jam index e55051749..90d124570 100644 --- a/prog/_jBuild/win32/vc11-cpp.jam +++ b/prog/_jBuild/win32/vc11-cpp.jam @@ -131,9 +131,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win32/vc11-link.jam b/prog/_jBuild/win32/vc11-link.jam index 7f071cad9..4327fa64c 100644 --- a/prog/_jBuild/win32/vc11-link.jam +++ b/prog/_jBuild/win32/vc11-link.jam @@ -10,8 +10,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; } @@ -63,7 +61,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc11-sets.jam b/prog/_jBuild/win32/vc11-sets.jam index 883be366c..f7b13a011 100644 --- a/prog/_jBuild/win32/vc11-sets.jam +++ b/prog/_jBuild/win32/vc11-sets.jam @@ -6,7 +6,6 @@ _VC_DIR = $(_DEVTOOL)/vc2012 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc11u-cpp.jam b/prog/_jBuild/win32/vc11u-cpp.jam index 6cd26a8c7..c294c5c89 100644 --- a/prog/_jBuild/win32/vc11u-cpp.jam +++ b/prog/_jBuild/win32/vc11u-cpp.jam @@ -133,9 +133,6 @@ rule ProcessCompileTarget _CPP_OPT = $(_DEF_CPP_OPT) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddDirectXInclude pre_opt : post_opt ; - - $(Target)__CPP_OPT = $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; $(Target)__ASM_OPT = $(_DEF_ASM_OPT) $(ASMopt) ; diff --git a/prog/_jBuild/win32/vc11u-link.jam b/prog/_jBuild/win32/vc11u-link.jam index 120f06c63..ee5105ee3 100644 --- a/prog/_jBuild/win32/vc11u-link.jam +++ b/prog/_jBuild/win32/vc11u-link.jam @@ -9,7 +9,6 @@ rule ProcessLinkTarget if $(TargetType) = exe { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; @@ -43,7 +42,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc11u-sets.jam b/prog/_jBuild/win32/vc11u-sets.jam index a02044a25..256461daf 100644 --- a/prog/_jBuild/win32/vc11u-sets.jam +++ b/prog/_jBuild/win32/vc11u-sets.jam @@ -4,7 +4,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2012 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc12-cpp.jam b/prog/_jBuild/win32/vc12-cpp.jam index 4dba69da1..d1eacfab3 100644 --- a/prog/_jBuild/win32/vc12-cpp.jam +++ b/prog/_jBuild/win32/vc12-cpp.jam @@ -135,9 +135,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win32/vc12-link.jam b/prog/_jBuild/win32/vc12-link.jam index 7f071cad9..4327fa64c 100644 --- a/prog/_jBuild/win32/vc12-link.jam +++ b/prog/_jBuild/win32/vc12-link.jam @@ -10,8 +10,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; } @@ -63,7 +61,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc12-sets.jam b/prog/_jBuild/win32/vc12-sets.jam index aa98b8af2..2c75a6e39 100644 --- a/prog/_jBuild/win32/vc12-sets.jam +++ b/prog/_jBuild/win32/vc12-sets.jam @@ -6,7 +6,6 @@ _VC_DIR = $(_DEVTOOL)/vc2013 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc12u-cpp.jam b/prog/_jBuild/win32/vc12u-cpp.jam index 4c9eba086..95b318589 100644 --- a/prog/_jBuild/win32/vc12u-cpp.jam +++ b/prog/_jBuild/win32/vc12u-cpp.jam @@ -138,9 +138,6 @@ rule ProcessCompileTarget _CPP_OPT = $(_DEF_CPP_OPT) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddDirectXInclude pre_opt : post_opt ; - - $(Target)__CPP_OPT = $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; $(Target)__ASM_OPT = $(_DEF_ASM_OPT) $(ASMopt) ; diff --git a/prog/_jBuild/win32/vc12u-link.jam b/prog/_jBuild/win32/vc12u-link.jam index 120f06c63..ee5105ee3 100644 --- a/prog/_jBuild/win32/vc12u-link.jam +++ b/prog/_jBuild/win32/vc12u-link.jam @@ -9,7 +9,6 @@ rule ProcessLinkTarget if $(TargetType) = exe { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; @@ -43,7 +42,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc12u-sets.jam b/prog/_jBuild/win32/vc12u-sets.jam index f9c593e6d..3593afae4 100644 --- a/prog/_jBuild/win32/vc12u-sets.jam +++ b/prog/_jBuild/win32/vc12u-sets.jam @@ -4,7 +4,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2013 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc14-cpp.jam b/prog/_jBuild/win32/vc14-cpp.jam index 889cdc357..d72553e22 100644 --- a/prog/_jBuild/win32/vc14-cpp.jam +++ b/prog/_jBuild/win32/vc14-cpp.jam @@ -158,9 +158,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win32/vc14-link.jam b/prog/_jBuild/win32/vc14-link.jam index a677064c3..3e421b1e8 100644 --- a/prog/_jBuild/win32/vc14-link.jam +++ b/prog/_jBuild/win32/vc14-link.jam @@ -26,8 +26,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo $(FileAlignLinkOption):512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) = yes { _LINK_OPT += -subsystem:console,\"5.01\" ; } else { @@ -90,7 +88,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc14-sets.jam b/prog/_jBuild/win32/vc14-sets.jam index f82d6afa5..ca0dcbd26 100644 --- a/prog/_jBuild/win32/vc14-sets.jam +++ b/prog/_jBuild/win32/vc14-sets.jam @@ -9,7 +9,6 @@ if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR).$(VCUpdateVer) ; } include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc15-cpp.jam b/prog/_jBuild/win32/vc15-cpp.jam index 2be739f6a..a6bea91e9 100644 --- a/prog/_jBuild/win32/vc15-cpp.jam +++ b/prog/_jBuild/win32/vc15-cpp.jam @@ -184,9 +184,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win32/vc15-link.jam b/prog/_jBuild/win32/vc15-link.jam index a677064c3..3e421b1e8 100644 --- a/prog/_jBuild/win32/vc15-link.jam +++ b/prog/_jBuild/win32/vc15-link.jam @@ -26,8 +26,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo $(FileAlignLinkOption):512 -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) = yes { _LINK_OPT += -subsystem:console,\"5.01\" ; } else { @@ -90,7 +88,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no /LARGEADDRESSAWARE ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win32/vc15-sets.jam b/prog/_jBuild/win32/vc15-sets.jam index 15efb8730..4017ce587 100644 --- a/prog/_jBuild/win32/vc15-sets.jam +++ b/prog/_jBuild/win32/vc15-sets.jam @@ -7,7 +7,6 @@ if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc16-sets.jam b/prog/_jBuild/win32/vc16-sets.jam index f8b94e5a1..87ebd9bc9 100644 --- a/prog/_jBuild/win32/vc16-sets.jam +++ b/prog/_jBuild/win32/vc16-sets.jam @@ -9,7 +9,6 @@ if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win32/vc17-sets.jam b/prog/_jBuild/win32/vc17-sets.jam index e6e5625d8..c89cb0ee5 100644 --- a/prog/_jBuild/win32/vc17-sets.jam +++ b/prog/_jBuild/win32/vc17-sets.jam @@ -9,7 +9,6 @@ if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; if ! [ GLOB $(_VC_DIR) : * ] { exit FATAL\: \"$(_VC_DIR)\" not found! Please, update DEVTOOLS ; } if ! [ GLOB $(_WIN_SDK) : * ] { exit FATAL\: \"$(_WIN_SDK)\" not found! Please, update DEVTOOLS ; } diff --git a/prog/_jBuild/win64/clang-cpp.jam b/prog/_jBuild/win64/clang-cpp.jam index 1934469d1..657126b41 100644 --- a/prog/_jBuild/win64/clang-cpp.jam +++ b/prog/_jBuild/win64/clang-cpp.jam @@ -65,9 +65,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; diff --git a/prog/_jBuild/win64/clang-sets.jam b/prog/_jBuild/win64/clang-sets.jam index cbab3a50f..23be96203 100644 --- a/prog/_jBuild/win64/clang-sets.jam +++ b/prog/_jBuild/win64/clang-sets.jam @@ -7,7 +7,6 @@ _CLANG_DIR = $(_DEVTOOL)/LLVM-$(CLangVer) ; if ! [ GLOB $(_CLANG_DIR) : * ] { exit FATAL\: \"$(_CLANG_DIR)\" not found! ; } if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc10-cpp.jam b/prog/_jBuild/win64/vc10-cpp.jam index 49bc3f324..4e9570e05 100644 --- a/prog/_jBuild/win64/vc10-cpp.jam +++ b/prog/_jBuild/win64/vc10-cpp.jam @@ -129,9 +129,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win64/vc10-link.jam b/prog/_jBuild/win64/vc10-link.jam index c613dd4dc..2258f6b7b 100644 --- a/prog/_jBuild/win64/vc10-link.jam +++ b/prog/_jBuild/win64/vc10-link.jam @@ -10,8 +10,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; } @@ -63,7 +61,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win64/vc10-sets.jam b/prog/_jBuild/win64/vc10-sets.jam index e91c4b046..ba6c8f978 100644 --- a/prog/_jBuild/win64/vc10-sets.jam +++ b/prog/_jBuild/win64/vc10-sets.jam @@ -5,7 +5,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2010 ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc10u-cpp.jam b/prog/_jBuild/win64/vc10u-cpp.jam index 3e0fb2e22..c504d4828 100644 --- a/prog/_jBuild/win64/vc10u-cpp.jam +++ b/prog/_jBuild/win64/vc10u-cpp.jam @@ -136,8 +136,6 @@ rule ProcessCompileTarget } _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddDirectXInclude pre_opt : post_opt ; - $(Target)__CPP_OPT = $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; $(Target)__ASM_OPT = -I$(AddIncludes) $(ASMopt) ; diff --git a/prog/_jBuild/win64/vc10u-link.jam b/prog/_jBuild/win64/vc10u-link.jam index 476c5720b..c2b0fb9d2 100644 --- a/prog/_jBuild/win64/vc10u-link.jam +++ b/prog/_jBuild/win64/vc10u-link.jam @@ -8,8 +8,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; } @@ -53,7 +51,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win64/vc10u-sets.jam b/prog/_jBuild/win64/vc10u-sets.jam index d62ae44f3..cdeb1f3d4 100644 --- a/prog/_jBuild/win64/vc10u-sets.jam +++ b/prog/_jBuild/win64/vc10u-sets.jam @@ -4,7 +4,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2010 ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc11-cpp.jam b/prog/_jBuild/win64/vc11-cpp.jam index a969e73e4..476b475ac 100644 --- a/prog/_jBuild/win64/vc11-cpp.jam +++ b/prog/_jBuild/win64/vc11-cpp.jam @@ -133,9 +133,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win64/vc11-link.jam b/prog/_jBuild/win64/vc11-link.jam index c613dd4dc..2258f6b7b 100644 --- a/prog/_jBuild/win64/vc11-link.jam +++ b/prog/_jBuild/win64/vc11-link.jam @@ -10,8 +10,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; } @@ -63,7 +61,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win64/vc11-sets.jam b/prog/_jBuild/win64/vc11-sets.jam index c3d1af21f..39948cf7b 100644 --- a/prog/_jBuild/win64/vc11-sets.jam +++ b/prog/_jBuild/win64/vc11-sets.jam @@ -5,7 +5,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2012 ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc11u-sets.jam b/prog/_jBuild/win64/vc11u-sets.jam index 2e034fc88..0a8217495 100644 --- a/prog/_jBuild/win64/vc11u-sets.jam +++ b/prog/_jBuild/win64/vc11u-sets.jam @@ -4,7 +4,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2012 ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc12-cpp.jam b/prog/_jBuild/win64/vc12-cpp.jam index c4d2b73ad..f16d3686a 100644 --- a/prog/_jBuild/win64/vc12-cpp.jam +++ b/prog/_jBuild/win64/vc12-cpp.jam @@ -139,9 +139,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win64/vc12-link.jam b/prog/_jBuild/win64/vc12-link.jam index c613dd4dc..2258f6b7b 100644 --- a/prog/_jBuild/win64/vc12-link.jam +++ b/prog/_jBuild/win64/vc12-link.jam @@ -10,8 +10,6 @@ rule ProcessLinkTarget { _LINK_OPT = -nologo -filealign:512 -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) != yes { _LINK_OPT += -subsystem:windows ; } @@ -63,7 +61,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win64/vc12-sets.jam b/prog/_jBuild/win64/vc12-sets.jam index 33e399caa..665973b16 100644 --- a/prog/_jBuild/win64/vc12-sets.jam +++ b/prog/_jBuild/win64/vc12-sets.jam @@ -5,7 +5,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2013 ; _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc14-cpp.jam b/prog/_jBuild/win64/vc14-cpp.jam index 7a680ce20..d4b2acd60 100644 --- a/prog/_jBuild/win64/vc14-cpp.jam +++ b/prog/_jBuild/win64/vc14-cpp.jam @@ -158,9 +158,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win64/vc14-link.jam b/prog/_jBuild/win64/vc14-link.jam index a14afda9a..caa0e77e3 100644 --- a/prog/_jBuild/win64/vc14-link.jam +++ b/prog/_jBuild/win64/vc14-link.jam @@ -24,8 +24,6 @@ rule ProcessLinkTarget _LINK_OPT = -nologo $(FileAlignLinkOption):512 -base:$(BaseAddress) -incremental:no ; if $(Sanitize) != disabled { _LINK_OPT += /FUNCTIONPADMIN ; } - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) = yes { _LINK_OPT += -subsystem:console,\"5.02\" ; } else { @@ -87,7 +85,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win64/vc14-sets.jam b/prog/_jBuild/win64/vc14-sets.jam index 4a8b322bb..cf95a65ea 100644 --- a/prog/_jBuild/win64/vc14-sets.jam +++ b/prog/_jBuild/win64/vc14-sets.jam @@ -8,7 +8,6 @@ _VC_DIR = $(_DEVTOOL)/vc2015 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR).$(VCUpdateVer) ; } _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc14u-sets.jam b/prog/_jBuild/win64/vc14u-sets.jam index 89528293a..f0ca660fd 100644 --- a/prog/_jBuild/win64/vc14u-sets.jam +++ b/prog/_jBuild/win64/vc14u-sets.jam @@ -5,7 +5,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2015 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR).$(VCUpdateVer) ; } _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc15-cpp.jam b/prog/_jBuild/win64/vc15-cpp.jam index 426e1e8d9..d7fbe5c5a 100644 --- a/prog/_jBuild/win64/vc15-cpp.jam +++ b/prog/_jBuild/win64/vc15-cpp.jam @@ -181,9 +181,6 @@ rule ProcessCompileTarget _CPP_OPT = -I$(AddIncludes) $(_CONFIG_OPT) $(_SUPPRESS_OPT) $(CPPopt) $(GlobalCPPopt) ; - AddForceFastcall _CPP_OPT ; - AddDirectXInclude pre_opt : post_opt ; - include $(Root)/prog/_jBuild/_vc/add_fp_fast.jam ; $(Target)__CPP_OPT = -FImemory/dag_memBase.h $(post_opt) $(_CPP_OPT) -TP ; $(Target)__C_OPT = $(post_opt) $(Copt) $(_CPP_OPT) ; diff --git a/prog/_jBuild/win64/vc15-link.jam b/prog/_jBuild/win64/vc15-link.jam index 144837ac7..e24dccfa1 100644 --- a/prog/_jBuild/win64/vc15-link.jam +++ b/prog/_jBuild/win64/vc15-link.jam @@ -25,8 +25,6 @@ rule ProcessLinkTarget _LINK_OPT = -nologo $(FileAlignLinkOption):512 -base:$(BaseAddress) -incremental:no ; if $(Sanitize) != disabled { _LINK_OPT += /FUNCTIONPADMIN ; } - AddDirectXLibs _LINK_OPT ; - if $(ConsoleExe) = yes { _LINK_OPT += -subsystem:console,\"5.02\" ; } else { @@ -96,7 +94,6 @@ rule ProcessLinkTarget else if $(TargetType) = dll { _LINK_OPT = -nologo -dll -subsystem:windows -base:$(BaseAddress) -incremental:no ; - AddDirectXLibs _LINK_OPT ; if $(Config) != dbg { _LINK_OPT += -opt:ref ; } diff --git a/prog/_jBuild/win64/vc15-sets.jam b/prog/_jBuild/win64/vc15-sets.jam index 1d558ae2f..fbd7e5ce5 100644 --- a/prog/_jBuild/win64/vc15-sets.jam +++ b/prog/_jBuild/win64/vc15-sets.jam @@ -6,7 +6,6 @@ _VC_DIR = $(_DEVTOOL)/vc2017 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc15u-sets.jam b/prog/_jBuild/win64/vc15u-sets.jam index 5aa1755d0..6cc8ec980 100644 --- a/prog/_jBuild/win64/vc15u-sets.jam +++ b/prog/_jBuild/win64/vc15u-sets.jam @@ -5,7 +5,6 @@ _OBJ_SUFFIX = .obj ; _VC_DIR = $(_DEVTOOL)/vc2017 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc16-sets.jam b/prog/_jBuild/win64/vc16-sets.jam index 69cb4880a..f81640aa0 100644 --- a/prog/_jBuild/win64/vc16-sets.jam +++ b/prog/_jBuild/win64/vc16-sets.jam @@ -7,7 +7,6 @@ _VC_DIR = $(_DEVTOOL)/vc2019 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc16u-sets.jam b/prog/_jBuild/win64/vc16u-sets.jam index b1995d069..6018ea40c 100644 --- a/prog/_jBuild/win64/vc16u-sets.jam +++ b/prog/_jBuild/win64/vc16u-sets.jam @@ -6,7 +6,6 @@ _CLANG_DIR = $(_DEVTOOL)/LLVM-$(CLangVer) ; _VC_DIR = $(_DEVTOOL)/vc2019 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc17-sets.jam b/prog/_jBuild/win64/vc17-sets.jam index 8e4d51667..06da081b9 100644 --- a/prog/_jBuild/win64/vc17-sets.jam +++ b/prog/_jBuild/win64/vc17-sets.jam @@ -7,7 +7,6 @@ _VC_DIR = $(_DEVTOOL)/vc2022 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _PREFAST_DIR = $(_DEVTOOL)/prefast ; _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/_jBuild/win64/vc17u-sets.jam b/prog/_jBuild/win64/vc17u-sets.jam index 9a00fe031..a6d13345b 100644 --- a/prog/_jBuild/win64/vc17u-sets.jam +++ b/prog/_jBuild/win64/vc17u-sets.jam @@ -6,7 +6,6 @@ _CLANG_DIR = $(_DEVTOOL)/LLVM-$(CLangVer) ; _VC_DIR = $(_DEVTOOL)/vc2022 ; if $(VCUpdateVer) { _VC_DIR = $(_VC_DIR)_$(VCUpdateVer) ; } _VC_CRT_TYPE = -MT ; -C_preopt_DirectXVer = jun2010 ; _WIN_SDK_TARGET_SUFFIX = x64 ; include $(Root)/prog/_jBuild/_vc/win_sdk.jam ; diff --git a/prog/commonFx/commonFxGame/compoundPs.cpp b/prog/commonFx/commonFxGame/compoundPs.cpp index bc309dc81..0f1c6a5a9 100644 --- a/prog/commonFx/commonFxGame/compoundPs.cpp +++ b/prog/commonFx/commonFxGame/compoundPs.cpp @@ -344,7 +344,7 @@ class CompoundPsEffect : public BaseParticleEffect } - virtual void render(unsigned rtype) + virtual void render(unsigned rtype, const TMatrix &view_itm) { for (int i = 0; i < NUM_FX; ++i) { @@ -352,7 +352,7 @@ class CompoundPsEffect : public BaseParticleEffect { float fxDelay = getFxDelay(i); if (time >= fxDelay) - subFx[i]->render(rtype); + subFx[i]->render(rtype, view_itm); } } } diff --git a/prog/commonFx/commonFxGame/dafxCompound.cpp b/prog/commonFx/commonFxGame/dafxCompound.cpp index 1afa0bca7..cb55c6e36 100644 --- a/prog/commonFx/commonFxGame/dafxCompound.cpp +++ b/prog/commonFx/commonFxGame/dafxCompound.cpp @@ -313,7 +313,7 @@ struct DafxCompound : BaseParticleEffect if (strcmp(i.tag.c_str(), dafx_ex::renderTags[dafx_ex::RTAG_LOWRES]) != 0 && strcmp(i.tag.c_str(), dafx_ex::renderTags[dafx_ex::RTAG_HIGHRES]) != 0 && // strcmp(i.tag.c_str(), dafx_ex::renderTags[dafx_ex::RTAG_DISTORTION]) != 0 && - strcmp(i.tag.c_str(), dafx_ex::renderTags[dafx_ex::RTAG_WATER_PROJ]) != 0 && + // strcmp(i.tag.c_str(), dafx_ex::renderTags[dafx_ex::RTAG_WATER_PROJ]) != 0 && strcmp(i.tag.c_str(), dafx_ex::renderTags[dafx_ex::RTAG_UNDERWATER]) != 0) continue; @@ -775,7 +775,7 @@ struct DafxCompound : BaseParticleEffect } } - void render(unsigned) override {} + void render(unsigned, const TMatrix &) override {} void spawnParticles(BaseParticleFxEmitter *, real) override {} diff --git a/prog/commonFx/commonFxGame/dafxModfx.cpp b/prog/commonFx/commonFxGame/dafxModfx.cpp index 5e02c15e2..2be0f6445 100644 --- a/prog/commonFx/commonFxGame/dafxModfx.cpp +++ b/prog/commonFx/commonFxGame/dafxModfx.cpp @@ -381,7 +381,7 @@ struct DafxModFx : BaseParticleEffect } } - void render(unsigned) override {} + void render(unsigned, const TMatrix &) override {} void spawnParticles(BaseParticleFxEmitter *, real) override {} diff --git a/prog/commonFx/commonFxGame/dafxSparks.cpp b/prog/commonFx/commonFxGame/dafxSparks.cpp index aba8df2ea..2b46166e0 100644 --- a/prog/commonFx/commonFxGame/dafxSparks.cpp +++ b/prog/commonFx/commonFxGame/dafxSparks.cpp @@ -435,7 +435,7 @@ struct DafxSparks : BaseParticleEffect void update(float) override {} - void render(unsigned) override {} + void render(unsigned, const TMatrix &) override {} void spawnParticles(BaseParticleFxEmitter *, real) override {} }; diff --git a/prog/commonFx/commonFxGame/flowPs2.cpp b/prog/commonFx/commonFxGame/flowPs2.cpp index 590969c4f..d24fd8fcd 100644 --- a/prog/commonFx/commonFxGame/flowPs2.cpp +++ b/prog/commonFx/commonFxGame/flowPs2.cpp @@ -532,7 +532,7 @@ class FlowPs2Effect : public BaseParticleEffect } - virtual void render(unsigned rtype) + virtual void render(unsigned rtype, const TMatrix &view_itm) { if ((rtype == FX_RENDER_TRANS && !par.distortion && par.shader != FX_STD_GBUFFERATEST) || (rtype == FX_RENDER_DISTORTION && par.distortion && par.shader != FX_STD_GBUFFERATEST) || @@ -541,7 +541,7 @@ class FlowPs2Effect : public BaseParticleEffect total_ps++; total_parts += parts.size(); - TMatrix vtm = ::grs_cur_view.itm; // deprecated + TMatrix vtm = view_itm; TMatrix4 globTm; if (par.sorted) d3d::getglobtm(globTm); // deprecated diff --git a/prog/commonFx/commonFxGame/lightFx.cpp b/prog/commonFx/commonFxGame/lightFx.cpp index c3de72a75..c820e7724 100644 --- a/prog/commonFx/commonFxGame/lightFx.cpp +++ b/prog/commonFx/commonFxGame/lightFx.cpp @@ -91,7 +91,7 @@ class LightEffect : public BaseEffectObject const Color4 &getResultLight() const { return output; } - virtual void render(unsigned /*rtype*/) {} + virtual void render(unsigned /*rtype*/, const TMatrix &) {} virtual void setTm(const TMatrix *tm) { position = tm->getcol(3); } diff --git a/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl b/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl index 8e43acd73..63535e8a9 100644 --- a/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl +++ b/prog/commonFx/commonFxGame/modfx/modfx_bboard_render.hlsl @@ -793,6 +793,9 @@ #if DAFX_USE_UNDERWATER_FOG modify_underwater_fog(view_dir_dist, fog_mul, fog_add); #endif + #if DAFX_USE_UNDERWATER_DEPTH_LIGHTING_MOD + modify_underwater_lighting(gdata.water_level, rdata.pos.y, vs_out.color.rgb); + #endif #if MODFX_SHADER_THERMALS fog_modify_thermal(fog_mul, fog_add); #endif @@ -881,10 +884,6 @@ input.pos.w = rcp(input.pos.w); #endif -#if !MODFX_SHADER_RIBBON && defined(FSR_DISTORTION) - input.tc.xy = getTexcoord(GET_SCREEN_POS(input.pos).xy); -#endif - GlobalData gdata = global_data_load(); DafxRenderData ren_info; dafx_get_render_info( 0, ren_info ); @@ -1134,9 +1133,13 @@ volfogInjection.a *= pp.weight_alpha; } - uint3 volfogTargetId = clamp(uint3(float3(viewport_tc.xy, sqrt(tcZ_sq))*view_inscatter_volume_resolution.xyz + float3(0,0,0.5)), 0u, uint3(view_inscatter_volume_resolution.xyz - 1)); - - initial_media[volfogTargetId] = volfogInjection; + float3 posF = float3(viewport_tc.xy, sqrt(tcZ_sq))*view_inscatter_volume_resolution.xyz; + posF.z += 0.5; + float zPart = frac(posF.z); + uint3 volfogTargetId0 = clamp(uint3(posF), 0u, uint3(view_inscatter_volume_resolution.xyz - 1)); + uint3 volfogTargetId1 = clamp(uint3(posF + float3(0,0,1)), 0u, uint3(view_inscatter_volume_resolution.xyz - 1)); + initial_media[volfogTargetId0] = (1-zPart)*volfogInjection; + initial_media[volfogTargetId1] = zPart * volfogInjection; return; #endif diff --git a/prog/dagorInclude/3d/dag_drv3d.h b/prog/dagorInclude/3d/dag_drv3d.h index c6776044d..c7317d0f9 100644 --- a/prog/dagorInclude/3d/dag_drv3d.h +++ b/prog/dagorInclude/3d/dag_drv3d.h @@ -671,46 +671,70 @@ struct RenderTarget uint32_t layer; }; +/** \defgroup RenderPassStructs + * @{ + */ + +/// \brief Description of render target bind inside render pass +/// \details Fully defines operation that will happen with target at defined subpass slot struct RenderPassBind { + /// \brief Index of render target in render targets array that will be used for this bind int32_t target; + /// \brief Index of subpass where bind happens int32_t subpass; + /// \brief Index of slot where target will be used int32_t slot; - // defines load & store operations at subpass start/end + /// \brief defines what will happen with target used in binding RenderPassTargetAction action; - // precise barrier that is called between subpasses + /// \brief optional user barrier for generic(emulated) implementation ResourceBarrier dependencyBarrier; }; +/// \brief Early description of render target +/// \details Gives necessary info at render pass creation so render pass is compatible with targets of same type later on struct RenderPassTargetDesc { - // use resource as template + /// \brief Resource from which information is extracted, can be nullptr BaseTexture *templateResource; - // or use raw information + /// \brief Raw texture create flags, used if template resource is not provided unsigned texcf; + /// \brief Must be set if template resource is empty and target will use aliased memory bool aliased; }; +/// \brief Description of target that is used inside render pass struct RenderPassTarget { + /// \brief Actual render target subresource reference RenderTarget resource; + /// \brief Clear value that is used on clear action ResourceClearValue clearValue; }; +/// \brief Render pass resource description, used to create RenderPass object struct RenderPassDesc { + /// \brief Name that is visible only in developer builds and inside graphics tools, if possible const char *debugName; + /// \brief Total amount of targets inside render pass uint32_t targetCount; + /// \brief Total amount of bindings for render pass uint32_t bindCount; + /// \brief Array of targetCount elements, supplying early description of render target const RenderPassTargetDesc *targetsDesc; + /// \brief Array of bindCount elements, describing all subpasses const RenderPassBind *binds; - //! texture binding offset for shader subpass reads used on APIs without native render passes + /// \brief Texture binding offset for shader subpass reads used on APIs without native render passes + /// \details Generic(emulated) implementation will use registers starting from this offset, to bind input attachments. + /// This must be properly handled inside shader code for generic implementation to work properly! uint32_t subpassBindingOffset; }; +/// \brief Area of render target where rendering will happen inside render pass struct RenderPassArea { uint32_t left; @@ -721,6 +745,14 @@ struct RenderPassArea float maxZ; }; +/**@}*/ + +namespace d3d +{ +//! opaque class that represents render pass +struct RenderPass; +} // namespace d3d + // NOTE: even if numPackedMips is zero, numTilesNeededForPackedMips may be greater than zero, which is a special case, // and numTilesNeededForPackedMips tiles still need to be assigned at numUnpackedMips. struct TextureTilingInfo @@ -756,12 +788,6 @@ struct TileMapping // - From TileMapping::heapTileIndex the given number of tiles will be mapped to the packed mip tail. }; -//! opaque class that represents render pass -namespace d3d -{ -struct RenderPass; -} - enum class APISupport { FULL_SUPPORT, @@ -1531,17 +1557,53 @@ size_t get_update_buffer_slice_pitch(ResUpdateBuffer *rub); //! applies update to target d3dres and releases update buffer (clears pointer afterwards) bool update_texture_and_release_update_buffer(ResUpdateBuffer *&src_rub); +/** \defgroup RenderPassD3D + * @{ + */ + +/// \brief Creates render pass object +/// \details Render pass objects are intended to be created once (and ahead of time), used many times +/// \note No external sync required +/// \warning Do not run per frame/realtime! +/// \warning Avoid using at time sensitive places! +/// \param rp_desc Description of render pass to be created +/// \result Pointer to opaque RenderPass object, may be nullptr if description is invalid RenderPass *create_render_pass(const RenderPassDesc &rp_desc); -//! deletion of pass will fail if pass is in use +/// \brief Deletes render pass object +/// \note Sync with usage is required (must not delete object that is in use in current CPU frame) +/// \warning All usage to object becomes invalid right after method call +/// \param rp Object to be deleted void delete_render_pass(RenderPass *rp); -//! viewport is reset to area after any commands of render pass begin/end/next -//! avoid writes/reads outside area, it is UB in general +/// \brief Begins render pass rendering +/// \details After this command, viewport is reset to area supplied +/// and subpass 0, described in render pass object, is started +/// \note Must be external synced (GPU lock required) +/// \warning When inside pass, all other GPU execution methods aside of Draw* are prohibited! +/// \warning Avoid writes/reads outside area, it is UB in general +/// \warning Will assert-fail if other render pass is already in process +/// \param rp Render pass resource to begin with +/// \param area Rendering area restriction +/// \param targets Array of targets that will be used in rendering void begin_render_pass(RenderPass *rp, const RenderPassArea area, const RenderPassTarget *targets); +/// \brief Advances to next subpass +/// \details Increases subpass number and executes necessary synchronization as well as binding, +/// described for this subpass +/// \details Viewport is reset to render area on every call +/// \note Must be external synced (GPU lock required) +/// \warning Will assert-fail if there is no subpass to advance to +/// \warning Will assert-fail if called outside of render pass void next_subpass(); -//! after render pass ends, render targets are reset to backbuffer +/// \brief Ends render pass +/// \details Processes store&sync operations described in render pass +/// \details After this call, any non Draw operations are allowed and render targets are reset to backbuffer +/// \note Must be external synced (GPU lock required) +/// \warning Will assert-fail if subpass is not final +/// \warning Will assert-fail if called outside of render pass void end_render_pass(); +/** @}*/ + #endif #if !_TARGET_D3D_MULTI diff --git a/prog/dagorInclude/3d/dag_drv3dConsts.h b/prog/dagorInclude/3d/dag_drv3dConsts.h index 61d31ba28..e85f65f03 100644 --- a/prog/dagorInclude/3d/dag_drv3dConsts.h +++ b/prog/dagorInclude/3d/dag_drv3dConsts.h @@ -111,7 +111,6 @@ enum enum { - SBCF_SYSMEM = 0x0002, // Create buffer in system memory SBCF_DYNAMIC = 0x0004, // Create dynamic buffer SBCF_MAYBELOST = 0x0008, // Buffer contents may be safely lost SBCF_ZEROMEM = 0x0010, // Make sure driver has cleared the buffer (PS4, PS5) @@ -2090,42 +2089,55 @@ constexpr inline ResourceBarrier operator^(ResourceBarrier l, ResourceBarrier r) return static_cast(static_cast(l) ^ static_cast(r)); } +/** \defgroup RenderPassConsts + * @{ + */ + +/// \brief Bitfield of actions that happen with target at given slot and subpass enum RenderPassTargetAction : int { - //! only barrier action will be performed + /// \brief No action with target will happen + /// \details Only \b dependencyBarrier of binding will be executed for this target + /// \warning Content of target becomes invalid if no action is supplied overall RP_TA_NONE = 0, - //! load action is performend once for each target is being accessed - - // read contents from memory + /// \brief Loads contents of target from memory to framebuffer + /// \note Avoid load operations on TBDR hardware RP_TA_LOAD_READ = 1u << 0, - // use clear value instead of contents + /// \brief Loads clear value to framebuffer instead of doing any memory operation RP_TA_LOAD_CLEAR = 1u << 1, - // do not care about load operation, use UB default (aka discard) + /// \brief Don't care about loading contents of target (aka discard) + /// \warning Initial content of frame buffer is underfined, make sure to handle this RP_TA_LOAD_NO_CARE = 1u << 2, - // any load mask + /// \brief Bitmask of any load operation + /// \note load action is performed for each target when + /// its being accessed for the first time in render pass RP_TA_LOAD_MASK = RP_TA_LOAD_NO_CARE | RP_TA_LOAD_CLEAR | RP_TA_LOAD_READ, - //! subpass action is performed on targets inside subpasses - - // read contents in shader + /// \brief Target contents will be readed by subpass + /// \note This corresponds to SubpassInput with SubpassLoad inside shader + /// \warning Generic implementation uses T register with \b subpassBindingOffset instead of SubpassInput, + /// this must be handled properly in shader code RP_TA_SUBPASS_READ = 1u << 3, - // resolve color/depth writes to target from MSAA target in same slot + /// \brief Target will be used as MSAA resolve destination of MSAA target bound in same slot + /// \note MSAA Depth resolve is optional feature if non generic implementation is used + /// \warning Must supply MSAA target in same slot in another binding + /// otherwise creation on render pass will fail RP_TA_SUBPASS_RESOLVE = 1u << 4, - // write contents in shader + /// \brief Target contents will be written by subpass RP_TA_SUBPASS_WRITE = 1u << 5, - // keep attachment contents if it was not used in subpass (otherwise UB) + /// \brief Target contents will be keeped intact if it was not used in subpass (otherwise UB) RP_TA_SUBPASS_KEEP = 1u << 6, - //! store action is performed once for each target on whole pass completion - - // write contents to memory + /// \brief Contents of framebuffer will be written to target memory RP_TA_STORE_WRITE = 1u << 7, - // do not write contents to memory (keep target intact) + /// \brief Contents of framebuffer will not be stored RP_TA_STORE_NONE = 1u << 8, - // don't care about result, target memory will be left in UB state + /// \brief Don't care about target memory contents + /// \warning Target memory contents will be left in UB state RP_TA_STORE_NO_CARE = 1u << 9, - // any store mask + /// \brief Bitmask of any load operation + /// \note store action is performed once for each target on whole pass completion RP_TA_STORE_MASK = RP_TA_STORE_NO_CARE | RP_TA_STORE_NONE | RP_TA_STORE_WRITE }; @@ -2134,13 +2146,16 @@ constexpr inline RenderPassTargetAction operator|(RenderPassTargetAction l, Rend return static_cast(static_cast(l) | static_cast(r)); } -// extra indexes that encode special cases of render pass description +/// \brief extra indexes that encode special cases of render pass description enum RenderPassExtraIndexes : int { RP_INDEX_NORMAL = 0, - // external end subpass are used for precise barriers - // between followup external workload + /// \brief Pseudo subpass index, that happens at end of render pass + /// \details Used to provide store actions as well as \b dependencyBarriers for generic implementation RP_SUBPASS_EXTERNAL_END = -1, - // using this slot will bind target as depth/stencil + /// \brief Slot for depth/stencil + /// \details Using this slot will bind target as depth/stencil RP_SLOT_DEPTH_STENCIL = -1 }; + +/** @}*/ diff --git a/prog/dagorInclude/anim/dag_animPostBlendCtrl.h b/prog/dagorInclude/anim/dag_animPostBlendCtrl.h index 2546e2157..fdaa56440 100644 --- a/prog/dagorInclude/anim/dag_animPostBlendCtrl.h +++ b/prog/dagorInclude/anim/dag_animPostBlendCtrl.h @@ -702,7 +702,6 @@ class LegsIKCtrl : public AnimPostBlendCtrl Point2 footStepRange, footRotRange; float maxFootUp, maxDyRate, maxDaRate; SimpleString foot, knee, leg, footStep; - bool isRightLeg; bool useAnimcharUpDir; }; diff --git a/prog/dagorInclude/anim/dag_animStateHolder.h b/prog/dagorInclude/anim/dag_animStateHolder.h index 8b9066589..35279dc45 100644 --- a/prog/dagorInclude/anim/dag_animStateHolder.h +++ b/prog/dagorInclude/anim/dag_animStateHolder.h @@ -10,6 +10,7 @@ #include #include #include +#include class IGenSave; class IGenLoad; @@ -152,4 +153,13 @@ class AnimCommonStateHolder friend class AnimationGraph; }; +inline void AnimCommonStateHolder::setParam(int id, float value) +{ + G_ASSERTF(id < val.size() && check_finite(value), "%d/%d %g", id, val.size(), value); + G_ASSERT(paramTypes[id] == PT_ScalarParam || paramTypes[id] == PT_TimeParam); + if (val[id].scalar != value) + val[id].flags |= PF_Changed; + val[id].scalar = value; +} + } // end of namespace AnimV20 diff --git a/prog/dagorInclude/fx/dag_baseFxClasses.h b/prog/dagorInclude/fx/dag_baseFxClasses.h index 5ae7ca98a..029a1fde4 100644 --- a/prog/dagorInclude/fx/dag_baseFxClasses.h +++ b/prog/dagorInclude/fx/dag_baseFxClasses.h @@ -166,7 +166,7 @@ class BaseEffectObject : public BaseEffectInterface public: virtual void update(float dt) = 0; - virtual void render(unsigned render_type_id) = 0; + virtual void render(unsigned render_type_id, const TMatrix &view_itm) = 0; virtual bool getResult(unsigned /*render_type_id*/) { return true; } virtual void onDeviceReset() {} diff --git a/prog/dagorInclude/fx/dag_leavesWind.h b/prog/dagorInclude/fx/dag_leavesWind.h index b39f5c9ec..fbcca06b0 100644 --- a/prog/dagorInclude/fx/dag_leavesWind.h +++ b/prog/dagorInclude/fx/dag_leavesWind.h @@ -22,7 +22,6 @@ class LeavesWindEffect void setShaderVars(const TMatrix &view_itm, real rocking_scale = 1, real rustling_scale = 1); - //::grs_cur_view.itm.getcol(0), ::grs_cur_view.itm.getcol(1), ::grs_cur_view.itm.getcol(2) static void setNoAnimShaderVars(const Point3 &colX, const Point3 &colY, const Point3 &colZ); diff --git a/prog/dagorInclude/gui/dag_stdGuiRender.h b/prog/dagorInclude/gui/dag_stdGuiRender.h index a935a5451..f0c4bd945 100644 --- a/prog/dagorInclude/gui/dag_stdGuiRender.h +++ b/prog/dagorInclude/gui/dag_stdGuiRender.h @@ -886,6 +886,8 @@ class GuiContext //! render scaled text to buffer (fill quad vertices and tex/quad count pairs); returns false if some glyphs to be yet rasterized bool draw_str_scaled_u_buf(SmallTab &out_qv, SmallTab &out_tex_qcnt, unsigned dsb_flags, real scale, const wchar_t *str, int len = -1); + bool draw_str_scaled_buf(SmallTab &out_qv, SmallTab &out_tex_qcnt, unsigned dsb_flags, real scale, + const char *str, int len = -1); //! render buffer (previously filled with draw_str_scaled_u_buf) void render_str_buf(dag::ConstSpan qv, dag::ConstSpan tex_qcnt, unsigned dsb_flags); diff --git a/prog/dagorInclude/math/dag_bits.h b/prog/dagorInclude/math/dag_bits.h index d291c5ac0..c33d9cba3 100644 --- a/prog/dagorInclude/math/dag_bits.h +++ b/prog/dagorInclude/math/dag_bits.h @@ -135,8 +135,6 @@ inline int __bit_scan_reverse(unsigned long &index, unsigned int val) { return _ #define HAS_BIT_SCAN_FORWARD 0 #endif -//-V::779 - inline unsigned __ctz_unsafe(unsigned long long value) { #if defined(__clang__) || defined(__GNUC__) diff --git a/prog/dagorInclude/math/dag_check_nan.h b/prog/dagorInclude/math/dag_check_nan.h index b358680ef..d4f527331 100644 --- a/prog/dagorInclude/math/dag_check_nan.h +++ b/prog/dagorInclude/math/dag_check_nan.h @@ -35,8 +35,8 @@ __forceinline DAG_FINITE_MATH bool check_nan(double a) DAGOR_NOINLINE DAG_FINITE_MATH inline bool check_nan(float a) { return __builtin_isnan(a); } DAGOR_NOINLINE DAG_FINITE_MATH inline bool check_nan(double a) { return __builtin_isnan(a); } #endif -DAGOR_NOINLINE DAG_FINITE_MATH inline bool check_finite(float a) { return !__builtin_isinf(a); } -DAGOR_NOINLINE DAG_FINITE_MATH inline bool check_finite(double a) { return !__builtin_isinf(a); } +DAGOR_NOINLINE DAG_FINITE_MATH inline bool check_finite(float a) { return __builtin_isfinite(a); } +DAGOR_NOINLINE DAG_FINITE_MATH inline bool check_finite(double a) { return __builtin_isfinite(a); } #undef DAS_FINITE_MATH #if defined(__clang__) && !defined(__arm64__) #pragma float_control(pop) @@ -44,8 +44,8 @@ DAGOR_NOINLINE DAG_FINITE_MATH inline bool check_finite(double a) { return !__bu #else #include // msvc just does not optimize fast math -__forceinline bool check_finite(float a) { return !isinf(a); } +__forceinline bool check_finite(float a) { return isfinite(a); } __forceinline bool check_nan(float a) { return isnan(a); } -__forceinline bool check_finite(double a) { return !isinf(a); } +__forceinline bool check_finite(double a) { return isfinite(a); } __forceinline bool check_nan(double a) { return isnan(a); } #endif diff --git a/prog/dagorInclude/math/dag_hlsl_floatx.h b/prog/dagorInclude/math/dag_hlsl_floatx.h index 30aaaf8e8..5a147e893 100644 --- a/prog/dagorInclude/math/dag_hlsl_floatx.h +++ b/prog/dagorInclude/math/dag_hlsl_floatx.h @@ -89,7 +89,6 @@ struct Half public: INLINE Half() : c(0) {} INLINE Half(float ax) { set(ax); } - INLINE Half(const Half &a) : c(a.c) {} INLINE float get() const { return half_to_float(c); } INLINE void set(float v) { c = float_to_half(v); } @@ -107,7 +106,6 @@ struct Half2 set(0, ax); set(1, ay); } - INLINE Half2(const Half2 &a) : x(a.x), y(a.y) {} INLINE Half2(const Point2 &a) : Half2(a.x, a.y) {} INLINE float get(int i) const { return (&x)[i].get(); } @@ -128,7 +126,6 @@ struct Half3 set(1, ay); set(2, az); } - INLINE Half3(const Half3 &a) : x(a.x), y(a.y), z(a.z) {} INLINE Half3(const Point3 &a) : Half3(a.x, a.y, a.z) {} INLINE float get(int i) const { return (&x)[i].get(); } @@ -150,7 +147,6 @@ struct Half4 set(2, az); set(3, aw); } - INLINE Half4(const Half4 &a) : x(a.x), y(a.y), z(a.z), w(a.w) {} INLINE Half4(const Point4 &a) : Half4(a.x, a.y, a.z, a.w) {} INLINE float get(int i) const { return (&x)[i].get(); } diff --git a/prog/dagorInclude/osApiWrappers/dag_threads.h b/prog/dagorInclude/osApiWrappers/dag_threads.h index ce67e06aa..c0a9990d7 100644 --- a/prog/dagorInclude/osApiWrappers/dag_threads.h +++ b/prog/dagorInclude/osApiWrappers/dag_threads.h @@ -31,6 +31,11 @@ +#elif _TARGET_ANDROID +#define MAIN_THREAD_AFFINITY (1 << (cpujobs::get_core_count() - 1)) // Fast cores have higher numbers. +// Reserve two cores for main and Vulkan worker. +#define WORKER_THREADS_AFFINITY_MASK (cpujobs::get_core_count() >= 4 ? (1 << (cpujobs::get_core_count() - 2)) - 1 : ~0u) +#define NUM_WORKERS_DEFAULT (max(1, cpujobs::get_core_count() - 2)) #else #define MAIN_THREAD_AFFINITY \ (cpujobs::get_core_count() >= 3 ? 0x4 : 0x1) // Core2 - Not the Core0, favorite core of different tools, diff --git a/prog/dagorInclude/scene/dag_staticFxObjs.h b/prog/dagorInclude/scene/dag_staticFxObjs.h index 41b429376..5eee460d4 100644 --- a/prog/dagorInclude/scene/dag_staticFxObjs.h +++ b/prog/dagorInclude/scene/dag_staticFxObjs.h @@ -42,7 +42,7 @@ void clear(); void set_raytracer(IEffectRayTracer *); -void render(int render_type); +void render(int render_type, const TMatrix &view_itm); void update(real dt); void on_device_reset(); diff --git a/prog/dagorInclude/shaders/dag_dynSceneRes.h b/prog/dagorInclude/shaders/dag_dynSceneRes.h index 0c78950fa..7749fabca 100644 --- a/prog/dagorInclude/shaders/dag_dynSceneRes.h +++ b/prog/dagorInclude/shaders/dag_dynSceneRes.h @@ -108,7 +108,7 @@ decl_dclass_and_id(DynamicRenderableSceneResource, DObject, 0x7AE6FD70) dag::ConstSpan> getSkinMeshes() const { return skins; } dag::ConstSpan> getSkins() const { return skins; } dag::ConstSpan getSkinNodes() const { return skinNodes; } - Tab getNodesWithMaterials(dag::ConstSpan material_names) const; + dag::Vector getNodesWithMaterials(dag::ConstSpan material_names) const; int getSkinsCount() const { return skins.size(); } struct RigidObject; @@ -638,7 +638,7 @@ class DynamicRenderableSceneInstance void clipNodes(const Frustum &frustum, dag::Vector &node_list); - eastl::optional> getNodesWithMaterials(dag::ConstSpan material_names) const; + eastl::optional> getNodesWithMaterials(dag::ConstSpan material_names) const; protected: Ptr sceneResource; diff --git a/prog/dagorInclude/shaders/dag_rendInstRes.h b/prog/dagorInclude/shaders/dag_rendInstRes.h index c96d679e7..78006d1de 100644 --- a/prog/dagorInclude/shaders/dag_rendInstRes.h +++ b/prog/dagorInclude/shaders/dag_rendInstRes.h @@ -178,6 +178,7 @@ decl_dclass_and_id(RenderableInstanceLodsResource, DObject, 0x0F076634u) bool isBakedImpostor() const; BaseTexture *getPreshadowTexture() const; bool setImpostorVars(ShaderMaterial * mat, int buffer_offset) const; + bool setImpostorTransitionRange(ShaderMaterial * mat, float transition_lod_start, float transition_range) const; void prepareTextures(const char *name, uint32_t shadow_atlas_size, int shadow_atlas_mip_offset, int texture_format_flags); RenderableInstanceLodsResource *clone() const; diff --git a/prog/dagorInclude/shaders/dag_shaderMesh.h b/prog/dagorInclude/shaders/dag_shaderMesh.h index f1b699c17..663c33b54 100644 --- a/prog/dagorInclude/shaders/dag_shaderMesh.h +++ b/prog/dagorInclude/shaders/dag_shaderMesh.h @@ -39,8 +39,7 @@ class ShaderMeshDataSaveCB; enum { - VDATA_VB_SYSMEM = 0x01, - VDATA_IB_SYSMEM = 0x02, + VDATA_D3D_RESET_READY = 0x01, // vdata can survive d3d reset using reload or reset callback, buffers use SBCF_MAYBELOST VDATA_NO_IB = 0x08, VDATA_NO_VB = 0x10, VDATA_NO_IBVB = 0x18, @@ -119,10 +118,10 @@ class GlobalVertexData unsigned getLodIndex() const { return (cflags & VDATA_LOD_MASK) >> __bsf(VDATA_LOD_MASK); } // explicit constructor - void create(const char *name, unsigned vNum, unsigned vStride, unsigned idxPacked, unsigned idxSize, unsigned flags, IGenLoad *crd, + void initGvd(const char *name, unsigned vNum, unsigned vStride, unsigned idxPacked, unsigned idxSize, unsigned flags, IGenLoad *crd, Tab &tmp_decoder_stor); - void createMem(int vertNum, int vertStride, int idxSize, unsigned flags, const void *vb_data, const void *ib_data); + void initGvdMem(int vertNum, int vertStride, int idxSize, unsigned flags, const void *vb_data, const void *ib_data); // explicit destructor void free(); diff --git a/prog/dagorInclude/shaders/dag_shaderVarType.h b/prog/dagorInclude/shaders/dag_shaderVarType.h index 3ffb7f888..2d6582309 100644 --- a/prog/dagorInclude/shaders/dag_shaderVarType.h +++ b/prog/dagorInclude/shaders/dag_shaderVarType.h @@ -19,3 +19,13 @@ enum ShaderVarType SHVT_INT4, SHVT_FLOAT4X4, }; + +enum ShaderVarTextureType : int +{ + SHVT_TEX_UNKNOWN, + SHVT_TEX_2D, + SHVT_TEX_3D, + SHVT_TEX_CUBE, + SHVT_TEX_2D_ARRAY, + SHVT_TEX_CUBE_ARRAY, +}; diff --git a/prog/dagorInclude/streaming/dag_streamingBase.h b/prog/dagorInclude/streaming/dag_streamingBase.h index 9eb393812..aa5c4857a 100644 --- a/prog/dagorInclude/streaming/dag_streamingBase.h +++ b/prog/dagorInclude/streaming/dag_streamingBase.h @@ -173,12 +173,12 @@ class BaseStreamingSceneHolder : public IStreamingSceneStorage mainBindump = NULL; } - void waitForLoadingDone() + void waitForLoadingDone(const Point3 &view_pos) { if (!ssm) return; while (ssm->isLoading()) - act(::grs_cur_view.itm.getcol(3)); + act(view_pos); } // access to protected members diff --git a/prog/engine/_docs/render/build_docs.sh b/prog/engine/_docs/render/build_docs.sh index 88a947896..3e3ab20b3 100644 --- a/prog/engine/_docs/render/build_docs.sh +++ b/prog/engine/_docs/render/build_docs.sh @@ -1,3 +1,9 @@ +PATH=$PATH:$GDEVTOOL/python3 +PATH=$PATH:"/c/Program Files/doxygen/bin" + +source .venv/Scripts/activate +echo "virtualenv activated" + # We use precisely the same cmd as RTD will use on remote to avoid problems cd docs python3 -m sphinx -b html -d _build/doctrees . ../build diff --git a/prog/engine/_docs/render/docs/source/index/d3dAPI.rst b/prog/engine/_docs/render/docs/source/index/d3dAPI.rst index 7f37187d3..7ea24d1af 100644 --- a/prog/engine/_docs/render/docs/source/index/d3dAPI.rst +++ b/prog/engine/_docs/render/docs/source/index/d3dAPI.rst @@ -8,6 +8,7 @@ D3D API is our unified API which hides GAPI calls for different platforms. :caption: Contents: d3dAPI/Buffers + d3dAPI/RenderPass d3dAPI/other d3dAPI/constants d3dAPI/textures diff --git a/prog/engine/_docs/render/docs/source/index/d3dAPI/RenderPass.rst b/prog/engine/_docs/render/docs/source/index/d3dAPI/RenderPass.rst new file mode 100644 index 000000000..3e26ea8da --- /dev/null +++ b/prog/engine/_docs/render/docs/source/index/d3dAPI/RenderPass.rst @@ -0,0 +1,31 @@ +RenderPass +================================================= + +* See samples/testDrv3d/render_pass_tests.h for example usage + +Callable d3d:: methods + +.. doxygengroup:: RenderPassD3D + :project: d3dAPI + :members: + :undoc-members: + :content-only: + +================================================= + +Related structures + +.. doxygengroup:: RenderPassStructs + :project: d3dAPI + :members: + :undoc-members: + :content-only: + +================================================= + +Related constants + +.. doxygengroup:: RenderPassConsts + :project: d3dAPI + :members: + :content-only: diff --git a/prog/engine/_docs/render/setup.sh b/prog/engine/_docs/render/setup.sh index 80f3cc5f5..5ef51de45 100644 --- a/prog/engine/_docs/render/setup.sh +++ b/prog/engine/_docs/render/setup.sh @@ -1,3 +1,5 @@ +PATH=$PATH:$GDEVTOOL/python3 + python3 -m pip install -U virtualenv setuptools echo "virtualenv installed" python3 -m venv .venv diff --git a/prog/engine/anim/animStateHolder.cpp b/prog/engine/anim/animStateHolder.cpp index c4076ff91..a87e84ba7 100644 --- a/prog/engine/anim/animStateHolder.cpp +++ b/prog/engine/anim/animStateHolder.cpp @@ -115,16 +115,6 @@ real *AnimCommonStateHolder::getParamScalarPtr(int id) } -void AnimCommonStateHolder::setParam(int id, real value) -{ - G_ASSERT(id >= 0 && id < val.size()); - G_ASSERT(paramTypes[id] == PT_ScalarParam || paramTypes[id] == PT_TimeParam); - if (val[id].scalar != value) - val[id].flags |= PF_Changed; - val[id].scalar = value; -} - - int AnimCommonStateHolder::getTimeScaleParamId(int id) const { G_ASSERT(id >= 0 && id < val.size()); diff --git a/prog/engine/drv/drv3d_DX12/dx12.cpp b/prog/engine/drv/drv3d_DX12/dx12.cpp index 14e63ec71..91b214de6 100644 --- a/prog/engine/drv/drv3d_DX12/dx12.cpp +++ b/prog/engine/drv/drv3d_DX12/dx12.cpp @@ -4045,7 +4045,6 @@ bool validate_resource_description(const BufferResourceDescription &desc, const { bool hadError = validate_resource_description(static_cast(desc), what); - G_ASSERT_DO_AND_LOG(0 == (SBCF_SYSMEM & desc.cFlags), hadError = true, "DX12: cFlags of %s had incompatible SBCF_SYSMEM flag", what); G_ASSERT_DO_AND_LOG(0 == (SBCF_DYNAMIC & desc.cFlags), hadError = true, "DX12: cFlags of %s had incompatible SBCF_DYNAMIC flag", what); G_ASSERT_DO_AND_LOG(0 == (SBCF_FRAMEMEM & desc.cFlags), hadError = true, "DX12: cFlags of %s had incompatible SBCF_FRAMEMEM flag", diff --git a/prog/engine/drv/drv3d_DX12/pipeline.h b/prog/engine/drv/drv3d_DX12/pipeline.h index 902efb391..ee23c7f62 100644 --- a/prog/engine/drv/drv3d_DX12/pipeline.h +++ b/prog/engine/drv/drv3d_DX12/pipeline.h @@ -1464,6 +1464,14 @@ class PipelineManager : public backend::ShaderModuleManager, return; } + auto preloadedPipelineIt = eastl::find_if(target->preloadedGraphicsPipelines.begin(), target->preloadedGraphicsPipelines.end(), + [vsID, psID](const auto &pp) { return (pp.vsID == vsID) && (pp.psID == psID); }); + + if (preloadedPipelineIt != target->preloadedGraphicsPipelines.end()) + { + return; + } + auto pipeline = target->createGraphics(device, *pipelineCache, *frameBufferLayoutManager, target->getVertexShader(vsID), target->getPixelShader(psID), RecoverablePipelineCompileBehavior::REPORT_ERROR, true); @@ -1535,7 +1543,7 @@ class PipelineManager : public backend::ShaderModuleManager, inspector.pipelineCache = pipelineCache; inspector.frameBufferLayoutManager = fbs; setDumpOfGroup(group, dump); - inspect_scripted_shader_bin_dump(dump, inspector); + inspect_scripted_shader_bin_dump(dump, inspector); } template void removeShaderGroup(uint32_t group, ProgramRecorder &&prog, GraphicsProgramRecorder &&g_prog) @@ -1566,6 +1574,8 @@ class PipelineManager : public backend::ShaderModuleManager, logwarn("Graphics pipelines are preloaded, but never used"); } preloadedGraphicsPipelines.clear(); + computeProgramIndexToDumpShaderIndex[group].clear(); + pixelShaderComputeProgramIDMap[group].clear(); } void loadComputeShaderFromDump(ID3D12Device2 *device, PipelineCache &cache, ProgramID program, RecoverablePipelineCompileBehavior on_error, bool give_name) diff --git a/prog/engine/drv/drv3d_DX12/shader.h b/prog/engine/drv/drv3d_DX12/shader.h index 4a59352e6..0bc6fd320 100644 --- a/prog/engine/drv/drv3d_DX12/shader.h +++ b/prog/engine/drv/drv3d_DX12/shader.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -476,7 +477,7 @@ struct GraphicsProgramInstance } }; -template +template void inspect_scripted_shader_bin_dump(ScriptedShadersBinDumpOwner *dump, T inspector) { auto v2 = dump->getDumpV2(); @@ -486,10 +487,21 @@ void inspect_scripted_shader_bin_dump(ScriptedShadersBinDumpOwner *dump, T inspe } inspector.vertexShaderCount(v2->vprId.size()); inspector.pixelOrComputeShaderCount(v2->fshId.size()); + eastl::conditional_t>, int32_t> visited; for (auto &cls : v2->classes) { for (auto &prog : cls.shrefStorage) { + if constexpr (VisitOnce) + { + eastl::pair prIds(prog.vprId, prog.fshId); + if (visited.count(prIds) != 0) + { + continue; + } + visited.insert(prIds); + } + if (prog.vprId != 0xFFFF) { if (prog.fshId != 0xFFFF) diff --git a/prog/engine/drv/drv3d_commonCode/dxgi_utils.cpp b/prog/engine/drv/drv3d_commonCode/dxgi_utils.cpp index 37f78e071..86c4af9ae 100644 --- a/prog/engine/drv/drv3d_commonCode/dxgi_utils.cpp +++ b/prog/engine/drv/drv3d_commonCode/dxgi_utils.cpp @@ -1,3 +1,4 @@ +#undef _WIN32_WINNT #include "dxgi_utils.h" diff --git a/prog/engine/drv/drv3d_commonCode/genericSbufferImplementation.h b/prog/engine/drv/drv3d_commonCode/genericSbufferImplementation.h index 18d54d2e3..c5c29bcbe 100644 --- a/prog/engine/drv/drv3d_commonCode/genericSbufferImplementation.h +++ b/prog/engine/drv/drv3d_commonCode/genericSbufferImplementation.h @@ -578,7 +578,7 @@ class GenericSbufferImplementation final : public GenericBufferMemoryArchitectur if (T::IS_UMA) { // buffer that can be read should use memory with cache - if (cflags & (SBCF_CPU_ACCESS_READ | SBCF_USAGE_READ_BACK | SBCF_SYSMEM)) + if (cflags & (SBCF_CPU_ACCESS_READ | SBCF_USAGE_READ_BACK)) return T::SHARED_CACHED_MEMORY_CLASS; } diff --git a/prog/engine/drv/drv3d_vulkan/device_context.h b/prog/engine/drv/drv3d_vulkan/device_context.h index be246aa12..a0660c4ee 100644 --- a/prog/engine/drv/drv3d_vulkan/device_context.h +++ b/prog/engine/drv/drv3d_vulkan/device_context.h @@ -202,8 +202,7 @@ class ExecutionContext typedef ContextedPipelineBarrier PrimaryPipelineBarrier; typedef ContextedPipelineBarrier SecondaryPipelineBarrier; - void beginPassInternal(RenderPassClass *pass_class, const FramebufferInfo &pass_images, VulkanFramebufferHandle fb, VkRect2D area, - uint32_t clear_mode); + void beginPassInternal(RenderPassClass *pass_class, VulkanFramebufferHandle fb_handle, VkRect2D area); void allocFrameCore(); String getCurrentCmdCaller(); void reportMissingPipelineComponent(const char *component); @@ -219,6 +218,7 @@ class ExecutionContext void flushOrderedBufferUploads(VulkanCommandBufferHandle cmd); VulkanCommandBufferHandle flushBufferToHostFlushes(VulkanCommandBufferHandle cmd); void flushImageUploads(); + void flushImageUploadsIter(uint32_t start, uint32_t end); void flushUnorderedImageColorClears(); void flushUnorderedImageDepthStencilClears(); void flushUnorderedImageCopies(); @@ -271,8 +271,6 @@ class ExecutionContext uint32_t beginVertexUserData(uint32_t stride); void endVertexUserData(uint32_t stride); void invalidateActiveGraphicsPipeline(); - bool isPartOfFramebuffer(Image *image); - bool isPartOfFramebuffer(Image *image, ValueRange mip_range, ValueRange array_range); void startPreRotate(uint32_t binding_slot); void holdPreRotateStateForOneFrame(); Image *getSwapchainColorImage(); @@ -344,8 +342,8 @@ class ExecutionContext void setGraphicsPipeline(ProgramID program); bool isInMultisampledFBPass(); void syncConstDepthReadWithInternalStore(); - void ensureStateForDepthAttachment(const RenderPassClass::Identifier &pass, const FramebufferInfo &fbi, bool ro); - void ensureStateForColorAttachments(uint8_t usage_mask, const FramebufferInfo &fbi); + void ensureStateForDepthAttachment(); + void ensureStateForColorAttachments(); void endPass(const char *why); void endNativePass(); void beginNativePass(); diff --git a/prog/engine/drv/drv3d_vulkan/device_context/base_context.cpp b/prog/engine/drv/drv3d_vulkan/device_context/base_context.cpp index 867b731e8..70f6e151c 100644 --- a/prog/engine/drv/drv3d_vulkan/device_context/base_context.cpp +++ b/prog/engine/drv/drv3d_vulkan/device_context/base_context.cpp @@ -53,38 +53,6 @@ void ExecutionContext::invalidateActiveGraphicsPipeline() back.executionState.set(1); } -bool ExecutionContext::isPartOfFramebuffer(Image *image) -{ - if (getFramebufferState().frontendFrameBufferInfo.depthStencilAttachment.image == image) - return true; - for (uint32_t i = 0; i < Driver3dRenderTarget::MAX_SIMRT; ++i) - if (getFramebufferState().frontendFrameBufferInfo.colorAttachments[i].image == image) - return true; - return false; -} - -bool ExecutionContext::isPartOfFramebuffer(Image *image, ValueRange mip_range, ValueRange array_range) -{ - if (getFramebufferState().frontendFrameBufferInfo.depthStencilAttachment.image == image) - { - auto mipIndex = getFramebufferState().frontendFrameBufferInfo.depthStencilAttachment.view.getMipBase(); - auto arrayIndex = getFramebufferState().frontendFrameBufferInfo.depthStencilAttachment.view.getArrayBase(); - if (mip_range.isInside(mipIndex) && array_range.isInside(arrayIndex)) - return true; - } - for (uint32_t i = 0; i < Driver3dRenderTarget::MAX_SIMRT; ++i) - { - if (getFramebufferState().frontendFrameBufferInfo.colorAttachments[i].image == image) - { - auto mipIndex = getFramebufferState().frontendFrameBufferInfo.colorAttachments[i].view.getMipBase(); - auto arrayIndex = getFramebufferState().frontendFrameBufferInfo.colorAttachments[i].view.getArrayBase(); - if (mip_range.isInside(mipIndex) && array_range.isInside(arrayIndex)) - return true; - } - } - return false; -} - Image *ExecutionContext::getSwapchainColorImage() { return swapchain.getColorImage(); } void ExecutionContext::holdPreRotateStateForOneFrame() { swapchain.holdPreRotatedStateForOneFrame(); } diff --git a/prog/engine/drv/drv3d_vulkan/device_context/execution_context.cpp b/prog/engine/drv/drv3d_vulkan/device_context/execution_context.cpp index cb452f128..59e87f6af 100644 --- a/prog/engine/drv/drv3d_vulkan/device_context/execution_context.cpp +++ b/prog/engine/drv/drv3d_vulkan/device_context/execution_context.cpp @@ -39,18 +39,22 @@ void ExecutionContext::allocFrameCore() void ExecutionContext::flushUnorderedImageColorClears() { + TIME_PROFILE(vulkan_flush_unordered_rt_clears); for (const CmdClearColorTexture &t : data.unorderedImageColorClears) clearColorImage(t.image, t.area, t.value); } void ExecutionContext::flushUnorderedImageDepthStencilClears() { + TIME_PROFILE(vulkan_flush_unordered_ds_clears); for (const CmdClearDepthStencilTexture &t : data.unorderedImageDepthStencilClears) clearDepthStencilImage(t.image, t.area, t.value); } void ExecutionContext::flushUnorderedImageCopies() { + TIME_PROFILE(vulkan_flush_unordered_image_copies); + for (CmdCopyImage &i : data.unorderedImageCopies) copyImage(i.src, i.dst, i.srcMip, i.dstMip, i.mipCount, i.regionCount, i.regionIndex); } @@ -59,6 +63,7 @@ void ExecutionContext::prepareFrameCore() { G_ASSERTF(is_null(frameCore), "vulkan: execution context already prepared for command execution"); allocFrameCore(); + TIME_PROFILE(vulkan_pre_frame_core); // for optional preFrame back.contextState.cmdListsToSubmit.push_back(VulkanCommandBufferHandle{}); back.contextState.bindlessManagerBackend.advance(); @@ -77,6 +82,8 @@ void ExecutionContext::processFillEmptySubresources() if (data.imagesToFillEmptySubresources.empty()) return; + TIME_PROFILE(vulkan_fill_empty_images); + Buffer *zeroBuf = nullptr; Tab copies; @@ -221,11 +228,23 @@ VulkanCommandBufferHandle ExecutionContext::flushBufferDownloads(VulkanCommandBu return cmd_b; } +void ExecutionContext::flushImageUploadsIter(uint32_t start, uint32_t end) +{ + back.syncTrack.completeNeeded(frameCore, vkDev); + for (uint32_t i = start; i < end; ++i) + { + ImageCopyInfo &upload = data.imageUploads[i]; + VULKAN_LOG_CALL(vkDev.vkCmdCopyBufferToImage(frameCore, upload.buffer->getHandle(), upload.image->getHandle(), + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, upload.copyCount, data.imageUploadCopies.data() + upload.copyIndex)); + } +} + void ExecutionContext::flushImageUploads() { if (data.imageUploads.empty()) return; + TIME_PROFILE(vulkan_flush_image_uploads); // access tracking for (auto &&upload : data.imageUploads) { @@ -238,27 +257,43 @@ void ExecutionContext::flushImageUploads() uint32_t sz = upload.image->getFormat().calculateImageSize(iter->imageExtent.width, iter->imageExtent.height, iter->imageExtent.depth, 1) * iter->imageSubresource.layerCount; - back.syncTrack.addImageAccess({VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT}, upload.image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - {iter->imageSubresource.mipLevel, 1, iter->imageSubresource.baseArrayLayer, iter->imageSubresource.layerCount}); back.syncTrack.addBufferAccess({VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_READ_BIT}, upload.buffer, {iter->bufferOffset, sz}); } + } - back.syncTrack.completeNeeded(frameCore, vkDev); - VULKAN_LOG_CALL(vkDev.vkCmdCopyBufferToImage(frameCore, upload.buffer->getHandle(), upload.image->getHandle(), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, upload.copyCount, data.imageUploadCopies.data() + upload.copyIndex)); + back.syncTrack.completeNeeded(frameCore, vkDev); - if (!upload.image->isGPUWritable() && (upload.image->getUsage() & VK_IMAGE_USAGE_SAMPLED_BIT)) + uint32_t mergedRangeStart = 0; + for (uint32_t i = 0; i < data.imageUploads.size(); ++i) + { + ImageCopyInfo &upload = data.imageUploads[i]; + + if (upload.image->hasLastSyncOpIndex()) { - upload.image->layout.roSealTargetLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - upload.image->requestRoSeal(data.id); + flushImageUploadsIter(mergedRangeStart, i); + mergedRangeStart = i; + } + + for (auto iter = begin(data.imageUploadCopies) + upload.copyIndex, + ed = begin(data.imageUploadCopies) + upload.copyIndex + upload.copyCount; + iter != ed; ++iter) + { + back.syncTrack.addImageAccess({VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT}, upload.image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + {iter->imageSubresource.mipLevel, 1, iter->imageSubresource.baseArrayLayer, iter->imageSubresource.layerCount}); } } + flushImageUploadsIter(mergedRangeStart, data.imageUploads.size()); bool anyBindless = false; for (auto &&upload : data.imageUploads) { + if (!upload.image->isGPUWritable() && (upload.image->getUsage() & VK_IMAGE_USAGE_SAMPLED_BIT)) + { + upload.image->layout.roSealTargetLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + upload.image->requestRoSeal(data.id); + } // we can't know is it readed or not, so assume readed if (upload.image->isUsedInBindless()) { @@ -275,6 +310,8 @@ void ExecutionContext::flushOrderedBufferUploads(VulkanCommandBufferHandle cmd_b if (data.orderedBufferUploads.empty()) return; + TIME_PROFILE(vulkan_flush_ordered_buffer_uploads); + for (auto &&upload : data.orderedBufferUploads) { upload.src->optionallyActivateRoSeal(data.id); @@ -302,6 +339,8 @@ void ExecutionContext::flushBufferUploads(VulkanCommandBufferHandle cmd_b) if (data.bufferUploads.empty()) return; + TIME_PROFILE(vulkan_flush_buffer_uploads); + if (device.getFeatures().test(DeviceFeaturesConfig::OPTIMIZE_BUFFER_UPLOADS)) BufferCopyInfo::optimizeBufferCopies(data.bufferUploads, data.bufferUploadCopies); @@ -794,10 +833,7 @@ void ExecutionContext::buildAccelerationStructure(VkAccelerationStructureTypeKHR // set seal for safety here, to not conflict with followup writes without reads dst->requestRoSeal(data.id); - ExecutionSyncTracker::LogicAddress readLAddr; - readLAddr.merge(ExecutionSyncTracker::LogicAddress::forAccelerationStructureOnExecStage(STAGE_CS, RegisterType::T)); - readLAddr.merge(ExecutionSyncTracker::LogicAddress::forAccelerationStructureOnExecStage(STAGE_RAYTRACE, RegisterType::T)); - back.syncTrack.addAccelerationStructureAccess(readLAddr, dst); + back.syncTrack.addAccelerationStructureAccess(ExecutionSyncTracker::LogicAddress::forBLASIndirectReads(), dst); } } @@ -1106,6 +1142,8 @@ void ExecutionContext::clearView(int what) back.executionState.set(0); applyStateChanges(); invalidateActiveGraphicsPipeline(); + + getFramebufferState().clearMode = 0; } void ExecutionContext::clearColorImage(Image *image, const VkImageSubresourceRange &area, const VkClearColorValue &value) @@ -1539,14 +1577,10 @@ void ExecutionContext::trackIndirectArgAccesses(BufferRef buffer, uint32_t offse void ExecutionContext::trackBindlessRead(Image *img) { - ExecutionSyncTracker::LogicAddress combinedStageAccess{}; - combinedStageAccess.merge(ExecutionSyncTracker::LogicAddress::forImageOnExecStage(STAGE_VS, RegisterType::T)); - combinedStageAccess.merge(ExecutionSyncTracker::LogicAddress::forImageOnExecStage(STAGE_PS, RegisterType::T)); - combinedStageAccess.merge(ExecutionSyncTracker::LogicAddress::forImageOnExecStage(STAGE_CS, RegisterType::T)); - VkImageLayout srvLayout = img->getUsage() & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - back.syncTrack.addImageAccess(combinedStageAccess, img, srvLayout, {0, img->getMipLevels(), 0, img->getArrayLayers()}); + back.syncTrack.addImageAccess(ExecutionSyncTracker::LogicAddress::forImageBindlessRead(), img, srvLayout, + {0, img->getMipLevels(), 0, img->getArrayLayers()}); } \ No newline at end of file diff --git a/prog/engine/drv/drv3d_vulkan/device_context/render_pass.cpp b/prog/engine/drv/drv3d_vulkan/device_context/render_pass.cpp index b06dc1434..307321e80 100644 --- a/prog/engine/drv/drv3d_vulkan/device_context/render_pass.cpp +++ b/prog/engine/drv/drv3d_vulkan/device_context/render_pass.cpp @@ -18,47 +18,47 @@ void ExecutionContext::syncConstDepthReadWithInternalStore() barrier.submit(frameCore); } -void ExecutionContext::ensureStateForColorAttachments(uint8_t usage_mask, const FramebufferInfo &fbi) +void ExecutionContext::ensureStateForColorAttachments() { + uint8_t usageMask = getFramebufferState().renderPassClass.colorTargetMask; for (int i = 0; i < Driver3dRenderTarget::MAX_SIMRT; ++i) { - if (!(usage_mask & (1 << i))) + if (!(usageMask & (1 << i))) continue; - - const FramebufferInfo::AttachmentInfo &colorAtt = fbi.colorAttachments[i]; - colorAtt.image->checkDead(); + const RenderPassClass::FramebufferDescription::AttachmentInfo &colorAtt = + getFramebufferState().frameBufferInfo.colorAttachments[i]; + G_ASSERTF(colorAtt.img, "vulkan: no color attachment specified for render pass class with used attachment %u", i); + colorAtt.img->checkDead(); back.syncTrack.addImageAccess( - ExecutionSyncTracker::LogicAddress::forAttachmentWithLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), colorAtt.image, + ExecutionSyncTracker::LogicAddress::forAttachmentWithLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), colorAtt.img, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, {colorAtt.view.getMipBase(), colorAtt.view.getMipCount(), colorAtt.view.getArrayBase(), colorAtt.view.getArrayCount()}); } } -void ExecutionContext::ensureStateForDepthAttachment(const RenderPassClass::Identifier &pass, const FramebufferInfo &fbi, bool ro) +void ExecutionContext::ensureStateForDepthAttachment() { - G_ASSERTF(pass.depthState == fbi.depthStencilMask, - "Renderpass Identifier depthState and frontend framebuffer depthStencil mask must be the same here (%d vs %d)!", pass.depthState, - fbi.depthStencilMask); - - if (pass.depthState != RenderPassClass::Identifier::NO_DEPTH) + FramebufferState &fbs = getFramebufferState(); + bool ro = fbs.renderPassClass.hasRoDepth(); + if (fbs.renderPassClass.hasDepth()) { - fbi.depthStencilAttachment.image->checkDead(); + RenderPassClass::FramebufferDescription::AttachmentInfo &dsai = fbs.frameBufferInfo.depthStencilAttachment; + G_ASSERTF(dsai.img, "vulkan: no depth attachment specified for render pass class with enabled depth"); + dsai.img->checkDead(); - G_ASSERTF(pass.colorSamples[0] == fbi.depthStencilAttachment.image->getSampleCount(), - "Renderpass attachments sample count doesn't match target image sample count (%d vs %d)!", pass.colorSamples[0], - fbi.depthStencilAttachment.image->getSampleCount()); + G_ASSERTF(fbs.renderPassClass.colorSamples[0] == dsai.img->getSampleCount(), + "Renderpass attachments sample count doesn't match target image sample count (%d vs %d)!", fbs.renderPassClass.colorSamples[0], + dsai.img->getSampleCount()); + + ImageViewState ivs = dsai.view; VkImageLayout dsLayout = ro ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - back.syncTrack.addImageAccess(ExecutionSyncTracker::LogicAddress::forAttachmentWithLayout(dsLayout), - fbi.depthStencilAttachment.image, dsLayout, - {fbi.depthStencilAttachment.view.getMipBase(), fbi.depthStencilAttachment.view.getMipCount(), - fbi.depthStencilAttachment.view.getArrayBase(), fbi.depthStencilAttachment.view.getArrayCount()}); - - back.contextState.stageState[STAGE_PS].syncDepthROStateInT(fbi.depthStencilAttachment.image, - fbi.depthStencilAttachment.view.getMipBase(), fbi.depthStencilAttachment.view.getArrayBase(), ro); - back.contextState.stageState[STAGE_VS].syncDepthROStateInT(fbi.depthStencilAttachment.image, - fbi.depthStencilAttachment.view.getMipBase(), fbi.depthStencilAttachment.view.getArrayBase(), ro); + back.syncTrack.addImageAccess(ExecutionSyncTracker::LogicAddress::forAttachmentWithLayout(dsLayout), dsai.img, dsLayout, + {ivs.getMipBase(), ivs.getMipCount(), ivs.getArrayBase(), ivs.getArrayCount()}); + + back.contextState.stageState[STAGE_PS].syncDepthROStateInT(dsai.img, ivs.getMipBase(), ivs.getArrayBase(), ro); + back.contextState.stageState[STAGE_VS].syncDepthROStateInT(dsai.img, ivs.getMipBase(), ivs.getArrayBase(), ro); } else { @@ -67,30 +67,26 @@ void ExecutionContext::ensureStateForDepthAttachment(const RenderPassClass::Iden } } -void ExecutionContext::beginPassInternal(RenderPassClass *pass_class, const FramebufferInfo &pass_images, VulkanFramebufferHandle fb, - VkRect2D area, uint32_t clear_mode) +void ExecutionContext::beginPassInternal(RenderPassClass *pass_class, VulkanFramebufferHandle fb_handle, VkRect2D area) { // input verify G_ASSERT(area.offset.x >= 0); G_ASSERT(area.offset.y >= 0); // shortcuts - const RenderPassClass::Identifier &passIdent = pass_class->getIdentifier(); - bool constDS = pass_images.hasConstDepthStencilAttachment(); FramebufferState &fbs = getFramebufferState(); + const RenderPassClass::Identifier &passIdent = fbs.renderPassClass; // prepare attachemnts states if (passIdent.colorTargetMask) - ensureStateForColorAttachments(passIdent.colorTargetMask, pass_images); + ensureStateForColorAttachments(); StaticTab clearValues; - if (clear_mode & ~CLEAR_DISCARD) - { + if (fbs.clearMode & ~CLEAR_DISCARD) clearValues = pass_class->constructClearValueSet(fbs.colorClearValue, fbs.depthStencilClearValue); - } // MSAA split check, on TBDR this results in garbadge on screen - if (!pass_class->verifyPass(clear_mode)) + if (!pass_class->verifyPass(fbs.clearMode)) { generateFaultReport(); fatal("vulkan: MSAA pass was wrongly splitted around caller %s", getCurrentCmdCaller()); @@ -101,29 +97,26 @@ void ExecutionContext::beginPassInternal(RenderPassClass *pass_class, const Fram VkRenderPassAttachmentBeginInfoKHR rpabi = {VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR, nullptr}; if (device.hasImagelessFramebuffer()) { - auto attachments = passIdent.squash(array_size(fbs.colorViews), fbs.colorViews, fbs.depthStencilView, - [](const VulkanImageViewHandle &attachment) { return attachment.value; }); + auto attachments = passIdent.squash(array_size(fbs.frameBufferInfo.colorAttachments), + fbs.frameBufferInfo.colorAttachments, fbs.frameBufferInfo.depthStencilAttachment, + [](const RenderPassClass::FramebufferDescription::AttachmentInfo &attachment) { return attachment.viewHandle.value; }); rpabi.attachmentCount = attachments.size(); rpabi.pAttachments = attachments.data(); chain_structs(rpbi, rpabi); } #endif - rpbi.renderPass = pass_class->getPass(vkDev, clear_mode); - rpbi.framebuffer = fb; + rpbi.renderPass = pass_class->getPass(vkDev, fbs.clearMode); + rpbi.framebuffer = fb_handle; rpbi.renderArea = area; rpbi.clearValueCount = clearValues.size(); rpbi.pClearValues = clearValues.data(); VULKAN_LOG_CALL(vkDev.vkCmdBeginRenderPass(frameCore, &rpbi, VK_SUBPASS_CONTENTS_INLINE)); // save resulting state - - fbs.viewRect = area; - fbs.clearMode = clear_mode; - fbs.roDepth = constDS; - + back.executionState.set(area); back.executionState.set(pass_class); - back.executionState.set(fb); + back.executionState.set(fb_handle); back.executionState.set(InPassStateFieldType::NORMAL_PASS); invalidateActiveGraphicsPipeline(); @@ -141,7 +134,10 @@ void ExecutionContext::endPass(const char *why) { // when no-store exts are unavailable, we should sync const DS read with "fake" write // its happens between pass end and external dependency barrier - if (getFramebufferState().roDepth && !get_device().hasAttachmentNoStoreOp()) + if (back.executionState.getRO() + .getIdentifier() + .hasRoDepth() && + !get_device().hasAttachmentNoStoreOp()) syncConstDepthReadWithInternalStore(); VULKAN_LOG_CALL(vkDev.vkCmdEndRenderPass(frameCore)); performSyncAtRenderPassEnd(); diff --git a/prog/engine/drv/drv3d_vulkan/device_resource.h b/prog/engine/drv/drv3d_vulkan/device_resource.h index e56f2eeda..d7d7ed7b0 100644 --- a/prog/engine/drv/drv3d_vulkan/device_resource.h +++ b/prog/engine/drv/drv3d_vulkan/device_resource.h @@ -280,6 +280,7 @@ class ResourceExecutionSyncableExtend void clearLastSyncOp() { lastSyncOp = invalid_sync_op; } void setLastSyncOpIndex(size_t v) { lastSyncOp = v; } size_t getLastSyncOpIndex() { return lastSyncOp; } + bool hasLastSyncOpIndex() { return lastSyncOp != invalid_sync_op; } void requestRoSeal(size_t gpu_work_id) { diff --git a/prog/engine/drv/drv3d_vulkan/execution_sync.cpp b/prog/engine/drv/drv3d_vulkan/execution_sync.cpp index f656362a2..1e662893d 100644 --- a/prog/engine/drv/drv3d_vulkan/execution_sync.cpp +++ b/prog/engine/drv/drv3d_vulkan/execution_sync.cpp @@ -256,11 +256,20 @@ bool mergeToLastSyncOp(OpsArrayType &ops, Resource *obj, ExecutionSyncTracker::L if (lastSyncOp < ops.arr.size()) { auto &lop = ops.arr[lastSyncOp]; - if (lop.area.mergable(area) && !lop.laddr.mergeConflicting(laddr) && lop.mergeCheck(area, opt)) + bool areaMergable = lop.area.mergable(area) && lop.mergeCheck(area, opt); + if (areaMergable) { - lop.area.merge(area); - lop.laddr.merge(laddr); - return true; + // primary check for conflicting logic address + bool laddrMergable = !lop.laddr.mergeConflicting(laddr); + // try again to see if we using same address but non intersecting yet connected(mergable) areas + if (!laddrMergable) + laddrMergable = !lop.area.intersects(area) && lop.laddr.equal(laddr); + if (laddrMergable) + { + lop.area.merge(area); + lop.laddr.merge(laddr); + return true; + } } } obj->setLastSyncOpIndex(ops.arr.size()); diff --git a/prog/engine/drv/drv3d_vulkan/execution_sync.h b/prog/engine/drv/drv3d_vulkan/execution_sync.h index 125ae6290..8de65287d 100644 --- a/prog/engine/drv/drv3d_vulkan/execution_sync.h +++ b/prog/engine/drv/drv3d_vulkan/execution_sync.h @@ -39,11 +39,14 @@ class ExecutionSyncTracker stage |= v.stage; access |= v.access; } + bool equal(const LogicAddress &v) { return stage == v.stage && access == v.access; } static LogicAddress forBufferOnExecStage(ShaderStage stage, RegisterType reg_type); static LogicAddress forAttachmentWithLayout(VkImageLayout layout); static LogicAddress forImageOnExecStage(ShaderStage stage, RegisterType reg_type); + static LogicAddress forImageBindlessRead(); static LogicAddress forAccelerationStructureOnExecStage(ShaderStage stage, RegisterType reg_type); + static LogicAddress forBLASIndirectReads(); static void setAttachmentNoStoreSupport(bool supported); }; diff --git a/prog/engine/drv/drv3d_vulkan/execution_sync_laddr.cpp b/prog/engine/drv/drv3d_vulkan/execution_sync_laddr.cpp index cc8fe633a..0fac9520e 100644 --- a/prog/engine/drv/drv3d_vulkan/execution_sync_laddr.cpp +++ b/prog/engine/drv/drv3d_vulkan/execution_sync_laddr.cpp @@ -27,19 +27,15 @@ bool ExecutionSyncTracker::LogicAddress::conflicting(const LogicAddress &cmp) co bool ExecutionSyncTracker::LogicAddress::mergeConflicting(const LogicAddress &cmp) const { - // merge is ok if - // -both is write + // merge is ok at logic address if // -both is read // -both is RW at same stage & access bool bothWrite = isWrite() && cmp.isWrite(); bool bothRead = isRead() && cmp.isRead(); bool bothRW = bothRead && bothWrite; bool anyWrite = isWrite() || cmp.isWrite(); - bool anyRead = isRead() || cmp.isRead(); if (bothRW) return cmp.stage != stage || cmp.access != access; - else if (bothWrite && !anyRead) - return false; else if (bothRead && !anyWrite) return false; else @@ -129,6 +125,12 @@ ExecutionSyncTracker::LogicAddress ExecutionSyncTracker::LogicAddress::forImageO return {stageForResourceAtExecStage[stage], accessForImageAtRegisterType[reg_type]}; } +ExecutionSyncTracker::LogicAddress ExecutionSyncTracker::LogicAddress::forImageBindlessRead() +{ + return {VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, + VK_ACCESS_SHADER_READ_BIT}; +} + static VkAccessFlags accessForAccelerationStructureAtRegisterType[RegisterType::COUNT] = { VK_ACCESS_SHADER_READ_BIT, // T VK_PIPELINE_STAGE_NONE, // U @@ -142,3 +144,16 @@ ExecutionSyncTracker::LogicAddress ExecutionSyncTracker::LogicAddress::forAccele G_ASSERTF(reg_type < RegisterType::COUNT, "vulkan: unknown register type %u", reg_type); return {stageForResourceAtExecStage[stage], accessForAccelerationStructureAtRegisterType[reg_type]}; } + +ExecutionSyncTracker::LogicAddress ExecutionSyncTracker::LogicAddress::forBLASIndirectReads() +{ + return + { + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT +#if D3D_HAS_RAY_TRACING + | VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR +#endif + , + VK_ACCESS_SHADER_READ_BIT + }; +} diff --git a/prog/engine/drv/drv3d_vulkan/graphics_state.cpp b/prog/engine/drv/drv3d_vulkan/graphics_state.cpp index 37c818432..dfe335b74 100644 --- a/prog/engine/drv/drv3d_vulkan/graphics_state.cpp +++ b/prog/engine/drv/drv3d_vulkan/graphics_state.cpp @@ -13,6 +13,7 @@ void BackGraphicsState::reset(ExecutionStateStorage &) { TrackedState::reset(); pipelineState.reset(); + framebufferState.reset(); } } // namespace drv3d_vulkan diff --git a/prog/engine/drv/drv3d_vulkan/graphics_state.h b/prog/engine/drv/drv3d_vulkan/graphics_state.h index f6d731d33..2957055e4 100644 --- a/prog/engine/drv/drv3d_vulkan/graphics_state.h +++ b/prog/engine/drv/drv3d_vulkan/graphics_state.h @@ -56,74 +56,19 @@ inline RegionDifference classify_viewport_diff(const ViewportState &from, const } struct FramebufferState { - FramebufferInfo frontendFrameBufferInfo = {}; RenderPassClass::Identifier renderPassClass = {}; RenderPassClass::FramebufferDescription frameBufferInfo = {}; - VkRect2D viewRect = {}; VkClearColorValue colorClearValue[Driver3dRenderTarget::MAX_SIMRT] = {}; VkClearDepthStencilValue depthStencilClearValue = {}; - VulkanImageViewHandle colorViews[Driver3dRenderTarget::MAX_SIMRT] = {}; - VulkanImageViewHandle depthStencilView = {}; uint32_t clearMode = 0; - bool roDepth = false; - void clear() + void reset() { - frontendFrameBufferInfo = FramebufferInfo{}; renderPassClass.clear(); frameBufferInfo.clear(); - memset(&viewRect, 0, sizeof(viewRect)); memset(&colorClearValue, 0, sizeof(colorClearValue)); memset(&depthStencilClearValue, 0, sizeof(depthStencilClearValue)); - } - - void bindColorTarget(uint32_t index, Image *image, VkSampleCountFlagBits samples, ImageViewState ivs, VulkanImageViewHandle view) - { - frontendFrameBufferInfo.setColorAttachment(index, image, ivs); - renderPassClass.colorTargetMask |= 1 << index; - renderPassClass.colorFormats[index] = ivs.getFormat(); - renderPassClass.colorSamples[index] = samples; - frameBufferInfo.colorAttachments[index] = RenderPassClass::FramebufferDescription::AttachmentInfo(image, view, ivs); - colorViews[index] = view; - } - - void clearColorTarget(uint32_t index) - { - frontendFrameBufferInfo.clearColorAttachment(index); - renderPassClass.colorTargetMask &= ~(1 << index); - renderPassClass.colorFormats[index] = FormatStore(0); - frameBufferInfo.colorAttachments[index] = RenderPassClass::FramebufferDescription::AttachmentInfo(); - colorViews[index] = VulkanNullHandle(); - } - - void setDepthStencilTargetReadOnly(bool read_only) - { - frontendFrameBufferInfo.setDepthStencilAttachmentReadOnly(read_only); - - if (renderPassClass.depthState != RenderPassClass::Identifier::NO_DEPTH) - { - renderPassClass.depthState = read_only ? RenderPassClass::Identifier::RO_DEPTH : RenderPassClass::Identifier::RW_DEPTH; - } - } - - void bindDepthStencilTarget(Image *image, VkSampleCountFlagBits samples, ImageViewState ivs, VulkanImageViewHandle view, - bool read_only) - { - frontendFrameBufferInfo.setDepthStencilAttachment(image, ivs, read_only); - renderPassClass.depthState = read_only ? RenderPassClass::Identifier::RO_DEPTH : RenderPassClass::Identifier::RW_DEPTH; - renderPassClass.depthStencilFormat = ivs.getFormat(); - renderPassClass.colorSamples[0] = samples; - frameBufferInfo.depthStencilAttachment = RenderPassClass::FramebufferDescription::AttachmentInfo(image, view, ivs); - depthStencilView = view; - } - - void clearDepthStencilTarget() - { - frontendFrameBufferInfo.clearDepthStencilAttachment(); - renderPassClass.depthState = RenderPassClass::Identifier::NO_DEPTH; - renderPassClass.depthStencilFormat = FormatStore(0); - frameBufferInfo.depthStencilAttachment = RenderPassClass::FramebufferDescription::AttachmentInfo(); - depthStencilView = VulkanNullHandle(); + clearMode = 0; } }; diff --git a/prog/engine/drv/drv3d_vulkan/graphics_state2.h b/prog/engine/drv/drv3d_vulkan/graphics_state2.h index 4fd752790..57714e4de 100644 --- a/prog/engine/drv/drv3d_vulkan/graphics_state2.h +++ b/prog/engine/drv/drv3d_vulkan/graphics_state2.h @@ -59,6 +59,7 @@ struct BackGraphicsStateStorage StateFieldGraphicsRenderPassEarlyScopeOpener renderPassEarlyOpener; StateFieldRenderPassResource nativeRenderPass; StateFieldGraphicsQueryScopeOpener queryOpener; + StateFieldGraphicsRenderPassArea renderPassArea; BackDynamicGraphicsState dynamic; @@ -84,7 +85,8 @@ class BackGraphicsState : public TrackedStategetMipExtents2D(colorAttachments[0].view.getMipBase()); - else if (auto mask = colorAttachmentMask >> 1) - for (int i = 1; i < array_size(colorAttachments); ++i, mask >>= 1) - if (0 != (mask & 1)) - return colorAttachments[i].image->getMipExtents2D(colorAttachments[i].view.getMipBase()); - - if (depthStencilMask && depthStencilAttachment.image) - return depthStencilAttachment.image->getMipExtents2D(depthStencilAttachment.view.getMipBase()); + if (colorAttachments[0].img) + return colorAttachments[0].img->getMipExtents2D(colorAttachments[0].view.getMipBase()); + + for (int i = 1; i < array_size(colorAttachments); ++i) + if (colorAttachments[i].img) + return colorAttachments[i].img->getMipExtents2D(colorAttachments[i].view.getMipBase()); + + if (depthStencilAttachment.img) + return depthStencilAttachment.img->getMipExtents2D(depthStencilAttachment.view.getMipBase()); + return def; } @@ -37,7 +38,10 @@ VulkanRenderPassHandle RenderPassClass::getPass(VulkanDevice &device, int clear_ } VulkanFramebufferHandle RenderPassClass::getFrameBuffer(VulkanDevice &device, const FramebufferDescription &info) { - auto ref = eastl::find_if(begin(frameBuffers), end(frameBuffers), [&](const FrameBuffer &fb) { return fb.desc == info; }); + bool imageless = get_device().hasImagelessFramebuffer(); + auto ref = eastl::find_if(begin(frameBuffers), end(frameBuffers), [&info, &imageless](const FrameBuffer &fb) { + return imageless ? fb.desc.compatibleToImageless(info) : fb.desc.compatibleTo(info); + }); if (ref != end(frameBuffers)) return ref->frameBuffer; @@ -375,7 +379,7 @@ VulkanFramebufferHandle RenderPassClass::compileFrameBuffer(VulkanDevice &device info.depthStencilAttachment, [&minLayers](const FramebufferDescription::AttachmentInfo &attachment) { PASS_BUILD_INFO("vulkan: new FB: attachment view %p", generalize(attachment.imageView)); minLayers = min(attachment.imageInfo.layers, minLayers); - return attachment.imageView; + return attachment.viewHandle; }); fbci.attachmentCount = attachmentSet.size(); @@ -417,13 +421,17 @@ void RenderPassManager::unloadAll(VulkanDevice &device) passClasses.clear(); } -RenderPassClass::FramebufferDescription::AttachmentInfo::AttachmentInfo() : imageView{}, imageInfo{} {} +RenderPassClass::FramebufferDescription::AttachmentInfo::AttachmentInfo() : viewHandle{}, imageInfo{}, img{nullptr}, usage(), flags() +{} -RenderPassClass::FramebufferDescription::AttachmentInfo::AttachmentInfo(const Image *image, VulkanImageViewHandle view, +RenderPassClass::FramebufferDescription::AttachmentInfo::AttachmentInfo(Image *image, VulkanImageViewHandle view_handle, ImageViewState ivs) : - imageView{}, imageInfo{} + imageInfo{}, usage(), flags() { + img = image; + view = ivs; imageInfo.layers = ivs.isArray ? ivs.getArrayCount() : 1; + viewHandle = view_handle; if (get_device().hasImagelessFramebuffer()) { @@ -436,10 +444,6 @@ RenderPassClass::FramebufferDescription::AttachmentInfo::AttachmentInfo(const Im usage = image->getUsage(); flags = image->getCreateFlags(); } - else - { - imageView = view; - } } bool RenderPassClass::FramebufferDescription::contains(VulkanImageViewHandle view) const @@ -449,6 +453,6 @@ bool RenderPassClass::FramebufferDescription::contains(VulkanImageViewHandle vie using namespace eastl; return (end(colorAttachments) != find_if(begin(colorAttachments), end(colorAttachments), - [&view](const FramebufferDescription::AttachmentInfo &info) { return info.imageView == view; })) || - (depthStencilAttachment.imageView == view); + [&view](const FramebufferDescription::AttachmentInfo &info) { return info.viewHandle == view; })) || + (depthStencilAttachment.viewHandle == view); } \ No newline at end of file diff --git a/prog/engine/drv/drv3d_vulkan/render_pass.h b/prog/engine/drv/drv3d_vulkan/render_pass.h index 4f2638e6b..1c4a2d2a8 100644 --- a/prog/engine/drv/drv3d_vulkan/render_pass.h +++ b/prog/engine/drv/drv3d_vulkan/render_pass.h @@ -8,52 +8,6 @@ namespace drv3d_vulkan { class Image; -struct FramebufferInfo -{ - struct AttachmentInfo - { - Image *image = nullptr; - ImageViewState view = {}; - }; - AttachmentInfo colorAttachments[Driver3dRenderTarget::MAX_SIMRT] = {}; - AttachmentInfo depthStencilAttachment = {}; - uint8_t colorAttachmentMask = 0; - uint8_t depthStencilMask = 0; - - void setColorAttachment(uint32_t index, Image *image, ImageViewState view) - { - auto &target = colorAttachments[index]; - target.image = image; - target.view = view; - colorAttachmentMask |= 1u << index; - } - void clearColorAttachment(uint32_t index) - { - colorAttachments[index] = AttachmentInfo{}; - colorAttachmentMask &= ~(1u << index); - } - void setDepthStencilAttachmentReadOnly(bool read_only) - { - // r/w -> 1 - // ro -> 2 - if (hasDepthStencilAttachment()) - depthStencilMask = 1u + uint8_t(read_only); - } - void setDepthStencilAttachment(Image *image, ImageViewState view, bool read_only) - { - depthStencilAttachment.image = image; - depthStencilAttachment.view = view; - depthStencilMask = 1u + uint8_t(read_only); - } - void clearDepthStencilAttachment() - { - depthStencilAttachment = AttachmentInfo{}; - depthStencilMask = 0; - } - bool hasConstDepthStencilAttachment() const { return 2 == depthStencilMask; } - bool hasDepthStencilAttachment() const { return 0 != depthStencilMask; } - VkExtent2D makeDrawArea(VkExtent2D def = {}) const; -}; class RenderPassClass { @@ -91,6 +45,9 @@ class RenderPassClass Identifier() { clear(); } + bool hasRoDepth() const { return depthState == RO_DEPTH; } + bool hasDepth() const { return depthState != NO_DEPTH; } + void clear() { for (auto &&cf : colorFormats) @@ -163,21 +120,22 @@ class RenderPassClass END_BITFIELD_TYPE() ImageInfo imageInfo{}; + VkImageUsageFlags usage; + VkImageCreateFlags flags; + VulkanImageViewHandle viewHandle{}; + ImageViewState view; + Image *img; + + AttachmentInfo(); + AttachmentInfo(Image *image, VulkanImageViewHandle view, ImageViewState ivs); - // the usage of imageview and image flags are mutually exclusive - // image flags use in case of imageless framebuffers and the imageview otherwise - union + bool compatibleToImageless(const AttachmentInfo &cmp) const { - struct - { - VkImageUsageFlags usage; - VkImageCreateFlags flags; - }; - VulkanImageViewHandle imageView{}; - }; + return imageInfo == cmp.imageInfo && flags == cmp.flags && usage == cmp.usage; + } + bool compatibleTo(const AttachmentInfo &cmp) const { return viewHandle == cmp.viewHandle; } - AttachmentInfo(); - AttachmentInfo(const Image *image, VulkanImageViewHandle view, ImageViewState ivs); + bool empty() const { return img == nullptr; } }; AttachmentInfo colorAttachments[Driver3dRenderTarget::MAX_SIMRT] = {}; @@ -193,12 +151,36 @@ class RenderPassClass extent.height = 0; } + void setColorAttachment(uint32_t index, Image *image, ImageViewState view); + void resetColorAttachment(uint32_t index); + void setDepthStencilAttachment(Image *image, ImageViewState view); + void resetDepthStencilAttachment(); + + VkExtent2D makeDrawArea(VkExtent2D def = {}); bool contains(VulkanImageViewHandle view) const; - friend bool operator==(const FramebufferDescription &l, const FramebufferDescription &r) + + bool compatibleTo(const FramebufferDescription &cmp) const + { + if (extent != cmp.extent) + return false; + for (uint32_t i = 0; i < Driver3dRenderTarget::MAX_SIMRT; ++i) + if (!colorAttachments[i].compatibleTo(cmp.colorAttachments[i])) + return false; + if (!depthStencilAttachment.compatibleTo(cmp.depthStencilAttachment)) + return false; + return true; + } + bool compatibleToImageless(const FramebufferDescription &cmp) const { - return 0 == memcmp(&l, &r, sizeof(FramebufferDescription)); + if (extent != cmp.extent) + return false; + for (uint32_t i = 0; i < Driver3dRenderTarget::MAX_SIMRT; ++i) + if (!colorAttachments[i].compatibleToImageless(cmp.colorAttachments[i])) + return false; + if (!depthStencilAttachment.compatibleToImageless(cmp.depthStencilAttachment)) + return false; + return true; } - friend bool operator!=(const FramebufferDescription &l, const FramebufferDescription &r) { return !(l == r); } }; const Identifier &getIdentifier() const { return identifier; } diff --git a/prog/engine/drv/drv3d_vulkan/state_field_framebuffer.cpp b/prog/engine/drv/drv3d_vulkan/state_field_framebuffer.cpp index 09cdc74f9..bb83526da 100644 --- a/prog/engine/drv/drv3d_vulkan/state_field_framebuffer.cpp +++ b/prog/engine/drv/drv3d_vulkan/state_field_framebuffer.cpp @@ -58,12 +58,18 @@ void StateFieldFramebufferAttachment::applyTo(uint32_t index, FrontFramebufferSt { if (actualImage) { - fbs.bindDepthStencilTarget(actualImage, actualImage->getSampleCount(), actualView, - get_device().getImageView(actualImage, actualView), state.readOnlyDepth.data); + fbs.renderPassClass.depthState = + state.readOnlyDepth.data ? RenderPassClass::Identifier::RO_DEPTH : RenderPassClass::Identifier::RW_DEPTH; + fbs.renderPassClass.depthStencilFormat = actualView.getFormat(); + fbs.renderPassClass.colorSamples[0] = actualImage->getSampleCount(); + fbs.frameBufferInfo.depthStencilAttachment = RenderPassClass::FramebufferDescription::AttachmentInfo(actualImage, + get_device().getImageView(actualImage, actualView), actualView); } else { - fbs.clearDepthStencilTarget(); + fbs.renderPassClass.depthState = RenderPassClass::Identifier::NO_DEPTH; + fbs.renderPassClass.depthStencilFormat = FormatStore(0); + fbs.frameBufferInfo.depthStencilAttachment = RenderPassClass::FramebufferDescription::AttachmentInfo(); } } else @@ -71,12 +77,17 @@ void StateFieldFramebufferAttachment::applyTo(uint32_t index, FrontFramebufferSt // color if (actualImage) { - fbs.bindColorTarget(index, actualImage, actualImage->getSampleCount(), actualView, - get_device().getImageView(actualImage, actualView)); + fbs.renderPassClass.colorTargetMask |= 1 << index; + fbs.renderPassClass.colorFormats[index] = actualView.getFormat(); + fbs.renderPassClass.colorSamples[index] = actualImage->getSampleCount(); + fbs.frameBufferInfo.colorAttachments[index] = RenderPassClass::FramebufferDescription::AttachmentInfo(actualImage, + get_device().getImageView(actualImage, actualView), actualView); } else { - fbs.clearColorTarget(index); + fbs.renderPassClass.colorTargetMask &= ~(1 << index); + fbs.renderPassClass.colorFormats[index] = FormatStore(0); + fbs.frameBufferInfo.colorAttachments[index] = RenderPassClass::FramebufferDescription::AttachmentInfo(); } } @@ -100,7 +111,8 @@ template <> void StateFieldFramebufferReadOnlyDepth::applyTo(FrontFramebufferStateStorage &, ExecutionState &target) const { FramebufferState &fbs = target.get().framebufferState; - fbs.setDepthStencilTargetReadOnly(data); + if (fbs.renderPassClass.depthState != RenderPassClass::Identifier::NO_DEPTH) + fbs.renderPassClass.depthState = data ? RenderPassClass::Identifier::RO_DEPTH : RenderPassClass::Identifier::RW_DEPTH; target.interruptRenderPass("depthRWChange"); } diff --git a/prog/engine/drv/drv3d_vulkan/state_field_graphics.cpp b/prog/engine/drv/drv3d_vulkan/state_field_graphics.cpp index 8a35a0a62..217cfd5bf 100644 --- a/prog/engine/drv/drv3d_vulkan/state_field_graphics.cpp +++ b/prog/engine/drv/drv3d_vulkan/state_field_graphics.cpp @@ -54,6 +54,7 @@ VULKAN_TRACKED_STATE_FIELD_REF(StateFieldGraphicsRenderPassScopeOpener, renderPa VULKAN_TRACKED_STATE_FIELD_REF(StateFieldGraphicsRenderPassEarlyScopeOpener, renderPassEarlyOpener, BackGraphicsStateStorage); VULKAN_TRACKED_STATE_FIELD_REF(StateFieldGraphicsQueryScopeOpener, queryOpener, BackGraphicsStateStorage); VULKAN_TRACKED_STATE_FIELD_REF(StateFieldGraphicsQueryScopeCloser, graphicsQueryCloser, BackScopeStateStorage); +VULKAN_TRACKED_STATE_FIELD_REF(StateFieldGraphicsRenderPassArea, renderPassArea, BackGraphicsStateStorage); // front fields @@ -326,14 +327,10 @@ void StateFieldGraphicsRenderPassScopeOpener::applyTo(BackGraphicsStateStorage & state.framebuffer.handle = VulkanNullHandle(); } - VkExtent2D drawArea = fbState.frontendFrameBufferInfo.makeDrawArea(state.viewport.data.rect2D.extent); - fbState.frameBufferInfo.extent = drawArea; - + fbState.frameBufferInfo.extent = fbState.frameBufferInfo.makeDrawArea(state.viewport.data.rect2D.extent); VulkanFramebufferHandle nextFramebuffer = nextRenderPassClass->getFrameBuffer(vkDev, fbState.frameBufferInfo); - target.beginPassInternal(nextRenderPassClass, fbState.frontendFrameBufferInfo, nextFramebuffer, state.viewport.data.rect2D, - fbState.clearMode); - fbState.clearMode = 0; + target.beginPassInternal(nextRenderPassClass, nextFramebuffer, state.viewport.data.rect2D); } template <> @@ -843,7 +840,7 @@ void StateFieldGraphicsViewport::applyTo(FrontGraphicsStateStorage &state, Execu // need to check viewport for selected clear targets, as sometimes clear for depth // is requested with a bigger color target bound which provides a vp that would be // too large - VkExtent2D maxExt = rpRes ? rpRes->getMaxActiveAreaExtent() : fbs.frontendFrameBufferInfo.makeDrawArea(vp.rect2D.extent); + VkExtent2D maxExt = rpRes ? rpRes->getMaxActiveAreaExtent() : fbs.frameBufferInfo.makeDrawArea(vp.rect2D.extent); vp.rect2D.extent.width = min(vp.rect2D.extent.width, maxExt.width - vp.rect2D.offset.x); vp.rect2D.extent.height = min(vp.rect2D.extent.height, maxExt.height - vp.rect2D.offset.y); @@ -860,7 +857,8 @@ void StateFieldGraphicsViewport::applyTo(FrontGraphicsStateStorage &state, Execu if (!rpRes) { - RegionDifference dif = classify_rect2d_diff(fbs.viewRect, vp.rect2D); + RegionDifference dif = + classify_rect2d_diff(target.getRO(), vp.rect2D); if (dif == RegionDifference::SUPERSET) target.interruptRenderPass("ViewportExtend"); } @@ -1019,11 +1017,7 @@ void StateFieldGraphicsPrimitiveTopology::dumpLog(const BackGraphicsStateStorage void StateFieldGraphicsFlush::syncTLayoutsToRenderPass(BackGraphicsStateStorage &state, ExecutionContext &target) const { if (state.inPass.data == InPassStateFieldType::NONE && !state.nativeRenderPass.ptr) - { - FramebufferState &fbState = target.getFramebufferState(); - target.ensureStateForDepthAttachment(fbState.renderPassClass, fbState.frontendFrameBufferInfo, - fbState.frontendFrameBufferInfo.hasConstDepthStencilAttachment()); - } + target.ensureStateForDepthAttachment(); } void StateFieldGraphicsFlush::applyDescriptors(BackGraphicsStateStorage &state, ExecutionContext &target) const @@ -1203,6 +1197,16 @@ void StateFieldGraphicsQueryScopeCloser::dumpLog(const BackScopeStateStorage &) debug("graphics query closer: no close pendin"); } +template <> +void StateFieldGraphicsRenderPassArea::applyTo(BackGraphicsStateStorage &, ExecutionContext &) const +{} + +template <> +void StateFieldGraphicsRenderPassArea::dumpLog(const BackGraphicsStateStorage &) const +{ + debug("renderPassArea: ofs (%i, %i) ext (%u, %u)", data.offset.x, data.offset.y, data.extent.width, data.extent.height); +} + } // namespace drv3d_vulkan using namespace drv3d_vulkan; diff --git a/prog/engine/drv/drv3d_vulkan/state_field_graphics.h b/prog/engine/drv/drv3d_vulkan/state_field_graphics.h index 48d103523..53f963013 100644 --- a/prog/engine/drv/drv3d_vulkan/state_field_graphics.h +++ b/prog/engine/drv/drv3d_vulkan/state_field_graphics.h @@ -607,4 +607,10 @@ struct StateFieldGraphicsQueryScopeCloser : TrackedStateFieldBase void dumpLog(Storage &data) const; }; +struct StateFieldGraphicsRenderPassArea : TrackedStateFieldBase, TrackedStateFieldGenericPOD +{ + const VkRect2D &getValueRO() const { return data; }; + VULKAN_TRACKED_STATE_FIELD_CB_DEFENITIONS(); +}; + } // namespace drv3d_vulkan diff --git a/prog/engine/drv/drv3d_vulkan/state_field_resource_binds.cpp b/prog/engine/drv/drv3d_vulkan/state_field_resource_binds.cpp index b4e31d6bd..423329cd0 100644 --- a/prog/engine/drv/drv3d_vulkan/state_field_resource_binds.cpp +++ b/prog/engine/drv/drv3d_vulkan/state_field_resource_binds.cpp @@ -29,45 +29,52 @@ bool hasResourceConflictWithFramebuffer(Image *img, ImageViewState view, ShaderS ContextBackend &back = get_device().getContext().getBackend(); FramebufferState &fbs = back.executionState.get().framebufferState; - FramebufferInfo &fbi = fbs.frontendFrameBufferInfo; + RenderPassClass::FramebufferDescription &fbi = fbs.frameBufferInfo; - uint32_t i; - uint32_t bit; - for (i = 0, bit = 1; i < Driver3dRenderTarget::MAX_SIMRT; ++i, bit = bit << 1) + if (img->getUsage() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { - if (!(bit & fbi.colorAttachmentMask)) - continue; - - if (!fbi.colorAttachments[i].image) - continue; + uint32_t i; + uint32_t bit; + for (i = 0, bit = 1; i < Driver3dRenderTarget::MAX_SIMRT; ++i, bit = bit << 1) + { + if (!(fbs.renderPassClass.colorTargetMask & bit)) + continue; - if (fbi.colorAttachments[i].image != img) - continue; + G_ASSERTF(!fbi.colorAttachments[i].empty(), "vulkan: empty attachment %u while it used by render pass class", i); + if (fbi.colorAttachments[i].img != img) + continue; - const ImageViewState &rtView = fbi.colorAttachments[i].view; + const ImageViewState &rtView = fbi.colorAttachments[i].view; - const ValueRange rtMipRange(rtView.getMipBase(), rtView.getMipBase() + rtView.getMipCount()); - const ValueRange rtArrayRange(rtView.getArrayBase(), rtView.getArrayBase() + rtView.getMipCount()); + const ValueRange rtMipRange(rtView.getMipBase(), rtView.getMipBase() + rtView.getMipCount()); + const ValueRange rtArrayRange(rtView.getArrayBase(), rtView.getArrayBase() + rtView.getMipCount()); - const ValueRange mipRange(view.getMipBase(), view.getMipBase() + view.getMipCount()); - const ValueRange arrayRange(view.getArrayBase(), view.getArrayBase() + view.getMipCount()); + const ValueRange mipRange(view.getMipBase(), view.getMipBase() + view.getMipCount()); + const ValueRange arrayRange(view.getArrayBase(), view.getArrayBase() + view.getMipCount()); - if (mipRange.overlaps(rtMipRange) && arrayRange.overlaps(rtArrayRange)) - return true; + if (mipRange.overlaps(rtMipRange) && arrayRange.overlaps(rtArrayRange)) + return true; + } } - if (fbi.hasDepthStencilAttachment() && !fbi.hasConstDepthStencilAttachment()) + if (img->getUsage() & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - if (fbi.depthStencilAttachment.image != img) - return false; + if (fbs.renderPassClass.hasDepth() && !fbs.renderPassClass.hasRoDepth()) + { + G_ASSERTF(!fbi.depthStencilAttachment.empty(), "vulkan: empty depth attachment while it used by render pass class"); + if (fbi.depthStencilAttachment.img != img) + return false; - const ValueRange mipRange(view.getMipBase(), view.getMipBase() + view.getMipCount()); - const ValueRange arrayRange(view.getArrayBase(), view.getArrayBase() + view.getMipCount()); + const ImageViewState &dsView = fbi.depthStencilAttachment.view; - auto mipIndex = fbi.depthStencilAttachment.view.getMipBase(); - auto arrayIndex = fbi.depthStencilAttachment.view.getArrayBase(); - if (mipRange.isInside(mipIndex) && arrayRange.isInside(arrayIndex)) - return true; + const ValueRange mipRange(view.getMipBase(), view.getMipBase() + view.getMipCount()); + const ValueRange arrayRange(view.getArrayBase(), view.getArrayBase() + view.getMipCount()); + + auto mipIndex = dsView.getMipBase(); + auto arrayIndex = dsView.getArrayBase(); + if (mipRange.isInside(mipIndex) && arrayRange.isInside(arrayIndex)) + return true; + } } return false; @@ -90,18 +97,19 @@ bool isConstDepthStencilTarget(Image *img, ImageViewState view) ContextBackend &back = get_device().getContext().getBackend(); FramebufferState &fbs = back.executionState.get().framebufferState; - FramebufferInfo &fbi = fbs.frontendFrameBufferInfo; - if (fbi.hasDepthStencilAttachment() && fbi.hasConstDepthStencilAttachment()) + if (fbs.renderPassClass.hasRoDepth()) { - if (fbi.depthStencilAttachment.image != img) + const RenderPassClass::FramebufferDescription::AttachmentInfo &dsai = fbs.frameBufferInfo.depthStencilAttachment; + G_ASSERTF(!dsai.empty(), "vulkan: empty depth attachment while it used by render pass class"); + if (dsai.img != img) return false; const ValueRange mipRange(view.getMipBase(), view.getMipBase() + view.getMipCount()); const ValueRange arrayRange(view.getArrayBase(), view.getArrayBase() + view.getMipCount()); - auto mipIndex = fbi.depthStencilAttachment.view.getMipBase(); - auto arrayIndex = fbi.depthStencilAttachment.view.getArrayBase(); + auto mipIndex = dsai.view.getMipBase(); + auto arrayIndex = dsai.view.getArrayBase(); if (mipRange.isInside(mipIndex) && arrayRange.isInside(arrayIndex)) return true; } diff --git a/prog/engine/drv/drv3d_vulkan/texture.h b/prog/engine/drv/drv3d_vulkan/texture.h index 452738149..ae4ed0ae8 100644 --- a/prog/engine/drv/drv3d_vulkan/texture.h +++ b/prog/engine/drv/drv3d_vulkan/texture.h @@ -217,8 +217,6 @@ struct BaseTex final : public BaseTexture SmallTab texCopy; //< ddsx::Header + ddsx data; sysCopyQualityId stored in hdr.hqPartLevel - BaseTexture::IReloadData *rld; - struct ImageMem { void *ptr = nullptr; @@ -299,7 +297,6 @@ struct BaseTex final : public BaseTexture samplerState.setFilter(VK_FILTER_LINEAR); preallocBeforeLoad = false; - rld = nullptr; if (RES3D_CUBETEX == resType) { @@ -315,7 +312,6 @@ struct BaseTex final : public BaseTexture Device &device = get_device(); if (waitEvent.isPending()) device.getContext().wait(); - setRld(nullptr); } /// ->> @@ -463,11 +459,7 @@ struct BaseTex final : public BaseTexture int generateMips() override; - bool setReloadCallback(IReloadData *_rld) override - { - setRld(_rld); - return true; - } + bool setReloadCallback(IReloadData *) override { return false; } void releaseTex(); void swapInnerTex(D3DTextures &new_tex); @@ -485,13 +477,6 @@ struct BaseTex final : public BaseTexture /// <<- - void setRld(BaseTexture::IReloadData *_rld) - { - if (rld && rld != _rld) - rld->destroySelf(); - rld = _rld; - } - void release() { releaseTex(); } bool recreate(); diff --git a/prog/engine/drv/drv3d_vulkan/util/tracked_state.h b/prog/engine/drv/drv3d_vulkan/util/tracked_state.h index bc8206a18..405cc9948 100644 --- a/prog/engine/drv/drv3d_vulkan/util/tracked_state.h +++ b/prog/engine/drv/drv3d_vulkan/util/tracked_state.h @@ -187,6 +187,9 @@ struct TrackedStateFieldGenericPtr void set(PtrType *value) { ptr = value; } bool diff(PtrType *value) const { return ptr != value; } + + PtrType *&getValue() { return &ptr; } + const PtrType &getValueRO() const { return *ptr; } }; template diff --git a/prog/engine/gameRes/collisionGameRes.cpp b/prog/engine/gameRes/collisionGameRes.cpp index f3d2b1790..a3618cc19 100644 --- a/prog/engine/gameRes/collisionGameRes.cpp +++ b/prog/engine/gameRes/collisionGameRes.cpp @@ -248,6 +248,11 @@ void CollisionResource::load(IGenLoad &_cb, int res_id) zcrd->read(n.indices.data(), data_size(n.indices)); } } + if (n.type == COLLISION_NODE_TYPE_CAPSULE) + { + n.capsule.set(n.modelBBox); + n.capsule.transform(n.tm); + } n.nodeIndex = &n - allNodesList.data(); } diff --git a/prog/engine/gameRes/gameResSystem.cpp b/prog/engine/gameRes/gameResSystem.cpp index 5b018626a..dae01d5bb 100644 --- a/prog/engine/gameRes/gameResSystem.cpp +++ b/prog/engine/gameRes/gameResSystem.cpp @@ -1983,7 +1983,7 @@ inline bool set_required_res_list_restriction(GetListElement list, int count, Re { const char *name = list(i); int res_id = resNameMap.getNameId(name); - if (res_id < 0 && gamereshooks::resolve_res_handle) + if (gamereshooks::resolve_res_handle) gamereshooks::resolve_res_handle(GAMERES_HANDLE_FROM_STRING(name), 0xFFFFFFFFu, res_id); if (res_id < 0) { diff --git a/prog/engine/gameRes/stubGameResFactories.cpp b/prog/engine/gameRes/stubGameResFactories.cpp index 321a28356..d7bcd366c 100644 --- a/prog/engine/gameRes/stubGameResFactories.cpp +++ b/prog/engine/gameRes/stubGameResFactories.cpp @@ -251,7 +251,7 @@ struct stubgameres::Effect : public DObject virtual void update(float) {} virtual void drawEmitter(const Point3 &) {} - virtual void render(unsigned) {} + virtual void render(unsigned, const TMatrix &) {} } fx; GameResource *gameRes() { return (GameResource *)&fx; } diff --git a/prog/engine/guiBase/font.cpp b/prog/engine/guiBase/font.cpp index 979a1f760..312df79b3 100644 --- a/prog/engine/guiBase/font.cpp +++ b/prog/engine/guiBase/font.cpp @@ -36,6 +36,7 @@ #include #include FT_FREETYPE_H +#include FT_BITMAP_H static int quotaPerFrameUsecOverride = 100000; @@ -162,6 +163,18 @@ struct DagorFreeTypeFontRec if (FT_Load_Glyph(face, index, ftFlags | FT_LOAD_RENDER) != 0) return NULL; + if (face->glyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY) // convert to 8-bit (if not already) + { + FT_Bitmap bm8; + FT_Bitmap_Init(&bm8); + FT_Bitmap_Convert(ft_lib, &face->glyph->bitmap, &bm8, 1); + if (face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO) + for (uint8_t *p = bm8.buffer, *pe = p + bm8.rows * bm8.width; p < pe; p++) + if (*p) + *p = 0xFF; + FT_Bitmap_Done(ft_lib, &face->glyph->bitmap); + face->glyph->bitmap = bm8; + } return face->glyph; } diff --git a/prog/engine/guiBase/stdGuiRender.cpp b/prog/engine/guiBase/stdGuiRender.cpp index 81a7e3f32..a89f5fe35 100644 --- a/prog/engine/guiBase/stdGuiRender.cpp +++ b/prog/engine/guiBase/stdGuiRender.cpp @@ -3665,6 +3665,12 @@ void GuiContext::draw_str_scaled(real scale, const char *str, int len) return draw_str_scaled_u(scale, tmpU16, len); } +bool GuiContext::draw_str_scaled_buf(SmallTab &out_qv, SmallTab &out_tex_qcnt, unsigned dsb_flags, float scale, + const char *str, int len) +{ + CVT_TO_UTF16_ON_STACK(tmpU16, str, len); + return draw_str_scaled_u_buf(out_qv, out_tex_qcnt, dsb_flags, scale, tmpU16); +} bool GuiContext::draw_str_scaled_u_buf(SmallTab &out_qv, SmallTab &out_tex_qcnt, unsigned dsb_flags, float scale, const wchar_t *str, int len) { @@ -4315,8 +4321,7 @@ bool draw_str_scaled_u_buf(SmallTab &out_qv, SmallTab &out_ bool draw_str_scaled_buf(SmallTab &out_qv, SmallTab &out_tex_qcnt, unsigned dsb_flags, real scale, const char *str, int len) { - CVT_TO_UTF16_ON_STACK(tmpU16, str, len); - return stdgui_context.draw_str_scaled_u_buf(out_qv, out_tex_qcnt, dsb_flags, scale, tmpU16); + return stdgui_context.draw_str_scaled_buf(out_qv, out_tex_qcnt, dsb_flags, scale, str, len); } void render_str_buf(dag::ConstSpan qv, dag::ConstSpan tex_qcnt, unsigned dsb_flags) { diff --git a/prog/engine/ioSys/zlibInline.h b/prog/engine/ioSys/zlibInline.h index 286956e05..5b40666e7 100644 --- a/prog/engine/ioSys/zlibInline.h +++ b/prog/engine/ioSys/zlibInline.h @@ -114,6 +114,3 @@ class ZLibGeneralWriter : public ZLibPacker return 0; } }; - -extern "C" void *zcalloc(void *opaque, unsigned items, unsigned size); -extern "C" void zcfree(void *opaque, void *ptr); diff --git a/prog/engine/ioSys/zlibIo.cpp b/prog/engine/ioSys/zlibIo.cpp index 4d90dfd23..161ec6638 100644 --- a/prog/engine/ioSys/zlibIo.cpp +++ b/prog/engine/ioSys/zlibIo.cpp @@ -265,17 +265,5 @@ int zlib_compress_data(IGenSave &dest, int compression_level, IGenLoad &src, int float ZlibSaveCB::getCompressionRatio() { return zlibWriter->getCompressionRatio(); } -extern "C" void *zcalloc(void *opaque, unsigned items, unsigned size) -{ - (void)(opaque); - return memalloc_default(items * size); -} - -extern "C" void zcfree(void *opaque, void *ptr) -{ - memfree_default(ptr); - (void)(opaque); -} - #define EXPORT_PULL dll_pull_iosys_zlibIo #include diff --git a/prog/engine/ioSys/zstdIo.cpp b/prog/engine/ioSys/zstdIo.cpp index a3e4c8c8e..f96c249d4 100644 --- a/prog/engine/ioSys/zstdIo.cpp +++ b/prog/engine/ioSys/zstdIo.cpp @@ -22,11 +22,18 @@ static void *zstd_alloc(void *, size_t size) { #if _TARGET_STATIC_LIB using namespace dagor_phys_memory; - void *ptr = (size < PHYS_MEM_THRESHOLD_SIZE) - ? mem_ptr()->alloc(size + sizeof(size_t) * 2) - : alloc_phys_mem(size + sizeof(size_t) * 2, PM_ALIGN_PAGE, PM_PROT_CPU_ALL, /*cpu_cached*/ true); - *(size_t *)ptr = size; - return (size_t *)ptr + 2; + void *ptr = nullptr; + if (size >= PHYS_MEM_THRESHOLD_SIZE) + ptr = alloc_phys_mem(size + sizeof(size_t) * 2, PM_ALIGN_PAGE, PM_PROT_CPU_ALL, /*cpu_cached*/ true); + if (!ptr) + ptr = mem_ptr()->tryAlloc(size + sizeof(size_t) * 2); + if (ptr) + { + *(size_t *)ptr = size; + return (size_t *)ptr + 2; + } + else + return nullptr; #else return mem_ptr()->alloc(size); #endif diff --git a/prog/engine/lib3d/picMgr.cpp b/prog/engine/lib3d/picMgr.cpp index e6a76cf78..e224b6e34 100644 --- a/prog/engine/lib3d/picMgr.cpp +++ b/prog/engine/lib3d/picMgr.cpp @@ -27,6 +27,7 @@ #include #include #include +#include // #define PICMGR_DEBUG debug // trace picture manager execution #ifndef PICMGR_DEBUG @@ -1603,7 +1604,10 @@ bool PictureManager::TexRec::initAtlas() ad->atlas.copy_left_top_margin_cb = copy_left_top_margin_cb; ad->atlas.copy_left_top_margin_cb_arg = ad; #if DAGOR_DBGLEVEL > 0 - ad->atlas.clear_discarded_cb = clear_discarded_cb; + const DataBlock *settings = dgs_get_settings(); + if ( + settings && settings->getBlockByNameEx("debug")->getBool("clearDiscardedImagesInAtlas", !d3d::get_driver_code().is(d3d::vulkan))) + ad->atlas.clear_discarded_cb = clear_discarded_cb; #endif return true; } diff --git a/prog/engine/math/mesh.cpp b/prog/engine/math/mesh.cpp index 274493280..2512009d9 100644 --- a/prog/engine/math/mesh.cpp +++ b/prog/engine/math/mesh.cpp @@ -357,7 +357,7 @@ void MeshData::buildVertToFaceVertMap(F2V_Map &map, const Face *face, int numf, map.index.clear(); map.data.resize(data_sz); map.index.resize(vnum * 2); - memset(&map.index[0], 0, 4 * 2 * vnum); + mem_set_0(map.index); for (i = 0; i < numf; i++) { diff --git a/prog/engine/osApiWrappers/cpuJobs.cpp b/prog/engine/osApiWrappers/cpuJobs.cpp index b61049bd3..1d0acf7fe 100644 --- a/prog/engine/osApiWrappers/cpuJobs.cpp +++ b/prog/engine/osApiWrappers/cpuJobs.cpp @@ -520,7 +520,7 @@ static void android_apply_thread_affinity(cpujobs::JobMgrCtx &ctx) CPU_SET(i, &cpuset); if (sched_setaffinity(gettid(), sizeof(cpuset), &cpuset) != 0) - logerr("job_mgr_thread failed to set affinity for %s mask: %08X online_cores: %d errno: %d", ctx.threadName, ctx.affinity, + debug("job_mgr_thread failed to set affinity for %s mask: %08X online_cores: %d errno: %d", ctx.threadName, ctx.affinity, online_cores, errno); } #else diff --git a/prog/engine/osApiWrappers/threads.cpp b/prog/engine/osApiWrappers/threads.cpp index a285f3c62..aae3278a4 100644 --- a/prog/engine/osApiWrappers/threads.cpp +++ b/prog/engine/osApiWrappers/threads.cpp @@ -316,7 +316,7 @@ void DaThread::applyThreadAffinity(unsigned int affinity) if (affinity & (1 << i)) CPU_SET(i, &cpuset); if (sched_setaffinity(tid, sizeof(cpuset), &cpuset)) - logerr("DaThread failed to set affinity 0x%04x for %s errno: %d", affinity, name, errno); + debug("DaThread failed to set affinity 0x%04x for %s errno: %d", affinity, name, errno); #else // Not implemented. G_UNREFERENCED(affinity); diff --git a/prog/engine/phys/physJolt/joltPhysics.cpp b/prog/engine/phys/physJolt/joltPhysics.cpp index a6c2b38f4..7c31a2de7 100644 --- a/prog/engine/phys/physJolt/joltPhysics.cpp +++ b/prog/engine/phys/physJolt/joltPhysics.cpp @@ -839,11 +839,10 @@ JPH::RefConst PhysBody::create_jolt_collision_shape(const PhysCollis } auto res = shape.Create(); - if (res.IsValid()) + if (DAGOR_LIKELY(res.IsValid())) return res.Get(); - // TODO: promote this to logerr when either all project resources are fixed or add per-project setting - logwarn("Failed to create non sanitized mesh shape <%s>: %s", meshColl->debugName, res.GetError().c_str()); + logerr("Failed to create non sanitized mesh shape <%s>: %s", meshColl->debugName, res.GetError().c_str()); decltype(shape) sanitizedShape; sanitizedShape.mTriangleVertices = eastl::move(shape.mTriangleVertices); diff --git a/prog/engine/scene/staticFxObjs.cpp b/prog/engine/scene/staticFxObjs.cpp index 638cb1b81..4bdbee840 100644 --- a/prog/engine/scene/staticFxObjs.cpp +++ b/prog/engine/scene/staticFxObjs.cpp @@ -55,7 +55,7 @@ static __forceinline bool is_sphere_visible(BSphere3 &sp, const Frustum &frustum return true; } -void StaticFxObjects::render(int render_type) +void StaticFxObjects::render(int render_type, const TMatrix &view_itm) { if (render_type == FX_RENDER_BEFORE) { @@ -68,7 +68,7 @@ void StaticFxObjects::render(int render_type) e.visible = e.bindumpRenderable && is_sphere_visible(e.sph, frustum); if (e.visible) - e.fx->render(FX_RENDER_BEFORE); + e.fx->render(FX_RENDER_BEFORE, view_itm); } } else @@ -77,7 +77,7 @@ void StaticFxObjects::render(int render_type) { Effect &e = objects[i]; if (e.visible) - e.fx->render(render_type); + e.fx->render(render_type, view_itm); } } } diff --git a/prog/engine/shaders/dynSceneRes.cpp b/prog/engine/shaders/dynSceneRes.cpp index 68a13aa4c..0f6be4109 100644 --- a/prog/engine/shaders/dynSceneRes.cpp +++ b/prog/engine/shaders/dynSceneRes.cpp @@ -529,9 +529,9 @@ bool DynamicRenderableSceneResource::hasRigidMesh(int node_id) return ro && ro->mesh; } -Tab DynamicRenderableSceneResource::getNodesWithMaterials(dag::ConstSpan material_names) const +dag::Vector DynamicRenderableSceneResource::getNodesWithMaterials(dag::ConstSpan material_names) const { - Tab nodes; + dag::Vector nodes; auto checkRigid = [&](const RigidObject &ro) { for (auto &elem : ro.mesh->getMesh()->getAllElems()) @@ -1401,7 +1401,8 @@ void DynamicRenderableSceneInstance::clipNodes(const Frustum &frustum, dag::Vect } } -eastl::optional> DynamicRenderableSceneInstance::getNodesWithMaterials(dag::ConstSpan material_names) const +eastl::optional> DynamicRenderableSceneInstance::getNodesWithMaterials( + dag::ConstSpan material_names) const { if (!sceneResource) return eastl::nullopt; diff --git a/prog/engine/shaders/matVdataLoad.cpp b/prog/engine/shaders/matVdataLoad.cpp index 09e10b11b..c4f592f4b 100644 --- a/prog/engine/shaders/matVdataLoad.cpp +++ b/prog/engine/shaders/matVdataLoad.cpp @@ -180,6 +180,10 @@ void ShaderMatVdata::loadMatVdata(const char *name, IGenLoad &crd, unsigned flag compr_type = 2; // lzma matVdataHdrSz &= ~0x40000000; } +#if VDATA_RELOAD_SUPPORTED + if (!(flags & VDATA_SRC_ONLY) && (flags & VDATA_NO_IBVB) != VDATA_NO_IBVB && strcmp(crd.getTargetName(), "(mem)") != 0) + flags |= VDATA_D3D_RESET_READY; +#endif matVdataSrcRef.fileOfs = crd.tell(); matVdataSrcRef.dataSz = 0; @@ -268,7 +272,7 @@ void ShaderMatVdata::loadMatVdata(const char *name, IGenLoad &crd, unsigned flag // read and create vb/ib Tab tmp_decoder_stor; for (int i = 0; i < vdata.size(); i++) - vdata[i].create(name, hdr->vdata[i].vertNum, hdr->vdata[i].vertStride, hdr->vdata[i].packedIdxSize(), hdr->vdata[i].idxSize, + vdata[i].initGvd(name, hdr->vdata[i].vertNum, hdr->vdata[i].vertStride, hdr->vdata[i].packedIdxSize(), hdr->vdata[i].idxSize, flags | hdr->vdata[i].flags, zcrd, tmp_decoder_stor); if (vdataFullCount && (vdata.data() + 0)->getLodIndex() != 0) setLodsAreSplit(); @@ -288,7 +292,7 @@ void ShaderMatVdata::loadMatVdata(const char *name, IGenLoad &crd, unsigned flag memfree(hdr, tmpmem); #if VDATA_RELOAD_SUPPORTED - if (!(flags & VDATA_SRC_ONLY) && strcmp(crd.getTargetName(), "(mem)") != 0) + if ((flags & VDATA_D3D_RESET_READY) && (d3d::get_driver_code().is(d3d::dx11) || d3d::get_driver_code().is(d3d::dx12))) { static struct ShaderVdataReloadStub : public Sbuffer::IReloadData { @@ -296,9 +300,12 @@ void ShaderMatVdata::loadMatVdata(const char *name, IGenLoad &crd, unsigned flag virtual void destroySelf() {} } stub; Sbuffer::IReloadData *rld = this; + unsigned used_d3d_buf_cnt = 0; for (int i = 0; i < vdata.size(); i++) { + if ((!vdata[i].testFlags(VDATA_NO_VB) && vdata[i].getVB()) || (!vdata[i].testFlags(VDATA_NO_IB) && vdata[i].getIB())) + used_d3d_buf_cnt++; if (!vdata[i].testFlags(VDATA_NO_VB) && vdata[i].getVB() && vdata[i].getVB()->setReloadCallback(rld)) rld = &stub; if (!vdata[i].testFlags(VDATA_NO_IB) && vdata[i].getIB() && vdata[i].getIB()->setReloadCallback(rld)) @@ -306,6 +313,9 @@ void ShaderMatVdata::loadMatVdata(const char *name, IGenLoad &crd, unsigned flag } if (rld != this) matVdataSrcRef.fname = dagor_fname_map_add_fn(crd.getTargetName()); + else if (used_d3d_buf_cnt) + logerr("failed to setReloadCallback() for %s:0x%x, contents (%d buffers) will be lost on d3d reset", // + crd.getTargetName(), matVdataSrcRef.fileOfs, used_d3d_buf_cnt); } #endif diff --git a/prog/engine/shaders/rendInstRes.cpp b/prog/engine/shaders/rendInstRes.cpp index ef657db04..9e2e979a1 100644 --- a/prog/engine/shaders/rendInstRes.cpp +++ b/prog/engine/shaders/rendInstRes.cpp @@ -32,7 +32,9 @@ RenderableInstanceLodsResource::ImpostorTextures RenderableInstanceLodsResource: VAR(impostor_view_mode) \ VAR(impostor_albedo_alpha) \ VAR(impostor_normal_translucency) \ - VAR(impostor_ao_smoothness) + VAR(impostor_ao_smoothness) \ + VAR(cross_dissolve_mul) \ + VAR(cross_dissolve_add) #define VAR(a) static int a##VarId = -1; GLOBAL_OPTIONAL_VARS_LIST @@ -297,6 +299,15 @@ bool RenderableInstanceLodsResource::setImpostorVars(ShaderMaterial *mat, int bu return res; } +bool RenderableInstanceLodsResource::setImpostorTransitionRange(ShaderMaterial *mat, float transition_lod_start, + float transition_range) const +{ + bool res = true; + res = mat->set_real_param(cross_dissolve_mulVarId, 1 / transition_range) && res; + res = mat->set_real_param(cross_dissolve_addVarId, -transition_lod_start / transition_range) && res; + return res; +} + void RenderableInstanceLodsResource::loadImpostorData(const char *name) { if (!hasImpostor()) diff --git a/prog/engine/shaders/sh_vars.cpp b/prog/engine/shaders/sh_vars.cpp index bc122a4bb..c8e40bc86 100644 --- a/prog/engine/shaders/sh_vars.cpp +++ b/prog/engine/shaders/sh_vars.cpp @@ -10,7 +10,7 @@ int shglobvars::dynamic_pos_unpack_reg = 253; void shglobvars::init_varids_loaded() { - globalTransRGvId = ShaderGlobal::get_glob_var_id(get_shader_variable_id("global_transp_r")); + globalTransRGvId = ShaderGlobal::get_glob_var_id(get_shader_variable_id("global_transp_r", true)); ShaderGlobal::set_real_fast(globalTransRGvId, 1.0f); worldViewPosGvId = ShaderGlobal::get_glob_var_id(get_shader_variable_id("world_view_pos")); localWorldXGvId = ShaderGlobal::get_glob_var_id(get_shader_variable_id("local_world_x", true)); diff --git a/prog/engine/shaders/shaderMesh.cpp b/prog/engine/shaders/shaderMesh.cpp index 2789f1520..7f32bd112 100644 --- a/prog/engine/shaders/shaderMesh.cpp +++ b/prog/engine/shaders/shaderMesh.cpp @@ -20,7 +20,7 @@ bool ShaderMesh::dbgRenderStarted = false; * class GlobalVertexData * *********************************/ -void GlobalVertexData::create(const char *name, unsigned vNum, unsigned vStride, unsigned idxPacked, unsigned idxSize, unsigned flags, +void GlobalVertexData::initGvd(const char *name, unsigned vNum, unsigned vStride, unsigned idxPacked, unsigned idxSize, unsigned flags, IGenLoad *crd, Tab &tmp_decoder_stor) { if (vNum > 65536 && !(flags & VDATA_I16)) @@ -43,9 +43,7 @@ void GlobalVertexData::create(const char *name, unsigned vNum, unsigned vStride, } // create vertex buffer - unsigned vbFlags = 0; - if (flags & VDATA_VB_SYSMEM) - vbFlags |= SBCF_SYSMEM; + unsigned vbFlags = (flags & VDATA_NO_VB) || !(flags & VDATA_D3D_RESET_READY) ? 0 : SBCF_MAYBELOST; if (flags & VDATA_BIND_SHADER_RES) vbFlags |= SBCF_BIND_SHADER_RES; if (flags & VDATA_NO_VB) @@ -62,9 +60,7 @@ void GlobalVertexData::create(const char *name, unsigned vNum, unsigned vStride, // create index buffer if (idxSize) { - unsigned ibFlags = 0; - if (flags & VDATA_IB_SYSMEM) - ibFlags |= SBCF_SYSMEM; + unsigned ibFlags = (flags & VDATA_NO_IB) || !(flags & VDATA_D3D_RESET_READY) ? 0 : SBCF_MAYBELOST; if (flags & VDATA_I32) ibFlags |= SBCF_INDEX32; if (flags & VDATA_NO_IB) @@ -84,24 +80,65 @@ void GlobalVertexData::create(const char *name, unsigned vNum, unsigned vStride, if (crd) unpackToBuffers(*crd, false, tmp_decoder_stor); } -void GlobalVertexData::createMem(int vNum, int vStride, int idxSize, unsigned flags, const void *vb_data, const void *ib_data) +void GlobalVertexData::initGvdMem(int vNum, int vStride, int idxSize, unsigned flags, const void *vb_data, const void *ib_data) { Tab tmp_decoder_stor; - create("mem", vNum, vStride, 0, idxSize, flags, nullptr, tmp_decoder_stor); + bool need_set_rld = !(flags & VDATA_D3D_RESET_READY) && vNum && vb_data; + initGvd("mem", vNum, vStride, 0, idxSize, flags | (vb_data && ib_data ? VDATA_D3D_RESET_READY : 0), nullptr, tmp_decoder_stor); - if (vb_data) + if (vb_data && vb) d3d_err(vb->updateDataWithLock(0, getVbSize(), vb_data, VBLOCK_WRITEONLY)); // load vertex buffer data // create index buffer if (ib_data && getIbSize()) - d3d_err(getIB()->updateDataWithLock(0, getIbSize(), ib_data, VBLOCK_WRITEONLY)); // load index buffer data + if (auto _ib = getIB()) + d3d_err(_ib->updateDataWithLock(0, getIbSize(), ib_data, VBLOCK_WRITEONLY)); // load index buffer data + + if (need_set_rld && vb && (d3d::get_driver_code().is(d3d::dx11) || d3d::get_driver_code().is(d3d::dx12))) + { +#if _TARGET_PC_WIN + G_ASSERT(!(flags & VDATA_NO_IBVB)); + G_ASSERT(vb_data || !getVbSize()); + G_ASSERT(ib_data || !getIbSize()); + + struct VdataReloadFromMem : public Sbuffer::IReloadData + { + GlobalVertexData &gvd; + Tab buf; + VdataReloadFromMem(GlobalVertexData &_gvd, const void *vb_data, const void *ib_data) : gvd(_gvd) + { + buf.resize(gvd.getVbSize() + gvd.getIbSize()); + memcpy(buf.data(), vb_data, gvd.getVbSize()); + if (ib_data) + memcpy(buf.data() + gvd.getVbSize(), ib_data, gvd.getIbSize()); + } + void reloadD3dRes(Sbuffer *) override + { + if (gvd.vb) + d3d_err(gvd.vb->updateDataWithLock(0, gvd.getVbSize(), buf.data(), VBLOCK_WRITEONLY)); + if (auto _ib = gvd.getIB()) + d3d_err(_ib->updateDataWithLock(0, gvd.getIbSize(), buf.data() + gvd.getVbSize(), VBLOCK_WRITEONLY)); + } + void destroySelf() override { delete this; } + }; + + auto rld = new VdataReloadFromMem(*this, vb_data, ib_data); + auto _ib = getIB(); + Sbuffer *latest_buf = _ib ? _ib : vb; + if (!latest_buf->setReloadCallback(rld)) + { + logerr("failed to install d3d buffer reload callback"); + delete rld; + } +#endif + } } void GlobalVertexData::unpackToBuffers(IGenLoad &zcrd, bool update_ib_vb_only, Tab &tmp_decoder_stor) { if (!testFlags(VDATA_NO_VB)) { - bool cached_dest_mem = testFlags(VDATA_NO_VB | VDATA_VB_SYSMEM); + bool cached_dest_mem = testFlags(VDATA_NO_VB); #if _TARGET_PC_WIN cached_dest_mem = true; #endif @@ -132,7 +169,7 @@ void GlobalVertexData::unpackToBuffers(IGenLoad &zcrd, bool update_ib_vb_only, T if (!testFlags(VDATA_NO_VB)) { - bool cached_dest_mem = testFlags(VDATA_NO_IB | VDATA_IB_SYSMEM); + bool cached_dest_mem = testFlags(VDATA_NO_IB); #if _TARGET_PC_WIN cached_dest_mem = true; #endif diff --git a/prog/engine/shaders/shaderMeshSimple.cpp b/prog/engine/shaders/shaderMeshSimple.cpp index 3cfa87b1e..ee8d62637 100644 --- a/prog/engine/shaders/shaderMeshSimple.cpp +++ b/prog/engine/shaders/shaderMeshSimple.cpp @@ -414,13 +414,18 @@ ShaderMesh *ShaderMesh::createSimple(Mesh &m, ShaderMaterial *mat, const char * ShaderMesh *sm = new (mem, _NEW_INPLACE) ShaderMesh; sm->_resv = 0; + if (m.getFace().empty()) + { + sm->elems.init(nullptr, 0); + memset(sm->stageEndElemIdx, 0, sizeof(sm->stageEndElemIdx)); + return sm; + } sm->elems.init(sm + 1, 1); memset(sm->stageEndElemIdx, 0, sizeof(sm->stageEndElemIdx)); for (int i = 0, stg = (flags & SC_STAGE_IDX_MASK); i < SC_STAGE_IDX_MASK + 1; i++) sm->stageEndElemIdx[i] = (i < stg) ? 0 : 1; RElem *re = sm->elems.data(); - ; memset(re, 0, sizeof(*re)); re->mat = mat; @@ -440,7 +445,7 @@ ShaderMesh *ShaderMesh::createSimple(Mesh &m, ShaderMaterial *mat, const char * re->baseVertex = 0; re->numv = addVertices(m, 0, m.getFace().size(), f2vmap, vb.data(), ib.data(), ccb.chan.data(), ccb.chan.size()); - re->vertexData->createMem(re->numv, stride, data_size(ib), 0, vb.data(), ib.data()); + re->vertexData->initGvdMem(re->numv, stride, data_size(ib), 0, vb.data(), ib.data()); return sm; } diff --git a/prog/engine/sharedInclude/shaders/shader_layout.h b/prog/engine/sharedInclude/shaders/shader_layout.h index b3072eed7..353886c30 100644 --- a/prog/engine/sharedInclude/shaders/shader_layout.h +++ b/prog/engine/sharedInclude/shaders/shader_layout.h @@ -220,7 +220,7 @@ BINDUMP_BEGIN_LAYOUT(ShaderClass) // storages VecHolder shrefStorage; - VecHolder __unused1; + VecHolder staticTextureTypeBySlot; VecHolder __unused2; VecHolder chanStorage; VecHolder icStorage; diff --git a/prog/gameLibs/breakpad/sender/dagorStubs.cpp b/prog/gameLibs/breakpad/sender/dagorStubs.cpp index a8ba1b945..bb5e60531 100644 --- a/prog/gameLibs/breakpad/sender/dagorStubs.cpp +++ b/prog/gameLibs/breakpad/sender/dagorStubs.cpp @@ -7,10 +7,6 @@ void execute_delayed_action_on_main_thread(DelayedAction *, bool, int) {} -// zlib -extern "C" void *zcalloc(void * /*opaque*/, unsigned items, unsigned size) { return malloc(items * size); } -extern "C" void zcfree(void * /*opaque*/, void *ptr) { free(ptr); } - const char *dd_get_named_mount_path(const char *, int) { return nullptr; } const char *dd_resolve_named_mount_in_path(const char *fpath, const char *&mnt_path) { diff --git a/prog/gameLibs/camTrack/camTrack.cpp b/prog/gameLibs/camTrack/camTrack.cpp index b910cc312..e85f656ee 100644 --- a/prog/gameLibs/camTrack/camTrack.cpp +++ b/prog/gameLibs/camTrack/camTrack.cpp @@ -115,7 +115,7 @@ void camtrack::record(const char *filename) inline float fov_to_deg(float fov) { return RAD_TO_DEG * 2.f * atan(1.f / fov); } -void camtrack::update_record(float abs_time) +void camtrack::update_record(float abs_time, const TMatrix &itm) { if (!write_stream) return; @@ -126,7 +126,7 @@ void camtrack::update_record(float abs_time) d3d::getpersp(persp); CamRecord rec; rec.time = abs_time; - rec.itm = ::grs_cur_view.itm; + rec.itm = itm; rec.fov = fov_to_deg(persp.wk); write_stream->write(&rec, sizeof(CamRecord)); } diff --git a/prog/gameLibs/daSkies2/panoramaCompressor.cpp b/prog/gameLibs/daSkies2/panoramaCompressor.cpp index 0530ed56a..c4ef93101 100644 --- a/prog/gameLibs/daSkies2/panoramaCompressor.cpp +++ b/prog/gameLibs/daSkies2/panoramaCompressor.cpp @@ -40,7 +40,7 @@ void PanoramaCompressor::initCompression() auto bcType = get_texture_compression_type(compressFmt); bool isMobile = bcType == BcCompressor::ECompressionType::COMPRESSION_ETC2_RGBA; cloudsPanoramaCompressor = eastl::make_unique(bcType, 1, panoramaWidth, strideHeight, 1, isMobile ? etc2_sh : dxt5_sh); - G_ASSERT(cloudsPanoramaCompressor->getCompressionType() != BcCompressor::ECompressionType::COMPRESSION_ERR); + G_ASSERT(cloudsPanoramaCompressor->isValid()); } void PanoramaCompressor::updateCompressedTexture(Texture *dstTex, float rgbmScale) diff --git a/prog/gameLibs/daSkies2/shaders/clouds2/daCloudsApply.sh b/prog/gameLibs/daSkies2/shaders/clouds2/daCloudsApply.sh index 57417bf62..f3b4a27d2 100644 --- a/prog/gameLibs/daSkies2/shaders/clouds2/daCloudsApply.sh +++ b/prog/gameLibs/daSkies2/shaders/clouds2/daCloudsApply.sh @@ -6,6 +6,7 @@ include "skies_special_vision.sh" include "distanceToClouds2.sh" include "vr_reprojection.sh" include "use_custom_fog_sky.sh" +include "flexible_scale_rasterization.sh" float min_ground_offset; texture clouds_color; @@ -103,6 +104,8 @@ shader clouds2_apply, clouds2_apply_has_empty, clouds2_apply_no_empty INIT_ZNZFAR() DISTANCE_TO_CLOUDS2(ps) CLOSE_LAYER_EARLY_EXIT(ps) + USE_FSR(ps) + if (is_gather4_supported == supported || shader != clouds2_apply) { hlsl { @@ -195,8 +198,11 @@ shader clouds2_apply, clouds2_apply_has_empty, clouds2_apply_no_empty half4 apply_clouds_ps_main(VsOutput input, float4 screenpos, out float raw_depth) { float2 depth_texcoord = input.tc; - raw_depth = tex2Dlod(fullres_depth_gbuf, float4(input.tc.xy * fullres_depth_gbuf_transform.xy + fullres_depth_gbuf_transform.zw,0,0)).x; - + #ifdef FSR_DISTORTION + raw_depth = texelFetchOffset(fullres_depth_gbuf, screenpos.xy, 0, 0).x; + #else + raw_depth = tex2Dlod(fullres_depth_gbuf, float4(input.tc.xy * fullres_depth_gbuf_transform.xy + fullres_depth_gbuf_transform.zw,0,0)).x; + #endif // On DX10 we cannot use depth as a target and as a shader resouce at the same time. Do the depth test in the shader ##if !hardware.fsh_5_0 @@ -204,7 +210,6 @@ shader clouds2_apply, clouds2_apply_has_empty, clouds2_apply_no_empty return 0.0f; ##endif - float2 texcoord = input.tc; ##if use_bounding_vr_reprojection == on texcoord = vr_bounding_view_reproject_tc(texcoord,0); diff --git a/prog/gameLibs/dasModules/phys/physVars.cpp b/prog/gameLibs/dasModules/phys/physVars.cpp index 21fe350d6..f36e467a4 100644 --- a/prog/gameLibs/dasModules/phys/physVars.cpp +++ b/prog/gameLibs/dasModules/phys/physVars.cpp @@ -26,6 +26,12 @@ class PhysVarsModule final : public das::Module "bind_dascript::physvars_register_var"); das::addExtern(*this, lib, "registerPullVar", das::SideEffects::modifyArgument, "bind_dascript::physvars_register_pull_var"); + das::addExtern(*this, lib, "isVarPullable", das::SideEffects::accessExternal, + "bind_dascript::physvars_is_var_pullable"); + das::addExtern(*this, lib, "getVarsCount", das::SideEffects::accessExternal, + "bind_dascript::physvars_get_vars_count"); + das::addExtern(*this, lib, "getVarName", das::SideEffects::accessExternal, + "bind_dascript::physvars_get_var_name"); verifyAotReady(); } das::ModuleAotType aotRequire(das::TextWriter &tw) const override diff --git a/prog/gameLibs/dasModules/render/dagorDriver3dConsts.cpp b/prog/gameLibs/dasModules/render/dagorDriver3dConsts.cpp index 59ddf6da8..ccea32b10 100644 --- a/prog/gameLibs/dasModules/render/dagorDriver3dConsts.cpp +++ b/prog/gameLibs/dasModules/render/dagorDriver3dConsts.cpp @@ -75,7 +75,6 @@ void bind_driver_consts(das::Module &module) BIND_UINT_CONST(STAGE_VS) // bitfield BufferFlag - BIND_UINT_CONST(SBCF_SYSMEM) BIND_UINT_CONST(SBCF_DYNAMIC) BIND_UINT_CONST(SBCF_MAYBELOST) BIND_UINT_CONST(SBCF_ZEROMEM) diff --git a/prog/gameLibs/ecs/scripts/das/das_ecs.h b/prog/gameLibs/ecs/scripts/das/das_ecs.h index 1745098f6..db8f5fad3 100644 --- a/prog/gameLibs/ecs/scripts/das/das_ecs.h +++ b/prog/gameLibs/ecs/scripts/das/das_ecs.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -25,7 +26,7 @@ namespace bind_dascript struct LoadedScript final : public DasLoadedScript { using EsContextUniquePtr = das::shared_ptr; - eastl::set systems; + dag::VectorSet systems; eastl::vector queries; #if DAGOR_DBGLEVEL > 0 SimpleString fn; diff --git a/prog/gameLibs/ecs/scripts/das/das_ecs_bindings.cpp b/prog/gameLibs/ecs/scripts/das/das_ecs_bindings.cpp index a6cc5ed1c..de086061c 100644 --- a/prog/gameLibs/ecs/scripts/das/das_ecs_bindings.cpp +++ b/prog/gameLibs/ecs/scripts/das/das_ecs_bindings.cpp @@ -127,6 +127,7 @@ ECS::ECS() : das::Module("ecs") // ecs::EntityId> >("!=", lib, "NotEqu") ); das::addFunctionBasic(*this, lib); das::addConstant(*this, "INVALID_ENTITY_ID_VAL", ecs::ECS_INVALID_ENTITY_ID_VAL); + das::addConstant(*this, "INVALID_TEMPLATE_INDEX", ecs::INVALID_TEMPLATE_INDEX); addFunction(das::make_smart, bool, ecs::EntityId>>("!", lib, "BoolNot")); G_STATIC_ASSERT((eastl::is_same::value)); das::addExtern(*this, lib, "uint", das::SideEffects::none, "bind_dascript::castEid"); @@ -159,6 +160,7 @@ ECS::ECS() : das::Module("ecs") ADD_EXTERN(destroyEntity, das::SideEffects::modifyExternal); ADD_EXTERN(doesEntityExist, das::SideEffects::accessExternal); ADD_EXTERN(isLoadingEntity, das::SideEffects::accessExternal); + ADD_EXTERN(getEntityTemplateId, das::SideEffects::accessExternal); ADD_EXTERN(getEntityTemplateName, das::SideEffects::accessExternal); ADD_EXTERN(getEntityFutureTemplateName, das::SideEffects::accessExternal); diff --git a/prog/gameLibs/ecs/scripts/das/das_es.cpp b/prog/gameLibs/ecs/scripts/das/das_es.cpp index c8e15ea20..c65e331d4 100644 --- a/prog/gameLibs/ecs/scripts/das/das_es.cpp +++ b/prog/gameLibs/ecs/scripts/das/das_es.cpp @@ -711,7 +711,7 @@ inline bool entity_system_is_das(ecs::EntitySystemDesc *desc) } static void das_es_desc_deleter(ecs::EntitySystemDesc *desc); -uint32_t ESModuleGroupData::es_resolve_function_ptrs(EsContext *ctx, eastl::set &systems, const char *fn, +uint32_t ESModuleGroupData::es_resolve_function_ptrs(EsContext *ctx, dag::VectorSet &systems, const char *fn, uint64_t load_start_time, AotMode aot_mode, AotModeIsRequired aot_mode_is_required, DasEcsStatistics &stats) { uint32_t cnt = 0; @@ -1232,9 +1232,9 @@ struct EsFunctionAnnotation final : das::FunctionAnnotation void LoadedScript::unload() { - if (systems.size()) + if (!systems.empty()) { - eastl::set systemsCopy = eastl::move(systems); + auto systemsCopy = eastl::move(systems); for (auto system : systemsCopy) { remove_system_from_list(system); @@ -1924,6 +1924,7 @@ bool enqueue_das_script(const char *fname) bool load_entry_script(const char *entry_point_name, TInitDas init, LoadEntryScriptCtx ctx) { const uint64_t startTime = profile_ref_ticks(); + scripts.statistics = {}; // reset das load stats from previous load const size_t memUsed = dagor_memory_stat::get_memory_allocated(true); bool res = false; if (globally_load_threads_num > 1) diff --git a/prog/gameLibs/ecs/scripts/das/das_es.h b/prog/gameLibs/ecs/scripts/das/das_es.h index b94e12572..db269337c 100644 --- a/prog/gameLibs/ecs/scripts/das/das_es.h +++ b/prog/gameLibs/ecs/scripts/das/das_es.h @@ -141,7 +141,7 @@ struct ESModuleGroupData : das::ModuleGroupUserData eastl::vector unresolvedQueries; das::DebugInfoHelper *helper = nullptr; uint32_t hashedScriptName = 0; - uint32_t es_resolve_function_ptrs(EsContext *ctx, eastl::set &systems, const char *fname, + uint32_t es_resolve_function_ptrs(EsContext *ctx, dag::VectorSet &systems, const char *fname, uint64_t load_start_time, AotMode aot_mode, AotModeIsRequired aot_mode_is_required, DasEcsStatistics &stats); }; diff --git a/prog/gameLibs/fftWater/flowMap.cpp b/prog/gameLibs/fftWater/flowMap.cpp index ca1224fb9..b5ce9f498 100644 --- a/prog/gameLibs/fftWater/flowMap.cpp +++ b/prog/gameLibs/fftWater/flowMap.cpp @@ -28,6 +28,7 @@ VAR(water_flowmap_strength) \ VAR(water_flowmap_strength_add) \ VAR(water_flowmap_foam) \ + VAR(water_flowmap_foam_color) \ VAR(water_flowmap_foam_tiling) \ VAR(water_flowmap_depth) \ VAR(water_flowmap_slope) \ @@ -197,6 +198,7 @@ void set_flowmap_foam_params(FlowmapParams &flowmap_params) return; ShaderGlobal::set_color4(water_flowmap_foamVarId, flowmap_params.flowmapFoam); + ShaderGlobal::set_color4(water_flowmap_foam_colorVarId, flowmap_params.flowmapFoamColor); ShaderGlobal::set_real(water_flowmap_foam_tilingVarId, flowmap_params.flowmapFoamTiling); ShaderGlobal::set_color4(water_flowmap_depthVarId, flowmap_params.flowmapDepth); ShaderGlobal::set_real(water_flowmap_slopeVarId, flowmap_params.flowmapSlope); @@ -336,18 +338,7 @@ void flowmap_floodfill(int texSize, Texture *heightmapTex, Texture *floodfillTex { uint16_t *flood = (uint16_t *)(floodfillData + x * floodfillStrideX + y * floodfillStrideY); if (flood[0] <= 1) - { - if ((x - 1 >= 0) && (flood[-1] > 1)) - flood[0] = flood[-1]; - else if ((x + 1 < texSize) && (flood[1] > 1)) - flood[0] = flood[1]; - else if ((y - 1 >= 0) && (flood[-texSize] > 1)) - flood[0] = flood[-texSize]; - else if ((y + 1 < texSize) && (flood[texSize] > 1)) - flood[0] = flood[texSize]; - else - flood[0] = 0; - } + flood[0] = 0x8080; } } } diff --git a/prog/gameLibs/gamePhys/phys/destructableObject.cpp b/prog/gameLibs/gamePhys/phys/destructableObject.cpp index 1ca5a9bd1..3bed88d78 100644 --- a/prog/gameLibs/gamePhys/phys/destructableObject.cpp +++ b/prog/gameLibs/gamePhys/phys/destructableObject.cpp @@ -254,7 +254,8 @@ void clear() void removeDestructableById(id_t id) { - if (id != INVALID_ID && destructablesListAllocator.isValidPtr(id)) + if (id != INVALID_ID && eastl::find(destructablesList.begin(), destructablesList.end(), id, + [](auto &rec, id_t id) { return rec.get() == id; }) != destructablesList.end()) static_cast(id)->markForDelete(); } diff --git a/prog/gameLibs/gamePhys/phys/physVars.cpp b/prog/gameLibs/gamePhys/phys/physVars.cpp index 4a400433f..82d348013 100644 --- a/prog/gameLibs/gamePhys/phys/physVars.cpp +++ b/prog/gameLibs/gamePhys/phys/physVars.cpp @@ -24,10 +24,4 @@ float PhysVars::getVar(int var_id) const return vars[var_id]; } -void PhysVars::setVar(int var_id, float val) -{ - G_ASSERTF_RETURN(var_id >= 0 && var_id < vars.size(), , "Invalid var_id %d (%d total)", var_id, (int)vars.size()); - vars[var_id] = val; -} - void PhysVars::setupVar(const char *name, float val) { setVar(registerVar(name, val), val); } diff --git a/prog/gameLibs/gpuObjects/gpuObjects.cpp b/prog/gameLibs/gpuObjects/gpuObjects.cpp index 36c60cd41..b04ec88aa 100644 --- a/prog/gameLibs/gpuObjects/gpuObjects.cpp +++ b/prog/gameLibs/gpuObjects/gpuObjects.cpp @@ -666,10 +666,10 @@ void GpuObjects::setGpuInstancingRelemParams(int cascade_no) RenderableInstanceLodsResource *res = rendinst::getRIGenExtraRes(objectIds[objIdx]); bool lodExist = lod < res->lods.size(); - if (lodExist) + dag::ConstSpan elems = + lodExist ? res->lods[lod].scene->getMesh()->getMesh()->getMesh()->getAllElems() : dag::ConstSpan{}; + if (elems.size()) { - const ShaderMesh *m = res->lods[lod].scene->getMesh()->getMesh()->getMesh(); - dag::ConstSpan elems = m->getAllElems(); const ShaderMesh::RElem &elem = elems[0]; // index_count_per_instance, start_index_location, base vertex, object offset gpuObjectData[GPUOBJDATA_SIZE * (objIdx * MAX_LODS + lod) + 0] = Point4(elem.numf * 3, elem.si, elem.baseVertex, objOffset); diff --git a/prog/gameLibs/hudprim/hudPrimitives.cpp b/prog/gameLibs/hudprim/hudPrimitives.cpp index 3926d6c9c..032be10d2 100644 --- a/prog/gameLibs/hudprim/hudPrimitives.cpp +++ b/prog/gameLibs/hudprim/hudPrimitives.cpp @@ -671,6 +671,8 @@ void HudPrimitives::renderPoly(TEXTUREID texture_id, E3DCOLOR color, dag::ConstS vtx.resize(p.size()); triangulate(p, ind); + if (ind.empty()) + return; G_ASSERT((ind.size() % 3) == 0); PREPARE_FILL_PARAMS(); diff --git a/prog/gameLibs/landMesh/biomeQuery.cpp b/prog/gameLibs/landMesh/biomeQuery.cpp index a1028afe7..8747657ad 100644 --- a/prog/gameLibs/landMesh/biomeQuery.cpp +++ b/prog/gameLibs/landMesh/biomeQuery.cpp @@ -6,7 +6,6 @@ #include "math/dag_mathUtils.h" #include "math/dag_hlsl_floatx.h" #include "math/integer/dag_IPoint4.h" -#include "3d/dag_render.h" // only for console utils #include "3d/dag_drv3d.h" #include "3d/dag_drv3dCmd.h" #include "3d/dag_drv3dReset.h" @@ -454,44 +453,42 @@ static void biome_query_after_device_reset(bool) biome_query_ctx->afterDeviceReset(); } -static bool biome_query_console_handler(const char *argv[], int argc) +#if DAGOR_DBGLEVEL > 0 +void biome_query::console_query_pos(const char *argv[], int argc) { BIOME_QUERY_BLOCK; if (!biome_query_ctx) - return false; + return; - int found = 0; - CONSOLE_CHECK_NAME("biome_query", "queryPos", 1, 5) - { - if (argc < 4) - console::print("Usage: biome_query.queryPos x y z [radius=1]"); - else - { - Point3 pos(atof(argv[1]), atof(argv[2]), atof(argv[3])); - float rad = argc >= 5 ? atof(argv[4]) : 1.f; - int id = biome_query::query(pos, rad); -#if DAGOR_DBGLEVEL > 0 - console_query_id = id; - console_query_elapsed_frames = 0; -#endif - console::print_d("Query added: id: %d, pos: (%.3f, %.3f, %.3f), rad: %.3f", id, pos.x, pos.y, pos.z, rad); - } - } - CONSOLE_CHECK_NAME("biome_query", "queryCameraPos", 1, 2) + if (argc < 4) + console::print("Usage: biome_query.queryPos x y z [radius=1]"); + else { - TMatrix itm = ::grs_cur_view.itm; - Point3 pos = itm.getcol(3); - float rad = argc >= 2 ? atof(argv[1]) : 1.f; + Point3 pos(atof(argv[1]), atof(argv[2]), atof(argv[3])); + float rad = argc >= 5 ? atof(argv[4]) : 1.f; int id = biome_query::query(pos, rad); -#if DAGOR_DBGLEVEL > 0 console_query_id = id; console_query_elapsed_frames = 0; -#endif console::print_d("Query added: id: %d, pos: (%.3f, %.3f, %.3f), rad: %.3f", id, pos.x, pos.y, pos.z, rad); } - return found; } -REGISTER_CONSOLE_HANDLER(biome_query_console_handler); +void biome_query::console_query_camera_pos(const char *argv[], int argc, const TMatrix &view_itm) +{ + if (!biome_query_ctx) + return; + + Point3 pos = view_itm.getcol(3); + float rad = argc >= 2 ? atof(argv[1]) : 1.f; + int id = biome_query::query(pos, rad); + console_query_id = id; + console_query_elapsed_frames = 0; + console::print_d("Query added: id: %d, pos: (%.3f, %.3f, %.3f), rad: %.3f", id, pos.x, pos.y, pos.z, rad); +} +#else +void biome_query::console_query_pos(const char *[], int) {} +void biome_query::console_query_camera_pos(const char *[], int, const TMatrix &) {} +#endif + REGISTER_D3D_BEFORE_RESET_FUNC(biome_query_before_device_reset); REGISTER_D3D_AFTER_RESET_FUNC(biome_query_after_device_reset); diff --git a/prog/gameLibs/landMesh/jamfile b/prog/gameLibs/landMesh/jamfile index 4923c1089..116f6988e 100644 --- a/prog/gameLibs/landMesh/jamfile +++ b/prog/gameLibs/landMesh/jamfile @@ -27,6 +27,7 @@ Sources = AddIncludes = $(Root)/prog/gameLibs/publicInclude $(Root)/prog/gameLibs/gamePhys/collision + $(Root)/prog/engine/sharedInclude ; UseProgLibs = diff --git a/prog/gameLibs/landMesh/lmeshManager.cpp b/prog/gameLibs/landMesh/lmeshManager.cpp index 07123d2f8..44273a714 100644 --- a/prog/gameLibs/landMesh/lmeshManager.cpp +++ b/prog/gameLibs/landMesh/lmeshManager.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #define MIN_TILE_SIZE 0.5 @@ -907,7 +908,7 @@ bool LandMeshManager::loadMeshData(IGenLoad &cb) lmeshVData.resize(totalLmeshVert[lod] * destStride); lmeshIData.resize(totalLmeshIndices[lod]); - unsigned flags = 0; + unsigned flags = VDATA_D3D_RESET_READY; int lodMask = lod <= maxLodUsed ? (VDATA_LOD0 << lod) : VDATA_COMBINED; for (int indicesOfs = 0, i = 0; i < vdataCount; ++i) { @@ -979,7 +980,7 @@ bool LandMeshManager::loadMeshData(IGenLoad &cb) } G_ASSERT((flags & (VDATA_I32 | VDATA_I16)) != (VDATA_I32 | VDATA_I16)); - lmeshVertexData[lod].createMem(totalLmeshVert[lod], destStride, lmeshIData.size(), flags, lmeshVData.data(), lmeshIData.data()); + lmeshVertexData[lod].initGvdMem(totalLmeshVert[lod], destStride, lmeshIData.size(), flags, lmeshVData.data(), lmeshIData.data()); } debug("re-encoded VB in %dus", get_time_usec(reft)); @@ -1002,7 +1003,7 @@ bool LandMeshManager::loadMeshData(IGenLoad &cb) { G_ASSERT(i > firstLmeshVdata + maxLodUsed || i < firstLmeshVdata); G_ASSERT(i != firstCombinedVdata); - vdata[i].createMem(*vbData, smvd->getGlobVData(i)->getStride(), *ibData, 0, vbData + 1, ibData + 1); + vdata[i].initGvdMem(*vbData, smvd->getGlobVData(i)->getStride(), *ibData, VDATA_D3D_RESET_READY, vbData + 1, ibData + 1); } } for (int i = 0; i < vdata.size(); ++i) @@ -1115,8 +1116,29 @@ void LandClassDetailTextures::resetGrassMask(const DataBlock &grassBlk, const ch ::acquire_managed_tex(grassMaskTexId); } -void LandMeshManager::afterDeviceReset() +void LandMeshManager::afterDeviceReset(LandMeshRenderer *lrend, bool full_reset) { + if (full_reset) + { + int t0 = get_time_msec(); + + // reload mesh data + FullFileLoadCB crd(srcFileName); + crd.seekto(srcFileMeshMapOfs); + + if (lrend) + lrend->resetOptSceneAndStates(); + clear_and_shrink(cells); + lmeshVdata = nullptr; + combinedVdata = nullptr; + smvd = nullptr; + + fatal_context_push("landMesh::mesh"); + loadMeshData(crd); + fatal_context_pop(); + debug("reloaded land mesh data for %d msec (from %s:0x%x)", get_time_msec() - t0, srcFileName, srcFileMeshMapOfs); + } + for (auto &land : landClasses) { if (land.detailsCB) @@ -1305,6 +1327,8 @@ bool LandMeshManager::loadDump(IGenLoad &loadCb, IMemAlloc *rayTracerAllocator, fatal_context_push("landMesh::mesh"); G_ASSERT(loadCb.tell() == meshMapOfs); // loadCb.seekto(meshMapOfs); + srcFileMeshMapOfs = meshMapOfs; + srcFileName = dagor_fname_map_add_fn(loadCb.getTargetName()); loadMeshData(loadCb); fatal_context_pop(); fatal_context_push("landMesh::detail"); diff --git a/prog/gameLibs/landMesh/lmeshRenderer.cpp b/prog/gameLibs/landMesh/lmeshRenderer.cpp index 542429ac9..bb0ac11b4 100644 --- a/prog/gameLibs/landMesh/lmeshRenderer.cpp +++ b/prog/gameLibs/landMesh/lmeshRenderer.cpp @@ -568,7 +568,7 @@ LandMeshRenderer::LandMeshRenderer(LandMeshManager &provider, dag::ConstSpan 0) - physmatIdsBuf = d3d::buffers::create_one_frame_sr_structured(sizeof(uint32_t), DET_TEX_NUM * 4 * 4, "physmats_IDS"); + physmatIdsBuf = d3d::buffers::create_one_frame_sr_byte_address(DET_TEX_NUM * 4 * 4, "physmats_IDS"); else physmatIdsBuf = NULL; @@ -1932,6 +1932,16 @@ static bool matrices_are_equal(const TMatrix4 &l, const TMatrix4 &r) static bool after_lost_device = false; void LandMeshRenderer::afterLostDevice() { after_lost_device = true; } #endif +void LandMeshRenderer::resetOptSceneAndStates() +{ + if (optScn) + delete[] optScn; + optScn = nullptr; + if (cellStates) + delete[] cellStates; + cellStates = NULL; +} + enum { LAST_MIRROR = 8, diff --git a/prog/gameLibs/landMesh/virtualtexture.cpp b/prog/gameLibs/landMesh/virtualtexture.cpp index 102dfeb7e..a89e49162 100644 --- a/prog/gameLibs/landMesh/virtualtexture.cpp +++ b/prog/gameLibs/landMesh/virtualtexture.cpp @@ -385,7 +385,8 @@ class ClipmapImpl void copyUAVFeedback(); const UniqueTexHolder &getCache(int at) { return cache[at]; } // for debug const UniqueTex &getIndirection() const { return currentContext->indirection; } // for debug - void createCaches(const uint32_t *formats, uint32_t cnt, const uint32_t *buffer_formats, uint32_t buffer_cnt); + void createCaches(const uint32_t *formats, const uint32_t *uncompressed_formats, uint32_t cnt, const uint32_t *buffer_formats, + uint32_t buffer_cnt); void afterReset(); static bool is_uav_supported(); @@ -635,9 +636,10 @@ void Clipmap::endUAVFeedback(int reg_no) { clipmapImpl->endUAVFeedback(reg_no); void Clipmap::copyUAVFeedback() { clipmapImpl->copyUAVFeedback(); } const UniqueTexHolder &Clipmap::getCache(int at) { return clipmapImpl->getCache(at); } const UniqueTex &Clipmap::getIndirection() const { return clipmapImpl->getIndirection(); } -void Clipmap::createCaches(const uint32_t *formats, uint32_t cnt, const uint32_t *buffer_formats, uint32_t buffer_cnt) +void Clipmap::createCaches(const uint32_t *formats, const uint32_t *uncompressed_formats, uint32_t cnt, const uint32_t *buffer_formats, + uint32_t buffer_cnt) { - clipmapImpl->createCaches(formats, cnt, buffer_formats, buffer_cnt); + clipmapImpl->createCaches(formats, uncompressed_formats, cnt, buffer_formats, buffer_cnt); } void Clipmap::afterReset() { clipmapImpl->afterReset(); } @@ -2846,7 +2848,7 @@ void ClipmapImpl::finalizeCompressionQueue() bool hasUncompressed = false; for (int ci = 0; ci < cacheCnt; ++ci) - if (compressor[ci] && compressor[ci]->getCompressionType() != BcCompressor::COMPRESSION_ERR) + if (compressor[ci] && compressor[ci]->isValid()) { for (int mipNo = 0; mipNo < mipCnt; mipNo++) compressor[ci]->updateFromMip(bufferTex[ci].getTexId(), mipNo, mipNo, compressionQueue.size()); @@ -2857,7 +2859,7 @@ void ClipmapImpl::finalizeCompressionQueue() G_ASSERT(compressionQueue.size() <= COMPRESS_QUEUE_SIZE); // fixme: actually we need compressors for each format, not for each texture! for (int ci = 0; ci < cacheCnt; ++ci) - if (compressor[ci] && compressor[ci]->getCompressionType() != BcCompressor::COMPRESSION_ERR) + if (compressor[ci] && compressor[ci]->isValid()) { for (int mipNo = 0; mipNo < mipCnt; mipNo++) for (int i = 0; i < compressionQueue.size(); ++i) @@ -2886,7 +2888,7 @@ void ClipmapImpl::finalizeCompressionQueue() for (int mipNo = 0; mipNo < mipCnt; mipNo++) { for (int ci = 0; ci < cacheCnt; ++ci) - d3d::set_render_target(ci, compressor[ci] ? nullptr : cache[ci].getTex2D(), mipNo); + d3d::set_render_target(ci, (compressor[ci] && compressor[ci]->isValid()) ? nullptr : cache[ci].getTex2D(), mipNo); directUncompressElem->setStates(0, true); d3d::set_vs_const1(51, mipNo, 0, 0, 0); d3d::set_vs_const(52, &quads[0].x, quads.size()); @@ -3938,7 +3940,8 @@ bool ClipmapImpl::getMaximumBBox(BBox2 &ret) const return true; } -void ClipmapImpl::createCaches(const uint32_t *formats, uint32_t cnt, const uint32_t *buffer_formats, uint32_t buffer_cnt) +void ClipmapImpl::createCaches(const uint32_t *formats, const uint32_t *uncompressed_formats, uint32_t cnt, + const uint32_t *buffer_formats, uint32_t buffer_cnt) { cacheCnt = min(cnt, (uint32_t)cache.size()); bufferCnt = min(buffer_cnt, (uint32_t)bufferTex.size()); @@ -4008,9 +4011,11 @@ void ClipmapImpl::createCaches(const uint32_t *formats, uint32_t cnt, const uint } String cacheTexName(30, "cache_tex%d%s", ci, postfix.str()); - cache[ci] = dag::create_tex(nullptr, cacheDimX, cacheDimY, - formats[ci] | (compressor[ci] ? TEXCF_UPDATE_DESTINATION : TEXCF_RTARGET) | TEXCF_CLEAR_ON_CREATE, max(mipCnt, 1 + PS4_ANISO_WA), - cacheTexName); + cache[ci].close(); + bool hasCompressor = compressor[ci] && compressor[ci]->isValid(); + uint32_t texFormat = + (hasCompressor ? (formats[ci] | TEXCF_UPDATE_DESTINATION) : (uncompressed_formats[ci] | TEXCF_RTARGET)) | TEXCF_CLEAR_ON_CREATE; + cache[ci] = dag::create_tex(nullptr, cacheDimX, cacheDimY, texFormat, max(mipCnt, 1 + PS4_ANISO_WA), cacheTexName); d3d_err(cache[ci].getTex2D()); cache[ci].getTex2D()->setAnisotropy(cacheAnisotropy); if (cacheAnisotropy != ::dgs_tex_anisotropy) diff --git a/prog/gameLibs/publicInclude/camTrack/camTrack.h b/prog/gameLibs/publicInclude/camTrack/camTrack.h index 3d19028af..9e4806bb7 100644 --- a/prog/gameLibs/publicInclude/camTrack/camTrack.h +++ b/prog/gameLibs/publicInclude/camTrack/camTrack.h @@ -13,7 +13,7 @@ typedef void *handle_t; const handle_t INVALID_HANDLE = NULL; void record(const char *filename); -void update_record(float abs_time); +void update_record(float abs_time, const TMatrix &itm); void stop_record(); handle_t load_track(const char *filename); diff --git a/prog/gameLibs/publicInclude/dasModules/aotDm.h b/prog/gameLibs/publicInclude/dasModules/aotDm.h index 139ee3a2f..e787ae0ef 100644 --- a/prog/gameLibs/publicInclude/dasModules/aotDm.h +++ b/prog/gameLibs/publicInclude/dasModules/aotDm.h @@ -191,4 +191,6 @@ inline float get_part_hp_prop_value(const dm::DamageModelData &dm_data, const dm return props ? props->hp : 0.f; } +inline const char *das_get_part_name(const dm::DamagePartProps &props) { return dm::get_part_name(props); } + } // namespace bind_dascript diff --git a/prog/gameLibs/publicInclude/dasModules/aotEcs.h b/prog/gameLibs/publicInclude/dasModules/aotEcs.h index a4f553f2c..007f030e9 100644 --- a/prog/gameLibs/publicInclude/dasModules/aotEcs.h +++ b/prog/gameLibs/publicInclude/dasModules/aotEcs.h @@ -549,6 +549,7 @@ inline bool hasHint(ecs::EntityId eid, const char *key, uint32_t key_hash) return g_entity_mgr->has(eid, ecs::HashedConstString({key, key_hash})); } inline bool has(ecs::EntityId eid, const char *s) { return hasHint(eid, s, ECS_HASH_SLOW(s ? s : "").hash); } +inline ecs::template_t getEntityTemplateId(ecs::EntityId id) { return g_entity_mgr->getEntityTemplateId(id); } inline const char *getEntityTemplateName(ecs::EntityId id) { return g_entity_mgr->getEntityTemplateName(id); } inline const char *getEntityFutureTemplateName(ecs::EntityId id) { return g_entity_mgr->getEntityFutureTemplateName(id); } diff --git a/prog/gameLibs/publicInclude/dasModules/aotPhysVars.h b/prog/gameLibs/publicInclude/dasModules/aotPhysVars.h index 6929dda2e..dddd7a6c4 100644 --- a/prog/gameLibs/publicInclude/dasModules/aotPhysVars.h +++ b/prog/gameLibs/publicInclude/dasModules/aotPhysVars.h @@ -36,4 +36,11 @@ inline int physvars_register_pull_var(PhysVars &phys_vars, const char *name, flo { return phys_vars.registerPullVar(name, val); } + +inline bool physvars_is_var_pullable(const PhysVars &phys_vars, const int var_id) { return phys_vars.isVarPullable(var_id); } + +inline int physvars_get_vars_count(const PhysVars &phys_vars) { return phys_vars.getVarsCount(); } + +inline const char *physvars_get_var_name(const PhysVars &phys_vars, const int var_id) { return phys_vars.getVarName(var_id); } + }; // namespace bind_dascript diff --git a/prog/gameLibs/publicInclude/fftWater/fftWater.h b/prog/gameLibs/publicInclude/fftWater/fftWater.h index 81db4271b..ec6093712 100644 --- a/prog/gameLibs/publicInclude/fftWater/fftWater.h +++ b/prog/gameLibs/publicInclude/fftWater/fftWater.h @@ -144,10 +144,12 @@ struct FlowmapParams String texName; Point4 texArea; float windStrength = 0.2f; + float flowmapRange = 100; float flowmapFading = 3; Point4 flowmapStrength = Point4(1, 5, 0.5f, 0); Point4 flowmapStrengthAdd = Point4(0.5f, 1, 1, 0.3f); Point4 flowmapFoam = Point4(5, 10, 0.5f, 0.1f); + Point3 flowmapFoamColor = Point3(1, 1, 1); float flowmapFoamTiling = 1; Point4 flowmapDepth = Point4(1, 0.1f, 0.3f, 1); float flowmapSlope = 1; diff --git a/prog/gameLibs/publicInclude/gamePhys/phys/physVars.h b/prog/gameLibs/publicInclude/gamePhys/phys/physVars.h index f234d5126..4b541647e 100644 --- a/prog/gameLibs/publicInclude/gamePhys/phys/physVars.h +++ b/prog/gameLibs/publicInclude/gamePhys/phys/physVars.h @@ -8,6 +8,7 @@ #include #include #include +#include class PhysVars { @@ -37,3 +38,9 @@ class PhysVars inline float PhysVars::getVarUnsafe(int var_id) const { return vars[var_id]; } inline int PhysVars::getVarId(const char *name) const { return names.getNameId(name); } inline bool PhysVars::isVarPullable(int var_id) const { return varsPullable.test(var_id, false); } + +inline void PhysVars::setVar(int var_id, float val) +{ + G_ASSERTF_RETURN(var_id < vars.size() && check_finite(val), , "Invalid var_id %d/%d or val=%.9f", var_id, vars.size(), val); + vars[var_id] = val; +} diff --git a/prog/gameLibs/publicInclude/landMesh/biomeQuery.h b/prog/gameLibs/publicInclude/landMesh/biomeQuery.h index 87eb9267d..53d33c234 100644 --- a/prog/gameLibs/publicInclude/landMesh/biomeQuery.h +++ b/prog/gameLibs/publicInclude/landMesh/biomeQuery.h @@ -31,4 +31,6 @@ const char *get_biome_group_name(int biome_group_id); int get_num_biome_groups(); int get_max_num_biome_groups(); void set_details_cb(Sbuffer *buffer); +void console_query_pos(const char *argv[], int argc); +void console_query_camera_pos(const char *argv[], int argc, const TMatrix &view_itm); } // namespace biome_query diff --git a/prog/gameLibs/publicInclude/landMesh/lmeshManager.h b/prog/gameLibs/publicInclude/landMesh/lmeshManager.h index 00be4a888..bf134ee4f 100644 --- a/prog/gameLibs/publicInclude/landMesh/lmeshManager.h +++ b/prog/gameLibs/publicInclude/landMesh/lmeshManager.h @@ -128,6 +128,8 @@ class LandMeshManager int visRange; bool toolsInternal; + unsigned srcFileMeshMapOfs = 0; + const char *srcFileName = nullptr; void close(); bool loadMeshData(IGenLoad &loadCb); @@ -154,7 +156,7 @@ class LandMeshManager if (holesMgr) holesMgr->clearHoles(); } - void afterDeviceReset(); + void afterDeviceReset(LandMeshRenderer *lrend, bool full_reset); void setHmapLodDistance(int lodD); int getHmapLodDistance() const; bool loadHeightmapDump(IGenLoad &loadCb, bool load_render_data); diff --git a/prog/gameLibs/publicInclude/landMesh/lmeshRenderer.h b/prog/gameLibs/publicInclude/landMesh/lmeshRenderer.h index 40e0d0201..83e7f6f13 100644 --- a/prog/gameLibs/publicInclude/landMesh/lmeshRenderer.h +++ b/prog/gameLibs/publicInclude/landMesh/lmeshRenderer.h @@ -114,6 +114,7 @@ class LandMeshRenderer bool checkVerLabel() { return verLabel == VER_LABEL; } + void resetOptSceneAndStates(); void prepare(LandMeshManager &provider, const Point3 &view_pos, float hmap_camera_height); // void set_land_classes(dag::ConstSpan land_classes); diff --git a/prog/gameLibs/publicInclude/landMesh/virtualtexture.h b/prog/gameLibs/publicInclude/landMesh/virtualtexture.h index d2040c866..af666b1ec 100644 --- a/prog/gameLibs/publicInclude/landMesh/virtualtexture.h +++ b/prog/gameLibs/publicInclude/landMesh/virtualtexture.h @@ -176,7 +176,8 @@ class Clipmap void copyUAVFeedback(); const UniqueTexHolder &getCache(int at); const UniqueTex &getIndirection() const; - void createCaches(const uint32_t *formats, uint32_t cnt, const uint32_t *buffer_formats, uint32_t buffer_cnt); + void createCaches(const uint32_t *formats, const uint32_t *uncompressed_formats, uint32_t cnt, const uint32_t *buffer_formats, + uint32_t buffer_cnt); void afterReset(); static bool is_uav_supported(); diff --git a/prog/gameLibs/publicInclude/quirrel/sqDebugConfig/sqDebugConfig.h b/prog/gameLibs/publicInclude/quirrel/sqDebugConfig/sqDebugConfig.h new file mode 100644 index 000000000..0fa1247aa --- /dev/null +++ b/prog/gameLibs/publicInclude/quirrel/sqDebugConfig/sqDebugConfig.h @@ -0,0 +1,10 @@ +#pragma once + +class SqModules; + +namespace debug_config +{ +void raise_screenshot_apply_flag(); +bool was_screenshot_applied_to_config(); +void register_debug_config(SqModules *module_mgr); +} // namespace debug_config diff --git a/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h b/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h index 9e8b2a6ab..eb4f78f14 100644 --- a/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h +++ b/prog/gameLibs/publicInclude/rendInst/rendInstCollision.h @@ -140,6 +140,9 @@ bool traceTransparencyRayRIGenNormalizedWithDist(const Point3 &pos, const Point3 bool traceTransparencyRayRIGenNormalized(const Point3 &pos, const Point3 &dir, float mint, float transparency_threshold, PhysMat::MatID ray_mat = PHYSMAT_INVALID, rendinst::RendInstDesc *ri_desc = nullptr, int *out_mat_id = nullptr, float *out_transparency = nullptr, bool check_canopy = true); +bool traceTransparencyRayRIGenNormalizedAllLayers(const Point3 &pos, const Point3 &dir, float mint, float transparency_threshold, + PhysMat::MatID ray_mat = PHYSMAT_INVALID, rendinst::RendInstDesc *ri_desc = nullptr, int *out_mat_id = nullptr, + float *out_transparency = nullptr, bool check_canopy = true, float min_height_second_layer = 1.f); inline bool traceRayRendInstsNormalized(dag::Span traces, bool = false, bool trace_meshes = false, rendinst::RendInstDesc *ri_desc = nullptr, bool trace_trees = false, int ray_mat_id = -1, const TraceMeshFaces *ri_cache = nullptr) diff --git a/prog/gameLibs/publicInclude/rendInst/rendInstGenRender.h b/prog/gameLibs/publicInclude/rendInst/rendInstGenRender.h index 1cdb5945a..fc173d74e 100644 --- a/prog/gameLibs/publicInclude/rendInst/rendInstGenRender.h +++ b/prog/gameLibs/publicInclude/rendInst/rendInstGenRender.h @@ -20,7 +20,7 @@ namespace rendinst::render { inline constexpr int MAX_LOD_COUNT_WITH_ALPHA = rendinst::MAX_LOD_COUNT + 1; -inline constexpr int INSTANCING_TEXREG = 12; +inline constexpr int INSTANCING_TEXREG = 14; inline constexpr int GPU_INSTANCING_OFSBUFFER_TEXREG = 11; inline constexpr int TREECROWN_TEXREG = 16; diff --git a/prog/gameLibs/publicInclude/render/bcCompressor.h b/prog/gameLibs/publicInclude/render/bcCompressor.h index 6a9ebc7c1..1b5b80509 100644 --- a/prog/gameLibs/publicInclude/render/bcCompressor.h +++ b/prog/gameLibs/publicInclude/render/bcCompressor.h @@ -60,6 +60,7 @@ class BcCompressor void releaseBuffer(); // destroy buffer texture ECompressionType getCompressionType() const; + bool isValid() const; static bool isAvailable(ECompressionType format); diff --git a/prog/gameLibs/publicInclude/render/daBfg/detail/access.h b/prog/gameLibs/publicInclude/render/daBfg/detail/access.h index 223845e38..490f3080b 100644 --- a/prog/gameLibs/publicInclude/render/daBfg/detail/access.h +++ b/prog/gameLibs/publicInclude/render/daBfg/detail/access.h @@ -11,7 +11,7 @@ namespace dabfg { -enum class Access : uint32_t +enum class Access : uint8_t { UNKNOWN, READ_ONLY, diff --git a/prog/gameLibs/publicInclude/render/daBfg/stage.h b/prog/gameLibs/publicInclude/render/daBfg/stage.h index 8876afb5d..b62c4ebf8 100644 --- a/prog/gameLibs/publicInclude/render/daBfg/stage.h +++ b/prog/gameLibs/publicInclude/render/daBfg/stage.h @@ -17,7 +17,7 @@ namespace dabfg * Part of the information required for daBfg to place barriers. * Note that this is a flags enum, so you can combine multiple stages. */ -enum class Stage : uint32_t +enum class Stage : uint8_t { /** * For legacy code only. Will suppress a barrier before this usage diff --git a/prog/gameLibs/publicInclude/render/daBfg/usage.h b/prog/gameLibs/publicInclude/render/daBfg/usage.h index 4e6de2a3a..130147845 100644 --- a/prog/gameLibs/publicInclude/render/daBfg/usage.h +++ b/prog/gameLibs/publicInclude/render/daBfg/usage.h @@ -15,7 +15,7 @@ namespace dabfg * \brief Describes the way a node uses a resource. * Part of the information required for daBfg to place barriers. */ -enum class Usage : uint32_t +enum class Usage : uint8_t { /** * For legacy code only, will suppress a barrier before this usage diff --git a/prog/gameLibs/publicInclude/render/dstReadbackLights.h b/prog/gameLibs/publicInclude/render/dstReadbackLights.h index b6783aed6..9d3156d9d 100644 --- a/prog/gameLibs/publicInclude/render/dstReadbackLights.h +++ b/prog/gameLibs/publicInclude/render/dstReadbackLights.h @@ -9,10 +9,10 @@ #include #include #include -#include #include #include <3d/dag_ringCPUQueryLock.h> +#include class DistanceReadbackLights { @@ -21,7 +21,7 @@ class DistanceReadbackLights eastl::unique_ptr findMaxDepth2D; eastl::unique_ptr> maxValueBuffer; RingCPUBufferLock resultRingBuffer; - eastl::map lightLogCount; + dag::VectorMap lightLogCount; int lastNonOptId; bool processing; diff --git a/prog/gameLibs/publicInclude/render/fluidDynamics/solver.h b/prog/gameLibs/publicInclude/render/fluidDynamics/solver.h index b104dc6b6..869f658b7 100644 --- a/prog/gameLibs/publicInclude/render/fluidDynamics/solver.h +++ b/prog/gameLibs/publicInclude/render/fluidDynamics/solver.h @@ -29,7 +29,7 @@ class Solver int getNumDispatches() const; - TEXTUREID getVelocityPressureTexId() const; + TEXTUREID getVelocityDensityTexId() const; float getSimulationTime() const; private: @@ -38,8 +38,7 @@ class Solver eastl::unique_ptr blurCs; PostFxRenderer showSolution; - eastl::array velPressureTex; - eastl::array densityTex; + eastl::array velDensityTex; uint32_t textureWidth = 640; uint32_t textureHeight = 384; @@ -49,8 +48,7 @@ class Solver struct Cascade { - eastl::array velPressureTex; - eastl::array densityTex; + eastl::array velDensityTex; IPoint2 texSize; float spatialStep; float dtMultiplier; @@ -60,13 +58,13 @@ class CascadeSolver { public: CascadeSolver(const char *solver_shader_name, uint32_t tex_width, uint32_t tex_height, - const eastl::array &num_dispatches_per_cascade = {5000, 2000, 1000, 200}, float spatial_step = 1.f); + const eastl::array &num_dispatches_per_cascade = {4700, 1600, 650, 150}, float spatial_step = 1.f); void fillInitialConditions(float standard_density, const Point2 &standard_velocity); void solveEquations(float dt, int num_dispatches); void showResult(PlotType plot_type); - TEXTUREID getVelocityPressureTexId() const; + TEXTUREID getVelocityDensityTexId() const; float getSimulationTime() const; int getNumDispatches() const; diff --git a/prog/gameLibs/publicInclude/render/fluidDynamics/voxelizeDepthAbove.h b/prog/gameLibs/publicInclude/render/fluidDynamics/voxelizeDepthAbove.h new file mode 100644 index 000000000..196fe52a1 --- /dev/null +++ b/prog/gameLibs/publicInclude/render/fluidDynamics/voxelizeDepthAbove.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include <3d/dag_resPtr.h> +#include + +namespace cfd +{ +class Voxelizer +{ +public: + Voxelizer(IPoint3 vol_tex_size); + + void voxelizeDepthAbove(const Point3 &world_pos, const Point2 &worldYMinMax); + +private: + UniqueTexHolder voxelTex; + IPoint3 volTexSize; + Point3 worldBoxSize; + static constexpr float metersPerVoxel = 1.0f; + + eastl::unique_ptr voxelizeCs; +}; +} // namespace cfd \ No newline at end of file diff --git a/prog/gameLibs/publicInclude/render/gpuGrass.h b/prog/gameLibs/publicInclude/render/gpuGrass.h index 7220235dd..0a3a4587a 100644 --- a/prog/gameLibs/publicInclude/render/gpuGrass.h +++ b/prog/gameLibs/publicInclude/render/gpuGrass.h @@ -62,7 +62,10 @@ class GPUGrassBase bool setQuality(GrassQuality quality); void applyAnisotropy(); typedef eastl::function frustum_heights_cb_t; + using RenderGrassLodCallback = + dag::FixedMoveOnlyFunction<64, void(const float currentGridSize, const float currentGrassDistance) const>; + void renderGrassLods(RenderGrassLodCallback renderGrassLod) const; void generate(const Point3 &pos, const Point3 &view_dir, const frustum_heights_cb_t &cb, GrassPreRenderCallback pre_render_cb); enum RenderType @@ -78,14 +81,12 @@ class GPUGrassBase void driverReset(); float getGrassDistance() const { return grassDistance; } - float getGrassGridSize() const { return grassGridSize; } float getMaxGrassHeight() const { return maxGrassHeightSize; } float getMaxGrassHorSize() const { return maxGrassHorSize; } float getDistanceEffective() const; float getGridSizeEffective() const; float getDistanceWithBorder() const; float alignTo() const; - bool isGrassLodsEnabled() const; bool isInited() const { return bool(grassGenerator); } void invalidate(); diff --git a/prog/gameLibs/publicInclude/render/toroidalStaticShadows.h b/prog/gameLibs/publicInclude/render/toroidalStaticShadows.h index ecef90228..033267964 100644 --- a/prog/gameLibs/publicInclude/render/toroidalStaticShadows.h +++ b/prog/gameLibs/publicInclude/render/toroidalStaticShadows.h @@ -164,6 +164,7 @@ class ToroidalStaticShadowCascade } renderData{}; int getRegionToRenderCount() const; + void clearRegionToRender(); TMatrix4 getRegionToRenderCullTm(int region) const; bool copyTransitionAfterRender = false; @@ -195,6 +196,7 @@ class ToroidalStaticShadows ToroidalStaticShadowCascade::BeforeRenderReturned updateOrigin(const Point3 &origin, float move_texels_threshold_part, float move_z_threshold, bool uniform_update, float max_update_texels_part, bool update_only_last_cascade = false); int getRegionToRenderCount(int cascade) const; + void clearRegionToRender(int cascade); // not should be called under normal circumstances TMatrix4 getRegionToRenderCullTm(int cascade, int region) const; void render(IStaticShadowsCB &cb); diff --git a/prog/gameLibs/publicInclude/render/tracer.h b/prog/gameLibs/publicInclude/render/tracer.h index e58d619d7..5d7144fed 100644 --- a/prog/gameLibs/publicInclude/render/tracer.h +++ b/prog/gameLibs/publicInclude/render/tracer.h @@ -104,8 +104,9 @@ class TracerManager : public cpujobs::IJob ~TracerManager(); void update(float dt); - void beforeRender(const Frustum *frustum_); - void renderTrans(bool heads = true, bool trails = true, const float *hk = NULL, HeadPrimType head_prim_type = HEAD_PRIM_DIR); + void beforeRender(const Frustum *frustum_, const Point3 &view_pos, const TMatrix &view_itm); + void renderTrans(const Point3 &view_pos, const TMatrix &view_itm, bool heads = true, bool trails = true, const float *hk = NULL, + HeadPrimType head_prim_type = HEAD_PRIM_DIR); void finishPreparingIfNecessary(); Tracer *createTracer(const Point3 &start_pos, const Point3 &speed, int tracerType, int trailType, float caliber, bool force = false, @@ -137,17 +138,17 @@ class TracerManager : public cpujobs::IJob int lock(uint32_t ofs_bytes, uint32_t size_bytes, void **p, int flags); void unlock(); void append(uint32_t id, dag::ConstSpan elem); - void process(ComputeShaderElement *cs, int commands_array_const_no, int commands_count_const_no, int fx_create_cmd, - int element_count); + void process(ComputeShaderElement *cs, int fx_create_cmd, int element_count); - inline Sbuffer *getSbuffer() const { return buf.get(); } + inline Sbuffer *getSbuffer() const { return buf.getBuf(); } inline uint8_t *getData() { return data.data(); } inline const uint8_t *getData() const { return data.data(); } private: int structSize; int cmdSize; - BufPtr buf; + UniqueBuf buf; + UniqueBuf createCmdBuf; Tab data; Tab cmds; int cmd; @@ -165,7 +166,7 @@ class TracerManager : public cpujobs::IJob void initTrails(); void renderTrails(); void initHeads(); - void renderHeads(); + void renderHeads(const Point3 &view_pos, const TMatrix &view_itm); void releaseRes(); uint32_t numTracers, numVisibleTracers, maxTracerNo; @@ -174,6 +175,8 @@ class TracerManager : public cpujobs::IJob carray> 5)> trCulledOrNotInitialized; const Frustum *mFrustum; + Point3 viewPos; + TMatrix viewItm; ShaderMaterial *headMat; dynrender::RElem headRendElem; BufPtr headVb; @@ -209,9 +212,6 @@ class TracerManager : public cpujobs::IJob eastl::unique_ptr tailIndirectRingBuffer; volatile int ringBufferPos = 0; - int commandsCountConstNo; - int commandsArrayConstNo; - DrawBuffer tracerBuffer; DrawBuffer tracerDynamicBuffer; DrawBuffer segmentBuffer; diff --git a/prog/gameLibs/publicInclude/render/variance.h b/prog/gameLibs/publicInclude/render/variance.h index 378828ccd..7536d0149 100644 --- a/prog/gameLibs/publicInclude/render/variance.h +++ b/prog/gameLibs/publicInclude/render/variance.h @@ -69,7 +69,7 @@ class Variance Texture *temp_wrtex, *targ_wrtex; Driver3dRenderTarget oldrt; - TMatrix4 lightViewTm, lightProj, shadowProjMatrix; + TMatrix4 lightProj, shadowProjMatrix; TMatrix4 svtm; Driver3dPerspective persp; bool perspOk; @@ -86,7 +86,6 @@ class Variance BBox3 updateBox; Point3 updateLightDir; float updateShadowDist; - DagorCurView updateView; bool isUpdateForced; shaders::UniqueOverrideStateId blendOverride, depthOnlyOverride; }; diff --git a/prog/gameLibs/quirrel/sqDebugConfig/jamfile b/prog/gameLibs/quirrel/sqDebugConfig/jamfile new file mode 100644 index 000000000..926faf8db --- /dev/null +++ b/prog/gameLibs/quirrel/sqDebugConfig/jamfile @@ -0,0 +1,19 @@ + +Root ?= ../../../.. ; +Location = prog/gameLibs/quirrel/sqDebugConfig ; +StrictCompile = yes ; +UseQuirrel = sq3r ; + +TargetType = lib ; +Target = gameLibs/sqDebugConfig.lib ; + +AddIncludes = + $(Root)/prog/gameLibs/publicInclude + $(Root)/prog/gameLibs/publicInclude/quirrel +; + +Sources = + sqDebugConfigBind.cpp +; + +include $(Root)/prog/_jBuild/build.jam ; diff --git a/prog/gameLibs/quirrel/sqDebugConfig/sqDebugConfigBind.cpp b/prog/gameLibs/quirrel/sqDebugConfig/sqDebugConfigBind.cpp new file mode 100644 index 000000000..f71ed9889 --- /dev/null +++ b/prog/gameLibs/quirrel/sqDebugConfig/sqDebugConfigBind.cpp @@ -0,0 +1,17 @@ +#include +#include + +namespace debug_config +{ +static bool is_screenshot_applied = false; +void raise_screenshot_apply_flag() { is_screenshot_applied = true; } +bool was_screenshot_applied_to_config() { return is_screenshot_applied; } +void register_debug_config(SqModules *module_mgr) +{ + Sqrat::Table debugConfig(module_mgr->getVM()); + + debugConfig.Func("was_screenshot_applied_to_config", was_screenshot_applied_to_config); + + module_mgr->addNativeModule("debug.config", debugConfig); +} +} // namespace debug_config \ No newline at end of file diff --git a/prog/gameLibs/rendInst/debug/collisionVisualization.cpp b/prog/gameLibs/rendInst/debug/collisionVisualization.cpp index 5a81ee603..f933fae82 100644 --- a/prog/gameLibs/rendInst/debug/collisionVisualization.cpp +++ b/prog/gameLibs/rendInst/debug/collisionVisualization.cpp @@ -356,7 +356,8 @@ void drawDebugCollisions(DrawCollisionsFlags flags, mat44f_cref globtm, const Po bool drawShadedAlone = bool(globalShadedCollisionDrawFlags & DrawShadedCollisionsFlag::Alone); bool drawShadedWithVis = bool(globalShadedCollisionDrawFlags & DrawShadedCollisionsFlag::WithVis); bool drawShadedWireframe = bool(globalShadedCollisionDrawFlags & DrawShadedCollisionsFlag::Wireframe); - bool drawShaded = drawShadedAlone || drawShadedWithVis; + bool drawShadedFacingHighlight = bool(globalShadedCollisionDrawFlags & DrawShadedCollisionsFlag::FaceOrientation); + bool drawShaded = drawShadedAlone || drawShadedWithVis || drawShadedFacingHighlight; if (!drawAnyRendinst && !drawRendinstCanopy && !drawShaded) return; @@ -445,6 +446,9 @@ void drawDebugCollisions(DrawCollisionsFlags flags, mat44f_cref globtm, const Po else if (drawShadedWithVis) d3d::clearview(CLEAR_ZBUFFER | CLEAR_STENCIL, 0x00000000, 0, 0); + static const int debug_ri_face_orientationVarId = get_shader_variable_id("debug_ri_face_orientation", false); + ShaderGlobal::set_int(debug_ri_face_orientationVarId, drawShadedFacingHighlight ? 1 : 0); + static int wireframeVarId = get_shader_glob_var_id("debug_ri_wireframe", false); ShaderGlobal::set_int(wireframeVarId, 0); for (auto &coll : collisions) @@ -471,6 +475,7 @@ void drawDebugCollisions(DrawCollisionsFlags flags, mat44f_cref globtm, const Po draw_collision_ui(coll, globtm, view_pos, max_label_dist_sq); } + ShaderGlobal::set_int(debug_ri_face_orientationVarId, 0); ShaderGlobal::setBlock(lastBlockId, ShaderGlobal::LAYER_FRAME); return; } @@ -565,6 +570,11 @@ static bool console_debug_shaded_collision_console_handler(const char *argv[], i rendinst::globalShadedCollisionDrawFlags ^= Flags::Wireframe; return true; } + CONSOLE_CHECK_NAME("shaded_collision", "face_orientation", 1, 1) + { + rendinst::globalShadedCollisionDrawFlags ^= Flags::FaceOrientation; + return true; + } return found; } diff --git a/prog/gameLibs/rendInst/debug/drawShadedCollisionsFlags.h b/prog/gameLibs/rendInst/debug/drawShadedCollisionsFlags.h index 023cdec8d..a1408949d 100644 --- a/prog/gameLibs/rendInst/debug/drawShadedCollisionsFlags.h +++ b/prog/gameLibs/rendInst/debug/drawShadedCollisionsFlags.h @@ -11,8 +11,9 @@ enum class DrawShadedCollisionsFlag : uint32_t Alone = 1 << 0, WithVis = 1 << 1, Wireframe = 1 << 2, + FaceOrientation = 1 << 3, - ALL_FLAGS = Alone | WithVis | Wireframe + ALL_FLAGS = Alone | WithVis | Wireframe | FaceOrientation }; using DrawShadedCollisionsFlags = BitFlagsMask; BITMASK_DECLARE_FLAGS_OPERATORS(DrawShadedCollisionsFlag); diff --git a/prog/gameLibs/rendInst/impostorTextureMgr.cpp b/prog/gameLibs/rendInst/impostorTextureMgr.cpp index 206205cc7..d67b454c9 100644 --- a/prog/gameLibs/rendInst/impostorTextureMgr.cpp +++ b/prog/gameLibs/rendInst/impostorTextureMgr.cpp @@ -124,7 +124,7 @@ ImpostorTextureManager::ImpostorTextureManager() if (prefer_bc_compression()) { shadowAtlasCompressor = eastl::make_unique(BcCompressor::COMPRESSION_BC4, 0, 0, 0, 1, "bc4_compressor"); - if (shadowAtlasCompressor->getCompressionType() == BcCompressor::COMPRESSION_ERR) + if (!shadowAtlasCompressor->isValid()) shadowAtlasCompressor.reset(); } } diff --git a/prog/gameLibs/rendInst/rendInstGenCollision.cpp b/prog/gameLibs/rendInst/rendInstGenCollision.cpp index 1ba898596..4f06d0aea 100644 --- a/prog/gameLibs/rendInst/rendInstGenCollision.cpp +++ b/prog/gameLibs/rendInst/rendInstGenCollision.cpp @@ -346,6 +346,7 @@ struct RayTransparencyStrat float accumulatedTransparency = 0.0f; const float transparencyThreshold; const bool checkCanopy; + float secondLayerMinCapsuleHeightSq = FLT_MAX; RayTransparencyStrat(float transparency_threshold, bool check_canopy, PhysMat::MatID ray_mat) : rayMatId(ray_mat), checkCanopy(check_canopy), transparencyThreshold(transparency_threshold) @@ -374,6 +375,10 @@ struct RayTransparencyStrat bool traceToCollRes = coll_res->boxNodesHead || coll_res->meshNodesHead || (coll_res->capsuleNodesHead && coll_res->capsuleNodesHead->nextNode); bool haveCollision = !traceToCollRes; + if (!traceToCollRes && layer_idx >= rendinst::rgPrimaryLayers) + haveCollision = + coll_res->capsuleNodesHead && + secondLayerMinCapsuleHeightSq < (coll_res->capsuleNodesHead->capsule.a - coll_res->capsuleNodesHead->capsule.b).lengthSq(); if (traceToCollRes) { int outMatId; @@ -442,6 +447,7 @@ struct RayTransparencyStrat ri_desc->idx = idx; ri_desc->pool = pool; ri_desc->offs = offs; + ri_desc->layer = layer_idx; } if (out_mat_id == PHYSMAT_INVALID || out_mat_id == PHYSMAT_DEFAULT) { @@ -948,6 +954,26 @@ bool traceTransparencyRayRIGenNormalized(const Point3 &pos, const Point3 &dir, f out_transparency, check_canopy); } +bool traceTransparencyRayRIGenNormalizedAllLayers(const Point3 &pos, const Point3 &dir, float mint, float transparency_threshold, + PhysMat::MatID ray_mat, rendinst::RendInstDesc *ri_desc, int *out_mat_id, float *out_transparency, bool check_canopy, + float min_height_second_layer) +{ + RayTransparencyStrat rayTranspStrategy(transparency_threshold, check_canopy, ray_mat); + rayTranspStrategy.secondLayerMinCapsuleHeightSq = sqr(min_height_second_layer); + Trace traceData(pos, dir, mint, nullptr); + + bbox3f rayBox; + init_raybox_from_trace(rayBox, traceData); + bool haveCollision = false; + FOR_EACH_RG_LAYER_DO (rgl) + rayTraverseRendinst(rayBox, dag::Span(&traceData, 1), false, _layer, ri_desc, rayTranspStrategy, haveCollision); + if (haveCollision && out_mat_id) + *out_mat_id = traceData.outMatId; + if (out_transparency) + *out_transparency = rayTranspStrategy.accumulatedTransparency; + return haveCollision; +} + void initTraceTransparencyParameters(float tree_trunk_opacity, float tree_canopy_opacity) { treeTrunkOpacity = tree_trunk_opacity; @@ -1408,6 +1434,23 @@ void computeRiIntersectedSolids(RendInstsSolidIntersectionsList &intersected, co return; const int intersectionCount = int(intersected.size()); + if (intersectionCount > 1024 || intersectionCount < 0) + { + eastl::string dbgNames; + dbgNames.reserve(300); + for (const auto &data : intersected) + { + dbgNames += " "; + dbgNames += getRIGenResName(data.riDesc); + if (dbgNames.length() > 200) + break; + } + logerr("computeRiIntersectedSolids has received too big intersection list, this is probably a bug, it will not be processed " + "printing first rendinsts: %s", + dbgNames.c_str()); + return; + } + union LocalIntersectionId { struct @@ -1424,10 +1467,10 @@ void computeRiIntersectedSolids(RendInstsSolidIntersectionsList &intersected, co bool matches(LocalIntersectionId rhs) const { return collNodeId == rhs.collNodeId && matId == rhs.matId && riId == rhs.riId; } }; - eastl::fixed_vector intersectionData; - LocalIntersectionIdRemap localCollNodeRemap; - LocalIntersectionIdRemap localMatIdRemap; - LocalIntersectionIdRemap localRiRemap; + eastl::fixed_vector intersectionData; + LocalIntersectionIdRemap localCollNodeRemap; + LocalIntersectionIdRemap localMatIdRemap; + LocalIntersectionIdRemap localRiRemap; // [0, size) - coll node index and flags // [size, size * 2) - out intersection index @@ -1457,7 +1500,7 @@ void computeRiIntersectedSolids(RendInstsSolidIntersectionsList &intersected, co if (intersectionData[i].direction) { int entries = 1; - for (int j = i + 1; j < int(intersected.size()); j++) + for (int j = i + 1; j < intersectionCount; j++) { if (intersectionData[j].removed) continue; diff --git a/prog/gameLibs/rendInst/rendInstStubRes.cpp b/prog/gameLibs/rendInst/rendInstStubRes.cpp index 3ce97dcac..8169ab63e 100644 --- a/prog/gameLibs/rendInst/rendInstStubRes.cpp +++ b/prog/gameLibs/rendInst/rendInstStubRes.cpp @@ -10,6 +10,7 @@ static void build_stub_ri_mesh(Mesh &m) { + return; // don't generate mesh since this stub is not ShaderResUnitedVdata-compatible and cannot be rendered m.vert.resize(8); m.vert[0].set(-0.1, 0, 0.1); m.vert[1].set(-0.5, 1, 0.5); @@ -93,6 +94,7 @@ class StubRiReleasingFactory : public GameResourceFactory StubRendInst(InstShaderMeshResource *m) { packedFields = sizeof(*this) - dumpStartOfs(); // Set all other fields to zero. + extraFlags = 0; bbox[0].set(-0.5, 0, -0.5); bbox[1].set(0.5, 1, 0.5); bsphCenter.set(0, 0.5, 0); diff --git a/prog/gameLibs/rendInst/render/clipShadows.cpp b/prog/gameLibs/rendInst/render/clipShadows.cpp index 806b7158f..8d92d77d7 100644 --- a/prog/gameLibs/rendInst/render/clipShadows.cpp +++ b/prog/gameLibs/rendInst/render/clipShadows.cpp @@ -153,7 +153,7 @@ void allocate_clipmap_shadows() compr = new BcCompressor(BcCompressor::COMPRESSION_BC4, numMips, rendinstClipmapShadowTexSize, rendinstClipmapShadowTexSize, 1, "bc4_compressor"); - if (compr->getCompressionType() == BcCompressor::COMPRESSION_ERR) + if (!compr->isValid()) del_it(compr); #endif } diff --git a/prog/gameLibs/rendInst/render/depthShadows.cpp b/prog/gameLibs/rendInst/render/depthShadows.cpp index a02d4d1d9..9c3171e64 100644 --- a/prog/gameLibs/rendInst/render/depthShadows.cpp +++ b/prog/gameLibs/rendInst/render/depthShadows.cpp @@ -120,7 +120,7 @@ int RendInstGenData::RtData::renderRendinstGlobalShadowsToTextures(const Point3 compr = new BcCompressor(BcCompressor::COMPRESSION_BC4, 1, rendinstGlobalShadowTexSize, rendinstGlobalShadowTexSize, 1, "bc4_compressor"); - if (compr->getCompressionType() == BcCompressor::COMPRESSION_ERR) + if (!compr->isValid()) del_it(compr); } diff --git a/prog/gameLibs/rendInst/render/genRender.cpp b/prog/gameLibs/rendInst/render/genRender.cpp index f4e129876..3135fb150 100644 --- a/prog/gameLibs/rendInst/render/genRender.cpp +++ b/prog/gameLibs/rendInst/render/genRender.cpp @@ -696,17 +696,25 @@ void RendInstGenData::applyLodRanges() continue; const DataBlock *ri_ovr = rtData->riResName[i] ? rendinst::ri_lod_ranges_ovr.getBlockByName(rtData->riResName[i]) : nullptr; + if (!RendInstGenData::renderResRequired || !rtData->rtPoolData[i]) + continue; + if (!rtData->riRes[i]->hasImpostor()) + { + for (int lodI = 0; lodI < rtData->riResLodCount(i); lodI++) + rtData->rtPoolData[i]->lodRange[lodI] = rtData->riResLodRange(i, lodI, ri_ovr); + } + else + { + float subCellOfsSize = grid2world * cellSz * + ((rendinst::render::per_instance_visibility_for_everyone ? 0.75f : 0.25f) * + (rendinst::render::globalDistMul * 1.f / RendInstGenData::SUBCELL_DIV)); + rtData->applyImpostorRange(i, ri_ovr, subCellOfsSize); + } int lastLodNo = rtData->riResLodCount(i) - 1; - float last_lod_range = min(rtData->riResLodRange(i, lastLodNo, ri_ovr), rtData->preloadDistance); + float last_lod_range = min(rtData->rtPoolData[i]->lodRange[lastLodNo], rtData->preloadDistance); maxDist = max(maxDist, last_lod_range); averageFarPlane += last_lod_range; averageFarPlaneCount++; - - if (!RendInstGenData::renderResRequired || !rtData->rtPoolData[i]) - continue; - for (int lodI = 0; lodI < rtData->riResLodCount(i); lodI++) - rtData->rtPoolData[i]->lodRange[lodI] = rtData->riResLodRange(i, lodI, ri_ovr); - rtData->rtPoolData[i]->lodRange[lastLodNo] = last_lod_range; rtData->rtPoolData[i]->lodRange[0] = min(rtData->rtPoolData[i]->lodRange[0], rtData->rendinstMaxLod0Dist); } diff --git a/prog/gameLibs/rendInst/render/impostor.cpp b/prog/gameLibs/rendInst/render/impostor.cpp index 6fd30bf08..ff91ca88c 100644 --- a/prog/gameLibs/rendInst/render/impostor.cpp +++ b/prog/gameLibs/rendInst/render/impostor.cpp @@ -238,11 +238,11 @@ void initImpostorsGlobals() if (BcCompressor::isAvailable(BcCompressor::COMPRESSION_BC3)) { rendinst::render::bcCompressors[0] = new BcCompressor(get_compressor(0), 0, 0, 0, 1, get_compressor_shader(0)); - compressionAvailable = rendinst::render::bcCompressors[0]->getCompressionType() != BcCompressor::COMPRESSION_ERR; + compressionAvailable = rendinst::render::bcCompressors[0]->isValid(); for (int i = 1; i < rendinst::render::impostor_tex_count && compressionAvailable; ++i) { rendinst::render::bcCompressors[i] = new BcCompressor(get_compressor(i), 0, 0, 0, 1, get_compressor_shader(i)); - if (rendinst::render::bcCompressors[i]->getCompressionType() == BcCompressor::COMPRESSION_ERR) + if (!rendinst::render::bcCompressors[i]->isValid()) { compressionAvailable = false; break; @@ -681,6 +681,44 @@ bool RendInstGenData::RtData::updateImpostorsPreshadow(int poolNo, const Point3 return true; } +void RendInstGenData::RtData::applyImpostorRange(int ri_idx, const DataBlock *ri_ovr, float cell_size) +{ + G_ASSERT(riRes[ri_idx]->hasImpostor()); + auto &ranges = rtPoolData[ri_idx]->lodRange; + const bool hasTransitionLod = rtPoolData[ri_idx]->hasTransitionLod(); + const int impostorLodNum = riResLodCount(ri_idx) - 1; + const int transitionLodNum = impostorLodNum - 1; + const int lastMeshLodNum = hasTransitionLod ? transitionLodNum - 1 : transitionLodNum; + auto defaultTransitionLodRange = riResLodRange(ri_idx, transitionLodNum, nullptr); + const float transitionRange = hasTransitionLod ? defaultTransitionLodRange - riResLodRange(ri_idx, lastMeshLodNum, nullptr) : 0.f; + G_ASSERT(lastMeshLodNum >= 0); + for (int lodI = 0; lodI < riResLodCount(ri_idx); lodI++) + ranges[lodI] = riResLodRange(ri_idx, lodI, ri_ovr); + if (rendinst::render::use_tree_lod0_offset) + { + ranges[lastMeshLodNum] += cell_size; + if (hasTransitionLod) + { + ranges[transitionLodNum] += cell_size; + defaultTransitionLodRange += cell_size; + } + } + if (hasTransitionLod) + { + G_ASSERT(transitionRange > 0); + // Override setting does not know about transition lod, + // so need to apply it to impostor lod instead. + if (defaultTransitionLodRange != ranges[transitionLodNum]) + ranges[impostorLodNum] = ranges[transitionLodNum]; + Tab mats; + riRes[ri_idx]->lods[transitionLodNum].scene->gatherUsedMat(mats); + for (auto mat : mats) + riRes[ri_idx]->setImpostorTransitionRange(mat, ranges[lastMeshLodNum], transitionRange); + + ranges[transitionLodNum] = ranges[lastMeshLodNum] + transitionRange; + } +} + static void impostorMipSRVBarrier(rendinst::render::RtPoolData &pool, int mip) { for (int j = 0; j < pool.impostor.tex.size(); ++j) diff --git a/prog/gameLibs/rendInst/riGen/riGenData.h b/prog/gameLibs/rendInst/riGen/riGenData.h index a86a6b0f2..d66993f75 100644 --- a/prog/gameLibs/rendInst/riGen/riGenData.h +++ b/prog/gameLibs/rendInst/riGen/riGenData.h @@ -268,6 +268,7 @@ struct RendInstGenData void updateImpostors(float shadowDistance, const Point3 &sunDir0, const TMatrix &view_itm, const mat44f &proj_tm); bool updateImpostorsPreshadow(int poolNo, const Point3 &sunDir0); bool updateImpostorsPreshadow(int poolNo, const Point3 &sunDir0, int paletteId, const UniqueTex &depth_atlas); + void applyImpostorRange(int ri_idx, const DataBlock *ri_ovr, float cell_size); void copyVisibileImpostorsData(const RiGenVisibility &visibility, bool clear_data); void initDebris(const DataBlock &ri_blk, int (*get_fx_type_by_name)(const char *name)); diff --git a/prog/gameLibs/rendInst/visibility/genVisibility.cpp b/prog/gameLibs/rendInst/visibility/genVisibility.cpp index 598fad6ee..5295426f2 100644 --- a/prog/gameLibs/rendInst/visibility/genVisibility.cpp +++ b/prog/gameLibs/rendInst/visibility/genVisibility.cpp @@ -412,11 +412,7 @@ bool RendInstGenData::prepareVisibility(const Frustum &frustum, const Point3 &ca { lodDistancesSq[lodI + lodTranslation] = pool.hasImpostor() ? rtData->get_trees_range(pool.lodRange[lodI - 1]) : rtData->get_range(pool.lodRange[lodI - 1]); - const float added = lodI == lodCnt - 1 && hasImpostor // fixme: increase by radius of tree bounding sphere? - && rendinst::render::use_tree_lod0_offset && !pool.hasTransitionLod() - ? subCellOfsSize // only for impostor - : 0; - lodDistancesSq_perInst[remap_per_instance_lod(lodI + lodTranslation)] = lodDistancesSq[lodI + lodTranslation] + added; + lodDistancesSq_perInst[remap_per_instance_lod(lodI + lodTranslation)] = lodDistancesSq[lodI + lodTranslation]; } if (!hasImpostor) { diff --git a/prog/gameLibs/render/daBfg/api/internalRegistry.h b/prog/gameLibs/render/daBfg/api/internalRegistry.h index 9b3c42c81..2651f36e8 100644 --- a/prog/gameLibs/render/daBfg/api/internalRegistry.h +++ b/prog/gameLibs/render/daBfg/api/internalRegistry.h @@ -9,13 +9,19 @@ #include #include #include -#include #include namespace dabfg { +struct ResourceUsage +{ + Access access = Access::UNKNOWN; + Usage type = Usage::UNKNOWN; + Stage stage = Stage::UNKNOWN; +}; + struct ResourceRequest { ResourceUsage usage; diff --git a/prog/gameLibs/render/daBfg/backend.cpp b/prog/gameLibs/render/daBfg/backend.cpp index d9b968d34..514d7c28a 100644 --- a/prog/gameLibs/render/daBfg/backend.cpp +++ b/prog/gameLibs/render/daBfg/backend.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -105,9 +106,8 @@ void Backend::scheduleNodes() dag::Vector demultiplexedNodeExecutionOrder; demultiplexedNodeExecutionOrder.reserve(registry.nodes.size()); for (const intermediate::Node &irNode : intermediateGraph.nodes) - for (auto nodeId : irNode.frontendNodes) - if (irNode.multiplexingIndex == 0) - demultiplexedNodeExecutionOrder.emplace_back(nodeId); + if (irNode.multiplexingIndex == 0) + demultiplexedNodeExecutionOrder.emplace_back(irNode.frontendNode); update_graph_visualization(&nodeTracker, demultiplexedNodeExecutionOrder); } @@ -146,8 +146,7 @@ void Backend::scheduleResources() { dag::Vector frontendNodeExecutionOrder; for (const intermediate::Node &irNode : intermediateGraph.nodes) - for (auto nodeId : irNode.frontendNodes) - frontendNodeExecutionOrder.emplace_back(nodeId); + frontendNodeExecutionOrder.emplace_back(irNode.frontendNode); update_resource_visualization(registry, frontendNodeExecutionOrder); } diff --git a/prog/gameLibs/render/daBfg/backend.h b/prog/gameLibs/render/daBfg/backend.h index ea972bc85..29a1b3dd0 100644 --- a/prog/gameLibs/render/daBfg/backend.h +++ b/prog/gameLibs/render/daBfg/backend.h @@ -59,7 +59,7 @@ class Backend intermediate::Graph intermediateGraph; intermediate::Mapping irMapping; - dag::Vector perNodeStateDeltas; + NodeStateDeltas perNodeStateDeltas; ResourceScheduler::EventsCollectionRef allResourceEvents; // Deferred init diff --git a/prog/gameLibs/render/daBfg/debug/globalStatesValidation.cpp b/prog/gameLibs/render/daBfg/debug/globalStatesValidation.cpp index 044072ba4..ae521ec29 100644 --- a/prog/gameLibs/render/daBfg/debug/globalStatesValidation.cpp +++ b/prog/gameLibs/render/daBfg/debug/globalStatesValidation.cpp @@ -93,6 +93,83 @@ void validate_global_state(const InternalRegistry ®istry, NodeNameId nodeId) validateBlock(nodeData.shaderBlockLayers.frameLayer, ShaderGlobal::getBlock(ShaderGlobal::LAYER_FRAME), "frame"); validateBlock(nodeData.shaderBlockLayers.sceneLayer, ShaderGlobal::getBlock(ShaderGlobal::LAYER_SCENE), "scene"); validateBlock(nodeData.shaderBlockLayers.objectLayer, ShaderGlobal::getBlock(ShaderGlobal::LAYER_OBJECT), "object"); + + if (nodeData.renderingRequirements.has_value()) + { + const auto &expectedRts = *nodeData.renderingRequirements; + + Driver3dRenderTarget observedRts; + d3d::get_render_target(observedRts); + + const auto validateRt = [®istry, nodeId](const VirtualSubresourceRef &expected, const Driver3dRenderTarget::RTState &observed, + const char *slot_name) { + const auto &provided = registry.resourceProviderReference.providedResources; + const auto it = provided.find(expected.nameId); + + BaseTexture *expectedTex = nullptr; + if (it != provided.end()) + if (auto view = eastl::get_if(&it->second)) + expectedTex = view->getTex2D(); + + const auto expectedName = expectedTex ? expectedTex->getTexName() : "NULL"; + const auto observedName = observed.tex ? observed.tex->getTexName() : "NULL"; + + if (expectedTex != observed.tex) + { + logerr("Frame graph node %s expected the render target in slot %s to be bound to %s, " + "but it was spuriously changed to %s while executing the node! Please remove the spurious " + "set, or reset it back to the expected value at the end of the function execution!", + registry.knownNames.getName(nodeId), slot_name, expectedName, observedName); + return; + } + + if (expected.layer != observed.layer) + { + logerr("Frame graph node %s expected the render target in slot %s to be bound to the %d layer of texture %s, " + "but it was spuriously changed to the %d layer while executing the node! Please remove the spurious " + "set, or reset it back to the expected value at the end of the function execution!", + registry.knownNames.getName(nodeId), slot_name, expected.layer, expectedName, observed.layer); + return; + } + + if (expected.mipLevel != observed.level) + { + logerr("Frame graph node %s expected the render target in slot %s to be bound to the %d mip level of texture %s, " + "but it was spuriously changed to the %d mip level while executing the node! Please remove the spurious " + "set, or reset it back to the expected value at the end of the function execution!", + registry.knownNames.getName(nodeId), slot_name, expected.mipLevel, expectedName, observed.level); + return; + } + }; + + static constexpr const char *SLOT_NAMES[] = { + "color 0", "color 1", "color 2", "color 3", "color 4", "color 5", "color 6", "color 7"}; + static_assert(countof(SLOT_NAMES) == Driver3dRenderTarget::MAX_SIMRT); + for (uint32_t rtIdx = 0; rtIdx < Driver3dRenderTarget::MAX_SIMRT; ++rtIdx) + { + // We must validate that nothing was set into RT slots that were not requested + VirtualSubresourceRef expectedRt = rtIdx < expectedRts.colorAttachments.size() ? expectedRts.colorAttachments[rtIdx] + : VirtualSubresourceRef{ResNameId::Invalid, 0, 0}; + Driver3dRenderTarget::RTState observedRt{}; + if (observedRts.isColorUsed(rtIdx)) + observedRt = observedRts.getColor(rtIdx); + validateRt(expectedRt, observedRt, SLOT_NAMES[rtIdx]); + } + + { + Driver3dRenderTarget::RTState observedDepth{}; + if (observedRts.isDepthUsed()) + observedDepth = observedRts.getDepth(); + validateRt(expectedRts.depthAttachment, observedDepth, "depth"); + } + + if (expectedRts.depthAttachment.nameId != ResNameId::Invalid && expectedRts.depthReadOnly != observedRts.isDepthReadOnly()) + { + logerr("Frame graph node %s expected to have a %s depth, but it was spuriously changed " + "to be the opposite. Please, remove the spurious depth target change from the node!", + registry.knownNames.getName(nodeId), expectedRts.depthReadOnly ? "read-only" : "read-write"); + } + } } } // namespace dabfg \ No newline at end of file diff --git a/prog/gameLibs/render/daBfg/intermediateRepresentation.cpp b/prog/gameLibs/render/daBfg/intermediateRepresentation.cpp index 343b7fd54..a44a81105 100644 --- a/prog/gameLibs/render/daBfg/intermediateRepresentation.cpp +++ b/prog/gameLibs/render/daBfg/intermediateRepresentation.cpp @@ -121,8 +121,7 @@ Mapping Graph::calculateMapping() for (const auto &node : nodes) { multiIdxExtents.update(node.multiplexingIndex); - for (auto nodeNameId : node.frontendNodes) - nodeNameIdExtents.update(nodeNameId); + nodeNameIdExtents.update(node.frontendNode); } IdExtentsFinder resNameIdExtents; @@ -140,8 +139,7 @@ Mapping Graph::calculateMapping() result.mapRes(resNameId, res.multiplexingIndex) = i; for (auto [i, node] : nodes.enumerate()) - for (auto nodeNameId : node.frontendNodes) - result.mapNode(nodeNameId, node.multiplexingIndex) = i; + result.mapNode(node.frontendNode, node.multiplexingIndex) = i; // NOTE: This is a bit fragile. The frontend multiplexing code has to // guarantee that in case of undermultiplexed nodes/resources each diff --git a/prog/gameLibs/render/daBfg/intermediateRepresentation.h b/prog/gameLibs/render/daBfg/intermediateRepresentation.h index 1e22a7452..99df4f991 100644 --- a/prog/gameLibs/render/daBfg/intermediateRepresentation.h +++ b/prog/gameLibs/render/daBfg/intermediateRepresentation.h @@ -15,16 +15,19 @@ #include #include #include +#include +#include +#include #include #include #include #include +#include #include #include -#include #include @@ -56,6 +59,14 @@ enum MultiplexingIndex : uint32_t { }; +struct ResourceUsage +{ + Access access : 2; + Usage type : 6; + Stage stage : 6; +}; +static_assert(sizeof(ResourceUsage) == 2); + struct Request { ResourceIndex resource; @@ -75,10 +86,7 @@ struct Node // Nodes that have to be executed before this one dag::FixedVectorSet predecessors; - // A single IR node might consist of several frontend nodes, e.g. whenever - // vulkan subpasses are used. The execution order should be as specified - // in this array. - dag::RelocatableFixedVector frontendNodes; + NodeNameId frontendNode; // Multiplexing iteration this node will be executed on MultiplexingIndex multiplexingIndex; diff --git a/prog/gameLibs/render/daBfg/nodes/nodeExecutor.cpp b/prog/gameLibs/render/daBfg/nodes/nodeExecutor.cpp index 4e3cf9db8..5ccadded5 100644 --- a/prog/gameLibs/render/daBfg/nodes/nodeExecutor.cpp +++ b/prog/gameLibs/render/daBfg/nodes/nodeExecutor.cpp @@ -59,58 +59,52 @@ void populate_resource_provider(ResourceProvider &provider, // passed by ref to } void NodeExecutor::execute(int prev_frame, int curr_frame, multiplexing::Extents multiplexing_extents, - const ResourceScheduler::FrameEventsRef &events, eastl::span state_deltas) + const ResourceScheduler::FrameEventsRef &events, const NodeStateDeltas &state_deltas) { currentlyProvidedResources.resolutions.resize(registry.knownNames.nameCount()); for (auto [unresolvedId, resolution] : currentlyProvidedResources.resolutions.enumerate()) if (auto resolvedId = nameResolver.resolve(unresolvedId); resolvedId != AutoResTypeNameId::Invalid) resolution = registry.autoResTypes[resolvedId].dynamicResolution; - uint32_t userNodeIndex = 0; for (auto i : IdRange(graph.nodes.size())) { const intermediate::Node &irNode = graph.nodes[i]; processEvents(events[i]); - for (auto userNodeNameId : irNode.frontendNodes) + const multiplexing::Index multiIdx = multiplexing_index_from_ir(irNode.multiplexingIndex, multiplexing_extents); + gatherExternalResources(irNode.frontendNode, irNode.multiplexingIndex, multiIdx, graph.resources); + populate_resource_provider( + currentlyProvidedResources, registry, nameResolver, irNode.frontendNode, + [this, prev_frame, curr_frame, multiIndex = irNode.multiplexingIndex](bool history, ResNameId res_id) -> ManagedTexView { + return getManagedTexView(res_id, history ? prev_frame : curr_frame, multiIndex); + }, + [this, prev_frame, curr_frame, multiIndex = irNode.multiplexingIndex](bool history, ResNameId res_id) -> ManagedBufView { + return getManagedBufView(res_id, history ? prev_frame : curr_frame, multiIndex); + }, + [this, prev_frame, curr_frame, multiIndex = irNode.multiplexingIndex](bool history, ResNameId res_id) -> BlobView { + return getBlobView(res_id, history ? prev_frame : curr_frame, multiIndex); + }); + + + validation_set_current_node(registry, irNode.frontendNode); + applyState(state_deltas[i], curr_frame, prev_frame); + if (const auto &node = registry.nodes[irNode.frontendNode]; node.enabled && node.sideEffect != SideEffects::None) { - const multiplexing::Index multiIdx = multiplexing_index_from_ir(irNode.multiplexingIndex, multiplexing_extents); - gatherExternalResources(userNodeNameId, irNode.multiplexingIndex, multiIdx, graph.resources); - populate_resource_provider( - currentlyProvidedResources, registry, nameResolver, userNodeNameId, - [this, prev_frame, curr_frame, multiIndex = irNode.multiplexingIndex](bool history, ResNameId res_id) -> ManagedTexView { - return getManagedTexView(res_id, history ? prev_frame : curr_frame, multiIndex); - }, - [this, prev_frame, curr_frame, multiIndex = irNode.multiplexingIndex](bool history, ResNameId res_id) -> ManagedBufView { - return getManagedBufView(res_id, history ? prev_frame : curr_frame, multiIndex); - }, - [this, prev_frame, curr_frame, multiIndex = irNode.multiplexingIndex](bool history, ResNameId res_id) -> BlobView { - return getBlobView(res_id, history ? prev_frame : curr_frame, multiIndex); - }); - - - validation_set_current_node(registry, userNodeNameId); - applyState(state_deltas[userNodeIndex], curr_frame, prev_frame); - if (const auto &node = registry.nodes[userNodeNameId]; node.enabled && node.sideEffect != SideEffects::None) { - { - TIME_D3D_PROFILE_NAME(FramegraphNode, registry.knownNames.getName(userNodeNameId)); + TIME_D3D_PROFILE_NAME(FramegraphNode, registry.knownNames.getName(irNode.frontendNode)); - if (auto &exec = registry.nodes[userNodeNameId].execute) - exec(multiIdx); - else - logerr("Somehow, a node with an empty execution callback was " - "attempted to be executed. This is a bug in framegraph!"); - } - validate_global_state(registry, userNodeNameId); + if (auto &exec = registry.nodes[irNode.frontendNode].execute) + exec(multiIdx); + else + logerr("Somehow, a node with an empty execution callback was " + "attempted to be executed. This is a bug in framegraph!"); } - validation_set_current_node(registry, NodeNameId::Invalid); - - // Clean up resource references inside the provider, just in case - currentlyProvidedResources.clear(); - - ++userNodeIndex; + validate_global_state(registry, irNode.frontendNode); } + validation_set_current_node(registry, NodeNameId::Invalid); + + // Clean up resource references inside the provider, just in case + currentlyProvidedResources.clear(); } processEvents(events.back()); applyState(state_deltas.back(), curr_frame, prev_frame); diff --git a/prog/gameLibs/render/daBfg/nodes/nodeExecutor.h b/prog/gameLibs/render/daBfg/nodes/nodeExecutor.h index 726ef6282..8984b85e6 100644 --- a/prog/gameLibs/render/daBfg/nodes/nodeExecutor.h +++ b/prog/gameLibs/render/daBfg/nodes/nodeExecutor.h @@ -22,7 +22,7 @@ class NodeExecutor {} void execute(int prev_frame, int curr_frame, multiplexing::Extents multiplexing_extents, - const ResourceScheduler::FrameEventsRef &events, eastl::span state_deltas); + const ResourceScheduler::FrameEventsRef &events, const NodeStateDeltas &state_deltas); ExternalState externalState; diff --git a/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.cpp b/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.cpp index 53375581c..b010148ea 100644 --- a/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.cpp +++ b/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.cpp @@ -158,25 +158,25 @@ NodeStateDelta getStateDelta(const intermediate::RequiredNodeState &first, const return result; } -dag::Vector calculate_per_node_state_deltas(const intermediate::Graph &graph) +NodeStateDeltas calculate_per_node_state_deltas(const intermediate::Graph &graph) { - dag::Vector result; + NodeStateDeltas result; result.reserve(graph.nodeStates.size() + 1); if (graph.nodeStates.empty()) { - result.emplace_back(); + result.appendNew(); return result; } - result.emplace_back(getStateDelta({}, graph.nodeStates.front())); + result.appendNew(getStateDelta({}, graph.nodeStates.front())); for (uint32_t i = 1; i < graph.nodeStates.size(); ++i) { const auto &prevState = graph.nodeStates[static_cast(i - 1)]; const auto &currState = graph.nodeStates[static_cast(i)]; - result.emplace_back(getStateDelta(prevState, currState)); + result.appendNew(getStateDelta(prevState, currState)); } - result.emplace_back(getStateDelta(graph.nodeStates.back(), {})); + result.appendNew(getStateDelta(graph.nodeStates.back(), {})); return result; } diff --git a/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.h b/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.h index 0f916a0da..5da90f445 100644 --- a/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.h +++ b/prog/gameLibs/render/daBfg/nodes/nodeStateDeltas.h @@ -34,6 +34,8 @@ struct NodeStateDelta ShaderBlockLayersInfoDelta shaderBlockLayers; }; -dag::Vector calculate_per_node_state_deltas(const intermediate::Graph &graph); +using NodeStateDeltas = IdIndexedMapping; + +NodeStateDeltas calculate_per_node_state_deltas(const intermediate::Graph &graph); } // namespace dabfg diff --git a/prog/gameLibs/render/daBfg/nodes/nodeTracker.cpp b/prog/gameLibs/render/daBfg/nodes/nodeTracker.cpp index 47606a474..6d5768b30 100644 --- a/prog/gameLibs/render/daBfg/nodes/nodeTracker.cpp +++ b/prog/gameLibs/render/daBfg/nodes/nodeTracker.cpp @@ -537,7 +537,7 @@ void NodeTracker::setIrGraphDebugNames(intermediate::Graph &graph) const constexpr size_t MULTI_INDEX_STRING_APPROX_SIZE = 10; auto genMultiplexingRow = [](uint32_t idx) { - const eastl::string HEX_DIGITS = "0123456789ABCDEF"; + static constexpr const char *HEX_DIGITS = "0123456789ABCDEF"; eastl::fixed_string result = " {0x$$$$} "; for (uint32_t i = 7; i >= 4; --i) { @@ -550,28 +550,10 @@ void NodeTracker::setIrGraphDebugNames(intermediate::Graph &graph) const graph.nodeNames.resize(graph.nodes.size()); for (auto [nodeIdx, irNode] : graph.nodes.enumerate()) { + const auto &frontendName = registry.knownNames.getName(irNode.frontendNode); auto &debugName = graph.nodeNames[nodeIdx]; - { - size_t size = 2 + MULTI_INDEX_STRING_APPROX_SIZE; - for (auto userNodeId : irNode.frontendNodes) - { - const eastl::string_view name = registry.knownNames.getName(userNodeId); - size += name.size() + 2; - } - debugName.reserve(size); - } - - if (irNode.frontendNodes.size() > 1) - debugName += '['; - for (auto userNodeId : irNode.frontendNodes) - { - debugName += registry.knownNames.getName(userNodeId); - debugName += ", "; - } - debugName.resize(debugName.size() - 2); - if (irNode.frontendNodes.size() > 1) - debugName += ']'; - + debugName.reserve(strlen(frontendName) + MULTI_INDEX_STRING_APPROX_SIZE); + debugName += frontendName; debugName += genMultiplexingRow(irNode.multiplexingIndex).c_str(); } @@ -831,7 +813,7 @@ eastl::pair NodeTracker::createDiscr auto [idx, irNode] = graph.nodes.appendNew(); mapping.mapNode(nodeId, irMultiplexingIndex) = idx; - irNode.frontendNodes.emplace_back(nodeId); + irNode.frontendNode = nodeId; irNode.priority = nodeData.priority; irNode.multiplexingIndex = irMultiplexingIndex; @@ -872,7 +854,7 @@ eastl::pair NodeTracker::createDiscr auto &irRequest = irNode.resourceRequests.emplace_back(); irRequest.resource = resIndex; - irRequest.usage = req.usage; + irRequest.usage = intermediate::ResourceUsage{req.usage.access, req.usage.type, req.usage.stage}; irRequest.fromLastFrame = history; } else @@ -881,7 +863,7 @@ eastl::pair NodeTracker::createDiscr // Otherwise this node must have been marked as broken and removed. G_ASSERT(irRequest.usage.access == req.usage.access && irRequest.usage.type == irRequest.usage.type); - irRequest.usage.stage |= req.usage.stage; + irRequest.usage.stage = irRequest.usage.stage | req.usage.stage; } if (history && registry.resources[resId].history == History::No) @@ -1156,17 +1138,16 @@ IdIndexedMapping #include +#include #include #include @@ -409,7 +410,7 @@ ResourceScheduler::EventsCollectionRef ResourceScheduler::scheduleEvents(const i struct ResourceUsageOccurrence { - ResourceUsage usage; + intermediate::ResourceUsage usage; uint32_t frame; uint32_t nodeIndex; }; @@ -441,7 +442,7 @@ ResourceScheduler::EventsCollectionRef ResourceScheduler::scheduleEvents(const i const auto processResourceInput = [&perFrameResourceUsageTimelines](int res_owner_frame, int event_frame, intermediate::NodeIndex node_idx, intermediate::ResourceIndex res_idx, - const ResourceUsage &usage) { + intermediate::ResourceUsage usage) { perFrameResourceUsageTimelines[res_owner_frame][res_idx].push_back( ResourceUsageOccurrence{usage, static_cast(event_frame), node_idx}); }; diff --git a/prog/gameLibs/render/daBfg/resourceUsage.cpp b/prog/gameLibs/render/daBfg/resourceUsage.cpp index f49d3cbcc..3122110f2 100644 --- a/prog/gameLibs/render/daBfg/resourceUsage.cpp +++ b/prog/gameLibs/render/daBfg/resourceUsage.cpp @@ -112,7 +112,7 @@ static ResourceBarrier map_stage_flags_source(Stage stage) { return map_stage_fl static ResourceBarrier map_stage_flags_dest(Stage stage) { return map_stage_flags(USAGE_STAGE_TO_BARRIER_DEST_STAGE, stage); } -ResourceBarrier barrier_for_transition(ResourceUsage usage_before, ResourceUsage usage_after) +ResourceBarrier barrier_for_transition(intermediate::ResourceUsage usage_before, intermediate::ResourceUsage usage_after) { if (usage_before.type == Usage::SHADER_RESOURCE && usage_before.access == Access::READ_WRITE && usage_after.type == Usage::SHADER_RESOURCE && usage_after.access == Access::READ_WRITE) @@ -180,7 +180,8 @@ ResourceBarrier barrier_for_transition(ResourceUsage usage_before, ResourceUsage return RB_NONE; } -eastl::optional get_activation_from_usage(History history, ResourceUsage usage, ResourceType res_type) +eastl::optional get_activation_from_usage(History history, intermediate::ResourceUsage usage, + ResourceType res_type) { switch (history) { diff --git a/prog/gameLibs/render/daBfg/resourceUsage.h b/prog/gameLibs/render/daBfg/resourceUsage.h index 30eb87c25..079febebf 100644 --- a/prog/gameLibs/render/daBfg/resourceUsage.h +++ b/prog/gameLibs/render/daBfg/resourceUsage.h @@ -4,6 +4,9 @@ #include #include +#include +#include + #include #include @@ -14,18 +17,17 @@ namespace dabfg { -struct ResourceUsage -{ - Access access = Access::UNKNOWN; - Usage type = Usage::UNKNOWN; - Stage stage = Stage::UNKNOWN; -}; - void validate_usage(ResourceUsage usage); -ResourceBarrier barrier_for_transition(ResourceUsage usage_before, ResourceUsage usage_after); +ResourceBarrier barrier_for_transition(intermediate::ResourceUsage usage_before, intermediate::ResourceUsage usage_after); -eastl::optional get_activation_from_usage(History history, ResourceUsage usage, ResourceType res_type); +eastl::optional get_activation_from_usage(History history, intermediate::ResourceUsage usage, + ResourceType res_type); +__forceinline eastl::optional get_activation_from_usage(History history, ResourceUsage usage, + ResourceType res_type) +{ + return get_activation_from_usage(history, intermediate::ResourceUsage{usage.access, usage.type, usage.stage}, res_type); +} void update_creation_flags_from_usage(uint32_t &flags, ResourceUsage usage, ResourceType res_type); diff --git a/prog/gameLibs/render/dstReadbackLights.cpp b/prog/gameLibs/render/dstReadbackLights.cpp index eba190d3a..5d26d5224 100644 --- a/prog/gameLibs/render/dstReadbackLights.cpp +++ b/prog/gameLibs/render/dstReadbackLights.cpp @@ -119,7 +119,8 @@ void DistanceReadbackLights::completeQuery() if (shouldBeOptimized) { const int maxLogs = 100; - int logCount = lightLogCount.find(lastNonOptId) == lightLogCount.end() ? 0 : lightLogCount[lastNonOptId]; + auto it = lightLogCount.find(lastNonOptId); + int logCount = it != lightLogCount.end() ? it->second : 0; if (logCount < maxLogs) { lightLogCount[lastNonOptId] = ++logCount; diff --git a/prog/gameLibs/render/fluidDynamics/jamfile b/prog/gameLibs/render/fluidDynamics/jamfile index 493baeae4..e3963a850 100644 --- a/prog/gameLibs/render/fluidDynamics/jamfile +++ b/prog/gameLibs/render/fluidDynamics/jamfile @@ -15,6 +15,7 @@ AddIncludes = Sources = solver.cpp + voxelizeDepthAbove.cpp ; include $(Root)/prog/_jBuild/build.jam ; \ No newline at end of file diff --git a/prog/gameLibs/render/fluidDynamics/shaders/euler_solver.sh b/prog/gameLibs/render/fluidDynamics/shaders/euler_solver.sh index bf52da924..377c63181 100644 --- a/prog/gameLibs/render/fluidDynamics/shaders/euler_solver.sh +++ b/prog/gameLibs/render/fluidDynamics/shaders/euler_solver.sh @@ -1,11 +1,8 @@ include "shader_global.sh" -texture velocity_pressure_tex; -texture density_tex; - -texture next_velocity_pressure_tex; -texture next_density_tex; +texture velocity_density_tex; +texture next_velocity_density_tex; texture solid_boundaries_tex; @@ -16,18 +13,46 @@ float simulation_dx = 1; float standard_density = 1.225; float4 standard_velocity = float4(10, 10, 0, 0); -texture initial_density_tex; -texture initial_velocity_pressure_tex; +texture initial_velocity_density_tex; int4 tex_size; hlsl { - float calc_P(float4 rho) + float calc_P(float rho) { const float M = 0.0289644f; // molar mass of air const float R = 8.314462618f; // universal gas constant const float T = 300.0f; // temperature in Kelvin - return dot(rho, float4(1, 1, 1, 1)) * R * T / M; + return rho * R * T / M; + } + + #define x_ofs uint2(1, 0) + #define y_ofs uint2(0, 1) + + struct ValueCross + { + float left; + float right; + float top; + float bottom; + }; + + struct ValueCross4 + { + float4 left; + float4 right; + float4 top; + float4 bottom; + }; + + // Central difference derivative approximations + inline float dval_dx(ValueCross val, float h) + { + return (val.right - val.left) / (2 * h); + } + inline float dval_dy(ValueCross val, float h) + { + return (val.bottom - val.top) / (2 * h); } } @@ -36,11 +61,8 @@ shader fill_initial_conditions ENABLE_ASSERT(cs) (cs) { - velocityPressure@uav = velocity_pressure_tex hlsl { - RWTexture2D velocityPressure@uav; - }; - density@uav = density_tex hlsl { - RWTexture2D density@uav; + velocity_density@uav = velocity_density_tex hlsl { + RWTexture2D velocity_density@uav; }; standard_density@f1 = (standard_density, 0, 0, 0); @@ -59,8 +81,7 @@ shader fill_initial_conditions uint2 coord = uint2(tid.x, tid.y); - density[coord] = float4(standard_density, 0, 0, 0); - velocityPressure[coord] = float4(standard_velocity, calc_P(float4(standard_density, 0, 0, 0)), 0); + velocity_density[coord] = float4(standard_velocity, 0, standard_density); } } @@ -72,15 +93,11 @@ shader fill_initial_conditions_from_tex ENABLE_ASSERT(cs) (cs) { - velocityPressure@uav = velocity_pressure_tex hlsl { - RWTexture2D velocityPressure@uav; - }; - density@uav = density_tex hlsl { - RWTexture2D density@uav; + velocity_density@uav = velocity_density_tex hlsl { + RWTexture2D velocity_density@uav; }; - initial_density@smp2d = initial_density_tex; - initial_velocity_pressure@smp2d = initial_velocity_pressure_tex; + initial_velocity_density@smp2d = initial_velocity_density_tex; texSize@i2 = (tex_size.x, tex_size.y, 0, 0); } @@ -95,8 +112,7 @@ shader fill_initial_conditions_from_tex uint2 coord = uint2(tid.x, tid.y); - density[coord] = tex2Dlod(initial_density, float4(float2(coord) / float2(size), 0, 0)); - velocityPressure[coord] = tex2Dlod(initial_velocity_pressure, float4(float2(coord) / float2(size), 0, 0)); + velocity_density[coord] = tex2Dlod(initial_velocity_density, float4(float2(coord) / float2(size), 0, 0)); } } @@ -113,137 +129,19 @@ shader euler_simulation_cs simulation_time@f1 = (simulation_time, 0, 0, 0); dt@f1 = (simulation_dt, 0, 0, 0); h@f1 = (simulation_dx, 0, 0, 0); - velocityPressure@smp2d = velocity_pressure_tex; - density@smp2d = density_tex; standard_density@f1 = (standard_density, 0, 0, 0); standard_velocity@f2 = (standard_velocity.x, standard_velocity.y, 0, 0); - nextVelocityPressure@uav = next_velocity_pressure_tex hlsl { - RWTexture2D nextVelocityPressure@uav; - }; - nextDensity@uav = next_density_tex hlsl { - RWTexture2D nextDensity@uav; + velocity_density@smp2d = velocity_density_tex; + next_velocity_density@uav = next_velocity_density_tex hlsl { + RWTexture2D next_velocity_density@uav; }; solidBoundaries@smp2d = solid_boundaries_tex; } hlsl(cs) { - #define x_ofs int2(1, 0) - #define y_ofs uint2(0, 1) - - // Central difference derivative approximations - inline float dvx_dx(int2 coord) - { - return (texelFetch(velocityPressure, coord + x_ofs, 0).x - - texelFetch(velocityPressure, coord - x_ofs, 0).x) / (2 * h); - } - inline float dvy_dx(int2 coord) - { - return (texelFetch(velocityPressure, coord + x_ofs, 0).y - - texelFetch(velocityPressure, coord - x_ofs, 0).y) / (2 * h); - } - inline float dvx_dy(int2 coord) - { - return (texelFetch(velocityPressure, coord + y_ofs, 0).x - - texelFetch(velocityPressure, coord - y_ofs, 0).x) / (2 * h); - } - inline float dvy_dy(int2 coord) - { - return (texelFetch(velocityPressure, coord + y_ofs, 0).y - - texelFetch(velocityPressure, coord - y_ofs, 0).y) / (2 * h); - } - inline float dP_dx(int2 coord) - { - return (texelFetch(velocityPressure, coord + x_ofs, 0).z - - texelFetch(velocityPressure, coord - x_ofs, 0).z) / (2 * h); - } - inline float dP_dy(int2 coord) - { - return (texelFetch(velocityPressure, coord + y_ofs, 0).z - - texelFetch(velocityPressure, coord - y_ofs, 0).z) / (2 * h); - } - inline float4 drho_dx(int2 coord) - { - return (texelFetch(density, coord + x_ofs, 0).xyzw - - texelFetch(density, coord - x_ofs, 0).xyzw) / (2 * h); - } - inline float4 drho_dy(int2 coord) - { - return (texelFetch(density, coord + y_ofs, 0).xyzw - - texelFetch(density, coord - y_ofs, 0).xyzw) / (2 * h); - } - - // Set the desired conditions on the grid edges - void applyFarFieldConditions(uint2 coord, inout float4 nextRho, inout float4 nextVelPressure) - { - // Inflow - if (coord.x == 0) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(standard_velocity, calc_P(nextRho), 0); - } - if (coord.y == 0) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(standard_velocity, calc_P(nextRho), 0); - } - - // Outflow - if (coord.x == tex_size.x - 1) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(standard_velocity, calc_P(nextRho), 0); - } - if (coord.y == tex_size.y - 1) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(standard_velocity, calc_P(nextRho), 0); - } - - // Based on https://web.stanford.edu/group/frg/course_work/AA214/CA-AA214-Ch8.pdf - // Inflow - // if (coord.x == 0) - // { - // nextRho = float4(standard_density, 0, 0, 0); - // nextVelPressure.xy = standard_velocity; - // } - // if (coord.y == 0) - // { - // nextRho = float4(standard_density, 0, 0, 0); - // nextVelPressure.xy = standard_velocity; - // } - - // // Outflow - // if (coord.x == tex_size.x - 1) - // { - // nextVelPressure.z = calc_P(float4(standard_density, 0, 0, 0)); - // } - // if (coord.y == tex_size.y - 1) - // { - // nextVelPressure.z = calc_P(float4(standard_density, 0, 0, 0)); - // } - } - - void applyCircleFriction(uint2 coord, float2 v, float2 center, float radius, inout float2 f) - { - float2 diff = coord.xy - center; - float dist = length(diff); - if (dist < radius) - { - f += -v * 1000.0; - } - } - - void applyWallFriction(uint2 coord, float2 v, float2 tl, float2 br, inout float2 f) - { - if (coord.x > tl.x && coord.x < br.x && coord.y > tl.y && coord.y < br.y) - { - f += -v * 10000.0; - } - } - float2 frictionForce(uint2 coord, float2 v) { float boundaryData = tex2Dlod(solidBoundaries, float4(float2(coord) / float2(tex_size), 0, 0)).w; @@ -251,48 +149,68 @@ shader euler_simulation_cs if (boundaryData > 0) return -v * 10000.0; - return 0; - // float2 ret = 0; - // applyCircleFriction(coord, v, float2(100, 200), 40, ret); - // applyCircleFriction(coord, v, float2(400, 200), 20, ret); - // applyCircleFriction(coord, v, float2(450, 270), 10, ret); - // applyCircleFriction(coord, v, float2(400, 330), 10, ret); - // applyWallFriction(coord, v, float2(200, 100), float2(210, 300), ret); - // applyWallFriction(coord, v, float2(400, 50), float2(500, 60), ret); - // applyWallFriction(coord, v, float2(400, 100), float2(500, 150), ret); - - // return ret; } void solver(uint2 coord, float t) { - float4 nextVelPressure = 0; - float4 nextRho = 0; + float4 nextVelDensity = 0; - float4 rho = texelFetch(density, coord, 0).xyzw; - float combinedRho = dot(rho, float4(1, 1, 1, 1)); + float4 velDensity = texelFetch(velocity_density, coord, 0); + float rho = velDensity.w; + float v_x = velDensity.x; + float v_y = velDensity.y; + + ValueCross4 velDensityCross = + { + texelFetch(velocity_density, coord - x_ofs, 0), + texelFetch(velocity_density, coord + x_ofs, 0), + texelFetch(velocity_density, coord - y_ofs, 0), + texelFetch(velocity_density, coord + y_ofs, 0) + }; + + // Boundary conditions are set through derivatives + ValueCross rhoCross = + { + coord.x != 0 ? velDensityCross.left.w : standard_density, + coord.x != tex_size.x - 1 ? velDensityCross.right.w : standard_density, + coord.y != 0 ? velDensityCross.top.w : standard_density, + coord.y != tex_size.y - 1 ? velDensityCross.bottom.w : standard_density + }; + ValueCross v_xCross = + { + coord.x != 0 ? velDensityCross.left.x : standard_velocity.x, + coord.x != tex_size.x - 1 ? velDensityCross.right.x : standard_velocity.x, + coord.y != 0 ? velDensityCross.top.x : standard_velocity.x, + coord.y != tex_size.y - 1 ? velDensityCross.bottom.x : standard_velocity.x + }; + ValueCross v_yCross = + { + coord.x != 0 ? velDensityCross.left.y : standard_velocity.y, + coord.x != tex_size.x - 1 ? velDensityCross.right.y : standard_velocity.y, + coord.y != 0 ? velDensityCross.top.y : standard_velocity.y, + coord.y != tex_size.y - 1 ? velDensityCross.bottom.y : standard_velocity.y + }; + ValueCross PCross = + { + calc_P(rhoCross.left), + calc_P(rhoCross.right), + calc_P(rhoCross.top), + calc_P(rhoCross.bottom) + }; - float v_x = texelFetch(velocityPressure, coord, 0).x; - float v_y = texelFetch(velocityPressure, coord, 0).y; - float dvx_dx_dvy_dy = (dvx_dx(coord) + dvy_dy(coord)); + float dvx_dx_dvy_dy = (dval_dx(v_xCross, h) + dval_dy(v_yCross, h)); // calculate rho - nextRho = rho + dt * (float4(0, 0, 0, 0) - rho * dvx_dx_dvy_dy - v_x * drho_dx(coord) - v_y * drho_dy(coord)); - nextRho = float4(max(nextRho.x, 0), max(nextRho.y, 0), max(nextRho.z, 0), max(nextRho.w, 0)); + nextVelDensity.w = rho + dt * (0 - rho * dvx_dx_dvy_dy - v_x * dval_dx(rhoCross, h) - v_y * dval_dy(rhoCross, h)); + nextVelDensity.w = max(0, nextVelDensity.w); // calculate v float2 force = frictionForce(coord, float2(v_x, v_y)); - nextVelPressure.x = v_x + dt * ((force.x - dP_dx(coord)) / (combinedRho + 0.0001) - v_x * dvx_dx(coord) - v_y * dvx_dy(coord)); - nextVelPressure.y = v_y + dt * ((force.y - dP_dy(coord)) / (combinedRho + 0.0001) - v_x * dvy_dx(coord) - v_y * dvy_dy(coord)); - - // calculate p - nextVelPressure.z = calc_P(nextRho); + nextVelDensity.x = v_x + dt * ((force.x - dval_dx(PCross, h)) / (rho + 0.0001) - v_x * dval_dx(v_xCross, h) - v_y * dval_dy(v_xCross, h)); + nextVelDensity.y = v_y + dt * ((force.y - dval_dy(PCross, h)) / (rho + 0.0001) - v_x * dval_dx(v_yCross, h) - v_y * dval_dy(v_yCross, h)); - applyFarFieldConditions(coord, nextRho, nextVelPressure); - - nextDensity[coord] = nextRho; - nextVelocityPressure[coord] = nextVelPressure; + next_velocity_density[coord] = nextVelDensity; } [numthreads(8, 8, 1)] @@ -323,17 +241,13 @@ shader euler_simulation_explicit_implicit_cs simulation_time@f1 = (simulation_time, 0, 0, 0); dt@f1 = (simulation_dt, 0, 0, 0); h@f1 = (simulation_dx, 0, 0, 0); - velocityPressure@smp2d = velocity_pressure_tex; - density@smp2d = density_tex; standard_density@f1 = (standard_density, 0, 0, 0); standard_velocity@f2 = (standard_velocity.x, standard_velocity.y, 0, 0); - nextVelocityPressure@uav = next_velocity_pressure_tex hlsl { - RWTexture2D nextVelocityPressure@uav; - }; - nextDensity@uav = next_density_tex hlsl { - RWTexture2D nextDensity@uav; + velocity_density@smp2d = velocity_density_tex; + next_velocity_density@uav = next_velocity_density_tex hlsl { + RWTexture2D next_velocity_density@uav; }; solidBoundaries@smp2d = solid_boundaries_tex; @@ -341,9 +255,6 @@ shader euler_simulation_explicit_implicit_cs hlsl(cs) { - #define x_ofs int2(1, 0) - #define y_ofs uint2(0, 1) - //#define ROW_SIZE 512 #define ROW_SIZE 64 @@ -351,81 +262,6 @@ shader euler_simulation_explicit_implicit_cs groupshared float rightPart[3][ROW_SIZE]; groupshared float solution[3][ROW_SIZE]; - // Central difference derivative approximations - inline float dvx_dx(int2 coord) - { - return (texelFetch(velocityPressure, coord + x_ofs, 0).x - - texelFetch(velocityPressure, coord - x_ofs, 0).x) / (2 * h); - } - inline float dvy_dx(int2 coord) - { - return (texelFetch(velocityPressure, coord + x_ofs, 0).y - - texelFetch(velocityPressure, coord - x_ofs, 0).y) / (2 * h); - } - inline float dvx_dy(int2 coord) - { - return (texelFetch(velocityPressure, coord + y_ofs, 0).x - - texelFetch(velocityPressure, coord - y_ofs, 0).x) / (2 * h); - } - inline float dvy_dy(int2 coord) - { - return (texelFetch(velocityPressure, coord + y_ofs, 0).y - - texelFetch(velocityPressure, coord - y_ofs, 0).y) / (2 * h); - } - inline float dP_dx(int2 coord) - { - return (texelFetch(velocityPressure, coord + x_ofs, 0).z - - texelFetch(velocityPressure, coord - x_ofs, 0).z) / (2 * h); - } - inline float dP_dy(int2 coord) - { - return (texelFetch(velocityPressure, coord + y_ofs, 0).z - - texelFetch(velocityPressure, coord - y_ofs, 0).z) / (2 * h); - } - inline float4 drho_dx(int2 coord) - { - return (texelFetch(density, coord + x_ofs, 0).xyzw - - texelFetch(density, coord - x_ofs, 0).xyzw) / (2 * h); - } - inline float4 drho_dy(int2 coord) - { - return (texelFetch(density, coord + y_ofs, 0).xyzw - - texelFetch(density, coord - y_ofs, 0).xyzw) / (2 * h); - } - - // Set the desired conditions on the grid edges - void applyFarFieldConditions(uint2 coord, inout float4 nextRho, inout float4 nextVelPressure) - { - float2 velocity; - velocity.x = cos(simulation_time*4)*15; - velocity.y = sin(simulation_time*4)*15; - - velocity = standard_velocity; - // Inflow - if (coord.x == 0) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(velocity, calc_P(nextRho), 0); - } - if (coord.y == 0) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(velocity, calc_P(nextRho), 0); - } - - // Outflow - if (coord.x == tex_size.x - 1) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(velocity, calc_P(nextRho), 0); - } - if (coord.y == tex_size.y - 1) - { - nextRho = float4(standard_density, 0, 0, 0); - nextVelPressure = float4(velocity, calc_P(nextRho), 0); - } - } - float2 frictionForce(uint2 coord, float2 v) { float boundaryData = tex2Dlod(solidBoundaries, float4(float2(coord) / float2(tex_size), 0, 0)).w; @@ -438,15 +274,52 @@ shader euler_simulation_explicit_implicit_cs void solver(uint2 coord, float t) { - float4 nextVelPressure = 0; - float4 nextRho = 0; + float4 nextVelDensity = 0; - float4 rho = texelFetch(density, coord, 0).xyzw; - float combinedRho = dot(rho, float4(1, 1, 1, 1)); + float4 velDensity = texelFetch(velocity_density, coord, 0); + float rho = velDensity.w; + float v_x = velDensity.x; + float v_y = velDensity.y; - float v_x = texelFetch(velocityPressure, coord, 0).x; - float v_y = texelFetch(velocityPressure, coord, 0).y; - float dvx_dx_dvy_dy = (dvx_dx(coord) + dvy_dy(coord)); + ValueCross4 velDensityCross = + { + texelFetch(velocity_density, coord - x_ofs, 0), + texelFetch(velocity_density, coord + x_ofs, 0), + texelFetch(velocity_density, coord - y_ofs, 0), + texelFetch(velocity_density, coord + y_ofs, 0) + }; + + // Boundary conditions are set through derivatives + ValueCross rhoCross = + { + coord.x != 0 ? velDensityCross.left.w : standard_density, + coord.x != tex_size.x - 1 ? velDensityCross.right.w : standard_density, + coord.y != 0 ? velDensityCross.top.w : standard_density, + coord.y != tex_size.y - 1 ? velDensityCross.bottom.w : standard_density + }; + ValueCross v_xCross = + { + coord.x != 0 ? velDensityCross.left.x : standard_velocity.x, + coord.x != tex_size.x - 1 ? velDensityCross.right.x : standard_velocity.x, + coord.y != 0 ? velDensityCross.top.x : standard_velocity.x, + coord.y != tex_size.y - 1 ? velDensityCross.bottom.x : standard_velocity.x + }; + ValueCross v_yCross = + { + coord.x != 0 ? velDensityCross.left.y : standard_velocity.y, + coord.x != tex_size.x - 1 ? velDensityCross.right.y : standard_velocity.y, + coord.y != 0 ? velDensityCross.top.y : standard_velocity.y, + coord.y != tex_size.y - 1 ? velDensityCross.bottom.y : standard_velocity.y + }; + ValueCross PCross = + { + calc_P(rhoCross.left), + calc_P(rhoCross.right), + calc_P(rhoCross.top), + calc_P(rhoCross.bottom) + }; + + float dvx_dx_dvy_dy = (dval_dx(v_xCross, h) + dval_dy(v_yCross, h)); float2 force = frictionForce(coord, float2(v_x, v_y)); @@ -461,20 +334,20 @@ shader euler_simulation_explicit_implicit_cs ##if euler_implicit_mode == hor // impliicit fox x derivative // v - rightPart[0][threadCoord] = v_x / dt - v_y * dvx_dx(coord) + (force.x - dP_dx(coord)) / (combinedRho + 0.0001) - derivWeights.y * v_x * dvx_dx(coord); - rightPart[1][threadCoord] = v_y / dt - v_y * dvy_dx(coord) + (force.y - dP_dy(coord)) / (combinedRho + 0.0001) - derivWeights.y * v_x * dvy_dx(coord); + rightPart[0][threadCoord] = v_x / dt - v_y * dval_dx(v_xCross, h) + (force.x - dval_dx(PCross, h)) / (rho + 0.0001) - derivWeights.y * v_x * dval_dx(v_xCross, h); + rightPart[1][threadCoord] = v_y / dt - v_y * dval_dx(v_yCross, h) + (force.y - dval_dy(PCross, h)) / (rho + 0.0001) - derivWeights.y * v_x * dval_dx(v_yCross, h); // rho - rightPart[2][threadCoord] = rho.x * (1.0f / dt - dvx_dx_dvy_dy) - v_y * drho_dy(coord).x - derivWeights.y * v_x * drho_dx(coord).x; + rightPart[2][threadCoord] = rho * (1.0f / dt - dvx_dx_dvy_dy) - v_y * dval_dy(rhoCross, h) - derivWeights.y * v_x * dval_dx(rhoCross, h); // equation params (we need only one value of 3 per matrix row) // and for all v_x, v_y and rho equation is the same! equation[threadCoord] = - derivWeights.x * v_x / h; ##else // impliicit fox y derivavtive // v - rightPart[0][threadCoord] = v_x / dt - v_x * dvx_dx(coord) + (force.x - dP_dx(coord)) / (combinedRho + 0.0001) - derivWeights.y * v_y * dvx_dx(coord); - rightPart[1][threadCoord] = v_y / dt - v_x * dvy_dx(coord) + (force.y - dP_dy(coord)) / (combinedRho + 0.0001) - derivWeights.y * v_y * dvy_dx(coord); + rightPart[0][threadCoord] = v_x / dt - v_x * dval_dx(v_xCross, h) + (force.x - dval_dx(PCross, h)) / (rho + 0.0001) - derivWeights.y * v_y * dval_dx(v_xCross, h); + rightPart[1][threadCoord] = v_y / dt - v_x * dval_dx(v_yCross, h) + (force.y - dval_dy(PCross, h)) / (rho + 0.0001) - derivWeights.y * v_y * dval_dx(v_yCross, h); // rho - rightPart[2][threadCoord] = rho.x * (1.0f / dt - dvx_dx_dvy_dy) - v_x * drho_dx(coord).x - derivWeights.y * v_y * drho_dy(coord).x; + rightPart[2][threadCoord] = rho * (1.0f / dt - dvx_dx_dvy_dy) - v_x * dval_dx(rhoCross, h) - derivWeights.y * v_y * dval_dy(rhoCross, h); // equation params (we need only one value of 3 per matrix row) // and for all v_x, v_y and rho equation is the same! @@ -512,25 +385,18 @@ shader euler_simulation_explicit_implicit_cs solution[threadCoord][j] = beta[j]; // back sweep - for (int i = ROW_SIZE - 2; i >= 0; i--) + for (int k = ROW_SIZE - 2; k >= 0; k--) { - solution[threadCoord][i] = alpha[i] * solution[threadCoord][i+1] + beta[i]; + solution[threadCoord][k] = alpha[k] * solution[threadCoord][k+1] + beta[k]; } } GroupMemoryBarrierWithGroupSync(); - nextVelPressure.x = solution[0][threadCoord]; - nextVelPressure.y = solution[1][threadCoord]; - nextRho = 0; - nextRho.x = solution[2][threadCoord]; - - // calculate p - nextVelPressure.z = calc_P(nextRho); + nextVelDensity.x = solution[0][threadCoord]; + nextVelDensity.y = solution[1][threadCoord]; + nextVelDensity.w = solution[2][threadCoord]; - applyFarFieldConditions(coord, nextRho, nextVelPressure); - - nextDensity[coord] = nextRho; - nextVelocityPressure[coord] = nextVelPressure; + next_velocity_density[coord] = nextVelDensity; } ##if euler_implicit_mode == hor @@ -560,50 +426,42 @@ shader blur_result_cs tex_size@i2 = (tex_size.x, tex_size.y, 0, 0); simulation_time@f1 = (simulation_time, 0, 0, 0) blurWeights@f2 = (euler_centralBlurWeight, 1.0/(euler_centralBlurWeight + 4.0), 0, 0); - velocityPressure@smp2d = velocity_pressure_tex; - density@smp2d = density_tex; - - nextVelocityPressure@uav = next_velocity_pressure_tex hlsl { - RWTexture2D nextVelocityPressure@uav; - }; - nextDensity@uav = next_density_tex hlsl { - RWTexture2D nextDensity@uav; + velocity_density@smp2d = velocity_density_tex; + next_velocity_density@uav = next_velocity_density_tex hlsl { + RWTexture2D next_velocity_density@uav; }; + + standard_density@f1 = (standard_density, 0, 0, 0); + standard_velocity@f2 = (standard_velocity.x, standard_velocity.y, 0, 0); } hlsl(cs) { - #define x_ofs int2(1, 0) - #define y_ofs uint2(0, 1) - void blurer(int2 coord, float t) { - float4 blurredVelPressure = 0; - - float v_x = blurWeights.y*(blurWeights.x*texelFetch(velocityPressure, coord, 0).x + texelFetch(velocityPressure, coord + x_ofs, 0).x + - + texelFetch(velocityPressure, coord - x_ofs, 0).x + - + texelFetch(velocityPressure, coord + y_ofs, 0).x + - + texelFetch(velocityPressure, coord - y_ofs, 0).x); - float v_y = blurWeights.y*(blurWeights.x*texelFetch(velocityPressure, coord, 0).y + texelFetch(velocityPressure, coord + x_ofs, 0).y + - + texelFetch(velocityPressure, coord - x_ofs, 0).y + - + texelFetch(velocityPressure, coord + y_ofs, 0).y + - + texelFetch(velocityPressure, coord - y_ofs, 0).y); - - float P = blurWeights.y*(blurWeights.x*texelFetch(velocityPressure, coord, 0).z + texelFetch(velocityPressure, coord + x_ofs, 0).z + - + texelFetch(velocityPressure, coord - x_ofs, 0).z + - + texelFetch(velocityPressure, coord + y_ofs, 0).z + - + texelFetch(velocityPressure, coord - y_ofs, 0).z); - - blurredVelPressure = float4(v_x, v_y, P, texelFetch(velocityPressure, coord, 0).w); - - nextVelocityPressure[coord] = blurredVelPressure; - - - float4 blurredDensity = 0.001f*(996*texelFetch(density, coord, 0).xyzw + texelFetch(density, coord + x_ofs, 0).xyzw + - + texelFetch(density, coord - x_ofs, 0).xyzw + - + texelFetch(density, coord + y_ofs, 0).xyzw + - + texelFetch(density, coord - y_ofs, 0).xyzw); - - nextDensity[coord] = blurredDensity; + float4 blurredVelDensity = 0; + + float4 velDensityCenter = texelFetch(velocity_density, coord, 0); + float4 velDensityLeft = coord.x != 0 ? texelFetch(velocity_density, coord - x_ofs, 0) : float4(standard_velocity, 0, standard_density); + float4 velDensityRight = coord.x != tex_size.x - 1 ? texelFetch(velocity_density, coord + x_ofs, 0) : float4(standard_velocity, 0, standard_density); + float4 velDensityTop = coord.y != 0 ? texelFetch(velocity_density, coord - y_ofs, 0) : float4(standard_velocity, 0, standard_density); + float4 velDensityBottom = coord.y != tex_size.y - 1 ? texelFetch(velocity_density, coord + y_ofs, 0) : float4(standard_velocity, 0, standard_density); + + float v_x = blurWeights.y*(blurWeights.x*velDensityCenter.x + velDensityRight.x + + + velDensityLeft.x + + + velDensityBottom.x + + + velDensityTop.x); + float v_y = blurWeights.y*(blurWeights.x*velDensityCenter.y + velDensityRight.y + + + velDensityLeft.y + + + velDensityBottom.y + + + velDensityTop.y); + + float blurredDensity = 0.001f*(996*velDensityCenter.w + velDensityRight.w + + + velDensityLeft.w + + + velDensityBottom.w + + + velDensityTop.w); + blurredVelDensity = float4(v_x, v_y, 0, blurredDensity); + + next_velocity_density[coord] = blurredVelDensity; } [numthreads(8, 8, 1)] diff --git a/prog/gameLibs/render/fluidDynamics/shaders/show_solution.sh b/prog/gameLibs/render/fluidDynamics/shaders/show_solution.sh index a6adc14ca..444b60044 100644 --- a/prog/gameLibs/render/fluidDynamics/shaders/show_solution.sh +++ b/prog/gameLibs/render/fluidDynamics/shaders/show_solution.sh @@ -20,13 +20,21 @@ shader show_cfd_solution } hlsl(ps) { + float calc_P(float rho) + { + const float M = 0.0289644f; // molar mass of air + const float R = 8.314462618f; // universal gas constant + const float T = 300.0f; // temperature in Kelvin + return rho * R * T / M; + } + float4 show_solution_ps(VsOutput input) : SV_Target { float4 val = tex2Dlod(plot_tex, float4(input.texcoord.xy,0,0)); if (plot_type == 0) // DENSITY { - float combined_density = dot(val, float4(1, 1, 1, 1)); - return lerp(float4(0, 0, 1, 1), float4(1, 0, 0, 1), smoothstep(0.8, 1.5, combined_density)); + float density = val.w; + return lerp(float4(0, 0, 1, 1), float4(1, 0, 0, 1), smoothstep(0.8, 1.5, density)); } else if (plot_type == 1) // SPEED { @@ -34,7 +42,11 @@ shader show_cfd_solution return magnitude > 0 ? lerp(float4(0, 0, 1, 1), float4(1, 0, 0, 1), smoothstep(5, 25.0, magnitude)) : float4(0, 0, 0, 1); } else if (plot_type == 2) // PRESSURE - return lerp(float4(0, 0, 1, 1), float4(1, 0, 0, 1), smoothstep(99000, 103700, val.z)); // In pascals + { + float density = val.w; + float pressure = calc_P(density); + return lerp(float4(0, 0, 1, 1), float4(1, 0, 0, 1), smoothstep(99000, 103700, pressure)); // In pascals + } else if (plot_type == 3) // PLACEHOLDER return float4(0.5, 0.5, 0.5, 1); else diff --git a/prog/gameLibs/render/fluidDynamics/shaders/voxelize_depth_above.sh b/prog/gameLibs/render/fluidDynamics/shaders/voxelize_depth_above.sh new file mode 100644 index 000000000..70bf763a1 --- /dev/null +++ b/prog/gameLibs/render/fluidDynamics/shaders/voxelize_depth_above.sh @@ -0,0 +1,53 @@ +include "shader_global.sh" +include "depth_above.sh" + +texture cfd_voxel_tex; +int4 cfd_voxel_tex_size; +float4 cfd_voxel_size; +float4 world_box_corner; + +shader voxelize_depth_above +{ + ENABLE_ASSERT(cs) + INIT_DEPTH_ABOVE(cs, blurred_depth) + USE_DEPTH_ABOVE_TC(cs) + + (cs) { + depth_above@smp2d = depth_around; + voxel_tex@uav = cfd_voxel_tex hlsl { + RWTexture3D voxel_tex@uav; + }; + tex_size@i3 = (cfd_voxel_tex_size.x, cfd_voxel_tex_size.y, cfd_voxel_tex_size.z); + voxel_size@f3 = cfd_voxel_size; + world_box_corner@f3 = world_box_corner; + } + + hlsl(cs) { + float3 getVoxelCornerInWorld(uint3 id) + { + return world_box_corner + id.xzy * voxel_size; + } + } + + hlsl(cs) { + [numthreads(8, 8, 1)] + void cs_main(uint3 tid : SV_DispatchThreadID) + { + if (tid.x >= tex_size.x || tid.y >= tex_size.y || tid.z >= tex_size.z) + return; + + float3 voxelCorner = getVoxelCornerInWorld(tid); + float3 voxelCenter = voxelCorner + voxel_size * 0.5f; + float2 depthAboveTc = saturate(world_to_depth_ao.xy * voxelCenter.xz + world_to_depth_ao.zw) - depth_ao_heights.zw; + + float height = decode_depth_above(tex2Dlod(depth_above, float4(depthAboveTc,0,0) ).x); + + + if (height > voxelCenter.y) + voxel_tex[tid] = 1u; + else + voxel_tex[tid] = 0u; + } + } + compile("cs_5_0", "cs_main") +} \ No newline at end of file diff --git a/prog/gameLibs/render/fluidDynamics/solver.cpp b/prog/gameLibs/render/fluidDynamics/solver.cpp index 9571b7429..0a7781ace 100644 --- a/prog/gameLibs/render/fluidDynamics/solver.cpp +++ b/prog/gameLibs/render/fluidDynamics/solver.cpp @@ -4,22 +4,19 @@ namespace cfd { -#define VARS_LIST \ - VAR(velocity_pressure_tex) \ - VAR(next_velocity_pressure_tex) \ - VAR(density_tex) \ - VAR(next_density_tex) \ - VAR(tex_size) \ - VAR(plot_type) \ - VAR(plot_tex) \ - VAR(simulation_dt) \ - VAR(simulation_dx) \ - VAR(simulation_time) \ - VAR(standard_density) \ - VAR(standard_velocity) \ - VAR(initial_density_tex) \ - VAR(euler_implicit_mode) \ - VAR(initial_velocity_pressure_tex) +#define VARS_LIST \ + VAR(velocity_density_tex) \ + VAR(next_velocity_density_tex) \ + VAR(tex_size) \ + VAR(plot_type) \ + VAR(plot_tex) \ + VAR(simulation_dt) \ + VAR(simulation_dx) \ + VAR(simulation_time) \ + VAR(standard_density) \ + VAR(standard_velocity) \ + VAR(initial_velocity_density_tex) \ + VAR(euler_implicit_mode) #define VAR(a) static int a##VarId = -1; VARS_LIST @@ -39,18 +36,14 @@ Solver::Solver(const char *solver_shader_name, uint32_t tex_width, uint32_t tex_ blurCs.reset(new_compute_shader("blur_result_cs")); showSolution.init("show_cfd_solution"); - velPressureTex[0] = - dag::create_tex(NULL, textureWidth, textureHeight, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, "velocity_pressure_tex"); - velPressureTex[1] = - dag::create_tex(NULL, textureWidth, textureHeight, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, "next_velocity_pressure_tex"); - densityTex[0] = dag::create_tex(NULL, textureWidth, textureHeight, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, "density_tex"); - densityTex[1] = dag::create_tex(NULL, textureWidth, textureHeight, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, "next_density_tex"); + velDensityTex[0] = + dag::create_tex(NULL, textureWidth, textureHeight, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, "velocity_density_tex"); + velDensityTex[1] = + dag::create_tex(NULL, textureWidth, textureHeight, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, "next_velocity_density_tex"); // Mirror for ghost cells on the edges - velPressureTex[0].getTex2D()->texaddr(TEXADDR_MIRROR); - velPressureTex[1].getTex2D()->texaddr(TEXADDR_MIRROR); - densityTex[0].getTex2D()->texaddr(TEXADDR_MIRROR); - densityTex[1].getTex2D()->texaddr(TEXADDR_MIRROR); + velDensityTex[0].getTex2D()->texaddr(TEXADDR_MIRROR); + velDensityTex[1].getTex2D()->texaddr(TEXADDR_MIRROR); ShaderGlobal::set_int4(tex_sizeVarId, IPoint4(textureWidth, textureHeight, 0, 0)); ShaderGlobal::set_real(simulation_dxVarId, spatal_step); @@ -58,8 +51,7 @@ Solver::Solver(const char *solver_shader_name, uint32_t tex_width, uint32_t tex_ void Solver::fillInitialConditions(float standard_density, const Point2 &standard_velocity) { - ShaderGlobal::set_texture(velocity_pressure_texVarId, velPressureTex[0]); - ShaderGlobal::set_texture(density_texVarId, densityTex[0]); + ShaderGlobal::set_texture(velocity_density_texVarId, velDensityTex[0]); ShaderGlobal::set_real(standard_densityVarId, standard_density); ShaderGlobal::set_color4(standard_velocityVarId, Color4(standard_velocity.x, standard_velocity.y, 0.0f, 0.0f)); @@ -75,10 +67,8 @@ void Solver::solveEquations(float dt, int num_dispatches) for (int i = 0; i < num_dispatches; ++i) { - ShaderGlobal::set_texture(velocity_pressure_texVarId, velPressureTex[currentIdx]); - ShaderGlobal::set_texture(next_velocity_pressure_texVarId, velPressureTex[1 - currentIdx]); - ShaderGlobal::set_texture(density_texVarId, densityTex[currentIdx]); - ShaderGlobal::set_texture(next_density_texVarId, densityTex[1 - currentIdx]); + ShaderGlobal::set_texture(velocity_density_texVarId, velDensityTex[currentIdx]); + ShaderGlobal::set_texture(next_velocity_density_texVarId, velDensityTex[1 - currentIdx]); ShaderGlobal::set_real(simulation_dtVarId, dt); ShaderGlobal::set_real(simulation_timeVarId, simulationTime); ShaderGlobal::set_int(euler_implicit_modeVarId, currentImplicit); @@ -89,10 +79,8 @@ void Solver::solveEquations(float dt, int num_dispatches) currentIdx = (currentIdx + 1) % 2; currentImplicit = (currentImplicit + 1) % 2; - ShaderGlobal::set_texture(velocity_pressure_texVarId, velPressureTex[currentIdx]); - ShaderGlobal::set_texture(next_velocity_pressure_texVarId, velPressureTex[1 - currentIdx]); - ShaderGlobal::set_texture(density_texVarId, densityTex[currentIdx]); - ShaderGlobal::set_texture(next_density_texVarId, densityTex[1 - currentIdx]); + ShaderGlobal::set_texture(velocity_density_texVarId, velDensityTex[currentIdx]); + ShaderGlobal::set_texture(next_velocity_density_texVarId, velDensityTex[1 - currentIdx]); blurCs->dispatchThreads(textureWidth, textureHeight, 1); @@ -105,18 +93,13 @@ void Solver::solveEquations(float dt, int num_dispatches) void Solver::showResult(PlotType plot_type) { ShaderGlobal::set_int(plot_typeVarId, (int)plot_type); - switch (plot_type) - { - case PlotType::DENSITY: ShaderGlobal::set_texture(plot_texVarId, densityTex[0].getTexId()); break; - case PlotType::SPEED: ShaderGlobal::set_texture(plot_texVarId, velPressureTex[0].getTexId()); break; - case PlotType::PRESSURE: ShaderGlobal::set_texture(plot_texVarId, velPressureTex[0].getTexId()); break; - } + ShaderGlobal::set_texture(plot_texVarId, velDensityTex[0].getTexId()); showSolution.render(); } int Solver::getNumDispatches() const { return totalNumDispatches; } -TEXTUREID Solver::getVelocityPressureTexId() const { return velPressureTex[0].getTexId(); } +TEXTUREID Solver::getVelocityDensityTexId() const { return velDensityTex[0].getTexId(); } float Solver::getSimulationTime() const { return simulationTime; } @@ -124,7 +107,7 @@ float Solver::getSimulationTime() const { return simulationTime; } // CascadeSolver // TODO: account for different number of cascades -static constexpr float cascadeDtMultipliers[4] = {4.f, 3.5f, 2.0f, 1.0f}; +static constexpr float cascadeDtMultipliers[4] = {2.0f, 2.0f, 1.5f, 1.0f}; CascadeSolver::CascadeSolver(const char *solver_shader_name, uint32_t tex_width, uint32_t tex_height, const eastl::array &num_dispatches_per_cascade, float spatial_step) : @@ -146,20 +129,14 @@ CascadeSolver::CascadeSolver(const char *solver_shader_name, uint32_t tex_width, newCascade.texSize = IPoint2(tex_width / (1 << (NUM_CASCADES - 1 - i)), tex_height / (1 << (NUM_CASCADES - 1 - i))); newCascade.spatialStep = spatial_step * (1 << (NUM_CASCADES - 1 - i)); newCascade.dtMultiplier = cascadeDtMultipliers[i]; - newCascade.velPressureTex[0] = dag::create_tex(NULL, newCascade.texSize.x, newCascade.texSize.y, + newCascade.velDensityTex[0] = dag::create_tex(NULL, newCascade.texSize.x, newCascade.texSize.y, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, String(0, "velocity_pressure_cascade_%d", i)); - newCascade.velPressureTex[1] = dag::create_tex(NULL, newCascade.texSize.x, newCascade.texSize.y, + newCascade.velDensityTex[1] = dag::create_tex(NULL, newCascade.texSize.x, newCascade.texSize.y, TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, String(0, "next_velocity_pressure_cascade_%d", i)); - newCascade.densityTex[0] = dag::create_tex(NULL, newCascade.texSize.x, newCascade.texSize.y, - TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, String(0, "density_cascade_%d", i)); - newCascade.densityTex[1] = dag::create_tex(NULL, newCascade.texSize.x, newCascade.texSize.y, - TEXFMT_A32B32G32R32F | TEXCF_UNORDERED, 1, String(0, "next_density_cascade_%d", i)); // Mirror for ghost cells on the edges - newCascade.velPressureTex[0].getTex2D()->texaddr(TEXADDR_MIRROR); - newCascade.velPressureTex[1].getTex2D()->texaddr(TEXADDR_MIRROR); - newCascade.densityTex[0].getTex2D()->texaddr(TEXADDR_MIRROR); - newCascade.densityTex[1].getTex2D()->texaddr(TEXADDR_MIRROR); + newCascade.velDensityTex[0].getTex2D()->texaddr(TEXADDR_MIRROR); + newCascade.velDensityTex[1].getTex2D()->texaddr(TEXADDR_MIRROR); } } @@ -180,17 +157,14 @@ void CascadeSolver::solveEquations(float dt, int num_dispatches) if (curNumDispatches > numDispatchesPerCascade[currentCascade]) return; - const float actualDt = dt * (cascades[currentCascade].dtMultiplier == 1 ? 1 : cascades[currentCascade].dtMultiplier / 1.5f); + const float actualDt = dt * cascades[currentCascade].dtMultiplier; int currentIdx = 0; int currentImplicit = 0; ShaderGlobal::set_real(simulation_dtVarId, actualDt); for (int i = 0; i < num_dispatches; ++i) { - ShaderGlobal::set_texture(velocity_pressure_texVarId, cascades[currentCascade].velPressureTex[currentIdx]); - ShaderGlobal::set_texture(next_velocity_pressure_texVarId, cascades[currentCascade].velPressureTex[1 - currentIdx]); - ShaderGlobal::set_texture(density_texVarId, cascades[currentCascade].densityTex[currentIdx]); - ShaderGlobal::set_texture(next_density_texVarId, cascades[currentCascade].densityTex[1 - currentIdx]); - ShaderGlobal::set_int(euler_implicit_modeVarId, currentImplicit); + ShaderGlobal::set_texture(velocity_density_texVarId, cascades[currentCascade].velDensityTex[currentIdx]); + ShaderGlobal::set_texture(next_velocity_density_texVarId, cascades[currentCascade].velDensityTex[1 - currentIdx]); solverCs->dispatchThreads(cascades[currentCascade].texSize.x, cascades[currentCascade].texSize.y, 1); @@ -198,10 +172,8 @@ void CascadeSolver::solveEquations(float dt, int num_dispatches) currentIdx = (currentIdx + 1) % 2; currentImplicit = (currentImplicit + 1) % 2; - ShaderGlobal::set_texture(velocity_pressure_texVarId, cascades[currentCascade].velPressureTex[currentIdx]); - ShaderGlobal::set_texture(next_velocity_pressure_texVarId, cascades[currentCascade].velPressureTex[1 - currentIdx]); - ShaderGlobal::set_texture(density_texVarId, cascades[currentCascade].densityTex[currentIdx]); - ShaderGlobal::set_texture(next_density_texVarId, cascades[currentCascade].densityTex[1 - currentIdx]); + ShaderGlobal::set_texture(velocity_density_texVarId, cascades[currentCascade].velDensityTex[currentIdx]); + ShaderGlobal::set_texture(next_velocity_density_texVarId, cascades[currentCascade].velDensityTex[1 - currentIdx]); blurCs->dispatchThreads(cascades[currentCascade].texSize.x, cascades[currentCascade].texSize.y, 1); @@ -222,16 +194,11 @@ void CascadeSolver::solveEquations(float dt, int num_dispatches) void CascadeSolver::showResult(PlotType plot_type) { ShaderGlobal::set_int(plot_typeVarId, (int)plot_type); - switch (plot_type) - { - case PlotType::DENSITY: ShaderGlobal::set_texture(plot_texVarId, cascades[currentCascade].densityTex[0].getTexId()); break; - case PlotType::SPEED: ShaderGlobal::set_texture(plot_texVarId, cascades[currentCascade].velPressureTex[0].getTexId()); break; - case PlotType::PRESSURE: ShaderGlobal::set_texture(plot_texVarId, cascades[currentCascade].velPressureTex[0].getTexId()); break; - } + ShaderGlobal::set_texture(plot_texVarId, cascades[currentCascade].velDensityTex[0].getTexId()); showSolution.render(); } -TEXTUREID CascadeSolver::getVelocityPressureTexId() const { return cascades[currentCascade].velPressureTex[0].getTexId(); } +TEXTUREID CascadeSolver::getVelocityDensityTexId() const { return cascades[currentCascade].velDensityTex[0].getTexId(); } float CascadeSolver::getSimulationTime() const { return simulationTime; } @@ -239,10 +206,8 @@ int CascadeSolver::getNumDispatches() const { return totalNumDispatches; } void CascadeSolver::switchToCascade(int cascade) { - ShaderGlobal::set_texture(velocity_pressure_texVarId, cascades[cascade].velPressureTex[0]); - ShaderGlobal::set_texture(next_velocity_pressure_texVarId, cascades[cascade].velPressureTex[1]); - ShaderGlobal::set_texture(density_texVarId, cascades[cascade].densityTex[0]); - ShaderGlobal::set_texture(next_density_texVarId, cascades[cascade].densityTex[1]); + ShaderGlobal::set_texture(velocity_density_texVarId, cascades[cascade].velDensityTex[0]); + ShaderGlobal::set_texture(next_velocity_density_texVarId, cascades[cascade].velDensityTex[1]); ShaderGlobal::set_int4(tex_sizeVarId, IPoint4(cascades[cascade].texSize.x, cascades[cascade].texSize.y, 0, 0)); ShaderGlobal::set_real(simulation_dxVarId, cascades[cascade].spatialStep); @@ -254,8 +219,7 @@ void CascadeSolver::switchToCascade(int cascade) void CascadeSolver::fillNextCascadeInitialConditions() { - ShaderGlobal::set_texture(initial_velocity_pressure_texVarId, cascades[currentCascade].velPressureTex[0]); - ShaderGlobal::set_texture(initial_density_texVarId, cascades[currentCascade].densityTex[0]); + ShaderGlobal::set_texture(initial_velocity_density_texVarId, cascades[currentCascade].velDensityTex[0]); initialConditionsFromTexCs->dispatchThreads(cascades[currentCascade + 1].texSize.x, cascades[currentCascade + 1].texSize.y, 1); } diff --git a/prog/gameLibs/render/fluidDynamics/voxelizeDepthAbove.cpp b/prog/gameLibs/render/fluidDynamics/voxelizeDepthAbove.cpp new file mode 100644 index 000000000..5709c2750 --- /dev/null +++ b/prog/gameLibs/render/fluidDynamics/voxelizeDepthAbove.cpp @@ -0,0 +1,25 @@ +#include + +namespace cfd +{ +Voxelizer::Voxelizer(IPoint3 vol_tex_size) : volTexSize(vol_tex_size), worldBoxSize(vol_tex_size.x, vol_tex_size.z, vol_tex_size.y) +{ + voxelizeCs.reset(new_compute_shader("voxelize_depth_above")); + voxelTex = dag::create_voltex(volTexSize.x, volTexSize.y, volTexSize.z, TEXFMT_R8UI | TEXCF_UNORDERED, 1, "cfd_voxel_tex"); + + ShaderGlobal::set_int4(get_shader_variable_id("cfd_voxel_tex_size"), IPoint4(volTexSize.x, volTexSize.y, volTexSize.z, 0)); + ShaderGlobal::set_color4(get_shader_variable_id("cfd_voxel_size"), metersPerVoxel, metersPerVoxel * 4, metersPerVoxel, 0); +} + +void Voxelizer::voxelizeDepthAbove(const Point3 &world_pos, const Point2 &world_y_min_max) +{ + const Point2 worldCenterXZ = Point2::xz(world_pos); + Point2 worldMinXZ = worldCenterXZ - Point2::xz(worldBoxSize) / 2.f; + + Point3 worldMin = Point3::xVy(worldMinXZ, world_y_min_max.x); + + ShaderGlobal::set_color4(get_shader_variable_id("world_box_corner"), Point4::xyz0(worldMin)); + + voxelizeCs->dispatchThreads(volTexSize.x, volTexSize.y, volTexSize.z); +} +} // namespace cfd diff --git a/prog/gameLibs/render/gpuGrass.cpp b/prog/gameLibs/render/gpuGrass.cpp index 27882bd78..f927e63ac 100644 --- a/prog/gameLibs/render/gpuGrass.cpp +++ b/prog/gameLibs/render/gpuGrass.cpp @@ -630,19 +630,70 @@ float GPUGrassBase::alignTo() const const float grassGridSizeMultiplied = getGridSizeEffective(); return grassLod.get() ? grassGridSizeMultiplied * 4.0f : grassGridSizeMultiplied * 2.0f; } -bool GPUGrassBase::isGrassLodsEnabled() const { return grassLod.get(); } + +namespace +{ +static constexpr float nextLodDistMul = 2.5f; +static constexpr float nextLodGridMul = 2.f; +static constexpr float lod0DistancePart = 0.2; +// for first lod we want to hide lods as much as possible. for next lods use 25% +static constexpr float lod1StartPart = 0.5, lodNStartPart = 0.75; +// 5 percent before previous lod start disappear, this one should fully appear +static constexpr float lod1FullPart = 0.7, lodNFullPart = 0.8; +} // namespace + +void GPUGrassBase::renderGrassLods(RenderGrassLodCallback renderGrassLod) const +{ + const float grassGridSizeMultiplied = getGridSizeEffective(); + const float grassDistanceMultiplied = getDistanceEffective(); + + float currentGridSize = grassGridSizeMultiplied; + float prevLodDistancePart = lod0DistancePart; + float currentGrassDistance = grassDistanceMultiplied * prevLodDistancePart; + // a*d0 + b = 1 //disappear + // a*d1 + b = 0 //full appear + // a = 1/(d0-d1); + // b = -d1/(d0-d1) + auto calcLinearLod = [](float full_disappear_dist, float full_appear_dist) // mul, add + { return Point2(1.f / (full_disappear_dist - full_appear_dist), -full_appear_dist / (full_disappear_dist - full_appear_dist)); }; + + const float lod0StartDisappearing = 0.75; // 25% for disappearing + const Point2 disappearTo = calcLinearLod(1.0f, lod0StartDisappearing); + ShaderGlobal::set_color4(grass_gen_lodVarId, 0, 0, disappearTo.x / currentGrassDistance, disappearTo.y); + ShaderGlobal::set_real(grass_gen_lod_indexVarId, 0); + renderGrassLod(currentGridSize, currentGrassDistance); + + // todo: generation can be even faster, if we rely on 2d frustum to cull definetly not visible groups. + // todo: generation can be even faster, if we rely on 3d frustum to cull not visible groups, using dispatch indirect (storing + // groups). + for (int lod = 1, lodCount = grassLod.get() ? MAX_LOD_NO : 1; lod <= lodCount; ++lod) + { + // change for new lod + const float lodStartDistancePart = currentGrassDistance * (lod == 1 ? lod1StartPart : lodNStartPart); + const float lodFullDistancePart = currentGrassDistance * (lod == 1 ? lod1FullPart : lodNFullPart); + currentGridSize *= nextLodGridMul; + prevLodDistancePart = min(1.f, prevLodDistancePart * nextLodDistMul); + currentGrassDistance = lod == lodCount ? grassDistance : grassDistance * prevLodDistancePart; //? + // ShaderGlobal::set_color4(grass_gen_lodVarId, + // 10*lodEquationA/currentGrassDistance, 10*lodEquationB - 9.4, 4./currentGrassDistance, -3); + + const Point2 appearFrom = calcLinearLod(lodStartDistancePart, lodFullDistancePart); + // 10 percent for disappearing if there is other lod + const Point2 disappearTo = calcLinearLod(currentGrassDistance, currentGrassDistance * ((lod == lodCount) ? 0.75 : 0.9)); + ShaderGlobal::set_color4(grass_gen_lodVarId, appearFrom.x, appearFrom.y, disappearTo.x, disappearTo.y); + ShaderGlobal::set_real(grass_gen_lod_indexVarId, lod); + d3d::resource_barrier({{grassInstancesIndirect.getBuf(), grassInstances.getBuf()}, {RB_NONE, RB_NONE}}); + renderGrassLod(currentGridSize, currentGrassDistance); + if (currentGrassDistance == grassDistance) + break; + } +} void GPUGrassBase::generateGrass(const Point2 &pos, const Point3 &view_dir, float min_ht_, float max_ht_, const frustum_heights_cb_t &cb, GrassPreRenderCallback pre_render_cb) { TIME_D3D_PROFILE(genGrass) - const float nextLodDistMul = 2.5f; - const float nextLodGridMul = 2.f; - const float lod0DistancePart = 0.2; - // for first lod we want to hide lods as much as possible. for next lods use 25% - const float lod1StartPart = 0.5, lodNStartPart = 0.75; - // 5 percent before previous lod start disappear, this one should fully appear - const float lod1FullPart = 0.7, lodNFullPart = 0.8; + const float grassGridSizeMultiplied = getGridSizeEffective(); const float grassDistanceMultiplied = getDistanceEffective(); const float alignSize = alignTo(); // align to cs grid size @@ -765,46 +816,8 @@ void GPUGrassBase::generateGrass(const Point2 &pos, const Point3 &view_dir, floa grassGenerator->dispatch((2 * quadSize + GRASS_WARP_SIZE_X - 1) / GRASS_WARP_SIZE_X, (2 * quadSize + GRASS_WARP_SIZE_Y - 1) / GRASS_WARP_SIZE_Y, 1); }; - float currentGridSize = grassGridSizeMultiplied; - float prevLodDistancePart = lod0DistancePart; - float currentGrassDistance = grassDistanceMultiplied * prevLodDistancePart; - // a*d0 + b = 1 //disappear - // a*d1 + b = 0 //full appear - // a = 1/(d0-d1); - // b = -d1/(d0-d1) - auto calcLinearLod = [](float full_disappear_dist, float full_appear_dist) // mul, add - { return Point2(1.f / (full_disappear_dist - full_appear_dist), -full_appear_dist / (full_disappear_dist - full_appear_dist)); }; - - const float lod0StartDisappearing = 0.75; // 25% for disappearing - const Point2 disappearTo = calcLinearLod(1.0f, lod0StartDisappearing); - ShaderGlobal::set_color4(grass_gen_lodVarId, 0, 0, disappearTo.x / currentGrassDistance, disappearTo.y); - ShaderGlobal::set_real(grass_gen_lod_indexVarId, 0); - renderGrassLod(currentGridSize, currentGrassDistance); - // todo: generation can be even faster, if we rely on 2d frustum to cull definetly not visible groups. - // todo: generation can be even faster, if we rely on 3d frustum to cull not visible groups, using dispatch indirect (storing - // groups). - for (int lod = 1, lodCount = grassLod.get() ? MAX_LOD_NO : 1; lod <= lodCount; ++lod) - { - // change for new lod - const float lodStartDistancePart = currentGrassDistance * (lod == 1 ? lod1StartPart : lodNStartPart); - const float lodFullDistancePart = currentGrassDistance * (lod == 1 ? lod1FullPart : lodNFullPart); - currentGridSize *= nextLodGridMul; - prevLodDistancePart = min(1.f, prevLodDistancePart * nextLodDistMul); - currentGrassDistance = lod == lodCount ? grassDistance : grassDistance * prevLodDistancePart; //? - // ShaderGlobal::set_color4(grass_gen_lodVarId, - // 10*lodEquationA/currentGrassDistance, 10*lodEquationB - 9.4, 4./currentGrassDistance, -3); - - const Point2 appearFrom = calcLinearLod(lodStartDistancePart, lodFullDistancePart); - // 10 percent for disappearing if there is other lod - const Point2 disappearTo = calcLinearLod(currentGrassDistance, currentGrassDistance * ((lod == lodCount) ? 0.75 : 0.9)); - ShaderGlobal::set_color4(grass_gen_lodVarId, appearFrom.x, appearFrom.y, disappearTo.x, disappearTo.y); - ShaderGlobal::set_real(grass_gen_lod_indexVarId, lod); - d3d::resource_barrier({{grassInstancesIndirect.getBuf(), grassInstances.getBuf()}, {RB_NONE, RB_NONE}}); - renderGrassLod(currentGridSize, currentGrassDistance); - if (currentGrassDistance == grassDistance) - break; - } + renderGrassLods(renderGrassLod); d3d::set_const_buffer(STAGE_CS, 1, 0); d3d::resource_barrier({{grassInstancesIndirect.getBuf(), grassInstances.getBuf()}, diff --git a/prog/gameLibs/render/grassify.cpp b/prog/gameLibs/render/grassify.cpp index 59ef5b5eb..5a3f6c177 100644 --- a/prog/gameLibs/render/grassify.cpp +++ b/prog/gameLibs/render/grassify.cpp @@ -12,17 +12,9 @@ static int globalFrameBlockId = -1; -enum -{ - MAX_LOD_NO = 2, - GRASS_LOD_COUNT = MAX_LOD_NO + 1 -}; - #define GLOBAL_VARS_LIST \ - VAR(grass_gen_lod) \ VAR(world_to_grass_slice) \ VAR(rendinst_landscape_area_left_top_right_bottom) \ - VAR_OPT(grass_gen_lod_index) \ VAR_OPT(grass_average_ht__ht_extent__avg_hor__hor_extent) #define VAR_OPT(a) static int a##VarId = -1; @@ -164,57 +156,11 @@ void GrassGenerateHelper::generate(const Point3 &position, const IPoint2 &grassM rendinst::LayerFlag::Opaque, rendinst::OptimizeDepthPass::No, 3); }; - const float nextLodDistMul = 2.5f; - const float nextLodGridMul = 2.f; - const float lod0DistancePart = 0.2; - // for first lod we want to hide lods as much as possible. for next lods use 25% - const float lod1StartPart = 0.5, lodNStartPart = 0.75; - // 5 percent before previous lod start disappear, this one should fully appear - const float lod1FullPart = 0.7, lodNFullPart = 0.8; - - const bool isGrassLodsEnabled = gpuGrassBase.isGrassLodsEnabled(); - const float grassDistance = gpuGrassBase.getGrassDistance(); - const float grassGridSizeMultiplied = gpuGrassBase.getGridSizeEffective(); - const float grassDistanceMultiplied = gpuGrassBase.getDistanceEffective(); - ShaderGlobal::set_color4(world_to_grass_sliceVarId, 1.0f / grassMaskDistance.x, 1.0f / grassMaskDistance.y, (-grassMaskOffset.x - halfPixelOffset.x) / grassMaskDistance.x, (-grassMaskOffset.y - halfPixelOffset.y) / grassMaskDistance.y); - float currentGridSize = grassGridSizeMultiplied; - float prevLodDistancePart = lod0DistancePart; - float currentGrassDistance = grassDistanceMultiplied * prevLodDistancePart; - // a*d0 + b = 1 //disappear - // a*d1 + b = 0 //full appear - // a = 1/(d0-d1); - // b = -d1/(d0-d1) - auto calcLinearLod = [](float full_disappear_dist, float full_appear_dist) // mul, add - { return Point2(1.f / (full_disappear_dist - full_appear_dist), -full_appear_dist / (full_disappear_dist - full_appear_dist)); }; - - const float lod0StartDisappearing = 0.75; // 25% for disappearing - const Point2 disappearTo = calcLinearLod(1.0f, lod0StartDisappearing); - ShaderGlobal::set_color4(grass_gen_lodVarId, 0, 0, disappearTo.x / currentGrassDistance, disappearTo.y); - ShaderGlobal::set_real(grass_gen_lod_indexVarId, 0); - renderGrassLod(currentGridSize, currentGrassDistance); - // todo: generate lods in one pass - for (int lod = 1, lodCount = isGrassLodsEnabled ? MAX_LOD_NO : 1; lod <= lodCount; ++lod) - { - // change for new lod - const float lodStartDistancePart = currentGrassDistance * (lod == 1 ? lod1StartPart : lodNStartPart); - const float lodFullDistancePart = currentGrassDistance * (lod == 1 ? lod1FullPart : lodNFullPart); - currentGridSize *= nextLodGridMul; - prevLodDistancePart = min(1.f, prevLodDistancePart * nextLodDistMul); - currentGrassDistance = lod == lodCount ? grassDistance : grassDistance * prevLodDistancePart; //? - - const Point2 appearFrom = calcLinearLod(lodStartDistancePart, lodFullDistancePart); - // 10 percent for disappearing if there is other lod - const Point2 disappearTo = calcLinearLod(currentGrassDistance, currentGrassDistance * ((lod == lodCount) ? 0.75 : 0.9)); - ShaderGlobal::set_color4(grass_gen_lodVarId, appearFrom.x, appearFrom.y, disappearTo.x, disappearTo.y); - ShaderGlobal::set_real(grass_gen_lod_indexVarId, lod); - renderGrassLod(currentGridSize, currentGrassDistance); - if (currentGrassDistance == grassDistance) - break; - } + gpuGrassBase.renderGrassLods(renderGrassLod); ShaderElement::invalidate_cached_state_block(); } diff --git a/prog/gameLibs/render/lightProbeSpecularCubesContainer.cpp b/prog/gameLibs/render/lightProbeSpecularCubesContainer.cpp index f88d2bf40..b4379bb4d 100644 --- a/prog/gameLibs/render/lightProbeSpecularCubesContainer.cpp +++ b/prog/gameLibs/render/lightProbeSpecularCubesContainer.cpp @@ -64,7 +64,7 @@ void LightProbeSpecularCubesContainer::init(const int cube_size, uint32_t textur compressor = eastl::make_unique(BcCompressor::COMPRESSION_BC6H, compressedMips, cubeSize, cubeSize, 1, "bc6h_compressor"); - if (compressor->getCompressionType() == BcCompressor::COMPRESSION_ERR) + if (!compressor->isValid()) { logwarn("Can't create a compressor for light probes specular"); compressionAvailable = false; diff --git a/prog/gameLibs/render/shaders/decals/decals.sh b/prog/gameLibs/render/shaders/decals/decals.sh index 62026f26e..115188c06 100644 --- a/prog/gameLibs/render/shaders/decals/decals.sh +++ b/prog/gameLibs/render/shaders/decals/decals.sh @@ -11,23 +11,30 @@ endmacro macro USE_PLANAR_DECALS(start_params_no) hlsl { - // minAng80 = 0.174 maxAng45 = 0.707 (influence - minAng80) / (maxAng45 - minAng80) - #define INFLUENCE_MUL 1.87617 - #define INFLUENCE_ADD 0.32645 - - #define TYPE_SCALE_MUL 1024 - float GetInfluence(float influence) { - return saturate(influence * INFLUENCE_MUL + INFLUENCE_ADD); + float minAng80 = 0.174; + float maxAng45 = 0.707; + return saturate((influence - minAng80) / (maxAng45 - minAng80)); } #define DECAL_GET_DYNREND_PARAM(param_no, dynrend_params_offset_count) ((int)param_no < (int)dynrend_params_offset_count.y ? \ loadBuffer(per_chunk_render_data, dynrend_params_offset_count.x + param_no) : float4(0, 0, 0, 0)) + void planar_decals_vs_common( + inout int4 dec_mul, inout float4 type_scale, float2 dynrend_params_offset_count) + { + float2 params = dynrend_params_offset_count; + float4 decal_encoded_widht__multiplier = DECAL_GET_DYNREND_PARAM(start_params_no, params); + dec_mul = (-2 * (frac(decal_encoded_widht__multiplier) >= 0.5) + 1); + dec_mul *= (frac(decal_encoded_widht__multiplier * 2) >= 0.5) + 1; + dec_mul *= frac(decal_encoded_widht__multiplier * 4) >= 0.5; + type_scale = decal_encoded_widht__multiplier / 1024; + } + void planar_decals_vs( inout float4 decals_uv_depth_influence, - int decal_idx, float type_scale_inv, float3 model_pos, + int decal_idx, int dec_mul, float type_scale, float3 model_pos, float3 model_normal, float2 dynrend_params_offset_count) { float2 params = dynrend_params_offset_count; @@ -38,13 +45,30 @@ macro USE_PLANAR_DECALS(start_params_no) int norm_idx = start_params_no + 1 + 16 + i * 2; float4 n0 = DECAL_GET_DYNREND_PARAM(norm_idx + 0, params); + float4 n1 = DECAL_GET_DYNREND_PARAM(norm_idx + 1, params); float influence0 = dot(model_normal, n0.xyz); - - decals_uv_depth_influence.z = dot(modelPos4, n0) * type_scale_inv; - decals_uv_depth_influence.w = GetInfluence(influence0); - decals_uv_depth_influence.xy = float2( - dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 0, params)), - dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 1, params))); + float influence1 = dot(model_normal, n1.xyz); + FLATTEN + if (dec_mul < 0 && influence1 > influence0) + { + decals_uv_depth_influence.z = dot(modelPos4, n1) / type_scale; + decals_uv_depth_influence.w = GetInfluence(influence1); + decals_uv_depth_influence.xy = float2( + dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 2, params)), + dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 3, params))); + if (dec_mul < -1) + { + decals_uv_depth_influence.x = 1 - decals_uv_depth_influence.x; + } + } + else + { + decals_uv_depth_influence.z = dot(modelPos4, n0) / type_scale; + decals_uv_depth_influence.w = GetInfluence(influence0); + decals_uv_depth_influence.xy = float2( + dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 0, params)), + dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 1, params))); + } } void apply_planar_decals_vs( @@ -56,11 +80,12 @@ macro USE_PLANAR_DECALS(start_params_no) float3 model_normal, float2 dynrend_params_offset_count) { - float4 decal_encoded_widht__multiplier = DECAL_GET_DYNREND_PARAM(start_params_no, dynrend_params_offset_count); - float4 typeScaleInv = TYPE_SCALE_MUL / decal_encoded_widht__multiplier; + int4 decMul = 0; + float4 typeScale = 0; + planar_decals_vs_common(decMul, typeScale, dynrend_params_offset_count); #define VS_CALC_DECAL(idx) \ - planar_decals_vs(decals_uv_depth_influence_##idx, idx, typeScaleInv[idx], \ + planar_decals_vs(decals_uv_depth_influence_##idx, idx, decMul[idx], typeScale[idx], \ model_pos, model_normal, dynrend_params_offset_count); VS_CALC_DECAL(0); @@ -78,43 +103,19 @@ macro USE_PLANAR_DECALS(start_params_no) #define DIFFUSE_MUL_RCP (1.0f / (DIFFUSE_TO_DECAL * DIFFUSE_TO_DECAL + 1e-6)) void process_decal_indexed( - int decalIndex, float4 decal_uv_depth_influence, half diffMul, float4 modelPos4, float3 model_normal, float2 params, - int dec_mul, float type_scale_inv, inout half4 decalEffect, inout half3 diffuseColor) + int decalIndex, float4 decal_uv_depth_influence, half diffMul, float2 params, + inout half4 decalEffect, inout half3 diffuseColor) { int i = decalIndex; int uv_idx = start_params_no + 1 + 16 + 8 + i; - float2 uv = decal_uv_depth_influence.xy; - float depth = decal_uv_depth_influence.z; - float influence = decal_uv_depth_influence.w; - - // apply a mirrored decal in the pixel shader only to avoid interpolation artifacts - BRANCH - if (dec_mul < 0) - { - int line_idx = start_params_no + 1 + 4 * i; - int norm_idx = start_params_no + 1 + 16 + i * 2; - float4 n1 = DECAL_GET_DYNREND_PARAM(norm_idx + 1, params); - float influence1 = dot(model_normal, n1.xyz); - FLATTEN - if (influence1 > influence) - { - depth = dot(modelPos4, n1) * type_scale_inv; - influence = GetInfluence(influence1); - uv = float2( - dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 2, params)), - dot(modelPos4, DECAL_GET_DYNREND_PARAM(line_idx + 3, params))); - if (dec_mul < -1) - { - uv.x = 1 - uv.x; - } - } - } - float4 uvScaleOffset = GET_DYNREND_PARAM(uv_idx, params); float2 uvScale = uvScaleOffset.zw - uvScaleOffset.xy; #define CLAMP_BORDER_ATLAS(a, name, val) if (a.x <= 0.0f || a.x >= 1.0f || a.y <= 0.0f || a.y >= 1.0f) {name = val;} + float2 uv = decal_uv_depth_influence.xy; + float depth = decal_uv_depth_influence.z; + float influence = decal_uv_depth_influence.w; half4 decal = all((half2)uvScale) ? h4tex2D(atlas, uv * uvScale + uvScaleOffset.xy) : half4(0.h, 0.h, 0.h, 0.h); CLAMP_BORDER_ATLAS(uv, decal, half4(0.h, 0.h, 0.h, 0.h)); #undef CLAMP_BORDER_ATLAS @@ -124,25 +125,17 @@ macro USE_PLANAR_DECALS(start_params_no) half apply_planar_decals_ps( inout half3 diffuseColor, - float3 model_pos, - float3 model_normal, float4 decals_uv_depth_influence_0, float4 decals_uv_depth_influence_1, float4 decals_uv_depth_influence_2, float4 decals_uv_depth_influence_3, float2 dynrend_params_offset_count) { - float4 decal_encoded_widht__multiplier = DECAL_GET_DYNREND_PARAM(start_params_no, dynrend_params_offset_count); - int4 decMul = (-2 * (frac(decal_encoded_widht__multiplier) >= 0.5) + 1); - decMul *= (frac(decal_encoded_widht__multiplier * 2) >= 0.5) + 1; - decMul *= frac(decal_encoded_widht__multiplier * 4) >= 0.5; - float4 typeScaleInv = TYPE_SCALE_MUL / decal_encoded_widht__multiplier; - half diffMul = saturate(luminance(diffuseColor.rgb) * (half)DIFFUSE_MUL_RCP); half4 decalEffect = 0.h; #define PROCESS_DECAL(idx) process_decal_indexed(\ - idx, decals_uv_depth_influence_##idx, diffMul, float4(model_pos, 1), model_normal, dynrend_params_offset_count, decMul[idx], typeScaleInv[idx], decalEffect, diffuseColor) + idx, decals_uv_depth_influence_##idx, diffMul, dynrend_params_offset_count, decalEffect, diffuseColor) PROCESS_DECAL(0); PROCESS_DECAL(1); @@ -161,7 +154,7 @@ macro USE_PLANAR_DECALS(start_params_no) apply_planar_decals_vs(decals_uv_depth_influence[0], decals_uv_depth_influence[1], decals_uv_depth_influence[2], decals_uv_depth_influence[3], model_pos, model_normal, dynrend_params_offset_count); - return apply_planar_decals_ps(diffuseColor, model_pos, model_normal, decals_uv_depth_influence[0], decals_uv_depth_influence[1], decals_uv_depth_influence[2], + return apply_planar_decals_ps(diffuseColor, decals_uv_depth_influence[0], decals_uv_depth_influence[1], decals_uv_depth_influence[2], decals_uv_depth_influence[3], dynrend_params_offset_count); } } diff --git a/prog/gameLibs/render/shaders/flexible_scale_rasterization.sh b/prog/gameLibs/render/shaders/flexible_scale_rasterization.sh index 0d93cb43e..ff547fdd1 100644 --- a/prog/gameLibs/render/shaders/flexible_scale_rasterization.sh +++ b/prog/gameLibs/render/shaders/flexible_scale_rasterization.sh @@ -2,14 +2,15 @@ int fsr_distortion = 0; interval fsr_distortion: no < 1, yes; -int fsr_lut_id = 0; +int fsr_resolve_lut_id = 0; +int fsr_distortion_lut_id = 0; macro USE_FSR(code) if (hardware.ps5 && fsr_distortion == yes) { (code) { - fsr_lut_id@i1 = fsr_lut_id; + fsr_lut_id@i2 = (fsr_resolve_lut_id, fsr_distortion_lut_id); fsr_viewport@f4 = get_viewport(); } @@ -18,24 +19,44 @@ macro USE_FSR(code) RegularBuffer static_textures : BINDLESS_TEX_REGISTER; RegularBuffer static_samplers : BINDLESS_SAMPLER_REGISTER; - uint2 fsrPos(uint2 pos, uint2 size) + float2 linearToDistortedTc(float2 tc) { - Texture1D fsrLutH = static_textures[fsr_lut_id]; - Texture1D fsrLutV = static_textures[fsr_lut_id + 1]; + Texture1D fsrLutH = static_textures[fsr_lut_id.x]; + Texture1D fsrLutV = static_textures[fsr_lut_id.x + 1]; SamplerState smp = static_samplers[0]; + return float2(fsrLutH.Sample(smp, tc.x), fsrLutV.Sample(smp, tc.y)); + } + + float2 distortedToLinearTc(float2 tc) + { + Texture1D fsrLutH = static_textures[fsr_lut_id.y]; + Texture1D fsrLutV = static_textures[fsr_lut_id.y + 1]; + SamplerState smp = static_samplers[0]; + + return float2(fsrLutH.Sample(smp, tc.x), fsrLutV.Sample(smp, tc.y)); + } + + uint2 linearToDistortedPos(uint2 pos, uint2 size) + { + float2 tc = float2(pos) / float2(size); + return uint2(linearToDistortedTc(tc) * size); + } + + uint2 distortedToLinearPos(uint2 pos, uint2 size) + { float2 tc = float2(pos) / float2(size); - return uint2(fsrLutH.Sample(smp, tc.x) * size.x, fsrLutV.Sample(smp, tc.y) * size.y); + return uint2(distortedToLinearTc(tc) * size); } - float2 getTexcoord(float2 pos) + float2 getLinearTc(float2 pos) { return (pos - fsr_viewport.xy) / fsr_viewport.zw; } - float2 getTexcoord(float2 pos, float2 texcoord) + float2 getLinearTc(float2 pos, float2 tc) { - return getTexcoord(pos); + return getLinearTc(pos); } #define FSR_DISTORTION 1 @@ -45,14 +66,29 @@ macro USE_FSR(code) { hlsl(code) { - uint2 fsrPos(uint2 pos, uint2 size) + uint2 linearToDistortedPos(uint2 pos, uint2 size) + { + return pos; + } + + uint2 distortedToLinearPos(uint2 pos, uint2 size) { return pos; } - float2 getTexcoord(float2 pos, float2 texcoord) + float2 linearToDistortedTc(float2 tc) + { + return tc; + } + + float2 distortedToLinearTc(float2 tc) + { + return tc; + } + + float2 getLinearTc(float2 pos, float2 tc) { - return texcoord; + return tc; } } } diff --git a/prog/gameLibs/render/shaders/flow_map.sh b/prog/gameLibs/render/shaders/flow_map.sh index 8ada8cde2..eb0b36f45 100644 --- a/prog/gameLibs/render/shaders/flow_map.sh +++ b/prog/gameLibs/render/shaders/flow_map.sh @@ -150,6 +150,7 @@ shader water_flowmap if (any(heightNeighbours > waterHeight)) { float2 heightGradient = float2(heightNeighbours.w - heightNeighbours.z, heightNeighbours.x - heightNeighbours.y); + heightGradient = normalize(heightGradient); float2 floodfillVec = tex2Dlod(flowmap_floodfill_tex, float4(htc,0,0)).rg * 2 - 1; heightGradient *= heightGradient.x * floodfillVec.x + heightGradient.y * floodfillVec.y; f.xy += heightGradient; diff --git a/prog/gameLibs/render/shaders/hardware_defines.sh b/prog/gameLibs/render/shaders/hardware_defines.sh index ab46fa225..0f25eedab 100644 --- a/prog/gameLibs/render/shaders/hardware_defines.sh +++ b/prog/gameLibs/render/shaders/hardware_defines.sh @@ -184,6 +184,12 @@ hlsl { } ##if hardware.dx11 || hardware.dx12 || hardware.metal #define PRECISE precise + ##elif hardware.vulkan + #if SHADER_COMPILER_DXC + #define PRECISE precise + #else + #define PRECISE + #endif ##else #define PRECISE ##endif diff --git a/prog/gameLibs/render/shaders/hudprim/gui_aces.sh b/prog/gameLibs/render/shaders/hudprim/gui_aces.sh index c03f9491f..971d9813b 100644 --- a/prog/gameLibs/render/shaders/hudprim/gui_aces.sh +++ b/prog/gameLibs/render/shaders/hudprim/gui_aces.sh @@ -3,6 +3,7 @@ include "cloud_mask.sh" include "gui_aces_helpers.sh" include "gbuffer.sh" include "gui_aces_common.sh" +include "flexible_scale_rasterization.sh" float4 gui_to_scene_point_to_eye = (0, 0, 0, 0); @@ -39,6 +40,10 @@ shader gui_aces USE_ATEST_1() USE_GUI_ACES_HELPERS() + INIT_LOAD_DEPTH_GBUFFER() + USE_LOAD_DEPTH_GBUFFER() + USE_FSR(ps) + channel float4 pos = pos; if (gui_write_to_z == write_to_z_on) @@ -107,8 +112,12 @@ shader gui_aces #define OGL_SET_SCREEN_POSITION(OUT, OUTpos) OUT.screenPosition = OUTpos.xyw; } hlsl(ps) { - #define OGL_DEPTH_TEST(VSOUT) {float2 ftc=(VSOUT.screenPosition.xy * rcp(VSOUT.screenPosition.z))*RT_SCALE_HALF+HALF_PLUS_HALF_PIXEL_OFS;\ - clip(linearize_z(readGbufferDepth(ftc), zn_zfar.zw)-gui_cockpit_depth);} + #ifdef FSR_DISTORTION + #define OGL_DEPTH_TEST(VSOUT) {clip(linearize_z(loadGbufferDepth(GET_SCREEN_POS(VSOUT.pos).xy), zn_zfar.zw)-gui_cockpit_depth);} + #else + #define OGL_DEPTH_TEST(VSOUT) {float2 ftc=(VSOUT.screenPosition.xy * rcp(VSOUT.screenPosition.z))*RT_SCALE_HALF+HALF_PLUS_HALF_PIXEL_OFS;\ + clip(linearize_z(readGbufferDepth(ftc), zn_zfar.zw)-gui_cockpit_depth);} + #endif } } else { @@ -117,8 +126,12 @@ shader gui_aces #define OGL_SET_SCREEN_POSITION(OUT, OUTpos) OUT.screenPosition = OUTpos.xyw; } hlsl(ps) { - #define OGL_DEPTH_TEST(VSOUT) {float2 ftc=(VSOUT.screenPosition.xy *rcp(VSOUT.screenPosition.z))*RT_SCALE_HALF+HALF_PLUS_HALF_PIXEL_OFS;\ - clip(linearize_z(readGbufferDepth(ftc), zn_zfar.zw)-VSOUT.screenPosition.z);} + #ifdef FSR_DISTORTION + #define OGL_DEPTH_TEST(VSOUT) {clip(linearize_z(loadGbufferDepth(GET_SCREEN_POS(VSOUT.pos).xy), zn_zfar.zw)-VSOUT.screenPosition.z);} + #else + #define OGL_DEPTH_TEST(VSOUT) {float2 ftc=(VSOUT.screenPosition.xy *rcp(VSOUT.screenPosition.z))*RT_SCALE_HALF+HALF_PLUS_HALF_PIXEL_OFS;\ + clip(linearize_z(readGbufferDepth(ftc), zn_zfar.zw)-VSOUT.screenPosition.z);} + #endif } } } else diff --git a/prog/gameLibs/render/shaders/tracer.sh b/prog/gameLibs/render/shaders/tracer.sh index dce85d006..396b779c0 100644 --- a/prog/gameLibs/render/shaders/tracer.sh +++ b/prog/gameLibs/render/shaders/tracer.sh @@ -40,8 +40,9 @@ float tracer_start_color_fade_time_inv = 4.0; int tracer_prim_type = 0; interval tracer_prim_type: tracer_prim_type_dir < 1, tracer_prim_type_caps; -int tracer_commands_count_const_no = 10 always_referenced; -int tracer_commands_array_const_no = 11 always_referenced; +int tracer_batch_size = 0; +buffer tracer_create_commands; +buffer tracer_data_buffer; block(scene) tracer_frame { @@ -82,23 +83,43 @@ block(scene) tracer_frame shader fx_create_cmd_cs { ENABLE_ASSERT(cs) - hlsl { - #include "../tracer/tracer.hlsli" - #include + (cs) { + commands_count@i1 = tracer_batch_size; + if (fx_create_cmd == fx_create_tracer) + { + tracer_commands@cbuf = tracer_create_commands hlsl { + #include "../tracer/tracer.hlsli" + #include + cbuffer tracer_commands@cbuf + { + GPUFxTracerCreate commands[FX_TRACER_MAX_CREATE_COMMANDS]; + } + }; + dataBuffer@uav = tracer_data_buffer hlsl { + RWStructuredBuffer dataBuffer@uav; + } + } + else + { + tracer_commands@cbuf = tracer_create_commands hlsl { + #include "../tracer/tracer.hlsli" + #include + cbuffer tracer_commands@cbuf + { + GPUFxSegmentCreate commands[FX_TRACER_MAX_CREATE_COMMANDS]; + } + }; + dataBuffer@uav = tracer_data_buffer hlsl { + RWStructuredBuffer dataBuffer@uav; + } + } } hlsl(cs) { - uint commandsCount: register(c10); // Keep constant insync with tracer_commands_count_const_no -##if fx_create_cmd == fx_create_tracer - GPUFxTracerCreate commands[FX_TRACER_MAX_CREATE_COMMANDS]: register(c11); // Keep constant index sync with tracer_commands_array_const_no - RWStructuredBuffer dataBuffer: register(u0); -##else - GPUFxSegmentCreate commands[FX_TRACER_MAX_CREATE_COMMANDS]: register(c11); // Keep constant index sync with tracer_commands_array_const_no - RWStructuredBuffer dataBuffer: register(u0); -##endif [numthreads(FX_TRACER_COMMAND_WARP_SIZE, 1, 1)] void main(uint3 dtId: SV_DispatchThreadID) { uint commandId = dtId.x; + uint commandsCount = commands_count; if (commandId >= commandsCount) return; structuredBufferAt(dataBuffer, commands[commandId].id) = commands[commandId].data; diff --git a/prog/gameLibs/render/texcompressors/bcCompressor.cpp b/prog/gameLibs/render/texcompressors/bcCompressor.cpp index d2d8149af..85c707e96 100644 --- a/prog/gameLibs/render/texcompressors/bcCompressor.cpp +++ b/prog/gameLibs/render/texcompressors/bcCompressor.cpp @@ -80,7 +80,7 @@ BcCompressor::BcCompressor(ECompressionType compr_type, unsigned int buffer_mips unsigned int buffer_height, int htiles, const char *bc_shader) : vb(NULL), bufferTex(NULL), bufferMips(0), bufferWidth(0), bufferHeight(0), compressionType(compr_type), vbFiller(verts) { - G_ASSERT(compressionType < COMPRESSION_ERR); + G_ASSERT(isValid()); srcTexVarId = ::get_shader_variable_id(shader_var_src_tex, true); srcMipVarId = ::get_shader_variable_id(shader_var_src_mip, true); dstMipVarId = ::get_shader_variable_id(shader_var_dst_mip, true); @@ -141,7 +141,7 @@ void BcCompressor::VbFiller::reloadD3dRes(Sbuffer *sb) bool BcCompressor::resetBuffer(unsigned int mips, unsigned int width, unsigned int height, int htiles) { - G_ASSERT(compressionType < COMPRESSION_ERR); + G_ASSERT(isValid()); if (width == bufferWidth && height == bufferHeight) return true; @@ -221,7 +221,7 @@ void BcCompressor::updateFromMip(TEXTUREID src_id, int src_mip, int dst_mip, int void BcCompressor::updateFromFaceMip(TEXTUREID src_id, int src_face, int src_mip, int dst_mip, int tiles) { - G_ASSERT(compressionType < COMPRESSION_ERR); + G_ASSERT(isValid()); G_ASSERT(src_id != BAD_TEXTUREID); G_ASSERT(dst_mip >= src_mip); // render to buffer @@ -294,7 +294,7 @@ void BcCompressor::copyTo(Texture *dest_tex, int dest_x, int dest_y, int src_x, void BcCompressor::copyToMip(Texture *dest_tex, int dest_mip, int dest_x, int dest_y, int src_mip, int src_x, int src_y, int width, int height) { - G_ASSERT(compressionType < COMPRESSION_ERR); + G_ASSERT(isValid()); G_ASSERT(dest_tex && compressionType == get_texture_compression_type(dest_tex)); // copy to target width = width < 0 ? (bufferWidth >> src_mip) : width; @@ -308,3 +308,5 @@ BcCompressor::ECompressionType BcCompressor::getCompressionType() const { return compressMat.get() || compressElemCompute.get() ? compressionType : COMPRESSION_ERR; } + +bool BcCompressor::isValid() const { return compressionType != COMPRESSION_ERR; } diff --git a/prog/gameLibs/render/tireTracks.cpp b/prog/gameLibs/render/tireTracks.cpp index fb7ac0c33..6cedaa38d 100644 --- a/prog/gameLibs/render/tireTracks.cpp +++ b/prog/gameLibs/render/tireTracks.cpp @@ -962,7 +962,8 @@ void beforeRender(float dt, const Point3 &origin) void invalidate_region(const BBox3 &bbox) { - float radius = max(bbox.width().x, max(bbox.width().y, bbox.width().z)) / 2; + // increase a radius a bit to make sure track marks are removed from region entirely + float radius = max(bbox.width().x, max(bbox.width().y, bbox.width().z)) / 2 + 0.5; for (int i = 0; i < used_emitters.size(); i++) { for (int j = 0; j < 2; ++j) diff --git a/prog/gameLibs/render/toroidalStaticShadows/toroidalStaticShadowCascade.cpp b/prog/gameLibs/render/toroidalStaticShadows/toroidalStaticShadowCascade.cpp index e1dd61643..3df3f68ef 100644 --- a/prog/gameLibs/render/toroidalStaticShadows/toroidalStaticShadowCascade.cpp +++ b/prog/gameLibs/render/toroidalStaticShadows/toroidalStaticShadowCascade.cpp @@ -785,6 +785,8 @@ void ToroidalStaticShadowCascade::renderRegions(dag::ConstSpan elem } } -void TracerManager::DrawBuffer::process(ComputeShaderElement *cs, int commands_array_const_no, int commands_count_const_no, - int fx_create_cmd, int element_count) +void TracerManager::DrawBuffer::process(ComputeShaderElement *cs, int fx_create_cmd, int element_count) { if (!buf || cmds.empty()) return; @@ -362,33 +367,29 @@ void TracerManager::DrawBuffer::process(ComputeShaderElement *cs, int commands_a static int fxCreateCmdVarId = get_shader_variable_id("fx_create_cmd"); ShaderGlobal::set_int(fxCreateCmdVarId, fx_create_cmd); - d3d::set_rwbuffer(STAGE_CS, 0, buf.get()); + ShaderGlobal::set_buffer(get_shader_variable_id("tracer_data_buffer"), buf.getBufId()); uint32_t elemSize = cmdSize; G_ASSERT((elemSize % 16) == 0); int elemCount = cmds.size() / elemSize; - const int commandSizeInConsts = (elemSize + 15) / 16; - const int reqSize = commands_array_const_no + elemCount * commandSizeInConsts; - const int commandCbufferSize = d3d::set_cs_constbuffer_size(reqSize) - commands_array_const_no; - uint32_t v[4] = {0}; - G_ASSERT(elemCount >= cmd); - for (int i = max(elemCount - cmd, 0); i < elemCount; i += commandCbufferSize / commandSizeInConsts) + for (int i = max(elemCount - cmd, 0); i < elemCount;) { - int batch_size = min(elemCount - i, commandCbufferSize / commandSizeInConsts); - v[0] = batch_size; - d3d::set_cs_const(commands_count_const_no, (float *)v, 1); + int batch_size = min(elemCount - i, FX_TRACER_MAX_CREATE_COMMANDS); + + createCmdBuf->updateData(0, batch_size * cmdSize, &cmds[i * elemSize], VBLOCK_DISCARD); + + ShaderGlobal::set_int(get_shader_variable_id("tracer_batch_size"), batch_size); + ShaderGlobal::set_buffer(get_shader_variable_id("tracer_create_commands"), createCmdBuf.getBufId()); - d3d::set_cs_const(commands_array_const_no, (float *)&cmds[i * elemSize], batch_size * commandSizeInConsts); - cs->dispatch((batch_size + FX_TRACER_COMMAND_WARP_SIZE - 1) / FX_TRACER_COMMAND_WARP_SIZE, 1, 1); + cs->dispatchThreads(batch_size, 1, 1); + + i += batch_size; } cmd = 0; erase_items(cmds, 0, elemSize * max(elemCount, 0)); - - d3d::set_cs_constbuffer_size(0); - d3d::set_rwbuffer(STAGE_CS, 0, 0); } else { @@ -417,7 +418,9 @@ TracerManager::TracerManager(const DataBlock *blk) : preparing(false), curTime(0), tracerLimitExceedMsg(false), - eyeDistBlend(0, 0) + eyeDistBlend(0, 0), + viewPos(0, 0, 0), + viewItm(TMatrix::IDENT) { tracerBlockId = ShaderGlobal::getBlockId("tracer_frame"); @@ -514,9 +517,6 @@ TracerManager::TracerManager(const DataBlock *blk) : if (computeSupported) createCmdCs = new_compute_shader("fx_create_cmd_cs"); - commandsCountConstNo = ShaderGlobal::get_int_fast(::get_shader_variable_id("tracer_commands_count_const_no")); - commandsArrayConstNo = ShaderGlobal::get_int_fast(::get_shader_variable_id("tracer_commands_array_const_no")); - initHeads(); initTrails(); @@ -639,8 +639,8 @@ void TracerManager::doJob() const TracerSegment &tracerSegment = tracer->segments[segmentNo]; G_ASSERT(tracerSegment.partNum > 0); - float distance = point_to_segment_distance(::grs_cur_view.pos, tracerSegment.startPos, tracerSegment.endPos); - float dot = ::grs_cur_view.itm.getcol(2) * tracer->dir; + float distance = point_to_segment_distance(viewPos, tracerSegment.startPos, tracerSegment.endPos); + float dot = viewItm.getcol(2) * tracer->dir; float angle = safe_sqrt(1.f - dot * dot); angle = angle * 0.5f + 0.5f; float visibility = angle * max(0.0f, 1.f - distance / tailFartherLodDist); @@ -1027,7 +1027,7 @@ void TracerManager::initHeads() tracerTypeBuffer.unlock(); } -void TracerManager::renderHeads() +void TracerManager::renderHeads(const Point3 &view_pos, const TMatrix &view_itm) { headRendElem.shElem->setStates(0, true); if (headVb) @@ -1062,9 +1062,9 @@ void TracerManager::renderHeads() if (tracerTypes[tracer->typeNo].color1.a <= 0.0f) continue; - Point3 distVec = tracer->pos - ::grs_cur_view.pos; + Point3 distVec = tracer->pos - view_pos; float eyeDist = distVec.length(); - float viewDist = dot(distVec, ::grs_cur_view.itm.getcol(2)); + float viewDist = dot(distVec, view_itm.getcol(2)); float distAlpha = eyeDistBlend.x > 0 || eyeDistBlend.y > 0 ? cvt(eyeDist, eyeDistBlend.x, eyeDistBlend.y, 1.0f, 0.0f) : 1.0f; if (distAlpha <= 0.0f) continue; @@ -1142,7 +1142,7 @@ void TracerManager::releaseRes() segmentBuffer.close(); } -void TracerManager::beforeRender(const Frustum *f) +void TracerManager::beforeRender(const Frustum *f, const Point3 &view_pos, const TMatrix &view_itm) { finishPreparingIfNecessary(); @@ -1154,16 +1154,18 @@ void TracerManager::beforeRender(const Frustum *f) G_ASSERT(f); mFrustum = f; + viewPos = view_pos; + viewItm = view_itm; - - tracerBuffer.process(createCmdCs, commandsArrayConstNo, commandsCountConstNo, 0, maxTracerNo + 1); - segmentBuffer.process(createCmdCs, commandsArrayConstNo, commandsCountConstNo, 1, (maxTracerNo + 1) * MAX_FX_SEGMENTS); + tracerBuffer.process(createCmdCs, 0, maxTracerNo + 1); + segmentBuffer.process(createCmdCs, 1, (maxTracerNo + 1) * MAX_FX_SEGMENTS); preparing = true; threadpool::add(this); } -void TracerManager::renderTrans(bool heads, bool trails, const float *hk, HeadPrimType head_prim_type) +void TracerManager::renderTrans(const Point3 &view_pos, const TMatrix &view_itm, bool heads, bool trails, const float *hk, + HeadPrimType head_prim_type) { threadpool::wait(this); preparing = false; @@ -1195,7 +1197,7 @@ void TracerManager::renderTrans(bool heads, bool trails, const float *hk, HeadPr if (trails) renderTrails(); if (heads) - renderHeads(); + renderHeads(view_pos, view_itm); } ShaderGlobal::setBlock(-1, ShaderGlobal::LAYER_SCENE); diff --git a/prog/gameLibs/render/variance.cpp b/prog/gameLibs/render/variance.cpp index 774ad9346..6029abee5 100644 --- a/prog/gameLibs/render/variance.cpp +++ b/prog/gameLibs/render/variance.cpp @@ -301,7 +301,6 @@ void Variance::endShadowMap() d3d::set_render_target(oldrt); if (update_state & UPDATE_SCENE) { - ::grs_cur_view = savedView; d3d::settm(TM_VIEW, &svtm); if (perspOk) d3d::setpersp(persp); @@ -362,7 +361,6 @@ bool Variance::startShadowMap(const BBox3 &in_box, const Point3 &in_light_dir_un updateBox = in_box; updateLightDir = in_light_dir; updateShadowDist = in_shadow_dist; - updateView = ::grs_cur_view; isUpdateForced = false; @@ -411,24 +409,21 @@ bool Variance::startShadowMap(const BBox3 &in_box, const Point3 &in_light_dir_un oldBox = updateBox; perspOk = d3d::getpersp(persp); - savedView = ::grs_cur_view; - ::grs_cur_view = updateView; + TMatrix viewTm, viewItm; if (!updateBox.isempty()) { - ::grs_cur_view.itm.setcol(3, Point3(0, 0, 0)); - view_matrix_from_look(updateLightDir, ::grs_cur_view.itm); - ::grs_cur_view.tm = orthonormalized_inverse(::grs_cur_view.itm); - BBox3 spacebox = ::grs_cur_view.tm * updateBox; + viewItm.setcol(3, Point3(0, 0, 0)); + view_matrix_from_look(updateLightDir, viewItm); + viewTm = orthonormalized_inverse(viewItm); + BBox3 spacebox = viewTm * updateBox; float dist = max(spacebox[1].z - spacebox[0].z + 1.0f, updateShadowDist); - ::grs_cur_view.tm.setcol(3, Point3(0, 0, -(spacebox[0].z - 1.0f - (dist - (spacebox[1].z - spacebox[0].z + 1.0f))))); + viewTm.setcol(3, Point3(0, 0, -(spacebox[0].z - 1.0f - (dist - (spacebox[1].z - spacebox[0].z + 1.0f))))); - ::grs_cur_view.itm = orthonormalized_inverse(::grs_cur_view.tm); - - lightViewTm = TMatrix4(::grs_cur_view.tm); + viewItm = orthonormalized_inverse(viewTm); lightProj = ::matrix_ortho_off_center_lh(spacebox[0].x, spacebox[1].x, spacebox[0].y, spacebox[1].y, 1.0f, dist); - TMatrix4 lightViewProj = (TMatrix4(::grs_cur_view.tm) * lightProj); + TMatrix4 lightViewProj = (TMatrix4(viewTm) * lightProj); // FIGHT ALIASING { Point4 origin; @@ -450,8 +445,7 @@ bool Variance::startShadowMap(const BBox3 &in_box, const Point3 &in_light_dir_un lightProj = lightProj * tRound; } - shadowProjMatrix = - (TMatrix4(::grs_cur_view.tm) * lightProj) * screen_to_tex_scale_tm_xy(HALF_TEXEL_OFSF / width, HALF_TEXEL_OFSF / height); + shadowProjMatrix = (TMatrix4(viewTm) * lightProj) * screen_to_tex_scale_tm_xy(HALF_TEXEL_OFSF / width, HALF_TEXEL_OFSF / height); } else { @@ -462,14 +456,14 @@ bool Variance::startShadowMap(const BBox3 &in_box, const Point3 &in_light_dir_un split.isWarp = false; split.isAlign = true; xcsm.setSplit(0, split); - xcsm.prepare(persp.wk, persp.hk, persp.zn, updateShadowDist, ::grs_cur_view.tm, -updateLightDir, updateShadowDist); + xcsm.prepare(persp.wk, persp.hk, persp.zn, updateShadowDist, viewTm, -updateLightDir, updateShadowDist); lightProj = xcsm.getSplitProj(0); // shadowProjMatrix = lightProj * shadowScaleMatrix; shadowProjMatrix = xcsm.getSplitTexTM(0); - view_matrix_from_look(updateLightDir, ::grs_cur_view.itm); - ::grs_cur_view.tm = orthonormalized_inverse(::grs_cur_view.itm); + view_matrix_from_look(updateLightDir, viewItm); + viewTm = orthonormalized_inverse(viewItm); - lightProj = TMatrix4(::grs_cur_view.itm) * lightProj; + lightProj = TMatrix4(viewItm) * lightProj; } unsigned clearFlags = 0; if (vsmType == VSM_BLEND) @@ -505,7 +499,7 @@ bool Variance::startShadowMap(const BBox3 &in_box, const Point3 &in_light_dir_un // Set new matrices. d3d::settm(TM_WORLD, &TMatrix4::IDENT); - d3d::settm(TM_VIEW, ::grs_cur_view.tm); + d3d::settm(TM_VIEW, viewTm); d3d::settm(TM_PROJ, &lightProj); return true; } diff --git a/prog/gameLibs/render/wakePs/shipWakeFx.cpp b/prog/gameLibs/render/wakePs/shipWakeFx.cpp index af894dec7..d34440c96 100644 --- a/prog/gameLibs/render/wakePs/shipWakeFx.cpp +++ b/prog/gameLibs/render/wakePs/shipWakeFx.cpp @@ -115,7 +115,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) // psWake { const float radius = wrp * 0.08f; - const float emitPerMeter = 1.2f / radius; + const float emitPerMeter = safediv(1.2f, radius); const float posSpread = radius * 0.125f; const float lifeTime = radius * 1.0f; @@ -150,7 +150,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) // psWakeTrail { const float radius1 = wrp * 0.14f; - const float emitPerMeter1 = 0.7f / radius1; + const float emitPerMeter1 = safediv(0.7f, radius1); const float posSpread1 = radius1 * 0.143f; const float lifeTime1 = radius1 * 4.0f * desc.trailLifeScale; @@ -176,7 +176,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) ship.wakeTrail = psWakeTrail->addEmitter(emitterParams); const float radius2 = wrp * 0.04f; - const float emitPerMeter2 = 0.4f / radius2; + const float emitPerMeter2 = safediv(0.4f, radius2); const float posSpread2 = radius2 * 0.25f; const float lifeTime2 = radius2 * 7.3f; @@ -208,7 +208,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) // psFoam { const float radius1 = wrp * 0.06f; - const float emitPerMeter1 = 0.75f / radius1; + const float emitPerMeter1 = safediv(0.75f, radius1); const float posSpread1 = radius1 * 0.167f; const float lifeTime1 = radius1 * 1.0f * desc.trailLifeScale; @@ -238,7 +238,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) emitterParams.pose.scale = Point3(-1.0f, 1.0f, 1.0f); ship.s[1].foamFront = psFoam->addEmitter(emitterParams); - const float emitPerMeter2 = 25.0f / wrp; + const float emitPerMeter2 = safediv(25.0f, wrp); const float lifeTime2 = wrp * 0.12f; const float lifeDelay2 = lifeTime1 * 0.25f; @@ -254,7 +254,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) const float radius3 = wrp * 0.14f; const float radiusSpread3 = radius3 * 0.143f; - const float emitPerMeter3 = 1.4f / radius3; + const float emitPerMeter3 = safediv(1.4f, radius3); const float posSpread3 = radius3 * 0.143f; const float lifeTime3 = radius3 * 2.0f; @@ -289,7 +289,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) // psFoamHead { const float radius = wrp * 0.06f; - const float emitPerMeter = 0.525f / radius; + const float emitPerMeter = safediv(0.525f, radius); const float posSpread = radius * 0.167f; const float lifeTime = radius * 1.0f; @@ -323,7 +323,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) // psFoamTurbo { const float radius = wrp * 0.07f; - const float emitPerMeter = 0.525f / radius; + const float emitPerMeter = safediv(0.525f, radius); const float posSpread = radius * 0.143f; const float lifeTime = radius * 0.857f; @@ -359,7 +359,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) { const float radius = wrp * 0.08f; const float radiusSpread = radius * 0.25f; - const float emitPerMeter = 0.8f / radius; + const float emitPerMeter = safediv(0.8f, radius); const float posSpread = radius * 0.25f; const float lifeTime = radius * 3.5f * desc.trailLifeScale; @@ -389,7 +389,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) { const float radius = wrp * 0.05f; const float radiusSpread = radius * 0.25f; - const float emitPerMeter = 1.5f / radius; + const float emitPerMeter = safediv(1.5f, radius); const float posSpread = radius * 0.25f; const float lifeTime = radius * 3.5f; @@ -419,7 +419,7 @@ uint32_t ShipWakeFx::addShip(const ShipDesc &desc) { const float radius = wrp * 0.08f; const float radiusSpread = radius * 0.25f; - const float emitPerMeter = 1.5f / radius; + const float emitPerMeter = safediv(1.5f, radius); const float posSpread = radius * 0.25f; const float lifeTime = radius * 3.5f; diff --git a/prog/gameLibs/soundSystem/mixing.cpp b/prog/gameLibs/soundSystem/mixing.cpp index bcc29d76f..37461623f 100644 --- a/prog/gameLibs/soundSystem/mixing.cpp +++ b/prog/gameLibs/soundSystem/mixing.cpp @@ -22,7 +22,8 @@ static FMOD::Studio::VCA *get_vca(const char *vca_name) FMOD::Studio::VCA *vca = nullptr; FMOD_RESULT result = get_studio_system()->getVCA(path.c_str(), &vca); - G_ASSERTF_RETURN(FMOD_OK == result, nullptr, "Get VCA \"%s\" failed, fmod result is \"%s\"", path.c_str(), FMOD_ErrorString(result)); + if (FMOD_OK != result) + logerr("Get VCA \"%s\" failed, fmod result is \"%s\"", path.c_str(), FMOD_ErrorString(result)); return vca; } diff --git a/prog/gameLibs/webui/httpserver.cpp b/prog/gameLibs/webui/httpserver.cpp index cb32f004b..36b046621 100644 --- a/prog/gameLibs/webui/httpserver.cpp +++ b/prog/gameLibs/webui/httpserver.cpp @@ -316,7 +316,7 @@ class HttpServer : public DaThread logwarn("http game server couldn't wait for lock, mem leak possible"); else updateCritSection.unlock(); - terminate(true, 1000); + this->terminate(true, 1000); #if !(_TARGET_PC_WIN | _TARGET_XBOX) os_socket_close(listenSocket); #endif diff --git a/prog/samples/commonFramework/de3_hmapTex.h b/prog/samples/commonFramework/de3_hmapTex.h index b40c05d7e..9a88d500f 100644 --- a/prog/samples/commonFramework/de3_hmapTex.h +++ b/prog/samples/commonFramework/de3_hmapTex.h @@ -43,7 +43,7 @@ static inline TexPtr create_tex_from_raw_hmap_file(const char *name, int &width) texFMT = TEXFMT_R16F; else logerr("no suitable vertex texture found"); - int level_count = get_log2i(width); + int level_count = 1; // get_log2i(width); TexPtr tex = dag::create_tex(nullptr, width, width, texFMT, level_count, "heightmap"); if (!tex) @@ -179,8 +179,8 @@ static inline TexPtr create_tex_from_mtw(const char *name, float *out_cell_sz = DEBUG_DUMP_VAR(hdr.maxHt); DEBUG_DUMP_VAR(hdr.missingCode); - int tex_w = hdr.blkW * hdr.elemPerBlockW; - int tex_h = hdr.blkH * hdr.elemPerBlockH; + int tex_w = get_bigger_pow2(hdr.blkW * hdr.elemPerBlockW); + int tex_h = get_bigger_pow2(hdr.blkH * hdr.elemPerBlockH); ShaderGlobal::set_color4(get_shader_variable_id("tex_hmap_inv_sizes"), 1.0 / tex_w, 1.0 / tex_h, 0, 0); uint32_t texFMT = 0; @@ -191,7 +191,7 @@ static inline TexPtr create_tex_from_mtw(const char *name, float *out_cell_sz = logerr("no suitable vertex texture found"); return {}; } - int level_count = get_log2i(tex_w); + int level_count = 1; // get_log2i(tex_w); TexPtr tex = dag::create_tex(NULL, tex_w, tex_h, texFMT, level_count, "heightmap"); if (!tex) @@ -206,6 +206,9 @@ static inline TexPtr create_tex_from_mtw(const char *name, float *out_cell_sz = } Tab buf; + for (float *data_p = (float *)data, *data_e = data_p + (stride / sizeof(*data_p)) * tex_h; data_p < data_e; data_p++) + *data_p = -1024.0f; + int dest_x0 = (tex_w - (hdr.blkW * hdr.elemPerBlockW)) / 2, dest_y0 = (tex_h - (hdr.blkH * hdr.elemPerBlockH)) / 2; for (int b = 0; b < hdr.blkW * hdr.blkH; b++) { crd.seekto(hdr.blkDescOfs + b * 8); @@ -214,17 +217,10 @@ static inline TexPtr create_tex_from_mtw(const char *name, float *out_cell_sz = crd.seekto(ofs); buf.resize(len); crd.readTabData(buf); - int dest_x = blk_x * hdr.elemPerBlockW, dest_y = blk_y * hdr.elemPerBlockH, + int dest_x = blk_x * hdr.elemPerBlockW + dest_x0, dest_y = blk_y * hdr.elemPerBlockH + dest_y0, dest_w = (blk_x == hdr.blkW - 1) ? hdr.lastColElemW : hdr.elemPerBlockW, dest_h = (blk_y == hdr.blkH - 1) ? hdr.lastRowElemH : hdr.elemPerBlockH; // debug("block %d:%d ofs=0x%X len=%d -> %d,%d %dx%d", blk_x, blk_y, ofs, len, dest_x, dest_y, dest_w, dest_h); - if (blk_x == hdr.blkW - 1 || blk_y == hdr.blkH - 1) - { - float *dest = (float *)(data + stride * dest_y + dest_x * 4); - for (int y = 0; y < hdr.lastRowElemH; y++, dest += stride / sizeof(*dest)) - for (int x = 0; x < hdr.lastColElemW; x++) - dest[x] = -1024.0f; - } if (hdr.bitsPerElem == 64) { double *ht = (double *)buf.data(); diff --git a/prog/samples/commonShaders/shaders/compile_shaders_pc11.bat b/prog/samples/commonShaders/shaders/compile_shaders_pc11.bat index d0d816917..4d36bdd35 100644 --- a/prog/samples/commonShaders/shaders/compile_shaders_pc11.bat +++ b/prog/samples/commonShaders/shaders/compile_shaders_pc11.bat @@ -3,6 +3,4 @@ rem copy ..\..\..\..\samples\sampleShaders\game\compiledShaders\game.ps40.shdump.bin ..\..\..\..\samples\planeSample\game\compiledShaders\game.ps40.shdump.bin copy ..\..\..\..\samples\sampleShaders\game\compiledShaders\game.ps40.shdump.bin ..\..\..\..\samples\humanSample\game\compiledShaders\game.ps40.shdump.bin rem copy ..\..\..\..\samples\sampleShaders\game\compiledShaders\game.ps40.shdump.bin ..\..\..\..\samples\shipSample\game\compiledShaders\game.ps40.shdump.bin -rem ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -o ..\..\..\..\_output\testPBR\shaders~tools~exp %1 %2 @echo off - diff --git a/prog/samples/commonShaders/shaders/compile_shaders_tools.bat b/prog/samples/commonShaders/shaders/compile_shaders_tools.bat index 70c4a959c..0832863d6 100644 --- a/prog/samples/commonShaders/shaders/compile_shaders_tools.bat +++ b/prog/samples/commonShaders/shaders/compile_shaders_tools.bat @@ -1,6 +1,6 @@ @echo on ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe .\shaders_tools11.blk -q -shaderOn -nodisassembly -commentPP -codeDumpErr -bones_start 70 -o ..\..\..\..\_output\sampleShaders\shaders~tools11 %1 %2 %3 -..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe .\shaders_tools_exp.blk -q -shaderOn -o ..\..\..\..\_output\sampleShaders\shaders~tools~exp %1 %2 +..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe .\shaders_tools_exp.blk -q -shaderOn -relinkOnly -o ..\..\..\..\_output\sampleShaders\shaders~tools11 %1 %2 rem copy ..\..\..\..\samples\sampleShaders\tools\common\compiledShaders\tools.ps40.shdump.bin ..\..\..\..\samples\shipSample\tools\common\compiledShaders\tools.ps40.shdump.bin rem copy ..\..\..\..\samples\sampleShaders\tools\common\compiledShaders\tools.exp.ps40.shdump.bin ..\..\..\..\samples\shipSample\tools\common\compiledShaders\tools.exp.ps40.shdump.bin @@ -11,4 +11,3 @@ rem copy ..\..\..\..\samples\sampleShaders\tools\common\compiledShaders\tools.ex copy ..\..\..\..\samples\sampleShaders\tools\common\compiledShaders\tools.ps40.shdump.bin ..\..\..\..\samples\humanSample\tools\common\compiledShaders\tools.ps40.shdump.bin copy ..\..\..\..\samples\sampleShaders\tools\common\compiledShaders\tools.exp.ps40.shdump.bin ..\..\..\..\samples\humanSample\tools\common\compiledShaders\tools.exp.ps40.shdump.bin @echo off - diff --git a/prog/scripts/sq/stubs/debug.config b/prog/scripts/sq/stubs/debug.config new file mode 100644 index 000000000..47f7763a3 --- /dev/null +++ b/prog/scripts/sq/stubs/debug.config @@ -0,0 +1,3 @@ +return { + function was_screenshot_applied_to_config() { return false } +} \ No newline at end of file diff --git a/prog/tools/AssetViewer/Entity/entityMatEditor.cpp b/prog/tools/AssetViewer/Entity/entityMatEditor.cpp index f3dd59e4e..64fd64e18 100644 --- a/prog/tools/AssetViewer/Entity/entityMatEditor.cpp +++ b/prog/tools/AssetViewer/Entity/entityMatEditor.cpp @@ -21,6 +21,7 @@ #include #include #include +#include "../../../engine/shaders/scriptSElem.h" #include "../../../engine/shaders/scriptSMat.h" #include "../av_appwnd.h" #include @@ -561,6 +562,7 @@ void EntityMaterialEditor::updateAssetShaderMaterial(int lod, int mat_id) int alphaTexSlotId = get_slot_with_alpha_tex(curMatShader->native().props.textureId); unsigned usedTexMask = get_shclass_used_tex_mask(curMatShader->native().props.sclass); + bool textureChanged = false; for (int texSlot = 0; texSlot < matProps.textures.size(); ++texSlot) { if (alphaTexSlotId == texSlot || !(usedTexMask & (1 << texSlot))) @@ -582,6 +584,19 @@ void EntityMaterialEditor::updateAssetShaderMaterial(int lod, int mat_id) setMatTexture(lod, mat_id, alphaTexSlotId, alphaTexName.c_str()); } } + + textureChanged |= changed; + } + + if (textureChanged) + { + for (ShaderMaterial *material : newMat) + if (ShaderElement *shaderElement = material->native().getElem()) + shaderElement->acquireTexRefs(); + + for (ShaderMaterial *material : oldMat) + if (ShaderElement *shaderElement = material->native().getElem()) + shaderElement->releaseTexRefs(); } if (entity->getAssetTypeId() == DAEDITOR3.getAssetTypeId("rendInst")) diff --git a/prog/tools/AssetViewer/Entity/entityMatFileResource.cpp b/prog/tools/AssetViewer/Entity/entityMatFileResource.cpp index f901a18b5..25a4ab53c 100644 --- a/prog/tools/AssetViewer/Entity/entityMatFileResource.cpp +++ b/prog/tools/AssetViewer/Entity/entityMatFileResource.cpp @@ -85,7 +85,13 @@ void MatFileResourceDagMat::setDataAndSave(const EntityMatProperties *mat_proper String texFilePath; if (DagorAsset *texAsset = DAEDITOR3.getAssetByName(mat_properties->textures[texSlot])) - texFilePath = texAsset->getTargetFilePath(); + { + // Assets under #gameRes/... (in a CDK build) do not have source file names. + if (texAsset->getSrcFileName()) + texFilePath = texAsset->getTargetFilePath(); + else + texFilePath.printf(64, "%s*", texAsset->getName()); + } int dagTexId = find_value_idx(dagData.texlist, texFilePath); if (dagTexId < 0 && !texFilePath.empty()) diff --git a/prog/tools/AssetViewer/Textures/textures.cpp b/prog/tools/AssetViewer/Textures/textures.cpp index 0495f8f9e..68b74c104 100644 --- a/prog/tools/AssetViewer/Textures/textures.cpp +++ b/prog/tools/AssetViewer/Textures/textures.cpp @@ -58,11 +58,11 @@ TexturesPlugin::TexturesPlugin() shaders::OverrideState state; state.set(shaders::OverrideState::BLEND_SRC_DEST); - state.sblend = BLEND_SRCALPHA; - state.dblend = BLEND_INVSRCALPHA; + state.sblend = BLEND_ONE; + state.dblend = BLEND_ZERO; state.set(shaders::OverrideState::BLEND_SRC_DEST_A); state.sblenda = BLEND_ZERO; - state.dblenda = BLEND_INVSRCALPHA; + state.dblenda = BLEND_ZERO; state.set(shaders::OverrideState::Z_TEST_DISABLE); state.set(shaders::OverrideState::Z_WRITE_DISABLE); renderVolImageOverrideId = shaders::overrides::create(state); @@ -379,17 +379,17 @@ void TexturesPlugin::renderObjects() else if (texture->restype() == RES3D_CUBETEX) { d3d::setview((vp_w - tex_w) / 2, (vp_h - tex_h) / 2, tex_w, tex_h, 0, 1); - shaders::overrides::set(renderVolImageOverrideId); + shaders::overrides::set_master_state(shaders::overrides::get(renderVolImageOverrideId)); EDITORCORE->queryEditorInterface()->renderEnviCubeTexture(texture, cMul * powf(10, cScaleDb / 10), cAdd); - shaders::overrides::reset(); + shaders::overrides::reset_master_state(); } else if (texture->restype() == RES3D_VOLTEX) { d3d::setview((vp_w - tex_w) / 2, (vp_h - tex_h) / 2, tex_w, tex_h, 0, 1); - shaders::overrides::set(renderVolImageOverrideId); + shaders::overrides::set_master_state(shaders::overrides::get(renderVolImageOverrideId)); EDITORCORE->queryEditorInterface()->renderEnviVolTexture(texture, cMul * powf(10, cScaleDb / 10), cAdd, Color4(0.5, -0.5, 0.5, 0.5), tcZ); - shaders::overrides::reset(); + shaders::overrides::reset_master_state(); } ShaderElement::invalidate_cached_state_block(); diff --git a/prog/tools/AssetViewer/av_appwnd.cpp b/prog/tools/AssetViewer/av_appwnd.cpp index 5d0899191..c374a059a 100644 --- a/prog/tools/AssetViewer/av_appwnd.cpp +++ b/prog/tools/AssetViewer/av_appwnd.cpp @@ -3634,11 +3634,6 @@ bool AssetViewerApp::runShadersReload(dag::ConstSpan params) } -// required for ZLIB (that in turn is required by LIBPNG) -extern "C" void *zcalloc(void *, unsigned items, unsigned size) { return memalloc_default(items * size); } - -extern "C" void zcfree(void *, void *ptr) { memfree_default(ptr); } - const char *daeditor3_get_appblk_fname() { static String fn; diff --git a/prog/tools/AssetViewer/av_environment.cpp b/prog/tools/AssetViewer/av_environment.cpp index a14ddfae8..89c1193c7 100644 --- a/prog/tools/AssetViewer/av_environment.cpp +++ b/prog/tools/AssetViewer/av_environment.cpp @@ -260,8 +260,7 @@ void renderEnvironment(bool ortho) state.set(shaders::OverrideState::BLEND_SRC_DEST_A); state.sblenda = BLEND_ZERO; state.dblenda = BLEND_ZERO; - shaders::OverrideStateId geomEnviId = shaders::overrides::create(state); - shaders::overrides::set(geomEnviId); + shaders::overrides::set_master_state(state); d3d::setwire(false); if (texture->restype() == RES3D_TEX || texture->restype() == RES3D_VOLTEX) @@ -309,8 +308,7 @@ void renderEnvironment(bool ortho) Color4(1, 1, 1, 1) * safeinv(ShaderGlobal::get_real_fast(hdr_overbrightGVarId)), Color4(0, 0, 0, 1)); } - shaders::overrides::reset(); - shaders::overrides::destroy(geomEnviId); + shaders::overrides::reset_master_state(); d3d::setwire(::grs_draw_wire); ShaderElement::invalidate_cached_state_block(); } diff --git a/prog/tools/AssetViewer/fxEdit/fxEditor.cpp b/prog/tools/AssetViewer/fxEdit/fxEditor.cpp index 151164d82..30dd8a805 100644 --- a/prog/tools/AssetViewer/fxEdit/fxEditor.cpp +++ b/prog/tools/AssetViewer/fxEdit/fxEditor.cpp @@ -44,6 +44,7 @@ #include #include +#include <3d/dag_render.h> // grs_cur_view #include "../av_cm.h" #include "fxSaveLoad.h" @@ -556,14 +557,14 @@ class EffectsPlugin : public IGenEditorPlugin, switch (stage) { - case STG_BEFORE_RENDER: effect->render(FX_RENDER_BEFORE); break; + case STG_BEFORE_RENDER: effect->render(FX_RENDER_BEFORE, ::grs_cur_view.itm); break; - case STG_RENDER_DYNAMIC_OPAQUE: effect->render(FX_RENDER_SOLID); break; + case STG_RENDER_DYNAMIC_OPAQUE: effect->render(FX_RENDER_SOLID, ::grs_cur_view.itm); break; - case STG_RENDER_FX: effect->render(FX_RENDER_TRANS); break; + case STG_RENDER_FX: effect->render(FX_RENDER_TRANS, ::grs_cur_view.itm); break; case STG_RENDER_FX_DISTORTION: - effect->render(FX_RENDER_DISTORTION); + effect->render(FX_RENDER_DISTORTION, ::grs_cur_view.itm); dafx::render(g_dafx_ctx, g_dafx_cull, "distortion"); break; } diff --git a/prog/tools/ShaderCompiler2/assemblyShader.cpp b/prog/tools/ShaderCompiler2/assemblyShader.cpp index 4c3e16986..c61d5be6a 100644 --- a/prog/tools/ShaderCompiler2/assemblyShader.cpp +++ b/prog/tools/ShaderCompiler2/assemblyShader.cpp @@ -202,7 +202,7 @@ Register AssembleShaderEvalCB::add_reg(int type) return {}; } -int shtok_to_shvt(int shtok) +ShaderVarType shtok_to_shvt(int shtok) { switch (shtok) { @@ -218,7 +218,7 @@ int shtok_to_shvt(int shtok) void AssembleShaderEvalCB::eval_static(static_var_decl &s) { - int t = shtok_to_shvt(s.type->type->num); + ShaderVarType t = shtok_to_shvt(s.type->type->num); int varNameId = VarMap::addVarId(s.name->text); @@ -399,6 +399,8 @@ void AssembleShaderEvalCB::eval_init_stat(SHTOK_ident *var, shader_init_value &v else G_ASSERT(0); + code.vars[vi].slot = ind; + int e_texture_ident_id = IntervalValue::getIntervalNameId(var->text); int intervalIndex = variant.intervals.getIntervalIndex(e_texture_ident_id); int stVarId = intervalIndex != INTERVAL_NOT_INIT ? sclass.find_static_var(varNameId) : -1; @@ -1203,6 +1205,18 @@ void AssembleShaderEvalCB::handle_external_block_stat(state_block_stat &state_bl error(String(32, "@static texture %s can't be global", var->text), nameSpace); else if (code.vars[var_id].dynamic) error(String(32, "@static texture %s can't be dynamic", var->text), nameSpace); + if (!is_global && !code.vars[var_id].dynamic) + { + switch (type) + { + case VariableType::staticSampler: code.vars[var_id].texType = ShaderVarTextureType::SHVT_TEX_2D; break; + case VariableType::staticTex3D: code.vars[var_id].texType = ShaderVarTextureType::SHVT_TEX_3D; break; + case VariableType::staticCube: code.vars[var_id].texType = ShaderVarTextureType::SHVT_TEX_CUBE; break; + case VariableType::staticTexArray: code.vars[var_id].texType = ShaderVarTextureType::SHVT_TEX_2D_ARRAY; break; + case VariableType::staticCubeArray: code.vars[var_id].texType = ShaderVarTextureType::SHVT_TEX_CUBE_ARRAY; break; + default: break; + } + } } int shcod = -1; diff --git a/prog/tools/ShaderCompiler2/main.cpp b/prog/tools/ShaderCompiler2/main.cpp index 2db9cf6a3..bfb527b8d 100644 --- a/prog/tools/ShaderCompiler2/main.cpp +++ b/prog/tools/ShaderCompiler2/main.cpp @@ -273,6 +273,7 @@ static void showUsage() " -purge_sha1_cache - delete sha1 cache (if no_sha1_cache is not enabled, it will be re-populated)\n" " -commentPP - save PP as comments (for shader debugging)\n" " -r - force rebuild all files (even if not modified)\n" + " -relinkOnly - forbid compilation so build will fail if any OBJ is out-of-data\n" " -bones_start N - starting register for bones. If -1 (default) allocates as other named consts\n" " -maxVSF N - maximum allowed VSF register no. Default 4096\n" " -maxPSF N - maximum allowed PSF register no. Default 4096\n" @@ -308,6 +309,7 @@ static void showUsage() " -supressLogs - do not make fileLogs\n" " -enablefp16 - enable using 16 bit types in shaders\n" " -HLSL2021 - use the HLSL 2021 version of the language\n" + " -addTextureType - save static texture types to shaderdump (need for texture type validation in daBuild)\n" #if _CROSS_TARGET_SPIRV " -enableBindless: - enables utilizing bindless features (default: " #if USE_BINDLESS_FOR_STATIC_TEX @@ -375,6 +377,7 @@ bool hlslDumpCodeAlways = false, hlslDumpCodeOnError = false; bool hlsl2021 = false; bool enableFp16 = false; bool useCompression = true; +bool addTextureType = false; #if USE_BINDLESS_FOR_STATIC_TEX bool enableBindless = true; #else @@ -702,7 +705,12 @@ static void compile(Tab &source_files, const char *fn, const char *bindu IGenSave *hasher = create_hash_computer_cb(HASH_SAVECB_SHA1); DataBlock blk(blk_file_name); blk.removeBlock("source"); + blk.removeBlock("explicit_var_ref"); blk.removeParam("outDumpName"); + blk.removeParam("outMiniDumpName"); + blk.removeParam("packBin"); + if (addTextureType) + blk.addBool("addTextureType", true); blk.saveToTextStream(*hasher); get_computed_hash(hasher, blkHash.data(), blkHash.size()); destory_hash_computer_cb(hasher); @@ -728,6 +736,11 @@ static void compile(Tab &source_files, const char *fn, const char *bindu sh_debug(SHLOG_INFO, "'%s' changed. '%s' should be deleted to force rebuild", blk_file_name, (const char *)sv.intermediateDir); forceRebuild = true; } + if (forceRebuild && shc::relinkOnly) + { + sh_debug(SHLOG_FATAL, "need to recompile %s but compilation is denied by -relinkOnly", compile_only_sh ? compile_only_sh : ""); + return; + } // build binary dump auto verStr = d3d::as_ps_string(opt.fshVersion); @@ -1091,6 +1104,8 @@ int DagorWinMain(bool debugmode) } else if (strnicmp(s, "-j", 2) == 0) shc::compileJobsCount = atoi(s + 2); + else if (stricmp(s, "-relinkOnly") == 0) + shc::relinkOnly = true; else if (dd_stricmp(s, "-nosave") == 0) noSave = true; else if (dd_stricmp(s, "-debug") == 0) @@ -1192,6 +1207,10 @@ int DagorWinMain(bool debugmode) { useCompression = false; } + else if (dd_stricmp(s, "-addTextureType") == 0) + { + addTextureType = true; + } else if (dd_stricmp(s, "-purge_sha1_cache") == 0) { purge_sha1 = true; diff --git a/prog/tools/ShaderCompiler2/makeShBinDump.cpp b/prog/tools/ShaderCompiler2/makeShBinDump.cpp index 95ff523b3..a1a114954 100644 --- a/prog/tools/ShaderCompiler2/makeShBinDump.cpp +++ b/prog/tools/ShaderCompiler2/makeShBinDump.cpp @@ -721,6 +721,8 @@ struct ShaderCodes scr.suppBlockUid[tmpPassesRemap[k]] = addSuppBlkCodes(scode.passes[k]->suppBlk); } + staticTextureTypesByCode.emplace_back(scode.staticTextureTypes); + codes.push_back(scr); return codes.size() - 1; } @@ -786,6 +788,7 @@ struct ShaderCodes SharedStorage chanStorage; SharedStorage icStorage; SharedStorage svStorage; + Tab> staticTextureTypesByCode; static Tab> tmpPasses; }; @@ -1433,6 +1436,7 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam } // write shader classes + extern bool addTextureType; SharedStorage shInitCodeStorage; shaders_dump.classes.resize(dumpClasses.size()); shaders_dump.messagesByShclass.resize(dumpClasses.size()); @@ -1452,6 +1456,9 @@ bool make_scripted_shaders_dump(const char *dump_name, const char *cache_filenam out_c.name = shaders_dump.shaderNameMap[out_c.nameId].getElementAddress(0); out_c.name.setCount(shaders_dump.shaderNameMap[out_c.nameId].size()); + if (addTextureType && !code.staticTextureTypesByCode.empty()) + out_c.staticTextureTypeBySlot = code.staticTextureTypesByCode.front(); + shInitCodeStorage.getRef(out_c.initCode, shClass[i]->shInitCode.data(), shClass[i]->shInitCode.size(), 8); shaders_dump.messagesByShclass[i].resize(shClass[i]->messages.size()); diff --git a/prog/tools/ShaderCompiler2/shCompiler.cpp b/prog/tools/ShaderCompiler2/shCompiler.cpp index efd0b4ece..d4107b833 100644 --- a/prog/tools/ShaderCompiler2/shCompiler.cpp +++ b/prog/tools/ShaderCompiler2/shCompiler.cpp @@ -34,7 +34,7 @@ static bool defTreatInvalidAsNull = false; static String updbPath; unsigned compileJobsCount = 0; unsigned compileJobsMgrBase = 0; -unsigned openGLTarget = 0; +bool relinkOnly = false; static SCFastNameMap explicitGlobVarRef; void startup() @@ -149,6 +149,11 @@ void compileShader(const ShVariantName &variant_name, bool no_save, bool should_ } else { + if (relinkOnly) + { + sh_debug(SHLOG_FATAL, "need to recompile %s but compilation is denied by -relinkOnly", sourceFileName.str()); + return; + } sh_debug(SHLOG_NORMAL, "[INFO] compiling '%s'...", sourceFileName.str()); fflush(stdout); Tab dependenciesList(tmpmem_ptr()); diff --git a/prog/tools/ShaderCompiler2/shCompiler.h b/prog/tools/ShaderCompiler2/shCompiler.h index 99f3611a3..c26d39b43 100644 --- a/prog/tools/ShaderCompiler2/shCompiler.h +++ b/prog/tools/ShaderCompiler2/shCompiler.h @@ -70,7 +70,7 @@ const char *getSrcRootFolder(); extern unsigned compileJobsCount; extern unsigned compileJobsMgrBase; -extern unsigned openGLTarget; +extern bool relinkOnly; } // namespace shc #endif //__SHCOMPILER_H diff --git a/prog/tools/ShaderCompiler2/shSemCode.cpp b/prog/tools/ShaderCompiler2/shSemCode.cpp index e75dadb20..81205c600 100644 --- a/prog/tools/ShaderCompiler2/shSemCode.cpp +++ b/prog/tools/ShaderCompiler2/shSemCode.cpp @@ -61,9 +61,9 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS // compute var offsets Tab cvar(tmpmem); cvar.resize(vars.size()); - int ofs = 0, i; + int ofs = 0; - for (i = 0; i < vars.size(); ++i) + for (int i = 0; i < vars.size(); ++i) { int sz; switch (vars[i].type) @@ -77,6 +77,12 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS } cvar[i] = ofs; ofs += sz; + if (vars[i].slot >= 0) + { + if (vars[i].slot >= code->staticTextureTypes.size()) + code->staticTextureTypes.resize(vars[i].slot + 1); + code->staticTextureTypes[vars[i].slot] = vars[i].texType; + } } code->varsize = ofs; @@ -84,7 +90,7 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS // convert init code code->initcode = initcode; - for (i = 0; i < code->initcode.size(); i += 2) + for (int i = 0; i < code->initcode.size(); i += 2) { int vi = code->initcode[i]; code->initcode[i] = cvar[vi]; @@ -92,7 +98,7 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS // convert stvarmap code->stvarmap.resize(stvarmap.size()); - for (i = 0; i < code->stvarmap.size(); ++i) + for (int i = 0; i < code->stvarmap.size(); ++i) { code->stvarmap[i].v = cvar[stvarmap[i].v]; code->stvarmap[i].sv = stvarmap[i].sv; @@ -102,7 +108,7 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS tabutils::safeResize(code->passes, passes.size()); Tab all_passid(tmpmem); - for (i = 0; i < passes.size(); i++) + for (int i = 0; i < passes.size(); i++) { PassTab *otherPasses = passes[i]; if (otherPasses) @@ -141,7 +147,7 @@ ShaderCode *ShaderSemCode::generateShaderCode(const ShaderVariant::VariantTableS code->allPasses = all_passid; clear_and_shrink(all_passid); - for (i = 0; i < code->passes.size(); i++) + for (int i = 0; i < code->passes.size(); i++) if (code->passes[i]) code->passes[i]->toPtr(make_span(code->allPasses)); diff --git a/prog/tools/ShaderCompiler2/shSemCode.h b/prog/tools/ShaderCompiler2/shSemCode.h index e01b9dbbd..11e7195a5 100644 --- a/prog/tools/ShaderCompiler2/shSemCode.h +++ b/prog/tools/ShaderCompiler2/shSemCode.h @@ -36,7 +36,9 @@ class ShaderSemCode struct Var { int nameId; - int type; + ShaderVarType type; + int slot = -1; + ShaderVarTextureType texType = ShaderVarTextureType::SHVT_TEX_UNKNOWN; void *terminal; bool used, dynamic, noWarnings; diff --git a/prog/tools/ShaderCompiler2/shcode.h b/prog/tools/ShaderCompiler2/shcode.h index 5ddf43ef2..dbe0e3df8 100644 --- a/prog/tools/ShaderCompiler2/shcode.h +++ b/prog/tools/ShaderCompiler2/shcode.h @@ -53,6 +53,7 @@ class ShaderCode int varsize, regsize; SerializableTab initcode; + SerializableTab staticTextureTypes; struct StVarMap { @@ -133,7 +134,7 @@ class ShaderClass { public: NameId nameId; - int type; + ShaderVarType type; StVarValue defval; Var() { memset(&defval, 0, sizeof(defval)); } diff --git a/prog/tools/build_dagor3_cdk_mini.cmd b/prog/tools/build_dagor3_cdk_mini.cmd index 00e45becf..1573b41ab 100644 --- a/prog/tools/build_dagor3_cdk_mini.cmd +++ b/prog/tools/build_dagor3_cdk_mini.cmd @@ -1,6 +1,8 @@ @echo off rem DaEditorX +jam -s Root=../.. -s Platform=win64 -f sceneTools/daEditorX/jamfile-editor + if errorlevel 1 goto error jam -s Root=../.. -s Platform=win64 -f sceneTools/daEditorX/jamfile if errorlevel 1 goto error diff --git a/prog/tools/dargbox/shaders/shadersList.blk b/prog/tools/dargbox/shaders/shadersList.blk index a87cf122a..6b1d31422 100644 --- a/prog/tools/dargbox/shaders/shadersList.blk +++ b/prog/tools/dargbox/shaders/shadersList.blk @@ -1,5 +1,6 @@ file:t = "./source/gui_default.sh" file:t = "./source/yuv.sh" file:t = "../../../gameLibs/vr/shaders/vrGuiSurface.sh" + file:t = "../../../gameLibs/vr/shaders/vrMirror.sh" file:t = "../../../gameLibs/daRg/shaders/dargPanelRendererShaders.sh" file:t = "../../../gameLibs/render/shaders/debug_tex_overlay.sh" diff --git a/prog/tools/sharedInclude/EditorCore/ec_IEditorCoreImpl.h b/prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCore.h similarity index 96% rename from prog/tools/sharedInclude/EditorCore/ec_IEditorCoreImpl.h rename to prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCore.h index 460c47473..46915b705 100644 --- a/prog/tools/sharedInclude/EditorCore/ec_IEditorCoreImpl.h +++ b/prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCore.h @@ -1,12 +1,8 @@ -#ifndef __GAIJIN_IEDITOR_CORE_IMPLEMENTATION__ -#define __GAIJIN_IEDITOR_CORE_IMPLEMENTATION__ #pragma once - #include #include - class EcRender : public IDagorRender { public: @@ -195,14 +191,6 @@ class EcGeom : public IDagorGeom virtual void shaderElemInvalidateCachedStateBlock() const; - // ShaderMesh - virtual ShaderMesh *createSimpleShaderMesh(Mesh &m, ShaderMaterial *mat, const char *info_str = NULL); - - virtual void destroyShaderMesh(ShaderMesh *&sm); - - // GlobalVertexData - virtual int globalVertexDataGetStride(const GlobalVertexData &data) const; - // Mesh virtual Mesh *newMesh(IMemAlloc *alloc) const; virtual void deleteMesh(Mesh *&mesh) const; @@ -383,12 +371,12 @@ class EcScene : public IDagorScene class EditorCoreImpl : public IEditorCore { public: - virtual IDagorRender *getRender() { return &render; } - virtual IDagorGeom *getGeom() { return &geom; } - virtual IDagorConsole *getConsole() { return &console; } - virtual IDagorTools *getTools() { return &tools; } - virtual IDagorScene *getScene() { return &scene; } - virtual const char *getExePath(); + IDagorRender *getRender() override { return &render; } + IDagorGeom *getGeom() override { return &geom; } + IDagorConsole *getConsole() override { return &console; } + IDagorTools *getTools() override { return &tools; } + IDagorScene *getScene() override { return &scene; } + const char *getExePath() override; private: EcRender render; @@ -397,6 +385,3 @@ class EditorCoreImpl : public IEditorCore EcTools tools; EcScene scene; }; - - -#endif //__GAIJIN_IEDITOR_CORE_IMPLEMENTATION__ diff --git a/prog/tools/libTools/IEditorCoreBase/ec_IEditorCoreBaseImpl.cpp b/prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCoreBase.cpp similarity index 99% rename from prog/tools/libTools/IEditorCoreBase/ec_IEditorCoreBaseImpl.cpp rename to prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCoreBase.cpp index d939dff11..1f115dead 100644 --- a/prog/tools/libTools/IEditorCoreBase/ec_IEditorCoreBaseImpl.cpp +++ b/prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCoreBase.cpp @@ -1,4 +1,4 @@ -#include +#include "implementIEditorCore.h" #include #include #include diff --git a/prog/tools/libTools/IEditorCore/ec_IEditorCoreImpl.cpp b/prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCoreExt.cpp similarity index 98% rename from prog/tools/libTools/IEditorCore/ec_IEditorCoreImpl.cpp rename to prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCoreExt.cpp index 63d9d5c28..e9a0f4a93 100644 --- a/prog/tools/libTools/IEditorCore/ec_IEditorCoreImpl.cpp +++ b/prog/tools/libTools/EditorCore/IEditorCore/implementIEditorCoreExt.cpp @@ -1,4 +1,4 @@ -#include +#include "implementIEditorCore.h" #include #include #include @@ -362,16 +362,6 @@ void EcGeom::geomResourcesHelperRemapResources(GeomResourcesHelper &helper, cons int EcGeom::geomResourcesHelperCompact(GeomResourcesHelper &helper) const { return helper.compact(); } -//================================================================================================== -ShaderMesh *EcGeom::createSimpleShaderMesh(Mesh &m, ShaderMaterial *mat, const char *info_str) -{ - return ShaderMesh::createSimple(m, mat, info_str); -} - - -void EcGeom::destroyShaderMesh(ShaderMesh *&sm) { del_it(sm); } - - //================================================================================================== ShaderMaterial *EcGeom::newShaderMaterial(MaterialData &m) const { return ::new_shader_material(m); } @@ -413,10 +403,6 @@ void EcGeom::shaderGlobalSetBlock(int id, int layer) const { ShaderGlobal::setBl void EcGeom::shaderElemInvalidateCachedStateBlock() const { return ShaderElement::invalidate_cached_state_block(); } -//================================================================================================== -int EcGeom::globalVertexDataGetStride(const GlobalVertexData &data) const { return data.getStride(); } - - //================================================================================================== Mesh *EcGeom::newMesh(IMemAlloc *alloc) const { CREATE_OBJECT(Mesh, alloc); } diff --git a/prog/tools/libTools/EditorCore/IEditorCore/jamfile b/prog/tools/libTools/EditorCore/IEditorCore/jamfile new file mode 100644 index 000000000..bcc37f589 --- /dev/null +++ b/prog/tools/libTools/EditorCore/IEditorCore/jamfile @@ -0,0 +1,17 @@ +Root ?= ../../../../.. ; +Location = prog/tools/libTools/EditorCore/IEditorCore ; + +TargetType = lib ; +Target = tools/libTools/EditorCore/IEditorCore.lib ; + +AddIncludes = + $(Root)/prog/tools/sharedInclude +; + +Sources = + makeInstance.cpp + implementIEditorCoreBase.cpp + implementIEditorCoreExt.cpp +; + +include $(Root)/prog/_jBuild/build.jam ; diff --git a/prog/tools/libTools/EditorCore/IEditorCore/makeInstance.cpp b/prog/tools/libTools/EditorCore/IEditorCore/makeInstance.cpp new file mode 100644 index 000000000..2ec7f95f4 --- /dev/null +++ b/prog/tools/libTools/EditorCore/IEditorCore/makeInstance.cpp @@ -0,0 +1,7 @@ +#include "implementIEditorCore.h" +#include + +static EditorCoreImpl editorCoreImpl; +IEditorCore &IEditorCore::make_instance() { return editorCoreImpl; } + +const char *EditorCoreImpl::getExePath() { return sgg::get_exe_path_full(); } diff --git a/prog/tools/libTools/IEditorCore/jamfile b/prog/tools/libTools/IEditorCore/jamfile deleted file mode 100644 index 7bff3c9c8..000000000 --- a/prog/tools/libTools/IEditorCore/jamfile +++ /dev/null @@ -1,18 +0,0 @@ -Root ?= ../../../.. ; -Location = prog/tools/libTools/IEditorCore ; - -TargetType = lib ; -Target = tools/libTools/IEditorCore.lib ; - -AddIncludes = - $(Root)/prog/tools/sharedInclude -; - - -Sources = - ec_IEditorCoreImpl.cpp -; - -CPPopt = ; - -include $(Root)/prog/_jBuild/build.jam ; diff --git a/prog/tools/libTools/IEditorCoreBase/jamfile b/prog/tools/libTools/IEditorCoreBase/jamfile deleted file mode 100644 index 10b2a4c41..000000000 --- a/prog/tools/libTools/IEditorCoreBase/jamfile +++ /dev/null @@ -1,18 +0,0 @@ -Root ?= ../../../.. ; -Location = prog/tools/libTools/IEditorCoreBase ; - -TargetType = lib ; -Target = tools/libTools/IEditorCoreBase.lib ; - -AddIncludes = - $(Root)/prog/tools/sharedInclude -; - - -Sources = - ec_IEditorCoreBaseImpl.cpp -; - -CPPopt = ; - -include $(Root)/prog/_jBuild/build.jam ; diff --git a/prog/tools/libTools/assetMgrHlp/assetBuildCache.cpp b/prog/tools/libTools/assetMgrHlp/assetBuildCache.cpp index fba5cf47a..26d3b5817 100644 --- a/prog/tools/libTools/assetMgrHlp/assetBuildCache.cpp +++ b/prog/tools/libTools/assetMgrHlp/assetBuildCache.cpp @@ -564,23 +564,11 @@ static bool abc_load_game_resource_pack(int res_id, dag::SpangetBuiltRes(*a, cwr, exp, assetlocalprops::makePath("cache"), cachePath, dataOffset, force_cache_store)) { - saveAllAssets = true; - } -#endif - - - if (dabuild->getBuiltRes(*a, cwr, exp, assetlocalprops::makePath("cache"), cachePath, dataOffset, saveAllAssets)) - { -#ifndef _TARGET_EXPORTERS_STATIC - cachePath.clear(); - dataOffset = 0; -#endif AssetCacheLoadCB crd(cwr.getRawWriter().getMem(), false, eastl::move(cachePath), dataOffset); fac->loadGameResourceData(res_id, crd); diff --git a/prog/tools/libTools/staticGeom/geomObject.cpp b/prog/tools/libTools/staticGeom/geomObject.cpp index 33bc63510..19d6ce916 100644 --- a/prog/tools/libTools/staticGeom/geomObject.cpp +++ b/prog/tools/libTools/staticGeom/geomObject.cpp @@ -1043,7 +1043,7 @@ void GeomObject::recompileNode(int idx) memfree(o->vdata.data(), midmem); o->vdata.set((GlobalVertexData *)memalloc(sizeof(GlobalVertexData) * vdata.size(), midmem), vdata.size()); for (int i = 0; i < vdata.size(); ++i) - o->vdata[i].createMem(vdata[i]->numv, vdata[i]->stride, + o->vdata[i].initGvdMem(vdata[i]->numv, vdata[i]->stride, vdata[i]->numv <= 65536 ? data_size(vdata[i]->iData) : data_size(vdata[i]->iData32), 0, vdata[i]->vData.data(), vdata[i]->numv <= 65536 ? (void *)vdata[i]->iData.data() : (void *)vdata[i]->iData32.data()); diff --git a/prog/tools/maxplug/expUtil.cpp b/prog/tools/maxplug/expUtil.cpp index 3ddad88a1..fbe505e4a 100644 --- a/prog/tools/maxplug/expUtil.cpp +++ b/prog/tools/maxplug/expUtil.cpp @@ -1892,49 +1892,40 @@ bool wr_hlp( const void * p, int l, FILE * h ) if (num) { bblk(DAG_NODE_MATER); - if (useMOpt()) + Tab uniqueMatIdx; + subMatIdLUT.SetCount(num); + for (int j = 0; j < subMatIdLUT.Count(); ++j) + subMatIdLUT[j] = -1; + for (int j = 0; j < num; ++j) { - Tab uniqueMatIdx; - subMatIdLUT.SetCount(num); - for (int j = 0; j < subMatIdLUT.Count(); ++j) - subMatIdLUT[j] = -1; - for (int j = 0; j < num; ++j) - { - int id = getmatid(mtl->GetSubMtl(j)); - if (matIDtoMatIdx[id] < 0) - continue; + int id = getmatid(mtl->GetSubMtl(j)); + if (matIDtoMatIdx[id] < 0) + continue; - bool found = false; - for (unsigned short x = 0; x < uniqueMatIdx.Count(); ++x) - if (uniqueMatIdx[x] == matIDtoMatIdx[id]) - { - found = true; - subMatIdLUT[j] = x; - break; - } - if (!found) + bool found = false; + for (unsigned short x = 0; x < uniqueMatIdx.Count(); ++x) + if (uniqueMatIdx[x] == matIDtoMatIdx[id]) { - uniqueMatIdx.SetCount(uniqueMatIdx.Count() + 1); - uniqueMatIdx[uniqueMatIdx.Count() - 1] = matIDtoMatIdx[id]; - if (mtls[matIDtoMatIdx[id]].empty()) - unusedSlotIdx = matIDtoMatIdx[id]; - subMatIdLUT[j] = uniqueMatIdx.Count() - 1; - wr(&matIDtoMatIdx[id], 2); + found = true; + subMatIdLUT[j] = x; + break; } - } - } - else - for (int j = 0; j < num; ++j) + if (!found) { - int id = getmatid(mtl->GetSubMtl(j)); - wr(&id, 2); + uniqueMatIdx.SetCount(uniqueMatIdx.Count() + 1); + uniqueMatIdx[uniqueMatIdx.Count() - 1] = matIDtoMatIdx[id]; + if (mtls[matIDtoMatIdx[id]].empty()) + unusedSlotIdx = matIDtoMatIdx[id]; + subMatIdLUT[j] = uniqueMatIdx.Count() - 1; + wr(&matIDtoMatIdx[id], 2); } + } eblk; } else { num = getmatid(mtl, n->GetWireColor()); - if (num >= 0 && useMOpt()) + if (num >= 0) num = matIDtoMatIdx[num]; if (num >= 0) { @@ -2317,7 +2308,7 @@ bool wr_hlp( const void * p, int l, FILE * h ) f.v[v2] = m.faces[i].v[2]; f.smgr = m.faces[i].smGroup; MtlID mid = m.faces[i].getMatID(); - if (useMOpt() && n->GetMtl()) + if (n->GetMtl()) { Mtl *mtl = n->GetMtl(); int num = mtl->NumSubMtls(); @@ -2436,7 +2427,7 @@ bool wr_hlp( const void * p, int l, FILE * h ) f.v[v2] = (unsigned short)m.faces[i].v[2]; f.smgr = m.faces[i].smGroup; MtlID mid = m.faces[i].getMatID(); - if (useMOpt() && n->GetMtl()) + if (n->GetMtl()) { Mtl *mtl = n->GetMtl(); int num = mtl->NumSubMtls(); @@ -3090,7 +3081,7 @@ bool wr_hlp( const void * p, int l, FILE * h ) int i; for (i = 0; i < mat.Count(); ++i) { - if (useMOpt() && matIDtoMatIdx[i] < 0) + if (matIDtoMatIdx[i] < 0) continue; bblk(DAG_MATER); if (mat[i].name) diff --git a/prog/tools/sceneTools/assetExp/assetExport.cpp b/prog/tools/sceneTools/assetExp/assetExport.cpp index d86603e03..50f056f57 100644 --- a/prog/tools/sceneTools/assetExp/assetExport.cpp +++ b/prog/tools/sceneTools/assetExp/assetExport.cpp @@ -341,6 +341,7 @@ class AssetExport : public IDaBuildInterface if (!save_all_caches && get_time_usec(ref) < 5 * 1000) { cache_path.clear(); + data_offset = 0; return true; } diff --git a/prog/tools/sceneTools/assetExp/exporters/apexDestrExp.cpp b/prog/tools/sceneTools/assetExp/exporters/apexDestrExp.cpp index 4b49ad296..e1af0f284 100644 --- a/prog/tools/sceneTools/assetExp/exporters/apexDestrExp.cpp +++ b/prog/tools/sceneTools/assetExp/exporters/apexDestrExp.cpp @@ -1762,20 +1762,7 @@ class ApexDestrExporterPlugin : public IDaBuildPlugin ApexDestrExp exp; }; - -#if !_TARGET_STATIC_LIB -// required for ZLIB (that in turn is required by LIBPNG) -extern "C" void *zcalloc(void *opaque, unsigned items, unsigned size) -{ - G_UNUSED(opaque); - return memalloc_default(items * size); -} -extern "C" void zcfree(void *opaque, void *ptr) -{ - memfree_default(ptr); - G_UNUSED(opaque); -} -#endif +String validate_texture_types(String tex_name, const char *class_name, int slot, DagorAssetMgr &mgr) { return {}; } DABUILD_PLUGIN_API IDaBuildPlugin *__stdcall get_dabuild_plugin() { return new (midmem) ApexDestrExporterPlugin; } END_DABUILD_PLUGIN_NAMESPACE(apex) diff --git a/prog/tools/sceneTools/assetExp/exporters/jamfile-model b/prog/tools/sceneTools/assetExp/exporters/jamfile-model index 63e14cc28..0b479d22d 100644 --- a/prog/tools/sceneTools/assetExp/exporters/jamfile-model +++ b/prog/tools/sceneTools/assetExp/exporters/jamfile-model @@ -12,7 +12,10 @@ if $(Platform) = win64 { OutDir = $(Root)/tools/dagor3_cdk/bin64/plugins/dabuild Sources = modelExp.cpp modelExpUtil.cpp exp_tools.cpp exp_skeleton_tools.cpp exp_rendInst.cpp exp_dynModel.cpp exp_skeleton.cpp exp_rndGrass.cpp ; -AddIncludes = $(Root)/prog/tools/sharedInclude ; +AddIncludes = + $(Root)/prog/tools/sharedInclude + $(Root)/prog/engine/sharedInclude +; UseProgLibs = engine/startup diff --git a/prog/tools/sceneTools/assetExp/exporters/modelExp.cpp b/prog/tools/sceneTools/assetExp/exporters/modelExp.cpp index ffedd7058..601d93ad6 100644 --- a/prog/tools/sceneTools/assetExp/exporters/modelExp.cpp +++ b/prog/tools/sceneTools/assetExp/exporters/modelExp.cpp @@ -11,6 +11,7 @@ #include #include #include +#include <../shaders/shadersBinaryData.h> #include #include #include @@ -115,6 +116,51 @@ void load_shaders_for_target(unsigned tc) } } +String validate_texture_types(String tex_name, const char *class_name, int slot, DagorAssetMgr &mgr) +{ + load_shaders_for_target(_MAKE4C('PC')); + + auto *sh_class = shBinDump(false).findShaderClass(class_name); + + if (sh_class->staticTextureTypeBySlot.empty()) + return {}; + + auto texture_type = sh_class->staticTextureTypeBySlot[slot]; + bool is_valid_texture_type = true; + + String tmp_stor; + tex_name.printf(64, "%s%s%s", texRefNamePrefix.str(), DagorAsset::fpath2asset(TextureMetaData::decodeFileName(tex_name, &tmp_stor)), + texRefNameSuffix.str()); + + DagorAsset *tex_a = mgr.findAsset(tex_name, mgr.getTexAssetTypeId()); + if (!tex_a) + return {}; + + const char *tex_type_str = tex_a->props.getStr("texType", nullptr); + if (!tex_type_str || strcmp(tex_type_str, "tex2D") == 0) + is_valid_texture_type = texture_type == ShaderVarTextureType::SHVT_TEX_2D; + else if (strcmp(tex_type_str, "cube") == 0) + is_valid_texture_type = texture_type == ShaderVarTextureType::SHVT_TEX_CUBE; + else if (strcmp(tex_type_str, "tex3D") == 0) + is_valid_texture_type = texture_type == ShaderVarTextureType::SHVT_TEX_3D; + + if (!is_valid_texture_type) + { + const char *tex_type_in_shader = "unknown"; + switch (texture_type) + { + case SHVT_TEX_2D: tex_type_in_shader = "tex2D"; break; + case SHVT_TEX_3D: tex_type_in_shader = "tex3D"; break; + case SHVT_TEX_CUBE: tex_type_in_shader = "cube"; break; + case SHVT_TEX_2D_ARRAY: tex_type_in_shader = "tex2DArray"; break; + case SHVT_TEX_CUBE_ARRAY: tex_type_in_shader = "cubeArray"; break; + } + return String(0, "Static texture type '%s' does not match the type of declaration in the shader '%s': texture '%s'", + tex_type_str ? tex_type_str : "tex2D", tex_type_in_shader, tex_name); + } + return {}; +} + class ModelExporterPlugin : public IDaBuildPlugin, public ITextureNameResolver { public: diff --git a/prog/tools/sceneTools/assetExp/exporters/modelExpUtil.cpp b/prog/tools/sceneTools/assetExp/exporters/modelExpUtil.cpp index 2322aac95..c8fafe688 100644 --- a/prog/tools/sceneTools/assetExp/exporters/modelExpUtil.cpp +++ b/prog/tools/sceneTools/assetExp/exporters/modelExpUtil.cpp @@ -43,7 +43,10 @@ static bool find_valid_ref(dag::ConstSpan r, DagorA return false; } -static bool get_dag_tex_and_proxymat_list(const char *dag_fn, Tab &list, Tab &proxy_mat_list, IProcessMaterialData *pm) +String validate_texture_types(String tex_name, const char *class_name, int slot, DagorAssetMgr &mgr); + +static bool get_dag_tex_and_proxymat_list(const char *dag_fn, Tab &list, Tab &proxy_mat_list, IProcessMaterialData *pm, + DagorAssetMgr &mgr) { if (!pm) return ::get_dag_textures(dag_fn, list); @@ -91,7 +94,14 @@ static bool get_dag_tex_and_proxymat_list(const char *dag_fn, Tab &list, return false; for (int j = 0; j < MAXMATTEXNUM; j++) if (gm.mats[i]->mtex[j] != BAD_TEXTUREID) - list.push_back() = get_managed_texture_name(gm.mats[i]->mtex[j]); + { + String tex_name(get_managed_texture_name(gm.mats[i]->mtex[j])); + list.push_back() = tex_name; + + String validate_result = validate_texture_types(tex_name, gm.mats[i]->className, j, mgr); + if (!validate_result.empty()) + list.back() = validate_result; + } } return true; } @@ -107,10 +117,24 @@ void add_dag_texture_and_proxymat_refs(const char *dag_fn, TabdeleteStaticGeometryNode(collisionNode); - for (int i = 0; i < land_rmesh.size(); ++i) - if (land_rmesh[i]) - dagGeom->destroyShaderMesh(land_rmesh[i]); - - clear_and_shrink(land_rmesh); - for (int i = 0; i < cells.size(); ++i) { if (cells[i].land_mesh) @@ -185,44 +178,6 @@ void LandMeshMap::clear(bool clear_tracer) } -ShaderMesh *LandMeshMap::getLandShaderMesh(int x, int y, bool do_create, bool offseted) -{ - if (!offseted) - { - x -= origin.x; - y -= origin.y; - } - - if (x < 0 || y < 0 || x >= size.x || y >= size.y) - return NULL; - - ShaderMesh *&m = land_rmesh[y * size.x + x]; - - if (do_create && !m) - { - Mesh *gm = cells[y * size.x + x].land_mesh; - if (gm->vert.size() > 65535 && gm->face.size() * 3 > 65535) - { - DAEDITOR3.conError("too big mesh (%d vert, %d faces), cannot make land shadermesh", gm->vert.size(), gm->face.size()); - return NULL; - } - if (!landMat) - { - MaterialData mat; - mat.className = "land_mesh"; - landMat = dagGeom->newShaderMaterial(mat); - if (!landMat) - { - DAEDITOR3.conError("can't create shader material <%s>", mat.className.str()); - return NULL; - } - } - - m = dagGeom->createSimpleShaderMesh(*gm, landMat); - } - return m; -} - BBox3 LandMeshMap::getBBox(int x, int y, float *sphere_radius) { x -= origin.x; diff --git a/prog/tools/sceneTools/daEditorX/HeightmapLand/landClassSlotsMgr.cpp b/prog/tools/sceneTools/daEditorX/HeightmapLand/landClassSlotsMgr.cpp index 3b1764e25..205736a8e 100644 --- a/prog/tools/sceneTools/daEditorX/HeightmapLand/landClassSlotsMgr.cpp +++ b/prog/tools/sceneTools/daEditorX/HeightmapLand/landClassSlotsMgr.cpp @@ -617,6 +617,9 @@ static void serialize_huge_bm(const objgenerator::HugeBitmask &bm, const char *f void LandClassSlotsManager::exportEntityGenDataToFile(MapStorage &land_cls_map, unsigned target_code) { + if (!rigenSrv) + return; + DataBlock appBlk(DAGORED2->getWorkspace().getAppPath()); String base; DAGORED2->getProjectFolderPath(base); diff --git a/prog/tools/sceneTools/daEditorX/HeightmapLand/landMeshMap.h b/prog/tools/sceneTools/daEditorX/HeightmapLand/landMeshMap.h index 82f8397df..17103ccf2 100644 --- a/prog/tools/sceneTools/daEditorX/HeightmapLand/landMeshMap.h +++ b/prog/tools/sceneTools/daEditorX/HeightmapLand/landMeshMap.h @@ -50,9 +50,6 @@ class LandMeshMap clear_and_resize(cells, size.x * size.y); mem_set_0(cells); - land_rmesh.resize(size.x * size.y); - mem_set_0(land_rmesh); - cellSize = cell_size; } @@ -97,9 +94,6 @@ class LandMeshMap IPoint2 getOrigin() const { return origin; } - ShaderMesh *getLandShaderMesh(int x, int y, bool do_create, bool offseted); - ShaderMesh *getCombinedShaderMesh(int x, int y, bool do_create, bool offseted) { return NULL; } - ShaderMesh *getDecalShaderMesh(int x, int y, bool do_create, bool offseted) { return NULL; } BBox3 getBBox(int x, int y, float *sphere_radius = NULL); dag::Span getCells() { return make_span(cells); } @@ -149,7 +143,4 @@ class LandMeshMap Ptr landBottomDeepMatSG; Ptr landBottomBorderMatSG; StaticGeometryNode *collisionNode; - - Ptr landMat; - Tab land_rmesh; }; diff --git a/prog/tools/sceneTools/daEditorX/binSceneView/strmLevel.cpp b/prog/tools/sceneTools/daEditorX/binSceneView/strmLevel.cpp index 111f5c665..5f6def248 100644 --- a/prog/tools/sceneTools/daEditorX/binSceneView/strmLevel.cpp +++ b/prog/tools/sceneTools/daEditorX/binSceneView/strmLevel.cpp @@ -349,7 +349,7 @@ void AcesScene::loadLevel(const char *bindump) bufFormats[i] = parse_tex_format(clipmapBlk.getStr(String(32, "buf_tex%d", i), "NONE"), TEXFMT_DEFAULT); for (int i = 0; i < cacheCnt; ++i) formats[i] = parse_tex_format(clipmapBlk.getStr(String(32, "cache_tex%d", i), "NONE"), TEXFMT_DEFAULT); - clipmap->createCaches(formats.data(), cacheCnt, bufFormats.data(), bufCnt); + clipmap->createCaches(formats.data(), formats.data(), cacheCnt, bufFormats.data(), bufCnt); if (useToroidalHeightmap) { diff --git a/prog/tools/sceneTools/daEditorX/dagorEd.cpp b/prog/tools/sceneTools/daEditorX/dagorEd.cpp index af7f7e4bb..8113f792d 100644 --- a/prog/tools/sceneTools/daEditorX/dagorEd.cpp +++ b/prog/tools/sceneTools/daEditorX/dagorEd.cpp @@ -45,7 +45,6 @@ #include #include -#include static struct DagorEdReset3DCallback : public IDrv3DResetCB { @@ -345,8 +344,3 @@ void dagored_init_all_plugins(const DataBlock &app_blk) ::init_plugin_ssview(); ::init_plugin_bin_scn_view(); } - -// required for ZLIB (that in turn is required by LIBPNG) -extern "C" void *zcalloc(void * /*opaque*/, unsigned items, unsigned size) { return memalloc_default(items * size); } - -extern "C" void zcfree(void * /*opaque*/, void *ptr) { memfree_default(ptr); } diff --git a/prog/tools/sceneTools/daEditorX/de_appwnd.cpp b/prog/tools/sceneTools/daEditorX/de_appwnd.cpp index 348a6c6d0..9b901947b 100644 --- a/prog/tools/sceneTools/daEditorX/de_appwnd.cpp +++ b/prog/tools/sceneTools/daEditorX/de_appwnd.cpp @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include #include @@ -115,10 +115,9 @@ static bool blockCloseMessage = false; static bool (*prev_fatal_handler)(const char *msg, const char *call_stack, const char *file, int line) = NULL; // services implementations -static EditorCoreImpl editorCoreImpl; +static IEditorCore &editorCoreImpl = IEditorCore::make_instance(); static DeDagorPhys deDagorPhysImpl; IEditorCoreEngine *IEditorCoreEngine::__global_instance = NULL; -const char *EditorCoreImpl::getExePath() { return sgg::get_exe_path_full(); } // DLL plugin typedefs diff --git a/prog/tools/sceneTools/daEditorX/jamfile-editor b/prog/tools/sceneTools/daEditorX/jamfile-editor index fa3f13522..f7c79a95a 100644 --- a/prog/tools/sceneTools/daEditorX/jamfile-editor +++ b/prog/tools/sceneTools/daEditorX/jamfile-editor @@ -90,8 +90,7 @@ UseProgLibs = tools/libTools/renderUtil tools/libTools/shaderResBuilder tools/libTools/EditorCore - tools/libTools/IEditorCoreBase - tools/libTools/IEditorCore + tools/libTools/EditorCore/IEditorCore tools/libTools/ObjCreator3D engine/phys/physCommon diff --git a/prog/tools/sceneTools/daEditorX/services/csgEntMgr/csgEntityMgrService.cpp b/prog/tools/sceneTools/daEditorX/services/csgEntMgr/csgEntityMgrService.cpp index 4ff17a170..785af198e 100644 --- a/prog/tools/sceneTools/daEditorX/services/csgEntMgr/csgEntityMgrService.cpp +++ b/prog/tools/sceneTools/daEditorX/services/csgEntMgr/csgEntityMgrService.cpp @@ -1828,8 +1828,8 @@ class CsgEntityManagementService : public IEditorService, begin_draw_cached_debug_lines(); const E3DCOLOR color(0, 255, 0); for (int i = 0, ie = ent.size(); i < ie; i++) - if (ent[i] && (ent[i]->getSubtype() != IObjEntity::ST_NOT_COLLIDABLE) || - ((ent[i]->getFlags() & ent[i]->FLG_CLIP_GAME) == ent[i]->FLG_CLIP_GAME)) + if (ent[i] && ((ent[i]->getSubtype() != IObjEntity::ST_NOT_COLLIDABLE) || + ((ent[i]->getFlags() & ent[i]->FLG_CLIP_GAME) == ent[i]->FLG_CLIP_GAME))) collisionpreview::drawCollisionPreview(ent[i]->collision, TMatrix::IDENT, color); end_draw_cached_debug_lines(); } diff --git a/prog/tools/sceneTools/daEditorX/services/fxMgr/fxMgrService.cpp b/prog/tools/sceneTools/daEditorX/services/fxMgr/fxMgrService.cpp index cc097dcee..57adf9fbf 100644 --- a/prog/tools/sceneTools/daEditorX/services/fxMgr/fxMgrService.cpp +++ b/prog/tools/sceneTools/daEditorX/services/fxMgr/fxMgrService.cpp @@ -261,13 +261,13 @@ class FxEntityManagementService : public IEditorService, case STG_BEFORE_RENDER: for (int i = 0; i < ent.size(); i++) if (ent[i] && ent[i]->fx && ent[i]->isNonVirtual() && ent[i]->checkSubtypeAndLayerHiddenMasks(st_mask, lh_mask)) - ent[i]->fx->render(FX_RENDER_BEFORE); + ent[i]->fx->render(FX_RENDER_BEFORE, ::grs_cur_view.itm); break; case STG_RENDER_DYNAMIC_OPAQUE: for (int i = 0; i < ent.size(); i++) if (ent[i] && ent[i]->fx && ent[i]->isNonVirtual() && ent[i]->checkSubtypeAndLayerHiddenMasks(st_mask, lh_mask)) - ent[i]->fx->render(FX_RENDER_SOLID); + ent[i]->fx->render(FX_RENDER_SOLID, ::grs_cur_view.itm); break; case STG_RENDER_FX: @@ -280,7 +280,7 @@ class FxEntityManagementService : public IEditorService, for (int i = 0; i < ent.size(); i++) if (ent[i] && ent[i]->fx && ent[i]->isNonVirtual() && ent[i]->checkSubtypeAndLayerHiddenMasks(st_mask, lh_mask)) - ent[i]->fx->render(FX_RENDER_TRANS); + ent[i]->fx->render(FX_RENDER_TRANS, ::grs_cur_view.itm); if (dafx_enabled) calc_dafx_stats(g_dafx_ctx, g_dafx_stats); @@ -293,7 +293,7 @@ class FxEntityManagementService : public IEditorService, for (int i = 0; i < ent.size(); i++) if (ent[i] && ent[i]->fx && ent[i]->isNonVirtual() && ent[i]->checkSubtypeAndLayerHiddenMasks(st_mask, lh_mask)) - ent[i]->fx->render(FX_RENDER_DISTORTION); + ent[i]->fx->render(FX_RENDER_DISTORTION, ::grs_cur_view.itm); if (dafx_enabled) calc_dafx_stats(g_dafx_ctx, g_dafx_stats); diff --git a/prog/tools/sceneTools/daEditorX/services/hmapSrv/hmapSrv.cpp b/prog/tools/sceneTools/daEditorX/services/hmapSrv/hmapSrv.cpp index a6f520802..0f29dbb83 100644 --- a/prog/tools/sceneTools/daEditorX/services/hmapSrv/hmapSrv.cpp +++ b/prog/tools/sceneTools/daEditorX/services/hmapSrv/hmapSrv.cpp @@ -1123,7 +1123,7 @@ class GenericHeightMapService : public IHmapService bufFormats[i] = parse_tex_format(clipBlk->getStr(String(32, "buf_tex%d", i), "NONE"), TEXFMT_DEFAULT); for (int i = 0; i < cacheCnt; ++i) formats[i] = parse_tex_format(clipBlk->getStr(String(32, "cache_tex%d", i), "NONE"), TEXFMT_DEFAULT); - clipmap->createCaches(formats.data(), cacheCnt, bufFormats.data(), bufCnt); + clipmap->createCaches(formats.data(), formats.data(), cacheCnt, bufFormats.data(), bufCnt); lastClipTexSz = min(clipBlk->getInt("lastClipTexSz", 4096), lastClipTexSz); G_ASSERT(clipmap != NULL); diff --git a/prog/tools/sharedInclude/EditorCore/ec_IEditorCore.h b/prog/tools/sharedInclude/EditorCore/ec_IEditorCore.h index 5fbae168d..4110ca5ef 100644 --- a/prog/tools/sharedInclude/EditorCore/ec_IEditorCore.h +++ b/prog/tools/sharedInclude/EditorCore/ec_IEditorCore.h @@ -325,14 +325,6 @@ class IDagorGeom virtual bool set(shaders::OverrideStateId override_id) const = 0; virtual bool reset_override() const = 0; - // ShaderMesh - virtual ShaderMesh *createSimpleShaderMesh(Mesh &m, ShaderMaterial *mat, const char *info_str = NULL) = 0; - - virtual void destroyShaderMesh(ShaderMesh *&sm) = 0; - - // GlobalVertexData - virtual int globalVertexDataGetStride(const GlobalVertexData &data) const = 0; - // Mesh virtual Mesh *newMesh(IMemAlloc *alloc = NULL) const = 0; virtual void deleteMesh(Mesh *&mesh) const = 0; @@ -530,6 +522,8 @@ class IEditorCore virtual IDagorTools *getTools() = 0; virtual IDagorScene *getScene() = 0; virtual const char *getExePath() = 0; + + static IEditorCore &make_instance(); }; diff --git a/prog/tools/sharedInclude/dafxToolsHelper/dafxToolsHelper.h b/prog/tools/sharedInclude/dafxToolsHelper/dafxToolsHelper.h index e8439870f..d0a91a37d 100644 --- a/prog/tools/sharedInclude/dafxToolsHelper/dafxToolsHelper.h +++ b/prog/tools/sharedInclude/dafxToolsHelper/dafxToolsHelper.h @@ -14,6 +14,7 @@ inline void set_up_dafx_context(dafx::ContextId &dafx_ctx, dafx::CullingId &dafx dafx::Config cfg; cfg.use_async_thread = false; + cfg.qualityMask = 1 << 2; // high quality dafx_ctx = dafx::create_context(cfg); if (dafx_ctx) diff --git a/samples/skiesSample/prog/shaders/compile_shaders_pc11.bat b/samples/skiesSample/prog/shaders/compile_shaders_pc11.bat index de0f6c688..7803de471 100644 --- a/samples/skiesSample/prog/shaders/compile_shaders_pc11.bat +++ b/samples/skiesSample/prog/shaders/compile_shaders_pc11.bat @@ -1,5 +1,3 @@ @echo on ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe .\shaders_pc11.blk -q -shaderOn -nodisassembly -commentPP -codeDumpErr -bones_start 70 -o ..\..\..\..\_output\skiesSample\shaders~pc11 %1 %2 %3 -rem ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -o ..\..\..\..\_output\testPBR\shaders~tools~exp %1 %2 @echo off - diff --git a/samples/skiesSample/prog/shaders/compile_shaders_spirv.bat b/samples/skiesSample/prog/shaders/compile_shaders_spirv.bat index 5e55dbb9a..394cbe0ae 100644 --- a/samples/skiesSample/prog/shaders/compile_shaders_spirv.bat +++ b/samples/skiesSample/prog/shaders/compile_shaders_spirv.bat @@ -1,5 +1,3 @@ @echo on ..\..\..\..\tools\dagor3_cdk\util64\dsc2-spirv-dev.exe .\shaders_spirv.blk -q -shaderOn -nodisassembly -commentPP -codeDumpErr -bones_start 70 -o ..\..\..\..\_output\skiesSample\shaders~spirv %1 %2 %3 -rem ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -o ..\..\..\..\_output\testPBR\shaders~tools~exp %1 %2 @echo off - diff --git a/samples/skiesSample/prog/shaders/compile_shaders_tools.bat b/samples/skiesSample/prog/shaders/compile_shaders_tools.bat index 86227a957..edd9443ab 100644 --- a/samples/skiesSample/prog/shaders/compile_shaders_tools.bat +++ b/samples/skiesSample/prog/shaders/compile_shaders_tools.bat @@ -1,5 +1,5 @@ @echo on ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe .\shaders_tools11.blk -q -shaderOn -nodisassembly -commentPP -codeDumpErr -bones_start 70 -o ..\..\..\..\_output\skiesSample\shaders~tools11 %1 %2 %3 -..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -o ..\..\..\..\_output\skiesSample\shaders~tools~exp %1 %2 +..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -relinkOnly -o ..\..\..\..\_output\skiesSample\shaders~tools11 %1 %2 @echo off diff --git a/samples/skiesSample/prog/shaders/shaders_tools11.blk b/samples/skiesSample/prog/shaders/shaders_tools11.blk index 094533a2b..c4e670441 100644 --- a/samples/skiesSample/prog/shaders/shaders_tools11.blk +++ b/samples/skiesSample/prog/shaders/shaders_tools11.blk @@ -1,5 +1,6 @@ shader_root_dir:t="." outDumpName:t="../../tools/common/compiledShaders/tools" +packBin:b=yes include common_inc_dirs.blk source diff --git a/samples/skiesSample/prog/test_app.cpp b/samples/skiesSample/prog/test_app.cpp index 11f4108bc..4138a750f 100644 --- a/samples/skiesSample/prog/test_app.cpp +++ b/samples/skiesSample/prog/test_app.cpp @@ -1183,7 +1183,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub ShaderGlobal::set_color4(globtm_psf_3VarId,Color4(globtmTr[3]));*/ TMatrix itm; curCamera->getInvViewMatrix(itm); - heightmapOrigin = itm.getcol(3); + curCameraPos = itm.getcol(3); DA_PROFILE_TAG_LINE(camera_pos, 0xFF00FF, "%g %g %g", P3D(itm.getcol(3))); if (test) @@ -1256,14 +1256,14 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub } HeightmapRenderer meshRenderer; UniqueTexHolder heightmap; - float heightmapCellSize, heightmapScale, heightmapMin; - Point3 heightmapOrigin; + Point3 curCameraPos = ZERO(); + float heightmapCellSize = 1.f, heightmapScale = 1.f, heightmapMin = 0.f, hmapMaxHt = 1.f; void drawHeightmap() { if (!land_panel.enabled) return; - heightmapScale = land_panel.heightScale; + heightmapScale = land_panel.heightScale / hmapMaxHt; heightmapCellSize = land_panel.cellSize; heightmapMin = land_panel.heightMin * land_panel.heightScale; if (!heightmap) @@ -1284,18 +1284,19 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub ShaderGlobal::set_color4(heightmap_scaleVarId, heightmapScale, heightmapMin, 0, 0); static int tex_hmap_inv_sizesVarId = get_shader_variable_id("tex_hmap_inv_sizes"); Color4 inv_width = ShaderGlobal::get_color4_fast(tex_hmap_inv_sizesVarId); - ShaderGlobal::set_color4(world_to_hmap_lowVarId, inv_width.r / (heightmapCellSize), -inv_width.g / (heightmapCellSize), 0.5, 0.5); + Point2 origin(land_panel.hmapCenterOfsX + 0.5f, land_panel.hmapCenterOfsZ + 0.5f); + Point2 invWorldSize = Point2(inv_width.r / heightmapCellSize, inv_width.g / heightmapCellSize); + ShaderGlobal::set_color4(world_to_hmap_lowVarId, Color4(invWorldSize.x, invWorldSize.y, origin.x, origin.y)); LodGrid lodGrid; lodGrid.init(lodCount - lod, lodRad, 0, lastLodRad); LodGridCullData defaultCullData; float scaledCell = heightmapCellSize * (1 << min(11, lod)); float minHt = heightmapMin; - float maxHt = heightmapMin + heightmapScale; - Point2 origin(floorf(heightmapOrigin.x + 0.5f), floorf(heightmapOrigin.z + 0.5f)); + float maxHt = heightmapMin + hmapMaxHt * heightmapScale; float lod0Size = 0; - cull_lod_grid(lodGrid, lodGrid.lodsCount, origin.x, origin.y, scaledCell, scaledCell, -1, -1, minHt, maxHt, &frustum, NULL, - defaultCullData, NULL, lod0Size, meshRenderer.getDim(), true); + cull_lod_grid(lodGrid, lodGrid.lodsCount, floorf(curCameraPos.x + 0.5f), floorf(curCameraPos.z + 0.5f), scaledCell, scaledCell, -1, + -1, minHt, maxHt, &frustum, NULL, defaultCullData, NULL, lod0Size, meshRenderer.getDim(), true); if (!defaultCullData.getCount()) return; heightmap.setVar(); @@ -2010,7 +2011,9 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub DECLARE_BOOL_CHECKBOX(land_panel, enabled, true), DECLARE_FLOAT_SLIDER(land_panel, heightScale, 1, 10000.0, 2500.0, 1), - DECLARE_FLOAT_SLIDER(land_panel, heightMin, -1.0, 1.0, -0.5, 0.1), + DECLARE_FLOAT_SLIDER(land_panel, heightMin, -1.0, 1.0, -0.5, 0.01), + DECLARE_FLOAT_SLIDER(land_panel, hmapCenterOfsX, -0.5f, 0.5f, 0, 0.01), + DECLARE_FLOAT_SLIDER(land_panel, hmapCenterOfsZ, -0.5f, 0.5f, 0, 0.01), DECLARE_FLOAT_SLIDER(land_panel, cellSize, 1, 250, 25, 0.5), DECLARE_BOOL_CHECKBOX(land_panel, trees, true), DECLARE_BOOL_CHECKBOX(land_panel, spheres, true), @@ -2286,6 +2289,7 @@ class DemoGameScene : public DagorGameScene, public IRenderDynamicCubeFace2, pub { bool enabled, trees, spheres, plane; float heightScale, heightMin, cellSize; + float hmapCenterOfsX = 0, hmapCenterOfsZ = 0; LandPanel() : enabled(true), trees(true), spheres(true), plane(true), heightScale(2500.0), heightMin(-0.5), cellSize(25) {} } land_panel; @@ -2452,11 +2456,30 @@ wind_dep0(S[0].windDependency), wind_dep1(S[1].windDependency), wind_dep2(S[2].w struct LoadJob : cpujobs::IJob { const char *name; - DemoGameScene *scene; - LoadJob(DemoGameScene *_scene, const char *_name) : scene(_scene), name(_name) {} + DemoGameScene &s; + LoadJob(DemoGameScene &_scene, const char *_name) : s(_scene), name(_name) {} virtual void doJob() { - TexPtr tex = strcmp(dd_get_fname_ext(name), ".mtw") == 0 ? create_tex_from_mtw(name) : create_tex_from_raw_hmap_file(name); + float cell_sz = 1.0f, scale = 100.0f, h0 = 0.0f; + TexPtr tex = strcmp(dd_get_fname_ext(name), ".mtw") == 0 ? create_tex_from_mtw(name, &cell_sz, &s.hmapMaxHt, &scale, &h0) + : create_tex_from_raw_hmap_file(name); + Color4 invSz = ShaderGlobal::get_color4_fast(get_shader_variable_id("tex_hmap_inv_sizes")); + int tex_w = safeinv(invSz.r), tex_h = safeinv(invSz.g); + + s.land_panel.cellSize = s.heightmapCellSize = dgs_get_settings()->getReal("heightmapCell", cell_sz); + s.land_panel.heightScale = s.heightmapScale = dgs_get_settings()->getReal("heightmapScale", scale) * s.hmapMaxHt; + Point3 hmapSz(tex_w * s.heightmapCellSize, s.heightmapScale, tex_w * s.heightmapCellSize); + Point3 hmapOfs = dgs_get_settings()->getPoint3("hmapCenterRelOfs", + div(dgs_get_settings()->getPoint3("hmapCenterOfs", ZERO()), hmapSz)); + + s.heightmapMin = dgs_get_settings()->getReal("heightmapMin", h0) + hmapOfs.y * hmapSz.y; + s.land_panel.heightMin = s.heightmapMin / s.land_panel.heightScale; + hmapOfs.y = s.land_panel.heightMin; + + s.land_panel.hmapCenterOfsX = hmapOfs.x; + s.land_panel.hmapCenterOfsZ = hmapOfs.z; + debug("HMAP loaded %s: %.0fx%.0f size(m)=%@ cell=%gm hScale=%g hOfs=%gm hDelta=%gm hmapRelOfs=%@", name, tex_w, tex_h, hmapSz, + s.heightmapCellSize, s.heightmapScale, s.heightmapMin, s.heightmapScale, hmapOfs); struct InitHeightmap : public DelayedAction { @@ -2469,20 +2492,16 @@ wind_dep0(S[0].windDependency), wind_dep1(S[1].windDependency), wind_dep2(S[2].w cpujobs::release_done_jobs(); } }; - add_delayed_action(new InitHeightmap(scene->heightmap, eastl::move(tex))); + add_delayed_action(new InitHeightmap(s.heightmap, eastl::move(tex))); }; virtual void releaseJob() { delete this; } }; heightmap.close(); - land_panel.cellSize = heightmapCellSize = dgs_get_settings()->getReal("heightmapCell", 1.0f); - land_panel.heightScale = heightmapScale = dgs_get_settings()->getReal("heightmapScale", 100.0f); - heightmapMin = dgs_get_settings()->getReal("heightmapMin", 0); - land_panel.heightMin = heightmapMin / land_panel.heightScale; water_panel.water_level = dgs_get_settings()->getReal("heightmapWaterLevel", water_panel.water_level); const DataBlock *hmapTex = dgs_get_settings()->getBlockByNameEx("heightmapTex"); if (name) - cpujobs::add_job(1, new LoadJob(this, name)); + cpujobs::add_job(1, new LoadJob(*this, name)); } void scheduleDynModelLoad(DynamicRenderableSceneInstance **dm, const char *name, const char *skel_name, const Point3 &pos) diff --git a/samples/testGI/prog/shaders/compile_shaders_pc11.bat b/samples/testGI/prog/shaders/compile_shaders_pc11.bat index 22480bff0..898d9e69b 100644 --- a/samples/testGI/prog/shaders/compile_shaders_pc11.bat +++ b/samples/testGI/prog/shaders/compile_shaders_pc11.bat @@ -1,5 +1,3 @@ @echo on ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe .\shaders_pc11.blk -q -shaderOn -nodisassembly -commentPP -codeDumpErr -bones_start 70 -o ..\..\..\..\_output\testGI\shaders~pc11 %1 %2 %3 -rem ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -o ..\..\..\..\_output\testPBR\shaders~tools~exp %1 %2 @echo off - diff --git a/samples/testGI/prog/shaders/compile_shaders_tools.bat b/samples/testGI/prog/shaders/compile_shaders_tools.bat index 0ea2a81ef..11f698bc9 100644 --- a/samples/testGI/prog/shaders/compile_shaders_tools.bat +++ b/samples/testGI/prog/shaders/compile_shaders_tools.bat @@ -1,5 +1,5 @@ @echo on ..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe .\shaders_tools11.blk -q -shaderOn -nodisassembly -commentPP -codeDumpErr -bones_start 70 -o ..\..\..\..\_output\testGI\shaders~tools11 %1 %2 %3 -..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -o ..\..\..\..\_output\testGI\shaders~tools~exp %1 %2 +..\..\..\..\tools\dagor3_cdk\util64\dsc2-hlsl11-dev.exe shaders_tools_exp.blk -q -shaderOn -relinkOnly -o ..\..\..\..\_output\testGI\shaders~tools11 %1 %2 @echo off diff --git a/samples/testGI/prog/shaders/shaders_tools11.blk b/samples/testGI/prog/shaders/shaders_tools11.blk index 9749d0948..962301d8d 100644 --- a/samples/testGI/prog/shaders/shaders_tools11.blk +++ b/samples/testGI/prog/shaders/shaders_tools11.blk @@ -1,5 +1,6 @@ shader_root_dir:t="." outDumpName:t="../../tools/common/compiledShaders/tools" +packBin:b=yes include common_inc_dirs.blk diff --git a/samples/testGI/prog/shaders/shaders_tools_exp.blk b/samples/testGI/prog/shaders/shaders_tools_exp.blk index bc8543996..eb6d62426 100644 --- a/samples/testGI/prog/shaders/shaders_tools_exp.blk +++ b/samples/testGI/prog/shaders/shaders_tools_exp.blk @@ -11,7 +11,7 @@ source file:t = "testMat.sh" file:t = "testTree.sh" file:t = "testMatAO.sh" - file:t = "./source/heightmap.sh" + //file:t = "./source/heightmap.sh" //file:t = "./source/layered.sh" file:t = "./source/sponza.sh" }