From 6560e7cbd95de60c97b4998b0e3476093a88ffbc Mon Sep 17 00:00:00 2001 From: Keijiro Takahashi Date: Thu, 1 Jul 2021 18:00:31 +0900 Subject: [PATCH] v2.0.0 implementation --- .gitattributes | 6 - .github/workflows/main.yml | 16 + .gitignore | 8 +- Assets/Benchmark.unity | 404 + ...Stress.unity.meta => Benchmark.unity.meta} | 2 +- .../Plugin/x86_64.meta => Assets/Buffer.meta | 2 +- .../Alpha.renderTexture | 11 +- .../Alpha.renderTexture.meta | 2 +- .../Gradient.renderTexture} | 11 +- .../Gradient.renderTexture.meta} | 2 +- .../Timecode.renderTexture} | 11 +- .../Timecode.renderTexture.meta} | 2 +- Assets/Quad.unity | 6907 -------- Assets/Quad.unity.meta | 8 - Assets/RenderTextures/Color.renderTexture | 33 - .../Receiver.renderTexture.meta | 9 - Assets/RenderTextures/Small.renderTexture | 33 - Assets/Script.meta | 2 +- Assets/Script/Randomizer.cs | 24 - Assets/Script/ReceiverBenchmark.cs | 65 + ...izer.cs.meta => ReceiverBenchmark.cs.meta} | 2 +- Assets/Script/SenderBenchmark.cs | 64 + .../Script/SenderBenchmark.cs.meta | 2 +- Assets/Script/SourceSelector.cs | 36 +- Assets/Script/SourceSelector.cs.meta | 2 +- Assets/Script/Timecode.cs | 24 + .../Timecode.cs.meta} | 5 +- .../{TestCards/Runtime.meta => Shader.meta} | 2 +- Assets/Shader/Alpha.mat | 36 + .../Alpha.mat.meta} | 4 +- Assets/Shader/Alpha.shadergraph | 2267 +++ Assets/Shader/Alpha.shadergraph.meta | 10 + Assets/Shader/Gradient.mat | 123 + Assets/Shader/Gradient.mat.meta | 8 + Assets/Shader/Gradient.shadergraph | 654 + Assets/Shader/Gradient.shadergraph.meta | 10 + Assets/Shader/Receiver.mat | 123 + Assets/Shader/Receiver.mat.meta | 8 + Assets/Shader/Receiver.shadergraph | 982 ++ Assets/Shader/Receiver.shadergraph.meta | 10 + Assets/Stress.unity | 14422 ---------------- Assets/Test.unity | 3111 ++++ .../{RenderTextures.meta => Test.unity.meta} | 3 +- Assets/TestCards.meta | 9 - Assets/TestCards/Editor.meta | 9 - Assets/TestCards/Editor/TestOverlayEditor.cs | 35 - .../Editor/jp.keijiro.testcards.Editor.asmdef | 12 - .../jp.keijiro.testcards.Editor.asmdef.meta | 7 - Assets/TestCards/Resources.meta | 9 - Assets/TestCards/Resources/TestOverlay.shader | 198 - .../Resources/TestOverlay.shader.meta | 9 - Assets/TestCards/Runtime/TestOverlay.cs | 70 - .../jp.keijiro.testcards.Runtime.asmdef | 8 - .../jp.keijiro.testcards.Runtime.asmdef.meta | 7 - Assets/URP.asset | 57 + Assets/URP.asset.meta | 8 + Assets/URP_Renderer.asset | 43 + Assets/URP_Renderer.asset.meta | 8 + LICENSE | 37 +- .../Editor/MaterialPropertySelector.cs | 133 +- .../Editor/SpoutReceiverEditor.cs | 173 +- .../Editor/SpoutResources.asset | 15 + .../Editor/SpoutResources.asset.meta | 8 + .../Editor/SpoutSenderEditor.cs | 109 +- .../Editor/SpoutSenderEditor.cs.meta | 5 +- .../jp.keijiro.klak.spout/Editor/Utility.cs | 30 + .../Utility.cs.meta} | 5 +- Packages/jp.keijiro.klak.spout/LICENSE | 37 +- Packages/jp.keijiro.klak.spout/LICENSE.meta | 2 +- .../Plugin/KlakSpout.dll | Bin 0 -> 966656 bytes .../Plugin/{x86_64 => }/KlakSpout.dll.meta | 12 +- .../jp.keijiro.klak.spout/Plugin/x86.meta | 8 - .../Plugin/x86/KlakSpout.dll | Bin 136192 -> 0 bytes .../Plugin/x86/KlakSpout.dll.meta | 69 - .../Plugin/x86_64/KlakSpout.dll | Bin 163840 -> 0 bytes Packages/jp.keijiro.klak.spout/README.md | 145 +- Packages/jp.keijiro.klak.spout/README.md.meta | 2 +- Packages/jp.keijiro.klak.spout/Resources.meta | 9 - .../Resources/Blit.shader | 63 - .../Runtime/AssemblyInfo.cs | 6 - .../Runtime/Internal/Blit.shader | 99 + .../Internal}/Blit.shader.meta | 0 .../Runtime/Internal/Event.cs | 65 + .../Runtime/Internal/Event.cs.meta | 11 + .../Runtime/Internal/MemoryPool.cs | 70 + .../Runtime/Internal/MemoryPool.cs.meta | 11 + .../Runtime/Internal/Plugin.cs | 35 + .../Runtime/Internal/Plugin.cs.meta | 11 + .../Runtime/Internal/PluginEntry.cs | 152 - .../Runtime/Internal/Receiver.cs | 98 + .../Runtime/Internal/Receiver.cs.meta | 11 + .../Runtime/Internal/Sender.cs | 63 + .../Runtime/Internal/Sender.cs.meta | 11 + .../Runtime/Internal/Utility.cs | 90 +- .../Runtime/Klak.Spout.Runtime.asmdef | 13 +- .../Runtime/SpoutManager.cs | 47 +- .../Runtime/SpoutReceiver.cs | 282 +- .../Runtime/SpoutReceiver.cs.meta | 8 +- .../Runtime/SpoutReceiver_Properties.cs | 67 + .../Runtime/SpoutReceiver_Properties.cs.meta | 11 + .../Runtime/SpoutResources.cs | 17 + .../Runtime/SpoutResources.cs.meta | 7 +- .../Runtime/SpoutSender.cs | 249 +- .../Runtime/SpoutSender.cs.meta | 8 +- .../Runtime/SpoutSender_Properties.cs | 73 + .../Runtime/SpoutSender_Properties.cs.meta | 11 + Packages/jp.keijiro.klak.spout/package.json | 7 +- Packages/manifest.json | 4 +- Packages/packages-lock.json | 97 + Plugin/CMakeLists.txt | 95 - Plugin/Common.h | 23 + Plugin/Event.h | 31 + Plugin/HowToBuild.txt | 20 +- Plugin/KlakSpout/KlakSpout.cpp | 401 - Plugin/KlakSpout/KlakSpoutGlobals.h | 128 - Plugin/KlakSpout/KlakSpoutSharedObject.h | 384 - Plugin/Makefile | 50 + Plugin/Plugin.cpp | 90 + Plugin/Receiver.h | 81 + Plugin/Sender.h | 124 + Plugin/Spout/{SpoutGL => }/SpoutCommon.h | 2 +- Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.cpp | 1716 -- Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.h | 249 - .../SpoutDX/SpoutDX12/SpoutDX12.cpp | 558 - .../SpoutDX/SpoutDX12/SpoutDX12.h | 138 - Plugin/Spout/SpoutGL/Spout.cpp | 1964 --- Plugin/Spout/SpoutGL/Spout.h | 254 - Plugin/Spout/SpoutGL/SpoutControls.cpp | 1265 -- Plugin/Spout/SpoutGL/SpoutCopy.cpp | 1099 -- Plugin/Spout/SpoutGL/SpoutCopy.h | 153 - Plugin/Spout/SpoutGL/SpoutDirectX.cpp | 1036 -- Plugin/Spout/SpoutGL/SpoutDirectX.h | 111 - Plugin/Spout/SpoutGL/SpoutFrameCount.cpp | 834 - Plugin/Spout/SpoutGL/SpoutFrameCount.h | 155 - Plugin/Spout/SpoutGL/SpoutGL.cpp | 2865 --- Plugin/Spout/SpoutGL/SpoutGL.h | 414 - Plugin/Spout/SpoutGL/SpoutGLextensions.cpp | 573 - Plugin/Spout/SpoutGL/SpoutGLextensions.h | 432 - Plugin/Spout/SpoutGL/SpoutReceiver.cpp | 545 - Plugin/Spout/SpoutGL/SpoutReceiver.h | 249 - Plugin/Spout/SpoutGL/SpoutSender.cpp | 506 - Plugin/Spout/SpoutGL/SpoutSender.h | 228 - .../Spout/{SpoutGL => }/SpoutSenderNames.cpp | 281 +- Plugin/Spout/{SpoutGL => }/SpoutSenderNames.h | 8 +- .../Spout/{SpoutGL => }/SpoutSharedMemory.cpp | 20 +- .../Spout/{SpoutGL => }/SpoutSharedMemory.h | 6 + Plugin/Spout/{SpoutGL => }/SpoutUtils.cpp | 57 +- Plugin/Spout/{SpoutGL => }/SpoutUtils.h | 37 +- Plugin/System.h | 101 + Plugin/Unity/IUnityGraphics.h | 15 +- Plugin/Unity/IUnityGraphicsD3D11.h | 6 + Plugin/Unity/IUnityGraphicsD3D12.h | 4 +- Plugin/Unity/IUnityInterface.h | 10 +- Plugin/Unity/IUnityProfiler.h | 272 - Plugin/Unity/IUnityRenderingExtensions.h | 340 - Plugin/Util.h | 36 + Plugin/d3d11on12.h | 171 + ProjectSettings/AudioManager.asset | 2 +- ProjectSettings/DynamicsManager.asset | 20 +- ProjectSettings/EditorBuildSettings.asset | 7 +- ProjectSettings/EditorSettings.asset | 27 +- ProjectSettings/GraphicsSettings.asset | 11 +- ProjectSettings/InputManager.asset | 192 + ProjectSettings/NavMeshAreas.asset | 2 + ProjectSettings/NetworkManager.asset | 8 - ProjectSettings/PackageManagerSettings.asset | 43 + ProjectSettings/Physics2DSettings.asset | 26 +- ProjectSettings/PresetManager.asset | 3 +- ProjectSettings/ProjectSettings.asset | 262 +- ProjectSettings/ProjectVersion.txt | 4 +- ProjectSettings/QualitySettings.asset | 36 +- ProjectSettings/SceneTemplateSettings.json | 167 + ProjectSettings/URPProjectSettings.asset | 15 + ProjectSettings/UnityConnectSettings.asset | 1 + ProjectSettings/VFXManager.asset | 1 + ProjectSettings/VersionControlSettings.asset | 8 + README.md | 135 +- 177 files changed, 11067 insertions(+), 40491 deletions(-) create mode 100644 .github/workflows/main.yml create mode 100644 Assets/Benchmark.unity rename Assets/{Stress.unity.meta => Benchmark.unity.meta} (74%) rename Packages/jp.keijiro.klak.spout/Plugin/x86_64.meta => Assets/Buffer.meta (77%) rename Assets/{RenderTextures => Buffer}/Alpha.renderTexture (75%) rename Assets/{RenderTextures => Buffer}/Alpha.renderTexture.meta (79%) rename Assets/{RenderTextures/Receiver.renderTexture => Buffer/Gradient.renderTexture} (75%) rename Assets/{RenderTextures/Color.renderTexture.meta => Buffer/Gradient.renderTexture.meta} (79%) rename Assets/{RenderTextures/Shutter.renderTexture => Buffer/Timecode.renderTexture} (75%) rename Assets/{RenderTextures/Shutter.renderTexture.meta => Buffer/Timecode.renderTexture.meta} (79%) delete mode 100644 Assets/Quad.unity delete mode 100644 Assets/Quad.unity.meta delete mode 100644 Assets/RenderTextures/Color.renderTexture delete mode 100644 Assets/RenderTextures/Receiver.renderTexture.meta delete mode 100644 Assets/RenderTextures/Small.renderTexture delete mode 100644 Assets/Script/Randomizer.cs create mode 100644 Assets/Script/ReceiverBenchmark.cs rename Assets/Script/{Randomizer.cs.meta => ReceiverBenchmark.cs.meta} (83%) create mode 100644 Assets/Script/SenderBenchmark.cs rename Packages/jp.keijiro.klak.spout/Runtime/AssemblyInfo.cs.meta => Assets/Script/SenderBenchmark.cs.meta (83%) create mode 100644 Assets/Script/Timecode.cs rename Assets/{TestCards/Editor/TestOverlayEditor.cs.meta => Script/Timecode.cs.meta} (69%) rename Assets/{TestCards/Runtime.meta => Shader.meta} (77%) create mode 100644 Assets/Shader/Alpha.mat rename Assets/{RenderTextures/Small.renderTexture.meta => Shader/Alpha.mat.meta} (64%) create mode 100644 Assets/Shader/Alpha.shadergraph create mode 100644 Assets/Shader/Alpha.shadergraph.meta create mode 100644 Assets/Shader/Gradient.mat create mode 100644 Assets/Shader/Gradient.mat.meta create mode 100644 Assets/Shader/Gradient.shadergraph create mode 100644 Assets/Shader/Gradient.shadergraph.meta create mode 100644 Assets/Shader/Receiver.mat create mode 100644 Assets/Shader/Receiver.mat.meta create mode 100644 Assets/Shader/Receiver.shadergraph create mode 100644 Assets/Shader/Receiver.shadergraph.meta delete mode 100644 Assets/Stress.unity create mode 100644 Assets/Test.unity rename Assets/{RenderTextures.meta => Test.unity.meta} (67%) delete mode 100644 Assets/TestCards.meta delete mode 100644 Assets/TestCards/Editor.meta delete mode 100644 Assets/TestCards/Editor/TestOverlayEditor.cs delete mode 100644 Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef delete mode 100644 Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef.meta delete mode 100644 Assets/TestCards/Resources.meta delete mode 100644 Assets/TestCards/Resources/TestOverlay.shader delete mode 100644 Assets/TestCards/Resources/TestOverlay.shader.meta delete mode 100644 Assets/TestCards/Runtime/TestOverlay.cs delete mode 100644 Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef delete mode 100644 Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef.meta create mode 100644 Assets/URP.asset create mode 100644 Assets/URP.asset.meta create mode 100644 Assets/URP_Renderer.asset create mode 100644 Assets/URP_Renderer.asset.meta create mode 100644 Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset create mode 100644 Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset.meta create mode 100644 Packages/jp.keijiro.klak.spout/Editor/Utility.cs rename Packages/jp.keijiro.klak.spout/{Runtime/Internal/PluginEntry.cs.meta => Editor/Utility.cs.meta} (69%) create mode 100644 Packages/jp.keijiro.klak.spout/Plugin/KlakSpout.dll rename Packages/jp.keijiro.klak.spout/Plugin/{x86_64 => }/KlakSpout.dll.meta (85%) delete mode 100644 Packages/jp.keijiro.klak.spout/Plugin/x86.meta delete mode 100644 Packages/jp.keijiro.klak.spout/Plugin/x86/KlakSpout.dll delete mode 100644 Packages/jp.keijiro.klak.spout/Plugin/x86/KlakSpout.dll.meta delete mode 100644 Packages/jp.keijiro.klak.spout/Plugin/x86_64/KlakSpout.dll delete mode 100644 Packages/jp.keijiro.klak.spout/Resources.meta delete mode 100644 Packages/jp.keijiro.klak.spout/Resources/Blit.shader delete mode 100644 Packages/jp.keijiro.klak.spout/Runtime/AssemblyInfo.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Blit.shader rename Packages/jp.keijiro.klak.spout/{Resources => Runtime/Internal}/Blit.shader.meta (100%) create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Event.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Event.cs.meta create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs.meta create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs.meta delete mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/PluginEntry.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs.meta create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs.meta create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs.meta create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs rename Assets/TestCards/Runtime/TestOverlay.cs.meta => Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs.meta (52%) create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs create mode 100644 Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs.meta create mode 100644 Packages/packages-lock.json delete mode 100644 Plugin/CMakeLists.txt create mode 100644 Plugin/Common.h create mode 100644 Plugin/Event.h delete mode 100644 Plugin/KlakSpout/KlakSpout.cpp delete mode 100644 Plugin/KlakSpout/KlakSpoutGlobals.h delete mode 100644 Plugin/KlakSpout/KlakSpoutSharedObject.h create mode 100644 Plugin/Makefile create mode 100644 Plugin/Plugin.cpp create mode 100644 Plugin/Receiver.h create mode 100644 Plugin/Sender.h rename Plugin/Spout/{SpoutGL => }/SpoutCommon.h (98%) delete mode 100644 Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.cpp delete mode 100644 Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.h delete mode 100644 Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.cpp delete mode 100644 Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.h delete mode 100644 Plugin/Spout/SpoutGL/Spout.cpp delete mode 100644 Plugin/Spout/SpoutGL/Spout.h delete mode 100644 Plugin/Spout/SpoutGL/SpoutControls.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutCopy.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutCopy.h delete mode 100644 Plugin/Spout/SpoutGL/SpoutDirectX.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutDirectX.h delete mode 100644 Plugin/Spout/SpoutGL/SpoutFrameCount.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutFrameCount.h delete mode 100644 Plugin/Spout/SpoutGL/SpoutGL.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutGL.h delete mode 100644 Plugin/Spout/SpoutGL/SpoutGLextensions.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutGLextensions.h delete mode 100644 Plugin/Spout/SpoutGL/SpoutReceiver.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutReceiver.h delete mode 100644 Plugin/Spout/SpoutGL/SpoutSender.cpp delete mode 100644 Plugin/Spout/SpoutGL/SpoutSender.h rename Plugin/Spout/{SpoutGL => }/SpoutSenderNames.cpp (90%) rename Plugin/Spout/{SpoutGL => }/SpoutSenderNames.h (96%) rename Plugin/Spout/{SpoutGL => }/SpoutSharedMemory.cpp (93%) rename Plugin/Spout/{SpoutGL => }/SpoutSharedMemory.h (96%) rename Plugin/Spout/{SpoutGL => }/SpoutUtils.cpp (95%) rename Plugin/Spout/{SpoutGL => }/SpoutUtils.h (95%) create mode 100644 Plugin/System.h delete mode 100644 Plugin/Unity/IUnityProfiler.h delete mode 100644 Plugin/Unity/IUnityRenderingExtensions.h create mode 100644 Plugin/Util.h create mode 100644 Plugin/d3d11on12.h delete mode 100644 ProjectSettings/NetworkManager.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/SceneTemplateSettings.json create mode 100644 ProjectSettings/URPProjectSettings.asset create mode 100644 ProjectSettings/VersionControlSettings.asset diff --git a/.gitattributes b/.gitattributes index 8faa363..21d3263 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,10 +9,4 @@ *.meta text eol=lf *.h text eol=lf -*.cpp text eol=lf -*.cc text eol=lf *.c text eol=lf - -*.sln text eol=crlf -*.vcxproj text eol=crlf -*.vcxproj.filters text eol=crlf diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..95dbb01 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,16 @@ +name: UPM on npsjs.com +on: + release: + types: [created] +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + registry-url: 'https://registry.npmjs.org' + - run: npm publish + working-directory: Packages/jp.keijiro.klak.spout + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.gitignore b/.gitignore index db4db30..5967192 100644 --- a/.gitignore +++ b/.gitignore @@ -16,9 +16,11 @@ Desktop.ini # Unity /Library /Logs +/Recordings +/UserSettings /Temp # Plugin -/Plugin/build -/Plugin/build32 -/Plugin/build64 +/Plugin/*.o +/Plugin/*/*.o +/Plugin/*.dll diff --git a/Assets/Benchmark.unity b/Assets/Benchmark.unity new file mode 100644 index 0000000..9fd3fd0 --- /dev/null +++ b/Assets/Benchmark.unity @@ -0,0 +1,404 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &230620106 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 230620107} + - component: {fileID: 230620109} + - component: {fileID: 230620108} + m_Layer: 0 + m_Name: Quad + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &230620107 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 230620106} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1114794565} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &230620108 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 230620106} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c01d1eeee63acea418bafad09e507872, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &230620109 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 230620106} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1114794563 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1114794565} + - component: {fileID: 1114794564} + m_Layer: 0 + m_Name: Senders + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1114794564 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114794563} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d4da07adb0d7d9c4f83c62c2bca0bbd5, type: 3} + m_Name: + m_EditorClassIdentifier: + _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} +--- !u!4 &1114794565 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114794563} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1000, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 230620107} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1489483197 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1489483201} + - component: {fileID: 1489483200} + - component: {fileID: 1489483198} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1489483198 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489483197} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!20 &1489483200 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489483197} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.059778087, g: 0.08422497, b: 0.122641504, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 0.5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1489483201 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489483197} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1868758158 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1868758160} + - component: {fileID: 1868758159} + m_Layer: 0 + m_Name: Receivers + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1868758159 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868758158} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4708590fedf20d04eb3da3b108de12ab, type: 3} + m_Name: + m_EditorClassIdentifier: + _mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} + _material: {fileID: 2100000, guid: 7d717d2aa323e5c469963ea9c0a6cbe9, type: 2} + _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} +--- !u!4 &1868758160 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868758158} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Stress.unity.meta b/Assets/Benchmark.unity.meta similarity index 74% rename from Assets/Stress.unity.meta rename to Assets/Benchmark.unity.meta index 3badc11..d75ac0d 100644 --- a/Assets/Stress.unity.meta +++ b/Assets/Benchmark.unity.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7b522f2feebfbc049b1711f4c5f20e92 +guid: 58dcdb08bb9105547ba4115762d0ef21 DefaultImporter: externalObjects: {} userData: diff --git a/Packages/jp.keijiro.klak.spout/Plugin/x86_64.meta b/Assets/Buffer.meta similarity index 77% rename from Packages/jp.keijiro.klak.spout/Plugin/x86_64.meta rename to Assets/Buffer.meta index 379abd1..4e758e5 100644 --- a/Packages/jp.keijiro.klak.spout/Plugin/x86_64.meta +++ b/Assets/Buffer.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 402f60a0a041c0f45b17081110dc344f +guid: 71805b9365934684388c193b256c41a9 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/RenderTextures/Alpha.renderTexture b/Assets/Buffer/Alpha.renderTexture similarity index 75% rename from Assets/RenderTextures/Alpha.renderTexture rename to Assets/Buffer/Alpha.renderTexture index da87085..02ebcb8 100644 --- a/Assets/RenderTextures/Alpha.renderTexture +++ b/Assets/Buffer/Alpha.renderTexture @@ -4,23 +4,28 @@ RenderTexture: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_Name: Alpha m_ImageContentsHash: serializedVersion: 2 Hash: 00000000000000000000000000000000 m_ForcedFallbackFormat: 4 m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 3 m_Width: 1280 m_Height: 720 - m_AntiAliasing: 8 + m_AntiAliasing: 1 + m_MipCount: -1 m_DepthFormat: 2 - m_ColorFormat: 0 + m_ColorFormat: 8 m_MipMap: 0 m_GenerateMips: 1 m_SRGB: 0 m_UseDynamicScale: 0 m_BindMS: 0 + m_EnableCompatibleFormat: 1 m_TextureSettings: serializedVersion: 2 m_FilterMode: 1 diff --git a/Assets/RenderTextures/Alpha.renderTexture.meta b/Assets/Buffer/Alpha.renderTexture.meta similarity index 79% rename from Assets/RenderTextures/Alpha.renderTexture.meta rename to Assets/Buffer/Alpha.renderTexture.meta index 4d0492b..39d56b2 100644 --- a/Assets/RenderTextures/Alpha.renderTexture.meta +++ b/Assets/Buffer/Alpha.renderTexture.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f40bbf24f16734245aa8829c1fd755a2 +guid: ff94f91c62216aa4b8b027f13fe15303 NativeFormatImporter: externalObjects: {} mainObjectFileID: 8400000 diff --git a/Assets/RenderTextures/Receiver.renderTexture b/Assets/Buffer/Gradient.renderTexture similarity index 75% rename from Assets/RenderTextures/Receiver.renderTexture rename to Assets/Buffer/Gradient.renderTexture index 530155f..43927af 100644 --- a/Assets/RenderTextures/Receiver.renderTexture +++ b/Assets/Buffer/Gradient.renderTexture @@ -4,23 +4,28 @@ RenderTexture: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Receiver + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Gradient m_ImageContentsHash: serializedVersion: 2 Hash: 00000000000000000000000000000000 m_ForcedFallbackFormat: 4 m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 3 m_Width: 1280 m_Height: 720 m_AntiAliasing: 1 + m_MipCount: -1 m_DepthFormat: 2 - m_ColorFormat: 0 + m_ColorFormat: 8 m_MipMap: 0 m_GenerateMips: 1 m_SRGB: 0 m_UseDynamicScale: 0 m_BindMS: 0 + m_EnableCompatibleFormat: 1 m_TextureSettings: serializedVersion: 2 m_FilterMode: 1 diff --git a/Assets/RenderTextures/Color.renderTexture.meta b/Assets/Buffer/Gradient.renderTexture.meta similarity index 79% rename from Assets/RenderTextures/Color.renderTexture.meta rename to Assets/Buffer/Gradient.renderTexture.meta index 1691a95..a23bb00 100644 --- a/Assets/RenderTextures/Color.renderTexture.meta +++ b/Assets/Buffer/Gradient.renderTexture.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 32afc7900213c854ba8ebc1c05648972 +guid: 73e8dcdfe3f22594693dc569656418c6 NativeFormatImporter: externalObjects: {} mainObjectFileID: 8400000 diff --git a/Assets/RenderTextures/Shutter.renderTexture b/Assets/Buffer/Timecode.renderTexture similarity index 75% rename from Assets/RenderTextures/Shutter.renderTexture rename to Assets/Buffer/Timecode.renderTexture index 4c1aa68..a247c5a 100644 --- a/Assets/RenderTextures/Shutter.renderTexture +++ b/Assets/Buffer/Timecode.renderTexture @@ -4,23 +4,28 @@ RenderTexture: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Shutter + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Timecode m_ImageContentsHash: serializedVersion: 2 Hash: 00000000000000000000000000000000 m_ForcedFallbackFormat: 4 m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 3 m_Width: 1280 m_Height: 720 m_AntiAliasing: 1 + m_MipCount: -1 m_DepthFormat: 2 - m_ColorFormat: 0 + m_ColorFormat: 8 m_MipMap: 0 m_GenerateMips: 1 m_SRGB: 0 m_UseDynamicScale: 0 m_BindMS: 0 + m_EnableCompatibleFormat: 1 m_TextureSettings: serializedVersion: 2 m_FilterMode: 1 diff --git a/Assets/RenderTextures/Shutter.renderTexture.meta b/Assets/Buffer/Timecode.renderTexture.meta similarity index 79% rename from Assets/RenderTextures/Shutter.renderTexture.meta rename to Assets/Buffer/Timecode.renderTexture.meta index f109e47..d7d8033 100644 --- a/Assets/RenderTextures/Shutter.renderTexture.meta +++ b/Assets/Buffer/Timecode.renderTexture.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 35c93f0d33b8ff74bbbd1a5786965543 +guid: 9ea82f700d9e65841ae79a62180986d5 NativeFormatImporter: externalObjects: {} mainObjectFileID: 8400000 diff --git a/Assets/Quad.unity b/Assets/Quad.unity deleted file mode 100644 index 13a9162..0000000 --- a/Assets/Quad.unity +++ /dev/null @@ -1,6907 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.18028583, g: 0.22571579, b: 0.3069232, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_TemporalCoherenceThreshold: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &115123631 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 115123632} - m_Layer: 0 - m_Name: Senders - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &115123632 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 115123631} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 238155384} - - {fileID: 1187249423} - - {fileID: 1842315563} - - {fileID: 817111957} - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &139088880 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 139088881} - m_Layer: 5 - m_Name: Alpha - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &139088881 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 139088880} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1845268783} - - {fileID: 1904679014} - m_Father: {fileID: 241361479} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -4, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &180353426 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 180353427} - - component: {fileID: 180353429} - - component: {fileID: 180353428} - m_Layer: 5 - m_Name: Item Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &180353427 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 180353426} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 201173784} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &180353428 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 180353426} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &180353429 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 180353426} - m_CullTransparentMesh: 0 ---- !u!1 &201173783 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 201173784} - - component: {fileID: 201173785} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &201173784 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 201173783} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 180353427} - - {fileID: 731124111} - - {fileID: 1675726405} - m_Father: {fileID: 1677821827} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &201173785 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 201173783} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 2109663825, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 180353428} - toggleTransition: 1 - graphic: {fileID: 731124112} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null - m_IsOn: 1 ---- !u!1 &230785090 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 230785091} - - component: {fileID: 230785094} - - component: {fileID: 230785093} - - component: {fileID: 230785092} - m_Layer: 5 - m_Name: Scrollbar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &230785091 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230785090} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 343322506} - m_Father: {fileID: 437581285} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!114 &230785092 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230785090} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -2061169968, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 592277018} - m_HandleRect: {fileID: 592277017} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Scrollbar+ScrollEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &230785093 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230785090} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &230785094 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230785090} - m_CullTransparentMesh: 0 ---- !u!1 &238155383 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 238155384} - - component: {fileID: 238155385} - m_Layer: 0 - m_Name: KlakSpout (Alpha) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &238155384 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 238155383} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 115123632} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &238155385 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 238155383} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 8400000, guid: f40bbf24f16734245aa8829c1fd755a2, type: 2} - _alphaSupport: 1 ---- !u!1 &241361475 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 241361479} - - component: {fileID: 241361478} - - component: {fileID: 241361477} - - component: {fileID: 241361476} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &241361476 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 241361475} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &241361477 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 241361475} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &241361478 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 241361475} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 817111956} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &241361479 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 241361475} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 139088881} - - {fileID: 435379184} - - {fileID: 647156382} - - {fileID: 1419381661} - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &266595429 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 266595432} - - component: {fileID: 266595431} - - component: {fileID: 266595430} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &266595430 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 266595429} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &266595431 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 266595429} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &266595432 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 266595429} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &287557696 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 287557699} - - component: {fileID: 287557698} - - component: {fileID: 287557697} - m_Layer: 0 - m_Name: Shutter - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &287557697 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 287557696} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 09e531f25570e604d8fb78aee77125a9, type: 3} - m_Name: - m_EditorClassIdentifier: - _mode: 4 - _color: {r: 0.5, g: 0.5, b: 0.5, a: 1} - _scale: 4 - _shader: {fileID: 4800000, guid: bc6a0edaa182a35449d12a1445ba38db, type: 3} ---- !u!20 &287557698 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 287557696} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 1, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 100 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &287557699 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 287557696} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &335734061 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 335734062} - - component: {fileID: 335734064} - - component: {fileID: 335734063} - m_Layer: 5 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &335734062 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 335734061} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1820321995} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -7.5, y: -0.5} - m_SizeDelta: {x: -35, y: -13} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &335734063 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 335734061} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Source Name ---- !u!222 &335734064 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 335734061} - m_CullTransparentMesh: 0 ---- !u!1 &343322505 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 343322506} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &343322506 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 343322505} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 592277017} - m_Father: {fileID: 230785091} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &358741779 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 358741782} - - component: {fileID: 358741781} - - component: {fileID: 358741780} - m_Layer: 0 - m_Name: Color - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &358741780 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 358741779} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 09e531f25570e604d8fb78aee77125a9, type: 3} - m_Name: - m_EditorClassIdentifier: - _mode: 3 - _color: {r: 0.5, g: 0.5, b: 0.5, a: 1} - _scale: 4 - _shader: {fileID: 4800000, guid: bc6a0edaa182a35449d12a1445ba38db, type: 3} ---- !u!20 &358741781 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 358741779} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 1, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 100 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 32afc7900213c854ba8ebc1c05648972, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &358741782 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 358741779} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &374274675 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 374274677} - - component: {fileID: 374274676} - m_Layer: 0 - m_Name: Alpha - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!20 &374274676 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 374274675} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0.5019608, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 100 - field of view: 30 - orthographic: 0 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: f40bbf24f16734245aa8829c1fd755a2, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &374274677 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 374274675} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1135562394} - - {fileID: 1279393434} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &435379183 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 435379184} - - component: {fileID: 435379186} - - component: {fileID: 435379185} - m_Layer: 5 - m_Name: Color - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &435379184 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 435379183} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 241361479} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -4, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &435379185 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 435379183} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 32afc7900213c854ba8ebc1c05648972, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &435379186 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 435379183} - m_CullTransparentMesh: 0 ---- !u!1 &437581284 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 437581285} - - component: {fileID: 437581288} - - component: {fileID: 437581287} - - component: {fileID: 437581286} - m_Layer: 5 - m_Name: Template - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &437581285 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 437581284} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1871897326} - - {fileID: 230785091} - m_Father: {fileID: 1820321995} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &437581286 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 437581284} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1367256648, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 1677821827} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 1871897326} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 230785092} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.ScrollRect+ScrollRectEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &437581287 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 437581284} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &437581288 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 437581284} - m_CullTransparentMesh: 0 ---- !u!1 &592277016 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 592277017} - - component: {fileID: 592277019} - - component: {fileID: 592277018} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &592277017 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 592277016} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 343322506} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.2} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &592277018 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 592277016} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &592277019 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 592277016} - m_CullTransparentMesh: 0 ---- !u!1 &647156381 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 647156382} - - component: {fileID: 647156384} - - component: {fileID: 647156383} - m_Layer: 5 - m_Name: Receiver - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &647156382 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 647156381} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1820321995} - m_Father: {fileID: 241361479} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -4, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &647156383 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 647156381} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: df6e7f57031575449b1f885f026026a6, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &647156384 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 647156381} - m_CullTransparentMesh: 0 ---- !u!1 &731124110 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 731124111} - - component: {fileID: 731124113} - - component: {fileID: 731124112} - m_Layer: 5 - m_Name: Item Checkmark - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &731124111 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731124110} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 201173784} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &731124112 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731124110} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &731124113 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731124110} - m_CullTransparentMesh: 0 ---- !u!1 &817111954 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 817111957} - - component: {fileID: 817111956} - - component: {fileID: 817111955} - m_Layer: 0 - m_Name: KlakSpout (Quad View) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &817111955 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 817111954} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &817111956 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 817111954} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &817111957 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 817111954} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 115123632} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1135562393 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1135562394} - - component: {fileID: 1135562396} - - component: {fileID: 1135562395} - m_Layer: 0 - m_Name: Particle System - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1135562394 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1135562393} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 374274677} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!199 &1135562395 -ParticleSystemRenderer: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1135562393} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 0 - m_ReflectionProbeUsage: 0 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_RenderMode: 4 - m_SortMode: 0 - m_MinParticleSize: 0 - m_MaxParticleSize: 0.5 - m_CameraVelocityScale: 0 - m_VelocityScale: 0 - m_LengthScale: 2 - m_SortingFudge: 0 - m_NormalDirection: 1 - m_RenderAlignment: 1 - m_Pivot: {x: 0, y: 0, z: 0} - m_UseCustomVertexStreams: 0 - m_EnableGPUInstancing: 1 - m_ApplyActiveColorSpace: 0 - m_VertexStreams: 00010304 - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} - m_Mesh1: {fileID: 0} - m_Mesh2: {fileID: 0} - m_Mesh3: {fileID: 0} - m_MaskInteraction: 0 ---- !u!198 &1135562396 -ParticleSystem: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1135562393} - serializedVersion: 5 - lengthInSec: 5 - simulationSpeed: 1 - stopAction: 0 - looping: 1 - prewarm: 0 - playOnAwake: 1 - useUnscaledTime: 0 - autoRandomSeed: 1 - useRigidbodyForVelocity: 1 - startDelay: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - moveWithTransform: 1 - moveWithCustomTransform: {fileID: 0} - scalingMode: 1 - randomSeed: 0 - InitialModule: - serializedVersion: 3 - enabled: 1 - startLifetime: - serializedVersion: 2 - minMaxState: 3 - scalar: 5 - minScalar: 4 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startSpeed: - serializedVersion: 2 - minMaxState: 3 - scalar: 0.4 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startColor: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - startSize: - serializedVersion: 2 - minMaxState: 3 - scalar: 0.5 - minScalar: 0.1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startSizeY: - serializedVersion: 2 - minMaxState: 3 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startSizeZ: - serializedVersion: 2 - minMaxState: 3 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startRotationX: - serializedVersion: 2 - minMaxState: 3 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startRotationY: - serializedVersion: 2 - minMaxState: 3 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startRotation: - serializedVersion: 2 - minMaxState: 3 - scalar: 3.1415925 - minScalar: -3.1415925 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - randomizeRotationDirection: 0 - maxNumParticles: 1000 - size3D: 0 - rotation3D: 0 - gravityModifier: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - ShapeModule: - serializedVersion: 5 - enabled: 1 - type: 0 - angle: 25 - length: 5 - boxThickness: {x: 0, y: 0, z: 0} - radiusThickness: 1 - donutRadius: 0.2 - m_Position: {x: 0, y: 0, z: 0} - m_Rotation: {x: 0, y: 0, z: 0} - m_Scale: {x: 1, y: 1, z: 1} - placementMode: 0 - m_MeshMaterialIndex: 0 - m_MeshNormalOffset: 0 - m_Mesh: {fileID: 0} - m_MeshRenderer: {fileID: 0} - m_SkinnedMeshRenderer: {fileID: 0} - m_Sprite: {fileID: 0} - m_SpriteRenderer: {fileID: 0} - m_UseMeshMaterialIndex: 0 - m_UseMeshColors: 1 - alignToDirection: 0 - m_Texture: {fileID: 0} - m_TextureClipChannel: 3 - m_TextureClipThreshold: 0 - m_TextureUVChannel: 0 - m_TextureColorAffectsParticles: 1 - m_TextureAlphaAffectsParticles: 1 - m_TextureBilinearFiltering: 0 - randomDirectionAmount: 1 - sphericalDirectionAmount: 0 - randomPositionAmount: 0 - radius: - value: 10 - mode: 0 - spread: 0 - speed: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - arc: - value: 360 - mode: 0 - spread: 0 - speed: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - EmissionModule: - enabled: 1 - serializedVersion: 4 - rateOverTime: - serializedVersion: 2 - minMaxState: 0 - scalar: 100 - minScalar: 10 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - rateOverDistance: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_BurstCount: 0 - m_Bursts: [] - SizeModule: - enabled: 1 - curve: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 12.480291 - outSlope: 12.480291 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.3144125 - - serializedVersion: 3 - time: 0.1622655 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.80636746 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: -11.219741 - outSlope: -11.219741 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.1553774 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - RotationModule: - enabled: 1 - x: - serializedVersion: 2 - minMaxState: 3 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 3 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curve: - serializedVersion: 2 - minMaxState: 3 - scalar: 0.5235988 - minScalar: -0.5235988 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - ColorModule: - enabled: 0 - gradient: - serializedVersion: 2 - minMaxState: 1 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - UVModule: - enabled: 0 - mode: 0 - frameOverTime: - serializedVersion: 2 - minMaxState: 1 - scalar: 0.9999 - minScalar: 0.9999 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startFrame: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - tilesX: 1 - tilesY: 1 - animationType: 0 - rowIndex: 0 - cycles: 1 - uvChannelMask: -1 - flipU: 0 - flipV: 0 - randomRow: 1 - sprites: - - sprite: {fileID: 0} - VelocityModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalX: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalY: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalZ: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalOffsetX: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalOffsetY: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalOffsetZ: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - radial: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - speedModifier: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - inWorldSpace: 0 - InheritVelocityModule: - enabled: 0 - m_Mode: 0 - m_Curve: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - ForceModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - inWorldSpace: 0 - randomizePerFrame: 0 - ExternalForcesModule: - enabled: 0 - multiplier: 1 - ClampVelocityModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - magnitude: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxis: 0 - inWorldSpace: 0 - multiplyDragByParticleSize: 1 - multiplyDragByParticleVelocity: 1 - dampen: 0 - drag: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - NoiseModule: - enabled: 0 - strength: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - strengthY: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - strengthZ: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - frequency: 0.5 - damping: 1 - octaves: 1 - octaveMultiplier: 0.5 - octaveScale: 2 - quality: 2 - scrollSpeed: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remap: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remapY: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remapZ: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remapEnabled: 0 - positionAmount: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - rotationAmount: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - sizeAmount: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - SizeBySpeedModule: - enabled: 0 - curve: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - range: {x: 0, y: 1} - separateAxes: 0 - RotationBySpeedModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curve: - serializedVersion: 2 - minMaxState: 0 - scalar: 0.7853982 - minScalar: 0.7853982 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - range: {x: 0, y: 1} - ColorBySpeedModule: - enabled: 0 - gradient: - serializedVersion: 2 - minMaxState: 1 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - range: {x: 0, y: 1} - CollisionModule: - enabled: 0 - serializedVersion: 3 - type: 0 - collisionMode: 0 - colliderForce: 0 - multiplyColliderForceByParticleSize: 0 - multiplyColliderForceByParticleSpeed: 0 - multiplyColliderForceByCollisionAngle: 1 - plane0: {fileID: 0} - plane1: {fileID: 0} - plane2: {fileID: 0} - plane3: {fileID: 0} - plane4: {fileID: 0} - plane5: {fileID: 0} - m_Dampen: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_Bounce: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_EnergyLossOnCollision: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minKillSpeed: 0 - maxKillSpeed: 10000 - radiusScale: 1 - collidesWith: - serializedVersion: 2 - m_Bits: 4294967295 - maxCollisionShapes: 256 - quality: 0 - voxelSize: 0.5 - collisionMessages: 0 - collidesWithDynamic: 1 - interiorCollisions: 0 - TriggerModule: - enabled: 0 - collisionShape0: {fileID: 0} - collisionShape1: {fileID: 0} - collisionShape2: {fileID: 0} - collisionShape3: {fileID: 0} - collisionShape4: {fileID: 0} - collisionShape5: {fileID: 0} - inside: 1 - outside: 0 - enter: 0 - exit: 0 - radiusScale: 1 - SubModule: - serializedVersion: 2 - enabled: 0 - subEmitters: - - serializedVersion: 2 - emitter: {fileID: 0} - type: 0 - properties: 0 - LightsModule: - enabled: 0 - ratio: 0 - light: {fileID: 0} - randomDistribution: 1 - color: 1 - range: 1 - intensity: 1 - rangeCurve: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - intensityCurve: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - maxLights: 20 - TrailModule: - enabled: 0 - mode: 0 - ratio: 1 - lifetime: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minVertexDistance: 0.2 - textureMode: 0 - ribbonCount: 1 - worldSpace: 0 - dieWithParticles: 1 - sizeAffectsWidth: 1 - sizeAffectsLifetime: 0 - inheritParticleColor: 1 - generateLightingData: 0 - splitSubEmitterRibbons: 0 - colorOverLifetime: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - widthOverTrail: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - colorOverTrail: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - CustomDataModule: - enabled: 0 - mode0: 0 - vectorComponentCount0: 4 - color0: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - colorLabel0: Color - vector0_0: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_0: X - vector0_1: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_1: Y - vector0_2: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_2: Z - vector0_3: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_3: W - mode1: 0 - vectorComponentCount1: 4 - color1: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - colorLabel1: Color - vector1_0: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_0: X - vector1_1: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_1: Y - vector1_2: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_2: Z - vector1_3: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_3: W ---- !u!1 &1187249422 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1187249423} - - component: {fileID: 1187249424} - m_Layer: 0 - m_Name: KlakSpout (Color) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1187249423 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1187249422} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 115123632} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1187249424 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1187249422} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 8400000, guid: 32afc7900213c854ba8ebc1c05648972, type: 2} - _alphaSupport: 0 ---- !u!1 &1279393433 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1279393434} - - component: {fileID: 1279393435} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1279393434 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1279393433} - m_LocalRotation: {x: 0.34618863, y: 0.5198367, z: -0.24240384, w: 0.742404} - m_LocalPosition: {x: 0, y: 0, z: 10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 374274677} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: 70, z: 0} ---- !u!108 &1279393435 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1279393433} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 0.76 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 0 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!1 &1419381660 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1419381661} - - component: {fileID: 1419381663} - - component: {fileID: 1419381662} - m_Layer: 5 - m_Name: Shutter - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1419381661 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1419381660} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 241361479} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -4, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1419381662 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1419381660} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1419381663 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1419381660} - m_CullTransparentMesh: 0 ---- !u!1 &1675726404 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1675726405} - - component: {fileID: 1675726407} - - component: {fileID: 1675726406} - m_Layer: 5 - m_Name: Item Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1675726405 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1675726404} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 201173784} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 5, y: -0.5} - m_SizeDelta: {x: -30, y: -3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1675726406 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1675726404} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Option A ---- !u!222 &1675726407 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1675726404} - m_CullTransparentMesh: 0 ---- !u!1 &1677821826 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1677821827} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1677821827 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1677821826} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 201173784} - m_Father: {fileID: 1871897326} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} ---- !u!1 &1725766073 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1725766075} - - component: {fileID: 1725766074} - - component: {fileID: 1725766076} - m_Layer: 0 - m_Name: Receiver - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1725766074 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1725766073} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Spout Sender - _targetTexture: {fileID: 8400000, guid: df6e7f57031575449b1f885f026026a6, type: 2} - _targetRenderer: {fileID: 0} - _targetMaterialProperty: ---- !u!4 &1725766075 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1725766073} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1725766076 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1725766073} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: db99d431bbbd927408de456fbee2d7ea, type: 3} - m_Name: - m_EditorClassIdentifier: - _dropdown: {fileID: 1820321997} ---- !u!1 &1820321994 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1820321995} - - component: {fileID: 1820321999} - - component: {fileID: 1820321998} - - component: {fileID: 1820321997} - m_Layer: 5 - m_Name: Dropdown - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1820321995 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1820321994} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 335734062} - - {fileID: 2094485667} - - {fileID: 437581285} - m_Father: {fileID: 647156382} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 102, y: -17} - m_SizeDelta: {x: 200, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1820321997 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1820321994} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 853051423, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1820321998} - m_Template: {fileID: 437581285} - m_CaptionText: {fileID: 335734063} - m_CaptionImage: {fileID: 0} - m_ItemText: {fileID: 1675726406} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: - - m_Text: Source Name - m_Image: {fileID: 0} - m_OnValueChanged: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1725766076} - m_MethodName: OnChangeValue - m_Mode: 0 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 - m_TypeName: UnityEngine.UI.Dropdown+DropdownEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &1820321998 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1820321994} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &1820321999 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1820321994} - m_CullTransparentMesh: 0 ---- !u!1 &1842315562 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1842315563} - - component: {fileID: 1842315564} - m_Layer: 0 - m_Name: KlakSpout (Shutter) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1842315563 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1842315562} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 115123632} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1842315564 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1842315562} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - _alphaSupport: 0 ---- !u!1 &1845268782 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1845268783} - - component: {fileID: 1845268785} - - component: {fileID: 1845268784} - m_Layer: 5 - m_Name: Matte - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1845268783 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1845268782} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 139088881} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1845268784 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1845268782} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0, g: 0.5019608, b: 0, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1845268785 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1845268782} - m_CullTransparentMesh: 0 ---- !u!1 &1871897325 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1871897326} - - component: {fileID: 1871897329} - - component: {fileID: 1871897328} - - component: {fileID: 1871897327} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1871897326 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1871897325} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1677821827} - m_Father: {fileID: 437581285} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -18, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1871897327 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1871897325} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &1871897328 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1871897325} - m_CullTransparentMesh: 0 ---- !u!114 &1871897329 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1871897325} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -1200242548, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &1904679013 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1904679014} - - component: {fileID: 1904679016} - - component: {fileID: 1904679015} - m_Layer: 5 - m_Name: Image - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1904679014 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1904679013} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 139088881} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1904679015 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1904679013} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: f40bbf24f16734245aa8829c1fd755a2, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1904679016 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1904679013} - m_CullTransparentMesh: 0 ---- !u!1 &2094485666 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2094485667} - - component: {fileID: 2094485669} - - component: {fileID: 2094485668} - m_Layer: 5 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2094485667 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2094485666} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1820321995} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -15, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2094485668 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2094485666} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &2094485669 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2094485666} - m_CullTransparentMesh: 0 diff --git a/Assets/Quad.unity.meta b/Assets/Quad.unity.meta deleted file mode 100644 index 16b5aeb..0000000 --- a/Assets/Quad.unity.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c102c4b7108b0844f89cbc73fd8a8fb6 -timeCreated: 1491794038 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/RenderTextures/Color.renderTexture b/Assets/RenderTextures/Color.renderTexture deleted file mode 100644 index 4f3d86f..0000000 --- a/Assets/RenderTextures/Color.renderTexture +++ /dev/null @@ -1,33 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Color - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_Width: 1280 - m_Height: 720 - m_AntiAliasing: 1 - m_DepthFormat: 2 - m_ColorFormat: 0 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 diff --git a/Assets/RenderTextures/Receiver.renderTexture.meta b/Assets/RenderTextures/Receiver.renderTexture.meta deleted file mode 100644 index 2d72ca9..0000000 --- a/Assets/RenderTextures/Receiver.renderTexture.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: df6e7f57031575449b1f885f026026a6 -timeCreated: 1491923017 -licenseType: Pro -NativeFormatImporter: - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/RenderTextures/Small.renderTexture b/Assets/RenderTextures/Small.renderTexture deleted file mode 100644 index 9540818..0000000 --- a/Assets/RenderTextures/Small.renderTexture +++ /dev/null @@ -1,33 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Small - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_Width: 640 - m_Height: 360 - m_AntiAliasing: 1 - m_DepthFormat: 2 - m_ColorFormat: 0 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 diff --git a/Assets/Script.meta b/Assets/Script.meta index f858bdc..5353a1c 100644 --- a/Assets/Script.meta +++ b/Assets/Script.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 71121c4752056344da0f1984fd4b9eb9 +guid: 5bacb3f46bf57c54385422a1cd07711b folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Script/Randomizer.cs b/Assets/Script/Randomizer.cs deleted file mode 100644 index db867ea..0000000 --- a/Assets/Script/Randomizer.cs +++ /dev/null @@ -1,24 +0,0 @@ -using UnityEngine; -using UnityEngine.SceneManagement; -using System.Collections; - -public class Randomizer : MonoBehaviour -{ - [SerializeField] GameObject[] _objects = null; - - IEnumerator Start() - { - yield return new WaitForSeconds(3); - SceneManager.LoadScene("Stress"); - } - - void Update() - { - var count = Random.Range(1, 4); - for (var i = 0; i < count; i++) - { - var index = Random.Range(0, _objects.Length); - _objects[index].SetActive(!_objects[index].activeSelf); - } - } -} diff --git a/Assets/Script/ReceiverBenchmark.cs b/Assets/Script/ReceiverBenchmark.cs new file mode 100644 index 0000000..073e10f --- /dev/null +++ b/Assets/Script/ReceiverBenchmark.cs @@ -0,0 +1,65 @@ +using UnityEngine; +using Klak.Spout; + +class ReceiverBenchmark : MonoBehaviour +{ + [SerializeField] Mesh _mesh = null; + [SerializeField] Material _material = null; + [SerializeField] SpoutResources _resources = null; + + GameObject[] _instances = new GameObject[16]; + + System.Collections.IEnumerator Start() + { + for (var index = 0; index < 16; index++) + _instances[index] = CreateInstance(index); + + var interval = new WaitForSeconds(0.3f); + + while (true) + { + var index = Random.Range(0, 15); + + if (_instances[index] == null) + { + _instances[index] = CreateInstance(index); + } + else + { + Destroy(_instances[index]); + _instances[index] = null; + } + + yield return interval; + } + } + + GameObject CreateInstance(int index) + { + var components = new [] + { typeof(MeshFilter), typeof(MeshRenderer), typeof(SpoutReceiver) }; + + var go = new GameObject($"Receiver {index}", components); + + var x = (index % 4 + 0.5f) / 4 - 0.5f; + var y = (index / 4 + 0.5f) / 4 - 0.5f; + + go.transform.parent = transform; + go.transform.localPosition = new Vector3(x, y, 0); + go.transform.localScale = Vector3.one / 4; + + var mf = go.GetComponent(); + mf.sharedMesh = _mesh; + + var mr = go.GetComponent(); + mr.sharedMaterial = _material; + + var receiver = go.GetComponent(); + receiver.SetResources(_resources); + receiver.sourceName = $"Sender {index}"; + receiver.targetRenderer = mr; + receiver.targetMaterialProperty = "_MainTex"; + + return go; + } +} diff --git a/Assets/Script/Randomizer.cs.meta b/Assets/Script/ReceiverBenchmark.cs.meta similarity index 83% rename from Assets/Script/Randomizer.cs.meta rename to Assets/Script/ReceiverBenchmark.cs.meta index 59dfa6a..20ead74 100644 --- a/Assets/Script/Randomizer.cs.meta +++ b/Assets/Script/ReceiverBenchmark.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6518127bfe3cc36408250c95735192be +guid: 4708590fedf20d04eb3da3b108de12ab MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Script/SenderBenchmark.cs b/Assets/Script/SenderBenchmark.cs new file mode 100644 index 0000000..7dc71f5 --- /dev/null +++ b/Assets/Script/SenderBenchmark.cs @@ -0,0 +1,64 @@ +using UnityEngine; +using Klak.Spout; + +class SenderBenchmark : MonoBehaviour +{ + [SerializeField] SpoutResources _resources = null; + + RenderTexture _targetRT; + GameObject[] _instances = new GameObject[16]; + + System.Collections.IEnumerator Start() + { + _targetRT = new RenderTexture(256, 256, 32); + + for (var index = 0; index < 16; index++) + _instances[index] = CreateInstance(index); + + var interval = new WaitForSeconds(0.3f); + + while (true) + { + var index = Random.Range(0, 15); + + if (_instances[index] == null) + { + _instances[index] = CreateInstance(index); + } + else + { + Destroy(_instances[index]); + _instances[index] = null; + } + + yield return interval; + } + } + + GameObject CreateInstance(int index) + { + var components = new [] { typeof(Camera), typeof(SpoutSender) }; + + var go = new GameObject($"Sender {index}", components); + + var x = (index % 4 + 0.5f) / 4 - 0.5f; + var y = (index / 4 + 0.5f) / 4 - 0.5f; + + go.transform.parent = transform; + go.transform.localPosition = new Vector3(x, y, -10); + + var camera = go.GetComponent(); + camera.orthographic = true; + camera.orthographicSize = 0.5f / 4; + camera.targetTexture = _targetRT; + + var sender = go.GetComponent(); + sender.SetResources(_resources); + sender.spoutName = go.name; + sender.keepAlpha = true; + sender.captureMethod = CaptureMethod.Camera; + sender.sourceCamera = camera; + + return go; + } +} diff --git a/Packages/jp.keijiro.klak.spout/Runtime/AssemblyInfo.cs.meta b/Assets/Script/SenderBenchmark.cs.meta similarity index 83% rename from Packages/jp.keijiro.klak.spout/Runtime/AssemblyInfo.cs.meta rename to Assets/Script/SenderBenchmark.cs.meta index 20abc2c..b277f2a 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/AssemblyInfo.cs.meta +++ b/Assets/Script/SenderBenchmark.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cada99cc6cefc624b907b462cfd1e79e +guid: d4da07adb0d7d9c4f83c62c2bca0bbd5 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Script/SourceSelector.cs b/Assets/Script/SourceSelector.cs index 199b7a2..3275811 100644 --- a/Assets/Script/SourceSelector.cs +++ b/Assets/Script/SourceSelector.cs @@ -1,9 +1,7 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; +using System.Linq; using Klak.Spout; public class SourceSelector : MonoBehaviour @@ -11,43 +9,43 @@ public class SourceSelector : MonoBehaviour [SerializeField] Dropdown _dropdown = null; SpoutReceiver _receiver; - - List _sourceNames = new List(); + List _sourceNames; bool _disableCallback; - void Start() - { - _receiver = GetComponent(); - } + // HACK: Assuming that the dropdown has more than + // three child objects only while it's opened. + bool IsOpened => _dropdown.transform.childCount > 3; + + void Start() => _receiver = GetComponent(); void Update() { - // HACK: Assuming that the dropdown would have more than three child - // objects while the menu is opened. Stop updating it while visible. - if (_dropdown.transform.childCount > 3) return; + // Do nothing if the menu is opened. + if (IsOpened) return; - // Retrieve the Spout source names. - SpoutManager.GetSourceNames(_sourceNames); + // Spout source name retrieval + _sourceNames = SpoutManager.GetSourceNames().ToList(); - // Update the current selection. + // Currect selection var index = _sourceNames.IndexOf(_receiver.sourceName); + + // Append the current name to the list if it's not found. if (index < 0) { - // Append the current name to the list when it's not found. index = _sourceNames.Count; _sourceNames.Add(_receiver.sourceName); } - // We don't like to receive callback while editing options. + // Disable the callback while updating the menu options. _disableCallback = true; - // Update the menu options. + // Menu option update _dropdown.ClearOptions(); _dropdown.AddOptions(_sourceNames); _dropdown.value = index; _dropdown.RefreshShownValue(); - // Resume receiving callback. + // Resume the callback. _disableCallback = false; } diff --git a/Assets/Script/SourceSelector.cs.meta b/Assets/Script/SourceSelector.cs.meta index 5cbeadd..6b9ce3b 100644 --- a/Assets/Script/SourceSelector.cs.meta +++ b/Assets/Script/SourceSelector.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: db99d431bbbd927408de456fbee2d7ea +guid: ae07b03851b241b438588e43455fa256 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Script/Timecode.cs b/Assets/Script/Timecode.cs new file mode 100644 index 0000000..c7531d6 --- /dev/null +++ b/Assets/Script/Timecode.cs @@ -0,0 +1,24 @@ +using UnityEngine; +using UI = UnityEngine.UI; + +sealed class Timecode : MonoBehaviour +{ + [SerializeField] UI.Text _label = null; + [SerializeField] Camera _camera = null; + + Color _bgColor; + + void Start() + => _bgColor = _camera.backgroundColor; + + void Update() + { + var t = Time.time; + + var frame = (int)(t * 60 % 60); + _label.text = $"{(int)(t / 60):00}:{(int)(t % 60):00}:{frame:00}"; + + var flash = (int)t != (int)(t - Time.deltaTime); + _camera.backgroundColor = flash ? Color.white : _bgColor; + } +} diff --git a/Assets/TestCards/Editor/TestOverlayEditor.cs.meta b/Assets/Script/Timecode.cs.meta similarity index 69% rename from Assets/TestCards/Editor/TestOverlayEditor.cs.meta rename to Assets/Script/Timecode.cs.meta index c92c89d..7956ba8 100644 --- a/Assets/TestCards/Editor/TestOverlayEditor.cs.meta +++ b/Assets/Script/Timecode.cs.meta @@ -1,8 +1,7 @@ fileFormatVersion: 2 -guid: 5a0964021fc3f424f855812e3a78111c -timeCreated: 1490423409 -licenseType: Pro +guid: a02ae1586c13b694b9fa87df91f5434d MonoImporter: + externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 diff --git a/Assets/TestCards/Runtime.meta b/Assets/Shader.meta similarity index 77% rename from Assets/TestCards/Runtime.meta rename to Assets/Shader.meta index 4f7a9f9..4cb4051 100644 --- a/Assets/TestCards/Runtime.meta +++ b/Assets/Shader.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a353fdc1e133fc146901baa58fe8056b +guid: cfc6022db3d37ce41bc7da04c5895c55 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Shader/Alpha.mat b/Assets/Shader/Alpha.mat new file mode 100644 index 0000000..9e15009 --- /dev/null +++ b/Assets/Shader/Alpha.mat @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Alpha + m_Shader: {fileID: -6465566751694194690, guid: 9386c075d234d814581e1bd28d42496f, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: [] + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/Assets/RenderTextures/Small.renderTexture.meta b/Assets/Shader/Alpha.mat.meta similarity index 64% rename from Assets/RenderTextures/Small.renderTexture.meta rename to Assets/Shader/Alpha.mat.meta index 3ea8e22..c5eaf25 100644 --- a/Assets/RenderTextures/Small.renderTexture.meta +++ b/Assets/Shader/Alpha.mat.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: 165a6f902d78e484c83b6bb18a33029e +guid: 2e159dec22cd1174d99e5c2f70f07e74 NativeFormatImporter: externalObjects: {} - mainObjectFileID: 8400000 + mainObjectFileID: 2100000 userData: assetBundleName: assetBundleVariant: diff --git a/Assets/Shader/Alpha.shadergraph b/Assets/Shader/Alpha.shadergraph new file mode 100644 index 0000000..c6fc011 --- /dev/null +++ b/Assets/Shader/Alpha.shadergraph @@ -0,0 +1,2267 @@ +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "7a5514d23b98436db1a8e1d1ce20dd3a", + "m_Properties": [], + "m_Keywords": [], + "m_Nodes": [ + { + "m_Id": "1cc52af88def48a1ac5ee0b22d08aa99" + }, + { + "m_Id": "f230614854244cbcb7996af14a4955ef" + }, + { + "m_Id": "775f317cc27341f1b3b7251c4336475f" + }, + { + "m_Id": "2902e50421a04edbae5aa1673d517002" + }, + { + "m_Id": "7de4ab482bd04fd6b9369a62a0fcbb8d" + }, + { + "m_Id": "0eb9a18439d04ddb81b15c47ff1059d4" + }, + { + "m_Id": "f2f58c55dad44f45abd752be7c9a606d" + }, + { + "m_Id": "6b86c060927448f4bf8dc21976260c9a" + }, + { + "m_Id": "025cee24e79f496aaee19e24fb9ea840" + }, + { + "m_Id": "612b28cf828e48ff9c23f17fda229e01" + }, + { + "m_Id": "bff811f8ee8f4d6ab0b450ffdd24e019" + }, + { + "m_Id": "d2a20836cf89469e9faa08b3210c1217" + }, + { + "m_Id": "f46c0894eab045f487eabd9a44697824" + }, + { + "m_Id": "9605a67795e04e63a69e17437db54329" + }, + { + "m_Id": "8151015a6647401aba952a241974407c" + }, + { + "m_Id": "9bc57a1c8af94367be6b35aec0489d3a" + }, + { + "m_Id": "a6c62bd3d14d4ee3a87171d55480072e" + }, + { + "m_Id": "d1243130b34c4df3a2daa296a1137cda" + }, + { + "m_Id": "06b925eb43a842e4b45545889c816807" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "06b925eb43a842e4b45545889c816807" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a6c62bd3d14d4ee3a87171d55480072e" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0eb9a18439d04ddb81b15c47ff1059d4" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "025cee24e79f496aaee19e24fb9ea840" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6b86c060927448f4bf8dc21976260c9a" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0eb9a18439d04ddb81b15c47ff1059d4" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7de4ab482bd04fd6b9369a62a0fcbb8d" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b86c060927448f4bf8dc21976260c9a" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8151015a6647401aba952a241974407c" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f46c0894eab045f487eabd9a44697824" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9605a67795e04e63a69e17437db54329" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9bc57a1c8af94367be6b35aec0489d3a" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9bc57a1c8af94367be6b35aec0489d3a" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a6c62bd3d14d4ee3a87171d55480072e" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a6c62bd3d14d4ee3a87171d55480072e" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "8151015a6647401aba952a241974407c" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bff811f8ee8f4d6ab0b450ffdd24e019" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d2a20836cf89469e9faa08b3210c1217" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d1243130b34c4df3a2daa296a1137cda" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "06b925eb43a842e4b45545889c816807" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d2a20836cf89469e9faa08b3210c1217" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b86c060927448f4bf8dc21976260c9a" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f2f58c55dad44f45abd752be7c9a606d" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d2a20836cf89469e9faa08b3210c1217" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f46c0894eab045f487eabd9a44697824" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2902e50421a04edbae5aa1673d517002" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "1cc52af88def48a1ac5ee0b22d08aa99" + }, + { + "m_Id": "f230614854244cbcb7996af14a4955ef" + }, + { + "m_Id": "775f317cc27341f1b3b7251c4336475f" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "2902e50421a04edbae5aa1673d517002" + }, + { + "m_Id": "025cee24e79f496aaee19e24fb9ea840" + }, + { + "m_Id": "612b28cf828e48ff9c23f17fda229e01" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"fileID\":10210,\"guid\":\"0000000000000000e000000000000000\",\"type\":0}}", + "m_Guid": "" + } + }, + "m_Path": "Shader Graphs", + "m_ConcretePrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "d3efd9852638413f99168f74c8b0b9eb" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0049ba8c2468475db8b2348d7bba0fd2", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "00bdf18790254ca29e6e2f49bb6d25db", + "m_Id": 1, + "m_DisplayName": "Scale", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Scale", + "m_StageCapability": 3, + "m_Value": 2.0, + "m_DefaultValue": 10.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "025cee24e79f496aaee19e24fb9ea840", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "0049ba8c2468475db8b2348d7bba0fd2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "03307a8f92934695ab5d43300bad5b33", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "06b925eb43a842e4b45545889c816807", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -1099.33349609375, + "y": 270.6666259765625, + "width": 126.00006866455078, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "ee979aa848054332a39ca1ef644cfaa3" + }, + { + "m_Id": "a3808445afe84c1aba4fa355829307d6" + }, + { + "m_Id": "3709fe5dba694828875385e5b8bf5c55" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GradientNoiseNode", + "m_ObjectId": "0eb9a18439d04ddb81b15c47ff1059d4", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Gradient Noise", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -577.3333129882813, + "y": 659.3333129882813, + "width": 207.99996948242188, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "80a9b2bdd37546589929b31d2a9070c8" + }, + { + "m_Id": "00bdf18790254ca29e6e2f49bb6d25db" + }, + { + "m_Id": "e83ef378252d4dd09f5ac024efea8398" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "13174e266e6245ca8d5bffae9c148ea0", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "158a1284fd9244c3910b703f8c109621", + "m_Id": 1, + "m_DisplayName": "Offset", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Offset", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.5, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "159dd6a1039d4d3480b3bf058c69eec0", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "1895f721e7764104afc94bd147d3b368", + "m_Id": 1, + "m_DisplayName": "Center", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Center", + "m_StageCapability": 3, + "m_Value": { + "x": 0.5, + "y": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "19ef7aa93ea7400ca59fa6251d3bd0c8", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "1cc52af88def48a1ac5ee0b22d08aa99", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d3c554adb9984722b133c7b41215e104" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "2185a17048444f04894e5063b4a0ea63", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "23360d92aaa84385a8e3ddd2e1c9e485", + "m_Id": 4, + "m_DisplayName": "Smooth Delta", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Smooth Delta", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "25bba8157ecc4538971e2f4e93121ece", + "m_Id": 0, + "m_DisplayName": "Alpha Clip Threshold", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AlphaClipThreshold", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.5, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "2902e50421a04edbae5aa1673d517002", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "94f2a599b3ca447ab7747b78bd7f1702" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "3709fe5dba694828875385e5b8bf5c55", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3b146ccc666346e8afb038cc90f20424", + "m_Id": 2, + "m_DisplayName": "Radial Scale", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "RadialScale", + "m_StageCapability": 3, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "40987cf22e62478b852926beb8256000", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4c08f423125442d59159df4f9e1c09d3", + "m_Id": 3, + "m_DisplayName": "Delta Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Delta Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "4f1eb1df827d4ef6bfdf793b61cbd84f", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "50e78d49d13d42b58791f1b44347612c", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5c113998f2064e73b096af12c641dbbc", + "m_Id": 1, + "m_DisplayName": "Sine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Sine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "5e87492640074805a0f45a25bee8a746", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "612b28cf828e48ff9c23f17fda229e01", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.AlphaClipThreshold", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "25bba8157ecc4538971e2f4e93121ece" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.AlphaClipThreshold" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "64f2cfcb0b1b491d8393cb865d010758", + "m_Id": 3, + "m_DisplayName": "Delta Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Delta Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "6763b79430784f35b7f8d384d7b469c6", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "69f10b97ccef4cb7ab05482c73c883aa", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AddNode", + "m_ObjectId": "6b86c060927448f4bf8dc21976260c9a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Add", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -862.6666870117188, + "y": 638.6665649414063, + "width": 130.66668701171876, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "a6f2c5135a444bcfb5e98940647ede0d" + }, + { + "m_Id": "ce14e5458e78407d80224ded152ce7e5" + }, + { + "m_Id": "e5b039a7b55b44608db57ad44455edbd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", + "m_ObjectId": "6b8cded9897547568d37582ae86f517b" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "6ca452071e0849b6a459a12f0a33d0c9", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "6dbde154716e49ceab5bc66eecec9f53", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "70ac356cb63b482882e33f95ed4ba18e", + "m_Id": 1, + "m_DisplayName": "X", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "X", + "m_StageCapability": 3, + "m_Value": 0.21299999952316285, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "775f317cc27341f1b3b7251c4336475f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "6763b79430784f35b7f8d384d7b469c6" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7a695952a6ec4aa1a82efb0c254508a1", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "7c2ba8dbf47d4a2582ec093523013783", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "7de4ab482bd04fd6b9369a62a0fcbb8d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -1049.3333740234375, + "y": 575.333251953125, + "width": 145.3333740234375, + "height": 128.66668701171876 + } + }, + "m_Slots": [ + { + "m_Id": "40987cf22e62478b852926beb8256000" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "80a9b2bdd37546589929b31d2a9070c8", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "8151015a6647401aba952a241974407c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -718.6666870117188, + "y": 203.33331298828126, + "width": 126.00000762939453, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "7c2ba8dbf47d4a2582ec093523013783" + }, + { + "m_Id": "d988d4898d674486b16cceef33d96a84" + }, + { + "m_Id": "e8a9c5d792044415bc2630d36a07790d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "83b7b37b67974b139205f3f1e63a1a04", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "846412d6149a4ae4abbe999ed4cf1d31", + "m_Id": 3, + "m_DisplayName": "Length Scale", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "LengthScale", + "m_StageCapability": 3, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "855ebd0239204ad6b682c5e4c8d6782d", + "m_Id": 2, + "m_DisplayName": "Cosine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Cosine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "94f2a599b3ca447ab7747b78bd7f1702", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PolarCoordinatesNode", + "m_ObjectId": "9605a67795e04e63a69e17437db54329", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Polar Coordinates", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -1288.0001220703125, + "y": 161.99990844726563, + "width": 150.6666259765625, + "height": 93.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "69f10b97ccef4cb7ab05482c73c883aa" + }, + { + "m_Id": "1895f721e7764104afc94bd147d3b368" + }, + { + "m_Id": "3b146ccc666346e8afb038cc90f20424" + }, + { + "m_Id": "846412d6149a4ae4abbe999ed4cf1d31" + }, + { + "m_Id": "bf95acdfb61e437887f683051d236479" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "9bc57a1c8af94367be6b35aec0489d3a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -1096.6666259765625, + "y": 167.3333282470703, + "width": 119.33331298828125, + "height": 76.66666412353516 + } + }, + "m_Slots": [ + { + "m_Id": "03307a8f92934695ab5d43300bad5b33" + }, + { + "m_Id": "83b7b37b67974b139205f3f1e63a1a04" + }, + { + "m_Id": "50e78d49d13d42b58791f1b44347612c" + }, + { + "m_Id": "13174e266e6245ca8d5bffae9c148ea0" + }, + { + "m_Id": "7a695952a6ec4aa1a82efb0c254508a1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9e83d2546de14126ab74aaecc4f357ae", + "m_Id": 2, + "m_DisplayName": "Cosine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Cosine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9ea1d8d667794e13b6001c4de24e587c", + "m_Id": 2, + "m_DisplayName": "Y", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Y", + "m_StageCapability": 3, + "m_Value": 0.41200000047683718, + "m_DefaultValue": 0.0, + "m_Labels": [ + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "a3808445afe84c1aba4fa355829307d6", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 1.600000023841858, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AddNode", + "m_ObjectId": "a6c62bd3d14d4ee3a87171d55480072e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Add", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -934.0000610351563, + "y": 202.6666717529297, + "width": 126.00000762939453, + "height": 118.0000228881836 + } + }, + "m_Slots": [ + { + "m_Id": "19ef7aa93ea7400ca59fa6251d3bd0c8" + }, + { + "m_Id": "2185a17048444f04894e5063b4a0ea63" + }, + { + "m_Id": "159dd6a1039d4d3480b3bf058c69eec0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "a6f2c5135a444bcfb5e98940647ede0d", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "adb56edfe6fb4e2e9f15adc7f92e2a5b", + "m_Id": 1, + "m_DisplayName": "Sine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Sine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "bf95acdfb61e437887f683051d236479", + "m_Id": 4, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2Node", + "m_ObjectId": "bff811f8ee8f4d6ab0b450ffdd24e019", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Vector 2", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -1239.3333740234375, + "y": 672.6666259765625, + "width": 128.666748046875, + "height": 100.66669464111328 + } + }, + "m_Slots": [ + { + "m_Id": "70ac356cb63b482882e33f95ed4ba18e" + }, + { + "m_Id": "9ea1d8d667794e13b6001c4de24e587c" + }, + { + "m_Id": "c184bda45659400b96719ffd47fb4bc1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Value": { + "x": 0.0, + "y": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "c184bda45659400b96719ffd47fb4bc1", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "ce14e5458e78407d80224ded152ce7e5", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TimeNode", + "m_ObjectId": "d1243130b34c4df3a2daa296a1137cda", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Time", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -1280.0, + "y": 269.3333435058594, + "width": 80.6666259765625, + "height": 76.66666412353516 + } + }, + "m_Slots": [ + { + "m_Id": "da8db2d38cca4fa1a06a551357c069e6" + }, + { + "m_Id": "5c113998f2064e73b096af12c641dbbc" + }, + { + "m_Id": "9e83d2546de14126ab74aaecc4f357ae" + }, + { + "m_Id": "64f2cfcb0b1b491d8393cb865d010758" + }, + { + "m_Id": "f2d577852e03405bbca85b57f1c091d1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "d2a20836cf89469e9faa08b3210c1217", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -1040.6666259765625, + "y": 712.6665649414063, + "width": 130.6666259765625, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "e1d6a93f4508405691bbbbfe7e978e36" + }, + { + "m_Id": "4f1eb1df827d4ef6bfdf793b61cbd84f" + }, + { + "m_Id": "f71f3401fc344282856037973282538d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "d3c554adb9984722b133c7b41215e104", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "d3efd9852638413f99168f74c8b0b9eb", + "m_ActiveSubTarget": { + "m_Id": "6b8cded9897547568d37582ae86f517b" + }, + "m_SurfaceType": 0, + "m_AlphaMode": 0, + "m_TwoSided": false, + "m_AlphaClip": true, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d988d4898d674486b16cceef33d96a84", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.10000000149011612, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "da8db2d38cca4fa1a06a551357c069e6", + "m_Id": 0, + "m_DisplayName": "Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "e1d6a93f4508405691bbbbfe7e978e36", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e5b039a7b55b44608db57ad44455edbd", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e6c47af399d84c9faac187ebae073c12", + "m_Id": 0, + "m_DisplayName": "Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e83ef378252d4dd09f5ac024efea8398", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "e8a9c5d792044415bc2630d36a07790d", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "ee979aa848054332a39ca1ef644cfaa3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "f230614854244cbcb7996af14a4955ef", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "6ca452071e0849b6a459a12f0a33d0c9" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f2d577852e03405bbca85b57f1c091d1", + "m_Id": 4, + "m_DisplayName": "Smooth Delta", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Smooth Delta", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TimeNode", + "m_ObjectId": "f2f58c55dad44f45abd752be7c9a606d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Time", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -1194.6666259765625, + "y": 787.3333740234375, + "width": 80.6666259765625, + "height": 76.66668701171875 + } + }, + "m_Slots": [ + { + "m_Id": "e6c47af399d84c9faac187ebae073c12" + }, + { + "m_Id": "adb56edfe6fb4e2e9f15adc7f92e2a5b" + }, + { + "m_Id": "855ebd0239204ad6b682c5e4c8d6782d" + }, + { + "m_Id": "4c08f423125442d59159df4f9e1c09d3" + }, + { + "m_Id": "23360d92aaa84385a8e3ddd2e1c9e485" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.HueNode", + "m_ObjectId": "f46c0894eab045f487eabd9a44697824", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Hue", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -487.3333740234375, + "y": 73.33332061767578, + "width": 208.0, + "height": 336.6666564941406 + } + }, + "m_Slots": [ + { + "m_Id": "6dbde154716e49ceab5bc66eecec9f53" + }, + { + "m_Id": "158a1284fd9244c3910b703f8c109621" + }, + { + "m_Id": "5e87492640074805a0f45a25bee8a746" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_HueMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "f71f3401fc344282856037973282538d", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + diff --git a/Assets/Shader/Alpha.shadergraph.meta b/Assets/Shader/Alpha.shadergraph.meta new file mode 100644 index 0000000..9e78f53 --- /dev/null +++ b/Assets/Shader/Alpha.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9386c075d234d814581e1bd28d42496f +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/Shader/Gradient.mat b/Assets/Shader/Gradient.mat new file mode 100644 index 0000000..645f555 --- /dev/null +++ b/Assets/Shader/Gradient.mat @@ -0,0 +1,123 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-543972445948358089 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Gradient + m_Shader: {fileID: -6465566751694194690, guid: a8c703759a113434f8b6a1568791b99b, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Shader/Gradient.mat.meta b/Assets/Shader/Gradient.mat.meta new file mode 100644 index 0000000..223204f --- /dev/null +++ b/Assets/Shader/Gradient.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c01d1eeee63acea418bafad09e507872 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shader/Gradient.shadergraph b/Assets/Shader/Gradient.shadergraph new file mode 100644 index 0000000..6c02ab0 --- /dev/null +++ b/Assets/Shader/Gradient.shadergraph @@ -0,0 +1,654 @@ +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "84d6850bffdb48648c62741c28efaf3f", + "m_Properties": [], + "m_Keywords": [], + "m_Nodes": [ + { + "m_Id": "478dc938ec264cae804256188dcf5e09" + }, + { + "m_Id": "592e5407cb3e46beb1cff7a85c63568e" + }, + { + "m_Id": "6332032714f94c149d1663e2b567403f" + }, + { + "m_Id": "a6f1e3d1535c481ab471118d1c78b11b" + }, + { + "m_Id": "ea8fc7617d5345be972d2e07152da218" + }, + { + "m_Id": "8b3f5887d5604984846525942d251cbd" + }, + { + "m_Id": "a21adcea524a4644837b6b1e3064f047" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8b3f5887d5604984846525942d251cbd" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a21adcea524a4644837b6b1e3064f047" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a21adcea524a4644837b6b1e3064f047" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a6f1e3d1535c481ab471118d1c78b11b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ea8fc7617d5345be972d2e07152da218" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a21adcea524a4644837b6b1e3064f047" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "478dc938ec264cae804256188dcf5e09" + }, + { + "m_Id": "592e5407cb3e46beb1cff7a85c63568e" + }, + { + "m_Id": "6332032714f94c149d1663e2b567403f" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "a6f1e3d1535c481ab471118d1c78b11b" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + } + }, + "m_Path": "Shader Graphs", + "m_ConcretePrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "9d124483768e47919d67ba86bd80e58e" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0b3b154d5f6f454a8c5441ed35bf60fb", + "m_Id": 1, + "m_DisplayName": "Sine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Sine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0c29401b00c6408fa9276422db195ea4", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "1953146e4d4a4d57b8dd3cb82e81da63", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "36bcc6024f1b4542aa5c61e5757ebc46", + "m_Id": 1, + "m_DisplayName": "Time", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3e520065d0b84051ab79f5f04587fd3e", + "m_Id": 4, + "m_DisplayName": "Smooth Delta", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Smooth Delta", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "478dc938ec264cae804256188dcf5e09", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "fffd817d55364e63ac93ca91df2d0900" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5122130e43ab4dcea9283e8a2f28ace9", + "m_Id": 2, + "m_DisplayName": "Cosine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Cosine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "592e5407cb3e46beb1cff7a85c63568e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "1953146e4d4a4d57b8dd3cb82e81da63" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5b8f635e75a24267a1bb0e153899dc23", + "m_Id": 3, + "m_DisplayName": "Delta Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Delta Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6332032714f94c149d1663e2b567403f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a831797138fe45a595f7f42304cb8d40" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6d6c30a9e9fc43ceba86ec4c5734b992", + "m_Id": 0, + "m_DisplayName": "Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", + "m_ObjectId": "8684206e43394a9aaad7031b5a6df41e" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TimeNode", + "m_ObjectId": "8b3f5887d5604984846525942d251cbd", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Time", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -456.6666564941406, + "y": 241.33331298828126, + "width": 80.66665649414063, + "height": 76.0 + } + }, + "m_Slots": [ + { + "m_Id": "6d6c30a9e9fc43ceba86ec4c5734b992" + }, + { + "m_Id": "0b3b154d5f6f454a8c5441ed35bf60fb" + }, + { + "m_Id": "5122130e43ab4dcea9283e8a2f28ace9" + }, + { + "m_Id": "5b8f635e75a24267a1bb0e153899dc23" + }, + { + "m_Id": "3e520065d0b84051ab79f5f04587fd3e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "8b807d34b11b4678b47c2cc607c30688", + "m_Id": 2, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "9cf783e1268c46d08370fb17d9b90204", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "9d124483768e47919d67ba86bd80e58e", + "m_ActiveSubTarget": { + "m_Id": "8684206e43394a9aaad7031b5a6df41e" + }, + "m_SurfaceType": 0, + "m_AlphaMode": 0, + "m_TwoSided": false, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "a21adcea524a4644837b6b1e3064f047", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Aura (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -326.6666564941406, + "y": 157.3333282470703, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "9cf783e1268c46d08370fb17d9b90204" + }, + { + "m_Id": "36bcc6024f1b4542aa5c61e5757ebc46" + }, + { + "m_Id": "8b807d34b11b4678b47c2cc607c30688" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 1, + "m_FunctionName": "Aura", + "m_FunctionSource": "", + "m_FunctionBody": "float3 x = UV.x;\nx *= sin(Time * float3(1.71, 1.88, 2.23));\nx += Time * float3(0.21, 0.34, 0.13);\n\nfloat3 y = UV.y;\ny *= sin(Time * float3(1.12, 1.43, 1.73));\ny += Time * float3(0.33, 0.27, 0.31);\n\nColor = sin((x + sin(y)) * 4.45) * 0.5 + 0.5;" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a6f1e3d1535c481ab471118d1c78b11b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "bcd0ddc18e3c4e7f9d3c83c0d5ef8929" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "a831797138fe45a595f7f42304cb8d40", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "bcd0ddc18e3c4e7f9d3c83c0d5ef8929", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "ea8fc7617d5345be972d2e07152da218", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -521.333251953125, + "y": 103.33331298828125, + "width": 144.66665649414063, + "height": 129.33334350585938 + } + }, + "m_Slots": [ + { + "m_Id": "0c29401b00c6408fa9276422db195ea4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "fffd817d55364e63ac93ca91df2d0900", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + diff --git a/Assets/Shader/Gradient.shadergraph.meta b/Assets/Shader/Gradient.shadergraph.meta new file mode 100644 index 0000000..9c7505e --- /dev/null +++ b/Assets/Shader/Gradient.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a8c703759a113434f8b6a1568791b99b +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/Shader/Receiver.mat b/Assets/Shader/Receiver.mat new file mode 100644 index 0000000..fb3a1be --- /dev/null +++ b/Assets/Shader/Receiver.mat @@ -0,0 +1,123 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-1086850596210098573 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Receiver + m_Shader: {fileID: -6465566751694194690, guid: 6e59dd6be419cbb4b87375f34221f6ac, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Shader/Receiver.mat.meta b/Assets/Shader/Receiver.mat.meta new file mode 100644 index 0000000..e0ac419 --- /dev/null +++ b/Assets/Shader/Receiver.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d717d2aa323e5c469963ea9c0a6cbe9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shader/Receiver.shadergraph b/Assets/Shader/Receiver.shadergraph new file mode 100644 index 0000000..206a141 --- /dev/null +++ b/Assets/Shader/Receiver.shadergraph @@ -0,0 +1,982 @@ +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "760d960d62824969a9451eae2e02dded", + "m_Properties": [ + { + "m_Id": "92686e1f849a4a47b5c3414db4a0dba0" + } + ], + "m_Keywords": [], + "m_Nodes": [ + { + "m_Id": "b47cf7e96cd84198928bc7d44cda3549" + }, + { + "m_Id": "7d0aab17101344339a59751e7e342dc1" + }, + { + "m_Id": "9b1846c15ca34c33b0ef208380d92732" + }, + { + "m_Id": "9ff0f1499a8349c9b9fa8da7de87da4e" + }, + { + "m_Id": "46cdec2bd49248b6ba4993b0dcb7e9ea" + }, + { + "m_Id": "e0ee1b91f376427f9e5b8caa3a79d96b" + }, + { + "m_Id": "ad5438fed037479eb29c56d8b83af2a9" + }, + { + "m_Id": "d27a9878d6c649f4af5989332dc01b31" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "46cdec2bd49248b6ba4993b0dcb7e9ea" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e0ee1b91f376427f9e5b8caa3a79d96b" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ad5438fed037479eb29c56d8b83af2a9" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d27a9878d6c649f4af5989332dc01b31" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d27a9878d6c649f4af5989332dc01b31" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9ff0f1499a8349c9b9fa8da7de87da4e" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e0ee1b91f376427f9e5b8caa3a79d96b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d27a9878d6c649f4af5989332dc01b31" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e0ee1b91f376427f9e5b8caa3a79d96b" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d27a9878d6c649f4af5989332dc01b31" + }, + "m_SlotId": 2 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "b47cf7e96cd84198928bc7d44cda3549" + }, + { + "m_Id": "7d0aab17101344339a59751e7e342dc1" + }, + { + "m_Id": "9b1846c15ca34c33b0ef208380d92732" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "9ff0f1499a8349c9b9fa8da7de87da4e" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + } + }, + "m_Path": "Shader Graphs", + "m_ConcretePrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "bbff7507243a44deb835a7c7728d6d6a" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "0483b939ad1a4615a9ccd4cc89b44239", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "058913945a18461fad7713efbedbe0e2", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "09d35c315ea146ca834814d29667975b", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "1730e959dece468396a5117caab1b4a5", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "31760f9e9fdf44e49754ef0155f74b92", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "3d7bd61e2c1f4a2382a8ad489c805599", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "46cdec2bd49248b6ba4993b0dcb7e9ea", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -682.6666259765625, + "y": 279.3333435058594, + "width": 124.66668701171875, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d59e4d3668c84650a17d1acfef487461" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "92686e1f849a4a47b5c3414db4a0dba0" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "585e36eb2d374308bb08fba07d5d6622", + "m_Id": 3, + "m_DisplayName": "Frequency", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Frequency", + "m_StageCapability": 3, + "m_Value": { + "x": 17.777780532836915, + "y": 10.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "5a64807050f34ec99f5cf230c1d230b1", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "5b5abd2438694c6ab9202e165000ed62", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "7d0aab17101344339a59751e7e342dc1", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a50f796f6de04811b611aae5a405ad92" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "82519af5b9c3482e8b69e8fa4f0f2c20", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "91b8abe806484da1ba60c607629933bc", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "92686e1f849a4a47b5c3414db4a0dba0", + "m_Guid": { + "m_GuidSerialized": "fd036923-54ad-486d-825f-a92dcadb7adc" + }, + "m_Name": "Texture", + "m_DefaultReferenceName": "Texture2D_92686e1f849a4a47b5c3414db4a0dba0", + "m_OverrideReferenceName": "_MainTex", + "m_GeneratePropertyBlock": true, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "93eec6f5a6fb48c191ac80d0a359de6e", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "948c9df725e94ec2911222a2c930a848", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "9b1846c15ca34c33b0ef208380d92732", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "82519af5b9c3482e8b69e8fa4f0f2c20" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "9ff0f1499a8349c9b9fa8da7de87da4e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "93eec6f5a6fb48c191ac80d0a359de6e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "a50f796f6de04811b611aae5a405ad92", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CheckerboardNode", + "m_ObjectId": "ad5438fed037479eb29c56d8b83af2a9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Checkerboard", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -471.9999694824219, + "y": 96.66665649414063, + "width": 176.66664123535157, + "height": 166.00001525878907 + } + }, + "m_Slots": [ + { + "m_Id": "3d7bd61e2c1f4a2382a8ad489c805599" + }, + { + "m_Id": "d8849d92ad3d45d6bcdf65701179126f" + }, + { + "m_Id": "d4302db25c2746beb7715faf9043d3cd" + }, + { + "m_Id": "585e36eb2d374308bb08fba07d5d6622" + }, + { + "m_Id": "c8e6685a9da9406ea183a796a3cf2f83" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ad9f33bf743546a2b4906b9ac69d6470", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "afab11951f934565b91235f40bb86c3c", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "b47cf7e96cd84198928bc7d44cda3549", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "5a64807050f34ec99f5cf230c1d230b1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "bbff7507243a44deb835a7c7728d6d6a", + "m_ActiveSubTarget": { + "m_Id": "efb56a1b03eb411aa2215f88052f19ce" + }, + "m_SurfaceType": 0, + "m_AlphaMode": 0, + "m_TwoSided": false, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "c8e6685a9da9406ea183a796a3cf2f83", + "m_Id": 4, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "d27a9878d6c649f4af5989332dc01b31", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -205.33331298828126, + "y": 195.99998474121095, + "width": 130.66664123535157, + "height": 141.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "5b5abd2438694c6ab9202e165000ed62" + }, + { + "m_Id": "d5b23a50cbce40469e7b2a8b4f98136b" + }, + { + "m_Id": "afab11951f934565b91235f40bb86c3c" + }, + { + "m_Id": "948c9df725e94ec2911222a2c930a848" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "d4302db25c2746beb7715faf9043d3cd", + "m_Id": 2, + "m_DisplayName": "Color B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "ColorB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.699999988079071, + "y": 0.699999988079071, + "z": 0.699999988079071 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.699999988079071, + "g": 0.699999988079071, + "b": 0.699999988079071, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "d59e4d3668c84650a17d1acfef487461", + "m_Id": 0, + "m_DisplayName": "Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d5b23a50cbce40469e7b2a8b4f98136b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "d8849d92ad3d45d6bcdf65701179126f", + "m_Id": 1, + "m_DisplayName": "Color A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "ColorA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.20000000298023225, + "y": 0.20000000298023225, + "z": 0.20000000298023225 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.20000000298023225, + "g": 0.20000000298023225, + "b": 0.20000000298023225, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "e0ee1b91f376427f9e5b8caa3a79d96b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -474.6665954589844, + "y": 268.66668701171877, + "width": 186.66665649414063, + "height": 250.66664123535157 + } + }, + "m_Slots": [ + { + "m_Id": "1730e959dece468396a5117caab1b4a5" + }, + { + "m_Id": "91b8abe806484da1ba60c607629933bc" + }, + { + "m_Id": "fbddb28a4b164b0e97ee0de90db5ddd9" + }, + { + "m_Id": "ad9f33bf743546a2b4906b9ac69d6470" + }, + { + "m_Id": "31760f9e9fdf44e49754ef0155f74b92" + }, + { + "m_Id": "0483b939ad1a4615a9ccd4cc89b44239" + }, + { + "m_Id": "058913945a18461fad7713efbedbe0e2" + }, + { + "m_Id": "09d35c315ea146ca834814d29667975b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", + "m_ObjectId": "efb56a1b03eb411aa2215f88052f19ce" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "fbddb28a4b164b0e97ee0de90db5ddd9", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + diff --git a/Assets/Shader/Receiver.shadergraph.meta b/Assets/Shader/Receiver.shadergraph.meta new file mode 100644 index 0000000..2ccfc83 --- /dev/null +++ b/Assets/Shader/Receiver.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6e59dd6be419cbb4b87375f34221f6ac +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/Stress.unity b/Assets/Stress.unity deleted file mode 100644 index bcec131..0000000 --- a/Assets/Stress.unity +++ /dev/null @@ -1,14422 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.12731749, g: 0.13414757, b: 0.1210787, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_TemporalCoherenceThreshold: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &616587 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 616588} - - component: {fileID: 616590} - - component: {fileID: 616589} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &616588 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 616587} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 176868029} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &616589 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 616587} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &616590 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 616587} - m_CullTransparentMesh: 0 ---- !u!1 &1135373 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1135374} - - component: {fileID: 1135377} - - component: {fileID: 1135376} - - component: {fileID: 1135375} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1135374 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1135373} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 2069094806} - - {fileID: 1140785915} - m_Father: {fileID: 1267894184} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1135375 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1135373} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1135376 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1135373} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1135377 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1135373} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1267894183} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &43967865 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 43967866} - - component: {fileID: 43967869} - - component: {fileID: 43967868} - - component: {fileID: 43967867} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &43967866 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 43967865} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2017739489} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &43967867 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 43967865} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (8) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 43967868} - _targetMaterialProperty: _MainTex ---- !u!23 &43967868 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 43967865} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &43967869 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 43967865} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &68656102 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 68656105} - - component: {fileID: 68656104} - - component: {fileID: 68656103} - m_Layer: 0 - m_Name: Sender (28) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &68656103 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 68656102} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &68656104 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 68656102} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &68656105 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 68656102} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 2133003127} - m_Father: {fileID: 0} - m_RootOrder: 29 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &69388503 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 69388504} - - component: {fileID: 69388506} - - component: {fileID: 69388505} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &69388504 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 69388503} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1483163654} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &69388505 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 69388503} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 9 ---- !u!222 &69388506 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 69388503} - m_CullTransparentMesh: 0 ---- !u!1 &98806806 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 98806807} - - component: {fileID: 98806810} - - component: {fileID: 98806809} - - component: {fileID: 98806808} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &98806807 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 98806806} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2117672150} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &98806808 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 98806806} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (21) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 98806809} - _targetMaterialProperty: _MainTex ---- !u!23 &98806809 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 98806806} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &98806810 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 98806806} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &161803713 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 161803716} - - component: {fileID: 161803715} - - component: {fileID: 161803714} - m_Layer: 0 - m_Name: Sender (32) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &161803714 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 161803713} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &161803715 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 161803713} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &161803716 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 161803713} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1909666276} - m_Father: {fileID: 0} - m_RootOrder: 33 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &174227702 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 174227703} - - component: {fileID: 174227705} - - component: {fileID: 174227704} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &174227703 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 174227702} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1909666276} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &174227704 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 174227702} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &174227705 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 174227702} - m_CullTransparentMesh: 0 ---- !u!1 &176868028 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 176868029} - - component: {fileID: 176868032} - - component: {fileID: 176868031} - - component: {fileID: 176868030} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &176868029 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 176868028} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 616588} - - {fileID: 1681023698} - m_Father: {fileID: 1608598280} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &176868030 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 176868028} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &176868031 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 176868028} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &176868032 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 176868028} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1608598279} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &183024138 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 183024139} - - component: {fileID: 183024141} - - component: {fileID: 183024140} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &183024139 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 183024138} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 227422790} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &183024140 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 183024138} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 20 ---- !u!222 &183024141 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 183024138} - m_CullTransparentMesh: 0 ---- !u!1 &191595033 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 191595034} - - component: {fileID: 191595036} - - component: {fileID: 191595035} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &191595034 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 191595033} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2133003127} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &191595035 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 191595033} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 28 ---- !u!222 &191595036 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 191595033} - m_CullTransparentMesh: 0 ---- !u!1 &198443874 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 198443875} - - component: {fileID: 198443877} - - component: {fileID: 198443876} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &198443875 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 198443874} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 226326260} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &198443876 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 198443874} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &198443877 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 198443874} - m_CullTransparentMesh: 0 ---- !u!1 &201073784 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 201073785} - - component: {fileID: 201073788} - - component: {fileID: 201073787} - - component: {fileID: 201073786} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &201073785 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 201073784} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 774313641} - - {fileID: 312977924} - m_Father: {fileID: 2025965318} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &201073786 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 201073784} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &201073787 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 201073784} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &201073788 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 201073784} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 2025965317} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &206515028 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 206515029} - - component: {fileID: 206515031} - - component: {fileID: 206515030} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &206515029 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 206515028} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1229636421} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &206515030 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 206515028} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 1 ---- !u!222 &206515031 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 206515028} - m_CullTransparentMesh: 0 ---- !u!1 &219307555 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 219307556} - m_Layer: 0 - m_Name: Receiver (26) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &219307556 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 219307555} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: -0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1287445405} - m_Father: {fileID: 0} - m_RootOrder: 60 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &226326259 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 226326260} - - component: {fileID: 226326263} - - component: {fileID: 226326262} - - component: {fileID: 226326261} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &226326260 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 226326259} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 198443875} - - {fileID: 303013592} - m_Father: {fileID: 2049445689} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &226326261 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 226326259} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &226326262 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 226326259} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &226326263 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 226326259} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 2049445688} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &227422789 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 227422790} - - component: {fileID: 227422793} - - component: {fileID: 227422792} - - component: {fileID: 227422791} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &227422790 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 227422789} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1165596544} - - {fileID: 183024139} - m_Father: {fileID: 2054852577} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &227422791 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 227422789} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &227422792 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 227422789} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &227422793 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 227422789} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 2054852576} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &230754250 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 230754251} - - component: {fileID: 230754254} - - component: {fileID: 230754253} - - component: {fileID: 230754252} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &230754251 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230754250} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 416267528} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &230754252 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230754250} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (22) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 230754253} - _targetMaterialProperty: _MainTex ---- !u!23 &230754253 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230754250} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &230754254 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230754250} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &230986894 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 230986895} - - component: {fileID: 230986898} - - component: {fileID: 230986897} - - component: {fileID: 230986896} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &230986895 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230986894} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 556173746} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &230986896 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230986894} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (11) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 230986897} - _targetMaterialProperty: _MainTex ---- !u!23 &230986897 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230986894} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &230986898 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 230986894} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &233994903 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 233994904} - m_Layer: 0 - m_Name: Receiver (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &233994904 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 233994903} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: 0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1060728403} - m_Father: {fileID: 0} - m_RootOrder: 35 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &263564117 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 263564120} - - component: {fileID: 263564119} - - component: {fileID: 263564118} - m_Layer: 0 - m_Name: Sender (8) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &263564118 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 263564117} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &263564119 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 263564117} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &263564120 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 263564117} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 967799921} - m_Father: {fileID: 0} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &276778598 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 276778599} - - component: {fileID: 276778601} - - component: {fileID: 276778600} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &276778599 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 276778598} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 619717086} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &276778600 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 276778598} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 27 ---- !u!222 &276778601 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 276778598} - m_CullTransparentMesh: 0 ---- !u!1 &279473505 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 279473506} - - component: {fileID: 279473508} - - component: {fileID: 279473507} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &279473506 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 279473505} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2133003127} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &279473507 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 279473505} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &279473508 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 279473505} - m_CullTransparentMesh: 0 ---- !u!1 &300143127 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 300143128} - - component: {fileID: 300143130} - - component: {fileID: 300143129} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &300143128 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 300143127} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1801490563} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &300143129 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 300143127} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 29 ---- !u!222 &300143130 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 300143127} - m_CullTransparentMesh: 0 ---- !u!1 &301101839 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 301101840} - - component: {fileID: 301101842} - - component: {fileID: 301101841} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &301101840 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 301101839} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1404864950} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &301101841 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 301101839} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &301101842 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 301101839} - m_CullTransparentMesh: 0 ---- !u!1 &303013591 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 303013592} - - component: {fileID: 303013594} - - component: {fileID: 303013593} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &303013592 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 303013591} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 226326260} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &303013593 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 303013591} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 15 ---- !u!222 &303013594 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 303013591} - m_CullTransparentMesh: 0 ---- !u!1 &312977923 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 312977924} - - component: {fileID: 312977926} - - component: {fileID: 312977925} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &312977924 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 312977923} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 201073785} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &312977925 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 312977923} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 26 ---- !u!222 &312977926 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 312977923} - m_CullTransparentMesh: 0 ---- !u!1 &314215102 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314215103} - - component: {fileID: 314215105} - - component: {fileID: 314215104} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &314215103 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 314215102} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1483163654} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &314215104 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 314215102} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &314215105 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 314215102} - m_CullTransparentMesh: 0 ---- !u!1 &344049910 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 344049911} - - component: {fileID: 344049914} - - component: {fileID: 344049913} - - component: {fileID: 344049912} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &344049911 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 344049910} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1275330638} - - {fileID: 1749680506} - m_Father: {fileID: 404726064} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &344049912 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 344049910} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &344049913 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 344049910} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &344049914 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 344049910} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 404726063} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &348761542 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 348761543} - - component: {fileID: 348761546} - - component: {fileID: 348761545} - - component: {fileID: 348761544} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &348761543 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 348761542} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1927649160} - - {fileID: 1501642951} - m_Father: {fileID: 924228056} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &348761544 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 348761542} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &348761545 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 348761542} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &348761546 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 348761542} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 924228055} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &359381655 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 359381656} - - component: {fileID: 359381659} - - component: {fileID: 359381658} - - component: {fileID: 359381657} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &359381656 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 359381655} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 709665371} - - {fileID: 1457836244} - m_Father: {fileID: 1391960368} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &359381657 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 359381655} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &359381658 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 359381655} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &359381659 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 359381655} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1391960367} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &369381500 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 369381501} - - component: {fileID: 369381504} - - component: {fileID: 369381503} - - component: {fileID: 369381502} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &369381501 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 369381500} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1628563641} - - {fileID: 1441517512} - m_Father: {fileID: 731558245} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &369381502 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 369381500} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &369381503 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 369381500} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &369381504 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 369381500} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 731558244} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &370915449 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 370915450} - - component: {fileID: 370915452} - - component: {fileID: 370915451} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &370915450 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 370915449} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1229636421} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &370915451 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 370915449} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &370915452 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 370915449} - m_CullTransparentMesh: 0 ---- !u!1 &377525630 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 377525633} - - component: {fileID: 377525632} - - component: {fileID: 377525631} - m_Layer: 0 - m_Name: Shutter - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &377525631 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 377525630} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 09e531f25570e604d8fb78aee77125a9, type: 3} - m_Name: - m_EditorClassIdentifier: - _mode: 4 - _color: {r: 0.5, g: 0.5, b: 0.5, a: 1} - _scale: 4 - _shader: {fileID: 4800000, guid: bc6a0edaa182a35449d12a1445ba38db, type: 3} ---- !u!20 &377525632 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 377525630} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.5 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 0 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &377525633 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 377525630} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &395462331 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 395462334} - - component: {fileID: 395462333} - - component: {fileID: 395462332} - m_Layer: 0 - m_Name: Sender (13) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &395462332 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 395462331} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &395462333 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 395462331} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &395462334 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 395462331} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1128232029} - m_Father: {fileID: 0} - m_RootOrder: 14 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &395548011 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 395548012} - - component: {fileID: 395548015} - - component: {fileID: 395548014} - - component: {fileID: 395548013} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &395548012 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 395548011} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1364511949} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &395548013 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 395548011} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (15) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 395548014} - _targetMaterialProperty: _MainTex ---- !u!23 &395548014 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 395548011} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &395548015 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 395548011} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &398316878 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 398316879} - - component: {fileID: 398316881} - - component: {fileID: 398316880} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &398316879 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 398316878} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1909666276} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &398316880 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 398316878} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 32 ---- !u!222 &398316881 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 398316878} - m_CullTransparentMesh: 0 ---- !u!1 &399885488 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 399885489} - - component: {fileID: 399885492} - - component: {fileID: 399885491} - - component: {fileID: 399885490} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &399885489 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 399885488} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1937117184} - - {fileID: 1555882374} - m_Father: {fileID: 935417895} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &399885490 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 399885488} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &399885491 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 399885488} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &399885492 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 399885488} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 935417894} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &404726061 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 404726064} - - component: {fileID: 404726063} - - component: {fileID: 404726062} - m_Layer: 0 - m_Name: Sender (18) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &404726062 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 404726061} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &404726063 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 404726061} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &404726064 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 404726061} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 344049911} - m_Father: {fileID: 0} - m_RootOrder: 19 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &416267527 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 416267528} - m_Layer: 0 - m_Name: Receiver (22) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &416267528 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 416267527} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: -0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 230754251} - m_Father: {fileID: 0} - m_RootOrder: 56 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &434645624 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 434645625} - - component: {fileID: 434645628} - - component: {fileID: 434645627} - - component: {fileID: 434645626} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &434645625 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 434645624} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2048554652} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &434645626 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 434645624} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (12) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 434645627} - _targetMaterialProperty: _MainTex ---- !u!23 &434645627 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 434645624} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &434645628 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 434645624} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &435696823 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 435696824} - - component: {fileID: 435696827} - - component: {fileID: 435696826} - - component: {fileID: 435696825} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &435696824 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 435696823} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1696083532} - - {fileID: 1825808066} - m_Father: {fileID: 597973080} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &435696825 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 435696823} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &435696826 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 435696823} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &435696827 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 435696823} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 597973079} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &443162539 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 443162540} - - component: {fileID: 443162543} - - component: {fileID: 443162542} - - component: {fileID: 443162541} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &443162540 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 443162539} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1277904034} - - {fileID: 965817847} - m_Father: {fileID: 535179721} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &443162541 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 443162539} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &443162542 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 443162539} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &443162543 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 443162539} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 535179720} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &443746567 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 443746568} - - component: {fileID: 443746570} - - component: {fileID: 443746569} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &443746568 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 443746567} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1771136766} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &443746569 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 443746567} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &443746570 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 443746567} - m_CullTransparentMesh: 0 ---- !u!1 &448875871 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 448875872} - - component: {fileID: 448875874} - - component: {fileID: 448875873} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &448875872 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 448875871} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1128232029} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &448875873 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 448875871} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &448875874 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 448875871} - m_CullTransparentMesh: 0 ---- !u!1 &458334709 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 458334710} - - component: {fileID: 458334712} - - component: {fileID: 458334711} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &458334710 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 458334709} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1404864950} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &458334711 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 458334709} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 7 ---- !u!222 &458334712 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 458334709} - m_CullTransparentMesh: 0 ---- !u!1 &459448083 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 459448086} - - component: {fileID: 459448085} - - component: {fileID: 459448084} - m_Layer: 0 - m_Name: Sender (7) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &459448084 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 459448083} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &459448085 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 459448083} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &459448086 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 459448083} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1404864950} - m_Father: {fileID: 0} - m_RootOrder: 8 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &463959925 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 463959926} - - component: {fileID: 463959929} - - component: {fileID: 463959928} - - component: {fileID: 463959927} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &463959926 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 463959925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 588369685} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &463959927 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 463959925} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (18) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 463959928} - _targetMaterialProperty: _MainTex ---- !u!23 &463959928 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 463959925} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &463959929 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 463959925} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &499363332 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 499363333} - - component: {fileID: 499363335} - - component: {fileID: 499363334} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &499363333 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 499363332} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 967799921} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &499363334 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 499363332} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 8 ---- !u!222 &499363335 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 499363332} - m_CullTransparentMesh: 0 ---- !u!1 &511008714 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 511008715} - m_Layer: 0 - m_Name: Receiver (7) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &511008715 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 511008714} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: 0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1744368677} - m_Father: {fileID: 0} - m_RootOrder: 41 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &531323484 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 531323485} - - component: {fileID: 531323488} - - component: {fileID: 531323487} - - component: {fileID: 531323486} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &531323485 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 531323484} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 663635814} - - {fileID: 926240618} - m_Father: {fileID: 1184711969} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &531323486 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 531323484} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &531323487 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 531323484} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &531323488 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 531323484} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1184711968} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &535179718 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 535179721} - - component: {fileID: 535179720} - - component: {fileID: 535179719} - m_Layer: 0 - m_Name: Sender (10) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &535179719 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 535179718} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &535179720 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 535179718} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &535179721 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 535179718} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 443162540} - m_Father: {fileID: 0} - m_RootOrder: 11 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &556173745 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 556173746} - m_Layer: 0 - m_Name: Receiver (11) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &556173746 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 556173745} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: 0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 230986895} - m_Father: {fileID: 0} - m_RootOrder: 45 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &566431505 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 566431506} - - component: {fileID: 566431509} - - component: {fileID: 566431508} - - component: {fileID: 566431507} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &566431506 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 566431505} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1198810839} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &566431507 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 566431505} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (30) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 566431508} - _targetMaterialProperty: _MainTex ---- !u!23 &566431508 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 566431505} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &566431509 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 566431505} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &588369684 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 588369685} - m_Layer: 0 - m_Name: Receiver (18) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &588369685 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 588369684} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: -0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 463959926} - m_Father: {fileID: 0} - m_RootOrder: 52 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &597973077 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 597973080} - - component: {fileID: 597973079} - - component: {fileID: 597973078} - m_Layer: 0 - m_Name: Sender (19) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &597973078 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 597973077} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &597973079 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 597973077} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &597973080 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 597973077} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 435696824} - m_Father: {fileID: 0} - m_RootOrder: 20 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &614334330 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 614334332} - - component: {fileID: 614334331} - m_Layer: 0 - m_Name: Receiver View - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!20 &614334331 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 614334330} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.5 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 0.5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &614334332 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 614334330} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -1} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 34 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &616793347 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 616793348} - m_Layer: 0 - m_Name: Receiver (10) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &616793348 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 616793347} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: 0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 2090913802} - m_Father: {fileID: 0} - m_RootOrder: 44 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &619717085 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 619717086} - - component: {fileID: 619717089} - - component: {fileID: 619717088} - - component: {fileID: 619717087} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &619717086 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 619717085} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1139800686} - - {fileID: 276778599} - m_Father: {fileID: 1196648418} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &619717087 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 619717085} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &619717088 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 619717085} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &619717089 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 619717085} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1196648417} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &635560968 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 635560969} - - component: {fileID: 635560971} - - component: {fileID: 635560970} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &635560969 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 635560968} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1060986427} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &635560970 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 635560968} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &635560971 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 635560968} - m_CullTransparentMesh: 0 ---- !u!1 &641980082 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 641980083} - m_Layer: 0 - m_Name: Receiver (13) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &641980083 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 641980082} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: 0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 770713565} - m_Father: {fileID: 0} - m_RootOrder: 47 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &644228569 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 644228570} - m_Layer: 0 - m_Name: Receiver (3) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &644228570 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 644228569} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: 0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1103097430} - m_Father: {fileID: 0} - m_RootOrder: 37 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &651803104 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 651803105} - - component: {fileID: 651803107} - - component: {fileID: 651803106} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &651803105 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 651803104} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1352043060} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &651803106 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 651803104} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 31 ---- !u!222 &651803107 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 651803104} - m_CullTransparentMesh: 0 ---- !u!1 &663635813 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 663635814} - - component: {fileID: 663635816} - - component: {fileID: 663635815} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &663635814 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 663635813} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 531323485} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &663635815 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 663635813} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &663635816 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 663635813} - m_CullTransparentMesh: 0 ---- !u!1 &687180876 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 687180877} - - component: {fileID: 687180879} - - component: {fileID: 687180878} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &687180877 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 687180876} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1064312082} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &687180878 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 687180876} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 22 ---- !u!222 &687180879 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 687180876} - m_CullTransparentMesh: 0 ---- !u!1 &699069618 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 699069619} - - component: {fileID: 699069621} - - component: {fileID: 699069620} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &699069619 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 699069618} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1230493361} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &699069620 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 699069618} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 3 ---- !u!222 &699069621 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 699069618} - m_CullTransparentMesh: 0 ---- !u!1 &709665370 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 709665371} - - component: {fileID: 709665373} - - component: {fileID: 709665372} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &709665371 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 709665370} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 359381656} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &709665372 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 709665370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &709665373 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 709665370} - m_CullTransparentMesh: 0 ---- !u!1 &711503382 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 711503385} - - component: {fileID: 711503384} - - component: {fileID: 711503383} - m_Layer: 0 - m_Name: Sender (29) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &711503383 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 711503382} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &711503384 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 711503382} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &711503385 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 711503382} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1801490563} - m_Father: {fileID: 0} - m_RootOrder: 30 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &711923589 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 711923590} - - component: {fileID: 711923592} - - component: {fileID: 711923591} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &711923590 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 711923589} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 716907866} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &711923591 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 711923589} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &711923592 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 711923589} - m_CullTransparentMesh: 0 ---- !u!1 &716907865 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 716907866} - - component: {fileID: 716907869} - - component: {fileID: 716907868} - - component: {fileID: 716907867} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &716907866 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 716907865} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 711923590} - - {fileID: 724622871} - m_Father: {fileID: 1795464678} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &716907867 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 716907865} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &716907868 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 716907865} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &716907869 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 716907865} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1795464677} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &724622870 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 724622871} - - component: {fileID: 724622873} - - component: {fileID: 724622872} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &724622871 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 724622870} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 716907866} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &724622872 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 724622870} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 5 ---- !u!222 &724622873 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 724622870} - m_CullTransparentMesh: 0 ---- !u!1 &731118513 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 731118514} - - component: {fileID: 731118516} - - component: {fileID: 731118515} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &731118514 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731118513} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1230493361} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &731118515 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731118513} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &731118516 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731118513} - m_CullTransparentMesh: 0 ---- !u!1 &731558242 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 731558245} - - component: {fileID: 731558244} - - component: {fileID: 731558243} - m_Layer: 0 - m_Name: Sender (2) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &731558243 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731558242} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &731558244 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731558242} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &731558245 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 731558242} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 369381501} - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &767135701 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 767135702} - - component: {fileID: 767135705} - - component: {fileID: 767135704} - - component: {fileID: 767135703} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &767135702 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 767135701} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1862269432} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &767135703 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 767135701} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (4) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 767135704} - _targetMaterialProperty: _MainTex ---- !u!23 &767135704 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 767135701} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &767135705 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 767135701} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &770713564 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 770713565} - - component: {fileID: 770713568} - - component: {fileID: 770713567} - - component: {fileID: 770713566} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &770713565 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 770713564} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 641980083} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &770713566 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 770713564} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (13) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 770713567} - _targetMaterialProperty: _MainTex ---- !u!23 &770713567 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 770713564} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &770713568 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 770713564} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &773497958 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 773497959} - - component: {fileID: 773497962} - - component: {fileID: 773497961} - - component: {fileID: 773497960} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &773497959 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 773497958} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1143969664} - - {fileID: 1386961365} - m_Father: {fileID: 2113078238} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &773497960 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 773497958} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &773497961 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 773497958} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &773497962 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 773497958} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 2113078237} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &774313640 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 774313641} - - component: {fileID: 774313643} - - component: {fileID: 774313642} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &774313641 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 774313640} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 201073785} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &774313642 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 774313640} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &774313643 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 774313640} - m_CullTransparentMesh: 0 ---- !u!1 &786499098 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 786499099} - - component: {fileID: 786499101} - - component: {fileID: 786499100} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &786499099 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 786499098} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1052575067} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &786499100 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 786499098} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 11 ---- !u!222 &786499101 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 786499098} - m_CullTransparentMesh: 0 ---- !u!1 &825781541 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 825781542} - - component: {fileID: 825781545} - - component: {fileID: 825781544} - - component: {fileID: 825781543} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &825781542 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 825781541} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1344178133} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &825781543 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 825781541} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (2) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 825781544} - _targetMaterialProperty: _MainTex ---- !u!23 &825781544 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 825781541} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &825781545 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 825781541} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &867326210 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 867326213} - - component: {fileID: 867326212} - - component: {fileID: 867326211} - m_Layer: 0 - m_Name: Sender (11) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &867326211 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 867326210} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &867326212 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 867326210} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &867326213 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 867326210} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1052575067} - m_Father: {fileID: 0} - m_RootOrder: 12 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &875328801 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 875328804} - - component: {fileID: 875328803} - - component: {fileID: 875328802} - m_Layer: 0 - m_Name: Sender (9) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &875328802 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 875328801} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &875328803 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 875328801} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &875328804 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 875328801} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1483163654} - m_Father: {fileID: 0} - m_RootOrder: 10 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &880171824 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 880171825} - - component: {fileID: 880171828} - - component: {fileID: 880171827} - - component: {fileID: 880171826} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &880171825 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 880171824} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1634669994} - - {fileID: 1266973046} - m_Father: {fileID: 1585578589} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &880171826 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 880171824} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &880171827 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 880171824} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &880171828 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 880171824} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1585578588} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &924228053 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 924228056} - - component: {fileID: 924228055} - - component: {fileID: 924228054} - m_Layer: 0 - m_Name: Sender (14) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &924228054 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 924228053} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &924228055 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 924228053} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &924228056 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 924228053} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 348761543} - m_Father: {fileID: 0} - m_RootOrder: 15 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &926240617 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 926240618} - - component: {fileID: 926240620} - - component: {fileID: 926240619} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &926240618 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 926240617} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 531323485} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &926240619 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 926240617} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 12 ---- !u!222 &926240620 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 926240617} - m_CullTransparentMesh: 0 ---- !u!1 &935417892 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 935417895} - - component: {fileID: 935417894} - - component: {fileID: 935417893} - m_Layer: 0 - m_Name: Sender (30) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &935417893 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 935417892} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &935417894 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 935417892} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &935417895 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 935417892} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 399885489} - m_Father: {fileID: 0} - m_RootOrder: 31 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &941816061 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 941816062} - - component: {fileID: 941816064} - - component: {fileID: 941816063} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &941816062 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 941816061} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1352043060} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &941816063 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 941816061} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &941816064 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 941816061} - m_CullTransparentMesh: 0 ---- !u!1 &965817846 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 965817847} - - component: {fileID: 965817849} - - component: {fileID: 965817848} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &965817847 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 965817846} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 443162540} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &965817848 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 965817846} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 10 ---- !u!222 &965817849 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 965817846} - m_CullTransparentMesh: 0 ---- !u!1 &967799920 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 967799921} - - component: {fileID: 967799924} - - component: {fileID: 967799923} - - component: {fileID: 967799922} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &967799921 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 967799920} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1533683833} - - {fileID: 499363333} - m_Father: {fileID: 263564120} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &967799922 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 967799920} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &967799923 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 967799920} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &967799924 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 967799920} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 263564119} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &974159716 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 974159717} - - component: {fileID: 974159720} - - component: {fileID: 974159719} - - component: {fileID: 974159718} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &974159717 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 974159716} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1513884058} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &974159718 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 974159716} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (29) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 974159719} - _targetMaterialProperty: _MainTex ---- !u!23 &974159719 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 974159716} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &974159720 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 974159716} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1030879609 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1030879610} - m_Layer: 0 - m_Name: Receiver (6) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1030879610 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1030879609} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: 0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1211197060} - m_Father: {fileID: 0} - m_RootOrder: 40 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1052575066 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1052575067} - - component: {fileID: 1052575070} - - component: {fileID: 1052575069} - - component: {fileID: 1052575068} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1052575067 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1052575066} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 2072103373} - - {fileID: 786499099} - m_Father: {fileID: 867326213} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1052575068 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1052575066} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1052575069 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1052575066} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1052575070 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1052575066} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 867326212} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1060728402 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1060728403} - - component: {fileID: 1060728406} - - component: {fileID: 1060728405} - - component: {fileID: 1060728404} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1060728403 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060728402} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 233994904} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1060728404 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060728402} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (1) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1060728405} - _targetMaterialProperty: _MainTex ---- !u!23 &1060728405 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060728402} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1060728406 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060728402} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1060986426 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1060986427} - - component: {fileID: 1060986430} - - component: {fileID: 1060986429} - - component: {fileID: 1060986428} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1060986427 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060986426} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 635560969} - - {fileID: 1225495309} - m_Father: {fileID: 1911690629} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1060986428 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060986426} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1060986429 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060986426} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1060986430 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1060986426} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1911690628} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1064312081 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1064312082} - - component: {fileID: 1064312085} - - component: {fileID: 1064312084} - - component: {fileID: 1064312083} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1064312082 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1064312081} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1668543722} - - {fileID: 687180877} - m_Father: {fileID: 1604733318} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1064312083 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1064312081} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1064312084 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1064312081} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1064312085 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1064312081} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1604733317} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1083649132 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1083649133} - - component: {fileID: 1083649136} - - component: {fileID: 1083649135} - - component: {fileID: 1083649134} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1083649133 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083649132} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1767810350} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1083649134 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083649132} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (9) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1083649135} - _targetMaterialProperty: _MainTex ---- !u!23 &1083649135 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083649132} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1083649136 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083649132} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1103097429 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1103097430} - - component: {fileID: 1103097433} - - component: {fileID: 1103097432} - - component: {fileID: 1103097431} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1103097430 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1103097429} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 644228570} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1103097431 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1103097429} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (3) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1103097432} - _targetMaterialProperty: _MainTex ---- !u!23 &1103097432 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1103097429} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1103097433 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1103097429} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1128232028 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1128232029} - - component: {fileID: 1128232032} - - component: {fileID: 1128232031} - - component: {fileID: 1128232030} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1128232029 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1128232028} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 448875872} - - {fileID: 1145480192} - m_Father: {fileID: 395462334} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1128232030 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1128232028} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1128232031 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1128232028} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1128232032 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1128232028} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 395462333} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1139800685 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1139800686} - - component: {fileID: 1139800688} - - component: {fileID: 1139800687} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1139800686 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1139800685} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 619717086} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1139800687 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1139800685} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1139800688 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1139800685} - m_CullTransparentMesh: 0 ---- !u!1 &1140785914 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1140785915} - - component: {fileID: 1140785917} - - component: {fileID: 1140785916} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1140785915 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1140785914} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1135374} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1140785916 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1140785914} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 24 ---- !u!222 &1140785917 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1140785914} - m_CullTransparentMesh: 0 ---- !u!1 &1143969663 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1143969664} - - component: {fileID: 1143969666} - - component: {fileID: 1143969665} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1143969664 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1143969663} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 773497959} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1143969665 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1143969663} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1143969666 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1143969663} - m_CullTransparentMesh: 0 ---- !u!1 &1145480191 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1145480192} - - component: {fileID: 1145480194} - - component: {fileID: 1145480193} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1145480192 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1145480191} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1128232029} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1145480193 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1145480191} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 13 ---- !u!222 &1145480194 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1145480191} - m_CullTransparentMesh: 0 ---- !u!1 &1165596543 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1165596544} - - component: {fileID: 1165596546} - - component: {fileID: 1165596545} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1165596544 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1165596543} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 227422790} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1165596545 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1165596543} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1165596546 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1165596543} - m_CullTransparentMesh: 0 ---- !u!1 &1184711966 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1184711969} - - component: {fileID: 1184711968} - - component: {fileID: 1184711967} - m_Layer: 0 - m_Name: Sender (12) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1184711967 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1184711966} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1184711968 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1184711966} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1184711969 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1184711966} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 531323485} - m_Father: {fileID: 0} - m_RootOrder: 13 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1196648415 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1196648418} - - component: {fileID: 1196648417} - - component: {fileID: 1196648416} - m_Layer: 0 - m_Name: Sender (27) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1196648416 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1196648415} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1196648417 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1196648415} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1196648418 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1196648415} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 619717086} - m_Father: {fileID: 0} - m_RootOrder: 28 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1198810838 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1198810839} - m_Layer: 0 - m_Name: Receiver (30) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1198810839 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1198810838} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: -0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 566431506} - m_Father: {fileID: 0} - m_RootOrder: 64 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1199768281 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1199768284} - - component: {fileID: 1199768283} - - component: {fileID: 1199768282} - m_Layer: 0 - m_Name: Sender (1) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1199768282 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1199768281} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1199768283 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1199768281} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1199768284 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1199768281} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1229636421} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1211197059 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1211197060} - - component: {fileID: 1211197063} - - component: {fileID: 1211197062} - - component: {fileID: 1211197061} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1211197060 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1211197059} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1030879610} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1211197061 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1211197059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (6) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1211197062} - _targetMaterialProperty: _MainTex ---- !u!23 &1211197062 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1211197059} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1211197063 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1211197059} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1215491251 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1215491252} - - component: {fileID: 1215491254} - - component: {fileID: 1215491253} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1215491252 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1215491251} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1771136766} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1215491253 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1215491251} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 4 ---- !u!222 &1215491254 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1215491251} - m_CullTransparentMesh: 0 ---- !u!1 &1216948967 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1216948968} - - component: {fileID: 1216948970} - - component: {fileID: 1216948969} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1216948968 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1216948967} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2144330595} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1216948969 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1216948967} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1216948970 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1216948967} - m_CullTransparentMesh: 0 ---- !u!1 &1225495308 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1225495309} - - component: {fileID: 1225495311} - - component: {fileID: 1225495310} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1225495309 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1225495308} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1060986427} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1225495310 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1225495308} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 17 ---- !u!222 &1225495311 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1225495308} - m_CullTransparentMesh: 0 ---- !u!1 &1229636420 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1229636421} - - component: {fileID: 1229636424} - - component: {fileID: 1229636423} - - component: {fileID: 1229636422} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1229636421 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1229636420} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 370915450} - - {fileID: 206515029} - m_Father: {fileID: 1199768284} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1229636422 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1229636420} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1229636423 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1229636420} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1229636424 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1229636420} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1199768283} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1230493360 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1230493361} - - component: {fileID: 1230493364} - - component: {fileID: 1230493363} - - component: {fileID: 1230493362} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1230493361 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1230493360} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 731118514} - - {fileID: 699069619} - m_Father: {fileID: 1986169276} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1230493362 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1230493360} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1230493363 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1230493360} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1230493364 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1230493360} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1986169275} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1234561161 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1234561162} - - component: {fileID: 1234561165} - - component: {fileID: 1234561164} - - component: {fileID: 1234561163} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1234561162 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1234561161} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1506780143} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1234561163 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1234561161} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (32) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1234561164} - _targetMaterialProperty: _MainTex ---- !u!23 &1234561164 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1234561161} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1234561165 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1234561161} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1247888047 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1247888048} - - component: {fileID: 1247888050} - - component: {fileID: 1247888049} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1247888048 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1247888047} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2144330595} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1247888049 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1247888047} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 6 ---- !u!222 &1247888050 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1247888047} - m_CullTransparentMesh: 0 ---- !u!1 &1266973045 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1266973046} - - component: {fileID: 1266973048} - - component: {fileID: 1266973047} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1266973046 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1266973045} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 880171825} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1266973047 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1266973045} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 16 ---- !u!222 &1266973048 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1266973045} - m_CullTransparentMesh: 0 ---- !u!1 &1267894181 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1267894184} - - component: {fileID: 1267894183} - - component: {fileID: 1267894182} - m_Layer: 0 - m_Name: Sender (24) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1267894182 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1267894181} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1267894183 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1267894181} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1267894184 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1267894181} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1135374} - m_Father: {fileID: 0} - m_RootOrder: 25 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1269385223 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1269385224} - - component: {fileID: 1269385227} - - component: {fileID: 1269385226} - - component: {fileID: 1269385225} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1269385224 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1269385223} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1395838316} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1269385225 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1269385223} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (19) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1269385226} - _targetMaterialProperty: _MainTex ---- !u!23 &1269385226 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1269385223} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1269385227 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1269385223} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1275330637 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1275330638} - - component: {fileID: 1275330640} - - component: {fileID: 1275330639} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1275330638 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1275330637} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 344049911} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1275330639 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1275330637} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1275330640 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1275330637} - m_CullTransparentMesh: 0 ---- !u!1 &1277904033 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1277904034} - - component: {fileID: 1277904036} - - component: {fileID: 1277904035} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1277904034 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1277904033} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 443162540} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1277904035 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1277904033} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1277904036 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1277904033} - m_CullTransparentMesh: 0 ---- !u!1 &1287445404 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1287445405} - - component: {fileID: 1287445408} - - component: {fileID: 1287445407} - - component: {fileID: 1287445406} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1287445405 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1287445404} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 219307556} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1287445406 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1287445404} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (26) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1287445407} - _targetMaterialProperty: _MainTex ---- !u!23 &1287445407 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1287445404} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1287445408 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1287445404} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1344178132 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1344178133} - m_Layer: 0 - m_Name: Receiver (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1344178133 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1344178132} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: 0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 825781542} - m_Father: {fileID: 0} - m_RootOrder: 36 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1352043059 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1352043060} - - component: {fileID: 1352043063} - - component: {fileID: 1352043062} - - component: {fileID: 1352043061} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1352043060 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1352043059} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 941816062} - - {fileID: 651803105} - m_Father: {fileID: 1605832960} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1352043061 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1352043059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1352043062 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1352043059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1352043063 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1352043059} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1605832959} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1364511948 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1364511949} - m_Layer: 0 - m_Name: Receiver (15) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1364511949 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1364511948} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: 0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 395548012} - m_Father: {fileID: 0} - m_RootOrder: 49 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1367757538 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1367757539} - - component: {fileID: 1367757542} - - component: {fileID: 1367757541} - - component: {fileID: 1367757540} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1367757539 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1367757538} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1559329153} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1367757540 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1367757538} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (14) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1367757541} - _targetMaterialProperty: _MainTex ---- !u!23 &1367757541 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1367757538} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1367757542 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1367757538} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1386819107 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1386819108} - - component: {fileID: 1386819110} - - component: {fileID: 1386819109} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1386819108 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386819107} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1801490563} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1386819109 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386819107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1386819110 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386819107} - m_CullTransparentMesh: 0 ---- !u!1 &1386961364 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1386961365} - - component: {fileID: 1386961367} - - component: {fileID: 1386961366} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1386961365 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386961364} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 773497959} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1386961366 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386961364} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 25 ---- !u!222 &1386961367 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386961364} - m_CullTransparentMesh: 0 ---- !u!1 &1386998310 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1386998311} - - component: {fileID: 1386998314} - - component: {fileID: 1386998313} - - component: {fileID: 1386998312} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1386998311 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386998310} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1922512863} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1386998312 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386998310} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (16) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1386998313} - _targetMaterialProperty: _MainTex ---- !u!23 &1386998313 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386998310} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1386998314 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1386998310} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1391960365 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1391960368} - - component: {fileID: 1391960367} - - component: {fileID: 1391960366} - m_Layer: 0 - m_Name: Sender (21) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1391960366 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1391960365} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1391960367 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1391960365} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1391960368 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1391960365} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 359381656} - m_Father: {fileID: 0} - m_RootOrder: 22 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1395838315 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1395838316} - m_Layer: 0 - m_Name: Receiver (19) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1395838316 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1395838315} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: -0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1269385224} - m_Father: {fileID: 0} - m_RootOrder: 53 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1404864949 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1404864950} - - component: {fileID: 1404864953} - - component: {fileID: 1404864952} - - component: {fileID: 1404864951} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1404864950 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1404864949} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 301101840} - - {fileID: 458334710} - m_Father: {fileID: 459448086} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1404864951 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1404864949} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1404864952 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1404864949} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1404864953 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1404864949} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 459448085} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1434980982 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1434980983} - - component: {fileID: 1434980986} - - component: {fileID: 1434980985} - - component: {fileID: 1434980984} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1434980983 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1434980982} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2135053882} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1434980984 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1434980982} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (24) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1434980985} - _targetMaterialProperty: _MainTex ---- !u!23 &1434980985 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1434980982} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1434980986 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1434980982} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1441517511 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1441517512} - - component: {fileID: 1441517514} - - component: {fileID: 1441517513} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1441517512 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1441517511} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 369381501} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1441517513 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1441517511} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 2 ---- !u!222 &1441517514 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1441517511} - m_CullTransparentMesh: 0 ---- !u!1 &1457836243 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1457836244} - - component: {fileID: 1457836246} - - component: {fileID: 1457836245} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1457836244 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1457836243} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 359381656} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1457836245 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1457836243} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 21 ---- !u!222 &1457836246 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1457836243} - m_CullTransparentMesh: 0 ---- !u!1 &1483163653 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1483163654} - - component: {fileID: 1483163657} - - component: {fileID: 1483163656} - - component: {fileID: 1483163655} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1483163654 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1483163653} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 314215103} - - {fileID: 69388504} - m_Father: {fileID: 875328804} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1483163655 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1483163653} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1483163656 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1483163653} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1483163657 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1483163653} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 875328803} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1501642950 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1501642951} - - component: {fileID: 1501642953} - - component: {fileID: 1501642952} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1501642951 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1501642950} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 348761543} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1501642952 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1501642950} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 14 ---- !u!222 &1501642953 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1501642950} - m_CullTransparentMesh: 0 ---- !u!1 &1506780142 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1506780143} - m_Layer: 0 - m_Name: Receiver (32) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1506780143 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1506780142} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: -0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1234561162} - m_Father: {fileID: 0} - m_RootOrder: 66 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1513884057 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1513884058} - m_Layer: 0 - m_Name: Receiver (29) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1513884058 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1513884057} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: -0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 974159717} - m_Father: {fileID: 0} - m_RootOrder: 63 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1533683832 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1533683833} - - component: {fileID: 1533683835} - - component: {fileID: 1533683834} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1533683833 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1533683832} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 967799921} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1533683834 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1533683832} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1533683835 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1533683832} - m_CullTransparentMesh: 0 ---- !u!1 &1546198742 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1546198745} - - component: {fileID: 1546198744} - - component: {fileID: 1546198743} - m_Layer: 0 - m_Name: Sender (6) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1546198743 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1546198742} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1546198744 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1546198742} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1546198745 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1546198742} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 2144330595} - m_Father: {fileID: 0} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1555882373 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1555882374} - - component: {fileID: 1555882376} - - component: {fileID: 1555882375} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1555882374 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1555882373} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 399885489} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1555882375 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1555882373} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 30 ---- !u!222 &1555882376 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1555882373} - m_CullTransparentMesh: 0 ---- !u!1 &1559329152 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1559329153} - m_Layer: 0 - m_Name: Receiver (14) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1559329153 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1559329152} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: 0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1367757539} - m_Father: {fileID: 0} - m_RootOrder: 48 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1559718177 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1559718178} - - component: {fileID: 1559718181} - - component: {fileID: 1559718180} - - component: {fileID: 1559718179} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1559718178 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1559718177} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2089745217} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1559718179 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1559718177} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (5) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1559718180} - _targetMaterialProperty: _MainTex ---- !u!23 &1559718180 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1559718177} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1559718181 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1559718177} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1576957640 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1576957641} - m_Layer: 0 - m_Name: Receiver (27) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1576957641 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1576957640} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: -0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1689045325} - m_Father: {fileID: 0} - m_RootOrder: 61 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1580657702 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1580657703} - m_Layer: 0 - m_Name: Receiver (28) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1580657703 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1580657702} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: -0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1731517303} - m_Father: {fileID: 0} - m_RootOrder: 62 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1585578586 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1585578589} - - component: {fileID: 1585578588} - - component: {fileID: 1585578587} - m_Layer: 0 - m_Name: Sender (16) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1585578587 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1585578586} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1585578588 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1585578586} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1585578589 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1585578586} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 880171825} - m_Father: {fileID: 0} - m_RootOrder: 17 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1589360895 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1589360896} - m_Layer: 0 - m_Name: Receiver (17) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1589360896 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1589360895} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: -0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1607674464} - m_Father: {fileID: 0} - m_RootOrder: 51 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1604733315 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1604733318} - - component: {fileID: 1604733317} - - component: {fileID: 1604733316} - m_Layer: 0 - m_Name: Sender (22) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1604733316 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1604733315} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1604733317 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1604733315} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1604733318 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1604733315} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1064312082} - m_Father: {fileID: 0} - m_RootOrder: 23 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1605832957 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1605832960} - - component: {fileID: 1605832959} - - component: {fileID: 1605832958} - m_Layer: 0 - m_Name: Sender (31) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1605832958 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1605832957} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1605832959 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1605832957} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1605832960 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1605832957} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1352043060} - m_Father: {fileID: 0} - m_RootOrder: 32 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1607674463 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1607674464} - - component: {fileID: 1607674467} - - component: {fileID: 1607674466} - - component: {fileID: 1607674465} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1607674464 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1607674463} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1589360896} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1607674465 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1607674463} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (17) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1607674466} - _targetMaterialProperty: _MainTex ---- !u!23 &1607674466 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1607674463} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1607674467 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1607674463} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1608598277 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1608598280} - - component: {fileID: 1608598279} - - component: {fileID: 1608598278} - m_Layer: 0 - m_Name: Sender (23) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1608598278 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1608598277} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1608598279 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1608598277} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1608598280 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1608598277} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 176868029} - m_Father: {fileID: 0} - m_RootOrder: 24 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1614741339 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1614741340} - - component: {fileID: 1614741343} - - component: {fileID: 1614741342} - - component: {fileID: 1614741341} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1614741340 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1614741339} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1650109686} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1614741341 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1614741339} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (25) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1614741342} - _targetMaterialProperty: _MainTex ---- !u!23 &1614741342 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1614741339} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1614741343 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1614741339} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1621167656 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1621167657} - m_Layer: 0 - m_Name: Receiver (20) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1621167657 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1621167656} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: -0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1700506274} - m_Father: {fileID: 0} - m_RootOrder: 54 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1628563640 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1628563641} - - component: {fileID: 1628563643} - - component: {fileID: 1628563642} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1628563641 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1628563640} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 369381501} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1628563642 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1628563640} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1628563643 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1628563640} - m_CullTransparentMesh: 0 ---- !u!1 &1634669993 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1634669994} - - component: {fileID: 1634669996} - - component: {fileID: 1634669995} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1634669994 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1634669993} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 880171825} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1634669995 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1634669993} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1634669996 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1634669993} - m_CullTransparentMesh: 0 ---- !u!1 &1650109685 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1650109686} - m_Layer: 0 - m_Name: Receiver (25) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1650109686 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1650109685} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: -0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1614741340} - m_Father: {fileID: 0} - m_RootOrder: 59 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1652695350 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1652695351} - m_Layer: 0 - m_Name: Receiver (23) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1652695351 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1652695350} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: -0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1976684059} - m_Father: {fileID: 0} - m_RootOrder: 57 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1660971403 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1660971404} - - component: {fileID: 1660971407} - - component: {fileID: 1660971406} - - component: {fileID: 1660971405} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1660971404 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1660971403} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1915823783} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1660971405 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1660971403} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (31) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1660971406} - _targetMaterialProperty: _MainTex ---- !u!23 &1660971406 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1660971403} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1660971407 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1660971403} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1668543721 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1668543722} - - component: {fileID: 1668543724} - - component: {fileID: 1668543723} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1668543722 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1668543721} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1064312082} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1668543723 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1668543721} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1668543724 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1668543721} - m_CullTransparentMesh: 0 ---- !u!1 &1681023697 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1681023698} - - component: {fileID: 1681023700} - - component: {fileID: 1681023699} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1681023698 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1681023697} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 176868029} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1681023699 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1681023697} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 23 ---- !u!222 &1681023700 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1681023697} - m_CullTransparentMesh: 0 ---- !u!1 &1689045324 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1689045325} - - component: {fileID: 1689045328} - - component: {fileID: 1689045327} - - component: {fileID: 1689045326} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1689045325 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1689045324} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1576957641} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1689045326 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1689045324} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (27) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1689045327} - _targetMaterialProperty: _MainTex ---- !u!23 &1689045327 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1689045324} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1689045328 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1689045324} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1696083531 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1696083532} - - component: {fileID: 1696083534} - - component: {fileID: 1696083533} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1696083532 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1696083531} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 435696824} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1696083533 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1696083531} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1696083534 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1696083531} - m_CullTransparentMesh: 0 ---- !u!1 &1696554600 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1696554603} - - component: {fileID: 1696554602} - - component: {fileID: 1696554601} - m_Layer: 0 - m_Name: Sender (4) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1696554601 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1696554600} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1696554602 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1696554600} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1696554603 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1696554600} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1771136766} - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1700506273 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1700506274} - - component: {fileID: 1700506277} - - component: {fileID: 1700506276} - - component: {fileID: 1700506275} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1700506274 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1700506273} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1621167657} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1700506275 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1700506273} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (20) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1700506276} - _targetMaterialProperty: _MainTex ---- !u!23 &1700506276 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1700506273} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1700506277 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1700506273} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1731517302 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1731517303} - - component: {fileID: 1731517306} - - component: {fileID: 1731517305} - - component: {fileID: 1731517304} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1731517303 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1731517302} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1580657703} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1731517304 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1731517302} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (28) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1731517305} - _targetMaterialProperty: _MainTex ---- !u!23 &1731517305 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1731517302} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1731517306 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1731517302} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1744368676 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1744368677} - - component: {fileID: 1744368680} - - component: {fileID: 1744368679} - - component: {fileID: 1744368678} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1744368677 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1744368676} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 511008715} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1744368678 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1744368676} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (7) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1744368679} - _targetMaterialProperty: _MainTex ---- !u!23 &1744368679 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1744368676} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1744368680 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1744368676} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1749680505 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1749680506} - - component: {fileID: 1749680508} - - component: {fileID: 1749680507} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1749680506 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1749680505} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 344049911} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1749680507 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1749680505} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 18 ---- !u!222 &1749680508 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1749680505} - m_CullTransparentMesh: 0 ---- !u!1 &1767810349 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1767810350} - m_Layer: 0 - m_Name: Receiver (9) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1767810350 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1767810349} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: 0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1083649133} - m_Father: {fileID: 0} - m_RootOrder: 43 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1771136765 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1771136766} - - component: {fileID: 1771136769} - - component: {fileID: 1771136768} - - component: {fileID: 1771136767} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1771136766 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1771136765} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 443746568} - - {fileID: 1215491252} - m_Father: {fileID: 1696554603} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1771136767 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1771136765} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1771136768 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1771136765} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1771136769 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1771136765} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1696554602} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1786637750 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1786637751} - - component: {fileID: 1786637752} - m_Layer: 0 - m_Name: Randomizer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1786637751 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1786637750} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1786637752 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1786637750} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6518127bfe3cc36408250c95735192be, type: 3} - m_Name: - m_EditorClassIdentifier: - _objects: - - {fileID: 1199768281} - - {fileID: 731558242} - - {fileID: 1986169273} - - {fileID: 1696554600} - - {fileID: 1795464675} - - {fileID: 1546198742} - - {fileID: 459448083} - - {fileID: 263564117} - - {fileID: 875328801} - - {fileID: 535179718} - - {fileID: 867326210} - - {fileID: 1184711966} - - {fileID: 395462331} - - {fileID: 924228053} - - {fileID: 2049445686} - - {fileID: 1585578586} - - {fileID: 1911690626} - - {fileID: 404726061} - - {fileID: 597973077} - - {fileID: 2054852574} - - {fileID: 1391960365} - - {fileID: 1604733315} - - {fileID: 1608598277} - - {fileID: 1267894181} - - {fileID: 2113078235} - - {fileID: 2025965315} - - {fileID: 1196648415} - - {fileID: 68656102} - - {fileID: 711503382} - - {fileID: 935417892} - - {fileID: 1605832957} - - {fileID: 161803713} - - {fileID: 233994903} - - {fileID: 1344178132} - - {fileID: 644228569} - - {fileID: 1862269431} - - {fileID: 2089745216} - - {fileID: 1030879609} - - {fileID: 511008714} - - {fileID: 2017739488} - - {fileID: 1767810349} - - {fileID: 616793347} - - {fileID: 556173745} - - {fileID: 2048554651} - - {fileID: 641980082} - - {fileID: 1559329152} - - {fileID: 1364511948} - - {fileID: 1922512862} - - {fileID: 1589360895} - - {fileID: 588369684} - - {fileID: 1395838315} - - {fileID: 1621167656} - - {fileID: 2117672149} - - {fileID: 416267527} - - {fileID: 1652695350} - - {fileID: 2135053881} - - {fileID: 1650109685} - - {fileID: 219307555} - - {fileID: 1576957640} - - {fileID: 1580657702} - - {fileID: 1513884057} - - {fileID: 1198810838} - - {fileID: 1915823782} - - {fileID: 1506780142} ---- !u!1 &1795464675 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1795464678} - - component: {fileID: 1795464677} - - component: {fileID: 1795464676} - m_Layer: 0 - m_Name: Sender (5) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1795464676 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1795464675} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1795464677 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1795464675} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1795464678 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1795464675} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 716907866} - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1801490562 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1801490563} - - component: {fileID: 1801490566} - - component: {fileID: 1801490565} - - component: {fileID: 1801490564} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1801490563 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1801490562} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1386819108} - - {fileID: 300143128} - m_Father: {fileID: 711503385} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1801490564 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1801490562} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1801490565 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1801490562} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1801490566 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1801490562} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 711503384} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1825808065 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1825808066} - - component: {fileID: 1825808068} - - component: {fileID: 1825808067} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1825808066 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1825808065} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 435696824} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1825808067 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1825808065} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 300 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 4 - m_MaxSize: 300 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 19 ---- !u!222 &1825808068 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1825808065} - m_CullTransparentMesh: 0 ---- !u!1 &1862269431 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1862269432} - m_Layer: 0 - m_Name: Receiver (4) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1862269432 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1862269431} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.375, y: 0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 767135702} - m_Father: {fileID: 0} - m_RootOrder: 38 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1909666275 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1909666276} - - component: {fileID: 1909666279} - - component: {fileID: 1909666278} - - component: {fileID: 1909666277} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1909666276 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1909666275} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 174227703} - - {fileID: 398316879} - m_Father: {fileID: 161803716} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1909666277 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1909666275} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1909666278 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1909666275} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1909666279 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1909666275} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 161803715} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &1911690626 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1911690629} - - component: {fileID: 1911690628} - - component: {fileID: 1911690627} - m_Layer: 0 - m_Name: Sender (17) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1911690627 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1911690626} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1911690628 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1911690626} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1911690629 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1911690626} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1060986427} - m_Father: {fileID: 0} - m_RootOrder: 18 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1915823782 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1915823783} - m_Layer: 0 - m_Name: Receiver (31) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1915823783 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1915823782} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.375, y: -0.4375, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1660971404} - m_Father: {fileID: 0} - m_RootOrder: 65 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1922512862 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1922512863} - m_Layer: 0 - m_Name: Receiver (16) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1922512863 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1922512862} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: 0.0625, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1386998311} - m_Father: {fileID: 0} - m_RootOrder: 50 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1927649159 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1927649160} - - component: {fileID: 1927649162} - - component: {fileID: 1927649161} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1927649160 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1927649159} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 348761543} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1927649161 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1927649159} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1927649162 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1927649159} - m_CullTransparentMesh: 0 ---- !u!1 &1937117183 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1937117184} - - component: {fileID: 1937117186} - - component: {fileID: 1937117185} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1937117184 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1937117183} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 399885489} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1937117185 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1937117183} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1937117186 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1937117183} - m_CullTransparentMesh: 0 ---- !u!1 &1976684058 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1976684059} - - component: {fileID: 1976684062} - - component: {fileID: 1976684061} - - component: {fileID: 1976684060} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1976684059 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1976684058} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1652695351} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1976684060 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1976684058} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (23) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 1976684061} - _targetMaterialProperty: _MainTex ---- !u!23 &1976684061 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1976684058} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1976684062 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1976684058} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1986169273 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1986169276} - - component: {fileID: 1986169275} - - component: {fileID: 1986169274} - m_Layer: 0 - m_Name: Sender (3) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1986169274 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1986169273} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &1986169275 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1986169273} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1986169276 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1986169273} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1230493361} - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2017739488 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2017739489} - m_Layer: 0 - m_Name: Receiver (8) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2017739489 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2017739488} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: 0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 43967866} - m_Father: {fileID: 0} - m_RootOrder: 42 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2025965315 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2025965318} - - component: {fileID: 2025965317} - - component: {fileID: 2025965316} - m_Layer: 0 - m_Name: Sender (26) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2025965316 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2025965315} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &2025965317 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2025965315} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &2025965318 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2025965315} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 201073785} - m_Father: {fileID: 0} - m_RootOrder: 27 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2048554651 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2048554652} - m_Layer: 0 - m_Name: Receiver (12) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2048554652 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2048554651} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: 0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 434645625} - m_Father: {fileID: 0} - m_RootOrder: 46 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2049445686 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2049445689} - - component: {fileID: 2049445688} - - component: {fileID: 2049445687} - m_Layer: 0 - m_Name: Sender (15) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2049445687 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2049445686} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &2049445688 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2049445686} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &2049445689 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2049445686} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 226326260} - m_Father: {fileID: 0} - m_RootOrder: 16 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2054852574 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2054852577} - - component: {fileID: 2054852576} - - component: {fileID: 2054852575} - m_Layer: 0 - m_Name: Sender (20) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2054852575 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2054852574} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &2054852576 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2054852574} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &2054852577 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2054852574} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 227422790} - m_Father: {fileID: 0} - m_RootOrder: 21 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2069094805 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2069094806} - - component: {fileID: 2069094808} - - component: {fileID: 2069094807} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2069094806 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2069094805} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1135374} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2069094807 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2069094805} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &2069094808 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2069094805} - m_CullTransparentMesh: 0 ---- !u!1 &2072103372 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2072103373} - - component: {fileID: 2072103375} - - component: {fileID: 2072103374} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2072103373 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2072103372} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1052575067} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2072103374 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2072103372} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Texture: {fileID: 8400000, guid: 35c93f0d33b8ff74bbbd1a5786965543, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &2072103375 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2072103372} - m_CullTransparentMesh: 0 ---- !u!1 &2089745216 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2089745217} - m_Layer: 0 - m_Name: Receiver (5) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2089745217 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2089745216} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: 0.3125, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1559718178} - m_Father: {fileID: 0} - m_RootOrder: 39 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2090913801 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2090913802} - - component: {fileID: 2090913805} - - component: {fileID: 2090913804} - - component: {fileID: 2090913803} - m_Layer: 0 - m_Name: Quad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2090913802 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2090913801} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 616793348} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2090913803 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2090913801} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceName: Sender (10) - _targetTexture: {fileID: 0} - _targetRenderer: {fileID: 2090913804} - _targetMaterialProperty: _MainTex ---- !u!23 &2090913804 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2090913801} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 4294967295 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &2090913805 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2090913801} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &2113078235 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2113078238} - - component: {fileID: 2113078237} - - component: {fileID: 2113078236} - m_Layer: 0 - m_Name: Sender (25) - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2113078236 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2113078235} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} - m_Name: - m_EditorClassIdentifier: - _sourceTexture: {fileID: 0} - _alphaSupport: 0 ---- !u!20 &2113078237 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2113078235} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.1 - far clip plane: 2 - field of view: 60 - orthographic: 1 - orthographic size: 1 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 32 - m_RenderingPath: 1 - m_TargetTexture: {fileID: 8400000, guid: 165a6f902d78e484c83b6bb18a33029e, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &2113078238 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2113078235} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 773497959} - m_Father: {fileID: 0} - m_RootOrder: 26 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2117672149 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2117672150} - m_Layer: 0 - m_Name: Receiver (21) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2117672150 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2117672149} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.125, y: -0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 98806807} - m_Father: {fileID: 0} - m_RootOrder: 55 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2133003126 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2133003127} - - component: {fileID: 2133003130} - - component: {fileID: 2133003129} - - component: {fileID: 2133003128} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2133003127 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2133003126} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 279473506} - - {fileID: 191595034} - m_Father: {fileID: 68656105} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &2133003128 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2133003126} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &2133003129 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2133003126} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &2133003130 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2133003126} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 68656104} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!1 &2135053881 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2135053882} - m_Layer: 0 - m_Name: Receiver (24) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2135053882 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2135053881} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.125, y: -0.1875, z: 0} - m_LocalScale: {x: 0.25, y: 0.125, z: 0.25} - m_Children: - - {fileID: 1434980983} - m_Father: {fileID: 0} - m_RootOrder: 58 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2144330594 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2144330595} - - component: {fileID: 2144330598} - - component: {fileID: 2144330597} - - component: {fileID: 2144330596} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2144330595 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2144330594} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1216948968} - - {fileID: 1247888048} - m_Father: {fileID: 1546198745} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &2144330596 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2144330594} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &2144330597 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2144330594} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &2144330598 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2144330594} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 1546198744} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 diff --git a/Assets/Test.unity b/Assets/Test.unity new file mode 100644 index 0000000..4d547be --- /dev/null +++ b/Assets/Test.unity @@ -0,0 +1,3111 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &15741319 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 15741320} + m_Layer: 0 + m_Name: Timecode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &15741320 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 15741319} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1548783097} + - {fileID: 2136759565} + - {fileID: 1258656581} + - {fileID: 918813314} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &168698425 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 168698426} + - component: {fileID: 168698429} + - component: {fileID: 168698428} + - component: {fileID: 168698427} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &168698426 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168698425} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 537574245} + m_Father: {fileID: 1625079608} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -18, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &168698427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168698425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &168698428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168698425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &168698429 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168698425} + m_CullTransparentMesh: 1 +--- !u!1 &275326808 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 275326809} + - component: {fileID: 275326811} + - component: {fileID: 275326810} + m_Layer: 5 + m_Name: Image 3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &275326809 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275326808} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2129989406} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &275326810 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275326808} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: ff94f91c62216aa4b8b027f13fe15303, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &275326811 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275326808} + m_CullTransparentMesh: 1 +--- !u!1 &296519804 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 296519805} + - component: {fileID: 296519806} + - component: {fileID: 296519807} + m_Layer: 0 + m_Name: Spout Receiver + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &296519805 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 296519804} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2070317740} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &296519806 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 296519804} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62f7dec0b00674947bc631624c21970a, type: 3} + m_Name: + m_EditorClassIdentifier: + _sourceName: Select a Spout source + _targetTexture: {fileID: 0} + _targetRenderer: {fileID: 529700670} + _targetMaterialProperty: _MainTex + _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} +--- !u!114 &296519807 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 296519804} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ae07b03851b241b438588e43455fa256, type: 3} + m_Name: + m_EditorClassIdentifier: + _dropdown: {fileID: 1317273802} +--- !u!1 &313292985 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 313292986} + - component: {fileID: 313292988} + - component: {fileID: 313292987} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &313292986 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 313292985} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1317273801} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &313292987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 313292985} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &313292988 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 313292985} + m_CullTransparentMesh: 1 +--- !u!1 &360967245 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 360967246} + - component: {fileID: 360967248} + - component: {fileID: 360967247} + m_Layer: 5 + m_Name: Image 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &360967246 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360967245} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 428298231} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &360967247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360967245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 9ea82f700d9e65841ae79a62180986d5, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &360967248 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360967245} + m_CullTransparentMesh: 1 +--- !u!1 &382375177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 382375180} + - component: {fileID: 382375179} + - component: {fileID: 382375178} + m_Layer: 0 + m_Name: Gradient Quad + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &382375178 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 382375177} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c01d1eeee63acea418bafad09e507872, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &382375179 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 382375177} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &382375180 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 382375177} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 1.7777778, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 830819964} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &428298230 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 428298231} + - component: {fileID: 428298232} + m_Layer: 5 + m_Name: Row 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &428298231 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 428298230} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1611900547} + - {fileID: 360967246} + m_Father: {fileID: 1932864584} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &428298232 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 428298230} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &529700669 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 529700672} + - component: {fileID: 529700671} + - component: {fileID: 529700670} + m_Layer: 0 + m_Name: Quad + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &529700670 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 529700669} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 7d717d2aa323e5c469963ea9c0a6cbe9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &529700671 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 529700669} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &529700672 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 529700669} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.8888889, y: 0.5, z: 1} + m_LocalScale: {x: 1.7777778, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2070317740} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &537574244 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 537574245} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &537574245 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537574244} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1280953319} + m_Father: {fileID: 168698426} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &676107413 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 676107414} + - component: {fileID: 676107416} + - component: {fileID: 676107415} + m_Layer: 5 + m_Name: Image 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &676107414 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 676107413} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2129989406} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &676107415 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 676107413} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 73e8dcdfe3f22594693dc569656418c6, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &676107416 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 676107413} + m_CullTransparentMesh: 1 +--- !u!1 &703445641 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 703445642} + - component: {fileID: 703445644} + - component: {fileID: 703445643} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &703445642 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 703445641} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1280953319} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &703445643 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 703445641} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &703445644 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 703445641} + m_CullTransparentMesh: 1 +--- !u!1 &761420633 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 761420634} + - component: {fileID: 761420636} + - component: {fileID: 761420635} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &761420634 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 761420633} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1975398971} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &761420635 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 761420633} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &761420636 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 761420633} + m_CullTransparentMesh: 1 +--- !u!1 &803165094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 803165095} + - component: {fileID: 803165097} + - component: {fileID: 803165096} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &803165095 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 803165094} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1280953319} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &803165096 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 803165094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &803165097 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 803165094} + m_CullTransparentMesh: 1 +--- !u!1 &830819963 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 830819964} + m_Layer: 0 + m_Name: Gradient + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &830819964 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 830819963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1000, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2085900136} + - {fileID: 382375180} + - {fileID: 1353969752} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &918813312 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 918813314} + - component: {fileID: 918813313} + m_Layer: 0 + m_Name: Spout Sender (Timecode) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &918813313 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 918813312} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} + m_Name: + m_EditorClassIdentifier: + _spoutName: KlakSpout (Timecode) + _keepAlpha: 0 + _captureMethod: 1 + _sourceCamera: {fileID: 1548783096} + _sourceTexture: {fileID: 0} + _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} +--- !u!4 &918813314 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 918813312} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 15741320} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1064951731 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1064951732} + - component: {fileID: 1064951734} + - component: {fileID: 1064951733} + m_Layer: 0 + m_Name: Camera (Alpha) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1064951732 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1064951731} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1454165792} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1064951733 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1064951731} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 0 + m_RequiresOpaqueTextureOption: 0 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 0 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!20 &1064951734 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1064951731} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 100 + field of view: 60 + orthographic: 1 + orthographic size: 0.5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 1 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: ff94f91c62216aa4b8b027f13fe15303, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &1159548131 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1159548132} + - component: {fileID: 1159548134} + - component: {fileID: 1159548133} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1159548132 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1159548131} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1317273801} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1159548133 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1159548131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1159548134 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1159548131} + m_CullTransparentMesh: 1 +--- !u!1 &1178800313 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1178800314} + - component: {fileID: 1178800315} + m_Layer: 0 + m_Name: Spout Sender (Alpha) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1178800314 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1178800313} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1454165792} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1178800315 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1178800313} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} + m_Name: + m_EditorClassIdentifier: + _spoutName: KlakSpout (Alpha) + _keepAlpha: 1 + _captureMethod: 2 + _sourceCamera: {fileID: 0} + _sourceTexture: {fileID: 8400000, guid: ff94f91c62216aa4b8b027f13fe15303, type: 2} + _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} +--- !u!1 &1252393094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1252393098} + - component: {fileID: 1252393097} + - component: {fileID: 1252393095} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1252393095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1252393094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 0 + m_RequiresOpaqueTextureOption: 0 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 0 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!20 &1252393097 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1252393094} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 100 + field of view: 60 + orthographic: 1 + orthographic size: 1 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 1 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1252393098 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1252393094} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1258656579 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1258656581} + - component: {fileID: 1258656580} + m_Layer: 0 + m_Name: Timecode Controller + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1258656580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258656579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a02ae1586c13b694b9fa87df91f5434d, type: 3} + m_Name: + m_EditorClassIdentifier: + _label: {fileID: 2107792921} + _camera: {fileID: 1548783096} +--- !u!4 &1258656581 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258656579} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 15741320} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1280953318 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1280953319} + - component: {fileID: 1280953320} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1280953319 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280953318} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1943616804} + - {fileID: 703445642} + - {fileID: 803165095} + m_Father: {fileID: 537574245} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1280953320 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280953318} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1943616805} + toggleTransition: 1 + graphic: {fileID: 703445643} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1317273800 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1317273801} + - component: {fileID: 1317273804} + - component: {fileID: 1317273803} + - component: {fileID: 1317273802} + m_Layer: 5 + m_Name: Dropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1317273801 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1317273800} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 313292986} + - {fileID: 1159548132} + - {fileID: 1625079608} + m_Father: {fileID: 1348462430} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 20, y: -20} + m_SizeDelta: {x: 300, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1317273802 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1317273800} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1317273803} + m_Template: {fileID: 1625079608} + m_CaptionText: {fileID: 313292987} + m_CaptionImage: {fileID: 0} + m_ItemText: {fileID: 803165096} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: Option A + m_Image: {fileID: 0} + - m_Text: Option B + m_Image: {fileID: 0} + - m_Text: Option C + m_Image: {fileID: 0} + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 296519807} + m_TargetAssemblyTypeName: SourceSelector, Assembly-CSharp + m_MethodName: OnChangeValue + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_AlphaFadeSpeed: 0.15 +--- !u!114 &1317273803 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1317273800} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1317273804 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1317273800} + m_CullTransparentMesh: 1 +--- !u!1 &1348462426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1348462430} + - component: {fileID: 1348462429} + - component: {fileID: 1348462428} + - component: {fileID: 1348462427} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1348462427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348462426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1348462428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348462426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1348462429 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348462426} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1348462430 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348462426} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1317273801} + - {fileID: 1932864584} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1353969751 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1353969752} + - component: {fileID: 1353969753} + m_Layer: 0 + m_Name: Spout Sender (Gradient) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1353969752 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1353969751} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 830819964} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1353969753 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1353969751} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} + m_Name: + m_EditorClassIdentifier: + _spoutName: KlakSpout (Gradient) + _keepAlpha: 0 + _captureMethod: 1 + _sourceCamera: {fileID: 2085900138} + _sourceTexture: {fileID: 0} + _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} +--- !u!1 &1377898238 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1377898239} + - component: {fileID: 1377898242} + - component: {fileID: 1377898241} + - component: {fileID: 1377898240} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1377898239 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377898238} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1975398971} + m_Father: {fileID: 1625079608} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1377898240 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377898238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 761420635} + m_HandleRect: {fileID: 761420634} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1377898241 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377898238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1377898242 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377898238} + m_CullTransparentMesh: 1 +--- !u!1 &1454165791 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1454165792} + m_Layer: 0 + m_Name: Alpha + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1454165792 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1454165791} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2000, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1064951732} + - {fileID: 1987873392} + - {fileID: 1178800314} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1548783094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1548783097} + - component: {fileID: 1548783096} + - component: {fileID: 1548783095} + m_Layer: 0 + m_Name: Camera (Timecode) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1548783095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1548783094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 0 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!20 &1548783096 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1548783094} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.17740594, g: 0.19696712, b: 0.21698111, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 100 + field of view: 60 + orthographic: 1 + orthographic size: 0.5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 32 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 9ea82f700d9e65841ae79a62180986d5, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1548783097 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1548783094} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 15741320} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1586758706 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1586758708} + - component: {fileID: 1586758707} + m_Layer: 0 + m_Name: Spout Sender (GameView) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1586758707 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586758706} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45099d624c1e6c14e9514f4e5ea1ed9c, type: 3} + m_Name: + m_EditorClassIdentifier: + _spoutName: KlakSpout (GameView) + _keepAlpha: 0 + _captureMethod: 0 + _sourceCamera: {fileID: 0} + _sourceTexture: {fileID: 0} + _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} +--- !u!4 &1586758708 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586758706} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1611900546 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1611900547} + m_Layer: 5 + m_Name: Null + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1611900547 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1611900546} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 428298231} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1625079607 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1625079608} + - component: {fileID: 1625079611} + - component: {fileID: 1625079610} + - component: {fileID: 1625079609} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1625079608 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1625079607} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 168698426} + - {fileID: 1377898239} + m_Father: {fileID: 1317273801} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1625079609 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1625079607} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 537574245} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 168698426} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1377898240} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1625079610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1625079607} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1625079611 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1625079607} + m_CullTransparentMesh: 1 +--- !u!1 &1809469722 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1809469725} + - component: {fileID: 1809469724} + - component: {fileID: 1809469723} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1809469723 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1809469722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1809469724 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1809469722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1809469725 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1809469722} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1932864583 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1932864584} + - component: {fileID: 1932864585} + m_Layer: 5 + m_Name: Grid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1932864584 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1932864583} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 428298231} + - {fileID: 2129989406} + m_Father: {fileID: 1348462430} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1932864585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1932864583} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1943616803 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1943616804} + - component: {fileID: 1943616806} + - component: {fileID: 1943616805} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1943616804 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1943616803} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1280953319} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1943616805 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1943616803} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1943616806 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1943616803} + m_CullTransparentMesh: 1 +--- !u!1 &1975398970 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1975398971} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1975398971 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1975398970} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 761420634} + m_Father: {fileID: 1377898239} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1987873391 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1987873392} + - component: {fileID: 1987873394} + - component: {fileID: 1987873393} + m_Layer: 0 + m_Name: Alpha Quad + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1987873392 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1987873391} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 1.7777778, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1454165792} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1987873393 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1987873391} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2e159dec22cd1174d99e5c2f70f07e74, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1987873394 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1987873391} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2070317739 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2070317740} + m_Layer: 0 + m_Name: Receiver + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2070317740 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2070317739} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 296519805} + - {fileID: 529700672} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2085900135 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2085900136} + - component: {fileID: 2085900138} + - component: {fileID: 2085900137} + m_Layer: 0 + m_Name: Camera (Gradient) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2085900136 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2085900135} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 830819964} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2085900137 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2085900135} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 0 + m_RequiresOpaqueTextureOption: 0 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 0 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!20 &2085900138 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2085900135} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.04236381, g: 0.06991414, b: 0.11320752, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 100 + field of view: 60 + orthographic: 1 + orthographic size: 0.5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 1 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 73e8dcdfe3f22594693dc569656418c6, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &2107792920 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2107792923} + - component: {fileID: 2107792922} + - component: {fileID: 2107792921} + m_Layer: 5 + m_Name: Timecode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2107792921 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107792920} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 100 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 260 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 00:00:00 +--- !u!222 &2107792922 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107792920} + m_CullTransparentMesh: 1 +--- !u!224 &2107792923 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107792920} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2136759565} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2129989405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2129989406} + - component: {fileID: 2129989407} + m_Layer: 5 + m_Name: Row 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2129989406 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2129989405} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 676107414} + - {fileID: 275326809} + m_Father: {fileID: 1932864584} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2129989407 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2129989405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &2136759564 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2136759565} + - component: {fileID: 2136759568} + - component: {fileID: 2136759567} + - component: {fileID: 2136759566} + m_Layer: 5 + m_Name: Canvas (Timecode) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2136759565 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136759564} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 2107792923} + m_Father: {fileID: 15741320} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &2136759566 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136759564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &2136759567 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136759564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &2136759568 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136759564} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 1548783096} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 diff --git a/Assets/RenderTextures.meta b/Assets/Test.unity.meta similarity index 67% rename from Assets/RenderTextures.meta rename to Assets/Test.unity.meta index 16879f9..ae1aff9 100644 --- a/Assets/RenderTextures.meta +++ b/Assets/Test.unity.meta @@ -1,6 +1,5 @@ fileFormatVersion: 2 -guid: abde29eb1a541e745b2ce39563409e81 -folderAsset: yes +guid: a83b31f020d56ca4d93f5f70138ef6b3 DefaultImporter: externalObjects: {} userData: diff --git a/Assets/TestCards.meta b/Assets/TestCards.meta deleted file mode 100644 index ec739b1..0000000 --- a/Assets/TestCards.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: a2511bfcba02cbe42a514922aad98572 -folderAsset: yes -timeCreated: 1490421382 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/TestCards/Editor.meta b/Assets/TestCards/Editor.meta deleted file mode 100644 index 93782a4..0000000 --- a/Assets/TestCards/Editor.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: f8f48d1eb75e9e74f95d6524d42a28a5 -folderAsset: yes -timeCreated: 1490423409 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/TestCards/Editor/TestOverlayEditor.cs b/Assets/TestCards/Editor/TestOverlayEditor.cs deleted file mode 100644 index bbb87bc..0000000 --- a/Assets/TestCards/Editor/TestOverlayEditor.cs +++ /dev/null @@ -1,35 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace TestCards -{ - [CustomEditor(typeof(TestOverlay))] - public class TestOverlayEditor : Editor - { - SerializedProperty _mode; - SerializedProperty _color; - SerializedProperty _scale; - - void OnEnable() - { - _mode = serializedObject.FindProperty("_mode"); - _color = serializedObject.FindProperty("_color"); - _scale = serializedObject.FindProperty("_scale"); - } - - public override void OnInspectorGUI() - { - serializedObject.Update(); - - EditorGUILayout.PropertyField(_mode); - - if (_mode.intValue == (int)TestOverlay.Mode.Fill) - EditorGUILayout.PropertyField(_color); - - if (_mode.intValue == (int)TestOverlay.Mode.Checker) - EditorGUILayout.PropertyField(_scale); - - serializedObject.ApplyModifiedProperties(); - } - } -} diff --git a/Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef b/Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef deleted file mode 100644 index 1b1e686..0000000 --- a/Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "jp.keijiro.testcards.Editor", - "references": [ - "jp.keijiro.testcards.Runtime" - ], - "optionalUnityReferences": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false -} \ No newline at end of file diff --git a/Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef.meta b/Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef.meta deleted file mode 100644 index fcf87c9..0000000 --- a/Assets/TestCards/Editor/jp.keijiro.testcards.Editor.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: cc9e313774f1eed4e80d31ff297f7555 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/TestCards/Resources.meta b/Assets/TestCards/Resources.meta deleted file mode 100644 index 530b03b..0000000 --- a/Assets/TestCards/Resources.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 98ccbbd3e8d8a62498510d48ada470fe -folderAsset: yes -timeCreated: 1490423502 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/TestCards/Resources/TestOverlay.shader b/Assets/TestCards/Resources/TestOverlay.shader deleted file mode 100644 index cf951ce..0000000 --- a/Assets/TestCards/Resources/TestOverlay.shader +++ /dev/null @@ -1,198 +0,0 @@ -Shader "Hidden/TestCards/Overlay" -{ - Properties - { - _MainTex("", 2D) = "black"{} - _Color("", Color) = (0.5, 0.5, 0.5) - } - - CGINCLUDE - - #include "UnityCG.cginc" - - sampler2D _MainTex; - float4 _MainTex_TexelSize; - - half3 _Color; - float _Scale; - - // Hue to RGB convertion - half3 HueToRGB(half h) - { - h = saturate(h); - half r = abs(h * 6 - 3) - 1; - half g = 2 - abs(h * 6 - 2); - half b = 2 - abs(h * 6 - 4); - half3 rgb = saturate(half3(r, g, b)); - return rgb; - } - - half4 frag_fill(v2f_img i) : SV_Target - { - return half4(_Color, 1); - } - - half4 frag_spectrum(v2f_img i) : SV_Target - { - half3 rgb = lerp(HueToRGB(i.uv.x), i.uv.x, i.uv.y > 0.5); - #if !defined(UNITY_COLORSPACE_GAMMA) - rgb = GammaToLinearSpace(rgb); - #endif - return half4(rgb, 1); - } - - half4 frag_checker(v2f_img i) : SV_Target - { - float2 c = step(0.4999, frac(i.uv.xy * _MainTex_TexelSize.zw * _Scale)); - return abs(c.x - c.y); - } - - half4 frag_pattern(v2f_img i) : SV_Target - { - float scale = 27 * _MainTex_TexelSize.y; // Grid scale - float2 p0 = (i.uv - 0.5) * _MainTex_TexelSize.zw; // Position (pixel) - float2 p1 = p0 * scale; // Position (half grid) - float2 p2 = p1 / 2 - 0.5; // Position (grid) - - // Size of inner area - half aspect = _MainTex_TexelSize.y * _MainTex_TexelSize.z; - half2 area = half2(floor(6.5 * aspect) * 2 + 1, 13); - - // Crosshair and grid lines - half2 ch = abs(p0); - half2 grid = (1 - abs(frac(p2) - 0.5) * 2) / scale; - half c1 = min(min(ch.x, ch.y), min(grid.x, grid.y)) < 1 ? 1 : 0.5; - - // Outer area checker - half2 checker = frac(floor(p2) / 2) * 2; - if (any(abs(p1) > area)) c1 = abs(checker.x - checker.y); - - half corner = sqrt(8) - length(abs(p1) - area + 4); // Corner circles - half circle = 12 - length(p1); // Big center circle - half mask = saturate(circle / scale); // Center circls mask - - // Grayscale bars - half bar1 = saturate(p1.y < 5 ? floor(p1.x / 4 + 3) / 5 : p1.x / 16 + 0.5); - if (abs(5 - p1.y) < 4 * mask) c1 = bar1; - - // Basic color bars - half3 bar2 = HueToRGB((p1.y > -5 ? floor(p1.x / 4) / 6 : p1.x / 16) + 0.5); - float3 rgb = abs(-5 - p1.y) < 4 * mask ? bar2 : saturate(c1); - - // Circle lines - rgb = lerp(rgb, 1, saturate(1.5 - abs(max(circle, corner)) / scale)); - - #if !defined(UNITY_COLORSPACE_GAMMA) - rgb = GammaToLinearSpace(rgb); - #endif - - return half4(rgb, 1); - } - - half4 frag_shutter(v2f_img i) : SV_Target - { - const float4 tsize = _MainTex_TexelSize; - const float radius = 0.45; - - const float time = _Time.y; - const float deltaTime = unity_DeltaTime.x; - - float2 uv = (i.uv - 0.5) * float2(tsize.y * tsize.z, 1); - - float phi = atan2(-uv.x, -uv.y) / (UNITY_PI * 2) + 0.5; - half arc = saturate((phi - frac(time)) / fwidth(phi)); - - float dist = length(uv); - arc *= saturate((radius + tsize.y - dist) * tsize.w); - - half circle = saturate(1 - abs(dist - radius) * tsize.w); - - half flash = frac(time) <= frac(time - deltaTime); - - half2 c2 = step(0.4999, frac(uv * 3.5)); - half checker = lerp(0.1, 0.2, abs(c2.x - c2.y)); - - half c = max(max(max(arc, circle), flash), checker); - - #if defined(UNITY_COLORSPACE_GAMMA) - return half4(c, c, c, 1); - #else - return half4((half3)GammaToLinearSpace(c), 1); - #endif - } - - half4 frag_frequency(v2f_img i) : SV_Target - { - float2 uv = i.uv.xy - 0.25; - - half phi = atan2(uv.x * _MainTex_TexelSize.y * _MainTex_TexelSize.z, uv.y); - half lim = saturate(fwidth(phi) * 20); // frequency limitter - phi = lerp(sin(phi * 100), 0, lim); - - float2 freq = UNITY_PI * 0.5 / (1 + uv * 4); - half2 comb = cos(freq * uv * _MainTex_TexelSize.zw); - - half2 sig = uv > 0; - half c = lerp(phi, lerp(comb.x, comb.y, sig.y), abs(sig.x - sig.y)); - c = c / 2 + 0.5; - - #if defined(UNITY_COLORSPACE_GAMMA) - return half4(c, c, c, 1); - #else - return half4((half3)GammaToLinearSpace(c), 1); - #endif - } - - ENDCG - - SubShader - { - Cull Off ZWrite Off ZTest Always - Pass - { - CGPROGRAM - #pragma vertex vert_img - #pragma fragment frag_fill - ENDCG - } - Pass - { - CGPROGRAM - #pragma multi_compile __ UNITY_COLORSPACE_GAMMA - #pragma vertex vert_img - #pragma fragment frag_spectrum - ENDCG - } - Pass - { - CGPROGRAM - #pragma vertex vert_img - #pragma fragment frag_checker - ENDCG - } - Pass - { - CGPROGRAM - #pragma multi_compile __ UNITY_COLORSPACE_GAMMA - #pragma vertex vert_img - #pragma fragment frag_pattern - ENDCG - } - Pass - { - CGPROGRAM - #pragma multi_compile __ UNITY_COLORSPACE_GAMMA - #pragma vertex vert_img - #pragma fragment frag_shutter - ENDCG - } - Pass - { - CGPROGRAM - #pragma multi_compile __ UNITY_COLORSPACE_GAMMA - #pragma vertex vert_img - #pragma fragment frag_frequency - ENDCG - } - } -} diff --git a/Assets/TestCards/Resources/TestOverlay.shader.meta b/Assets/TestCards/Resources/TestOverlay.shader.meta deleted file mode 100644 index 4ff206b..0000000 --- a/Assets/TestCards/Resources/TestOverlay.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: bc6a0edaa182a35449d12a1445ba38db -timeCreated: 1490421835 -licenseType: Pro -ShaderImporter: - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/TestCards/Runtime/TestOverlay.cs b/Assets/TestCards/Runtime/TestOverlay.cs deleted file mode 100644 index 4448bce..0000000 --- a/Assets/TestCards/Runtime/TestOverlay.cs +++ /dev/null @@ -1,70 +0,0 @@ -using UnityEngine; - -namespace TestCards -{ - [ExecuteInEditMode] - [RequireComponent(typeof(Camera))] - public class TestOverlay : MonoBehaviour - { - #region Editable properties - - public enum Mode { Fill, Spectrum, Checker, Pattern, Shutter, Frequency } - - [SerializeField] Mode _mode = Mode.Pattern; - - public Mode mode { - get { return _mode; } - set { _mode = value; } - } - - [SerializeField] Color _color = Color.gray; - - public Color color { - get { return _color; } - set { _color = value; } - } - - [SerializeField, Range(1, 8)] int _scale = 4; - - public int scale { - get { return _scale; } - set { _scale = value; } - } - - #endregion - - #region Private members - - [SerializeField, HideInInspector] Shader _shader = null; - Material _material; - - #endregion - - #region MonoBehaviour functions - - void OnDestroy() - { - if (_material != null) - if (Application.isPlaying) - Destroy(_material); - else - DestroyImmediate(_material); - } - - void OnRenderImage(RenderTexture source, RenderTexture destination) - { - if (_material == null) - { - _material = new Material(_shader); - _material.hideFlags = HideFlags.DontSave; - } - - _material.color = _color; - _material.SetFloat("_Scale", 1.0f / Mathf.Pow(2, _scale)); - - Graphics.Blit(source, destination, _material, (int)_mode); - } - - #endregion - } -} diff --git a/Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef b/Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef deleted file mode 100644 index 9a30ad0..0000000 --- a/Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "jp.keijiro.testcards.Runtime", - "references": [], - "optionalUnityReferences": [], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false -} \ No newline at end of file diff --git a/Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef.meta b/Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef.meta deleted file mode 100644 index 61f420d..0000000 --- a/Assets/TestCards/Runtime/jp.keijiro.testcards.Runtime.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0aa1b071e05272b47a40d7ea7b936278 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/URP.asset b/Assets/URP.asset new file mode 100644 index 0000000..e75fa1f --- /dev/null +++ b/Assets/URP.asset @@ -0,0 +1,57 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} + m_Name: URP + m_EditorClassIdentifier: + k_AssetVersion: 5 + k_AssetPreviousVersion: 5 + m_RendererType: 1 + m_RendererData: {fileID: 0} + m_RendererDataList: + - {fileID: 11400000, guid: e6b277fe4e9566442a659b0278c18758, type: 2} + m_DefaultRendererIndex: 0 + m_RequireDepthTexture: 0 + m_RequireOpaqueTexture: 0 + m_OpaqueDownsampling: 1 + m_SupportsTerrainHoles: 1 + m_SupportsHDR: 1 + m_MSAA: 1 + m_RenderScale: 1 + m_MainLightRenderingMode: 1 + m_MainLightShadowsSupported: 1 + m_MainLightShadowmapResolution: 2048 + m_AdditionalLightsRenderingMode: 1 + m_AdditionalLightsPerObjectLimit: 4 + m_AdditionalLightShadowsSupported: 0 + m_AdditionalLightsShadowmapResolution: 512 + m_ShadowDistance: 50 + m_ShadowCascadeCount: 1 + m_Cascade2Split: 0.25 + m_Cascade3Split: {x: 0.1, y: 0.3} + m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467} + m_ShadowDepthBias: 1 + m_ShadowNormalBias: 1 + m_SoftShadowsSupported: 0 + m_UseSRPBatcher: 1 + m_SupportsDynamicBatching: 0 + m_MixedLightingSupported: 1 + m_DebugLevel: 0 + m_UseAdaptivePerformance: 1 + m_ColorGradingMode: 0 + m_ColorGradingLutSize: 32 + m_ShadowType: 1 + m_LocalShadowsSupported: 0 + m_LocalShadowsAtlasResolution: 256 + m_MaxPixelLights: 0 + m_ShadowAtlasResolution: 256 + m_ShaderVariantLogLevel: 0 + m_ShadowCascades: 0 diff --git a/Assets/URP.asset.meta b/Assets/URP.asset.meta new file mode 100644 index 0000000..4a477ce --- /dev/null +++ b/Assets/URP.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a817dc55f0eb8dc468415b739ceae0d2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/URP_Renderer.asset b/Assets/URP_Renderer.asset new file mode 100644 index 0000000..a126108 --- /dev/null +++ b/Assets/URP_Renderer.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} + m_Name: URP_Renderer + m_EditorClassIdentifier: + m_RendererFeatures: [] + m_RendererFeatureMap: + postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + shaders: + blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3} + copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + screenSpaceShadowPS: {fileID: 4800000, guid: 0f854b35a0cf61a429bd5dcfea30eddd, type: 3} + samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} + tileDepthInfoPS: {fileID: 0} + tileDeferredPS: {fileID: 0} + stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} + fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} + materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3} + m_OpaqueLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_TransparentLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_DefaultStencilState: + overrideStencilState: 0 + stencilReference: 0 + stencilCompareFunction: 8 + passOperation: 2 + failOperation: 0 + zFailOperation: 0 + m_ShadowTransparentReceive: 1 + m_RenderingMode: 0 + m_AccurateGbufferNormals: 0 diff --git a/Assets/URP_Renderer.asset.meta b/Assets/URP_Renderer.asset.meta new file mode 100644 index 0000000..fd41d6e --- /dev/null +++ b/Assets/URP_Renderer.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6b277fe4e9566442a659b0278c18758 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/LICENSE b/LICENSE index ba2ee04..68a49da 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,24 @@ -MIT License +This is free and unencumbered software released into the public domain. -Copyright (c) 2017-2020 Keijiro Takahashi +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +For more information, please refer to diff --git a/Packages/jp.keijiro.klak.spout/Editor/MaterialPropertySelector.cs b/Packages/jp.keijiro.klak.spout/Editor/MaterialPropertySelector.cs index 4f7b3c0..9fc7415 100644 --- a/Packages/jp.keijiro.klak.spout/Editor/MaterialPropertySelector.cs +++ b/Packages/jp.keijiro.klak.spout/Editor/MaterialPropertySelector.cs @@ -1,90 +1,85 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - using UnityEngine; using UnityEditor; -using System; -using System.Collections.Generic; +using System.Linq; + +namespace Klak.Spout.Editor { -namespace Klak.Spout +static class MaterialPropertySelector { - static class MaterialPropertySelector + #region Public method + + // Material property dropdown list + public static void DropdownList + (SerializedProperty rendererProperty, + SerializedProperty materialProperty) { - #region Public method + var shader = GetShaderFromRenderer(rendererProperty); - // Material property drop-down list - public static void DropdownList( - SerializedProperty rendererProperty, - SerializedProperty materialProperty - ) + // Abandon the current value if there is no shader assignment. + if (shader == null) { - // Try retrieving the target shader. - var shader = RetrieveTargetShader(rendererProperty); - - // Abandon the current value if it failed to get a shader. - if (shader == null) - { - materialProperty.stringValue = ""; - return; - } - - // Cache property names found in the target shader. - CachePropertyNames(shader); - - // Abandon the current value if there is no property candidate. - if (_propertyNames.Length == 0) - { - materialProperty.stringValue = ""; - return; - } - - // Show the dropdown list. - var index = Array.IndexOf(_propertyNames, materialProperty.stringValue); - var newIndex = EditorGUILayout.Popup("Property", index, _propertyNames); - - // Update the serialized property if the selection was changed. - if (index != newIndex) materialProperty.stringValue = _propertyNames[newIndex]; + materialProperty.stringValue = ""; + return; } - #endregion + var names = CachePropertyNames(shader); - #region Private members + // Abandon the current value if there is no option. + if (names.Length == 0) + { + materialProperty.stringValue = ""; + return; + } - static string[] _propertyNames; // Property name list - static Shader _cachedShader; // Shader used to cache the name list + // Dropdown GUI + var index = System.Array.IndexOf(names, materialProperty.stringValue); + var newIndex = EditorGUILayout.Popup("Property", index, names); + if (index != newIndex) materialProperty.stringValue = names[newIndex]; + } - // Retrieve a shader from a given renderer. - static Shader RetrieveTargetShader(SerializedProperty rendererProperty) - { - var renderer = rendererProperty.objectReferenceValue as Renderer; - if (renderer == null) return null; + #endregion - var material = renderer.sharedMaterial; - if (material == null) return null; + #region Utility function - return material.shader; - } + // Shader retrieval function + static Shader GetShaderFromRenderer(SerializedProperty property) + { + var renderer = property.objectReferenceValue as Renderer; + if (renderer == null) return null; - // Cache property names provided within a specified shader. - static void CachePropertyNames(Shader shader) - { - // Exit early when the shader is same to the cached one. - if (shader == _cachedShader) return; + var material = renderer.sharedMaterial; + if (material == null) return null; - var temp = new List(); + return material.shader; + } - var count = ShaderUtil.GetPropertyCount(shader); - for (var i = 0; i < count; i++) - { - var propType = ShaderUtil.GetPropertyType(shader, i); - if (propType == ShaderUtil.ShaderPropertyType.TexEnv) - temp.Add(ShaderUtil.GetPropertyName(shader, i)); - } + #endregion - _propertyNames = temp.ToArray(); - _cachedShader = shader; - } + #region Property name cache + + static Shader _cachedShader; + static string[] _cachedPropertyNames; + + static bool IsPropertyTexture(Shader shader, int index) + => ShaderUtil.GetPropertyType(shader, index) == + ShaderUtil.ShaderPropertyType.TexEnv; + + static string[] CachePropertyNames(Shader shader) + { + if (shader == _cachedShader) return _cachedPropertyNames; + + var names = + Enumerable.Range(0, ShaderUtil.GetPropertyCount(shader)) + .Where(i => IsPropertyTexture(shader, i)) + .Select(i => ShaderUtil.GetPropertyName(shader, i)); + + _cachedShader = shader; + _cachedPropertyNames = names.ToArray(); - #endregion + return _cachedPropertyNames; } + + #endregion } + +} // namespace Klak.Spout.Editor diff --git a/Packages/jp.keijiro.klak.spout/Editor/SpoutReceiverEditor.cs b/Packages/jp.keijiro.klak.spout/Editor/SpoutReceiverEditor.cs index 2d2775e..3a9aa23 100644 --- a/Packages/jp.keijiro.klak.spout/Editor/SpoutReceiverEditor.cs +++ b/Packages/jp.keijiro.klak.spout/Editor/SpoutReceiverEditor.cs @@ -1,118 +1,115 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - using UnityEngine; using UnityEditor; -namespace Klak.Spout +namespace Klak.Spout.Editor { + +[CanEditMultipleObjects] +[CustomEditor(typeof(SpoutReceiver))] +sealed class SpoutReceiverEditor : UnityEditor.Editor { - [CanEditMultipleObjects] - [CustomEditor(typeof(SpoutReceiver))] - sealed class SpoutReceiverEditor : Editor + SerializedProperty _sourceName; + SerializedProperty _targetTexture; + SerializedProperty _targetRenderer; + SerializedProperty _targetMaterialProperty; + + static class Labels { - SerializedProperty _sourceName; - SerializedProperty _targetTexture; - SerializedProperty _targetRenderer; - SerializedProperty _targetMaterialProperty; + public static Label Property = "Property"; + public static Label Select = "Select"; + } - static double _prevRepaintTime; + // Create and show the source name dropdown. + void ShowSourceNameDropdown(Rect rect) + { + var menu = new GenericMenu(); + var sources = SpoutManager.GetSourceNames(); - static class Labels + if (sources.Length > 0) { - public static readonly GUIContent Property = new GUIContent("Property"); - public static readonly GUIContent Select = new GUIContent("Select"); + foreach (var name in sources) + menu.AddItem(new GUIContent(name), false, OnSelectSource, name); } - - // Request receiver reconnection. - void RequestReconnect() + else { - foreach (SpoutReceiver receiver in targets) receiver.RequestReconnect(); + menu.AddItem(new GUIContent("No source available"), false, null); } - // Check and request repaint with 0.1s interval. - void CheckRepaint() - { - var time = EditorApplication.timeSinceStartup; - if (time - _prevRepaintTime < 0.1) return; - UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); - _prevRepaintTime = time; - } + menu.DropDown(rect); + } - // Create and show the source name dropdown. - void ShowSourceNameDropdown(Rect rect) - { - var menu = new GenericMenu(); - var count = PluginEntry.ScanSharedObjects(); - for (var i = 0; i < count; i++) - { - var name = PluginEntry.GetSharedObjectNameString(i); - menu.AddItem(new GUIContent(name), false, OnSelectSource, name); - } - menu.DropDown(rect); - } + // Source name selection callback + void OnSelectSource(object nameObject) + { + var name = (string)nameObject; + serializedObject.Update(); + _sourceName.stringValue = name; + serializedObject.ApplyModifiedProperties(); + RequestRestart(); + } - // Source name selection callback - void OnSelectSource(object name) + // Receiver restart request + void RequestRestart() + { + // Dirty trick: We only can restart receivers by modifying the + // sourceName property, so we modify it by an invalid name, then + // revert it. + foreach (SpoutReceiver recv in targets) { - serializedObject.Update(); - _sourceName.stringValue = (string)name; - serializedObject.ApplyModifiedProperties(); - RequestReconnect(); + recv.sourceName = ""; + recv.sourceName = _sourceName.stringValue; } + } - void OnEnable() - { - _sourceName = serializedObject.FindProperty("_sourceName"); - _targetTexture = serializedObject.FindProperty("_targetTexture"); - _targetRenderer = serializedObject.FindProperty("_targetRenderer"); - _targetMaterialProperty = serializedObject.FindProperty("_targetMaterialProperty"); - - EditorApplication.update += CheckRepaint; - } + void OnEnable() + { + var finder = new PropertyFinder(serializedObject); + _sourceName = finder["_sourceName"]; + _targetTexture = finder["_targetTexture"]; + _targetRenderer = finder["_targetRenderer"]; + _targetMaterialProperty = finder["_targetMaterialProperty"]; + } - void OnDisable() - { - EditorApplication.update -= CheckRepaint; - } + public override void OnInspectorGUI() + { + serializedObject.Update(); - public override void OnInspectorGUI() - { - serializedObject.Update(); + EditorGUILayout.BeginHorizontal(); - EditorGUILayout.BeginHorizontal(); + // Source name text field + EditorGUI.BeginChangeCheck(); + EditorGUILayout.DelayedTextField(_sourceName); + var restart = EditorGUI.EndChangeCheck(); - // Source name text field - EditorGUI.BeginChangeCheck(); - EditorGUILayout.DelayedTextField(_sourceName); - if (EditorGUI.EndChangeCheck()) RequestReconnect(); + // Source name dropdown + var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(60)); + if (EditorGUI.DropdownButton(rect, Labels.Select, FocusType.Keyboard)) + ShowSourceNameDropdown(rect); - // Source name dropdown - var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(60)); - if (EditorGUI.DropdownButton(rect, Labels.Select, FocusType.Keyboard)) - ShowSourceNameDropdown(rect); + EditorGUILayout.EndHorizontal(); - EditorGUILayout.EndHorizontal(); + // Target texture/renderer + EditorGUILayout.PropertyField(_targetTexture); + EditorGUILayout.PropertyField(_targetRenderer); - // Target texture/renderer - EditorGUILayout.PropertyField(_targetTexture); - EditorGUILayout.PropertyField(_targetRenderer); + EditorGUI.indentLevel++; - EditorGUI.indentLevel++; + if (_targetRenderer.hasMultipleDifferentValues) + { + // Multiple renderers selected: Show a simple text field. + EditorGUILayout.PropertyField(_targetMaterialProperty, Labels.Property); + } + else if (_targetRenderer.objectReferenceValue != null) + { + // Single renderer: Show the material property selection dropdown. + MaterialPropertySelector.DropdownList(_targetRenderer, _targetMaterialProperty); + } - if (_targetRenderer.hasMultipleDifferentValues) - { - // Multiple renderers selected: Show a simple text field. - EditorGUILayout.PropertyField(_targetMaterialProperty, Labels.Property); - } - else if (_targetRenderer.objectReferenceValue != null) - { - // Single renderer: Show the material property selection dropdown. - MaterialPropertySelector.DropdownList(_targetRenderer, _targetMaterialProperty); - } + EditorGUI.indentLevel--; - EditorGUI.indentLevel--; + serializedObject.ApplyModifiedProperties(); - serializedObject.ApplyModifiedProperties(); - } + if (restart) RequestRestart(); } } + +} // namespace Klak.Spout.Editor diff --git a/Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset b/Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset new file mode 100644 index 0000000..fcfcd12 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 12527eb854f97c84cac3b04dc699db09, type: 3} + m_Name: SpoutResources + m_EditorClassIdentifier: + blitShader: {fileID: 4800000, guid: eb56c59e60b76874692c486f3bdd860d, type: 3} diff --git a/Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset.meta b/Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset.meta new file mode 100644 index 0000000..6093c4f --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Editor/SpoutResources.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f449ebbe2051c2e4d993eaa773a410de +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs b/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs index 1eaee62..a7a7520 100644 --- a/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs +++ b/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs @@ -1,58 +1,73 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - using UnityEngine; using UnityEditor; -namespace Klak.Spout +namespace Klak.Spout.Editor { + +[CanEditMultipleObjects] +[CustomEditor(typeof(SpoutSender))] +sealed class SpoutSenderEditor : UnityEditor.Editor { - [CanEditMultipleObjects] - [CustomEditor(typeof(SpoutSender))] - sealed class SpoutSenderEditor : Editor + SerializedProperty _spoutName; + SerializedProperty _keepAlpha; + SerializedProperty _captureMethod; + SerializedProperty _sourceCamera; + SerializedProperty _sourceTexture; + + static class Labels { - SerializedProperty _sourceTexture; - SerializedProperty _alphaSupport; + public static Label SpoutName = "Spout Name"; + } - void OnEnable() + // Sender restart request + void RequestRestart() + { + // Dirty trick: We only can restart senders by modifying the + // spoutName property, so we modify it by an invalid name, then + // revert it. + foreach (SpoutSender send in targets) { - _sourceTexture = serializedObject.FindProperty("_sourceTexture"); - _alphaSupport = serializedObject.FindProperty("_alphaSupport"); + send.spoutName = ""; + send.spoutName = _spoutName.stringValue; } + } - public override void OnInspectorGUI() - { - serializedObject.Update(); - - if (targets.Length == 1) - { - var sender = (SpoutSender)target; - var camera = sender.GetComponent(); - - if (camera != null) - { - EditorGUILayout.HelpBox( - "Spout Sender is running in camera capture mode.", - MessageType.None - ); - - // Hide the source texture property. - } - else - { - EditorGUILayout.HelpBox( - "Spout Sender is running in render texture mode.", - MessageType.None - ); - - EditorGUILayout.PropertyField(_sourceTexture); - } - } - else - EditorGUILayout.PropertyField(_sourceTexture); - - EditorGUILayout.PropertyField(_alphaSupport); - - serializedObject.ApplyModifiedProperties(); - } + void OnEnable() + { + var finder = new PropertyFinder(serializedObject); + _spoutName = finder["_spoutName"]; + _keepAlpha = finder["_keepAlpha"]; + _captureMethod = finder["_captureMethod"]; + _sourceCamera = finder["_sourceCamera"]; + _sourceTexture = finder["_sourceTexture"]; + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.DelayedTextField(_spoutName, Labels.SpoutName); + var restart = EditorGUI.EndChangeCheck(); + + EditorGUILayout.PropertyField(_keepAlpha); + EditorGUILayout.PropertyField(_captureMethod); + + EditorGUI.indentLevel++; + + if (_captureMethod.hasMultipleDifferentValues || + _captureMethod.enumValueIndex == (int)CaptureMethod.Camera) + EditorGUILayout.PropertyField(_sourceCamera); + + if (_captureMethod.hasMultipleDifferentValues || + _captureMethod.enumValueIndex == (int)CaptureMethod.Texture) + EditorGUILayout.PropertyField(_sourceTexture); + + EditorGUI.indentLevel--; + + serializedObject.ApplyModifiedProperties(); + + if (restart) RequestRestart(); } } + +} // namespace Klak.Spout.Editor diff --git a/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs.meta b/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs.meta index f910062..3aa1210 100644 --- a/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs.meta +++ b/Packages/jp.keijiro.klak.spout/Editor/SpoutSenderEditor.cs.meta @@ -1,8 +1,7 @@ fileFormatVersion: 2 -guid: 4d54f6c4c801e1148b465b8fb9d50412 -timeCreated: 1492008196 -licenseType: Pro +guid: b452d1bad3a57344d9b54f2cea6f252c MonoImporter: + externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 diff --git a/Packages/jp.keijiro.klak.spout/Editor/Utility.cs b/Packages/jp.keijiro.klak.spout/Editor/Utility.cs new file mode 100644 index 0000000..a5f8f2a --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Editor/Utility.cs @@ -0,0 +1,30 @@ +using UnityEngine; +using UnityEditor; + +namespace Klak.Spout.Editor { + +// Simple string label with GUIContent +struct Label +{ + GUIContent _guiContent; + + public static implicit operator GUIContent(Label label) + => label._guiContent; + + public static implicit operator Label(string text) + => new Label { _guiContent = new GUIContent(text) }; +} + +// Utilities for finding serialized properties +struct PropertyFinder +{ + SerializedObject _so; + + public PropertyFinder(SerializedObject so) + => _so = so; + + public SerializedProperty this[string name] + => _so.FindProperty(name); +} + +} // namespace Klak.Spout.Editor diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/PluginEntry.cs.meta b/Packages/jp.keijiro.klak.spout/Editor/Utility.cs.meta similarity index 69% rename from Packages/jp.keijiro.klak.spout/Runtime/Internal/PluginEntry.cs.meta rename to Packages/jp.keijiro.klak.spout/Editor/Utility.cs.meta index 0b4efa5..c63f0d4 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/Internal/PluginEntry.cs.meta +++ b/Packages/jp.keijiro.klak.spout/Editor/Utility.cs.meta @@ -1,8 +1,7 @@ fileFormatVersion: 2 -guid: 5833bfa0ae0a90e478f1f90a455ee667 -timeCreated: 1491903743 -licenseType: Pro +guid: b0cafe26b1cd89b4ca76bb015cfd16d4 MonoImporter: + externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 diff --git a/Packages/jp.keijiro.klak.spout/LICENSE b/Packages/jp.keijiro.klak.spout/LICENSE index ba2ee04..68a49da 100644 --- a/Packages/jp.keijiro.klak.spout/LICENSE +++ b/Packages/jp.keijiro.klak.spout/LICENSE @@ -1,21 +1,24 @@ -MIT License +This is free and unencumbered software released into the public domain. -Copyright (c) 2017-2020 Keijiro Takahashi +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +For more information, please refer to diff --git a/Packages/jp.keijiro.klak.spout/LICENSE.meta b/Packages/jp.keijiro.klak.spout/LICENSE.meta index b435235..d4481d1 100644 --- a/Packages/jp.keijiro.klak.spout/LICENSE.meta +++ b/Packages/jp.keijiro.klak.spout/LICENSE.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 17418d5be502a2e79a768eb0a7dd43ed +guid: b6f63dbd21960c44aaa8fe4a6d55ad3e DefaultImporter: externalObjects: {} userData: diff --git a/Packages/jp.keijiro.klak.spout/Plugin/KlakSpout.dll b/Packages/jp.keijiro.klak.spout/Plugin/KlakSpout.dll new file mode 100644 index 0000000000000000000000000000000000000000..55a221de9608be89d2f2ee8d108f472f1f076bb0 GIT binary patch literal 966656 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

hz+1GU=;ZL8_~Palff;;PZkPj6 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 Ld)c&xF}2Cl@#+_n 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

GE8ijk`Lq1*DxGni~^OI;SxqP~WkJ`(p?r6_1 zpXvbM_VVd+ZWL)FpPql~zayV+`lzjZYQb5w-$y<*a!kqP(_KKyxO^G}rP-5D*ZqZ) z)kZ#D)|4FwW?>~9e^PgN6_n$a^|H%`c|Kw>k=V%(vjyell(X{`h*|<-> zQ%$*apPU2t$rRPOEJU*d-5J_j(SL`b@tAe9_(SMA06U1t+72qgIAJ4+@+E^q{2V0g&)p6d9|o2Dk{XaA~yT z{?yvJwV^yXz2woF8=e5y*|rztWOcz#e7lVo1iH7QW&l##@PhEODQX!0iM>3T{*RTr z>3%s^!0>VPUh!jYQT@83+T(tQhG^+fJCDK>er>SK%UX58fuzc<>5Jpq`!kk6BEx$creDPBf1b;I4J0pX!ny{A4VAd z){;ZmpYc=^%P>BN8J~$G@MDAuKDDBUr$MA~$K#wJcxJirT)-U0q1g)rFhw=}vf#$} z1755f@Yx$9G`fNE_KKcn$u+(17(UX8`S>ykSi5b zO%FUhMceDfj}Z-MKL$K;H1{|ZHFGai%QAGT{TX}4R=ae|D&QvSz&#=1;Xx}c_##+8 zG|{8+5jyRudrWCr&>XyZ3qA#;01gyqjSS_?CTKE)bqBHsnAuGExCCFTFM*ft`}WtN zQJ*3wuIJ29t}{a)isROUGb67N?h6F{g9=?AMzi>EEd=1#pil7S_NQ-o(j9l~yqJ!!Q#^o@@C+7ht zb@rxzq7DcFT533qUmo>Ic+>!TpF+{@mnx?l>R*Y*SRbFpTyPpr!yC?h(o8XXD{x<= z_5s|TcRhc>OpZ$(JOxBy&rR@i+`gQ8WGZ$wSj_`Kh-jmEfOt8Y24to*59n=ffh6Qn zuK6{Njsbl11eZ-8i3IMo*z(=oU{~WNFgvhbx#*Ai=C6=G{VuL@eQQv zR)U8`pA3z-gwhw}hA6amj{n2R6b)XY{Za969DtNxT&xU|WZC#!{4NkEG^2`DA+rB&-23G%b$+JUtB3QNi;}?}@ zOTYoYw>%4hzqONRQ-Kg$k!L+wzr8%W32!8kXQxoawv}fi{y?UgD9_d{{%^@Maoqdm zS#zfykY^8aAW7ueS(yB-$+ID18Mz++jq06UQMa8uyO%mc5_wkRzaN)p=XVx)R*WC@ zcG0%v8PB(I{bq4_HdDChTD7rE6+O#Os^2ME&JME zw9WQYlebT8Z-SMx%(@Y~_gW`R2;u^YOU(@a6D;MCTM2)by?er~wq-dl3mPf*5@PKO z$%nea)X-XNuYC#K)MmYF5W~coSnl~^_8az_NP})KRuMuwii4f%*HmFa&#L`8P<28) z9smc&m1S@t%qm!2{aN1f=0b2Yv}XGx+R-1FjW zoDj7EYM5F*gD$q&v4x_?;n=~BS(WyHjMz-+g!g?3U|C^d@x2qXQT!Im_yoYarYCij zJUElq?a9gPNpJMTEYR5}p(pz%_JsO!nEhDEew=3dvDn{_ff=zEpdOuz{NbwT;f^VY zFEa4hPJi&ikL=H!=^8G{`m+T2@YOR9p+8uV3}OGIhhtoJ$DG1JfVJVO-C^rjcSK}K zigPuZ!*6hUhf3Rb9^h8%5BQ$-yM534?@deEAJQkt0VyXoSOsP3D#QzcyyN(c;|y|O zgn&=rHu=a4cLEemcY~R{PJ}U$n>d8d;;9t;I{?|o#@OFk_Ul$;_i&&QGZ(fOTZhuF zoIQ3Z6JAV1lO&-1^)ZCqM`LxDgw$(trF~3)c-=rgbE`ksepOP-ITEP_y9&1|?Gp?Q z@h-6Cv5n|bDrX1%K`bebs+3V7J4~tl3YOqC?x;ff>ZYo_^;f%;TeaT>s`f*?<#CAB zQL~@hg0y0K9(yqL%y#&!b&G{see*6%>!j zlU-T_hZ&=QqwHYqzXSEluk8UO8l#EL2j8~%bSs=QaeVc?V!&X|OGUh?Wv@W{Aa%42 zcRo3Qa3=Z2Cw2WZjE+L=Mugg(38?IUh-(dB)GE?ioc)G%XdZ!# z1%zc=RB2-Kfei-WUMmKFbCwc+?WLh*o2$E+I(l9Y4WMzPdH^1?!EfNf!J3>)+kusB z8kG3lOzE%%@9qM!UPh+L**FML8@mUZQ`69jo}Nt1j&|$p5hL#OSb!h(#&Ir__`dKQ zDg8@z`_~Shln;~+h@iA^Tr9G9?t-jA;+{g5Ln>$4Wc?1*2?2Fno?s*)8wX?0B`IHL zJ?~08k)C4^h4&ebtPM^?j2t2Wo2A&U|%~uenfQK8Rmh zto{c?*l>uj-D6WB&jkO_<=}11xfrV@*Iy5a&x27wr111DQWQv5i%y=WJ46OLPFaC3 zc~0du!x72KVeI04x0@BQFv>3Q#X_!@P_C*=|Iuz3<2a0Q-Y^i6+m=2jJREz{@SWiF zJ=pa|7h!$+20K`;JBVp%3KgsjPOK-ubC6waaVR)w6;+J0yl%hS{&>x`Dh&3Az+_-v z_c3}h+#z5xj^bpf$DZ8g5M1>{>+`0+D?)JNMtfWeJOYG|SAcMbV+i4JWEUi@NekPH zoWIZ?9UqT|bg|u3Y$HqH@~TVX3KjGyD{>uBY%_TC*xy(I4COjz;-h!moD{lN-3a3} z6zL8l4&jK=F8z&8b*#{FrF~eDr&mGP^fx$l9VVmWb%qu_MXM0_k{5#r==wOj{x{f; zW&$jj7LlDHB@Ig~+6GI6sMy65yypG(^mohOw?}_2576WXIEm^LC%}Rg!HNGily<=2 zX!pW!!TPKA)SPw@rk~Z_c+kA%m>Ht&(SR25W6w~eOO}w{r7r2skRDMH%)~Yctp`%B zBkL6KfeSuR_Y3A;GYr~()&BDCXg1Z2bbB>kW|Ibgsc#ripGi=k8T+ei@A&je-*?Ca z_GWAFyRTP=o7Q5}O?$3B8hZqjvl*+RYL|Px$r1V`wDPUU-o&SZo>e)KVVkY!DZq#U zIMiy~k<@9}KTq)@3gt1Et44x+Ib%E?-;M>!Bcb%DZp?OL&y5*-QkGkS2q2Hmb4gQv z$y>vbJwlPw!2O~6FAe21mKH214Gx-(Ji%kTVg&{I{k&}FK&%)*Z6eQ&_Bav)!FYln zU_7hgV2wBFqnC}EUR?Vaf|<0^%-Q8weLBzzt6(C;Y4^$FD1&w1zl-h^|{)!X5H$O~(S*gb- zfmgAeHPB@wpPBw>>#PPO2)=QI?Se4)gd(L_7T$z&!S?~H>SYBshNE3h2o)?GyRUrf1b+U09+#Mh zkHvm(+P4Z8UDZb_T!jk3x@&+9s02Bpc1As?5@qdcaL&eMIOoHV{Y7ZmH%P}Bs5-v1 z{{5<5;r~%@<1k6fo(*RX1YQ9?E=@K`lLzuW3cMMpiI$|BB z^o~2|soVhK9fTt8p0*Zu_dDF3XoHd<43LO&ib3wYMgCA4$p~|ar!+EvDk4x1%gdz& z%fKWSK~o&twKUps0AQT$?1s09nb98W(7N!7uIpRyo#zfS-_gtt)tBQ}rxRH!DON+uC2+T&idgzi4XW-fP|@d#)u_JnKnwy_Q>Cu=E_U{9=))dN=r zO~N0INQ&bqdwndCvsXL+3$$gpj06}rqTR{ioH-bllxLG8N4xGvxOcie4v*~6%mm%E z5M;4v>`DAcPP_J@obwY}^L6&eC$t`8;X6qEC?6`ZGhSYStMU~06TQqUZFoUi?|x?#qHZ1wxEwi73li45!~JLx>t{yFKPG_rFj zLhgqDSn^$=o&uxQN?zaJ0*4f+bjYFZu|^4=3nn>P3vg zRRje9MduWqE1U8(JyVg19(LR*3?qXscLZc4ws9^B-nPuNsVIIli|Z*rIbl^Z1E@ z3@*B@E1C{PhbUEu%_&Z+M6#sl&O62O*JCvJH=)IH7eEsH5zVZ$^mHD zJx)atcL%M;-8~MLr98HbC^ywD#+^ND)hS!P@;1|e1+=ACwFX+QM-9fG6pHi=BTlM3 z961H5F5E#7o?PRhV`U|<0ru{qv3o*~7zP!Rs8=Qk?A(U7v~%UTRqR-gXV|f85Av~a z%45taf_8AiL>QikFc`GYVY7VfZp8?4WrNvHP)U2G@ODOfT!gkT*0a&FI@oJc{7DGt zT1<_z@2MNAPC`yw?2elQFC@g6lOg?qO#!<=y}TY{jqHkbqy%eZAIm;k)6Cq-5-&J@ zBWlH_asI{bxaT_99jk?bvj4yZq9y&|Jc}7}E@-@A?DSwFX6*uq${v>r6uLgT5?#JJ zOQ29fWphiQYA>4HOt)KXcQJr6kof=u5SJ@x2hWZCshZB z10M~EcE1i(H6F`---1$?;B8DX-aI@-?fxg|a*;h<(CJ9ITcySkd5uUHD|RQ2T0!`$ zU5p4>Eqb7=do&Grn(uKnaTJ)q$qeD0{zqxqp^|Cz&u}D%efnEz!R)FB!+}>%iJpD~ z>HP*Y`)#1g(p|a+FNPyWI5*%$qemc4Ono#CghdUtax&?t$R3#C>@96`eT55T&T&$t zpIeIkP?Y&~b$!}TaIjkn5RRUSlL*SalL&x6s~NU@BPjwnRI2YS-zyqE_F@5!x_s>Sg$&aw?_>KHCA3e>fRj?bu?q~vBK5($zSn)=GxX!)$B^nDf*;V5 zv0kyP*q(za2u@$FCcd+kuTlS&%m`R-CM|Gv_cgp^<-Eb*1UF3Lqxbnfyd)+}0ycGP z^+Dben`OczEE}e{W(wZ=vZ!zC)N}WUog7;X{$%1K8fDo2?}N#^->+X@jWCHd)t9sh zlQ>6u(&Y7|kUcpNJxL6cXx9_yZO~}esl!b_UUBUq(;vi1JP*`6j&s+u)+f)uXa8P$ zkC6J|{fpkM;k1?h-Mt+ByB0YqJd`o`o4{`~uKvDQ<29F*e=oqEksr#xx65zW+}W1j zE_^GFtvk+d@9@3l<477lE_-ODeBi{CMYzAA%q4`0ZY+w(_+dO>1#|b<4L*MMJ^5|vkL=%m+wR}N?BCA*{)u$}Tg*+1w3BcB z#u<8p;bUYqnOEf9`fw+9tSp!=4wGoGevy4?-`H3C_ zG-9y5k<4JDp|TXddA;UNi|v^97MlU;**>Xiv_BoQh^Px41YiXayn=v^H(>`_0j#sF zR-=}13-H}b#irY+UR%rJ9lE$m&1W%k^GZIA+#x^q-TVnoyQ4*3snw;MS!%eO|KibF z7HW0jW+~jwf06$-t)W(5l|XGCj{gUxLAB&k;yDR3>RZ1GN6*g?%@^x(Yt^&MQd4NF zthJhJH=s@aRobzNT=AIo%ltJ1UB@540Q>{O`pTjABkVg^RH%G(PQ^I z2z8^sA(R;Ah+5I5gcAHiP>#J$49vzO4ABJ}EAyNakfhUwEOrr@ zdK^6j4RaOHPy5^MRJ0u_X4?!DS$R5jkbyehKyO0V3F^Tgeg&2LXl__D-;FJc6I9~( z*%6H;d~-4mkdndYEl(J`A7y^<*bgKIL_2+PU?(4ci|&=XfVYQaUN zUC$rM;nqAzqjzLPra*;`M*H;Cba6I~0G=be~0ur5OQLj*M(@9T^NWy1=L0I9KNq@bO)Wm(l6cs*hYZ(;=Ok9 z|Ec#9eADc(jt@-QTXvOZmL?vzr)vOf_LTNG=wF<&zK*^qkGIiL5YhI!nda-Ji8qXP z>f4LB$>7~iEl6ZZ;S&vkbHMo=>2wVaNwu1bgh6P645-h*0R>6tAqLSYzEG<|czq*Y zH!a=G%i7s)Ge@>>#`!y%@y)RWqKYpXVP4=%9dX?sIDw8u`m-GY37%ylGi!i1(=dMm zrpRfSlNC}=e>GBE$7H9pARLXqB*suP(l&T3-1CUYidelQVu?i6Y zo-ef`x08{>H6N@K$9ANKw2SznnQ(z3SYc#V1v5Ax0iC3Az(zu(WR{FPL1 z*ydL4dMIYIs}E2QkHTsX2Jt+_ENKBRs*{nYQC;_2=;Zau9%u6L?=FIGyb7a%Kv0*X zKu&*f%U4o9*Od1}StA+s->t#(=>vaZc&6_#JnPrAgXePCvT=BxenAp=e)=W=*5@~X z=dsBiFXiJyLC79F_eX*7eB&Jr&)rP93FYm>v!eGe49~J1hUc*$?>6{()8&46c04}` zJRf)i09$=A;Q2vClE*cCyatf=;JE|^!t>_0H9TjT@---LAD-#Geqnf)?=U<+SlJGq zN5S}wj2m-m4N46$sXtOaRd|L!E-zcgy(T@X?R|4$_JyoeRwt=@C(C} z3(-5qKkou*w!zPJ%!J_a&kN5@0?$??vsEX62da`}k6ZY-FEH1G=Mg9no*%B(@Z8^& z-#~f$@Eo)MFAUG@9foHKNV5$*Z-<$Rv*^^KlH2_Tc#r z3WVp~t28{9nDWgiZy%nS`~AZ3%-CUg{^zxJ@azvc6Nl%#vy%YqJlL-4KJY;G*JO_i z`S^ZJga^+_C=i|lS88~UH|66{-ab5+?(+-7Gk1sK`B#u;8~pqXawZPXs7GYAt| z4F(TX!;?MU05ejZ0?hT`c@heQ=cYF_JdZHt4^iGeJZrGv|BLFMnL7;6;ULX6@O%(* zCJxW6Gn2scW%$6<7KkF%DcR#GeEc;a?ZNZkC=i~HysqK-jw#=b^7i4G+w&KOXZ{Yu zvy*t867>1gAZOz6d<`*#?ezI8UID-!2M<)wC3{@P$A1T;J$U{Z1;TU0YZ{)DOnD&6 z+lOZh_Uitk_*uBa@O(}@JPGjZ09`u{&$m8;}kwVyW9uQAt(@@ zomXgho@C0KmV5A&^J%zhsV!y%KS!Pj(C~-x8Imm!rHErXtElFN{FJI*CBa#x17xk8 zTk^zXtHYz50eA)RqI6r$n1UotvLB#F>0iHYEt-i<0a4p<3%wr2JkG z`={C&0#;8h{`LG>x!U-J1Ixsw88e?A9oVc#Vq=E-6zQ@s;YX%aXCqEvd@4@-3?c1W zTFUbXXhkBwM)^_;x|wUXYE34N76zw%LJvYHGL^^HqiX}xt-b>@g0Kx$s4d z$OzTK_D7pbubN3$n7y&JtW3_f-^fm202jmufSAmb>eSjr9orbz*Mnxr*y2Mnabu=I ziw9DqA>%#1^VJRKOY@hbN3jQVJq@4g{O9?B*aMT@j`-hub$pJzmx}k;twX(TRUIVn zITz!JZci#s_zoX0P!F-T*5GZM5ZC5>A)%b}R2X+j0UeiW3g~CbU%aX* zK%dV9^v@KBQCsvU?vK#8zaMbFWB_7fHR8hw#;`!AFNSLHzVS~U-Vc8ect69B_e}|S z-x!;wcCP^5yZ)+t*Nvsop4*;?mWR2^`m^sW4EN_D!BNw~)VZ!DO-Wt3I z)RW=;BOJuE6njp==IRrO>nRPu+5y=>TcEEWb+0}N{y>)ku0At3Ej>7G4$>di5hbk1 zfNZPpfZVHQTPB~*Xy8Zn^Uh!oUtD}6;#Y@cB!QmGYu9x|WkoI8P-^fINPKpbj( zMdQ%s({%Z1ls(2}F3fssBF~EZ@esSVPUY|JPG#PQmC zA?;g~arOR~3OzMN=^=RUWM!+NTkKCRe+X!9Q=Og&^q6hWi7knPY}c|RAbVs!V6ql6 zM}0gr$>WK9ybi#04#R8^WUr$@kVXHcK{nr%Z$LQ#WJ%%0H4I`u*ClsNH^2(kJqj!( zV$nw)xiwX@ZZrHtipjDCHH*@Vu{{TFc5y8-h!@UPHy#XB4mcFqjYO(9k?=LmLq9g1 zT8?#zRl5$$RNWS&BJnYX)5_LND+WweN2>RSfZIe;J@=)BMTeSs0K*!<5A?&9Q>teP ziN^k_p7U4NA5o{W`mNwc1lYrPjQ|_DSOe@%Qx2o-2bhMJm55&kUMCY?Yp_ojeB$Jk zs_VA~t6c?D^DM$e;DKB`t+y z#%=~vHy49>7sz4gS0ESrgL*MZ-E!8w<8(dnzvCSaeAFU6@cT`97|Iwp*Y|XcmXZIU zCA|r<4S#$OS=od?Rvk1v3gHeipmlsh(zz#(DWtl=*X#= zwTn8dUBC|#>c(m1-Eb0OxNZ(c_Z(P;YE1U{Y(Aa_bZ~xWXyq{!2!Zn#Y6$$nlut!@ z@(!=xKlG1;<&5t5jBh!k6N^8?at2ZXU?F2$>-REyF1~8I7Cb!~JAE{sp57Kukv^+X z@G=*8S=A3qxU~jZwU$t2sf$i&kAi{Ofb2-%8}~hE{A)^r(*cza!V{eSo7yi)J2M;6 z&KDF7pvx|3kCQX6Sx?S4m{XRgqD;D!^|T6}u2_aHkMvkArS_7WP1yd8ivlkR64W5Fw;DMDQ;LuQ# z?PCB64;LfATFWvGaDo~xWfBVme%u}|N8!7%RdKlN5lRA=Cud>c3M@%|&dj-BEFQ<_ zg4HBGb^x*1WWwcLToEq!%-3*v)s!cqY~Z4~S-H!n({p;d*js`8f5m}AtsQ=;~+N<+NbO8 zg}KD&k4&k`A;=j6RvKstMH)y5%&v!w>yY~eMQK;>Wz{OEqeX~xXrWQ$(gE=8dBPS) z0#LZE^|gc4UzylSU%M!vj=;C$FUE19^PnV?{g)Rp__x3h)JFr8JidvK-v-d+G*g0S zDGCHn!(0uXMpGV#vP&kyKXP4k&@0)*2Lgn;Vi)W%7En}ojd#?;=VW@Is|0yUV8VNV zi_rt$ZA%gz)Bzy#*u8Nuw3Z|p=Y20=oUelysFq}pf5*pf0DewbPCv`Ar z)>-9_o7f>;U=qCFO5#m+s$l6g$D%JXXeSfRy7~|ruKIiYWAbY3zIZ+m*PcVhEB*3& z@+HVl4AY_K!L>hp4v)H%aGx+E>|!?wJYBoap5xqzCivY>r8vYR4Y@&s^*wP*`V~jc z3kD=X&TnS``|`nd)qrG=-{Io|pslmO_y-O{fynv(%NjZNHRab(CXKe)zc?Bg3iT5L ztcbcvQF|mkk5oGX8;9XKAd*&PomW`5sT#yg{xmv{q_RmkrR_Z@_6>nA^Vl#lYbZ6? zQsbuz!59yTpQ8i?W4ZRF-@^6CW!%?lza$oeM2Y?vpuHFxcv`=-Nf#an# z>m@`?VRLjTGtVrLykkQeL$x@!anhM2gjuI&4GkkGq>u*&=QB_Q(IAKsQ7c9v@*Cer z_8Pf2hX+{{GEYT5PpGIz0<)4iOzp?R1cs!S;w7LxHa-s)`og&iuLN(4`;kfuz75v@ z0gt4g>>vAiDSktO|6hi1#J2p^IN2Dgi=RH!ESMjxdj(a%6RJ81{)Hese7YFSnG>G} zF>?-d(*HG>3 zfF7$iSv=xGlik2{=Rd$Z;(NSa!J=!f(KUw$rv>B-PNC2NrtKK?!}mQQ zEls4rlg`-P-CAbpSGwXA@0Rlxk=#@ePh;IH@*LBF$!D$<@BK38Y*fb3gZ0!&oc-{R zls?BB&Mt201C~C;KXE!-eR2{ytbPuJ_B6z#dLh~45q$hi5$Ny(pgU#d!zhprN4}`( z@J>?>qwLB`p+|2&8&saA00Pfsmn-xqy37L0pj5&G*(V&ik>QD@NH}#YWW72_r`hDx zmKY;nYF71zixo6zl9D<5fkB9TK+WpTn~Hj-SNCq}9EjI|BcTQjLvOexTCs*lCmkux&j5577_3vJv$ zK|C1|uVyu}_M|$4Faw%T?u0G+Mudyyq!l+R(~CMdM@Ti;0XP>)>WOJTF@`ow85WUj zv<$4WBGN%_Q_djO)t`fxW7FJzIb%>%m(oD;G{%3Q*j{72) zzxMO{_%oQn5Bg(%H}v&AHS>EbpMHdi_vUvs3Y_2DXXyD|WXd<8jQRZ;)|;%GJ-_?g zw`_mC=?_rDJ(ki&zFVS!VuL~QRi~4g4lFopqpJS8wH0dl$tl75TS(YgC8=)eY*wGD zlX~XofD*J4U?nI4j4?*&Cd`;%T`T0evQJ3DP_v!}oF{O4WQhayv|go`d%*G@j@?53 zP#ByxAM)WaE&8ZCJRyGK(#Q>v_Lsp-`YH@jTl)nBT`43tR=P@%m!OPGT@%iC4#I7% zAKNR7d8V49)}IYQkGvmsk8z;bC7crr*8hpufpR`w+qm@{sAYZf>NZ;A? zq`tV}p}X7;)_291^uk{%t~|JwIqyQm39>+himtrqavQ!jk&XX}!bDlC&PD9xxc(dMM+)+M< z1QJtuE~&jhY;9Z;b;#+ZT@pu-wA#BQPWD_9`<_tVTHVGkVb&lDA(sQeX)BCZ;yqte zKCi^RPq~~zUUS*=0qTn5l7MEHCjgofFj-ZW>~ZYxcswv444Mnm1XBSDWY8P`slk+E z%4<<}_oL;yhK;+G2wOxw7Y&ygsx}#TR3ld}c2mLiBCfW!zT8Mr1`JHsx6; zyO^YZ6ZfaV34qKDvOlfc{qg;292@^C^`9va%PC9q)l5#rLOq?I!F`W3SBqG$D;00e3( zhBzQyeQ+O9)KO19-3B1;dQE0H`Wr&S>_h8>`rNI@O=9jxqMiOWEDnX{S{F*#k`?dp z_I9Rm&y2erXEFvoSyXk?b8aj9`@8J9yR9r;9V$Ivt3H29dhYA*`Rp%&SN;cfHg7qu z<9+@5w4b!E??2Y2uY_{zJBd)9fQ}H#gLGesabA8OBy&CuOE2(!B5?}VtC-!R`>x(b zFCacQdch|JbO{Hr3v7$3xI=JcDdrsy)W*O0aU>3X{~ksfQSEW0g)L|tX}ezwT01)y zCTZD$!FG3~0mkku?bx(Zk=b(nqy7y*UVUx|WBmZPNcpP2kWgK(w`78XE;*I+fdGY0 z3*QD;q{}n}R4~bd1y2L&qvRc=fk?J3_Kg?ULflzD(A+%@^&UN9x z_2)WYe7@ej#4LS~8%NM5)_;RYj3cn-#i*JgBKxqw1<%-e|2nN&wE{NUG^9L(u&5eZ zhcsiNIK+BU4)9fM_+x+ah02Y-mn;^h45*V>wJ@b-i>&v5S39S33`)1V9jOOUgB_A) zjLS$p{V?Q03<5)KIwHyA-}CXuxeyzd8nN*%3S=Pn{9TKUS50{$$_C2LK8q6egF9z0 zPAuR5uf+12R}#znyqZv^K9gjB(^x`$>AwZyV-X2Q<&fjULfJT60@af38M_xx^iDBv zY1PS}T!=?UB4l;1#EPnh%d zk_31=eU~Pdf43~5ysh~t{KT7&Kkv|dy!Nxs2WR8Nl$zGo8~VTwnaL{{6XPoFT`@;_ ziO~1fCr)ggkdiXK058nom3|==xd2~nGlMHY9f@s-U0G?T#-^w}p_#|$^4>#}%;nL4 z!DL;26z1~UWRJV^@fDb5j>0*`5a7AE!TH?tQ9YkSOt~}4WF!iPgsmY99&WE)u%ROShYnAqeIqOE0S)d z;-~?8?xw;-W{R6uqWO0joR+OMs(z0;3?r-hTvJ%{_M5xlfWA`O5Z6<_k8k4Rw=q}FZe})?q7b`}CPx#mWCGm%(a>9#SgCq{ES zO8yMs)qwk`NV3NV^YM+Cl-NXqb1benX-EE5qxr?Ad;rQu&bU7^oEWRH*FV;k5OyP4yjfGdvs_=okluQ269P&Nbh#@l9~ zhlce)nZK07L|WAlAYw0P=m^Id4;?|8NOzEx5-)D#k{RC?pkTa4e0<9fPBOmB{)hoQ z3NECcP4;*QA3uf}*Ksuu;ELlr;~_o1+e~>7%HH@G4QEj;ZB7zAA{Om3nOX#j$kcjA zB*?h&qJPBTO8`Z?KoK1p=(+vBJP7RC4R$mp^&PNp)sn+7vQfgA3IN#;C*oB~3E>Aw#7Y;Qa*VS7Q{OY4H&8NP_lsy#+WKd)QllvOv+SQiH%{-nqdwBQ$uz0sf8+wORhx4+wuXnzh!BHlh!0$RMV-L-t7{Z0=V zFt@3C7q6ovJ4!}3AeSqVoGj9p%!9jrA^jd5jv^wEoX?QVM)fg#v7nbS*Z>iaU6;cn z@Lo9bce+_%PzCEwBUQby7Dd#1hX2lrwBQH1o+uq=;D7j*PtPhu!gdOXTx|0|N*72A zdp(c1h4ety`jQlgjm$95_N&UuhD#kEwo-Uvkf+-V4-KekKyOlKxi^V=2D8)?h|RN0zYr=3|=5YrfTN%a?Adz zsC6l~E8nL91tK z4AA4laO58zdYn!4n5EHU8V*yLj;g^~lUnd&Mec5kAvmCAyBLDCA|OcmRuSYbcwmwv zNCaV<+dz;z(WmwZ64!^rky+cqlbbmv!4pYW20Rg9=+j*efSpP_S@|0mPcFawN8rgb z_W)1Ih$lNyjCR03aXhKpKM9^3a3^N{EQni!C!d0G5>F1fA9!+FvNt|~(@9ytAm<+j zPx_*u@g$E|E}pnd-NhGb8Dki8Tp>IK0=P1mj&lQWh{r~C56+f0OoeG?G}g3ZD#M92 zE>oF`dOwb-e8%1YY4W#O_{`>XoxGU@`Y@9a$>; z$nx^mk);9>Xw9YCOer%`sEkR_3ymBqryRn!3n`zF%4ofjN!a@V#2KAb9329>BI1l| zCyw?*fcG{KhjBiFGauK)aYoCNABHzPTf>t_V=i*>rt@#V58hxHet8rE4{$~hZytb% zQTO4WINt2LcM`mrejBjhGq4B4XC`8?k9_9kyMZ_BdnS3Ko^Q151H74P@MZ-H8gCZz z%EcR(za;7_p1N}4e>~3Ox-5;T_Nyzy{K&$D5RlbsT`_}l%cQ0%cJ;+zu z3!@){AA9@pqimFmA0L9l{9wM41De--WdcNtx{l_YG5wBG-|UrSw(p5zwwF`hXnp14 zFEoBUa3}C%QL;BK;v0>?9FMO&i-N|F$9T1a__5#TzZiaGZWTWikUzQHd1vM?i66P= zyZF%rPV$5CV`mIcD$DRpVi(;KhMRFN5Dyb zFn&0<0zbswIk^|`;{^N@$B!4gCBcs~Y|QrUlspVWcbb2SXhyRF3>1`+=KP!H080q52&EO1v7YaS>s&ZC9Rn^3NZy!WE6? zc+3hSDB}s0Rm+u_<)~!O=4h_GnUk(_YB&3mG0Pok*cP`%aJpEfZg0c^WCC0mG_vSL z@vWNBoHR8UBcY>kk0^bs?)nwuaX4HPk5he3LOhNc=Eb@3VK&RR&G?cH)i=!e7!e$l zrqVDO?c#6_ly16lIBDu3^ng&f% zP_+_4-6aX0m5l~bM8z5bX{=T$YzP-G!6cC5x*ChOs%@#-zP7eitAh6?ToMp3T)d+a zz{}YzYS4;-D*1oEGjndcn-B#1zQ6yc`Fvo{WzI9tJoDVSAMiO2GTE$Un#|lzgla}|~?4o=f zZx8UKr5sjZ*$U>^oJ~5=`8?74qwe`|D}NtH*o8QG#Px7uerAVp)2G5a&rb=B6k%l~ z2#DYi1A>@XiOPAJJ4Hge@#SNn3eLeDAaZVEm&$x*=J$-FDI6I$7SA^BK&~fDVJFk& zKa~{W%$1n9G4p~jR8#>fv8h8}B$tc?zs2sC^)Y^ns+{BH!F>IMa!qbUlc*C`E^^L~ zf6^z3)ml&m8}tIKlhJIx?m-E{+zZ!=PvPqq4}ysrf8;|2g&X50zSE3ueOE*Nd zR-5F}tGC-XC;|02a?|mMZ(z3ef}CvQdYDFtfptXfSKdq3L{GE7iH6}@IT$2*KYVfL z{nc^r=eysNG!W!)kteIV<(%qvU#MSodqyb3`_B#0e0+-I$D+9o5WFAh01+LBv7xiR zOA$+O+;bW0O>mNdGU8{fGOLr!up?MK*y^F5#;k!{=$ zhXo-S4abLgj$mh`;cPJ)To`i;T#gV;%Z`3I$&PF)Ix>rjl8ea9^XA>};%w6zT%!m{1w7 zLfVB{53BI;FtlNvK^4>OHJ}K?2{?TE9g$BbF^Rn_;t785(jGZ=SWWx9gSfaf>z9=y zU>3r;YimMN)VXW#8l&PcIg^+i-32C6ZfrcB%M%odz2e5>MI7CeZ%MQ{l(|L+)n9p-u=MmmVx_3pD=XFe$l5-=lGm71^DcS zyKMIt?CGD2d!$%mi1VbmIymIT8kUOG74^~QkK`YOWp6G z|8j*+Ds9sWN{xi`*&*iz*anjBXD-i0Fh-@LO=EjOzrM*}n7Zu)cxotN;0L{787#V|@m#o}P*BTzB+D%s<~S=8dd zY@^UwuSyXs;(;7k&sCQujUg}+Z|v@j*LP=NA(_cdN%h?;$Ly=VqXuRdafu96DhC|c zYQTrXm~dKsX3*0jh$2)P@Qpu*X|i0XtCX~(GzfU_&p<$~XK}R0()Z%1RMc>=mWFzT za_2mMJp6C5Wu(IhSY=I+(W^a9_OGXX>fm8unXo0~_i^s`ZPorvobc_>QWE006d)l# zSB-JVPqROh5G{GaJ=J>rJVcMb@0AS)T zc?ky)iiOe4{OHX^`1)$&d|D6gvao{I4dROfzbVNlK$UBeiCM;uVLXhur?PH^0`}g;^*^>t>!$Xvq>sC6Jp+tziA^BAf<`-7VJQBd!r3lzy70P0A;1b^@Qgf$bI@ zd}0-q>&L*~7=UdAJcue_4Q39NDRa~TCz|;|lK(PICxo_tt_yVBmk^vHe1qLIVE}aJ5T1K_>Iy7l^_`kk7L*ci?R$Clp?LV9?A{lCs z|2ASQfr57`=U~ZluwX3?r+$|n!FYjUIZ*sS8&&Q+V7--?K8~#zCB;tz%}gSNe#~)1 z&5?0LF9))@CX>nq;?zstr9JCBu{Sa64PJeAl2CDzE&>I&JuFz(ah_l!vW9H`M*0v% zhz-H#zryx*;O1!Id4`tP4vkxRndaH7jhaW)$F#%3^;Javx}S-?FqPp#ji@hlrnR`CkBTR*eV5Vr~(#y zihhv#j?iNdpw8JRlF#19`aC1(g4?-xGV??$Y z5zvoN_D?KXw(XyJKD{v&X&}()F~@nTM#ndZw5&9%7Qa$gV#OJ@lS0CJsUbEdT31rA zx`Zdf7i@rT^DL(wh#oC64c3*w*NF_$E)=4126h!SRwMJ?1nQ8F9a27oc7=3%ARFvi zDJTvBDOg^q!GXd^;&p7(NRlFh5qgsp&Njv1sl!aSU&i1}{y@io^+n$^GzUu0CrWo= z03uK-32PZ8h|v!3A02_vlS#8(y6hX1y*N+Eng25G*q6A&C4MF+)faAI~)4Q z#^-8jXJRWE(fq+^K6H_?!Q0iz8RvHbfrS%*z>=N`>}AhKPz4-U^W76C3<2)ZRt^B_O+pu++MYbp;HG(D9Z_9s+g%s>sX2b5o1@bb)K z#QQ7x9?KsP^m*ARL6PWe7*b)k#KOa1-sfUq_){9qzBGinD5R0LP{0ERqryO5n{f4C zhAZK%ISrp1JqYLo6Hsg;^n<6)Bl2OgY{+21>sQ`E`ujrLXwOdBRt0Cu+Yyo;--b4V#UZ(&9P1lkouurE#9V>}P3Z zT;qd_8H2Rqlu7iXGD&vJH8A$6m@sQxl z0SqRk3p*LTdXOug#I14k{?_n#pT|1~F}!IJQ|J{N7;s3af7?J;{lPq}?+EA{g2VfR zj#w`g?SqhsLLNURe~uLT3mV!l_-P$8(9+W9SB3K%L;AOjq_Bs4hkgJcf1Q|;`=_X z_pA?OnPExsfHJq;wFuuE$hg&PMVl4?E- zlBnb$(T;eSl;}2N=phLb4Z9@dc@+6wM(4ortwHc%4}=s*Fw35(4ipBd2_ZmZ-T>O9 zcV)OuG>6e$9{zX9FMV%}OauT+g#LhaQBP@b+U=t}F z7zjRVHI76Zq-m0@re?-K7wC|Z$OUIWlMT!Y6m0M=+(^7515bu`g;C?oi!j6sc)knd zeJ$&f^%^gN`2*pBIRRL+pr;i(;Az#Y^N;)*nEVD3&(q_RA<)k5} z0--d(AtkU@mtcm?*(w}+ZA@fX65z096&x>F33d#i@U$8MfS2B<-`iLW_tSfO77SS+ zQeqf?`wY1z+^x`}SKg}V>5hA8Hx1Yw&zLz^AU3Q}gliX2jrSI(S};Jp$pu!SG}pyBZz`D}e9{j3W%A2vocS z1`w9)P`CwH8IS29p2Nz)L-hB6B@NJ(Km~{eiDwjP?v_5FzNRnheQ7daa#cSRrXv8d zq4MA&EVdxP+-Qd(;7N};MK-c88+o?{Qh3KB8PI``IBI+w=3l5v3YH^^2Qw1Q68KpP@&%>4JdEBOHe`V6^wDu24z2BbXEh!BK_rPfA8*& z`XVtaVUa6-KUXpJ8!iXcUMq==&g22X;Zn#WHd9#(`PDq12lKwu3f`(5APlwlwg<@Q zL>8qut4&Y29rLvTPFa;<(h$;!$b`5SlJO|fms-F6VD6;$S;Z(&!$q)pL4BAX%Q8i{ zFMxDp!{5~76w^ZBRBXzv+%NW=NbsbrVA`ml2lEi$c|t!A=sAJd3p z%Sx^_h}~w%aWD9XJkv*fC*%lVqD6ROlh+<^kVfU40Kl*&a)XB<95~%RGswU|Xgx&* z>)XJ!zPeMe2~wIBfOhXO1*uVZ9vpmo}02fJD7ced6EpEuQmG^2FDi-StgWb zpU84)Vk!EYobOHc{px71h%V$z`a=ssm66Og_b zmZkHVRu2PL6>ltq^~i2umn~K#Z#icFd7$` zMr#8yIxc}TB;GLR;I?Xyg3JC@puYaZ1ZAgs35c@)soweo^#)Km7!DX1m-P-}P&iQY zVCb;MsC4ugqQwnRJ>{4L1;sun1jWjcFmJNFY_EVP6s5i#9ya`CX!Z3$1S&i)b4)TA zb1<}c)ELHK3pxnF!ER(w9|`>?Lhs{%ZpQb!1E2damlFGDw>a7^;r|8OvjY302>&nj zHukpvifx>SYT=m~^cLWX=&xhIYBBxo-5kcEG6`hPJ zA}9Bm{VUw3t;SuwCI7u5`L8f5wjB8Ulla{7wG$t+e-TH_JY>o++STPUx*jr&o=~ zj|1Pm*dNP2{KkS0+bHeBEfRjmXu!Y41>ctMuI$6k%|v-W>_bIbGW+m*w)YobBx|p< z4+ppGEB|$FAATa*ASEc#KCDdrA?(9TAChji)OOoG6ialzzkMi*t9c*w@hVR;eeuO8 z^w)D3g4_IQ^AG)7(>^BJtEWD2Q(_ET$Umt#IEdff+3 z)I}q@EPqyF`2#<{`DMp0#BjKAs*195I2g@=Jtcxa*nHiSLQA;k>&|;WVZKi0U)Zy3 z2;>=cuthTJ#GS8fUa;}S-cpEjaUiW`;B+`lMj7&mnTSxACBM$a^k&@W*7^rdmsvS4 zee6^oIl{D)eh&gnNBkGAtr${TU=#B*Zr+oO-qRp2#6LO?YQoVZyX8?oi&*?Ff&_CA z?%|GckxC4JXE+DIV!r8iByY>j6H1M`Be1KtI|-v`q(>zLsNf~)Rr3q}XL?=b#ip(s zMc@=0!G`-9jaOl{45p_sQN%g4z&AKN$GCnC1QoN*$eKq)tsx{`O?$pW&IQduutLcN+i!+21MUvKm;*wOd0O1%Wz><=Rca@3%tH*kjxi?_fK{I1d+FvH= zVT{JvwZ(wbhW`F%Pz!q!VQEj;K1z(VLE3m>I~ z2jD87SNQd*-%|cI`zG;6FP%&Eh|U>M7ztoY19kf#Zmb-~nW2!ddvp!U8M zSZ>9r2j(N6odE#Ghws2%M*97zZ#p=|jF{*ds4tThn3zo0OS6GA?{n326R(l#-lu*w z^(*j1d4XuNuZ)kIeAj`*g_+Uqdn}nT!+TOzzxT(p& z{Z4_~dBMK5x2avW_uyne0}ALL2-L)naz&nzA|?7Tn)wz(>7pOgamjxCrGFdMHas*Q?2>}NUjdT+(R*#c+kxQ1Zfa9#(A#mDvmXtkPnPMziBNF6ZtXGN6J!h zsD+F-b*zhRQ#jm#$HXBz0ZV%@n~ckA@o7N+Al71O_`S*ZyJYV7mG5Era-ZdU z&l^I%FY5JwSiW0#b|K&2{Y>`Bh36{Jxy>Hf5Pr{A>U&a z(4_Kxu>$(Ucn80CuFrOVE!&$^zWXUyR}vQg_S)V@6}Y7G{nBNUe21Fg9Pqko??eSO zseE6hfHsyo+M7(i^EX)XeGD!sP!WFP{A2q}`L4gdOZh%DUcTi6W6k@0e-5F<<*^6_lxQB=84T_oSr*D|#$I zA;Ee#`Lc<#c)Py_d>$%*0gqV*+{vE}N$vN%uOz=GwckT7m3>liZg=^8xB{0{zF)gU zf;-j(*G+zZ>r07aQu&^%fUYlb@O$U-eT#yXRK8D8uxbg5e@^-()n}s=xTNy^;l;AO zKQ+NQ;B_V6pX`wBO)B5I0=gyWXm2w4E`80C?_yk1w*JO%oPSRFZkW@Re9t^gw8ggH ze~=H1=&Nz^ZA?lk-|O+1IOG8bCEtI?r`?n9KVfTKNYZcdlU%+R|B590zVdw~zutHG zJ`?x@tG7Fd)&EiX?$aiDDXDy)agpqkyUyt@zd!$l1ea94KSv@6yLhY#uABTmT>(uh z-@j2ncLW^#-no1qreGzN?-B*;kA%g)y~_96&t-d)%J-fNWqT)@;2iL}lJD6HXj1w9 zvjXaIwl|r4&v@CA?<;Xh!oR9@A>VDGuH<{lk)kcOeBU7-7`+8-G18X)c?J+n;-Bxh zKoTPW9F%;&wq~#LJua1jh#{w41~Nzboy;G7k`GUYizkEniYJcuWn%$nO$6_TbX-cp*O$wZ@?BlNEcvN;cQ3+eEcvx8IYXA*ChqEdywmIFh@X3__#;9m z&(`D8_)|0Va=72^vuwQ_8INOwRMUX62^{HP?{g$fVN$R&u z{g$iW8R~bA{H?0uFaEUVsycba%X<6rUi)&1effxe`M7=gjD6W)U#_+<*V&iv*q1H# zrD0#T*_ZA1WeNz$KOjlgP?wqZCA(TZWzVWhcB{H%FRDv+p}J&`sY}hiEVVBu*_UPZ zB^gA0Hp9MTzpJNJ>awY-j#t9}eH7ayOE1T%-y3ZISH_wykCF#H#?Q}7MSM+!VT-Uw z$0U9oAIUnTRBE@Y3tbvk=99`bDq_qFMU4&cvA_XQGBX|}YukY&R@S!bT&ZZ~n#tIw zyE>3feH@SD%tpo{qh@bopI{;&ma2#xP%Hn2O1>VSXptERsqZjuT?tO-+5x04wHhDd zO@Nubv8PqgWHOq@Z=M=MrQB$|zX}=|d#Ge%p>L=Ux0XmZvH-()@)coBjI|J**eXdp zmwimIXR=j?t5yv|s~j{$Ds>_aUzaU6jsr5PhA#W(pPx#KHJ7+xGbuNre`YDzYyB2% zR7V(ZNE%iLT{H}}C!yg<3YkSdi-t1(PVWOtazPd|;Qp^h z8E`lI4}swRs0rb}Y!#&+fC>Wzt3v%41Vo-v)OZ}fuhR9JBBHlz)znBeJv zG92S66viR7DaP*sf*&rzhXI@dl4V>bo)8HcqPzk3BF_iK5Gs7n^1lFS!N)FqZic7f z#wR-&KBMCBxgSF@6Cba_=NoKKE%A93K%F7e&v5U;Cm|lG{GD?yM7Kox1^6TVog(pM zP+##x_&YxNlKxJid|HN2#L78+68)X=@+tkDNwO^colC`~>F-=F?ks=jC9E{F{T+dY zZu&a{1570-f9H>~D9sa~o+hC#5qJGYNT^PK=V0;ZUK%SD&z8k$uYlc9acBBF-%7x= zS}2(#OVV(meS3?v1(jo6wjim$Gwf`sd*`2S*@Atvr$?*WdZRXIP-Rd5{b8a#-HX4o z1fQ7x&I8!N+qS2lCx(V;Gzs_^`&P7x%4y9{oVlaB-oF zhDrUMvlKG-pn+!paQBbwM1Q9Ta1!)Y`-8y0@S`S&zcUmSy8VlWXOj3k!#BJAol7wW zG5w3j0D}B-4?dLs#V^GZ+uw=c-sN97{I4h8cj5EvG4c51C&TCd58e2zg+FiNbCklT zmxa#<0P6I2zQcVoe6UU@{f;T<32Xq$1rki$cr||M#p?IK9awsywwv5y9Q6+_%qhnH zpX#t!v8iL!=v5>l%*Gd|TK%ND%l7xe=|`*jg4|pc(>x+sMC?oZ%|I;4G<`;-P>Lz- ze-z4)*?lgca(!0%n^#EO0R(9+K&UapSpS-GnXP0bAmO0@_)UWIz&oPS2hHNne26nt zrN@|+3jaDE+;oWjbvTeA(%8(Lx5GImOcP&{6Y`nwvJ_|T9))=(u^vM#3i|RXtp0h^ zg16#53!8X&ShZ%t`P%QV3SjJxf$1ZRy3YfGO{BO#KAWI~WVa$8cnLTEW7p(V} zxZg|pA%7gLXxu4(Jn~K)e{?*i_#>QNRAw?4k_+P4Z^G>APGwp9pZ60@&9L(CW{x zq+TPm`2H09vCStMt@z`@r_6rkdL6+Z8z5W`{&=W!cn;^^ zm}_fwakf}|g>rZUl!LdPRUSRU} zVObRCt3=~m?Ljtz{{_53k|+`zv1}V#=H)F9omb>tno?ZTF!wzF3wYV#uWE0ceLDW% zTzMgvoO)}j!D%R@d5ZOy{nc9={8hWFDzf~IEj`bUJe*O5Q@V=_w$1DXgT=KdMS2T! zET;qi22ZhfX^Z2T;8TG9qH?A}1&lNMRqxVLkE&c>@2}p18g^AxEJeYViu9`8zn}dm zt520hoJcGN5(hPI?OEhmJ~r}jpQ_C}h>G{-Ic#Nh1DMVuHV!fC{g-#qWo)7(L-p=7 z??Uot()zu%KatdEtLR;|`*!cbVe5_%sxtASH1PDMx$r-@~Ubq zA?DtgsR7;d42?kDcn|Yl@iCNkC30pV^{EoW6XRMq(jD$NE( zT~q_0Dah6##LSe+2Ngt#Oxo;U6W)MoBa`q5*@Tn?dMcpzu%V|p9Kh<`H&qT}?s$Pe z!&|clH3lO->chHB(JUZRMLZNyd_nB*DTq>{i1J|o`OlCNBGD66K>{?ufleS&0w|xN z&+KxmUB6QhCA_rRw>jXkd4LBU9sp9R64g?F9R@GX=RG9_@H{%7>O|rlhc67|@p$Q| zgI$6;V*ikN%_ABd#DRpH>vsaos=pwoyhvYF1S48*EJh4n3(tk8-anwfyx=>_V0#O( z3cVeBB53Q4(2Q^>ryTndWdy=~t3UC?jxP9MW-(k#B%3#ab+8dz-|4!4kNv?}fr8bc zbG*w^k@Y^^-`JQ@yVLJ2YAlM>rR4Iggm+-Mc6IcsT=op+o#{C;RsS;E-l_b0J`?&@ zbfQ&E?57#N7)WD0gAKwrVy~*u^+nkIBs_rV71eu}rHHyZI+%68s{;~Td{QapBg zV*`-!7OkGH_X&h?@WUk;Sa6++ZPNn!Av8My9nQ{*&tqv4?>#cc{%@0q=Alf7C z{ok+@IyB9XCDiB|d<_y3Yml&^1j35#WvBafPq5%qZw*iG)J7d5&#A@S(@!90)$Mz{ zHH~;tu*!S$dR0R(+*f#Yvme4n50Xt&D}N*i8`OaxctA{bU5xjpa} z07vK0x%&nd$d3bl=-x41E>OJ^yD%Re-7Jh%3Y?@FA}gPhZ~~O%ZEomb2au2(1t)~0Ummn`BK4}IUOC6S1PY)+}g+g z9C^>5CfqXw3j!vUY{7f8pLDihMZHBWwXVwKceamw1^+D5QU#Az-))-}iiA)M@Jt#>Tq9OZiB1fN{q(o?G*l@c1DYIp3vizp$t7I+%tV-1@R zz|GyH>F+cZW?(SDr4gJ@!K?!aEZ}``7T2{cXSpkb;WW6#6_;t)nFF#;O^k5|{6b=k zQ;tVZ30-y5d83DiW{tk0;`C>(K#A$P2ODEhm#_?$!EC~YE~vj_(8D`=B8~-33x72gb3_qVJ2 znesk*J($uKU#wT@9bH0Nt3Nq^#Qg+%bF$V~H9sSz;xLdz!#pkiBvowrHLk|T>K%xY z$&!L_N}rn)H{m<=#R+G%vC*$%sTR06)|c(*c(ZzBkBTAWK<>xr2RQvp#O)qfja64u zTX4v8=zX@uOsg)Cq}o`)V@-Jm%Bd-6P{&*0+>W=J*)=J# z-qY(l-Xi_-xP8hRvxCJ6eSFGU~8hgd&0ks^p;KR6!b z+df(fP_IDs=$w=gHlq7TExzMYbc|Q@<;V*7yoqsF1R21)ANZS!axy&7p>JWg3I8)a zfEhPgXf)=46tPCL+37~rpCHfSp{_>D`E%83#6@34AEGCN`sk7uHu*(wgf_=Bk$^9ISn^9b=xumd6I4jH z-q9LwIJWOuH5YP@4a2eLX7pZ=%;Z0*|HOU? zu^(en=sdW*@Y%;?VlNl&myg>qnL*u;^nISYm8vz5$spD72rDKtQyli^EAMq< zGQIu%nX!$cO0_=(OwKy)&>smfoQ)mtH2q-gAR>41xK88o=-8jcTba*YN-7RhyMO?b zpJi}6U=Sc*9{t1}E~Bwr2#56Fki$bB!=73VMm-jyX*zcNZ)A)LI$|s;!|KqjM$eT{ z>R>DAv4dlOLEPrb(-5~wc|1PagLt&ujT~Dx%tT9hEE|yMi_K!FB|L3%mzZlc>{$hb z_joH28{Ffm7_7E=LD^YAc!Z6xhW-0mUHD>SYlUwM7Lt+YEPM-rZyWKQxPthy4(ucL zDDZvyr@*%qCrFw7X#V~u@y+iP-#;yn!#ADyF8O;RzHs!xL`L)@m@&3N@LMya7k}Wp zCM;-l`9F|nxEEl=)!c5XG5P{FN~OLs3z_x_Ly0g(Gu%~Cixh%UacUvFy7CgpZf3Ax zP3X*kJ}{>QnOm79h!kdU>1Y6P)l7N?r?884tWH56Hx~+Auwx~dPOQildRTnz{!sK> zY^~JOR62)nlpY#l+}jA-F2-C3<%r70G-25=yYhF~Z>$g_X7g>V#g@mRmvd^U1+_X? zkux3+>jAZpt?6%KtJe`5!0J@5ss9GdNc#NcG9F%aLrP)A;Hn!uDHVqhhOq8_j>4)) z+h?&aD2ku)05<*8^v}QgllPv6BU0cHZ!C!*qlk9MpPQNj*qYwTyKTp%ia8$(kec?n z^jj{{jv5agE|e;$9-ZWH!FaDZ?q&Oc=f*~JKE=oqAhyVsMq3|natTWQS(c3MKm)~m zgKED>S!WmPZ(1|*C2tF;#@EMUvJTyYhHRm|&Pp*-Q463w4`?*y-K5Vo-*!r$qd^gy zJ}Xe84C9*=iq->RMWs`}lT^ClFq$o%dHAHpc|kOq6M8*zj5I(a9WO-*Q4 z_fbG~t&_g&Uk^7`>#Bc8z7W^Hw=cH(_g~ohOn#i$zvZYCqJi_D+_WbG7X8EN3lxaN z{=Eoi>;b`gtB%C}?IG%j8ru(b*I~hrq_2O$)xSd@7yUaNbQMDZSOe!w^piP~VeWSW zwEDN&hL*H{XNm94{{0xcu1bI3>fb4MyZZO!&fz)wcL<@|Eg~gtR?Rvv-*VcP$KErEH661je zXF7-?I6$Ha>rQwx2?kRWi%*1)W;8E@+X)A+w1gWhH;7HEv9HeRpRn$0a(oi}H97F+ zCHUVd@OU7>`<&phNeK=y$fSRskA*F=j!Sdsx&?Fcg9TCK`j5U7{sC@Fg9Te~dxE+J z;rRAQahrbJS>&|&91URqNFL#vrY%@W`pX!PaLeTQ1>+?j#!E#xWzhjN`?%L|AI$MZ zui!msc>eKm1jaEt*bjI_YD)Azcm~q{^fMsB#SfU#R$Ujpo?%&iCDB#*-MCmv;wSy- zucJ|1XC^S8hBuCOU5ML&{(fvl>?IV5eQdFm{~||3L-JHGJO!cdbah;)0r3$Zd6NQ81q{W97c88jUD1QCAOem*e}3<`dH24^$j7E%#FTd~dc zj6lJzptpE(P8s%CMV$Y=*@FTFt(v!3MP&+>dlz2J7BWn_!}uMbX_3j2QzhDpQ;#6x zV0kyE@(H+fM?9BOK#V7jR-CF8ybE6Z^&P55wSrx^tyZ^+6GGxP{f5zO*0m7A>55Z( z#&N3Hh}n*hV*Kr`?In|!wfr7`y@ zG9SALge#5CBoABX$D!+|92eL1g5SS75&WKF@w+8AzUVgj(2NHl!$hg0UB*lJC@Fnw zm*69Zto+OgSr+ z#6A>z&N{@d7j9_)uR9n4L!2kGGPYGnAB7Wr)nt5fI|8Qvq?lR$_#sP8Yh@Tnh?g3k zTQxn0vX(g3!;_3YElNfkQA~bc#wcJtdgUv>_qzVU@SQo2;3gQpHD?JQdauJVTQxac zX;5w86el>z{W4=jaXDtng7}uI%G)2iwrf*+ETDGsX`a;`Etp^CR>xpMY~Q?vVKHA2 z9h=Qi7Q_%7&{2vvEpS@P5X=*C#l4kRd!Kc?eEvSd&)&!KBkl5}vgnWRLC;rq{Fk1B z9}W;bS7T@H|MDl~>j2TS2D^;@m!3)Jndskm`#+Ua1%*hZngYug2#*Me9EKNivTzG^ z3QJa#!&OV(rGLd#5f4D%5nY@;y1XO|_pc~NOd>!>wz8;LG=&gy85JkIk;ysb^kjsU z%!Q+!?d?zBqvQO{dT*wzoLb54LJGqS|M2>pO8DMzR_2UYQ-ae-4!arF3cyQgjiI^j zRMpW*!A@dQYolJ+X2hY15$c~5#24@^fP`7UucI_edk*bRfq8?$CZi-=uTQicAIzUt)hp6NRS8G=uylxkfx=gFJT&CaJG>CX1}8E z1zl-IMW4#9WbM{y!0G?MceH@|w1{*Z376h8je3xy6gfH*hF5E@$*IG0{=u_m5x6B} z0CuckJ_`XKm}>96dOW+J3Sii=qE9ir@zxZg`;1YGaCSxkuH?9b1njgQ<*Q&=BFoc) zh$p%TB9X!4AwBJ(L$R2(qCY&4^II`{`b%q^3|5?jEN5@!mCSXnI1Ro#A`6NO>c(VR z73*^_Gqh~ny33f=g@^M z)ab%uCdn+U_z(L}K>+4}@iH-!WYGzZ90!0y7E-NlF=~4#&Py_0`hQKIe6i=i=@V*^ z=_8Pm(&Sy{P$LChsgVGB(^MlLe6^<|I#P76^7pO&=~9o})h}L;2nE8~OpKQY^*n-{ zQ<@!}3()b}WG?DtpFWX_KDDAL6f-hM3&q5?2<^C~gUweo7Pj_i!y9T31HVdpoMQ?4 zzG@HFuJT2s93nMAiy-GJh|#3fALd|Ns3g3Cs(KgsHBzvJ6>!INx>gyTbQ~rq5nOPq ziAz93V_-GZM5*YgD&Q*UkpX&$(15A$`GESqMyOQk2U!H;Xc;!yrRlwdxCJ9U#u)jS zA+ric&bZ?+b{fQe4ysXjC^5YIW+{eyQsNDOj9xJ7Y{7OaBU;)S1S&cX!=(}7r$nEI zAIM>kZ9)r`**9&vx8`=d_~0F_dQNtVw`Lt~u&XoFLMCGp<=&Sz(Hj38Bf}C5@%#P; z$kDFC($X@Zk>miHVyNd_q=vsHti4p_D40#V3#yijz=W9taJe@Vh)UBzywUlLM*Dx} z$P4fV!YQbI)Acz%f>jVXE{ED=rL2%vKO4A+N;^t3V}BCkUMXNW@9QQ+B^N^-Z^Pc# z#)lZVDsd=>ITptCJ(Qq0JlN5WiL1EyqEolAFF61uMM+9floBB+N?U4qN#2^f@ZO^6 z3fzF2f~W}Nm7z@<0)HUxjDTkyiCJdUa^_^Gd_j&bXjfHS7mrAFq`1%Cz%?BGAC*trSq@49{?^qBMeo{8TN>rVS`LoalKf49E>yz};}?-5AIh95#5X6|X1zzcH> zXIoC6W72|{+58~e(;aviNl+E4K5nf{3a@&R;E!&=Q*btXN?KX?EZ*1e&j(hH?;q;+ z_eO5a*`C9aw`U*V&3VcR@8#J^>66xN{1km|ZgsWqkbV7r>yxhUhsp0H?_|1o2KMjG zVXnL>W01$$q;D#$CRzQ}HN2;fa>HAd;)M4e_{`*{+0U)6R+zjQZ#s=X%x zYG?H88s5i4T=*$?oA-1MFRe@ZtvcET&$tVaY?V_vE0KQNx@_--Zv2d57rf(=z?<47 zykp$>srG(>tjW&kSJ)-Ir;l*8SHb&z7x0F43Gc3K7d+!akms=mG_MQZ&Zt~go#`yKA-%|d%Y&4k1sJhq8oa0b*%C#h_)!&N`0DPB` zPIbdyu|UvwKk!#XdJg%!HqkBoHy$wfE~93_-?rcIjTWqYvW0l-H7@#pwg2!NQk_oH z&2IR^_8Y#U|6yoF68fKfpy2O@>zD+7;eNw6e7|+lf6CP^`cK$@_$e54+x?sBhF@KE zfcSsj14-$>_&~uwy+=~|KeXTQjU~T#(tqn!F8V*Y|L}dTkk!p@_}gweK=gm_cS-60 z)q#RP4*@5e|GU3Fa_G;27i2Vky{5;tp6r@(CRE$&$+{2!{I~aX1O7pA@Ht;1_dF=& zzHOM(@F7hW+Z_Zk&GZbc6z6Il$1i8-&cqxN6PYz*)s2{!4EMM1e$Y; zFa^B?H*#8MtC-~|6e$(yNN4U?ClWl~H7>xc4JRQq7#w6yV0Bz1{c$8c;xgMc(R3_J z`CN~NgNmhU!pU4u#z~R0#J*_HU5Oc^m(BSSIgiw8JdCHLzV)37(`)iWW@+4kBAna< z0b0e(QWYN1E^8mRa}qYT72R&Ge_vU}b)!6T8F}4e!;m}0G#$ytsVy}@gq#OZ6thIe z)IL}d28wB*V;Kncjwp1EB-lFKfRvrmEIf^wGuS#si;P3A0u~2~#h*wq{>WRiL_lJ? z3>Sd@Oe_E`wHAQl{7j~cn(IJ0??W1E5lqf%1&x^f*>$CixBKKwR4Z;lsqIy+`CP6W zeKMAf{LTw%wZ$8pSlLI{UL}92+E^R zWoqhtR7WCj+tw}^qKvOimOfsId1bUWv%k#+TB z!-o|TXeoCEG|LE#nQf;gt4}}?;{0`sn#m$Ra}B;gFI)5tGSQKxLG(PUnKG4a90!xr zDT3M9GeKt9=TAvX!A5tiUL5SRg7^cbdfgwdS@&GCZc0^m==08;14Ezevc1x$ABqsi zH#hGKeR{#M>jr%?ujrCKJIW+|E;j2XeQ>IA5%#0Os_%}n?C){UMHu-2f*u98aivBs zfH5~c7Z5YCU&9akUUC=oFw*3)`ej;9u0mr5$ehGDZ{^M=%PMIJ1*(>DKIEGu%C0|n zZKT*((XzL&561~R{F9$4e~0gt9OTk`94CzHFuZ0@$3Ae)>8kw$N+rTHmiYqVTSXpW zBEqnY`O?xPv5Y(mnrTFGYXr;`V{3#n9hUJXuG4f_Ms$?4jId3ONXpp!GpT>zG>GK` zMF0moxXQVI0vg249!Rz&*-m?i%ofWY9(uF1hv@shv4t>(UpK-SW?}?RGUqGBC2CDK zu0pM(%=-61neWwqr+q4o6{@rP@5!(CvHwzERsLl1{`=|`X>5iQOZ!ja3$Kp+#_r2j z-6vHlGKoN8V$+$=2zuR**| zH;%=7lJK@oF61b`+-haL5IuqPzTVsZ2iT5nq%nbIL2s{z#XzNXg&K7cSQRR~sk#n4 z2zlRHR~X=9?B|e)CkO@==BnS3{O!Oo9k3nfu{nkoInQHMPfo)!#x=+j6sx6|QX(SMalu2B`j~9;Y~v4eC?jB+l}gIb`(X^ON}TQh$7TF*3AA z!1hWzYw4Bu@SIM8<4ek=_5L}2cOJe=)H#pg71^Tl-S&=HOYB2%0Q*zzhNPHQbtqVF z|2q`pA<>yjFG=jo0j*r{3f>kyiazAv3mOO=Di+91!8cBtqbJE`krJG5Wr8zo-dGW} zz@3-^DCoeem7|mu2T3SQKtj(AF(Em6ZmtPQbf4L2(j$BIVpH(U{XCLL-y01oVziV@ipJRg1502(pc_-ITEucO@Sg_F7xdstQt)J?RgBYkCM^};fz8CL6WEcyS*`Oq6H67|Mmcpm#};&>sI<~P?!BQ z3Dn$u(I=-SfqF$UsQaW(HlLSBfxgM0f-Ux2pKQgU2+8!x%XpqlpZtU6ljxKC_&m8j zxgD>_bQit)zphVe&P^n3%LkSMNa}s$AgNxTEpOm;EIrK>kui~}9 z*>R8@`s9H)NDh7Sha`}`d*5oJz{#Oc&bJ_aAAK?qU$bkkU%PjGqP)v4#v{rp!3ci~ ze9atb5T%PUZ+~2r+k%O`{v0-9-^&Q)Cd--V#t3D#JwiFktj@s||2`Vyg*60x_U@6}3IUVamqt_<-J^y$X z^E}u))r^lmi2EoHUx@Q}ZsBuo2V=A$Af4#+%)@(f@;_F$cNniGEz*n~FInVv6p6hU zd*1jHib<2%-SN|b<8go8i{~6j?s5)r&IRuAL%ew>{9yWX^Vmdf_WThhqx}&2^Os3# z46w!@On?5nII)dyAN~XC&)wM8A({T1`IK9KPQiUL{do?b3;p>x!qSQQ^K`tYa-6vW z`ZJQW$ReP?BIluq(4W&$?0;W>&L~Rc?pHQ;tv`>zH~XqTGh{t3{rORg$=1pA=h8xV zE#1+d58|76{dps55n-mJ`m;2ymhR}!(Mf8_vT8}DKU>F`ZTWus^Dp?G%rl@dQGXtZ z2sHHPkNC6A$iz>a`n2vu6haI>DWRJ`_hcm?$y%7 zli}6R@VSCwl0y7eJzI}gDHS7tb7s>5-hcoLs_=^^S-7m@WyC)p*n=!M%^>2x9=}<# zCF=Xo=_rjoK}{Gb*il>y-@$KjyjVH5!PC+tPzjqS9SC3`n~NlI`@5_L0RM|{T8Ir# z9YGb@vp^S*NNedREw66x@O$rC#iNtvVfToeP&9xPK0&0~HQt(~;#(3_Z^D5(Q;KUo z3tbk#R8<*sX=GMS0KOY0J>^%y$gMdI_(-Ua-KZ(Z9h?x()mPw{q|lM<*8-{}fdM2% zBH{Di)r9`>>t7ckPQ73yF*ki|x#y$slY`;wb4HfreN$4~apQB?UW$n|2%=y48^i|- znkyQ(w`R?+;8n*SFgPA|brxY>DFnl3un~Df+t6q#FWVQr(uFHi+Fz<7KFp9ITEx1+^O0YkzP@>1e(OAQ^Sg)7=rnv?{*9oha-p0SFghSEPGsbM~1 z%*Ij-EG6Zc+mu~3cMha#Ek6&G^MHeNBXkCGADRox(ae;lLc9)#m$1p=rZ7Q*$6q*jT6nr#&@zYs5S{)Jw*Q4FUXQ^1m!U3QYDR(Q6WBVJ^s-8!*qi;zc&# zr0^o27nr=uDdT_BcCJVbiMRuDPnaVnGG+YFVxL%`hI#*Nts1k*9U(7MMXOgbQ9?}O z&@w%e#&Z;%PwoA_cy{{?qvzOjS=>GR3yZu*RY07xF<`3TP-;nw6RNiS^g!(+~< z;(0L0`5E9X6Des&U_QeWU;<&yutZ## z!|()rj&vGmcHCq3U_w6b@$1L$ct|hzU&fPsV=PW35@NffGO|p<`1fz zi;v{x*tvBR=ieY{H-@~-Y~@qe{=BT`kA_#ts+JI@0Pqq_>mXU{s+ZHb}ZVd}rZR!%sWPq2`g zoeyrg0-dv#{5c7!HPAyfEuvl|*iO#LHPYIdDuvnR>NbzwTy^7|l;*LMP#~pAV3b1T zd#+Nx-<(F}JGNZB9!uqW+Y($$<@+9ALM7#@9n?jqu%y;3`aoSi&R_iDDe1|->3Zp0 zEnHfTg>JdL#|~y0_?L-)S>e*jc$_UBtMzbtX_;O+&1kI$;>ZXagtN4KH60cG(0Fwe zIQ#)2hw2vF-x=FSO7Hq9d}X|T7F=~qW`7ECqyo$}etW8Xeb>_}@k`|s`an7)^uReZ z?)z6N&YAJn^nvmwHIGjhKr|RzV-JoqAW&7zBG?-pNE*vLs&7)Sq zFs@+4?&S{)-eVSoBkHaBBOW7JKXhXt%$a2PJa}AjEJRBS^9(|zzVVG%IHBq9*(w~n zvOOfgGOt%ABKm+GytP^y-uSmtkMVt|iCKxQ$e{xYwaWopoGup+tO_sqCb|njN3#jx zCzs%<7MTD!h6)mXG7ffa6V9=6nT3x$b)Dw{RYDH4$jUVF`x27x)AmJ3F7oIbUTwckJ!l( zQ*Z80Uo(i@Q?Q)YxI7TPQ|wdeH#gIiC&&iUYI3UZeE^PRMnE@jgjaDvPF4W+e@3d< zEMhm(EY3j}xUa1ryf*2KjQQN&=Mk z;`q-P&N(je`0I*AC7IaM$>XnjLGCmvKznPyAO`xY{+HNmQEVBh_6H@rQ&E8lKY;w} z%m4_GrRBX<5eQ&Rqs0a}{2@;hkFq>E;8`WMi^uM?JB)j7g`hzGL$jc`D&EH)^c5$u zrE@*ecLm$|z$j7hT)^{nz_Zi%(L|*G=6x0LgmN-t4+uWCs54i1cY>dV|I;OD<^y`i zpz`Z`LNfb3@td@iaHi3UXtz;}0Xv%l%9?F{QFtMY#|rObBu4I!fab3}ONzj$1)qD1 z8%<`w;B1>maKtFGo*MUfg&$k9N$Np*ZP1CebpTL83&BR@_@Cx2S&pQn>(6DOY-VL=Lj-V8MgWRi)ABZgyqf1j%s=FfW=nxLg_rk)dYs2Z$_r)P5O#-M28V^pW@5e7I87|FYc)J!#dVuT zYyiW~27Oa`9M+~!ym(&Z1fsb?*wR9`kC-8mB!U)VMr0e5p-}m zRJ{)TCpsefWjrr5d<%^cvoyI*@O8m6ZxM9Z^CGK2f+U7I0mJA0T~naBIE9Udgp^RS z{LRG~ECUUO0o2h=MxK@T_LLNZ%u zfXTTgui}_%u;b(rncvM$ZU4TP70(vn| zipFTHI3xN?AYL!@$B56OKfw+28!bH(!u%jLSphVeQ!|^|TBvR~bGDi`HMCIIrkWNw z2dAzIdLLV1BOXdeyF=sA2JjY^%K5SG62~w;#+7`i)u-?TX8_MtQn^WfC%kE#WSk7W zO&S>QZO2Db--&*WVy?H`>~*9lvJ6FdY6v1;0Z#)iCdX<_`zZQf21{~F!uf&lj10xe z!N?Si454pStV~Ps0uo>ld7D!8Jbm93#09gSXPmPB z9Q(Yhe`5^)ObEttBXA0G19^#U_v<%gNNxegnj4P_y$WASj(dy^*mPSc=^%p1N-*5A zl1&WZvp8KBDJ#kov1J7^5?jdrAJGw=Prfk!tXu(ot^U?d|D^t*UsTPVn-Z!_2<+Jr zJ#d9PnkT{{!slV@CuAvFaZv;uFe595mgw(>ub!qi8;7H>XrLbg?qY^XDn9dkdw3Gr zh#2Muak5MGrzlgsrz3QTzm9`Xj12KI;zL9ZvB11_^bWTRaG|H^g3%l0_)~dbJC|pA zYhNLVt&qVLq?M^(Ol@LnkT%rft(^(NSpGUsdMv^xQ{NUUOvsyY=0e#g-WtCwYxPSZ zbeJ6JnXu(J&GZ#J@euW^%cQ>x{NdrWdn(8J>Owgu34ExhnhNK6Ml?jR_FB!eb2JL; z9v>2l-WJWFSVRAd060hbV)UOMyU%1j z@hc_Mrz!T!@YWm#`%SM*+G+1n5ug@M<|u!Lci~b|c`1YHnck(P=rD4~`TDwoFGE3$ zzr3~YqJ$D(v>~(N1oS}_zX~Jv5Sf7BHDyx_cd>p4ac#*ml4(6ng>yZs*&ME1Zte%{ zia3Wb*iZE1y-S7CFahG%vQeN3>Q58HBn*ydsI!2QUpg~VG1wy}40W+8`CTNe>dQGy ztNjuBTJnhynJ88nDiOB)qulVX(A#T$JDWg5+L>VFDnwJGMl14fpwX_?CGGTsT@#gfviQN6&<{SPoA;O^_|JTB z3ReQhj@aLgUtm0Lce%qF6J2N=pnF%E?DC2cR=@c(E3N_$XK^%9eLtEb9OspjOyg?t zp}Sw+XTO+0;-%f88%*DU{Svwd`aJ_K2>n8*ns@7W!8BDUqUlP<1GSs6#2#9D{*2U@ zQu#_z$y+!Je&mht8!(d2rT1t$q_xkZoLP(y>1^DF({Z6`3Epl7i^$>p0w&(*oT4T7&SEadLom z7pvR~SP;u_0fIF-^|QMr(rIx z7RzCT@B1RUk3I*e6nzsQ>Lqca*+5*{CmrCw!_o+2rp7gz0;J|?jXkgI3W$7r6@Z|H z=6F3(b9L5A(?Hu|2bs(u^|7wcD7}#u2(wKMp}*X8RL7wDYsI+k&tWmH8vuep|D*of zo=5#?arw@|NwCh8o^hF>;$Y;U5jZ89Ix-gpXq~gwukc@}iM>l{dF<+8Px`%k3&{Nj zLS|yU4gkbnw8y)gOv}h&L=4Bp?5voD{#ZiTVqWH-!x&u?!l3DolB1%ZVg;1&i$06q z$pNP-&v?t=vk`A;zC9)Mc0XuUDVh# z7Eos6W6I@izY<$6V7^Zljb6qVk$z1&n&d%~jL|=FYRme1HTFW(9fPdb2O`iNNq;AR zsdf4R&0~FNgCH$Vz%Jui?cqWVbkxLSeJn!Yg{4h}r73k|OT&dwxD#i1mraD?udG`J+Y>{!s(7_ zHr*9VPd@3UinG%#=RpD2ltvmuz1;-sVe-~XV&xgj|{1f03r2!`&0T|OMX{u{b z8kc2!j^A?iI|F;8r8HwAQarZ%#O?)?#Ld+tG5;_FxkOxu%SY_X$L-5!)TJ@(Lx!Cz zFkviCaW~^<#Ql-ak=vmQu+Fz4gw$j_cLQ(_ryuf)h-^!0r5Sgky_}Q$>+jqvoL&6B zxxXNaG4{XwF1i8JIqW5f2Ybjlt^6P2_j6x9Q2c)9qoQm36*HeFf!}9ijQYRK?kWGA4Yr0?=Rf%=65UKDXqxNmoip=1h0lsMdL;Z>+RJrEO>w& zlGJJU7YcCZ{;A&_fo{R%((OmWg4~ylZS##I2X!Gs&x68c;~ z$GrefrNan$^k08L{{ZA@f;^ibUlAZpco*342AlBK%@r-rO9t;@1#kNh!29MX3!cn> z!srn3(^rhwwgH0v9+k>h2Ll02=rT$LZ{va-Yg!i@VDRLxI&9CwdELTEN-;98fOd_) zlVJ||TNW;y#$V0?F^DMCB}3HZcmM+`jTs+cPPY&iZBB|GC)#3orv~$uhU5&z5+QtY z($+RMd?UqDP7B%AhHr$VhGhblo$+@Fvnyr{KI&1!;L2~Vea@qqzA^XnD%eBES;#w%9w)_ zCF6bgE(_mPyon*|dW`Z#5M*|9AX4PRiebcobbmG=S$T6^=F4H+Eav*MwDs*^W3jV~ z8LvU?PsUVEbx7NX(ZzL=&TA#1Mv%g_yG0pM1GN;`<*UU+#q&cD`KpjnL)ePQZT) zk1;7P>_d`#xuQd1WR(6*$d@}#ytGuU)3LFYDW00ns4!98%$Kuw6+q@3cHgNyRP(Gc zJ|1Le&`D^;tZwtt_PKeyy4kzG;S011IDcjeDLjM*02_v>Yu|I_(%27(GA&TVDY zImXWxz2r=WiScq$iLte2rSC~M*dyX@2&j1!~bCA-(`x+Eyn64 zbk+Wwe+QrKKb?Q~qd3c+kbsvg|L&c`gdEni(9&~*OXlA_$^G##E#IB|yUI)|^G@>b zF5yc!?fUKRs(D~+E+IA#9b2M5d7gKq0I|8Cx^ z?)c z#G{kU+c^hC<^U*3{$1}8h~&apbr|;^8CBmKO!Ie@cDO5f)j05_iJvzz3V>in@ zyz}F=Sq<}F7y&5%K8bi|psy11<&Y}Jq^e8}6UIX^^CH5O%ycvIPukTXa@;h`Y=Tuq z>YU1`Gsmm)Vd%J$$Ti5`6CMmR>WaDdwwQdX1;$WE6>l-C&ablSdI1wTZ{S^)sZ}HY zuXRJ!XF0B``Xsch~*=x`BJoulvJP$%CQ)d--*rP$<4ne%%QJx|3gb zkC3@d-rC!6(P@5NC`o?ZclHPU?EE_LnKQ*sLz=o2ZUjs_G|viVm<9C9kj91dwds`Y z6HWbK=GzSwEa7wH+lfdfmj}5r?gC+{oDudB8Fy}loHR4KtCYKQ5y{MUrrbS%u|#6Z z-9Kmx#r&}=qYfWWHts`474z*rMj6*zG4C&mRH8^+zTG0z9`0klT`-fDGIXVxZ-=;8 zp@@rF8FwlW3IcHoS;ocG0v66B%P6Tx`C^6!Q|=6)2kV=&_msQo(6)VaT1YtwZ(}_x! zY=SQIku0rXPS+1uzTLUgkvn`M zQK~ou!FMLxl?&OG_Lq5XC)#;#e^YsGPeV9Z8hLJyQI;(E$CO2RV%}W{d|NaInHqK; z9KRNXsQCr}Kv8VtlaKiwZ0}r{E7mE#dA{{Dog%V1Q%4H(jo~u&u4tD3#G5@apGBU{b%fEZVX!XYX z8%hTu9Yp2dorHj(WPvjf+Om4kkNnx$cmSS8e%W&GqDOhtNwV9uGTH6p9xTt<17>yI zCcd^;o}-c8+nz;j+SGO=yM2euD04D9ELLD~Al=<$x33AOpxt}xGrVB3+exUrTgh&F z_ytn1U?DIH63K3%5j)9mUF5r6#j?3t=lO2UBHs;X_5n82<*?`s?LjYBcOd2Me9{8# zzpJ5l8)-8I_ua^Ns{^WzjJNkE*%@!^Sd$oZh!wv(*`mE9ybS?6S9c&Q?{a*LMGM{< z%-K@=aB@`65Sm$7j+sJpP|TT1v7lj(kl=ocuEdby9E8%H`j0y^STjwb8wuOwsBTrk zT^w$K*TTs$rez8PZ>41>IswW7P&t{@Fksb%7XpHJ8OY;E9+UdS%wIE%`in@*mF$$- zBGGHzCxfXE?9?>rPbKE}1@hLH=&uCz*MkMG&de{VT~jdv370Cr@1N*h=J)k(iyFXq zx?Haj{RwS~@XrGJc1`~R*_LM+cVr{MFYWmyr2YTL-g|&YRjmKxS;Arjaf1}2C`LsM zA{wlTs3bt(1QG~U>?jzq7ZMvNa6=$_*F_Y?UJ!d%6jT&L4Pc=Of>?r}&fdK$h|(1D z|9ocVwB55Q;=TT!|M%v3V9%VHGv{sd&ilUeo|)k8=zA*vue@?>dor^895OQ8e9mz2 zWEKKi>UrjNPTtK&zz3Cor<86K ze;waJOhZ?&f8_h{farkMkq>yX50pyyEnZ+3^f|vv;39CYNZ!LP19{Iq2>;#NlzP>b zuXOhg&^hdX=cxZszS8W0V|12D(hpv)AvKpZ6+u^!RJ?^EOYE z`AT1y-b6waPzmq5MyG%Rlg! z@;}Ng|5pCq0-Q*01hL=D$D+c@-jdm~i$Fxf>1Gv98Q>V4^xT)m3P-#eB3LYHIM&R9POctH0M~CG4+N;{JAB6W3qp zAPBYu@hls}Rxu#X<8!JR{3NIpjKh43e{8wZ$eFQhZ}P950~^vso*Xf%ryr?>sIwlkxxl*k$0-V zEfaved#ZTvV-PVoM{ay0jYNEJy#SvrMGrE4~GG?4zH@k2&`7#S zQe5Oqy3VcpIVc?YIrucW({C^1X^YbN!L>bt*mY#1$U9dNyJP278uPDUIDED$IEQ_{c7qjB_qX9(TEh!}SbPg+_OT~-k6NPkfyAH^Ya zi=qpaii+XKp8PmQ)wgL~7eDU$$l}M=%bol<#giY8 zfoHYxJsii63=og}*m6}p_+g!w#Nn~_1t&Y8k9!2G zI6RIW^q*zNtPzqO&*Al+?3kwNC$+4L9eb8q?6{22gxchC56=j`--;a`tuZ_f1e-NG zqSJ86h<13fCnK7x`n@gcVnoRjixKM)NhK}K&0nY*LjG+J z#1ZTUAV-2_jl|BzN)3I5$w8^1m$oQ+zf_KGx<8~wff977nHQzLx6fOIjnNHX{_(>V z82;Ee4%SAWG;B+hA3UH{ey9k+U+maJ^CLf$RN(tT+9TKq#ka`7wvsIiND0f}czPJ6 zNm&|IlLY58{25j9j=T&iYh$*wHj0Cjs#zcEp3c;Kd}yKPK)I*lE}6n(gmMHxXpHP2 z#!&}m<_8nqtVhD z&2Ian;q-m{5=vcS`rfJP_mRF!7RJ%{7<6pY_X=?<-X<^4>X4k@x${>Pz1D(b7R)dET9lA$n=k1cd$m z!rBSDSk><%VN>VF5%yYi?3`=r9IhWE;JX7Av0gds7)t zqM6PK2JSmDKPsi}rDK!36XyQ%{bd{R0LKsFOT$EA4$Tn%vy)Z8sfhLhm0X%Q`bHVR zdm6zVOPS<{?`luiPO3rlcLpn^*73hJ1=FE?c!F#qPU*wR(~MY^e+vd6yma_xgo84^ zZ5-xKD9*&gghdlOByxt9AiLVf%kuAKzyn@410Fcm+6SG) zjr!m%8$Mw6iTI)R?(hC<&0C3(u~kF6)uo5kie{I)fBzpMBWU{ zn#59tjDnzQBMTFG3pKJJgCLm0QYt30oF9^VX3`o8GXtc1ifD{E!OC=?N3J>Iiho>> z$r6*T;T5lf0WISp@$sO1+ScZutG`R&OeN^ARpS13!O%Cm)ADV{t3Jkjqq~fYSMfQI zV9g88{^}jCO72d6S@Ehtm%6x_$6~^G)ofS1%CsQOfYrC)khUiSv&vbjxS#*4h?TlZ z5V5)#1hq&bFI@BTd2-qMXMOpdMpdCtMISAItnrsTJw4 zFQWJF5zi`xGO>vN7sa&TZkbx!3~Rkg+J^msM-sS;lU04c#&x-i-+^E{taUz~u}#kd zFe$skT8G0lYJ%aUO(VU6YUcN9`{=tw_GiKOa*{_}>&0&+8^ps?B@adg<9JYwAx-1| z`SX+oP+MHf9A!>_3j8^SVF3^Rtm*b&;m?6IV8j0F0fnbK{}b)du>ZA2b@3;!+Tzc9 zc*f?>%kVzq`BMxY*2GVa)PqvFr*dnA8WPm1GD4v0wpqzr8Ue{6pN z?3u_QgvA~^-gSEJe}z5Q(+m##R{#o6_ViQrslK|{^X%6ad)i9V+H@^Gfr;#9Pdf~s zDzH$qM}@uY`~y9Ho{4Rt+0z^gh>AT|f1}uQ!4%1!Qzyo;XFBvS*>mNP`m@L3Z-6~N z-0x%$G^BW}>wkqYYtNUAIb&J^#>`Unx6}~6+QRkCzp@zf4?IJnyTf3AOo*e~mB5j7 z>pa+UO{PITDzg9jl_L9Qd`eME7|c{h&hyGM5;@3p;_8ftC1;Z)Ry?dk+N1T3hr!lF z{`913m@TFaqvqDQ09o)a4UX+u55ms}G@?m)+s>(u9-^s6;KHd#`sd&2nG zb*di5&cMt+A0K=E3x%X3KGqr?+e*4>E*rQ442+Leo@c26GY`p(k3ADtWyWv5k&;Mj zg#pEj?ou=>AE2G&Ivwr{(9)95eT|Quh-EvYmiX9#s(v5oYiJ>I(D!XDdD--R&YQl& zzy$X!XvN3!;;PK~4+_H(gxG^Gl_`_Q^sg^{e=l;=*Pib@#kbb@*mADH*FxUcRQ*1Z zH}ZL$_zsaBo0C||`*GsS_?QpOb3TxA03Bc^?ld@-FUIU-CYRmJacC z%vYY|O%NZu8S81a5q5~G-$%kuSsO>#Jy?@+PC|7K*O&WRlTeEdF4|pIp=kF{wD5?J zU9giAm9N(L*hxEN8?l4qN5;oGb)voEpEf!!K9+p3ijOgJW-dd-#>ZwO%%kIDPv3#A zo$;}jS)5hP_}Jyk!2m>S_F%(Wk+M2IKK7^rjo>GYkKG`X6MP~I;LG^f^(RQ^*WHeH zJL6-$E>iI^8HMtSkL|sSgkXH^-(wWqrl%!0dpq|G1#Leq7@(8%wppB*lbsPOeL!n2h9K( zz5L>!86jh-;sF&`VT6oV9ucyq*3q=9)=O<>gpB!i@Rck1%#C@U>n8$DCo|IPGFtv5Xf7sb)@ zm-SA1mVE3%&!4ddEqX&ciNRjgD_Gs!jy|B_8ywF+i~Mp##O`Ue(pCzF?Vyo_$duJ)7hy zdY+@p+k4c9o-5k@&GgKuH$7WpXvWaAlQ4*fnt$Y zbq=fNfYKH{UqylREbgZ0`M53*LAh>vW*+u8(=)T)^en~DjFHcSV5i&kyl3CeZTv-;4#nV#wOrspvjnlbd8k9o$X zXO9IQ^!yMDHsVm|Kyi#$^^>e_3(2+Q^FS0x&&6F8J@>{Shc_(Q_^eq~FcwD0;rC%f%?yP0yUP zznPvn^`>VzhGq;skHS1-)AQ*{4|*Pv3xeGa9Vp7Zs*_kfdcK36*P%dq9(%T;=f%3* z24zi8#P`&iK0l~oLg~jw=q}$DxOVak&IR1T;#ee~yw?=BYKoAoqz_%~5tzLM&TG0n zxjoVfwc-+ZZK_-Af5&-H$VWxS3ie~G()+Dc>7z7)-_kujDKGd*kKiZb_BN7>CnW{S zpCA-CS}4URueo!-yv|FDdjt<8KbU^>^d%VT%drm};Mt&g?qKY3vKl^lNJoiYSSQfbz(Aw*LXj^)cd@8z< z@l&;{3b(q`JgWrHn!E=Rqg(7gJ{>i(d4zk|6;Ht@YIwO{GJ%}E3$csxF{p|s_&D@| zV226E46~=`2jb=rJQ%+9Y%sil6C)x6BOnqS35T7DkwB4(yoJpISkqhAG(wHquZ?G* z%XF*Q;XnY7a*PF)ae#qP$tVs5F>(N46z5_J(IX&tkj?ajn{6v-ct4zQNZq<9i z2PPm;SfhK@5`ELN4!JVLa)!Cj9>=EdkX2>hHZGgrD6$*OR{LR?{141t5iR5XR$3lV zmZxUfD)iDh9zyYD7YM}}P=lhISM>+1&Vn>Wc$6{4qaz9woK0sa71~ypSECFbEA5%( z)@XLzPO|m+7A9Le*T&Wx&#~1EqH5;&)Jfu@yR?46i3447(?<2Q*pjO>#o;on4W&a} zRUB+7^`qU7i=NR5roMqROPvs%V-qd|12ir+H{(oDW-q24vA)3&Xb|of z6iB!iPgjKdR+k?}*_s}_=_e!R7!x=uL|mO}67N)OO_Y*UdaxW4lkf|VKfMNBfW5BMs%4;uy$g{JD62M$tsqqpc137-Yq_bZV~I9wfO!3pVx`OtX%;@ zMvl|uT7Uw{HTpC~u9>=gHOe-*G`$SBylHxMCB3=?B)z&ONpi^ZoVX3V`Q0Ar=0%T_ zKo08e(&b3^K)Ck=Bl&z`eu&#htiiazOmRZ=b!)#e(7}j)Y!l&^+3`fU4vQvY>0JEx znMZ9AYd?CoQBv8Gn#dqchdC&d4x>(0ba+XZhoj8#rtOtXQ-xxzX+wotRMCaH^ppd& z+>{(kS=L**(!#Mu61TX?2d+5(cR^_zHQ{7RbB2RY?T4fEsf=sO)Rrb<86@4+)+E6Z z;^$c&1LrC%zKBK88e)Z4bsttQhKR^~Uk;piQ6L3wJVjC91zo-rWpjT)H9sK_nCZY6 z2EI=Xo^*^apSK!5Bn5vVW~PB1_WDL+yaq{)D=6Fe81uK&$t;=eYlNn%OkkN19GE?| zTDFmCgn`);St<_7t%iUY$pF& z`qGqNeiUBNUdnA5W=eTz@hr1NGGr1?by7B8b-!?S8hfPHZNT@0V24MG2f-(b?WD-Cue>rirp2hMM}^ z$2p9Iu?{Vlq!5?yZ&Dynjt+c_==(y-$7wDC$n%D=au`DcsBYMwjoafli^pZ*IHzh1 zqM@7^OpM!!%s1l)(aR?Tqy32RK_0b}S-U^+eUlIB`j+kDs0=Z1>X3xe~?miff?Qwcapk|~?zBmqLb&)v}IJ0^*a5Y6B45Q>V< zpu#370`b%99@ST}dNZgO;WI6lkr*!#zlx-rZ{5qG9wVLOrm-I9Z1Wh}WU~S=w zV(a!hn+9e8YCY=F!vq&ePuS)pD|UB4*@T(+^R4h}Ohg+Ahb(JzaXj@4r_1 z{i$-rzw?jzb2*~%H#YwR2rK`_$?saS7u-2ediZw~g!=v+K#=gOR3$nKb%DEq) z^7HsyVep#vDZxF)JGkcGxadC|_{oWp@S%&6OLHdt7$|34LE-1*`znZWWTlBeOlK%? zYLe`wqu>W3QD+{!$G-4IFy>y6-#URDqhMDmQbd~KCB;+lf|41A^-|eI^j-%%+H1tV z?~;O%)$)z-;qflD7q|8Um3LVbooqUqcqB3rt@#RnA$I*uDK49jQ=AXSy$CXEu=}&A z+k3v^A))g+K?DzjG84ynRX@e*!y&tok9FiA6$MJ@k`78jlXUqVluZeBo!?gWZ^po2 zuJ#Bnz{VlU?Z`_YsMys%sj&PH(=;@nFjo3Q(#HP1m` zYB|lvM`-y{P7%?y;!}{*52b8CI<()J{YhZ*-MB}71|}@xRrZ#^1e{QuR2UkPRtSN` zap3tKmJ|e66m(dEBLE7rD{*vrWq#RCUtsbGwhJ!6c9*|zUsHQOJ-ogZ1g65 zFEFI^$3Ef4=N0(oAQIwPqFz)6Srk1{eR+fKb^Rw3k%6YK5g0MTU z2;l?r&4?aAlNM5tFSL<5j(*18Q!13A|f|QNS7ZauhgJ4?k87 z)xo;l9A$H;%3mv9N81|Gg=4vCp1>Ys*v_{SMk*4ZjxPv}r_)r3kKay%4Iz#}&>Dsr zrjwF99hZ%UCxQ8$@bhsQcI6o+yu%Kadg?j8qX?Fz!oKM z8=-flr4#CfIi?rpm{0L;8Ndj=u!T}l4yLWeh14jeouk7od9`NyUMfn|)zF=cDr5&r z1s!jM@{-<5XHUUMO;IW~?7zZnchd((Xg_>qYDS5yxC_noWsM?-fs-98=i9*l{)%yZU*?X3Y?SiyU0gmxPFOzUYfWvP!c&5-HZL;Pl$V+9qAy;f$ZqY zS0N$b@pyDd9%r{#JibwvJD_aw_)qdT59=HC;qNOD%>P^b{r#DE{@!vd*zybbRZspN z2R}i)>Fh}J_e6FSd|B~#IyxkO&pS%-_a0r&N7?4@U%8%jH|%n&XLaE*pVzjgg$1o1 z*wXP?Y&I+%n9^QK<#P$DKjsLz=mHPMJJ5d##M^t$*K-x;^_QjnnIFo-yq*W$u%DXO z3qzQ0^27bG?zB8G`9{1;&67KLl`R4jUZ%d7QW(m^aY=(Q^X@9_u&Xdwm0uR|<#+fz ze`QT!_O8M}-(C6K5q$DzXkCbJ&C6Gn9Dz*J0&LPI<-9mM4O1>P2Uid9Z0V2v!l&+! zI8-6FT%NlKtU~X6OM&l~!eqcy;M<-b#4S#TuyF%r^YCOe5%gngM!-FsygbZ_V)3b0(|k5v zI0H=q-@$rOHkYfifeGJZ{*LV8BrezN+7T(J`e|rQRnWJcQUw!r`5ctp16Hrk#0MOL ztL>1}j`n!DJLK@|4n1N^ZGW)x?yF6{$?zz5RnF|Ey!i->~l-_XX4 zk3ZZD036NbeCi9#UR_f(G&n!{x@`@GpY))0%8?-8aA-quomX`v9W^7Kf;Ds%B!=WW z7X^|paJV90FI}!VES7wTKge&zt#CV*8uEjm;j149y%=s@xZTun&9OYl$S>9=8C{B7 zZ-B3h1MRX`l#DPstbp5q734d!`HgAz79-FX(YpaiLcq^mEot*0#!(R3KewiTj=_)m z&2BCGhUX)chHZmESta6_qk--ypey4OS<#1061Ee)pKwfAdY)N)1W0t`v-s}>XRS6@ zo@edR5Z%a;nt*LkAOSyZs|eUcm*=7!BY*byQw8Bm@p(RXDdnRr{pw59Uw|b0LR4Lv za$*0*Me1V?xxE1v|JA;nBnJN^8RXsuJJk(j^OrH}pMP>M)T%PMgvDZ2S*ls1_BObq zhF_A%5I=$VsU2yd_BO!j7P1dMX7AJ)EaQvy_M93`AFd+cM8&wUn%gpY3lc#__&d?s{ik<7i{k8^=ft_nC7_*VTv>RTT$9o?3| zSPOiuSp1JH@HswZ!V;gFweU^4-s8up`PQWX^?p~@Y7ZvenpNr{kZ^%X|HSpspI9-V z*`h*coOe!S4OoUB+BG$|hCM)SHXI3nbAuNt<{_J&L@h2jgkCweval|_iTm~zSbBHWS!kgy!kXnh{do| zAMh}&UON~ZY5F++YwcA%h1JcV1f-=w!)h=1N`}p9sTlT?Ea#L$C>zqgNU%prMLRNPLmx)EBj~;+0;s*Ko zeGA3UcDlS4WzElzR=D^TX|~E;?z7reroA97>Z}6nXPOS37F^Ap>999YL_7hX2P!Q+ zsidRA-qvD9C>MEkxtXKxEDokgUptta!ISz*3guz!Mkv)t?uI#U!S+XIBEPvx+Dsb5GKs>_dQ9zX8snd6s!LPaC%!ls>wS+{@%NDOOGaXYbu46I;PcEh z_T7llwZx}X2eF9J?rN^Z1tP#(7J#iGDcnrLYG}GLf zfUiG<@%;*$dbC)$| z|JVYE8PLLFpjY*$tj>qDMJE#PuDBxJJDMxJPtxTdP}VqG_{JdGu|Of37n~>2%nz=} z2StLbn2JI??NpQlY$S`P#PYSVxC(M^x3KZMcZvso&56KBXeBYqtNN!@)LaRUt2~`c za7FwM*7)_)<^7!a@oNBsW@?p3GK%zwS4!3*@kFvV*UC8|d-0$X;{=H(&g`wyc4GG3 z9Chye$x{gWG9txFTZb9H1C?vo4>AvO`#LsqzJgqosgxii6U> zIDuRo27g(p;3LTznKt-~)0~t#bQm)Rdw46}rYF~?cwwDZ!+l_aDiaD8#PZ)Kt~v-< zJ#FjTIQ^Q>29BJR+a`Mm#;*s0K>eT=#ra;F=V}!U4IRmX`}Dq}toK#?iTC9KCq1JgwbGnaPt2^1x6QyHpPuyR`#;&$zj86@%d7c?{ybB4Ai0Z6xnHLOl*5iQqnYW;l}Iw{yMXps z9s5@eD+nXMka|xKn62U`gorU(ir^72S3n8#P&hlAa84;bXSi2^2`xCL=FqQ4yP5od zc3Cxk3PXdF-or1-aPAOUkd{h8_`>!%2GTd=P86AP;wWFrvsp6>g6jkK&BtcC?X%$I zVM7W7FE^4(+Qg5d_CSE+bEw5elZRKGSR0M|sqs0?+Vb7XcMdU#Lo=#32q_m!u_Ve} zu@IlCM%CgnVhFmQPy8cCU|ebY2rxJWA&9XTeNddtS*a8LGgbV_;m0wuC@4$mLS9KriKE%nhf*pn{&Gyi z9^EPe2)t|dViQHp-W!14_XVL>E%qKn_Rdx8owXq_;SDs^iNkIVZ#6=br7=JbV_%Va zFgP_KgS$6R#NglwwK2GFEQ6JO1<(@ncVabAT0Bwn_a+iRhJwBM`@#Vr@k3$&=dMEh zXY+S?g$I9o?~iuRV2;!Ly&Y?X@b@vVC(`)DRB%4>yXNmi6cm5Q@G6eKobPUB z#<1cs*jpS(-HM@1E_Z->)LfooaXD@fGx5h7#Iq!e>l(xyx-|DPf8nb$Fm}90aaKYm zUkusz9>q@|UmKJAGZlK6;`FWNR4e^OD4E23_8P}lenSCuiE|v!YYI|N6Ia1F7MJ5c zo6kQ?^x*SlSeO+bge^YbyG!x;pUL3!+g?v(@`;xq0TF(T$8r2P3X0G7@d|u4?HLub z*>F5{^bO!Ic)I~v;pA`rPRZXJpnM-q%wK8vm`ZxC&EE~zw9k}Enq!$?y4hNK7#R%3 zO&%9%?iMK>jdw$b4+6=;gVa@q(%3oR^+->ReG{abyuLL~W51J88?Ot=W-G2EjVd`V z8_4HYw!Q`gPCl7_u$SdEXs&ZP@{U@Z3JR-obKKOejelX#FKoY zEo8&u=Yc3Fem3S+0)E=|^4wo6hW;(~az;Xq{t8+3=IEJ6*T&KRg1vkmK!d&92veun z1M}79>)5d#eBF&DZZQ~YQ}gwB(42fd>JRX>(CdjMe4;xzZrRJHqoDYD0FV{wKvLm)+*4(u5G*}HQ`Y`hHgp!Wbn z{z{TV=VuK5mgKPVGc+k~nPHQnN*dFIZ?S~IMG6NQJZXTGixhDW5O?J^FfZc(3Ave< zks`(b5K^g!hFro*wuSRk#A_QJOtU$*f~ThI^FwSfovf-4d?0H21q+<{AEXaq$#T9{ z=6|RVIP*US{Uz@frC9uT(S~^+TaI;ebr|3vS2K3lTs7lQ$U=Z_zhmh!W_}0q z$(Y{b6Q@^8DI!ae*HLkcm98-bESqjUc{iR!euw#3q~;q7P7@~$k0Zas4XFYKCljE>Dr9GHH=2V~ zPV5CLuEYF}KAiZn;@rwh53OzDJ6+L(D;3(O9EZ0j$vqw%;l^fIntlf(Bl?ILM=Ic} zoc`lOtbRk!R*wQD>WKTc?QneLGV5lKiLNtJwZ&bS(8L2~bz?waW|JJm>hP_Y)ehI* z#W)nA593ARW?o5=49r>;N&B}=@<1>)Z);*{dU(N11Lc5 z1!g6c39N+ge@kDv4qp)VcljDT2p8>wTor^zFmy74^hl#-z)`VV1;f}}?oKbr-dNH^ zTs8_?0;Iw!q!bXve>o*?wQol@NS5I#9;1o}{h|XNq*}gbE7Yjggdjr0z-2aHx9+XqH{CB`E9_j!H3jyIL zgs=iWkqIH?jXDJ8$Goc zmwo_Kgk$}gA2lYDTA2`&srJ*M{1o{K=$62|+?`-aTY_6ApWFy6uq8p{x9jwGWz^Cq z;X9i&aTC5pkFK%$>z=qjdX!VLM5D$zA9!Z1e-N5YOGE zY+nt)U@I+b zgodP4Oj1|yQkl~o9)cdFM#PfuB^O1ufHfw4C9jS+RT84^^BtS~V6q4!XK3Wyo9*)* zp&u-oggcdXgo_fMu6zp9w@&$tZkiG72r-10_PUSLKwbupu#oN4_YcqGF8}Bn@{9kf zGO2obrwV%!$T}d26H=?nmYBt=GV7Q}{r$tIB=giK(SU>OK={4p_Yb6oBUjzgf3S=% z*JWC%YxJ22#1VW$Fp0fQWA1;1a`#3F^&WjqAZDQDhKGC&WAYMHHoTtb+u9# zH%DL{x=*M7RLQ@xZ&cQPh7mry{qatMB9#UE3J|lmRw8fx%&n6IQ2-J(Ft_H z7e6>|9h;$X4&!+|^C0t5-^yfiWm8$_NyXP0L=^cd1q`kKW(2#KA9R4UYY&bi?LZKO z?c0hSXul|mBk31KKhx`HHa$OMe8Cb>o1P;uTq&dfDSG}2Umf&(``$$K9Nx>K=MuDa z(Q`jfdfo`KC!*)z_&QC`myr7!N6(3E;^>(Sf{>mceeb5Hd%Tw)=OiZrrTB`T;@KMG zQVw~Cc;@|u;`t05dXTgDo_a5gT^{@z;$#96Av-vd$2&BFP%WoBj?P5Sp z;hDUddJYm15vSynPg%4t691Gtc7_e>SXG;gPv_4x3 zjg+4)`MxR$4MX%OQs{$$`K`DaGlXOE-47Ah{E#{bJ-m8(adg&-j0t5P!uaC;n*b!v6_x{9|!+;tvwK zhJ=Yf)K6XbZ}i09w5GKD$FLupYh%lS#Ox1mNQ8cJZY=vRMcdpUhSkB46dK23>@lAF zci>2QmiDp9e~{3`U&*>u|2^~SM1NGZ7y5`dm~*w4^e0CAK1NhM<-Tc7EaD^4*3|Uo z_=K69Ku(u^qjebkRp>%+HM+tUS>+!=gKoeX-O{_P%upU9gnoP_h9>HMm?Z1OYZ=gi z$f6!9E@u!SC9KkkFWBm0f072&wDhGH_#$;PzUbZ zme!P3J2kXuNpRW`oL3#-IOP$*!23WzpK*QPa&noOl)DTc2I(*2s0F~w_VA{zWzh=p zPhinLe=gMs$?aH;-~-CzlN+!aLAmIMPiCvZ?TQEZe_+_KXgN?CU44+4SS^oN4 z(k`<6^=DX2=&#R~oHG6O+0tq#4w?@8x8P9B*~a(tp7Pk$RRWKFE{JJTTK$^zmj3%U zu;oGPy8ZX<@F>*t(tm%TIFbMEKg?->f+s(fm%ZsDjt&=8`Rk2Vyy(D@abdy`KJ$c64>@XH_s=HHPsxp{=WJ2 zT};hu8eNBzlE9y*ihH{CV}@Dg{#KfYPPhI^PJb@9o_^EA+B{TxMz5ur_Te4zmD+LI zG{VCVJuoGXyrV%F`VZaLxg94xEMn=~gFzR|gR<#60mJ*hK;I8&eun++$`aA{Fo>7- zOYfoi>7?&CPx_vz%}-DIlApFIBZ;r+TQ=N-zOOckqiKI6DA#PZ+a4~Jvxv_JgY#ptQ_c)(?=yd1)PjR%|n)+fMU zG0BNP+Pd)n*&Bb5$@F<+52co#RED?x5FzOG!(t`_R@M z4|we?PyT~UCjPPUfN)HmMt?iBM;+)7U*Uzm)Bj=$TWmNaVI1t#HHrBC@VT*wr=YE= z}8AT*)k0fS#v@qj;=qvDDObo>TZ zbl87QYAx}Ay>R%Q@qk|MQtz7afQO1yJfQOcc(`W`@{R{w!xP@QI9`c$xtMss^S3B) zZ|Dlj(c6CR6%`Kvv?$y0fU#doSStf)?->u!fSR+9j0ZgY4mbq|{NDZm@3Db@Djv{8 zL-;8NEFttO2(SA+2EwntqTf}YctA42IgsG|$#}p)Gl7>K4;U`jgROYLAQltH1OC$U z=v74EAn5z}h=9vKR{4q{&+}%w!=H1+Gw#Cz4?Hv(^Fi`xIg5W`$|8d0^*nFJj+YmN zFU1s2ubzg})VG!4#J%!47~l}@#1)3pjm;^}+Ue__ruX05!gly$^n??Jciyt{VN*@V zwW=)5yj1JYdtQ@dp;bX3uEVO2=CZ3p=l*+qvAty)Vbo4*MHyiS!0D83%i18|MSv2! z#0ZR4Y;>oV8XTrr)oz)QM4iBf;tbG&c390ar)eQQD9*1sXE=P?xd`wTgs&tObsl)( zTcjcuZ7@$*6r}AL0X`nEAiu+!af*Na?)-?VrtNTsm91K%!p1XNg269M?E zRBhXvO|Hcv56fNS&IIz0b`f_ofjmug0S076GH?eT$euLc8(j$sxba8$us}%>A1T5J zrc)zDNc!YTf=t`n#J^#P!}fOIewR#G@OQ$SJ7eE8tk{sD8ujZ{WqN7ds53u&#ZEWd za{xctp0ZSM$yzwcq}crW<%(U3CF3Zg^e zH~~GOE6QU#7@3B9l z86QS`AFM$--%I<$Br2~oJmUMA40*@rxgCPr7KP*b8{ITvf7J*AdGxmww`2M<a;klY!$VTsd3RR-!7{$p&btG>nRln) z^S^kVIqN~iml0C&S~}aTB0Z~V&liZ zCOZje$B%npwA=Y%3PdwD??pSux`%^qj?_Di(wC%E*#E(`eC^esfFsXN;@k&&QtN>6 z>u6i{DPmw|p51ak=-~>;rz1Xd-UkpCO&^lSb>5X;w?8eujSg&vkOQFe!$SV+w#1P% z`l2G~%t{r|TuY*UW)U@(o=-ROrsuC1j{gaI-u0fO=e5@)qUY~NSo9o*wk~=;;YrW^ zp&RO==XYRDOdCzlF6|xkZ1-~k#@W(}{p((l3My>77DnnfC~2!{G7^q4WG9 z#LTJSo#r~G2C?B#3W+x1>lrH-r@wDnq)z@y+fJ<(AQ=v^LZI1smCBeyZXA+_0DwqK(M&% zJx_ey@=Kcr;_G0q%7}BY_n&b1z0pmIL-%5|b%wlC#hASeZ8{eT$=@apbQtos&->8) z{SI_93Bm>%-E*KF6QDclT`zQF_LB0HdcIAACrx9G9Z4sdN+irQ(}+ zv|8CHCO|y_^5{C3^znN@elG;g*6ebcXEI={d_RmWGv95;Fj*%)^g%ZvoLwYJACM8_ zPrp;~?HoFV`Pg16Mf8D{gYL#4WW_W$+B`bVZR-#4{&ZMdnnE``MeS#XwdZG}8gb+E zyC6_|`Pm56-UnEfeT{he2n#%_Ie0=gctbUK=>X3N_bC#ePm|DP0y>l>aB!xvzd)6Q ztr{UE#Ip&5)L#B`HDuZ@l>;HNiV73(@ceMG<}AQ71MrysJifZakA(j0pF9IzdbDy0T#6gMC~F7enUqz(CVi!U+ZDb92vN6xJA~%5 z{FDCej;@LP+h-71it}%ue@q*{P!5*=DD%_gkahdFuz(hq!H2;(a=5wQF7GPL~N$s6Oy`THY^oD1G? zI~H2(W9ixWS8sYYMmPUKdgj4E;XHCtB6>cZWzq8xv~|%l#gm@%waMz4clJztrKV@I zvmNw2r#gj9y-j)%P7{)OW}~zT>78dbIIdQc^ZhQGob-Et#ugUR0OGoy8b}v{5F}^& z*F4D?lV4WM5SbMol>RStnU`Gdn-9$VGC9s)p^X~$pLjtcLLP9sMac2mMzx#@rqYJ| zyT6J<`U(I|q)&QP+p7_A-|PK71~#!{?@mYfhnV)9&zF^-CQS z$Gu{@!!CZ;(;wcSEBl^)#P$3>+?6Br70BTB57T0GG5w{9v8;^s4=;~xpdF@9pr#Ty zOx<4ga+v;vKYR#q@WywnBEG{P{t>Ze7rtM5;yVo_G~GWLk&eZ;G`4}p_bcd;1o#ek z$rIlO`@_cr1#fhxaBBq@d-uZ1cl*OHxAEfdvml{~uctp;9@9Xh`x8cc0(6ICAKmzH zhtq%I%3W>#aISPwymH;13{ad_UK~p zi8220%Y!ZONX4+zA70X5fj5O=1A3oT*y;qDHxtmIZ2QAcydz;t2W)PCSVN|@zVe6X zQ-K1W_c{WeMV%Vt51+0f+RM>Kh)z=wJ-#LeqUMCCR)4q)U*D6jZ=gRsAPo5J31Eg? z?zJ4O`&dlu5C2&Y%glNbBcOV{JYwoQ_=qwH6I_GL1qhqybu~ftrw-yeeB<`x?nvrh z+GgAxzNFGr@D>xIu*O>5y{hwf@S|n^KVQcP$ zZHfukENtlSf@{46*ZwZJUczw+Ui2G<7m|KgKa+@luuU|7ueeeIm+1tq4*s@@h0o^i zm4L{mTeAf4t;RbE-$zd;g3ra@g(D?@KUmp7{#H(kp`*>;d9OR+9FCF~9Xo0`k5+Id z;%|Gx7xw>HR8Rh{4adM`^S6Twu8&^xhHENbNcx3lxanucPlp2%n4%oMBV|)lkN>N^ zz55pOTf+Wq)iRQcW-NEm<<2ZS@U`V-Hfqptm=oDLLjk@PapgKQETRjqB?Gt`7dD#=>Xw z_dFMTzvILJFZjA^_~txWFaDlN5JUbCK4~C-Kf%V{3HbX4AhY>9Faey8;Kih4O9f{l z{@!=FB;nbG4ieU;?^nd?Q=7ksxZs-ek~jU5HC&^gaMRD!2Qv#SeXtI&*>>F*=`s2s zs9HweKr`xt+jMz4%MN@yR~D96(iRP_3EW>9#D0R%e+Upk>xeZka+wAD4dC8Gc;1@x z>Y9(|CLVt+fVs_|nRtVj97Q!9Mm;VA7BnSN@E}<>47W_VH-BCD7@^}8N)|qcYkd3; ze3tfU06sq@o_})Dr;X317rgOltMQrfn1xRk9wa_faLdHQ{B_|I&!0j>oXDTk@HUe_ zyKv5Wz4_BFF+Mk3GnG7g)bsjKWgDK5>1IuC2pB`n7=N3;`wt20zbs(^5<=Q zIy3~IzKQk0bo6QC(;X!*c^f@K>4Rh&p9j&D_-uK^10QodE;!#Dk8qY!#i{a{jp9P} zOPdf|ZJcwsb8M0(*7|6f`}tp=<2%hcz72tue^&c}?)D2^?Y~D!x3}k0ukl@|dJ(@p zYtws|(E#}oIA1D({_PAPY6ZAo(;g~*2MG4JoIVf zGaMx^d@i_5@#kn8pLfud_@sK_V~+2m737>BIlc$UXK+5T`qkt6;zJUS?@cP+V?N)? z_1x(wX?ZZ;H`CpI^9-jxXkxd=_=a=O{dW5=G;OB@`|Yml60_g#NiFq$yCMG|>tSSG z#caQu@{F`E#FlB^{Koq;@cxwx)cfQ2-`#;NV9{WUZotV2?{MwL`}EU_EqBGdgX3NH zkMFQ@9U3-8%s&a8hW())N_t{D9H=|&;_guPmWk(%wtMs3Z?~m>5X`$T`-t2sT;0{_MKte`f0{Zq}ogLnt!3|BeW9~;Q! zB5;(S#``!eHUt0CaW9i)wLS_cGmTJg3PlMu{7o$gUx_1nFUvB52<(Q?19q{-2OPMN zA8sH+F_eq%Z}2bF4VdF&j!-VUO-C88z&#w9j&cUd_}~NgLb;hJ;~!R4y5Z+v;?t)% z%D$yCI9d)+WKLthQhB*mtiTwgN`XMg zum$~s;wc7B&JO#J1wV{Xk?{^WT#!A#Kj(#f{lt&PXGBMQQU~*=zI*$=4n@VWXzn><#eA{)bsNRDMRd z^?iQ!zfh5>(Udc(#3hWSGve^iAPX$;I%SxQQj%%}(lxGv?L+vKH zx=EJqN73O?EF0i*Y|sExX#va-9#D#u0ly(b3Bq};nqVG{SDNY zRI>^+H^&v>#Tdm8DK}pV1b~T*2JVmt8=vPad<+6BDVv)b8HjckdZs-Iq&d@2uv(if z$tLC^DtZyF=It~d1{6vsjmL}05|5G<5Pe0+#rb9M{CuwGE!)%-Obvpz&nPw-d7U>K z!B3D+YXn!qb-6Rw2%q-y9!BWT&cjPI9N5(&l$U07SW$wHMxzBCHsLI7BhYUhj@r)m zeJMhx?W{3;7o`?ve>e69JHo9p!ATz^$6?BXkQmv&l;%hzvUiqXnKq)JXMJj57Dfg| zF)ua0Y@x5BB~}T1=rV9O$sBzSM47JRhNjZhzmUiVC+!;+FN1;L+?7*x>VdmOe5)VAaYx8(bN6|bL4)JA0x zwbWSD4Brmb57%}va7D>ifmsJ*Z*+y#3Zh|@RS}7?_eSTLKtkBA{GGzdp_)l~Yz`IW zkYDFu$3vV3)WPmmxpE?LjgETMb1Y})ri^N1gp05s*B_+LsiBZ*dP@0U49XUSa)!#G zk&i*}^?M+DO@2)^#68XEn44OP{D&6Md|#3Wp#fPO@yXPO7}L%_*@FYd+;goN11EId zo+VHDfXrbp=-r|Q=bQ3$4-lnfH;IzNVO@&-^r6>xiJZr&?FHmonj*Ou=U%cvRzdEg z8}Q{X=Yb86u@TNc4@=`G_Wg1i-M=7&PZ`6_p8)0avzL}Ob>JVImtP}KN>^CK%@-E^ zvWjX-Teyg*_>cLZ`9u)QqF-V5l9Ek0#|6}zG9?b4u>XZF(h`xME|$&9!bbg=Gjms< zybizX@LP>vP`;bMufXpX{BFVTPWErIyZ% z+}zx>^YQ*{`~8tuoUmzp4{_9oW9#+%Wa0yPVHV z(~kDyXl>g4rS@V^-RWOpFS_j|!^g72KKg&!UVQvPN``v5X)g+Sxm7%g-+I}L z4iY$28^uT2lMa$d^FY~)vu%5E2>4Nddr{hoZHj}O5|L+~n-N?AbJ5b*&^Oy*uR!07 zl-h;*<{O;5B=wB}eO@yx-ah=S-u7WJ&74ijK%7kj5g<4WM2WTipJksBXV{D86W;dX zb<<`i(xDMHqaHbA9nSz;Lno{!>w=UGng`0Xj4#vy1)W8aw~9l%XrRbI7>zI)jg>p4)ws?G^j%jFKDDh;zM&*gh;t?S zb%cQ>w@sT@;QIyEq!AqKG$i$=4?6c(@`*=;dD)Xl{)0Vf(tdDiU^dX34>}D7=ONIq z(jF_$MOI+AZzE|~4gjg64@i45`enZF)97;~xCg%c?p#}t#P@bskPd!^dSzlG`wRnv z5cn>s4PRtnhzpM=%Kb75d|M^H{iJnykg_hF_!jtnQ})GvkTckqTS_(rW)Ft_yGx__ zv9d51DQrrJ&AXhxTW9}m_T}Ed?3}%{F&*|*V*3)dpSCYU{iVD#gSCnTJ6gx?zQa89v=2(^;Av?b=a4qWh3lAR93frdHufFm&Msd zdzs%OM0V0-;jI>F1*q7(o?~fFE;G6BJ?-W~a>USnX z{yF>dPzjl7U%J*`Jk}$-Nm_|#?!w5>>&1rvzIv}mPQEJPdeTPpX~*}=P@2LS#>`gJ zd1iC2QGw*{|dh322_+6`_#$r*(#xMJ%2H^MVl?n0l zx$v8TH+bQBanBETKi|XkTro=O3G02QxZAgKwLjf%U;BDxC)JC{`=?F+U7Z?0|12Dwmtehe zJo>cd>u8j`=-)-l*QPrx`rnGCr2h)sGU;UgHc-9_yQ=YXdC>!tVkz|Ixd$4YKO!B?(Tkm za|K~A*Tb6-c=>0^S4(&Mw_NSlqNLkf@|7vq!x6zqmG*gX4M0VnNas~5^CemJCq}D8 z&(AtKgzQk6=-CQLWSZK?^qDon8e9<5SK7EiZ(jAb1!a^ zDOR^yshxhUQfk+YwuCNOB8dDi+%km?zqbAYero;IMA41k(Pt}3dqm}m{(5}F@cVv5 z9r$gU=)muEo$S{x0e(aDpqhNUh2PO=N}(H#TZ!<){9_^q8`_Ou_p=m!b5w3)s|MoN zq%QoDo%jvWNrLC#rWgNi)`RNR+bsOLqbc!w1h*35R~!F^t0)8Jy4$G}V9%YW zT1Gmf8ST4#T|Sa!m%P^|4`nI}XO8DV=)^Kg>M@>^M%F>EZDkI6ndA9HIN@IOGRO1d zw^;N#1x-n>5NIIjpzGt@?Astms4B^ey9Ay!9R06Ux%As_?hGR>rxB9QD{p1KEka; z_|?Y0O=l?l^mu;jn1t<9Tn1h2K;(C4N!da^h!>=VSnE zsQh&Ic<#MDW<0NNFI!sUd8sbT@hm50D_wK1s&WKH-SuDBQ9rki`p4tyEqh|d=@vc@ zA~Iy#9=HD%gU@ZMW#mRQqkg(lmoH`64ey|d$eqtfIlJsiBDqG;qx5`hHm42er~PLhy9P&S|9R% z`b6#hUmW+mMUUYMD;N#p9h@a^^Y`IxG4#kb@kcWmU(n_8EW7b(7xzAAJ?K#fyk8$x z8$HARxwY1V9*@^fk2~X@x9CxJswMBw-{GXkKYxj#$9bw{WIUS5`B;~4WSR4^irM?; zJ*I$3eExgun0&M+{=EkuW%H;De=Cg%ijW}paqzd^sq)c=-QZG1QY-2AW9{9atKW}& zAN1%v5B`dNG9T@A3&8k%v{v#R5%I_M?sr)Ihy5E5H7Ul=BgM)4%Y3vxM=He)pj`=W z3-EcJod4V%N@`_dlufmJi_ITX=fBJ6X(Y+>-?x}~WL7@fO+W8(o&TP=KSw@VC-kcG zXRPzz(T^Gpe9-}D;86Ed%y_7d*vn*~;7V+?AO_&zB}9iuU-Jieh@G|J-Q=VrOdlv8 zmJDYWNoY6%Wj;bJSjirlT3G&LNpsSpdrJzzAU|BwrA#i%;?0{Qdyq@egV{R<7ODHB ziS|IaAcT#uv6&FOsHFzKWLzW)*Y2!=pHntEEvckAzM9WVDigl5?g&h)tmvMum;SQ> z5nw?G9k8^DgXM;d!t(7U2OtYf%sxm8WD^a_vAh=*3KT@)B`BHVp`RrvU|K=@OcRtU zF@FsnR>=kjt2buKHzJ`p2KyVbtT*Pl-*_C~c$mVRT7I1X<#!ec<2Q1=}5M#Sm! zgNsF>{n7#IrHph3%Khd`k&R(gbT>3$=cqQ!bPAMX{}Tlm+T>Ss&&TcpqB-^ylHBvp z;0Ipet9u)vOwbj4Im;KA&=ZeLs0>W_9xk))@@nk81L|hUF0uc3(zd|$O#&^t_r`DE z)If{ERBVAA%uC0B%u!ul=jyVh?sA6RWty`~e6!3h+XPw+#DhICl^~mEcF(lpU>>sl zaLg_;r?O;}x*#|j&h)6P#bt1flYCnO^Ky40E9VZj$doP2Tj$HwGuN#%Ft7}@2RN65 zkO`vlr0AWeow=(f(j0<|{7RNnST0g!gL#}tHTgA)(KiSAD!ROxl3(tVxYyBy^`T@LXw;O9{b~_9)-7YKgAZp}#2!+|YpBXt&-_H+53c@|x{$#3WN(7HU}7C4?+&XJM<@fP%OgHjH{@^l|)(i5#NnN^UxnV=`EU-%S0RrGInyTO7=iPk(lP4CkwH?@H*E+0VsqoVZ%Pw8SrZvL~5+DT`<5 zVwS4Ske!?U{+XpP8>~Oe9yz79{=bj7`u|)Pb^l9HRCw{5n=eXS{p)-&b!u=9(+7hq zv5l43hAqV~eZ4#~Zu-J*elZH%F?~%qKu=%R+|_$i?A$ey@Wjtu_bjh_?z$G>SaVmF z0}u>1%%itr?yBM3wM)!sCg-kR_T05g+&$1acfA9Zz`w4TP%$;l3rwm+hlX#ds1g#u z*ct7~xz>z!nu0^kXjl}m2tqipPar6dIg~RT`fbD^$ zl=A8qEV4iu= zkuPA)H@^(Vd~-Y4qxy@{?@+Q*?*nnn51YV7YrbRtD=86q8F!_ecmg>xP` zifw}nl={bvh^rV?e-q%5bCa#=mv5$gt`}85I8=Sp?;Was&v%drh!$2aw~8$&h|o{C zW4`Fo=>6jMKcJ?6q}HFJ#=S5`a2pn+$hc;oUj~65BPp(YI=WHh;=zc_()clwi~EtY z%t}lVoCx~L@;s3N@S+oyimF{dKi*pE|N3bEs$2uIlC*d{MaG^0YVZG?eeSUaD& z{^HN5QWl=NoFebZyARrzPuiEy+n2A~m+#n@mG-3^dnn=+E9|@L?8|EVQrMSU?8}|@ zWfJB|{-LuJ`!dzOOtUZ3?aK`NGSj}yvM+P&OT)e_vM-0)m&5GKk@n>c_T{biXb652yVikU*`;p$X6#Y;&B1*y{8lF^{5k>|9ptM-Q{tDF z2){b`SG`l=mw{J9&O5{3sJDDRdrlqr%^2p!Z^0i5zYVzWh2J(UzkLQ-_*J7R@yo(3 zOFm8ivdr>7#5?j)(;t0!P0V;cPqmEPgJvAh`MNxwWtY6yArI-AUhD86`neJP)SF&6 zpIryNMqT2j*C>e;@@;V6i(WJIcy2q;qSxzaN_wT>mPIe8zN$kWa&{-hlgF@-S16=RW-` zdR3#T)PJ~T(W?RDxq6$zFGb4El>RF z7|-cA41@A%sPTMbQUmZytqZ^882mQr@!SRXz4+Hs~Qjo`bq9$9F@<^RTUoUOSb%zkz=0E$`KJ>G##=y5(W2 zL@FYh4fUqi0zIBb_p#`eil(I3NZhjM)qwFl4yUtH9?}$kEB7`4zofeG+cw0F-%LH8 zI|6SndDx`K^CP`2{4&v$_*LMRCw_H|=O=$w_+_c_yme0l@Jp|2{%RS6-)cRc`{2G8 ze#siYIr$cTMQBR=p2sau{OTCbl|L!`hN|)0q9OR@Wb@ft{J~QOyZN_GkLRm#-wVH^ z^?2T3Soqz5ro?XvZdv%5<9YZW5_pbh&X@LhK7Luuc+OTWBlFOVPGr z;A0OSanSv80e{2$ShV3mFw8$w$xu%wbCH;v0OcH6(fvqVa;5*W5BQ~Yj>?5vWH&jg zqWe**N%OJj3!evLks3?Q|CCJzr-lY#aX2SEI1nFew{HF(T5z5DOWlE$;x-H^ZkxF@ zzflbPH%Jt2)mSfyWAS*SxNkmu0A#r3SQ&2JmSO=#X9?&eFD`0c{hB*VpmBRwhMPoX z(j1A3%5Xa~77|B-+uEpv#7uBIn~UL1H6&P?)(LL!ERm38a_!eJ)6Eu(jju8tK)!IT zdZ9`Ocmu2VB(H_KBfsr(_Y2SA3m=-NP%pCb+j^-N=J16@>V^5iDshAT!q)1AD$6V* z?uCYxQ1|P@;m3sVNDn0H1+r< z3+Fd^sS?}|;QloSNAiWP%E7njJ_yeH5LpQ*=vSN5!4zh>Y+1N(!jqb1%jyKjgDEzr zxP_eG39aG(HXMiJ@Q0Ir2;XWyzKhent-Al)x7wF{US>Xj#OHgZKinX39=HKH!K($7 zTp>5$hcFQ?D!Ly6u3HE$xA-OSd7kZA_$dsD3Em`p-AX{H4ky!qLzcpX`&RnJjSHTz z_%Gxe`T4Q_wbb46ByQv7ku%Gh~PEA5duhh!bvX( zF!tC~+ztjGxKApi8RMf$dO3VaAGQP9pEg>&9Gc?6aCQ6bT|WHe#RU%Vf51Zso)G2Q z-%wkdhlP-Ah@KAlY-6Bk<2JOxEI7i9O}$WLU5l*XbaXaF$`npFG@CM5h;9~zEE}6T zNEGddqM>CHaOhy@NrRTqqd|O|+)5j+>j<7@%?d3D;v1=_Lf;#e(ti@oid*VJAJ=t0 z`-o4vIA5$)kIFgXW%cNizIcDfBO1g+ zr?1>Ac~JJYKcl_YQQI4DZ*RE0z5e$0y4%_tShGFlpQrrGE&Ba|fY9%A*3?tK$5A!c zuHVlFtlIVavXv-Nmwuo7WljCQVr{s7zq(v#RpG&I(eM5j>elanmU^ac{r=NIoAwj> z{al5Kso!^(2~5KEdn_!(cqh_#9-B} z-`m(56#Ctz8Z`C$Pwzz2?`N59-v6d(vljh+r7RImzwiHR4gLNk!)l}J_kl_OH|Y1S z&1&lRHgDVYdpw^l`u)eZ!u9(X$oc34pQ zTI%Gx7(8Tx$zryG<=R{u!){W28&pVIH&%N^|hn0~+cKi+)#GAyBb;)`HC@ebm74E)66%lDbZ+ z{Jvp$*gX6*frrJz|2(>8cTsp`)xbk~_+P5&B3B4mW)YeI7?sh!6z%xR;q6;IK|~r{gD?Ye=UPrPOBjLN ziDU1Mjea4neVv0n{A_&>f9IT~U_bu&f_v-@oho_1rh11@@c! z^LM-8`EB!g1)m?6`*rER`wVh|w}L5+cmk{c|LvCjbCwY=kQGEkuMuaU#}!;A_Rji# z{eTf~&=L8NRoFwXx9s!z>^Gjdgv2CN@oTPN8@!1Wzjl?rKL9{^gHxO z=d1=)v#oscOmjW;WcxHoM)-+zl-W6kgv(bxgZS+fEHB6^}=@LGTg z9WwTSweOb)ej|*!mDwpVRoJcL5B^MD)o)Mro1uQQ)UQkZ=Brq%p&$e&a zYj1!3*Z=AEYt!e`mK*w<->0T(ct1UwK5q?F=gyiPVZVL`!O)B(cjQggqtfTU;!Dtc ztMvJIcr^9-$qS?E^Ce$JYj3H7sM>p6J*xKn_V#YKwRd05_M+InM$^GE8|=X0b+sE0m3vZJOx|MblI z>GNcXV7Na2{%%8gEth!IL!Vy{Ji_()#R`wQ^m*Vl(NW?0yuid`9|uK`53g09AJ|?~ zpTFO(e)`-2JR~z{LQ`2wi@wn3H_0MV^?BYM6!O&P%g6k$(&ye~ z&>R+h{$qPQTlD#te75QH?a29mSf3Z-OC!|hQ(v{{^H-Kx^!Z{u82bDn@u2kiJ$TSM zLEA>w=P#axz7+br1E(SM`L1q}_4%DF8C9QeeI=qkUkclAZTj5D_Yw4YOEhNF=aW#d zVfy^O&;Qfo;y>PgZTfuC%Z5IG7)k2$-_oM#^U0q@)30uVG4**r^{Dh~H}$CW z`B|bN-Tr=F->CZh=%>-z+w+pGz0K-TwYN?^s`mbYM|1tKzE9Nlb{r6_z;lX6QOc|{ z8xV};;X<6xFO?;O(+SKtFBtQMQGcARe!uYgX|iN6-B$k~=#^(1+VStL?f0s$&-m%5ck_H76dzCVUR!)T$ytIsoMX}tL9O6>WoaRlD(a3+cvssdocq-* z=lYNF87L}`$2LQGh_c>~@L8xlpC-Q}5?(Jjmjz4rIZIz4HrSRvC!hqHp9M%YO6Q<7 z_V4q`x1zMx+Z!7*_qGh+UF9sn)v7UYL1>(vF|5E@vWHI@!>)0bd?-`bJ4-XU!z}(a z)_LDwkV4s^vDq2-ypH$Il37?eA?Fd?3m%iP!C7)Wo`H?CBnL%_5w@%ykrZ|Ue8tP- z+e|VyY$En3_8qqDL6#N!b}Xg>JudnA_$lr6AGlIG4c{HA#4QbLHt7 z8@#=<=iZeO<19T7?a{U}&r-gdUVep9z9^OOvlqmtx{E7g`7r}*(D6y4Nwg)Lr{CAB zU>?95!t7yz*;9wPj4(4AJ4-vGs_d0BkWy7YM{@0Ls{Y%@j-Sf*m5C0^%_#Hct3vOw z5I4GP+phjt|bL{nGI{l0MR$nKC+fQq4IxZqZl^O5(k>%-iCDy1m>om zB&<_RoeIu_!DTH`SCs|>m~U(FOw`2>Klo+}Z=@pf`&)|N|8DZT%lDfr?N`C=@B4O< z-*4ilHU!Uea-?tPS2zBYUZ%b~h)-ek&P8;4EWYMe^n)wyV*n_kJ<2{67UsqN2)k+z zVEe6dc-5eB8mZ2kvMMw zGu40_nWIE6IZJn86oL-aEPy}F0XHZ7X3(TPUHLO_GvgGer$z96lr#I2jJy#8|85*? z>|kUX#j>5NhQuH%93!JJz15L0+85Qxsvc6kHWT-+ffwtHO=*H%U*yFZ3Z04G{iV_x4MeI zIiAjfnXKoonx9To@t1aDUU??cZr|vh?!W`tNR|g19d*47*S%cd_Uy_W$fm0KEW$s+ zVQo@`zqDTh_rifuRmrZL&xe>RK?U%472lrPGe+GR>UXRi83&tPnaj7?1!7!w67Z-< zs1{|K`nE{|#=>0UapnRT2|zJHfU70}9)2n`FyAD=B zedm++>G~eGH6&?2LLOw#y*(B8+BvzH>?w^yhZe~Vhod_uxV~)s2Dxfh8|$yuc6iT5 zhWDg|hj~f&k5^I1CLPefmxwQbrtfq4J_xlgShyg!!x^sPidfgYU*}>7ytiPB^=OZu zPw|6^2P=oRjY;1pqJ3|5aN+v#za;i!UhPUX;^nEy;O=uk1`V93`}FvsZH%I~J>5cT~5r{Q)$G=O!Mz_cxCqUYV1Wl0hqg&MyI z8{CSChVwlb2O4|8O&p#we9kRCRl5X@b35@$`>^eVxn8Q+V;_Gs13+(&umegIfb?G0^_6|KMu|9Z{Lww#r=&|K4HE9)isy|NUZOx#w}x~zc{F<9b99JkH^pK0L;ha z#l`sJ=W}p?Y0T0x40h4y;t>GbA4gN%f9w6G|Ay;BG?~Ue^PlhW-;lrot#Z8gc`O+j znOEaFLdP0BdVGC0;76Qh?gISh@Q}V;8`v~9=5Vp&DOPa#69)|e^8Psq+9f~25*0|k zOH^qCh2$7JJT9in@xXowne71bU3kQ~;YG2;cLW2@1qk;t^Q!ht+55 z#CDL?UqHUgC#nw+)z{jq^F6Bbht@V(2sd7BR znyNEh{uww3bj%f{d-(99z1z$N-vRg@;?&%P@0LB%4uGp1Q|u&Nj7Kf0i{Pa3NTYY$ zECE!T<|t6*M?~+Oi+nlcWoTFd?E=mvC%taP(s!YxN8qk~Q7wl20hR#Rih&C34H9f2 z@+DZ(qriTKks;XGHn4qW;t}*u!jCrfJppzCO91TcI@s0{>;U8|U>ybFPk&kh{Y6kI9uoXB(eC*V4_+c&}=iJ89M_{3<~BA)IVfy6iV0{NRd3+}qBoRN4KF>~z9@ zPi3bfn=(I4-s6Vdf21zrH1us*(^mZM^3Y}HLv8yb?D*3`RaF*^DR^+Sz_f5zVI{z4 ztHK|`LCnTyvlBS(!v=8-3lp@7-yc6Ez~=ckBGG| z)oXwDoweN4(y(e<4g$XYxkXuu?#!sqo{Zt zE0UW8$v#=pHZnUQSR!`fdk!ljwa_6Z+aO*5h|zhd31I6~X#>u#!9z_DdM~)MEM%ft zseOUy6?{AsIBPak+ku%QqIv*i$^#&W%zea)j5r!xt)Tvxa7&GY(K!t=# z(Ap3xxyVC7ru6|>eOihYcpF8u3-`w#E*>JLVU{3ta)S2px2iG)o_6BFu)4=FP1s@9 zx~Y2ICv0`!4zJriLfzZ?vn$Z{ z=*_U162)F-qxMsKDFZ)yfQ%5-hPI^m6`qD$R8}u!g|>!12)!5jDpVb+R14nhv0{VQ z)49@-y$1OBKEQST9$y6mlNMk-0>S>+LFU6hLHp;fD$Jv1wEfLkvCzb^6AKKPcJYY90g!ci4 zI{;C7xR`o(WLxyz9v42)>nwSQ;6?6G=57rZBLjGoc-e5`EYWaztjo7GZ}O(YdCu1p zNR7h3Gz%LEe5)Sl0Apv#K2&r0_PPS&P6cP-m9p2E*a-V7Lw(Lto_3jMNnPR3N!z6R|ZF`z(yZVt6KLXF;;FSw{mJ=d>$8I=;i&H;=2aB(bvDzUJAi%MAru7l$INB5dlhr%O>N7o} zdcIM;^6#?xE2ysT?Bs8_z6Zm@fCF2Qvt+v9>UK20mEfLL49UE>3hO+(J%;$f7fLlcGvx@#UpgNm;EfW-Tg&+bim)f9*o^$os)JlJ3T!xQN5 z2w5;r%$LsW#LNn32`y-Ni;1;?w}v}QFqRM>u>e@K$ub?k-A*}B9_#UyaXLa2G(jm7 zZqbYEQ~?`;Dkd**P1$jG@qpAAXUQPZ#AxB8H<|lnU&Z0#tON+B=BbB^uTQ`i4IqQT zU}vS06!7vC=4G*3@tsNFz&m0f!q~<8a7r;3Dm-+Sj89~yt13Q23_I;%nG=&{obU2C z-|Y$v_*CR#c)k*?6k(eOggM=DqR|e}wLSry;jaT9)R5>(epm!yaGOmK0uqht&eC@< zN737YdSsD>u~@KlfHy~c_T+^2O)wJerL z`I59JQ4+F1`wCNufS+svt-L?wkBg>PQ}(8f1ZprJP*n8$ww+&+S;V3W$e3oATz z9ED*8^?AQgfzIa_VTNk4@EZo#mEU?PJ}z!FJsfshm}nEU=f&5rTcf7;JgFFqDh*Ca z10LiQgH7T>OAUPl%!OSSc$I$%yap(|RCmBWs(%~a<<9|vyIlM-{aT7y{5fg!&D@&n zi-q5*+&HQ4F&I~J2AXdavr&p>mvdOPw%Z3UAV@YyWvme}qHVRW?X(4ZTq6iFCY zSfJ6Ow+Grv5PHCa4F4tg-)zSr+L28F&6#`G@B~UrAsA`_NTVte1%;!wqE%U93yNoM zGnk*Ee!Gfae1iqDsV!ATmbUd}tPcG*Lb3;LgGN5#iv3i37mGcvcioiuT#vG}sMQ9m zDhzR>e^7(}+Ouf68nP>}G~sk;daq>VPA!4rp@ova9pHcR_uGxb4Blb-cO1`J9A~bF z+`=D{ZOvq|nQUbyohs>TNn>ju`OGpPj!P8TL*Qc3Q{q@@Oak8i_BK`;>XpkkrY+wD z94{aj5%r+oF#rorn3^6&jP&)A)6w@{#?N6R}o+$PU5T+yAd=$fuenc;ryzr%?K5?(pL|ouY z%tiuLZ+!(n*mYDnzJoKPfai03iXIubK<=BTO{;?PyKT?mCj-5;)XS-gY%JHF@ ze9ug7Qprk3Q?v?$RSa5HZ5>(0G3)aSezY!c3ldIBNQRj6+M9-SF8|L#{yq+AyQ(&yxHjITx2QQ`yh#aZh=>F4h1vC{DurcmHqy+D=Y&t@{!Om;Mr9n9pJX0okHRyj^rsY-_^S>@w^U z$tuU?U@w8A&ygp1u*)Un!ENF+DY>a6xR>I={yz$WYoR8(YB*QlCPS>|lon68XN$K^_v#R5_}UH2Tcv z_y>!jzx3QH$4WD~+)Tb^CYPDXm(1h~X7X7xx!6oTWhS36laHFoht1>zX7azx6_*~d(tuacFHUQB6?--7e8Kl$@6Vy@n{RB)#@ z_lRJtv~GeCH~d+=TnBeJAwE|kVPV}Rc+^J98sA7}&q@1csTik5THzG&I!=p*RvF%Uo6i8X?T^ChWgiZ^?-gZ~sX z{EIaBlanQZ6S0UDgEJlp0ZQt&p?K6@mo>hXH5$np9=*medyU?#ahI%dyeoCvP#9<| zAbZhXb8{1c+NF|jQjmq#(Oc*6Wwxw6o9q*~kaJTkQy`Qsz{poQijboNtaQvLBckdA z{Gy}BqD^$PF>mAwVl)fkugamPQ0Ct^U#c9Ls)0&}hp8&ZLUT;!iJrgkUXICgQn{U% zD%kHjH6|B*FUI6iGD)CMOF+;mz7{2_9F34;Qk=vVKyi?o!tb~h0|IKk!4v-!YwcH$ zRSrFcGW+y0RgT?ea;KTxZYDo8lkb_yO)3d}pi-5Ny-b1spI1ow9Iqnj^7UDbAFWXA zZIeBn1;r1GH+!@z4hf3;5_f;{hw^2@bAk^*FA_SvAoTFFfYVLZNR>6-mNkCD8^O0n zkg(MFj5SVtC)$XEG%>W>!xT}0#1?3v%JEk`h)PusACgAz`5ZU1Se0Xro?GRhY!d~* ze`fMlGkJ@dywOZvZzc=OmiV-y=2wO};pJOK;wP~`(85B+aYgYxAA@@17HfP@8=*@W{|P$2)5tnrAfF-@;A)m~#9Yb=*FZkIKR zWR34-UsO4QNLbp~g-30ktZ}Za(OK4bPp?sBud#wPE@BM?2d7{zdwky16p!yle&zET zxC0`EK=IpgfgoPEwA_6pATf_)LYIIaKZME8pZInMi%YAoJ!SPk0KzS*ER4C^Nr1i(^0+g5Fh- z;XNQ=v~heT9SQ8w>5NhKZ3T+E@Hh34Q`Mkd#TL+$Ez~?U6uWS%s%#%%w8t5gSXL?BfvkQDm}}#C%eRGAr^{T$vyx)GBM^}uxDdk-6KV;& z5TZ|Uj#deqTVc|Sb78PPOxw*NX;1!wR$F0HJ?<>s%U=3w2JFdOP>&E{$1m3^ki!sG zW?YF6B%_IZ(FEsD=yd%&NJP2Tqn)AxZ64eBP}#?fb|%PnQqq57R!?9mTveNBIqC(d z03|1T7JbPAPMU+I%`cdO61x3Q#|Ku~>(N_=eGtz_V5Oy@Y4J?(&Oc_sraDaYbh-9l z%z2zS^pw`Etfy%g+y+b!Ygs?C$L)VG`JBLV!tnQ`y%nr}Ek#ox@hNnU)?_QsTpaU} z26kPIq5@EQnf+PRui{jXncHu$Hwi$>8^^_H-n;qXvaFc7VBex|O*mM!g7mW}%Q@C&-%gaFUdDsg;gFNtjd#!AVXAT~5 zgQC_Co$2vu=(79?bgR`r#w^b-c^hWW^i5jsBQTu5P_S? z>G+OExF0M1#R`GsJ;(wb+o5|E9auUd$5F-{0mH&SzLqwYpf$d~<8NXo5$lcT(YNir zI{!~WJJUZx$4K_0Y1N-N3GHjYzQ;qtE~&)D-{%VaaNKz;kqhSqA_RWup_QB__=jg3 zo8IJ@7F_~=CVA4{*yU^FfiZZiV5_2hfwMf>HvETwd>nLtF7#cphBOF1fHgk!4!%8o zy4D4Q#&$z~ZSDDJNsV8+=E2y=QEF8vMk#cj7^M;(MT${scNbH!+B35u6e_iDhiyVZ z`j3139X>HA#tHaHUZY2lOuzw$-!*6AGe?6DkicxzU> zd^>pd=}%4r7+2;tZ?nV2u@KYAXW-f6PjP2{WB`ZvfO3fL3Ld9_GT~zGWoi3Ph(@&5 z0MFysEPGMKUpNE75b?;5Gp91EBaU4LL--_rwFP(07M)$2YzFc7I@;W z5gNPrc(bCQWJl1mW*Pu!Pfa5ci7#Lgpr2F(;Q3LdPAhy#uoEb33Vit~K%BV9BMTEZ zdB|$w=pu3`Cve5DK(;Dt60<9_cqQiGq@V_kfN5d+^F#Z%e4}vY^B#Qq#XeGgv-^g7 z6o0S+@E5-P70P?&NipR3{`euqHCA|=c<#VPt#JZpDsW>Wfg7p7J+Fha;D-YyJ3I@H zm3K=Vaj|(#98U<232LJV)QVqZdS@$GZ$yH%Ou=&K2wLGqq_>*_H#rixi3;4x@AOG$ z!mEwmU8Ryn{*lvbhp+Qaa0-Aa{<%WH4Qg+OR0q^Gf4f)L zI)8h#1P;Gz{x(9*2G8HmZWQzPXGs13wez=KiR6`MB2BnYaUMj6xIW*i{@2G-guU74 zn-m9IiY2&+^Y=al?(1N~_<4o`8gc$+Dxmihs1?7+^Y>f@E8_e;gySI6J48p&3NPaP z-8Wy-8*%ucR>FROO7^wby-rGl|sCU4zm830_Gi8P{7{^1+0&+{Mcb6{kvJM zq9e}V_Be?nKNo$i`risKB0tYj;3Cf74}Or~&e6dc{D*B>E&BHy1vKLPouz+C45vZtzP>s*3%uIs?W=%BoWDK=^uU)EdNF^G zIO~|d`J$pZe|r`f^S6(DrL`AXL9G<9!{_h)b-*{~uZH6&HGe-vQpkVe%D-sycV(HF zzsv9wdHybM@<--xDQh=;{!YAB%-=_#yCdu0{{{1R_8sgP?5`r}-z#ut#r}Wui~90& zHw7-@{B5DY73kpV$yZZsCB-TMcgmkt6)W(zc(pZ8xPc%-u?<) z#QEDnft#U&v*1_T{QY{4q&MRH-Gmb((%X?hb$T&>vzwz*ZTfeisA$gLX;&Nbw@ALy zt`J#4ZR7r$^Y=ir+Tk1Xw=00D`P*LMS_F7v{<{24g2%5i?JaZ#E-p`UXIArDJLSPo z@Q(UXH*)CqFy%#Ipzq{fA;A+{M&HM@YFB2Z^B!z!@ZuOv4tZ%C^I*D4 z8Xg#s=E=m485*k_LgYvt?^)7I{JBh+)ps=_q2G^(@ z(dM8i(Q?D~pHK-0WRGt@dd?meV)}!-VyoS}_;x0(Uc7xJ4$z3+{1epmq5%yl-ax_Y zXpR^-HAO=}T}R7%uUJ>u>G&Qst#s@vHtAp^#k{)I6MNJhh)<`_a`D4#DszkT9{3T& zj0m(zlNdB7QpApzm`Xgf2LLPB3eTclo^qs!%VZ8{J{$hRAHd#~i@Q{ce{s%4%*6I0d_M?=zKP(;w&+di)eHZB zBFw)*uoKS2#k0d>wFMKQ)qE3^cvq0ihf0W@+pRq?4;I~ZnBM>yThualL2PIlh<{=e zh`;-0xH3D}Zw>9z?UkIXB38+jwgUs;oY_~@{57_yz34`lzlB8R426s^vt@zH_IbY! zbu-QvtoT*T?Cc7R!1p|_koXz6!Md$A0(t-%S_+&_BThfSR6zTmyddL0iO;x5_!Q1H z@tFyufp)bGA0v>9hb|6`k9Vdg?V#wX0qh&_Y*A-$UVQ2T*eE0Qm9n>^zrKjtUl>pH z*Xqk7^w*BNB!17Kzy3`8wogSV+y@H_v$hg;1<9d${8>$WXAxiD%dxE^Tw_llv?A6O z%fL;nf_Tp1_HD&FMVmHnFK_B zIwN>8HxxFbTS4qr!5g4qF-!g<#!dr^G|EmeXaGwgM5ZMUcjHbmQ$(EMEKEOzbq@&JTvXh)Gb5Jx^Ant3$imViRzhEI=565dapv8H7O+v5e<6S%}0Xy)V z1aBYI0xE6+py+MxzZJ zWT61D^&12?tI*Ei1lSxZOm;HwXz`NwtRyz1F-S(H*&=u=Fm=<$a$_7 zNk+NQE{T$A57;u)3Uj!U!;M%bZ+nO;m+uGdap9_IgNAjr%QrotGOQUwl<<_FAx=oU zogr9#uQo=2Y3z#S)m}uZzU{YbQ2Ua<-5927Pv+*CS?Hxx-g7C89fHr@SW5eFy;@#o zc^<-cwYOS>7Ko&t;w{#%5ay6vmGLbpM7rW!a4V)p2dG;ZeRosq-us(zc@{_rA5ZSD zX>;nyZKiLV+qY92HG|@7Y-$3A&lIANmfT&=UqCqr2_t0X@W5GdbeXtHNy&=qt6y6iMyz}62ner~r7vxeX8MkZ+Iks8N4=MMb zTnKqKBt{Cf&?}&HKO%6n)3C{v!=ui-E!$|sCMI|w>3#2kNu2la%0yk#j|iLv$zJZA zU|^q4>|1#h_G7eHilihDLp_6s;%a|Iyxk0igs3j___k}8Vf=N}vy{GCVyx!{UyIiW z^h)eR?A@?QDD0`fI2yR-g)#=G^`jEpz*5)%qza^GR z$Je3vr~YD{9y)y{-(wUw7#s;M7!(`Lv#^m)(O83`^KBG)NYOQg(MN^)!%9zEou2JF zJugL~X9XDO07*!gWHJz$XNYq>mN*c{qY`q-o*Zk~m*JK2ZiY>m8{-K94(E_olFeL! z!B9DnyijRV@^Cp}k|%SMcOYF|@(^{Jln0pTk1^m%eDjKKf4yD4W*#3-e_-mV8Z7k; zdYE!ktY{#AMQwXUUn8vILR&x@-m}MA3z^Yg%ea+Rn!&i$qIs%lET=La;QY-(Pc3w= z9GtWOidDW1?YHqGsL&pq{_`nDz(RWMf%gXK=fT@UbSkGA3J4jK4GA&XL?LK&bQ;#1 z*Q=tUobP(uQXh1-n|Lr&JwSO{h6>jYbn5{7*31;@67mCY1c9;cPT`QIlpIWSP#?5)V2T_BQsA$h461P{ z+(@&8ucA=FXJj0qGX*XHOJ_>DQzVwO-affKiOuxj!zx*yddK3BGM!9 z>DH12<+5)T5k;sW(J)CDDT}^+ANF8*nT__@&1BlVguKl6I7ULH>;XB#Z84~QOusX3 z5$JDNkq0IWBzw2r^vF!q6UR6fTko}D+oL2cmw{hI)C6@lpW$zN&ZMDKKKFXjQYF!t*A zsQ@toKUxO^4}I9_cn3Y+2)B&*xGN!iC7a!u+h(>cY>pL~$LCIfjKc-$3cd*Igp!h4J{miKIZF zztxKV_L*=T$Btd=4$wM_Nh$xBgzqQ(lSjhw&mJo+)?fpV?p0O{AjP> zfX_C33VuWQZMF`a{C1NBekXyCB5<7_>OKDf&CUt!B*<0V!w~VkwRArfM+B~ez!|I%>*g@d&o>u zAwnvSgOGtT^rUTdW$woPKj?$KGlh)Hi`|yz!;$@V7#Csu*+4DXm7PODiJQvHJ{Rkx zJj(fGhWLYoRJQj>NUW2j{yamzXvPlP#T<3c9Obzl{ z4se{u*O{Jv=q%Xp1n=O!u*|Q$-+KZ%sJz{KHFurZx$=I0ZNp^jI-x}SvAVC9rIy^E z^ZOs#lPDB=81_kZZqG)Y*`62xW&3_*mJnVk-L8w#o~l*k4BpDhDqZu>?*@D=GGp%x*qlnn_Vo2 zZX$jhO}xkcly;iuu%CxNgvfqVplvz7p-p+0u+Jm>#TB?7=Iq(nJbdLX#FiKAa{Siw z`K{$YG0X>EE8c4`K)4x7J8>1w2N?P}3E7qL1GuQx4_9a}#To$Ttqe`=stpA5z^*`^ z%6uPzUjqk9)`3!%tONL~LQfgv9r6KRjxylG7=b^|AJbUGrG94l%nLo45LqpgckZ2Ze|;WPo`7VLz!z>hozD2Iy>+=P&sNCX0jLziM+rH_PJhvR11K8N22 z?egGo>otJ&;0sIWEes>f5SVTw0|Of8!K90BgH4yGCXgE$d1=47`lmTdunVS50s%Sr z9t9^?A26-Q-wYp^CKGm&UN4ITT>9O>P$O<<)SjHgzQsL_yfCyIKRtYoE71G`xA4O1qKZ`_sg+mY9cvpF(S__A&z9E&;qb7RQPV8WJMTdl7~J_RXC$J7g^w(37Vc zzNrb7xjjLQTqs>3_jfqg!@dp+dom<9dzc+qKhvSc-zY@mvh;6QOJOKYuM%IJ=el^Z z6z2-yLqy>U^|YO#Kl|_Z_ZVbfe-cP)rvno*5NI$UEStMa2(V82CM! z83DiLmrMM3OtI=&;PedeQ}Ryoi!@WVf_R(R2D3U2LxVw-!Y%m|E*5BgJB>Go1QP#B z5U0KfUw%mWSp!}N2r+_$JrzbHm<4emor1g$7YRtn%g|GRd_EyRr$ZLyU0@}qoJT~ob#d(E&S{}Gg!VdOEHL_$~{ATe-6RakD(tPl5f?L{|bW59PcLTdp zohw;%3T#kggkRd>3ph>_!AJB-)6da=xr_r9<{@<@q|97M4sa`+)jrByFch`u`=+~_ zU0H#y`}`S@x_Ow+Yotf#H|a0NPd#z2rtNSMXZSh&MR;bNK`|Q+5>tZwwl6Bb>Hce7 zZFDFXr@@kp5czEw@j74NrRF;)d-)!8xsD&r+Y&i}X$y8G=5AThG~JD?kHGY7IX5EV zD)a^M{W8k@sNnpC|JZGPt^Ka>eQ>AQ3F@s5h` zzfoRmy&~Y(Na4r%a~g5_0r=HhUSGRQm#UX85@dby6hK_`=^vNZ%?!xD0V^OkpOBAz zq98X|Ua#A!V_GfYolkhr>F}b->k?G^@0QnD=X0FG<@NB3f498;%ab6r9X3*=ME>dg z_Mep3x20R@(B!N7x!d5!aQ#BN|K zm88zoVFAGwt^VifsEzX2gykV7lk2(hmH#o%_fj+xPOqjeEm21&!pCZb-4e` zZbYRCyzBO#S^Oxvw;HAf)xB6>s`EG(Y_wv7KPMJ;6>RW1ku$e?N6HQU$1}TRE$H3W zjC9Iv%V0AyuR0Eq_6g`CvCrR&J~j9GeFcWNE@qwF-@mFizYww_xVoE(Pq@7KJKkC4 zQCR$#%jo#C89zqLkPtxF#@ph@mcy7DEq<&VrU-F|JWOoP`E&4u__2H$KZc+w#*ZP4 ztY-Y!L z$ZtM#IF@*T(2dBF19HT*MVY&cj)qnl_CT?z z{j?z07Z-X4z47)V=#7L7y*Idjm+}i1>ez0sG;w251lWQ6&7E@jvAL_uyZ2P9*#X5&wH( z9nf}S%P1Jqz+ZMgM*)_JCa_F6OZlN`5j19u#wZarhSA92Xq*{&H0GijgtZ6+Yp>|p zSz|m5yODJ~E~q&kJ;iuD*TqK9ZE`$5Bt4tC`wb*cei-RjFf7^$Y&Q-4q|*npy!sNG zN#8sheLP?hEa%aQ>_s9wh}brIW)7un&o&jNmGAnvu?)`b#l+QZD%IqVaR;dUL^z2$emg_@S}Y*%$g zH{FPdX^UsW{>3>MH$;h_*2`dl}H&C3;Y}X#hmHP); zPCE?8Vg^!+0dCid`D^N}ilU?ZysMW>xcKSj(ilN*aAMWvmnF`Pu_C`&;@rwZi{bw+ zmNEH|Pjdbj_|6Tz$n#jaEWjDkKJTN!A}POaydORI3wGqj^jKJrc(#V?>+5h@XBZe7 zq^}bf0>g0@49PFt*D}71uA8nve7@ifO!=NHyal%mo8(}=@El(h6O+Jr&doo`j7afq zIoL#actpwgw&5bI4NKkeI6bVEaf>{Q6DNo;TBt)rqJ&sC52MFqjGH`<6el6L%;L`s zOfzEL1OV1(>OnkzXp?!~h|7Z$V!Uqn7vOMmJa79gLOcXw+I*KGeoX=gJ-la8ejuyB zm&EyQ#L0PhK;AOQxHj&42%u+rS#Yv?20j3cxHt<;APxBLw!}5q4+SFy#NixKg~SyI z$6VFNz{M0U$OB^NZ3}Lev0zg9bKvlo&Y_5SlTmPKG6W9CyW4&d?j2jbU2xc*9w%Hn z&c{@OcYro5n^KiAZq39;90SeMsTcBo+)M zt8}Gd%i3nR8{ci-cEXKaYgf84`ZnXR*}d(!_9sMF@n|~suxh~^FMO5AHv;V^sW+0o zn(=X7MSs>BFV|gwt`RSXJvr9U@uS34 z!+Aeu+r59Ko=t8Oz@)nbF_5yO!}%eCJ!#WGTF78eGCuouwkK^nYz0nbOlpH*IoSDN zOhT~SX74rpb{l*Iw#>w(9A(~i@QN5MwA~m;KnU6x?SerRv29W*KM^p;{ev=d$p`?< z58)%nBS{f2N7tkc7*tjYZ6d#{q1+5Tj(E9MLvRgSY-l-1>KH4x@7&U(%OoVCetxoYp_2L2+>>2%UfQyl>+DjIrM#--GR62lm(cf&E!F><#>dSYo^!1eqB!#}ik`D#Z7x z4$p-6fZ0Jucr;yf;9XU9VQn}Iy=JwGjRQ}S#L$NY3uQl>@qOs;mPB}knx~fdBzjul zc0Gj2i9jJ9Y~xxW=RJ%ZN03ksO;*A#DX#NzAx;kNL*9wP6oc=R&Ky8)Y3~WN0oP(} zbTPsu$SowGu^^zig<-~9I-UKh_(j0 z<-x-W3JS4t2sH0UF#$uOGTrCFOG?=Ldy4qEF-cfSsqi_>SUG_D{mWsMe8Scb{u5m% z{RBDte(OhjlnjnTC^oE*!r)&p)Ym+lrvpzqR}D_0IQXh2e}ZD)4(->>i1z-6Q~+9i z;^*{OH8x?M2W*EYlcdRd9>D&_QUXhdt#VpKil58k3W@f99kO(>{S5m&4C6L#FP<%v zyh(WBrwfdq7zg{gvTHTp6REV#Q9xx69Qn-B7Mn=@8>H+lwhB zjJtcZB5@4qr{DTImJsFpnB>PkQQ|8WTvir^lbIDzikzfw5&g9d+%GQ9{sU zeQ<2Fcsf>I6{Rx9NAwq>8n_hO_DjT&y2lVXhH~f}P$XS%`Us*DFD(U8=h}#>FFmPI zP}1?)_6upU25@)J4-rYu`LU9p5=>68=+A%_r>bqIR>i1BoTYQXpem4U^{V!+t;Hn2c_><@%% zc6A;vnNTv;QY?lcKzAi=a$_-8O`M)6l#IToZfqUtUHeqkK; z<#VDVj^RhEe#?Rn7FZK-QR_}9$nmvt2|mX9DJ;J3 zVVuX+WG;ZTz?1QHQQ!%kVTrHHjRMeR+&m)j6{5QxcQw-g6hb_h(TAoBx!+K83J;67h*5agtH!NSQ9aNurr&RDp5OPAgD?3@ z#CrU`@i}P?{8}X1NZfE2+IU!RLyk{)JXDn4vxLVyt3zf~)KCd|3L*E`Axjee;P~sU zFfeaFz;pcB%1+!DC>j8KG5$t8o(jeTA7e`!g$@;zv%f|x)*Z5mr|(1)w~8j5t8x*K zm&V9GaD7(*#1IGXMxg$`gT9G+Y#HfmxmeIAz6*A2m7=dU{+rhGcky44pUQ-~w({Sy zMS}nC!;dygZ<`eUvGKdp8Yq@7+DOb{8_9YbznA|~b;#tukDnGjr{PCix6(3uqGC8T)%tScK~R&<&w__bNY#L8pv3 zJ=(*vu>}uKMIP;AJkLge-t(fz#r~zMv`ky#^AH=w5WOyNT=1sk1=_gb%P>l;-Odv& zZrA3ZIYv;?oSSx7nQ^n_0Vi#v%AW)634@j%q$gT}>9&|xp<$EDbFduCnpW9YDB`e? zr7w@P#KDqS?Y-JCp=8hwU|QnF11asux%IW5*z9rO9BJLEGVO7HH~Lqh|FX`c#_1Gn z7<#31SxxFO<< zxV=jN&>FXQcVo#?T@kk@;4|zKZM+tGT<>>zkVMA=Vb7DtN3azIbV}qe=bLK{O7Raq zRP5)O0}*GX;`z!L&sU9jK3`KyNFNUKf}?>0{pWC8Q3kh;7#RpNfS3gmlV@NePCDIY zY7!0B72oH=Q6IgyT=?P~>=0lBm`TvpD!$Jn;`?@)@qH&f5##&1fEqKtue0<&qGuMY zhv=}rh$oRTdvA5+IH&+W#8)2j_JFx`rVHVE&XWIPg+Oi()KVdS0lm1sUtvgKsw?(; zcsb2tMMegCN5dBk?p+M@yIil3rw96Nj+bK>HPBCtm#|CvP77WOLdchLUldxS=5K81 zZm_87_tXf*ME?$9a3wg2HdkC%C_fC{@2}4IK4GU9SF1^Wknu&e$BWQTD6ezm`CI|6hBVGo8y4T^ z^2N~(uY&xH^RRGu;qiTxQp4rWoBD)v2JwA#JmK+v&G^0-x?m|0h|i^SzKH2ZXQ}u; z#EHp?r~X9|!WbEd&vC(@ZCUtxzSNK7Pyhpp!#<0=RQ2&nS^-<3-5i`W1dqy4K|@}p zxcoOD^6~Z_m|7<(yLecz4Jif#!b7UX%v|BCb{<5&^ph&&K@42?gd>-{sx=D+l;e!% zD+Ps&=KI*-$M+>ax-9-tRfyi#kMQ9ib&2qg>gWnw6sIM}QKRW0C!tb^j4!4`Wb|l- ze{M@M<%V1j7%`g=Pri;W zTV4EW_Gg&<>c!rsy-I1Qf3N)72nzp*{JQuz@{dh^b-D?xa}!ucTiwj$p9aaVR}tR< z!EiO)$-$68T*|M#_52@{UlRaR%9~~q>;nXQtq!)q^2>~G+XaGwW)9&c>+qt=uN^WV ztuB7}x5}?qf8{7ONPb;D71X?74&Z-CehumH$K=<}Uuwv&XYjQF?NC$vlhMTFKXZNs zM=?Il^1O{B0#_;9_j%si38?<6sAn zZci$xLZ0VA-b9E8Ypi3sZmrl4n(<)VUqRzTEv1N0Hj0V46JLm?V`jk7gWn9r$L)6B zMXkp0(SYMb3w#3|2Clhx#0)O_)7(2^V~VieeK$qeQiSU*#&=C)be1b{VbY~s(tdyR zdFLZ=-!3Wh?#v6^2#*zhZ*K0XQvz3*(}LP^w7?Tm1C06tTBr*deRy~Pu3+->B$C6lb(ZjMyBUXMbDC34SF(A zk@PG?R;~0%Vq89Rd;nQY$NR{KWW4b}l z6ci;rWyq?Po|@zHc9Nv$+B-~oeE2S3z3EvrHYz=f0n?;sFrFgu+Z+VJ5&1?YJ&&R& zvkp&-Ko6}GDVPn18dy>D*cyGzk*-)^ywB@?Z?~M<^fgj zbRsMHTW{|{d-->5<-f+0Dqs8j4oE24F$5$U{Dbcl*1Ny+qR)qPAYu0R4zv)dzqhFV ze()B9f4T}~- z_9LrSdTP$^_KKd;StdQfga**_>6obVyBsi0dM4v35}rBt zPwBmZ^=R$%B`W&*pmm+TJ&hYc-!xo;7-fAj9WYJ$T1TNTl%n+C4F-KvP?Y>shO9{R zxlUT>)A?&Kq?Bd6f1Dx4TRTg@()GZ}P*nbEWUs$M)>nMF3r}JEwL^T*+0Zv7w(`%L zW_g3Z5OoFphqIR? z>>SY4PPuMR-!69|OC&tae>V3O4sRpNAhZ*kkTxKqr@0A{`yqWFvS4@^pKbSGAHvUK zx)2ltX6aQ3TOi!$VK_gaor6Z0c{4IOCLl9ftANxZr@hReJwwRN3y?^jlt0MbsJBC4^$t56K*F^-^m9>r%Hzt_eOo%vBd@WWKp0+1g8 z#1N|Wn9n=w;`hn7So*86peU$4h0I9(HB`;#7L$$sT7shNuV1gW_m@>()y5BlA)rW~ zU(V+?4W#c_UHo2rvxUBM)O=o#%t-VVsQG*zh*2V}0!2yRnYGYY+xSg}fFgY_%lX{< zWW&Y}pYTIL`F^LgY|27L!nl=SsSmX+V@JATCwP^52* zoX=x_YZ!ff>YC3LH(KZ`Q1kgDG9%IVyyD-RCmHlLQuIwgmX$tzJ}>!~n59rM+7wY+ zpU-O#gw5w!vSctD#Wn7@9(VR{lq%n53KRtSWgT# zKB$+V4pyFZMcGi1r&0XX21o+j#f8=vj?o>!wi`}-Dky#M}J(aBN!P??q%qq%V@Z zwa`~~OwxCpq9fqgcA^3FEf`b>eZ8jG$L~Qg$%5KcnN(YHhKdoz>1MJP)8j$ayuzB=af+#`}c>TBv7h_8Cnx4T~* z^c7FG)3-#;=XJ=BMBh=xzuiELS^}4$DCui!rB9#F2j%4Ae5SrM_4DlAVe@&7EEyE@ z7j!OF&+|~NLG!unuSFxJUzg}$g*FqF! ze`&~y$nSOV!~TCt`c}*Nd<4_G-t>J{7rz%?Wv6e9n$IsIKN5XQ)OF1UeC|Ki7{9G3O8UAY>-UUb%J*{o zj$^7(-#~oTd;Gf8HJ_JXX{YZ&HJ?Msk3`==#lI8A81x-RQPSr^mO-CBpNpk1;(VsQ zH0Se6ABD~5@v>x4%wN#yR?pK>twHm7(jnPj3s4borUOpB`|DT+>st25;p^?)27UWclvx?bib!7_^LbH7(pN3#^Xr)2^`@^6ZXK<4{3Gbo z=UbN-)+b;=+ozOXDN(0pQ$g+`Mh^)*nB=Ar(sacU(CaxdcF$P7K(UG zvFR7_W%yi~Va!OEEx4kB>l%9h|?W1b)KXI9Ua-?EX zaLdU?Zjf^Tk<>jt(xh%-ZTKvf5G6idfNc;ylNCPAqT%xfUJ#$AHhc_wMQ2$bBr>Kz z8!JlV{9FF2^P`C$TKk@3X4F3@g@sN$QLt@x|}*aqQqPzj?E(eU{JFF1a~ZTJ}dxkT32 z`~M+P8s~rVS3m!IKkE2Rw$~qPt2YBrVdK}!UOv@UeyCaAm_K=?xY5X*KdQbq;nFDm zA15FNwaZ3W`##`owqHh#Fq zR{n0IypX>xe(Dn;jyMS@c_xPEdC4WIs9u$YtBCRF%TKDzN{Ok=a-GM|$y8>!ySx03 z?3?gK3x5o+qsMnMohzFojLQHrSq`QdUsV<-029E)ZE*Dg=+g&&QNUTx{aK8#B&UYCOoWPB6}vJDTpm2 zLA+f-{Ah^8(S#R~-cP@h^ltnu0=+#ItOW`dInoX<0=<3(u`m+E&qhgl`x+2Ucv0!i zR1iBxg7{Yj@ylF0y|Sg=KJZ&q|)+ zAHaH0>my%j?L}5lD+PGuheA5OfWPgQ+Tj~;wS0;!vB>-sNeaC_3SGIrM3}#vuiKp^ zkAPjVDE=q~z^ii9e9ggK&W^>`$Hr9Vq{LL^xXz2|E~o0kf^6sd=HPTsj>nj#Ar!s_ zh1F!9%L$;D`)kfaY=8mr#mCzfX=tiQHl=1}4koMPMrQePFiCT)lN2j?d@p??>iah6 z6V&fGW4b_9&QbQafp#3x#iN>~Ick>Xs9Bnm1$ZQfKb7;V`Q!49NecdpoUP=aMPEgj zuQweeqOn@U`8w?)+1b@O4VbTIDu@y1YX=2!h5=FM2eIFXJYP3`A#sd2U*8)kaZFVZ zO?VOK>m3SK#Q8c`!P=eO0D8MAh!N-Oc?#m)21FCTsPlEt0ZDJf`T9woq_?+%sKW!x z-hU(N)iz%jiMr-|ox8!9uch*pc9X~oYCE%P&e!xh;2ZNb1HjaL?V->u1w6r!Vw{al zZQW&de^-=W5PWBuPqzJjXIsy*xz{e0@Ba_gE9lX1^}(VxM^D8}=tP3rl6KHJ-C zQKLQk`|o8{3%&+EJLD_klVQWBT{u2VRr@U!K98yA*qZo!R--*TKI?0|H}F{^UlE@d zM_Bvk-m(%pgKHJ;7vqpRN_Y-TpH}DxOUlE_SHhg}0Ck&r6RQpGU zOMIHB=L3AUx7VRYd-nGyKNmwEX}k`~SHx!l0Gs@CLpVNbWXa%F3ZJFwc~nh&*4Jpy zj?Ysy-W&Z>EMF0y<8CWHd)J5c&v@1THWcG{xz%$ypG|o3a9xbQ4c@&q;K`D~dA9mX z%=%Mo^@oSopQY+&+v-=C^}E{YHw~}xhg@hY^9C^;{zWVtMVhG_XDN1*sog3_GJH;3~gZl?~q;v+L@>*J=ZO} z3-m_u6np+OFGh$`_S?Hf9A?p1v2;8y!afAH-|f?ql{6+9teVdmYhUZT){lx=ShkXKM|y|1MX~ zR!`(c=zlP%mZQ*kJj2@IweZ7LR(!kw+aP>8D}0(o!{-gWV7D~2;bX|hgVMQ5AN{eS zH0;0f7u}91{NP0U<*i^Nqy7?m{Wi9GeeooD&M04KFaPCWeOj}f#zy&C`iuS)hWyG! z{RZ_{FIijLmlI|D<_nBq|Lt4P@jD>puH>f`0NWsZlz!1hM8oF?yx{l^x8Y;-=VU`a z2ii$_5Dd%$+G^i zzyGYpdjr1;qdiT_w(`nm%WbQ?&&lzaEEz0EF+Tg$^Xq)JxA%RG_U!LJsPW#wXSsX@ z`n7R3eENmsqqm=~@R_CX=~xq=n)KW8SsxvrB_=-AS=Rn}$#Q$D=pViP#V97$w+f&8 z`D}0Rl^X5Y-``i`z0p5~CO#Q9eAT5STmn_uYH{^bc}QovM23t+(oZYkzBR18-6M0=}9K zyWhKAxnh=G8f(100Y6x3wB2(zd=Y9MPZ!Y^VF$Oq+od1SAb7#g34jX-0hzrIk!^t| zi1jw&8US^(QxI9d6Q7;>R?UAcrii}u6lnh2vYh%}m;W}qmirrSsQ3-gwu%u)uni*R`i>H%ay4|IZkjB_2vn8a#KpM?;T<^F6Cj2meYSS^8K)Zcy zMrbYPU0wdt43~dgn)5w;z8(J?khC{FG}N$b>DGU7`=_NbtA$Sg>?|$!5KYqA`c-4T zz?0_mUu9?BcYP-Fo{qe~jm(vS0l1)ORvTCDzS%1(DrYPM2rlQ^>wPDZ5XKFbGTi3s z?G(B)Y;Vl%pMY??Jo#?FH_Mf~m+Xxs=0;*WMVU%0&6&N|nR{qfdw1@k*);|FZlqJ` z(nEj%y}P{cN|tCk?(Q0q5)^8VC(6E+{*jBe+BRvu24;9BX@QBjgyD0~5M|el#iMT# zFToNhdz1Q3O$QG39lOUwK9Mjdy0Q;xb5J%7x8H8V3rU-KjV#L{n!h}= zjHKxq)tH_SVsR4eAC4TsgV|#tdMjj@kvaF6|BX}DU zf&HRyZRIB*!;Y2AwJUdYW|pl2*0e0k^YBOf@G8?dk&Ivo>-lyqa2d?>tnzpzo7vu>f9nl&yr@$F<%aK zbwIqjQC0<;EBj|H_xD-twA|3_8htaWQI%8w1qjfRd%Y{&x!-y6oh<)Yoa1HQUHX1; zlLE?cW`FH8>Qo23$Q++36@=TSeW&c^#OlU~{?UI3eH|rmro1UTX+<#iJk|!K@fnx9 zaIFxoo)x$Bu~>MS_-@{Qhmq!QrQk-;sedNUdmL8BP&#M0{B~44&q>Yz<<1uQP~^@aRseh`$0=H;QT=syg})Z~`?{UQfjm^c(gE~==TH99~b7#7skFmclqH}>-|Jtv!&x2 zM%=cgXK21$i)V6wz5VC7_5@MA@2mO_6WxQM+CM@eRqbdgu6>d82^#D!O(CG(3socd z5~NIp&j;8jIS0b3g6m)Mau67m$faj~t_46n&RQ;(!O?yrtsoX(5tls>a3yeC4zed# zI-L5UU@H7zB=GSD)TR*_Sc}Kd9)sUv6!-(%*IA-JjM4MMAbfb6wT{izTd=Pxa^Qms z9Kt0)?~D9b=(ArurY56gNO2E>u?_e>n?vxc|g$zE0VCMcx4(njBdAnC7a<+oxW4T1$m%l&_NC{eI?wN2XRek&%jxvrjYhd?y%eACheG z53#1;nIb33&|&!AmAl>3mMe?NV%zg9upff|0*l1!z(a03BDb;@nB}2Z=|APZfgsto zq-)uJt0%dz{9A9Qg2=sz;rwDoXBYy?F2QbFRaym>2(zeXuwH*9#?$`PbuKImwnS1x z(_qOEg*0rfSaLD@l&SZ^OVe@HdsR>IjQVtU)TjCKQ*s-H^E!Q^L8hn}w?@UdUVWM# z^=W|obV||(XtCLXH^2~L>Vq=CD#vmh^|LsZQP{=C%YSR=Q7gT#j`e0G5^unJIYKLd z!q^ZJU;#oP+c$$9DDevzBA}&+KV?d8bXA`Z4v?SIL`U_xi~9Vl`kW#T!n_ec($(j$ z&ClQAbAx487|d8Tvu>`3m#%XZ(zIX_HMK}neQM*YLkOZrIvoa3JpA*TgY)A~>P{)WM5RHfzQAE+zPP{NLJm3a2=D6>}} zVIioHRS=CTZ?d=o^2BPw=12j0_dD4zk`~@ z)|<7!;^f{`x>({Ukr`-5dS~(jGcUv0&6h0mC5JDfPy26!LMmKGR*1^RrMu-T&GDO1AJPFOr;I(VvN7M%|~{Q_B4UHZ7Z zntYjrgr59ggLWur&3{o1xE2Mj1ujn!tJ^EJx`Qs4|D3K@;Q9o8u8>5|ttYYgX*F|q zt2gkn5aX^^c;w-$RMjegg=$86vX%UIf+FUxFSsqlqvF6tGScu@K>VW z$ppaZ`@m^@&7I+-YVJ%6r;3q?G1d^9x)Al07o}Pn zkRmpR^toPRO1WNQsWC#py#KE(MS&U z(2e9+=~BcfnVx)i)|6+~GcEjZwMKcSnV{46ejX^A*N;`UJkv~(?`D#GH`C<1nJBxJ z>~5xrohKus`ch&_khV5jfZbw;_NH{)ganjyyu|AKACQjk&XdydBNU!PiaM?& zC`5a&DcOL$gau?>;eSa$ZbM3rN`{zJ-wD%+tOyj5s|x@SB}!2u)V$#I zmqeWM1~n=KLOhzH@`g^gk`HFBL|-Vg?@#|dpJ|1~soJMFP;->>^9dS!$`4Xi^3xT` z;{I*Q66<|EbBAA8e#mZ3$ACY(rdwfR9T3hMFO_%0TaR2IXwex1S={>k#Bl1d%zBom7tS#4oKGC@5CQK*YIG z;y?pQ9H^8HGRSuENI1x)hALG-E=vZk}cB?dL;hH=&) zkSuSLntTJNT{y^7G6<@m3<7HGMi9{@(&OOS4`i+zG?0`s_L+SLT6kKMldCyDo0<(y zi%+H_$hRD zuXbEzuF<*zZ`Yv;x%FzNw4TMem4kocTt6o6_KSht8yaN4p5?;(rj3b^@T?R2EX&x| zAQQ=}Vam`~nH04YBfB(){ch|$OKF9WuE1zcd962hqSZJuTBND!@ibD_0)A4&8%#Ex zEf*bxA5W6sQ{D8e`fHd}=!>QaCWrmldWg;!W@Q7j^YA6j-#0^dWcd4b(H&jxVpe)*ZX$yJM3`T0g7V^xgQdd!OuCQ)s?&1I}De<*ve%Q!ZpCHua_74)-KCK0GV&MzmwIicd`_6oLZ<4 zu^73jL;&v&r@xF)PF*6p^@r&SorM0r1g?S0rTjEqrthCqiEjn|JLE%`E?qiYf#)S1 z0ZdA{0#D0#eUA&v0iCm0vv6S)?6qYZwSBu7C13Z5lksGI%Tv|doPRfR0G-^vh0C90 zb&-CT-ric^M~UDPV!8@gSkfe1QVWjkvoPd0i;Dz$tHSq1fm^ontr&+p^|iR}EcgXp zS%MsW=ltxjO#%~eaULgW_4T&nf$Y}TiYJo(;K|T`LM+iS1C=?^XUiC0-FIzUlDrTJ zQqc6zU_?6?k$ysRAOY3PqnheR*T+r?7WcQ3$bm32FAZ1oAx zjBPj)4&Vjr z3s6e@l*UhZX7E|#u=4?DmhsHtv&PX=I&o)?UWxXIGDr4A=A&>?Sh#d*tcU*2 zA_sAr7*G4}p{CFR{qn*?Yb>^C>r8g5p4@NNcag>j}?$4mR*!XbNwTf%lIl@Z#ueY2aPk6kZDh@0up? z;?ASK@u|vhyQc77hX?c9HWtr3e^jdCE8)ZWPZ=8ff7BDIOYZ-9Ah!0J^#!%~g4p<- zV&eT7E>+iBY0ZFWqh(U2u$0I7=H$GAP zTYqX3cvB6$bsZAp#g*?U1Mjw`@Xj#sZfycDu6#QhcxN|-w-FvJ-#^9TndQ4_lgyu4 zz8)ERyI7>2M)}TO*kt)GjE#R`OuVb$iYwnyvEh?q!k-xquXI1UH*EX3?DVvh`1B#@ zo|%Z5L8i=gYS66$inRNROWQeA$!t!7q?LW))eB z!(=siQi&s)p}GJ4vt|1aDUL?#x5~!n%ld3owKm~-mC7!vMr5Q#YHTcCg7a3P4GJ;g zd6kI%0jC6Hg{h0y=fq2p z-{0$0eiNQonQb6`cHB|q_jv;`;dzzr24cB^Xy%tKF57dZ1J%~%-S@Ibz%)XkjM;JlL}>yHg}p>GTtrruQqkwny6{sI=g+>lhkoJnXMyD9*g2xW(14w;6~D<@x0k6$e{|5hL_9ncr*! zF`+yUHxS=!t2k)lC6Z_R-C=o7$14SBmJuy1Ka6j*iOGv|4=2wZ{uU?C4)sAS_nT@& zjhuqZPDm)vPvJ9Z*xx2B&$AKLsYlCm?0(OQAIRd0nly^_zr2xuxW9LS@*-cdWWr`& zuPxFHXCM1XlG~_|K`VmMy??z-G`J@n?%4FsZIoWD|8b4{!}R>DP)X0j0FLxMZ@nvy zo?0XQDNG;qEH~UE8`JZn@@kSlA2sq1)ANS%B0VWF^z78*=+TYzw|7$X++w&l&>frq zdm5z|>p!uPf0&-Z%8T^O0C0pq*TmD4ZKOZYpr^CpcF-NhyC8!1aC)QtBIzb5%ioAU z1;H@0gZWqAazUMsnJs-_7f<_&RbI4ln101Lle<0~_RtTQ+jwm^CIar}>}k}G@!Jfv zcOBTpn=IpqKVctLBtZDSMa;ZxaO$6k0fiP`V|F!%5ZkU)lBCPU0Fk3fui^AsGt~6j z2g<~imr1Xo^a@_h21Ty4F-6XUM)vz*sR3llAH#kn<9T0-%s)m}>*)VSKjM1-j%em8 znu)3MfXTegK-2UEe5?k)%yW`$$((w)^5)5Ig5%rtYHGt?`csKLf_q?2CcKA6lA6xY{ z-w?`y9>kmCA`Iyz!RGoqC%VMFK~5p7Ia%!RoQys%>Sv9QS>X?BoAr3G&hE9{Us;on zMM~!B4ORzk-6VUjkCHZHK26S81ON6|{50Te{<)H0HS(e0WO}wGbL-)pCsTxjnFlGd z;>qvwL!$&^@?(olZ!vaB{CB0tDRl9kOz*)ul8P;IIZQ9YPPSKO^8SUYmORLZZOOuV z86_s;5Aqwln9mq4%zIFMO2~j{`Sf(qm898NFsNM^Z~4|)LqP~VJnt z<*sP(oa+qS&=WxrM|^cWM)UsGa{73GLlH)qTew(pri{Etd`)~^fZQC}^_BbRu`Cv9 zhxpt8_pS^O6mQArcJW~gv!i6>L(LVr{BxK(yAb*UzM-~4Ep>Ht@nV{}QnCX~u>Alg z?0htu32Oddt&;SFvgOK1?gm@=C@b{c9hHD`1;*yN^dEiuQf&8D<106DVtc43dAIMf zPMGxD-eaSfyOr6zJ990==LS6|sEM>EePAQj6Zx4x3hnO*YHUv9Rg*Am=GLpYHLb9s zcJ}F5&r<6gm^Q}}Ml1i27TBHEN>2K_usf|D+rG=*VNF2!yeWYTu{FICZU?5*Gq~Mc z&BkEgsoD$bm$l4^Z3D9Il_UEWN7;%@31V9!HIl8oieKlwDc4D*<#D4Tql4lOyqU=g zA=1)VT5@-JG0K&Fms8{u%U|2Y`3JE4#Wfi^yk9mn`189sxNF+!TOoHWND8~y%C{g) zMV+kzOK%8UkHX=OLSy;B<$pox!(Fy=3^_pQtezHI`FAAGw!}NkP=|(cjO3%@QuOoP z{ukxiErwmT@?RK*u|2nOahKUOch5pDv{7s2ro!%b@O@z=d^NpV^X;_S=A8sR72f~Z zcs>_lN`+AiY!!PUI6QbnJfh7%l5Q8;W!~aod#vrFrI%ik&NWu>Z<=R|6bo7%fI{f{-^ji12mI=d4C*+f6t(u z0RMid{15ZboKIayU|p_v3E3o>>Jq zU3Fyr+v_A`)BW37689+jx2nHYwtNTcxa!?@u`QLo+Y+^LjEY6Bg_g-6ew}$^dx*7g ztJGW#MMc#<0$5|ChlSC_{0S4~394l6Sr%Z7Om@>@a<9BF@bG!Vq4F+)Yk#KZSjC$@%WitVrV zVt)($)zTC`Wq)-{)BV+R0Fa=+I!#92BhHo2!}M2EWq_bame1|tlznk3@~HZ&H=xrZ zE{Sf==Qq_~9gV(HJFvY*!UuA9hxBIJ4BQE=S z62!LD=&x4eEBXM3@37vG%rci9);C-6H7Lf*r|htfjP9_mscX8!$}S8$tY6{TsKaWU zThaV}L(i$cbYoo?&VwN$i5GzC!Ob!5#$Pfd=ol;Xdn6kn|w`$o`+|uVP&U${_WJuTkY{0{GKHwqr-ye|(ei z?nS(as*`Wc^&e+K1xc;NbilgsHKEFA(BQ$m&n~gADY)=xsN3)9=-KlJ* zM_Gbguy&pMOPshX`zL58#lo-1-{gZ!o9qu64Ovthf>+iI{_uLZZe^J3@%_s#NLKRK zhlKxo`0M;UmcMOeNBuv_-&V*4`TNmNP4f2w=y~vW(USjW{+j*I3z(4Ve~yt&jM@Ku zyEIw|KvEkOGUz}sIiLQPj2Y}fw>-BOd@vj*JkT;qGJUZ&$*5K!}N4iUZf`_hMt{M;^+y!smgCV%vzG3 zErxpo-LdKYsJx=eBi8?;M*d-X-cVkoX9j>H{JAEc9^FWPph3?qhTB2++i6f9!9R!N zM3EwEnCy>Xe|0D1$)6&wI}|s+=3M?jaKp6=|MqM(tROh`O-|b@RZibG`<&MGE}W{& z-Qqb%&U?6U&evC!;YhAroS-5wbSafuC3U3%MXa6Ei;ovOlagvA|gR&6W_zx8mx|1>udE5ILxlEdgsFr zKKKChF#0+NHrKLow7s%PtJ>MMAkhB4LThbd_WHuWfTYVnMoQtlwhp~k-{A1=Z!`TP zS9TpXix%kXd^`I44&-@yI_7M*qaI?XVSC*Hs0R zkgZN>j(Hut{|qffgvk1X8Lo9zuq6TwNlRj=U}%9X4bGp-MF6xISP$_G)K-#y{+#+3 zvi;}wSCx_9zDGVvgoq-`1WC*Hlt;|rpO+$8UOOjeR=CuHwuSC(o4A-}YKXX!G zK~7pAzX2mB>Y>U5BzxQ-%P0-Zlj(I1eWTMCY=QDvtyPJxf%awAT1WOeN1#8rx3s;6 zcDaqdL0`peY;Z9fYqbsgu3fF>*&_Kc%Y~V6>svb4qEuv|$o!%%A`xG`&APT~CxMgl z0Bi-FFM^(u`KEtsuoAunc`4FcnAr%^&*B)Q$qcYKkdmzTptsHRkE3$J@{Hu8mr))@KD5poHQ$ciIE*Rlmn;vN5zSi1B8g<> z+t3S=8kyg4IHO#`Ir=_S!4ko~k8GTG!-0GyGFUsRJsWe9ps=D=vlU=_eR>K5+}T0~ zV1I(=CsD#!s~Vj-)Bzo!uM21x84t-E;nG(Z=wFxZpJluAEQ~d2u zl)qzM50`D_l^|oJwMS)P`Nr9^WVu1!QKMZ}D>my`UD%KFqh?*@4zy3weE+hR)?%}S zrx(iy@h`Wn>~yj_;4tD}blCXFUL6Yx4u2J$d$VTh8Xm( zoHeV_>o(Y<)zr`tWJlbM9qt#aXXwosc{0lb`{}`b7Kqcf5@!-Nqg-72MpyO@ZNmXA z_Y2!SmxB3VDXJ!v?XDhsd(WEIJ@_YlRQ1+ZZFL5E=NNHpD^FALW}g}u+)#F4*7Orl zkxxb~cINJx4naj()R7;~zyx%&u5WO&JPtyk06><<4zoO#Cbci=t0%QVfwXYuZt(7M zLOY>A`pI;0%C9pD-iGpM0X46$)2y}S8e%KL-UESX)_ z()VciVn9Tn5)T|`pWzHli2|H`v7zrECW-K%HCt&csrO<_3N?67=zF7_?s21>y3&YI zxSU|_rRIHEOiB0)4HCpIVLn4kRWX_6gLV~1_o2i;?@2VuOUnknTP1x-VE-f ze{T$2qWBY6KQ`VK=Fh!+HTdHPfid;t3+b8u28M&k$0F%6>c_o7qkjAxQ$G?^k77h) z_Wvk}uO0^fen$QH07d;e7npY)gE`kA!@l>>DHRRbx8tHz>8=2KDq zM8rd6)r=_J^yt6&taMa`_ujT^9V;tm`13Q0h?KRaW*1 z(aXe|t@j5uSilcrLt(f-NZ>n@KMQ{{=MUvPY|rHs7?_KJMVe8yRzb60COk zugjS8&8r9k3kI3K-|e>YJK@mu-(mX7QTFb3IIuV?je^*gyi^YtETHTPWk&RK-n=Z$ z=g6{}X;A6f%J(9q(|>mo7X&pwju`fG5a#V2|wHyv}w{rub)y+{JUU z=J(4Ku^3@PVhu$(NXb?{4_Q_7dSNYK81%~nl>tVP1@e=OGs5Zb1QKp039yvpDR=m< zv}1CD6i&oEP!xqGRq_;@(ktY#!(V8}R{M&}*mN|;C+G={bKk+h_RY+s@>9iSt7rib zQUF6T6?+e14kY`xNXaCz5N%5yuSXVaOMVWWG=ClrJ;xNszfc?}B3Ps1fN=_|{*zG} zA2+7w4$R2}ZAe|}J*U57H~EhRSL}|!If4ed*jAOzfNIukOU4Xy%#&4wP>$*fRvwu8 z$rHh~e?+afA@2+9Flt_MYuHH|2$Lu!%o3O)e>xrQ(aX*&Hl zo1dPHB;Scn@-1UceosT4zB=?bv1T$9-+TBYCuCtw37SgbW7Gw7b-SY;M#&vQFs^sa z{3zjj>N`{TARE?t2MkG4JuCqcPV+=aLiMl~tpGOpHKiVI0cDBRLqVA2#`>WzX`m?k z9R4EchbroaL*K@bXp$8i4KY&uF?9oM`J<}Mqwc}+a= z7^g@vuszO1xT_Q4V&@qY2`X|}X^$md3Gjq%0_3nQ{zQcK?i-Xm#0YKcdIY`^T_-Ui zk+;|e?@=Qmw09dqdleiM+T%9LlewbR)+nLPg=bi3Ic{KA_dIc9OVY8XXSgdP#X90Y z2(>n$Ka7xSDX_37>XKFGE^Bq9LpBoxi#xvzcgPS9!A0;{hGqW=`x$T=y22;-8yt`6 z&7CjFbd3FkSRxt=Kk>_r@_h3)xNFfv6{C0jf^JNzn|>+KLWua988KQP`PrLl3-M0T zdTA*h4R5eMSxFmJWhj0$w3TQRVA8VE`wRMht6d1`?4_l7e^T;+Z*G4cKINr(er5n8 z9>QhN`JckiZ2}+klDIf}nFU3!k+Tf%X^LKzpA=VaUWVsqP@Unj6;_f^c!WM;fAv3% zhw>AxM_@5HF9pr;1C`u?5LJa(zT%n`gZlEuUwR&|h8Z`%-xBoFfEOzE-Fmut1% zzsg$Y%B}M5ib7NLW8-m}3+50wX_DlG6-^eJOGg5|+Ir4p>A{e(jzZNnYyfqnpv+Lt zd3cYwdEm!%M%NeC58$J09WXlF1b&9ZCmzxW<1@XmTj48bG=A7Rm|gP^gEx9T1JfKZ z3x;FW9Qk7=McTQrEoo8M<6A9zlji%~IvYKdLS$hxIwB24BQ$HjG^ce9#-THB*3doB z_cRn?vai8&1B|j_OXgK+M!ehCYW^$H*}XES^t^eP-zcQTTKFQA)3*kujK3(oREa7+ z=5CtyI#Lb!W&g^yq)zsBn4s(*S68=&N~uQ~Ml2trJu=fTV*1-m^w4YO_!oK-`7r2v z&!jJi^S){;Tr@u%1|u+w@hN%H%aLL8{RknoErms+Z)FSY2(kkZ>F;BBVbG~0Z10z=) z$&a^qa6E>AC@C5sI2lbf=%a}PWuM@rtD@}_97JOz)0d&OhWhBriub{s&vON?!Boaz z&roA&r~V<%Z(y))D}N1)#yqX4xdr1>G-hXF1zNAdcuZV}%yOSCjqgH`JR`7q)0?m9 zr;-<0hK26xf>SdPA6=Jskk zLhoblh9|?$WE%J-UcZWc1alTJX(eh!AbHk%;8!61&slQuUi{^Hwvh5f>ZV}~9u)6v z3b*B?daw)n%jI`waFs}}b4&Z8=t-ckZRPjMo~*P>j}w<@XH~nU`TJ+MpyzFU*H;+ zW-DJPu?9kM_fIMGcP#L?Ezmm@>g}-2-Bx}88FuDsDc&K$?ihrE{JeRIMkXV z(+3yOx`T#kfYEyO1qWsm5L|Mi>2lGwG;&_ioeArkuQmHE>@PS0;?g%LE{;P0CoCMh za<2gf=j%0cI(H~s)8Q)gw}T_YR`CXVz`onk;J*$_BVdw}gN?A8P2#-2xb>op;N1uY z{*tGPeoQps2ZChg(O$Dmd4VR%6*=&DoxS>Icy32MKs{muO_N9TUl-&V)^LBTe_9-# zEVIUVZs4VPrUOrM6L`Q>c(+FIocx63Lid{era>7YAMB~kdc>-jA*}IF%OM0MJN##B7B8(e8n1!7*}dQAR$nyApf?Q80%u`G<28l$DB4!RsEi z!J8zBd1!-fqfP>+Ia?Hsw*mZy97%p_X>y{%tgR)o8jT>XtV(H(s}gz3*omrA0Q8|M zW!TCO;SE&@Z6tfSsw$Pggrg#lrPz`AAiEK2cQ?CdoN z6^WyKx2&2_77$Q!-k&CM^y3x3rRKO68aH?a{k!umHW_8Y&49cjVuNdc*2 z1Om%-8L})m%kT;vSJyt!f}+DBXYQm_kYrnz&gY~@p_ z=5ih2Vj18310fpd7;o@i8k~o4hJ2u}YAb&d?m~Y?A+AZOfMpMq4$BBC%b|E|iejA; zn)Y(^JW~q%EebJ|=u53DyVWor^rp){6vc_FR$f7Dhp(5#R`Hy|QGkvbPM%nz(Y&v# z6fn#vg7QGetzr<15lJYP*9Dz$L%wqRBPX9Rx*`rr(g30jH1yhyUUwepK~~Wk^m0JY z`4EMpFk89KHzZ?9HWLY+1$5SX;G_Oh$t!$k7(YS9haQ*MIEG?W{KxTzG*M4D1jvJ^ z1AD!c$#Qrx;ejckifDN(N()YviI>qI%^?(UC7UxUcI2KCp{%?)dksWJU_%5MDFT&s ze1l#@PZX9fkRMo?)3NnnRj?i@Dt+UIx(rT?!iRbcULWP=cm?0cwejFeOk$o}kx-gv zBoYBp>u6qsg&a<3WAJmCHT2`1x-%tM8o`yjZ&cwKC2Q(G=(Fik_pu?VWS%@7nTycl zsy)y$f-tZL{pL&w-6ic+sQ#MlycP*{*vq<(z1TUc$O85%y1~90pVyrv-RQE3^S?X< z;ZrLGPX8if?q2n~r>2LD{wKSf^4_i7y3)Z|M!^Uq$F`($Z&F{or-$sO`v+&ByFB$X za~Qypinpgij?DJA5NBXHJiOaB+|M&(aeU={I)nigC;(*W9?XA|V!xz(yLe`u>=#A) zr-#k&MO##UKkOXNZ(jg4ncuEK)_=6CwxwxmzAPU@kpm5|gJ=##iVH9nK?{I!*!dWh z$@yV9G)%)8k3XBirmi$|RD^9p+@`zIm`^9CqxrE4JCqN@52RKZnr|>+uFTGM@kDJ* z=MXB7{NNmb>UqdE8^f{=CLEUujTeloAxJlNlAOzKR$&UA+R5i zd+7q{tMCwC4FYE>Dlr7BEWpeb2kWuvMd5G2BBfZ=JpO)#eaZ;`eSI|B(|U z{Vj-p%2D7uh`;s8X8AKr;XmCG`0oxpa{lZ=e@M)19>24~?@RpajspKF;&*8te}B5< z&yEhj|D)*0=^se^6;CwFpDhai4&pz46!=!+4{sj-5ruyS@%tPF{%f$AA`bG(ox|7v zVG4g0){DefR~$KiMiPHf^Z2<6|3>1^Itu*biQl_<{LTu$1@TWg3j8WR@V72%mOqAm zcpAIx#JiUtIe(@Qe`fRek0|}nm-yEm1^(&8@6tT}FonOv2K+zVM^3+EF7Q{#HsY}Q z(qxjPFl<3X6%Nck}pdPE-1y_@^8N{y^eyeWY3b1W%RtPp1O^-2q3+AAjnCAn<24 zkDsmR?@Rpajso97{4UMo8}#pJ5Bxv+A1VET)E*cfiWLtx%b({Jf9@du<41wN{Z8Ny zZytZF!asxfeU1Wu0r3x_&)1Cp&sO-W+5!J7=aKWrLHtF{;|EWX_2)+7&pHbHJ=71q zo5z1%;kO|EDMx|-6!Et{*erj>D*UJ00{>m@$oVsc_%oZwAExm8692lRz(1Y%U7E+w zRrouwOHcf9*^$$~f%Uh2{v6^DZytY37g>MKAby{t!0#dT|NYI< z|A@k0g{xM?SN)EhKie^*Ar>`{e~ZGuk@&NY0)GMVdpD0iOyRd6{wYU+?;!rxh0XG( zv%-J6HSpgpJaYc*!H`?bY#!gK@cR<~x}(5G*CS@mJi} zEPrZGmi6-v;y->A_*UW%ZysM)_-7EmPjmQct|0l>uaHli5BsAg?tEC(_;t_iNPp`B znLjKk!OE!`Ah)mL;Qn+qI9`z~Gxr=GqB37H&(ltgi^Y5>Tj9ruBs_XI?U`aDeIWHI z;?Habf04p3B>spv{2bz+-6Z}%;&*8Vf2P9!4m&G_B@Vw1%2uq$h#@ikR^qRie|Y{3 zSNIjgU)(pAKa+_+u1WmYX2W}UGx#e|>X@A9M*O@u{50aXYZ8AX@ekg6c=~55{P!^< zE$SVy^uG#aD_+2eBr$)EC;p;l@Ovx#V&a#@;TI8qK$G}Yv*6vk8T>8^KbiRUIQ-pE zh9ZO!Lt^@;5P$1Ehv&~hRld(*vRzc>#qwu9@%>HWpHBRl&ET(4_=UtD5r>~c{Ii?H z-!K#2U7Eo+>pxbTge4BY4$4-n$A}>@f94Q>Md0xKG3!6^7hf97pUK1@*Cc)q;ty{I zzqjH~H{$2T;inP5U6c6RZ-e*2yAMzQK?oM)>wT;ki~7IB(*G)yt#|<=lEnO3K>S6` z;IB~l#l$a*!!IKKfF|)B#P8h<{!E3ROniGB{%+_y5yFTeG5sT_!F#L!@cc2#_qhgy zt?U!apZUc1H;I2d@n<%JZt` z^*v+he--*vynsd~F@FXUe^E2|?G=78@p0yngO70kxrq1!n#8vfzjrhEA7EAp{7)vn zJq~|2^qmNykx5Md2I`-!6^G}~3WfjNeuS;OIF|nT#P>IeKZp1;o55eC@C%7QA`U-? z_-8kX--GyFn!%r`@W0!Ku$DOdI_Oie9*s<5{%oiITv2{_{`6M(6~tfs=UDzsCjPi4 z@fQ$(cr*A1F{_30?MD2(IQ%r?w`&sLA@#rS@bqt0`0xJ)sQQay>3 zQQ<$g7hx+ejOEXK;`^J#w-SG5Gx*~bej)Kk#Np=<|Li95Uz-Z=F3sR~SNPxkim;YA z{5t4Uu^x>~V*ZRI{)#z==g$wAwWR(h{^AQ_`7@dL<6`m6{S4vV$DVH7dF*!cWGwG2 z#GV-O&o$gSfiu}^7X!~9V5@=JUJ*1-8NTssY#1XCP2lfxMdROj1o(rG3O^8of7TJ; z|NKls`ngltA$M%g zf3Rc9-(P6fs)9C-jOZN>(x(kf{a{bL(DWfGDbc<-Kf;)8e%pv6Bf@E|bevuk6W#ES zil3G!K4ULO#lSg(O5cGLPrAGh-FKj^r(KU)-+?sS{Z&=lTjC&IhHuAPZD0y0oJx3q zklGP58F}~!+fwvRWh=J>&*C{1dv4}EQIA(vpKH~Q^T>WPm;dG6@Z;v0-fHtqYV};k zw1%p=|BCx$dU_)EpJ%Z8t5d3)Tn?v1Og8J}-PR zHcV7~HqM4;ar+I-opV3*1E7R*la6#W{e5j2Hc0XZ;|lNF?)-qh0oOU0?>v)xg>YLo zw($2pTSKldH1?rkXP9keN4cv92fN7=&iWNY&aj(@w?&rVQfpr|EP8D7ZglEGo}%9_ zhQpc$dE^1G+T8>mhYhFXMdZ{x1pdwoj8Lx%!w4v@qNe5vgE|c+PrR3iPtO9KASve9 zUeVuiF7JhNp+x?QmJY`ea0dd@-q($;Et19jE~o4>oPqm*}SW zn73Y_3#R$+G3!Vt#Fe5zyTHMl>9z%s;kG3HxrCiM49(flXSIgHNm zNiDgP5wqF?y5Qu)9?!K-9DByw>gheWEj3-U!Z_GI zt7kCw^b3DKWSrskdMB(rq*Nz$rlvDb#kjyrJ92>yZzAtI?ucxk8QK)lf6Htr=Fl@x z0_7}lS{ty=gS7{QdWnB!&h{W@&zzxh*3QhCk`m_6yrVjBOIkJVT-85g=8OwjopRGL zBo$Zk7For0+YdG5*;ekA*#u3XO!s8k9k?78?0nB)0v4#r_>+i#ahWNE$FU)E7sCDc6c%11TY>z}r=IL@@Wd`mZ z6y!rS^&~9dlZKQM6x74G_$n;nrzMi`Gc(W#MI`)0IvYv2cRs3Q z_nbHhf9y0R2Q3xRVfoIYd_%Ae8JEOM`3@xYrGWo@Knb`}x1T-HOw#O=nB@k6PZk#$ zsXYF8gf&v&BK*lg)**2vIGuDjiSy$!EZfp11nyK?%7oT2h_Z!=N-S_so~rWRIzm-5 z@^+3RM&3TU=XZ!7im-&|4Ipkcc^Jr|H8G?vUgXYw=JzO(+r8j-Q{+CqkFSRpxzhs- z6BNT1Me*<`CfGiUgeck2t&F^!*5<7a1*Z5Nxm6zB&DFoM))pn>5gFt9TT7b>Z-V%Rc~z zICg5;Kf(4XZAZAX*Sd07Ic-C zCt3RLO>)>hKRERoclO6SG2<%tTHwZ>&V1XG1J-xrJxdyKhzZFi4DF9e63 z!zUGL3X;;`Z3*=Ve=QQwc%9@|SkLoja9r|s5@FQ=gLVV$;>`z4eG+Q}X$2@GldO(pJy&*Uj)HvQ_W2|~(7{9^d6pmOG;4rWCkT~Tp7{{PD zg3%UG$vSH#GA8qfoZWFI;+qE|H0Cd`6j(SzVXL?UM`N6NL#Tu4&x0ejij_>u%&PAY zNQ}yE=Z(G{NjNDU#Pv}TT$C=0*3(-8*nw-tkB<9xDpD}3cq5U?Wn3LTMAj6>K?X5$eziuuQUj77dXot2^r<_Pt= z&<1lTvquDQ2PMWa7|rz98(JuJRL7f$XwGD=Ui zElE?g%8@n?-8WMU8TMXPKOY?RW+;fr(U?}^xBD6zLXYUH=5-9oE1bX?*jw7rIYH*f z-;2!u&5oA&^+euodjB144@%=);KXBakQ0L+RGjb|?tHkxg#Y#9H}m}df9L$isL1@s zO-;^!U=U7zUd0yHXbp1AYV{eb)mf}oA54^{s?IW6gTioYK(k=xs0^(^FmY?(euk|< zP<;0d)m>22Ys59UmpM`^W6!nOd@dw_<}yd~{eiaN3b=5j>kzCWO~5P8&P_bjV^^q8 zWIPmq9_%LbpqI^81%W4&3&ym{Ii(_zJcXLSb)ju(_1mbFkZInM2V+!M$hi`pC4=eJ zk^+6&A=7Jkh;I*u zJZiQF?8-?)w&;N4yr`)M9eOo0Qb9Adz*l*>jhAD!3Uf2u7QGc7A4bOyLRmGah&L+w zYC+#|G4x5gq{5XstSyQ6ms&a>M5t7YL`e-kg&RD{fnZm|U;4%3%lIwfZz|DXk6ohQ z(^R9J5t8#sJw!!%0$pNx5X$0ODpF|TU4|y+BvhzY3`rE>V>Gg&|B2MRyKEJY$7tR% zx}a~)hBx)iHw%=$IoWV;f}8T8j8B+?5z)7AjFWS)>nnziP+2<+9?6EHrMcfa3iN%L8X%Gk?$=ip3xfe5_RaiIE7RrDkv1|ff z{K?0!KyrZrd5Yxx6fqxm91#Bak4Q$o8W;xr5>ba;_T;}y!t-|{Za0!Dvns7SiRWfe z-O)x5?+Xs@#jF;DTHJFy>gyvN(VL!YWWwalBG>`+nmjk} zp9>`48cT80{B{~tAAiW8T2oZNhLK1NzwL_ZDpGBd8_n;{5vt#3Sw*N87lGg?e$PD) z-r)DCq(7VV$MbuIB&r#H-+Phb_tk$Gl;1N>^82^tag>)VlKgJn6u(c6P~I+egy z(-glaqMnFbP)Wl4HtWX^vaV6y?vroP^0th{A17~_L=4N@wA3hhdnycd8Q&uEHn}lQ zaH}_7-Y`{XhnB{u+SPIdCJ2)^)IvRDK$eDgFW=F(f;j@7H&0FlWMp~_1;&6GVlGfs zaq$@T=JqCawEreewF2r^KtY~~dKzDSRj{BS^~*9=oY?#ZFEr>3p9hc7clx(uZO+%0^wIioOWe z>{P*Jp3gumo1GgmtqdARh{d?r4%yw0*#>?nGKtO*(;kua{Ws{sFejaXyXEDqCgNT6 zRBUf831*H}!eTBgQACx0TjU4QIvG3{w?TA+Gtp+N9I5(`N`Wo=Er+tY-2qB9Xfdk! z08G8<@;+kb1saXDWmpde$j=aV_#K6Cc>YWF z9*+MxCjXHW$^WZMB>yYlL^{#@KTl<&j$BU2|L?0w8TtPS%PyY(mrhaqznFyg1>uSL zFIg+)pA%=S$_eFvax_m0Pz_iEBl6c)<{R@t$(p1kf&2p@f&8ByN&h$_{b>1*N%q6m zP0IfllC4aCEh7D`B@ZN@BXuKGfcW_%Rqcj~=SR!ZYVn5R zm8NPA!`%LWtag)8DluYDFr%t0b6ezx!qMu$;4U z-NcHiDwp(>ebgPW%0p7WK#_>=AR?j1Kw^UOJst$g+$Z3#Tk3xDuH&yJf1QfT*I#SI z-_sPGBS2?U{QUr>q6$Qnq38uNBcdEghBt`rMxt{_bhG>&be^eC{rehzPr%<34WiAmll;A7g5vM3s1mY1G{xUNfHfPH2lx&F zHv1RvqNu~HGAn9^I1|_rrp&-pq*==%^86^NRsD-g`5Nh8jA8wW>tB2_UddR3^51Uu zFO2fX>R)*#G&6XS{2>hPk@gg^aJ?#j%qEYNTzvW!m6be`>=bd@eUgtwGLv^p3`4Bm zM`baKozS8H^h9#_AQnMb?B}BRMJ~!dbia||#`1JN$W`qp%Nt`YIbs2=r-N3AONtQd zWO)~fCr7CAewlfR8W>GqpvrqSzlR4z{^ZjPDospT&W~b6fwbL+QV@@$utU$7g^^gE zwwwK>1pNFX+vMl!JtjZ*-yo^H5md5jMDg?E`HG*Qlf4r%&fsSSt1u+qEGqHK&C&eq zhsku({5AM0f?(?5_$k$psh^_wIS{l;erAAF@UKW*p(tJUQXD_eQgr@(RUALJp^A{o z7=HE#rKGJdX>*gdXnq>^LHj$G-8REglRp$$wp9D(^8pLQo|82HfHBac- zmQh+|!{VyHXgEIG<>#8b96t4;5qi;RIYhobyb15f>Aw#UP15g`p8r44A4FF$tZY!f zgPXd>oNx_>!d+V_1@Y^f=)J?9Hp7rH*r!q@hM_FPXp}atJliSd`5k;=L20%^%qeaW z=OGPl+{cDE8iW#;J%TC%cTz)LXxs7>1QyTY4{S+Iki)|CR@+!QRcQK#vo6XiW)(RI z86}$X^=b|$mb3nd+B0~OOeKLYb_Qm^c3%}1S8Lz}v8pMXCtry6&wX0<{y9~QguDEH z)?R>pa#D7~Y6Ud(K@-TkRD@PXIxk2OyLZR}SKz6|hz<=W1|eCd*+)Z~##O|wKpDNY znzD!S;7_HxFEDR096c(d)6K$Goz+CDe?TI6mxyWMM3sKTeY#!2UU6l8CNC0GY;dkhS+I&9ho zeeh=Am=xS0x7O3zrRUc%wm*Mg7(wh=g`At|Q|vMX4FPJ)A_PFI?6Xcw7S#v}$z3Zx z#63$fMWog@q|_8?$VPV}_&KvPpwi_ZC$v$eTX~5}j>|u4t@sGhS*37kb%S_{O3t6L zH^0d0@oN5)xdLv-z8>yI+AX@yMNt1jbS+WnSmwq)qdnr(JNGtVF`*b=Fk_5;)$TeL z(jJj4Jv;+dWxE)2&!}wncc}N$vk^vBHrwA>P-;SOH8httXEiHHsDkseci>IT!XFmZ zMYsLhAc_!#j?K8z$jr2q58ADTp={O)nCed1n^%O1kp(0b5&=8JNW?T!&+v|A*e8O* zO@AeTOOcRk+@E#Y-UczbDyHhmBqaWw5}yWkJz3H9VIYQ%2dvZ2_7BXe*f^sT7Un${ z(@0-GePEVM68B%PvU>Mm`!E=ZTf4Bn;j1bN-=DoED>xh(lXfhzOekb&H)X?Cq;@)Y%6+DW{(0E|%yoAptG-GJN~3^U?i#5i+;i^&JTbOy|y z4470gBLXAQf~Q5r_dE85l`}9^|EH|aKTijgE70u&JiTqz@+#(XR{K-e;fqKgMiF0w z67qhd%u)MKHNSYe`BR@mAef96*C8Cjbad7vWdaa3kOAK^b^ro=JA~Cab=HM=-`qzgdQ&y_ zexO!7&ya!CGZ^e$6|5hF4ZJ`G!+Kh(bXVm`H}(l}-!@eG=s zJjD<-H65OgcdZ~p++_qg8$m)}iWip4dLX_Da0mK!F<|vzeQdC>o7pPiq7<>i;*b0zYh?PEgu zYqfxnFsOb}Mjy!y$Fh@Ud8faEHdyJmi%tS5^H(%dCx-kAY#jv?Qha$SR%*HP8f!VI z8r8JB0wZZXQw&1J_*}OSR9^(>--cy{cCh}+JUV$N9Ika(Ew<2*GTRGoyJQODH?#-J z%B(9eVgx~c^(e4e1QYK>=p>#j<1rkm;gUIj(QYsedqUmVera8YEk^smA^g&qXQ+!j zI@rV&Vb3Z*X!1j@w$F>ja@=izAUG(Ji3^N^+&9z{%l?jK7>6Lza9Z5=WM(xK_2e$1 zJT%VS(R^M3?guE6S2eft9cbk_9h;zC_@te_!MDAYZ+|O~&9@`jcOc1=3?uWNj%W&f zYsQ#oIpjVpcg43ePIg<@xN^Vo)~hz(44~|>`VJoQ;G!aI=LHpZG^ij8I|v$z@_hBJ zeEV8?{~;*~MJr$E3zRoD{U@iFvrZIb+J%1#?gB6l-zb0ROD7hQEneC|$ujo4Kwj}p z1W@^LVpxson5REao?fK_B%q1UIe{m%k?PPC2n9@Ss%?@%dYSX%Iv3r>xK88OWFCRE$M{cLIXE)Ej&V zq?W*!ga*&yOCWXH%wHO+lP4jxRh)!Rp%3HfW#lx4zkjX~dG{@RL3otPRv^%^>OBF?He$H8%W*G?+0h_dwL!kKYY5L-kqsr z0;w(N{gv`QU3s5IZ|obUcSm}!RNgI=cYQj%Vbz)5ne={Ad4DV0pVT?@UZK1%g10QN znFwN*4WEks^zUw!_>1}7%jKt&v7-zv&i%@nh2~>oeB$AEEqnO?M96@$`_ts=2-IC)wQI_KNJJm#?98azuFZ zBJx#r(oaR37hO84d{q2FD*nl1Sl;PxhCBIfpNz!+dVkaLJE-_C6w3H(J~Gq4=7~uB zCk_*T;~q(WuM;KxovO_E2Of>YzrIm?$}f3<^PNV&lrZ6IQYQ4o5r9DQ_qh`EQcTFO zwK@?nkU_q__zQyv#r+diGv5fWR}9{VxD*C>{di4HApLd&uLiB2fj8X1D`*NYv^$!< zUG1>nERbB1%89M?ZPkjt=@Gp42Hr0dnxOBo7`#+o78FRHd$pvm0Ze2j&x+u!_*v!m z*{1LY#Na&+AmE)aOyYfP;C=pEIKSf!ydh2D{r<1${9ZR37u*GsKf9e8EB#*v|6r5B z>UQssN*C8|6sRempy;C;YaiSm7Od=vb;HU{sUPbGbS{Y=vL%4&u8 z&%I&#W*T^-o5E`sgE!%KiTC|MiT5OglI8JG1h2b+*U7+x{=#+vsn6!)h59Vcy}YC0 z|0-VKUu(K6l{?pT=NSGSjPR9sLHI4EyH2^sn)oABdhzkwn0OY2x7>{Xs*3M4-FbA! z>!-+hAkD$kQkarhZU;f)n_alr9=mu0>08buSLDw7*(*4R_z4B31<;ohPs{}0&{4B% zxmz&BdHWC4Ey>F|;I^Yca@BCuO+8qs7o!nHzblY_1ve@MlIH;sUoymbzal)NbLa|$ zwxSOZLTG>GRRFKbs=i%3d~>9WZ?w1Hp@hV%Q)C;PjoKs|rp0iV_36xxD%+zpynvta zZf;MJ{&vNmT+^MS+|Qf*UTpB&bmu6y({$%4_ZI9Sk$81@L3;7=xxGaCPgdcxO}AaS zrCKDtuae&Q@?i%%3jmmZN$SR&+1mZvpK6jY1)+Zb1(YL8-fYEKUb6exu@frQ#Pjzy zEVpE0d|8ux0zU9nY)@quF1ZEV?2?^{_a9M}IUJH9^W+2t`ZyL=7xp@rPC~)gB!9x1 zj~`y8(BU<-*-Y4YM%v#FmmauG-&g9>SZ^{yqU|j|GUt-?&r8@0BK1 zStssEk?r?^g^~EzA13~ND*g+3vMKo%s#V3``9LK8sg2?r?Oji{pE<~&7yuZ^$6d)! zqq<>kkiF-J@G8!LVgvg!;QkFtTHH5LO2=*V`!gg7g10RfNuj&TyJey0Sdw-O@<9kH zndmW?IZOT%>}tc43pe8BpD=lVH6Aw`QN;&^&%aVr=Wy7aE( z*N+S5_iuO==l>YaZ)@iF=?OBwe){zTFVu7hhzj;JaxDkR+gjRy0qNfTmU>niPt!kV zx%zIp=f}Cz-j4Opi*pyfqx|cQ@A2htx-m*@^kbUwAL}M8j-kK)^8cFK%-6B!F%JA+ z(_7iDUvx!(KdNRB`d>(imQ3$;2De8J%y7#g5;#-Ab^U>KoqO@n?)H*NQzwk{;6pcBMvMAMUY{rbs&aQ1Pnb0ImUBlYaO7kpeyw87buvFj4kBL@(Qo1?KG{{a>_i(|D&=kxD29l} z{EnvHcs#!}+>ie&@c&!9$=I`@a(3=i&bh!#^sz z1qx#VxQQYiHFEs;;?XG9QQoPg&}idtVU1|yKe7a$?4B`GCrzhz9XZiH77fJ6iKB|` zlS=GoSV?ATo>>$EOsWGKen(P@n33b|TpFUH( zf{zjwNlY$?NSH`MLM}ssxbAFrH_5Wu9ec@zU=RdR(@IGRrfvzM20;)EqK(oTx1wLI zLE46Djam|scK**Z=Y4i(PG+*%#rOYs{Jv%%uYJAW=Y2Vs&-vUx^O;3C`e(>XbM#k{ zbK_T_=f-b9&yDX!UAgh|b8>Y?*7fJc>H2f^o=)F-quXIBFP~c1TwXbA7CURbuV&#j zRI@O$+q3fQK0fPO)UUZtZ~4SCe`_L}$ZR}L6}8n=GNHUqZ|iH>Y?oIuZ>F*}XYPog z4-clW6}79mYKS~&5vg1?bm6uo4&6cAnrS9H!L*}h^(6kBr zh#Xt@9QiX|QPQ)=rmpZ)7 z&BDaLSL0xM9j@o7a^|#}%4vGv)$79MgS}(eX4EwHIY#gAIhM+|y2qUrO*%`Ri@W&QLphc8YkQ`&UTDX(s*V3On~<$&1E--_m0j!`U5X+>jW&D1)l zkZoplLlfiWq^Bvxj<@qYW!=m#Y^cs2P30HnYEE_Rn>q5*i@Ejle|h=ILdhMl!Gk-n zP&a>>=qa~(%Q?3(?Jqs0g5xKQp47TDt=<@BW2?fP)HSKfx~7I&)y&~<16${r{I94D zPpeQ>HB)PvRJggWvPsP{N=0p5^K>vA!oN4mjbWwhe+&Y$AvNm(h1#2@~c06qXE0Nn< zKYY)v&4j_iN7rT!NvzFW{74(ttXP|Q;+ZyG+j>2luj{gZQ}*z3%Ad@)y^pT*{>v%P zt)t}ewV7GV)@Fu2u{QG&7?INkU7qW! zXx3*roO^n@u1(ZiQ>TymYOD1bE|-fq_vG}oHLQ4hv!_m+4Vz1kP1CAPMNa=_HBPN= zs*|(#jhr_g53|9T!LeU?Q++v?POBU0Dry;=I?5V37dEN%NVI;+m5KoKG4IY}?q*K!&+8t7tvTm;}uPoI^0Qz{tQ))P6Y->#6R9ril0 z*#~Kt&aP+k{;@tY4U7V1U?F&G_4>>*umCiH)u6rg%sX;@<`J;2@A^#FA?q`5!WQoh zUZ1)5=r&!K-##c`*JbA)wLbFbNTb?Ti4##%b`plWseG{k{n&V4( zuCJCS^;@60@Q97ewe2~ld^Ni6*Zh0eXO`Z-J~Q{e^_ekX{$k2+TA%50>-tRkm+Ldj z!MdB*XV=FDuGH2~FR!YeQBzqx*lVcL1$NQ8Moi_6#f(*rTtc?S4(tc3s;5*m*K)3% zO#tayHR=D^8uh%%Z_402wJdwA>@_x34IXS}+<{yvYOZVKAhy1tiB>h$pI=?4({v(_ z8Jg_1&59XJ`HIPGPo_8ZJL;$bM>_d(E`v_4&Tbo&zhD0W0}nsq$U(enOn>s%3%$B$ z&zw8GUTmDN*m*;t`oE9!=z?c89X>biz_}HJ)`63*%|6Y~9Z7w|A$x<%u(Q;1Pm8Bk z*Ht&vRI0|=+*_Hh)L$yT&h(tzIdmj;b9}9jWw%|0=VM3a&!)~(H@zq5?0z8fHQPim z2=o9^u;_EP|6n2*2$q8O_5-_4U!PeF)=XZXxv_42=AMc+ym}tn=JVThZCmH)y6lD8 z^_h_utk3MwknelN6q9%Vsrlu(b(~neKC`M4)U3~Rp}xQ6v_Y5W`fB+P_3JaYhBq$P zwvV0iZD^D3*HJ6iXNIp@pZWK1)@Kr+@}>2emzJ&1ytaIO=8`AaH-OI{Gy4Ivb@-vT zPye^KHyvBwa<@l=2j^;=zjfliwcaUCuBa-{9=PS`l@*Qp`eLiSX?D1pyY|i1Eg8Q9 zU6zY5x`y_%^5(M6Gq@cT%d2B`Jv#nyp#5~2W}8#nwN006Xx&2lxzILSX5~V$wyaQ2 zUAN9*+wh+$Et%d^+t3qPmuYlE*2uMYRCe=kD!z)kG^|gd*cPX~xxU?UVr}{6uY+N)U;$)I#`Xa%ik8b_KxU<@^5Z@q1ZxYI-hOt=H|}z)3I(|Tb5gH z%gQS1>g#4tuW#m&03MRaUf4ZYRWvu%E6%TL^;%x0HT_&kQ@ACwS>W};O+_%c(b&#x zXvy>h+HYG}zl*w1%p2ODdauBKn)nOIkA1z$_2~lYlwM^=f%=qoIP^oK38If4Z(E^V&5nnFe7kpDFSS@NwYy z>y3}L6+>Tqb`ZaR&2P#45ft++R30hde^i08La}byziD&pN}!)s3pX_!tj?;KTr*e= z9;_~sGf}UiVe0^%jo4T9WJ0r>3rt%InwXYcBAoX_JF)*D{SJx7yrYI8+H6%Xv;-rD|&VaUV~$4sOIsj?BzB+O7#sqd*kh|Oa;?ws;YRbh5OwVQe_k8?v45p z4+f>Ow!Th!t24!pl&K4v70+6! zy6TypYOYna+{yxSLto$9&kg~1LbDGXdaYYUuT1sr+gDx0@}0iF(zlV-)Y|&V=HeS` z2v0cHH#F+!bF$YHJZr70E@Zr@wqp9^s){mo@c!ze<~qGlxeCF?mvK4E^jfLoma~7m z)!@_nS~4F!-jX>Hbbq8J^Xe~KG7G_pkFmZl1MunxS~8zL*pfL9e7Y0{gJWzv?|{Km zx8slR36J6rrpH?{Z;`{IWg+|FBA9NW zT1>s*{(D<8hk&=peg8cznXAB`?rzDf*Y#7@mv(E`s9IzYT0&dFr?<6aMuPL`|EK6@ z68EROjPIH7pYCkQoDNR;75$^HE#%mjerncu`8O?@=fI<2F?bU&?e!*&$>PnZXQkB_ zfb}I*4tTwsDOTQCF$F_iy?**JtZn+CC3WC|$}1n9y(T;hY4r4psoBTL*hCzHUOt1B zzP>^K2EoeLSaz>||5#1Vrr)<@y8MA3PYvHpWSC`^esu1Zn-AtT)hrFx5E%t51f3olgQm%h&M1NfU z3$b@IW}fvjpZ`kvcB1>XH}&)TblHy^S0m-8i=WLmP4s?ZzeV)zMYk`tUgE?pcj7*E z;_UsGbxwKL9ZWmzv!F+dZpW=+oH}r*s+geoSD`AZ)Pbs^PE|CquJAMxPim@)nX0nB zykaJ^8|6Y(S&7azl&AXGkXF{JvV&D6J7P-JC93K)b=Xi<#bYAX`d->u=dfq3R8_Ot z^YMLwY)DnLIz&~~iU;;a)t7=M)mK%`P=~4N@#@^6s=8jCtEw+hLx-vewG-5kAwv~gcm2Pn^*G=sKk-y;BR0itg&}JCXw_$^ znm$Gy!v7l8M@_F))2FLGeR#lJA19Ehu3GIkRMkyYJpZzvs+*~cRsAVy&QMifujb5A zY((a$@ECRIP!+CKhpI5~#~h+~Nc~WhM#b)<&oSy))xbj!Lsi2BbquX-s8kKrJW^BL z5avM43_`??XdVcV|(q92h{u5E)v zKU&!4IY#th!nU0!i9SwPug^N>EYZ&u*10u8qE`xUE#>EnUMFnpy+HIPVcY&0qR)29 zFB1I{VVmbN(dRn;SBZX&<3C^Y4PDLh(%WH;8;X?wyg<3G`xiyZ7fSi9!nU2ai@r{_ z|GHfF`BzeYx3C?Ddquxb*ydR(`a{CH?b`OJ=#M-8Pl~=mSZ~jD9jiot#qs}x=&uXg z_Pi)aYUiQe5Q-(B=Qg>8R(ioUPo{}a)BIsONU zeu%JLzI{dSCv3-Opy;`Iblpcv`QRLX9rL`*`=L^xAw0XI7E&i=_M#VLhL9o@+(FUf8ztXQD3e)B zV5%oFPXuu&QeK|re*Fh2ZszAC(vPXOmgFkgByA?0k}P=S$QO|9V zndZ>mG%A~>wZ3dSvqfA>s^Oas1N!TW2wFN~pp|re(<*AGWV<=2oZ}@1px+T94Cs$g z_!I15)=PW5>FQ^Ty^Dlbh_08XMvY^ybM!{h^>WjnTwU+8FBH42KUdfGtHf^SL$0pv z^Tlqy<&&>#`^{pv$Gxt8kJ$CR)t_8l&$Ii)ZjY-U7hUJp^S`~%bK-BuFIU%ft`xg% zU#_lW-pHv>*X8Q}BX)b9;p#f(hy46g>bJ|s)xQ+GJr8j8_S#muhnb&t{Bm`@&DvV* zdM@gZJ0EuxyY|(e-0|0K-b3s=XRZ0Vp0l~fE84}?dpr4E{RqeI>H)Fa`RnQ@iQV=; zSJ!heD0bU_SDz$y?W;eoUg6kXJtfCYc7C~f(eFWZ>ibf1ox)roth-T0J`}uHRHwnHgYC zXSqZ!*WF#0;nMxQFFIwv24^1ZDzDVvwBxIB+1qj1r^w91tYe0k51)8OaHK*Qck0-Y zr;Hx1#fhWGW{ZZ8A2Wt8k?W$dLihZ!efPp3y%~YCOodyJ~EqObgQ4yPZa%xu@lv(2@}<@llT_|W5IAR5)1?5v_5j8 z8m-IV6XEP9_qmBpf6td6gRVQfW11nM)lfHrLKp!OI2n6>o0%zVtx$f|JdyR3E5#DhQ_us`+ox8v8=o7Iix)d|d ze9O~h*SgNAl*yx*gF1s!C&G1DD#)eVdOYpmJH|OBW3#qO;*}bv!r6AzBI|M;aU#CD z^+u}AmJOq9Drn5sF#&5BiAPMyT}=k1#;Zz7>Ra`3$TRXhMxa&Zm6*2LHkuabT&7jF zCAJ;9T(?5^Ro8FpRLaz)l&N8(=fgJfJvEZ>X}uh51$lt|RQZCa{RZ;puc!H*^7JWp z{LClcY96QOqIQAzlNf)w&du{t4Gk5u%en3+Up^?DuigG8zFlB1u-$qcodiJ{vy{h`!Pb71!Cii2$ zvT452X};-czRGF7#A&|oX}$+)zUgVc8EU=_D&P8aQ|9TZgUtEC)^btcZ=!D@`e&kh z67_GxZjY~b6J6X@PthY;?~VV}O;P&U zhuQjW$j#q!k9GZ~QH76-_F^{IuJdlLZ^O1+ReF^vt(7C%vtj_tR_~q7VWgV{voP}W42fal6 zb}6kpwqkgF<>IT~IQG$1q3g=7{mrr8&b}kK%ZN9R?Xv#j+ji@-U`YQnPdHWUCc@5# z0|G|xD%?}JyRfnHKhi2?1wDVvC+GCToV+MGF%f(A8Upggq8BE&J!b^6et{bd&wJ7E zdF!$qncFuzZ<9M$W_j*AH)px}_rKTdmB&htgV)R$b)@Dy7wkD54*YeI|4ul%&&m~l zga;n@)%o3qt4Qj|*)I+ou43Q=wz;HG6XQ9=TJ{%sH|Jba(AKG<9 z@bi!UxO&f%M*RHkv0J^Cj*K90_Os%ecW-{=jYUHSEMD^V{$GziYUtvY5&zlop8mJp zJpZ+>Po33kc>U6^^9U&YAxi&Vda_D!m%FRU)1?w3mO9H*+YjM#>iF`{UmF&Y5HP zJ9aNeSKY8c0 ziEUjF(R5+dP;H=Nxu3%(H`mlw9mYGD%wb=j=@m7V=O2|*FsQG;uRlkxt(nXdcs13H zhw%cYuxWSWVT}!yhc(R97lHa#>ilJ8WkxM;@(wxp5afgV9Amyg%WKufj6Qy3`6;K5 z89)4_gY|pW3VKg&Zk)|)Tm0D#^RPz!!V>*VpE;y7uRG(#Z#;ZOr+V{rDNp+8@g{BC z0JLdl42~Ph!fnVdOS44BID_)+M_*-JtdX+WAAgn6@-DC)!$3U$_rYV!^7Xi*d#m#8 z5l2rsdf?@J|Cpnz-{spwj_$pZZ%;XT?A3gG==b@$_lJDl{eASnYx(w|qlcH>ns>h9 z9czxS?D&OTe@BlvdeqTljvjaPgrkSw$!|~ey?otk$=B7_`Fd(?zMej5QC|Pj``nhN zhi2sK=|%Z^^nrXm@_PPwsyFg=@2`%(V~;v|%+Zt1_@`Xm@lQLtdNaR0K1cT)-S6lD zM-MuB$kD@&9&z-jqsJUQ?&t|ePda+a(bJBu-g5fy=$@nd9X;UaK}Qccdf3q;jvjUN zn4`xXJ@(PYaRDy_c_hf6CVb|C6tW-p|(~f6mu^C+2Ve)J^$%{FnK<|CW3`a!=*KM^8Jt_v`%lpreN#%D2ZIUB&b5en*cvy6@q9 z|A?deAIZ0e96kJKzCGsXNk>=9^8G`O9(8ozWBLBk$Mf}+qx+x8w?~%e>)w<3dc@H~ zPvzUAj_!Lp-yVD>UynF?+|g5xuAa@0_Z&Uw=wU|>Ci3IMjvjUNxTA+(%#Zh0I{I(& z^@yXZRr&UmqX%Bjx5pe^{Vw0`y^^no96jdf-mCfkF-KRw&$ovh-T#Mtd&JR`j_$pd z?;m#bn4>2hT_yA5Jx32add$(2j;>zM&zHD2e|zfvJ>Tx?sXqDkK(Bl~@~nGZJpcOo zK^i=Qs{4u9~gYa4_Z(e4n%`c1U9$w(=fdoDNqc;~Y;gG&eMbey zE!+3nORszPrtQA0{OS9LzJAK+Wfz@0vh=*G`aFAFRZZW;X9QNvKI`m-U3Pr1ai5AS z?+foR`ljypeOx+ow!Lg>)2SNyy}1VAi-oTgjtValZVeP+gSlb6uUl?)dq3Ig-od08vg>c3+p+eII^Y)Q!OQu$qY%YtAm~ zyaGpY^MC&IbB;&8>iXwf3p{)01SE#$&vzxqSN1qPB*%*ZIga+k9uqwzdP4Mw=qb^| z_WaG-MfZtrk55CQ`y@VUT3;TpUVP)A(=;#4kf06Ns zNS>H*MEs(n$AzOs;zLqiY`ha*ucg?)JvBj>7i7lvCWQy7jdhL~!ly_SDtei*L`a`;&WrNIwUvpM|vd zhIU8Z8|WQGFQ6~}9SRNuhl8WRP@u={1TY$m2l}~>Ge8B<&lyYy7l2E_HQ+k%3ve4) z3?2o~gWrNT!N=eWP{M%h3VMN~z{y}LxD@;nJOSPWYr)=hW*9gh`~tiLz5z$l!I|Jm zur&+xRB#{IhMNb~;B7FLhYf!ZPTyLoe}XGm@ekidsjtBET%x^|fw_jA+4T(0t=v3& zdPk-H!@@4-!Nm`Dp*_1&H-oj;9<+5YrOsi{o@UU-|Ac268Myt*cs7E8`$u2e++V5J zxgb80!P_f9dqyht`H77A$x1zRx>E0*OC8(``?ikua*zGDmyvHi?8=(G~`iz`di?0ZVox4$h>$NsZK-LY$_I++2w zG+e5#ysK2b`KMBK-)>u|vrgYaRou3P+WnI))b>YrQ4ihNMcw>m7j^1cTdM0`*;0Kn zVk>pRs;$%or){nJrMFhUys4|Y`owM2u<9X`i zv5ji?=jN!RzrKoP`*SsR-EHcVzu&K({M&N%!M3YZW9_@DzSpPfo0I>eX8Lw6`Jclx-fC^vZ@zwHo9$1!WZN4@p1IwN!$)=N_uT01&k2ThIP2l- zcPvl5>3in#fjf^adt{eub{N0wJuA20{mLD`=&{YezTNZX+xqR@9Q(z-J3W8sPtMtM z-2q?p%p7#jO(PF|;>l#+zxTSg|4Hdrj(GdQQAh80@&19DovTLf`{K?gHQzYsg5b%Raw*$3ri8qCz}gQVS~aWXTQ(*dtY$?&U0AR3K8_yGGb-ioFCF)dj@O*xY_6EZhzc(w|(vbrR(pc-*^C>25hu{aVlgplJ{}jyHSS& zdF~r2`niDIPx>6^_)?5(WXEK=n4i16ymJfZTPOJ}7xQ~Jw{ghvBJEoxerd^D%&$!B zmW%n>YTf#a_1osNT+Gk5)8;SM??KW|%faHb!MLWOCq7-Qeov23+o!evPJFyr{a#zFmTY{=iTBqQ8NVX&UQ>Sm z(;cioQK&B*V6yo2?JocNS%hc;UOi?l!H#HTx0f69qhvj5oJ`n{R?{rAan?B>RY zoOrK;^~aoee+TPNIq`uG*6+>A?|-m^^@p7JsGL`9G=4?a-lm+5=(_7O_Xf9xh@}i9KG#9=O=lZ`X6T{)pJ^dg$5{Vz=vw zYgd<;{B|C@_JG*!a(C^aB6d4}BVyNadK+Q$*zJXq^YT_*DzNdfPR85$ktotWYflxi z+xpd|W_*gZKjiE`r1`DuU#OGuwtWeSx8r8>Te}xA?JH)Fv|~@TV-H+r@+U%Vko;&*!fOG?0WfX*y|B?dE4{r(jvz@QHj@e>T85iIbPaAE+FV~{jtj{wweC6{qZ90 zx7+80*sY!v-PV`NsZaOGE(hDc_O{RJ^0sm9OuY9U;{%={oH4NLahNDhu~NB=&fb`eR~uuYZQ^_={b)Td%M2 zcGg$#%C>fF%HJ;Ukoeo>84`tRb6e`mnvfS#IEEzi<>_nc6%MjwTHy+&R4rUB4W3C z!urd6Q1eXt>~$VDzbAIToQJ#ifY`%D>>;s7i`XM#j~B70#GWo<4_sr~?=P~x#l#*g zVprFicz68l{P4tHZ2K8##~u=UvF%l)o%mQg_Jr8&d8)g7QnvncO+Q_`x=#9EWP9p~ z-JXZJ@d2?H8=p`+_DDPSSUdKF*hA+P?q5pmu_AUg-^8UHd+YW^?7H82`{#|%uVzlc3$>o0PAnzr>9v8$+zpIirW`{!%N z?zLkNwPTO9V^6hX_kL#D?;fw&;|IUkTjzu5#pXkM*AIf7jBlMU5?^fp6E0%6?T@rm ze|y&t5}k~kF^n3}lV~>d4U0ybS%*LNzczsG0vD@YC-Du)$zJTb(#yirEJ<*O` zEhs!5wmku{TRkZHxPJcf^2%AW_)(r2{rVlwD`4vzDyyr?o9p;Cd(}vlZ$A=W{bM%e z`lnTR&+C+W9-Z9eCqMqEZ2oFqE!*}&!%b(%i|n{}FUL$hi`wwLH@-m9%hU||g>GwpQZ$@#WUbju@O~kjo;c_$MkI1jTxo$IBkXt{C zGPnKC8#xO%;*fDHr2(vV6_xxXLgTcW>5a~W?#~;-^e=5?jd~8Wbsp(|JDxf8o$Bv+ z`~ZHnuaQ@_H5MFz_WS=m$2%S9aQz*RuWO#3efL;r`~UsMf7kYRJYK)muY9Vk9qtOS z8RP%`#(&rLcQ}6Fbbb?VcCi6yzyIHNe0~QyUVkU!!_8*%=uCjkuK#z>Tk z&#~iC@(XyAo2Qg#f3TJxV=R2?;7*NffAjk1=GO=B1@jj?s&6;{k!|y@-1Z=MT`sf$ za@$upzHMFVM7*8Gg+ezPp91w0zuEO4Dbqi150=xvR(tNW$gvNy(?2&sL3>VuT)Ulq z#o}A-MdI!B$WE_<^P=D>Yr%P82RyfZt@*!)c~>C+QLP73-(v@I+MkpE`|H5Q`8kj= z?XNdKPT9#7Uk0df{%rdT<=^}jzb*eDUUgp1d&sMglvi^fcX)Pxl${sUzmYw6!c3^L zOVaR!8b_~p^rn9P$rV-E3t;?ikzxzxugqQz(=9N%nFo%ZJ;0LPVopjO-?rJ(cGmae zcC$U%q0o6ZFUevfHJQ+65T zG%YLQ-(SYZ?v(RfHnKYn(Dtf&Uc$*0Lw(gPFBnDJYpd&~HccyTujkOdeoA?^*@fbB zugDd!bM-{eFqvGA1N9Hk^P$-9vlzSnIonNLc5{;Es2j%@T19dK95E-}tj-1Z-A+)B zx^aAG>zCt*(VdN#%|$2T?S8G$1l9eMH~SZyK-dSG-#Dn5(wPA)5Z|Ez$cgXN0JO!| zf5-N>#&@{=t=k9L0#w$tZDe%&9Q(|T?dAfdJ*I1m&aVF(AJ*s3-+}zVN&~-aH?z= z-nsTd(;?5k>G%`9! zeU)%pc%g7uc$UNmg_j5?h1UstPni6(gnNuNdO$cP<*S6JNqJN_ZR3`kxaCrw67D+A zl>3FJiC;k2j_*RzCy8G~I3eY0gqKKpQrP#T$#3(dq}=M3{Ws;mAKI4N_vl3Tx+!~w zGbEh+`j)KT%HzczH0&2n2nS9!N zioMFP{|v*CYO&8YzvmLIGP)7;=-ca`aN6!XvrrWzue>v%r&fzH};6IZ=})F^Tbc|#0jR{6Fnq)Ty#%# zTYo_651nY@{KAoQjc)xchr~Z7eqrHg5&wwzr^GKV94q1<6aUCKQ-4r6Uc^5k{=uEh za*g^7r*D?{g@%2nFLdqzNsmr8%ReUZX^HnFE+w28baTP@fW*glmU<;m%2lyKmz z!u3ZaUhQJygOVpMap7A`p7fBy^(Q1gY2$?xi%eYdR*4tgF2`0r#q{6TUB*x1qvG$A zcy*h}(;6p2K;n}U9~4g9F7-=XT68x)V(Z^k>bLC>f1j=Qj>7dPBt9+iLE*r5X8#uy zPH$uMz_x~?!ft!i1T!A~-AsF8k}o{mjDJKp88CWunBm}Yg_lo2^7(c*`NERdzk{?# zIMvPQ{_PD%gx&T*{8!F$nP|o@BKcC1&y%>Q(099}xfWJ|=%s;=HGgpZ8S0e?Wgk+ z=7+bX;h-{{C^a1FVmKy#5z8f}JS^N=j|c&&FSws9AE`HZrD>8~mwhr@Fy#`a0q34adbE5)KH*=No%W*sU)j^~I&W zwA2^vF8$fnaAGIJeko52$Alxcd}rgA5_aoLNPTX(J%6<4Q&w;9d?h9MQa#M?{UwEM ze)}G(fM@KfeGUIm>tE}8tqw5t#P*kV{Xpx3eNR^6AX86B_=lRG_Ptw?Lrs02@DDX# z((=B#*san(;lSZ$o`sK)`B~(6+;^tzf9^2x0n0~8{9wbyj;H++pZb-Fj|r!aF>#)7 zTG-Az%Rz|`+->5Oa9oZTQ^!jCMYnO5!xA4{V&XmF&K`e8C7-v{(^FL|oQ^G&g_8}{o>We&U>Iqoh%4<>&=IOrL_)V}%tLHnMw z*NlHs{C$TTzu3Th|FHPSTa16i^48|Mg5A$pj*5TiE937I4mwa5*A0&FP`Q7k< zu>DtQ@Zn?0nx0R*-sN@X@ z+jiP^W0kNce|3f3xrDio9s*3kd&E=TlMXU+NW8 zUqaX}-?-S5Zy9@B*xHj~55HsVo^VpGUt2%RY4MM~C;byH=I_b-rqXF?pK#z$WN?0+#F5Zxzi+Y^xdp?{nFK4I@;6Bql)a8TkBDWk`QL&8B}C7h7>h;V$h ziA#!Z>kmo&UW=(e`K54?@r#JR`r7!#zuL5aO#D-8jbBu_*mx&wd;V+u)Bo9Y{*?H~ zPBQ2JA>oL#{k8p773O#{Eq*CsZ-p73RzDFu>mQcu3&Q_f_xA!)e|({-KPdb|-`{)J z8HkXyBlLi2N9=yX_IGmZ{=)jDFE-nEzi^rC2P|7Z-xbC$Ao~Mbty_OY>W@5Y>PY)& zx&P=BcK4Uo&v%uyQ}VU8Q{J1K-pAyL3A^i8(gq0oB`(m%#6^1>_RDf=W${y2OMj#t zZoZ)S1&2yIh7`_c{X+9hzL?~7kB`EVFFDfWi3rh~r}{Syq^-+8iZ{ess@e`jQsQm>_IIul*BX0N*nPes za<#F?groBOgMGdscBQcgt}z^v=R4x^{6q9AQ|=et)*qMt2d_7FpKz?J+-DVz3)?u$ zNr{i&VB*8VNx7dK7fuP=ILm2?PuytYqr#oNKkchB`~T?8CSORnv-gwzk}tH-2Of;`G0BhDPeD%@e7@3I5kS*PZmBy%1<(E$1g1T z0=JlaK4I_5d_U_S760I^#@`c;%`5C57ytAk;~x_)wmv0o{=1|-!nXdjwcjUpVQcqQ z%kq1`*aO1F>hp`g7dQUthYZ_%L9vIINj_m~4~spp+}M4>Kh*hURO<7sF!iOLHvB`K zU&f`r)N`huxbP2kewmc|;xC%|BEmn^`DI$_Oa9K(7ZtY4*Ehw?r}!Jj9u~HCzt|&x zGWLM5wFku>{K(jS!qy%Zd+1|h_X~%flk>V~4M&8d{1Rffc`e5!e@gPkZT=S}PU6$T8|7bV{E}j~c`YX;zqi_qPg?R9 zdmc3*`8M}?S0(QW4oQB$aPVc*F8^;0hlJhshkj@50kPY5TlOS>O!9_>L$8{+_$!7} z!ft-=_r{(OyUlAkAo)|0H!d9ggXEQXpXhG>;A_S&Eq*qy<&fm}{wm`y`F%+fXZ|6IRv-urCZ)!F{qc+2j4scrf9mEV1@_4l1W@dJ;Ka^9Q$ zeYZdG1Lu!O{*bJ1e&NLHW_|Nyy$cGv>$C4oaGuxw>@b`7S)jQAZ@6-R1 z{KEfR*INTpe^Bm6dBU+#X1||0!EjpG9ly|MV~@%4fgLx?A;}+=ydmM}i6$;7@hM?9 zzjxB6^G76q(zaVTKE}jFZM?9XKRtHS`D2pbmo)d&Qj*^<*DoT{?}V_MKPrC3#wQ{9 z1FxI>390A%x_*+9{E0VA{(x}wd%AvNf9EIimgE=S-0LUycYp$aH1SG!bFZHS&W~lE z)APM!;!`%ymcPuFhkS+uI~h*zXgDe5aVht97W?+X+X!!GIMBtgo!6E_Qh!Y94+}@1 zHU6RBN&G8@(=QuNN_kw$y;n_n>bHgyFN)tw!p|7C^;(Wd{r-1l{Di}+jlcJI!y)0A za7sA*H)Br-r#{ZFCnot5k~b>sQ|A0TT532c?AyZVLE%)1(fwkNWb*ST?D&0T+8-7U z6}exM694em#y==*$HV^aQ)Hd72ZT5G`jEfY%%{+L6YmLc?)9Ot#H;_B_{4vt9i9CC zLR9i4OU(7xsBmYm55;Z1Qn@}X+}Z0xX**t9n0$WW&R!q#PdDSAmOKfYugLYGp!i3+ znEHdl#jX#9#Xo8NgyYwkd1~j8<*4|_b~O3J!qy%aySJyYr}r>y?Mbl*#U2n2U0=99 z`}^EU@rwy3A2R;o2c5V&nXh}9di}!jH^lGte1H4<*J<%f2*=(wetu!we*1gXk)9@h zP&oBB;~y5b{$XiPT>N6f?)h^>zSo%$E-fwHV#_VJ-g-Me+iy>{68F#B(kn54uBDJ3 z>Jlj3)ZZkv@n63GsjBU7q}sf{+zh9ww!h=m=Ka}tdh~z%bHec9gT1m7#+`bwcU0d2 zefZIn0sX!H{{DXdfc}2QCdb~--zQw(STjqT`}qg@2kD{v(cU_KKaS6j^W(?$VC*W7XDC8u(Q+K7tAbarhV4^OE{|!ROYFDLx0>a3C z_!JO94#Ag$C~_2j1jLXN@aenJeC-3j4HC#Hc-bCGCAAN{&0b2aLH5Cq0pG)v!-wxp zzmNm)zWXQ@ME2k^P=)M=9|P00Kiq#``mFuo31BI52tLoF4ai}54(RzP;{#9JUnvhc z1eYDam>~P%{=Migasa*aqjrJF@0S!BXS|eCI**4LJ_~xlE~*$SF8< zF#Sc={4i+I{_qipDgvkrz7F`1qws*R(+MK19OnW z@ReMgUW6Ql_v*(oM)u&d1}OC|atJ>6aOTou$nbebGEb1h@V8(Rvf>Qwslkjhasqzr zXqK;*;cJGne37H@GXbUE*X8i-$I<4;nPc!F!|5}!AC8Sys!5l_Lr+v{3333g9;4K9 z1oZWylHm6R;dP4exQf zQY(->cr-{L2jLwjF$a)+@J?qamC`=&GO!vs0Z%+rsWfs3?tT`1)IRWg=PK3pN#+mi zD`&YQYYu=h$eP1oBC_TfI2&2>UqUQ9D}Jl03@kzR z!&ibhauiO0<;a@TT1WO(D>VyriSD2x@GGDzauU933S*5Ng-fT>A7md~3wk1l;SYg_ zoQ9vCM%~B>_!BTtm%|6uFa?qQ@PEJ%WObfW2ZJ%X9KHffM2^DWfJxfteAazXg&cyv z0n>DOEz1YYLQcSArn5dH2jOqPeC<=mn1DrEuBW;Sl)4)^41d9|OT~40qf$p+%s3zi z;M66o*T|ZeUCO$EoPY;M*rsV8_*2k=oQ8M1isg&!!L{=lx1W(89`{qm2RR5&Uci{> za`=p!7!%|WJmWT&J#qvdc01cc?GIlUV_idz!Uz0{J|g?!H6VhVhIfC5J|cVY!{Bb@ z1pLN_^b0u!m;IG~A^YJw*U&HIIQ+|hFjtXdaO$6|kJ=x;3n1!?Hv6!*kcuW?c?H0YbR}<{vBA3oP_`RU)DS1H2ii+iFyk;1)o$}qCP_o!mGdr?GK-^MTzQq7kS`7 zmlEYe)_gALq08Y$&=WZVuL2%&60YB}L>+(}hQ9!QWVKa^Iur~-_QQ)n067M)0;7Y;~yKPgVnvi{PcQ6OpgL{DpvL8Mg z%ta2sBf&i6AbbXxj~s&QK@>R*-v|~U$KbobBIG#yB#0p=;J<8FqV7gc!AEy1QOl77 z@aG_boQAt?U!s!8K6og2SNp(cfcKF@@a{X7s1&jX9|+bV`{5(N2JH{;>nmZh;sZYo zx*{jwU3X#`>2i3%o-8Be82kkoh^+Q1Q8PgRIRbwSMj@x+ufRm@)3Zd~1|}iL;Fm!a zauR+U)FP+ggZ3^_VPrpiJ(z=|K$Ywu4Q=3(ezjQz?Yp!f03i`U7!j%4u{8-sA%PQyn|V%{SM;D3U*bUCcfWIkwr_~COH z2jm1i?_6y6(oXo>3dR&!O)gO%fdi1!aIBJb4Oz3Vnz2UKe0L4Y8aWRCq@MK%*$>Z} z#rlFAfu8{LkrVKU*~}s2AY2P#$YJ;|7m^D(1wZvO`l9{eU2bJQBYW_!i)gc!;Yy$u z6AO2_4IumAU4F$fMfTtgz(ZDdmZ;-EZ{#36>MrK3mf>X}fSiD*-;E794BrGMA;;iP z?xA1EY53yB^bI)z|9S~yha893fknvbz7qBP{qzet39os8I*`+FdMW+VGQ9JHEF)wO zKIqpa>Q!Vvyb`34lkhGN5u<(J3qcEV1YQp|AgefY5U3@@!Y6|+$e~9{)Sn+^9FSA+ zsAX)kkc054kFiX(5BwAugq(o?3PvHP;gyeV%c-Rvq>TKj7{2rKwoPzgT&b&qT z!v{Xeda7l3Jcw$4_*$?KISQ9N#h4)b;67lf_Je&)?3+S%>;opD*kdyE}3C11SgD(XGkt6V_FEW>qL-2n=5LvA(QMbOtxFN^j)NdFo zWX=9n%pYXUJN}OK0@(+Tc!l*EISAkQd*%#s3|<0~$Z_~-@D_3cKI0FJ19Avn3{u($ zejltsPQjC3W7~%uhPx)2OUOR>QPAan^1z3`&bA#n0N?rs{Y8$!r@loWkwfr4Z__?x z4}JrTK~BL3|B>|t*$-a;&PI;F*MMorQTP^6iyVWW1!3d_{5Q~qoQ8LMhxH5DgO3Mu zkc04}c?}LTNDfr)D5wd!>L~RRV z$Ue9X+>PvqSA!+UX?TbCn5)_co(onWN8us=!@d|f0RQ!UmXY>{pZGKNAt&I^!5Uo- zKlK;pr!I$2`hayAISB8VV%a=Eet7hUEDPiy{Bux-9D|pC#Iit6z|X8^{Iv|%{*CcR z4#P7+1UUlt`a5k!_QM0f0^|VvORx|*1`k?8-*q{B#wV;}$RT*mr}PUs4Zryh<{NSf zKK?W27;+FE`A_1}jvRz*z%t}8d?8ql9D(l# zE0E*xQy_tyfZqcvkyG%eU=?y2UJqVHR$rH>tw9pm2k!~qLiXT;z`MwPcqw=vIS%(; z%lfX%;bq@2$B+~7JL_2%4^kIAWdp}K$YHqgKa4+e1il&!M2^D01cQ)c@Js(?t|KSm z4>OE8avDBHm8ylv0k{stki+mzU*VgR6mu z9EPs|y^*8v?pu|zAI1kh2n<2?!z)1mISIe8b*Tz!8SdS+RE4w;{3|dGIS#+DO{r?q zKJc7vOH~9p0*~6RR7H`4@CFb=R^3X~n;?#yf}`8hZe-2(?NF*-MUKPg`sh1y2tE(A zAcx_rz&h;@{~B!2{_t;rdWf;zg?!yhRTpHZ3`zKPu^bx)Tyowxy?*~iqiNgC5_noQ4PZOVzvj+AKU|05OyY;2S}YXSrqt z-v`EYqy6xcAc&lRUjn0$lkm?6QWtUzo_siSV>{*>d_9s{KGMvLCJo5$X-YAApc<54`Vie2_i(1~3sh3O@^i z#3tZ(z!>Bdy!Qy^y!MBCfpzrV4{te=`J~4X-UCGN_u!+!BIE$P7~G8@Jn%bU5^@UO??lEKA3uB==)#;2!Sz5Phv8enyR1_&_#u!)j>CThK73N} z=b#&M8oqK2V={$$;ql{GUTjZ-@I@d+Yy`dmyoDTvp92B58wvPxu!iz9yzhA0z&6K& zM}qE@2jMfpEVd6J_&l)sUD^p>26ax!5ZWc{0vBFfB49g8586HJRYn<4#Ky9mGn0T-**bj0yz%vGlBfb z9(?+#jMXp530Iy~st!O7!xPSCUeVtWJPj;mn;C{n&SCq12g?+`0nDW@QFtMU=zhUV zz#QZ_Jo8+}7C8dX18bgP9N>juC1V(amw?YGkHgDBg7O6XA?WcQ%Mm`HocaGJ_B-%g zFakLWF9M^GWAN|6B;+LAB~+>gBKzPfP=*|a=Kw!)1fB;1$WeF!_>8(@@GGDjauV)R zfuGI;H-b4j7M>60>R9+0umCv$PngWQj2wbjf-2-B+^3Q`kL-s-V3ziQuL3KnD+(_H zQQZc3F?b)JIQ%3?At&J9gQRX7{62^wr{FWIm;=ZmxC*R64#Rf?rSrh^s@XqM9)%Zy z4ahP0@1Pq#X?Q(YNV%HAat2G0eQGcS10*lBKf#-oZaumK3EI^LKJ5HmnztB#& zJ4h4j!M%aP#}EG#EG2&$KDUNG>bl@b=P~EB40k`DbqCplSAs>zN%-kn#t}IIzoBJv zrr_h zLAt!LR5gGyT@J^=BxKERgCW$Lg4ckq$Z2>jNbA_9Qnd|eLH5CWgHiZ+a2e=?}ItWDfoaHj3cri9t?cQ0eBQR067Rx1YM9ra1}Tk zISgM2Jmd&G9}Gl}!VAC%kH?jp7`$U%7PIjl#>K6oF{lX^Y)Bru2kL3lElj~s?)0Y5$w_&U%VISMZTP58v% z#b6NSarmT*X*2h)gYYB}*ZVv83gBJ9dI3KQ)(vML0e=iykkfF*C2R+f!|)2wG7KO1 zW02N9@Gh6qcVrJP17`==x59(KB;)}6Fj$RG0`3=K9FPNWC0KzR)(q5f_`s{cL}HWh zdteN53hsRw%MTwvJO^|`j=Y@V@qeZv=NE$KWL(O#V2$9MmEw;C^%2cixc9XHA3r8ZZ!_C|q(K>nS;X@Bpx)nY!RgupBuIe+Z(; zY51u5^p}1G;7YJe`@lDXImj`137AO!IJ_JLkrQyg>#^YzfFA~nkQ4C7AcCBRhy0Ye zt@Fd9z!+kK@EKqPatK}uR^tMi+;wOSwtTABhX!!!(D#Pb`{wNF9bc2WALxQ>e;jt zUJ2esPU0WHXJ zc-c+Nhm+|e{L;-Vugj?yejCJZp}+7N5aAp@4fkA#&&zE0;4vWhZ?;!(N|*nRZ8$vh zm&AU_b`M?(Jj&zn``~W;Q*ihe`a-$puD8;D{C)5%;4S1NeC;CI{R-Pm_))Nk*aZAB z=s|26{x9f`tZrkU4i@6$gI@(bTgU@ndpmv9dEiGuTIYd32DLg5{9iCl=edJC;4_^E zzFN!lHwteZqush3z8bXXa(L@sv8~tT@YUcgT@G)3C)-tB4(|mv=y8J&1rf^q@M5r< z@;H3ZU9>@$!;8WDx*R^}Zsw9MhZlnY?To_*-NRhb2mm> z#Vik94j&DIln3CGz+03D;opKmlqca6mavZNa`?Bvugl>R?qlBQa`?#ynA0q;1YG$b z{;#r3;j@3ux`TfR9`g|Em-dHmewcL={}_DqqwFj355Na3V_m}E4|jiz`H#N`fAKi| zWjU%R*#0bMzlo0zz8Z8xj>20%$u2j8@M5~ zgYj~Vx5Q*Q&O2d(oCr1a88gLyz~Hm?44;Dya+Z&K%6yio^L9ng$n)+U{{y4c3;ZN1 z`iuNJ*2`sXecCt&Xz?{}?8%~Wc;0~P_5H~lfAWdv(PvzRPhW3sOZEVN z`h&gltvc8IXe^%*F`oI8^Ex)eH=?iKJoy={luJA*8shw}oj2KNNR<1~vAh?0)suV@ zI^_({Lcu(<+>XU^j_Woa5-rmcFna4g?~yqxFXSIK(P zyxq_tQ9_RM7%bG2;Cn(gW`WT_|K>r5g^HrM|=X=-452031kv~L9 zPlX2&eP^DV`tR6apTzj;koDxa?q@@yiX7v;&?_hTI<$xJxdVfa&GS8|$OZlZc|B3g zI%B?^;^VPiPnuuDN@JFJ$Y#!Ko-y7FgL0A|MJddmFWB5#87IsCz}! zr(;Vzv0+FQS5NVih=m^BZ5#JgPH-C%a+c?y^9*BhH~NiJhYyl3MO-#b+22aySN9z%H)S)PNEoa6Zc z{dv9@gX#r-6wT&V1Bl5(DxqU&mF!Y^T_T;i&o)vt3dZpC6b!?RJ4 zvwR&?V>j zLClwnJaTtqUT>2hslIM3(UuVzo$B5(#Z~hzaO~=N0UsS0lc>*fyeD3h6STASz4)n@-eg@0s z5`T%39PRHOp-+x;FWPQ#Uj7i}a4q~f`sL^V=fwIN>&9a+C@1(2SShFZ3Y6p=KZIVn z$nT;om${I%H=HZ@AtYQ^k)KABT;l5v^nUQQP>zo{$Y+Y2;!O^AtQ_OLkp9HyFQ0@~ zIl~vCWX@T>8ohFk>n3>C^u+jTw8=THJH(iw&d($5UX*ydiS~>f=QGeFXZS|U-`Jk# zXV4*+_-(|^zszeeO0Mu95B1FI$?zI1k}G^#i)Sa)`9=)>&;8<0C)rD%IhOZ3+_lI_ z{&BK*h#Vc^I#4fX_+0db>*WEA2*>h;M-Pcc%UND~tY<9Lx%+s}qg>?W(>*(KiSN9~ zf0OgP`ci8i`uXXr-J`I7_%HLk-{dSW_^bUX=ehQJ`$K<>XJLbD$?^ai!#KP}PJO6% z0^jyGbE>w6Jn}~ONRIQT^X+N5!qaZ@u8`Aw62@B346j6kdYNDAP!E}B-sT-8XZVY} z=SztD==ZSzF$C zWK}dvj`18!lXG0vSQVv0oiEw0DoRJ*&s_X@mA_VMK77{pRng)#){Wo7c;_wiq4BC{ zp?Zoh-k~a*A!m8;msL@}IYhfU=U&E?v%Gs#mA}_z4f$rw40Gd}z0FfS#&3?RiaO;o zA9p}i)F7w%twXD#`Q}sR&#?Ac`+;w6sfrq(Hx8dTsVbTxr}+iM>aeP4 zk$R4|KfEexm*adjGNI0QU_gJK@1I;1O;<1Qr$@MUxx(ikS>^jju8aSQUi~?~5i7&7 zd^gH+fgeJjT;#-2u4S2f#MdJV=jEp`O})skp#LWOidSH*T;|oN$Q2%*GEX_iyP_;7 zIEnRg@R1mlQ#?D=7i=13c_Bvl>?rU<*r2D#R~>B}Jvm-=OjWc@F7wP|tD>gxS;IFX zE$4aV6l;Ev9{vn7)GPeZRQpW5$lqh>;hv-8+-nr%81ISs{+uq!$D>O<%~xQiadQ0n zG;4mY@%b~fh4J}+zjH423h#P?ab~-A-Usb+lK+HRXPYx$jd|)h?mf-ET5CV>+*$6& zr`Df)=jsV{9(R*9Qcv=)7rIB@MM>WKA#(_s?|4H0Z>+G&GulS~@YFLBdmL!*{(y}S^! z^b~l+=6M=h3cw_lo z$nayQx<)m5$}N+lTtIUztC-acDGNu5k06L!-%8nJ3?SuXD)- zzU~p%<$J|BzQ5bK+SR$?(V>2(!Th-$E9D#yqAW*`xnC&B8U6wN&J{gwOpKLtyxr2F zQPR2Md>`7?3;dfWhDM!XKKwFjowvkupL7oO96$7o`RFh5@@K7;YbB*#S4)QbKnunjT7d^b5IHAPdbbU2>U^_`p1!E5%QsPcHJWKD2In5_~%*$a(HVqnk@dtT%?Ps2PtY3@L;oac8C=_&KJ1MY9==Ti|~W=!t;#C)#M!_WQC{kq)x zb92S@sweq~FNQ|5*WORi?sPCc@kRX z6hDnYJtaQyXVxU_Rel;Vxx`#V3UszoR666{owtd;=S8lm-8mM6Qjbl@Zzgovw0S{8#&K@k$b|gy%S3O7P{mz zufbxu!h={QN7vZ1D9ABhh(5W%k7AKrZk@WImX+dR*v&%jFJ;P9`$mP{}z5N=lLE~$p!AlSh>g_ zV~Skik=I#UInJXnVEzf-A06hI|q~h70T;UXPd@z2+VJ zy86|wk%#v>pZ*v>g~62T@ofc zV=s5E)z#6d80)+lehZ`2%e-p9y7`PQb77t5NDj_^?S9F@kD&kYO`;+{gFd;$Z(yZd z=B>Y}j@HU?J`m&I_IqTWg5G!h{*+r$k~4fKM!dU8l;`R}=j-$PalRI_{XBV&_A`9OpyP6z0GeAR%XYDV94|k&pb|{WXUaFF{%^^3EGP zlX?<-GnR#U@>(pCEBqA}>xq7-j<&=iInKXCAsowlqvCp#+=7*Iil?DJtO?J+Kv)yL z9Bbtqccbn9%!l{<(Y-cil2>89o-*(Ilj|{`B6)5bE|OU(3+?c&c%mTtIH{V1`G9E{A;%~6t&w)pqmmroOOEk>kZ~;qUWe)G75;iN^OU2_Yocv2S&s88Op&wv5~i7R ziTB&0CMt$C;lCiGp5=dHlxr#Q$SvI$dos@FV!AcS^3#~1r^K6WcO7e=@9p!HFaDLiwU^I0erY%Rrpd89 zGEoy%>522{dw373XZZ0wt>>OTmw9-T_lO+h6ZUq`jFaYnkMo{UFYx#Kn45Yu-rm^P zo-|I1S0b~U`S20V-U)JwOIRic|80NkAm_Q~0Q3KqI)9b4m*nWcn&>k$>~4Lya*(|m zGA}&XJsoQfeBA`^nS}M>yADy`L!BR+Xy404zV}e;rl-I!wA4i7y z^LOjOUmaz?-fRx3nrPM0*2lTZ{M51LBNw@4inZF+b@9H_>>2$@P9JZs<{5m&@7!NG z$Ma8co%-{9(NS zJo$I0n6sSb9ZvP^`5HCB+s^Rp9B*&)cj%C#)4bCVm&@FEy65o(J$wab7$?VHV!9m7 zbWXH~@wtdLIe7RP_P2Azc+6RzqZ6H%k3QS@zt_)~og40xG5OK+>{q$SZ(m^DrkewQ zd!c(RM;FyZ+st$8#yk(x0wa%_3#b01$xW>zT{-R2M zmTy6){yaZ~K|MuYiQcdd+;F*jp(oAUmy-2K53zj6S)@&!XA*CH@=*e@85uYt1n5hR--2fqps8M`3iY&pZAP zI^OhIz&l*!GyN^^e0~JYz7{I-q3u3z&M{AZ3#Cri&Zk~&{q<*f7P_1_%XeU*oaZNz zmy7%!7RzP+5sT#L8s|aN3ZJd~ET))SiTA$Ny_1uC2Ns%Vo~!4%*Xl8zhN7J2lQF_L z8NL!RImfr6LC*6(QKi4Y-B@c)io6Via*0=BgIwkc`~~~}?}qEFp>g6o4~=1b-u16F zQLUZ?XR%BUE@P1#yy^Ak`noyu6y(*@d^QrHpS#d37kOyTdq9ry31|xayb$x`0{5Za z9Ll`>Z=Pkj#K+y>d6d(<>5bm=a*Vgfd^ygKVWC{)&oSBDd_yuCiw(w4@G&>JhHzef z10&q)GLKo{>w(b22cXt{N%B%mmy7%=M$08m+-yE_@B^3;dU!pWoIL5Re$Qc;C;tnJ=^R%znf=@c1r! z>=vI*d^)?CS?U0iAN13m7X0Z$OJ2J>qLQ zWaSj+5tD;^(P7LopW5wNkTZPCqwa;A=e0;p@R`f|J?5PtCpm`(Ik*o^a+!C1+_Nty zIExL=72JhsVg7vRQvGs@FM7h>le4@W&22tgdE}GkBgZ*|Dmi#5;&PFPKV?ig#%Ti(-8Qh6_^*n!y337##&saM> z!EG1_^XHl#&%PYviAfnac^x+Bsqir?+`HS=`Cn+tJC@%>U-%k^8{cxh zx4B-Z1dm7k6W(>)fkoQi)mWyd!at!$jy_jMI@Ea(t+mGd!u?0b z#r88FjSaqkmF8Q}C+B&yFTK<3^EjV}nf7^>pF`R{FL8XmYmtN7P$g&ibL1QwedYH! zSm@X^-;EAE1&+S9=5p{9)XQmp4T~LH=DojhjgC$7Ty*KlaT%lJ;HE*J-Exwz`p*6G zZ!YEdvmd;#Np5(@jYok8(IL{nX8_ibF z@Igasqki=iFRiJK=BO7rSLYaiA1(Oc;k8jgJ;is{*G5y+^Zdak##FEH0Y7uBdXg`X z)kgK-I+i~~lfS=K;e$7;jmCdv9KH?p>UsVYwdxf0@@h1MdGc;sxpw^tJ`)xF8D4@${Y9?cx;9GakMWV{*Pr6QVo-mM-^OzFGLLDf zwZDwXXJd|fmY+s0%#*j-rZ(zTkMn6Lhx76S=u|KAM%&g#?dmZ;9$o5bz6Z+wb8UNK2N|L^%S3m7Ju(P!wWIp^%nRAOja-P4?CNW=P}x)HadT_ zXTT!MuDfJ@1h~>^(;&(99dCU9>O6nE<4jJ`mkJ{+vJw0pIv&08BS(C8-JbRpT89&S8 z#@kowNxt*f*6-M(}`YZfa(lx4=`SFA8fBi+?Y@+#Cw>W>_Vn3++ z3#8G}hZ|Ep&9`IF=U|@S#6b8=+0^GU z&&M)3&kr1FZhDHmYs$LG3BC<2a-QEnQZDm%M_ZpQo$Hv|Xxn3*x4~xwk4ChWWBGvJ zS}XlYJ{?WYmEpxxUCS0e%lO4<_L-g%CyuX;Hf-Wp{?7^auKoh=@_YA1PVj2X(_i5= zC%X2Kx#o}7Q;zW!C%LC`j$dr`Y&f>W7o1!hjgYha&p&%E!uY)ZOz(O9Nxta}*QK84 z-Okdlp5QAp_K$jw2Qave^YVUYTb~h*F0|v zP0sT3m@b$2{quZI>96n!7kHnmr}-uHg&y91miMz9=VLC^|8qTj!$sCDZvMOo4eAAc zYPLP8zsPIR>{=>3_AmBWqj~aSS!?CIDK4NktPfXR;oUCB_^LVHbzvQN;+57d^z-po zxqot++uH3PImZ<)X87~FjHT{}45Q|Sj zeEL7#$Cw^|?rzV%o)Yi8$h~oFg0H;CyG1?6x7}-R+gEx1{lASf(mHePV#mrceic1( ziEp{j{d2B7e~bzCK!x}Dj~;s?$yZ^ldXA5|-+RFGnC4qiYd!OP5BkG%%3D5Q4dpmL z_@K`N#}@gRF3*KA)BO3vKHt@&CBD9T#C^BsDQ@rf{5m$rs~>ew!+dz+w9z7DV^e8MxnM%v%p z_}@MDhI)a&f7X4Mqv!0C=k0$v#kVc9Cckm*{OJqc^>T&xd&xD*NxpWu^ESH{e)nbT zZ~QXv`l@>*C-`#ojn~5myzYG^C;1vA_EqOId%Z{0GyJbNy+h;zuUKJCv`hMzsZ=d&oT;N;(&pL!U|MxwgW%^6}@hbb$ zm=(VI1Md^RZ_07gYR|$g=FANPuHCufJh;ZQEk~cY@95v#+VYUk?D-CB&IhgY`DOeR zUs17_A7?cydH>Sx+zHQL_jFaboVwOEq;D@nHF7mTzFlLEQ|IW4O&+vH|ttZP@ zqFYanZ$ho{^St4E&-EY8ZG&eKF*(nF`oVra(K!6OAB~xIU-;KQc~8no-Xf}t2K2;v z`bKrp2FIrP86@Nq@3nDVG)hi#9;q-sM?>nOW;yt9_gt+5SJ%`<4XxIS zKdY^a#;R9%#jra67OZ{C|EV|TN!En_vT0q^C1-hRtS)MEY?{YyUgxvg9QfcZ>Y|nA zpW+`d!+HG=wxSGr)PuL#(tPANFT`@Wz%QUxe~CXtQN6;oTh&FKa*SIrdz$h2Y|N6g zd?VT&o9BsJTPyu3J{I%T(|jp9K9`FGZDl zmXp7*Z+*@NUxe~D>U=e(spt5e9n42A^X{V@v$b*f(w*v}DWRWV+1VabFY)WUn5)m? zGQTytF6#I7VVU0;V-M>o^Bcc(e;r%q*LSUpdPAM(jzrBz3+|If9-6NAMEE`q0S4M_4^#p^Tgk{HeXky_#ku-x9BiFK=EMYhS`L04F}cha9^$-mmY1V6+I8{JiGD4|_ynZ&qk!D&syvm^%xh?ZT|#+hXMCJnp79np;tY|2OVafa*A(0+_CmU zoo zZ#Tud*jI7B4w=hQR-#B;W+!&*K&D& z2a)?&<~5k1Ug2@a+mmvVulk*1?S~w{bwXV<(>^Kl&cFAZ8$ZEg{@|Xv?+M=aM02yp z;yfhny{RY0Ut+mqqd(eXn5ACf%l_oP*kd{V)k&_+d=mTwTI3=(w_0<1EXm(uz`3H6 z?N6*d%(d|Tr`XTFKb+(hXg=IL`TSFT*67Ld&u7?6dg8nUBlHw`HIfIK5C4Q_IXcZg zL93n^-;JJ&tv?_6XZOhWlT*AJBW636=br98rYFa{&9t6+68s$2s+ag{j5^2oXBZ!G zImX+g**I~2AA`o!9VpNd8~!{=e1oaHN#lXHAKX3BZK4_Udu(`VT~ za+*&<)2YVcS(u@o<;yTiJ;xoG9me68&@7kuEhObK?|h+WL{9KNNXbdgAs@!!nv0xE zJ;oz2T0PFIF;>08trxp5a)u9{?RnIb;sMN&E4;-e=B6jkdt$75l8-?`PIDeDdV-(9 zXt~5IFhNh5kNk^q2DIKc^Q&>uVwGxQ|+KUk_>;3a4c$MS0Qt5^6-OjnPt_MSvTm_JWM zT0O-#V`i8$e~7Vih4;C}xk5i*fzfh~AH(c$E`9?Uxy)ap+j*mFT@y0;gEyP!ne`ry z^JpxV6Z|=*$%gyK zj$GnZ=+{%`CG#CSOAjx&$+2>t&tKsF%2}Rzv-8Sno{Qqy#^*aRL(cR4SgNPM&tcId z=i=2U$Q7>caE)?|cgA8l!Ba898m9Rybem^}FGZK0EH6OzBIn{IXqSt;0<+~Ze~meE zbc^vZXl@BU0G)D@kHS1XDLw_$ji2Fbu=anxug-U)RlUH^VVYdxPcWdT!qvChpXxCl zhkEl*@=@qA{}i8y8G6!uKAN02%eSI3)V1&uG^-bR1rlyvsHETu$-7 z&^pmNaLqqluN>nE=<_o(DZU%Ma)GNCy57*khb{7ZMW4kfUWDcgjKj6}xE49a6A<~g zO;UU}2E#a9eXnZ?J$xD3Znxj~BedtunaBOxeZS3`a}HzW;C^ff*Tn<(Ij{Av@WB1f z8!~TI@O7Yj6zAQsNKWtpNa{)Q_y@yhr_AHKypu!bQ?SySXZTXgle2t18uaA&w1@Q{ zqK79fv2JpT$2?*l6P%0dx{a$I<8fGO4oN-=ZE}iFM7y3e@B65IB`0~C$Nav@I>-52 z%u|mZ_xmaI$z`ry>gyTf#CUtmlHnTyWTRd!!)_VKOwEhKQmyna( zhN|#$U;F_!7^lL=yz4VpPnv7q_fGqZYvDQQQ_peL2lkj8;|VA`HpLHyx?JQPK2+C} z;Hl{FGeT)T3)AHcFTgB0&-Y`pT;LVxk;}XeMY+OT^?R1RH{!fIN^*jyBCjXSXCW+D-O z!3!`@)WhX~9Q=!lefgvw-tKGn&d-L$d7JNjP3YfVj`NTot@%^_9Gvgjcv#dd7kIlN z!=j~foF7JyT;w@Jheh>rj<4TpSk&TNIo_yYSk&!YF>XMY9Or|vSWfY=Sb38@%-3SM zoa4JO=;y%-+>KuKB0qyZxx{Z`y`D0^kBVI3)3zNJH9hUV^J-Mgr^4$o!Fi*R!+h^* zSd5-IfDsu@KU7Z zA`jnXSkxiMIE~SAa1ojCZsGdT<|D^=|1stvCwU%b{NQ@|UF795Cw>Vzcs3@>S$+v~ z=Gfp96Rux9&Fj!5SNOI)Tzkf679Y5$edXs{Qv5l3 zzjI&q8W#N>t*7{W;S-u%PZ)1D^Uw2>h~y%_hkCipKcY5Vn3>tWHU*bvUeZI~u!`LO-0vz+4E zX6r1+criNV0?+-;uxOE-<4OCQPw3~fkqGDI2c{KZ*5nk>A6h zT;{zFF}`yp`9?IzdHxckYwrwyfc~&1eDEauTs_5k^r;7biC#H6%x4M)S>np>8aVTyW*KRLqlWj|DS%8}mn;kn@R(5NTN!;iAgj*anBjL=i$ zc*>p$&lm56oSfi`kM^$7ljVijpkClzj`1#Yt^{9YdgA;NrpYBf@ps0Q z(|i}|^%r;p8pE+Cm?Or@DV~Yxa)#%iC7hS{neKB+PV%ehG|v*RLaY8VU;BH##>;tL zh-SIKU1*YvJn0mB&#@`4Kh>U4kMVLWmP@>7hG+JA$MPRebL^MC9^mnR)~6@QpP@~? z!e3#!F{9ImMVn%V9OHekOiuEt=#evgGfHxvpT}~!#9Pf&zs5T7ac8*RYpo}@q9Yv3 z-y$nVXAX;YMwOlfH>2ILNj?H2)KmOBbf~BKs#P;eM^-)04`8ia`^Cbu0hC=A!g{YSce8D-^N6zxz=UNjv$!{Yim-&G<>n0a@?s?`T z=lB5(ggRe%zH#L&cVVXeP~<*Lm&-hePCd~Dt{qd8yS zB>8;AUv6CccDGzdSl##gq-ACu~dJa`!HWFbNnK6mV<9W+&FnIW6&Ie$6Rbb zg*D`ZkhA_N{u`RYnEV08$`xLZRJiZ6y-U$8C-^ulmD9nfb*>^eUgCPg9QZ=4l(RgD zvK;-z`e9H`^AaqRi`;mr{coH&Uy4#VmT$!fInNu=ZvOs<sH=4p)@#R-pA8VN7&yfl1-0o{>Op#-J!qxU!!Qy*1Gv=h>Jp zXZaaS3+Lqzk&-K1opTTL#Q0a}GfslnpgEkE_x_vxALhpMkdSlShooHQACQrw8{8w* zhdJ=QXp{?l+KrA6>%*5~mi{bXkAC$W--8*UpI<<$T;lfm)<@2958CaM5)WXedWE;W z$v#w%^WkWaQ#=iWdeXeh0_*8sC-?<4$|YWKv(G*`&s%p`LpjdxW5VY?Blv+^ydUHu zUv{fwom7z5!hy_Azr#{JQRlGeX|&WiFaPa!?{+!Qf4svw%NgF| zPU|Tr`5eT)_xnn|7m-}xcTm(*=D+71>(AK>+>Oa{kuUqZYhP!c+<_MLJim@!b1U<( zyR4}k<6k4CC&?TA!)HXTy}=Dg$#H%k8)~dM4`Q->wb=dg``kG1j?r?04?tQ^lBZ&_bxZU4m?CF+0b1ld zFF{H!@@kAV&kFy9LGz668y5Wx)AYo6XQZrKf+vQ$oZ?e3Sm~DIW8fbIA#=d)zhtWSw~p7OGeHg{9U< zF7elxVw~s+_XUk|jJL-G$HsXo*4zJS{ufGefmdU#T;YA5w1>kp!slR)YtQn%m>?JU z9n^c?%e>W7_Ct7f_*C@D8NM48xxn9`TaJpJBb3AS@}DtZ&hV{>g?9yijDmet;eDRA zo^q0}!hAW$Z(+Jz=FR`BZf6RIm3@2Ef@I< zRKj}p`27Or$O--(`t_ta`>ZwTF+RV5de3!o^d_{z2X0-z>lIL7kT*e_Kcnw z{~q1yX)a=>F@x)u*(Y+0$GqSjA}9DlBt83CehIVW5^wjSudn1dpN3I#h9AdtxyYNm z^!#(8_vDSIhd=|#)$?#lE zw$F2XH(KNZufTNYD)Txt%N70!X+6;^&V{CME*^)3oa9q5!g(`%DJssJ#H%nv zE^~Fsy_93TJzC^APetbfdzF_UD;K%xHPSct3ZM`(p})6^@x>&NbeoZ$1& zDQEfikoD*J_;o&;Pe`EK<1v(W-Sg`!;K`mbEqUG@N{(JTjdp-C?CfnR$kg!%AH%$GC# z724(Kn_$=FA z@C8^bXZd+7lS{nyckYKA=VQ=f|EKvHL~@QF!w5f*ROG(zo$Fa^&SN%Mlkjr|d@(l2 zS$-Mw1&oaZ&j$`#&kqv27voaF1!BImdVIb)XixQ&NLGvzd&kBqg=@`6wg>(9@j%G#EA z6$+lUGOt5E+!wAMVti{D}nFr7q#^k3r8Sc+HT?_we)8WwwIl&wK%>3mT zpMiQg!wb-6oIKx;nR0=jLQgm^e}#r!TyJc6v^6$3HqP%Lqh9897%f-$n9a;zPV?jF zmW#ae=EI|YIl&9iBj37p z(tLO{W`=&=qG7l{zg6csXjRYgx!Vl)Z^2qy?#Fbw!dq=?OxGLd-I0+Kd;sEll6)9C zZnUrXXtc{|J|9gJjmZm;kn{W;mfNc(UWJbEyzn}-=&5k^NcY0?7~`E$D<^m=3gLO- zvoJe6FMKKDda}F#scfa!}HQ;uVT8M81IbH;aofsqvRBykM8ii z@b$=s=Y{V?lb$@^i}K^%Mf?DIb(C9RLI4k%vl@1#sX#sCVqINCiA_ zUz8X2EWrKuOJ>KA9q?x`rvXn6L6|()^8qi1se-*4um-02YLpRhBh0O^HvwLeiL|i) zp&Ib&0}rpR&kHeH;Ew2@D{2|G# z1^sCjU^PrLWG}%^m|I~dc?(Kjd zz$}Bk6Y#=p)Yo{F5%8{`qb!6Ua7zx{VQ&JwX(H%#2xtYkW)jNwGtd)o|HtL$k-UN6XOdi}rfPaJW?~k$oJ`0ob6XX-{&?%6I z*sG8OxB@0406c&n!KA>Q9hb~zz@)-GA8;GYF>nt74m}?9fqMpE8O$)aR{}l@lLq&8 zz(aqDwm|p+SHNTwe!!1l4kY|jfgdJ|@B?mx8Bh2Dhn|48K==X6V9LSIm4MH}G=QJm z0T2BZ=m7T|z!fkdxCa40f|&w$b|Ub@RKPtSa2w1txQ76TP6KV>o&i_}Gn4QGJ_}Pt z_yG?+33W>N0aw5T2|wURFmnn2uYn(?hVTP!gIP=X0f+u3nY9sqz%rQA2tVMnFx7+~ z@X%beLBbEX0;ZMl1AYW^HQ_%Q_+eTIKj1c)WrQDa=ybFN!Vg#ma}MDLd={pO@B@Af zlZ`gZWsUyW00SGz}sO;ke?9Xh>0DnCXd=7gq;Ch&L$g3v6;YHvL*fRi+g=vF52k;b_ zBG~f*%V5f3uLQgrrWp1h;5L{F*h7F{z?8tw<|kv#8f_5ve87z`AHd#3Zhu6*EQCAY z5oaJR*mD3Mfysxx6>w28WaEpFZ-AXJC9o5`_)PTUuvY^fy8!gWnoADgT9^-DZvs4e zA@WS_fE_SRuOcpBehKR0HMAGNFJao?&dy3^0w!ew`e?x6Fn-uG0QZ6M!JY+pI1Gb5 z2k_%^$g~=iaZxh+8m1Zj2wRM}Fc}mV@KBfoDLmjznDMaZ1D3&L!Cnb?7fdGXA;4cR zL3@Ec7jVI!&_<3ye+Rhaf4~EIi2zwB4dKKui7s>_r6-+bi>|)djOc%ue~CbKhO#=u?z*hz-)0FJMQOon?F zVER?yALwZrfG5Hz|3pVeo>Yzz>{Hiz&#(Z3FaKQ6Z{;e zg!GOdbCr}AqVhdm^Rqi zDvZ-%rV$+g{|Yk&eR?b4$u~fzkv;~v0wxW*YY^~Rm<-t40f*iQy1RkbMN#YhVyj$wavh%HwJKQ(^POw@CfYME;G$-&Z{moNx?xG+i zD>*+@I4UUXXQR8WZBZXFHUq*MN;hx6w3D3s2}2!xq6q=U0JIc&?Q7%V**@6kPz zn3a$(N{q0>CL+W(jyIW?Sz?RD?xn!#RM&hk1J-=IB%Jp>o4ECYk1e&bw))srHsU;I z3s^t4$K&Zc-)N+w;_mF`6P2ffmvj3Oyr9c{PvY%b%fkO%)-fya_N-69{S~~_%s!IV z2L!CZGsw>dl_qBe@{>w*ttnjl6^V^Lw%qbv=3@_A7XDwg5^liL(>7v0Ym0x`>>|SF zlw)gDUiSPMJZrh{3BkVP){BDG+djNbTj{g5;+(Co{1qo5{(uBF0P!_9$4ztES(3MTD(-YboTMy&eqxD34ax7dk^DXs z`5brj?^qG><?q zVqyL==o)r2`#owK(~Y)4GH-%g=B0br#j12ZxQ^d~6Vq#wMOO-MNuGdQ%et0&%<^uk z%6zUG%ZD8V4Kc6qAn^G-BAt}P#DRQ-7%hH^@fK(2GWKVg4*iA8 z<)$O~nMUcWT+`j?tGV{m;dL1L)_#UA9aGl0^#P4fLsuT94r%HxtM=!kPCf(sqPV!# zvY+O2pjTOwHrs5i4K2@N+$r~zPrd>d80GT|(pR&f=a=wYw1029acmrp;jP-*4gq z{yzvpp7_bK6-4wQga6Jyx4!UUDSZUCRetMDxcJ2 zt{Qtg`9Fy7dm!RoZi|2T_=C21&WDX0)*8Xy@qxxS33A>hvcfg$lrEzFN%kwgkT`d7 z|50KtTTGNtvPIIO)~%^CB?lJq1^4htH)im9TU@oLeUCjK_P_eX7a8_zJ^}lk3F6HR z`>6!7Z}5x9GwhK6x{TPgZ5j4W zBkuF#qbcJl)J|Ad>-X6T?9lZ+YF`J;#;geFv_(OU{x_eFD>I0^cwT;V`sBNk@E3K z(%V0W9U%Ujor*Bt{=JX?gUgSWKgL*2^IWpXUpBHS8@ORX4f~e`84LYMim`?mQa(rR*P;0*7Te^IANOQ)1Ug$0_1}r<;M-pcvMb`TdHuo@tE-`9;R@4KH|i( zyYzUO*HYw_%0bY?AInZ-kOE^)Qqv$7H1W9fE?M?kMFTJBqPNsNJm&0`Y(4rUaVrk+ zaq&F1{&8_1ZKM_Ju(gvWjjt5~tAnoyf&Ir&La;l$I#J-9$azU0SRivxdhPG`2aZz( zE+DJqzr$nCmiP?!Fw%_J%a-^ASCd)yqeVX96CdFUYfA5CA^wdUlmr4lnjmnw(!Xey zCYUI2U(-X0cOoz}J>1jvd{P=E&(di;QyMv*QRNzxftY9i&A!jao^$3LH4jmHcm{2= zCkXtU);0KWr!DL7*WjZnw*)cr1M|-izYt&OEuPTkqn7Z{Xr9i``;P z!~aS-Q;Rx?AN~TH-Dyq3|BWg<^^I~}Y^$GzjMe)R z;2iFwJ;v?>$0Evs11{n$sCb&@BO=H5(P3!*EV@itV@}4}K>8~_hF+TCltKDSKAb0j zwcbj<+s8g2>z7vgt3GzOeG`ZigEoD~L-QuybUJbD3=EOdw+TGXfz&_X>D7YWMj3g{ zN`G3gbvCT6cKWk|E%&7|cBv3>T~BL-n<1$Mdz`G#iv$FSS0DYG4#~*Uh_&AVdn5g$ z?Q_{RTCVgajB9O2@y^gAfGgi_u-L)@pL1{xKApNS)`8-MCBBX@Bww~Fc>|a}I)#lc z!aFHE<~q{gOZm@0ZL5mkX0yk2`|5qXN{*?KM|Hg60qnKI+pLhG<|=|J!=Mrra1FP& zTI>o7%?9tB^f7$2K7IpVNo1?F#QTHU6IK!4BezAzVD_~wE*ipC`X*!H1QQKI*p0+L zSTXr{2zy&BLl=LAU;JwbyUj0N7{VU(F9RJvOcGBcPCzsdVRe{RXIlf}(;@8DzaA#D91@vp(GdC&!j|3<3#+hBI_U~%(ccKu*#Snm4K z-z4`YslJw=cJB=&y$bUfdTh~W*qbzZ3ZwIHhSPnU=|*;sd0AOrqb?)nnhwSOwSm%gZPpABv`J(Th@VWgZ4);2}>)T^~S(b(LbiGF)mff|VBr1PqJjzQ? zM)OmQdE7965guK~W*Vm5U00e<+c+E$=ytk#x-hQTJD2Vdycq!jOC`0``g50+TD2E-)=m8{Wkf;q$%0ecsF8h z80$5@y~IIkxfSik#p8s}-8Q^vYto+LnBQ)kx*jy_i3Ws^_=LvaCN$+I)uGa}WPK{T zoa>$Ln(N)g2Ofle;dkRM=Imyrr_tJXLDbs!fISfIq&@%4R%kte%2g0CM)4mkrn3|G zK_1=Z?C)=54_pLq>NaG;c(kH+G#&bdfluxkC@_0_ruPP>p7SVL*YlQmn^c5DQBJD2 z0#zqe2gDEN+BMae4ns6B=M~7$G&-D-7c*ZGVa<4^UGtHKre9BXlV&DA_13*7{Jrt_ z%D0wv?)Xr!omnGAN4G4~;oa`${G!{hr#L#USw|E{yOZ4ur!JSKWjr~k!|J@mgBo9d z^mT68M)@G#*7-YBw{S>2JE5wA6f{(>3KP(a8KZak%zm$abW0 znD_~YSubvx<))AO+l;HrsG;d+)~8wS@3UWWmqpV@Lo@$w-lsBZ8LQ=n`Av1v$NuQ| z<1XXa=!)4X8b5mWM+2!p%H6Y)>w&9WYl+n#xy#qz-)>%Ue``K4p{9|Bnsx+rztj^R zvo1`#nGW#9UEkluQ_rD2Aa7XWLmS(Wd)u#>d`x!Y6)i6aQr=_qckX#N_jk8m?#ws3 z{rmdu-gD{R8|<-8=g$y1?Dysxts_UmCkxaZKL9+? z$zq4i&Jy)D+s?&xHvfdL<$t&NYFl6y7!yejdxG+?xa8^&{+ssi7s&M^HKUHc!RYf< zd+;A5j$yx|b&Wpy?Ju%p?Njl`^UD-Rvg2Z;r~Sfh#mG~Hz7osbXd`_sPdqxrD^EN> zT^_HzXup0btFsOeC2J2A4{}z;$8P0V2}md1K&}^j=i#V~-&fkbO*dQ*#6u((jd^rW zKPr-g=d>@(kszAIDNOUVKs*QD$V`x7bR)l~k( z0P%1tmpf*w2Ob2^u7LucHxHtK4-Faz`#%PahyC7EAZtq%@20YysbTW{F!Hd+fVw@f z<~`ars256X743E>?VVQi9z6R#UhiWycF_eswpyNQQ+!y8`4$=z)Y7gS(AAKAT895b z9L0VaL#D>_+gBXUCdY^u&ri!Pue@l#aGNpm8%u`AYNJ_VJISw6TR6Knp8Wc@!%p9*Dh~HIM`D%p!nFNi zeKGB)jNOxdFszr1`iBMQv0~*|7988nzADWaYj>39fBZg$rTMp!`@?#58jehSnRYO&kEXwZG;bdx9vp)wtNNT~eezWapN(d> z4HfIh@EeDT6=V1oO7lge3HNGBbKA)MVO>UPevo!Btaqiqgf!QV5!=SF`+gW{#*k-3 z+dGo5F#1JuC}G1`2CBY3maiNx9vREm4acbE0bz|AeVdCYn{HtN&fwBBbO7kwH3HQq=&CO~1 z!TLoS((Fh-0M>g)T?FUn$BMVcvVWOrhT9={IBa+KZ?V294(ZTKqjhL5`@ZP*z=sD; z8E&W6su*EO7t>wh**mJAaPS}0d-oW+zRbVJ7{I|F-L_(uOXhQQbbd^_D!Z3l%n*mN zi7{mDH}#9CSDK$kKHOt99Y)I9=yCC&eZ?lu{xtM@&KgM6I{I2K!iDjwv83vgB(KFt zYapF{H^<<;4rlZwy6@`^?c~~zIbTHer1I-Us~Gv&Z5s7EJ~yrPoWgev6~9X!(DPZ8 zw`bHIlz5Qheh+&P<-Cr*qeAMxW4-j>A?vw#%m?-NJPY7Wb!OEyM<>rn^O*71`*5|y zI~?GzG2)NF+o#YCaoCW~h~_&tHiUJ;z^v17w?n0xDLL@XxG5{FyC}hv&f6oMAH_{%@Cf(s8#A?!y|) z(_)=(AN&~?I7|47bv*tb(|hrByZeE_C^@O})m!&i;llEzkL8qm4VRiDvM@i4AB(+; zh3S8_AfnOP-^$aWXY3^F*F3%50-+&Sp$^3@Z0DE_KEzN;VIWdm8sB z!`;VyKFxli#>}=(r>fbU6i+ncsdr1BDR_a_}Zkf5gYuQf3~p(zpBACA4pGi=DpN$Np)9y!ZM9tPl7E z{2ucqATZ_i+s2=SJyE63%^iyNDdSO>KeK<&N~z8Fea^Ci#oPJ`)vo=urq;Xg|SO`5y0b_J(r@3d*i|NJ450TUFlx=*Umc`G?eVLAgq6 zll7zz=M||8bT__}^USqROBxanw<21K1)JwJxT7tZ8;PyHT zyJB%KL66}p5PqW>p6D5Qj_ZHtK16r@?Cy6TWt^6cZrK_2-K+J4N^A^w`pAgBUFAvf za+E$Cl~y0a_j&%`&|PEAgM1Trxn}7x&XMI`brk>UDdHL*yNC;1qx2yck6@Lvrdf|^( zo_K!o$`j8|m&YqF+E3@V&-`MR^?O_Ky-EWZJvHq zrk>UerlYfg;@mhM7pGl2^7FmfE9v6l@w|PMxMe*5VibI@82!8-?(3+F-#%VEJ)Z3t zk6w>b{0{KTet4KyKb&$MU&d=K3|(%{X{u6>lZQ2gSip@?j}-tRL45 ze&A~cC-EuwCGCxMs{x(jtI_PSVdB-%{MO;({n7lP;d^3GH)0W-FG#xw4f~~Z8}=th zEoSWP(c*?N?AkG??sdi_di?bXq;)%`)iR(mVb^H(1m?3x^V^4u4@UDAN~?0@A~;`^ zc9)YD?5&j6yQ9TTW7u_+*7`oDb^CywC=uH@Ox!z~Up-trI-1v0TCa^*1n0L$Qn~I- zw_)E*X+1bvd^wtZMvI~seXnW7nx6*^Un3e;4g6GW9K+5VE-oFz-ybe&#_%txT(^&0 z1m}BYeO)!mhW$$_*NQRXQLN4o4WExHS5IlZ0~%gGhP^dRd@-6oFw_$&K)HyhlG)CMxhTTeOJz%7TKw%vxY;n@uhY{!uks^#LECj0H`H-RN15cz8AhC?(&63vJ+-@rZhyjS z?h)7fu{ETzVSzJ;F2_#F9&sNgoogB)al;`#;eKfJGxs)|cK4YT_qT3G8q$7c^DY`~r+NO` z$Tf_pvtI7AUtV!s^o?~ly*%?^+_kOhA$f%*Hd^c{XMKY9@AeQTLUtHD+Z!Il{)R&A zd)OYe?}2!_K*>0%pLpmGZaUL?!PdyTU*z0osj~*dX$(Fo^30t)XKLP41nHITI=7+d zGH52`%B@^H%Wgr@ zmo8Jt-j!R+!&p3tTORJV@QSBQI|fghVg7&O$p^T=1wiLHw257ZgV%Dg-eT1jZVkmU zT>tRo7A~IT?5!So5=-FMSy-78_gUD~+lRDcmuC?1G6*6psf0;}m+3$Q40GtzMPUqi$(VLd0FpLg3DawHNt zS(LFk;u=o(bICNk!w&ule5Z(cxNGY?&d!lRoqJ>_x$cqO#YY_u?^8&$V86qK@-oi1 zID4J%C-FPuknk=G)y_wpEAFK`cf?m5OMC)%O1-M`6C?Z*aT}c-692@7EnK`zV$8|E zONJ}_WBx)ceG}$$E%q>O>bKZ4TvS=k<@u)0E9+%a_dRMVzPQ6dk2T!L^Yy*;$6ftY zeCPbi((ZHWUV4;UFLi&%(6h!~2sv%DdM-XeZ;NZ{E!=~20$x}7hi)IPeq7~!)X$N% z-xD)~l3?uH`EeIpxT6T08o_hk^dEZx7hghlbAfBxp5)?Pi@n4r;R+ob$D?Sm;*B~6 z-lx&aC$+LWxs4x>TBuWLdGx0$kKm8(7V*cu7WgCg5{orE3CZ_tc`*|7e#BzyxOe~(gP#DR;nHJ@ z!S7Aqp%V~xn!q*Ie>e$mnY`3fUPk;y+-c!11iJio13v+m z9pfbmSr0MtatM4+6t8mj`(NL|S)0T!*HTU1R5Imz<-Z>yPxPVA+_cl*5pzN`W*sU{ zh$+ht5Pu2#xyG~NKyihBYr%~Ze%FTmT>XPMKwKEp@6fn@vD3>I*N1Vs^O-Hybo+IW zPi0%B@*gD5>@K6H|Dv$JyDW#rN%t_ZF`TYD-l5{Uu%CO(i#*{Siw$9acif+03!chQ z)EJuL9*&K?VSi&jj{GKyX6?ZzXA2%5lG*`Ovd=8m&QEN{ z{z#pcx9r?qy?}TGiUFty#Q=S9STTsF7hJ&wmbx+0cmj*${DkEeJ)9JqullSPfZk6_ zwfAw1P57^_g39UOkI@%@i+aIG@HjTALMOZjw|DYiK}WeGZeG3(z2IBnzu0=g$e8sT zCr(U0^5$1>o`@0FOPAAnfE&8|@Cd!Y-KUy;zpH=p#n%~r)C+#-dV!wXjRC#ZC&%IZ z>0xxfoYq$+MVwLaf2)3j5)L0^%NxW(b}P?SF{ zTa5eh22B=tC$8A8;kZzl<~U6~)3itFuDfveOT;`?)E?`=*)&)4m_+OBX^-549pN8A zH%%8e)O0hU4r98JUAt>q8F>x+xx?tN6#s`u&*Y_C;LV&@ojK3wJ?#dpVWqx#f0 z`sQ>vm)`2bWV?RdxVLn`dKE@ejk`^U2tLxhqWMXGYe;n+-EIQ^BQB+5w32bcyr|=7 zNH|^VKazJm@GTLz7k;h6XSBaKya4w3TD5D>dE=P8;5mo5>Ttf#5#nRZ{sXx9LTdqR zSJ{F4@a(KDp0wGm_9$#oq?0${Cj(i=1z+vzFI>+pBV6=e#b8D&sm|QZQTzbfEVzdI zHduBQ4KA=o2y2TK_<}YRi%V==bw7?d&j#q6RrP@DLvG8*BIWB}_GMN8>z*4en$K;r zP|D|tu{5q@2$!*^#L3s;d^}w;HVN}E_N62e9^(OA@BTg)7zF)`1Ig7U67a#t=K~M* z4{DuQmv4W1=%dWW%LG_(AUxt~3)lI>`UMYQZsJNR^v#jT8a#0w!ZY^9NvBoZzJuG( z^T7EQ`&cf5eopzhDG~*nOE_rEXuQ>_^K<~cDfdrqe`eb^Q}Xv&KZA9pFYvgJ-RcuN z=z&*kl6;rWY-u_T13oved(Sx`pP9(#tNgU*EPJOF2-KJAk`(c;IzT^!pdB+5n$?K162{^-v6aQRf)J`}Vu0UUUfbJ!i!*fgr~gooPkbmL4O@Qlwyq?0H==k+Q-JI(_h z+Ml7$D~HRqAMl)ZKr;txz=rxm59*?(XF68z$Zes<8 zPJ{-ag>^~^`UxSrJ`&M1!sDXxK6?U3CAV>;6rvZ8+wcG`cth*K^2&#VV?`tmzs`$! zR&>=Nd{5f!^fUV;`;P(-pD)}Wx9{@+rqv!Mq%WG(#opFRRi0XBUxh=LgZLi%B5Z-Z zl-oD+z$0{NjChITYPXThS=iO}vy9@?J1#{+o<|JRbuX0VEE}h5(U;L7)WE+vdz%Za zYP?TKE{iM*JBIL3{g`KCsh)`@3+y1buOmG7@c^a}v91Uy@CM;o=EC#wxz78l@_kI> zK4h6MaQMNr&REU=02YmY_mk2i+MQuv#qDL3-WDDJhhlLI-SM+j1znNkW6M-};l2rY z<^CLFO*O)g{3-2NGWdG#dyU%6=y;G5ge_=fc}z6bu?zvV6OXME%P8Q*i~^ly2W^)tT1`WfF_|KpT5hCWE+vgI7j z99>TLSV!xX8j_!(OUA$z_zRZtu(D04Fh=cu!yuM!2_gRp$E^VrA;#K7A9c%#JnIPY zu%lZpwSEEHTb6j(X77=D@wGJ?4x8-29k`>DjyOHz(gB+P1R3l#zrE_4;mwzLW5|;} z>YT%Rz||L>v*m2+bGr92hx@KR>YSB?CrT%P{+00)+y}w!ySd%Q0~c6ye<3yi{)hUJ zpee*r|Hs6_LAoa1d3u!F9XxQ2#V)e&EH1iF;JC$wqpJe>@R&!?<=Tf91}^5}Cc&=Y zM>BRMu%2#z;R`Gi>`HpmXFWZ1t$TLH8i3E_dv84!6aK+k$!n0_qA~QcIwknm9W0e z15hx}w?wVQs;DYAnMKPYTps+i=lBaDdT@EhgWP_T2e2l!)DqZUb`fEa!}RXD`(QC} zMCg~G?Ve}jiaT!K#_eZ$0GilNE`a1SqU{Z42EdPv6yJlkebFt8G>+ZWEi);8Kj@b2 zi-4yebjupxadfxHw>G+UON@rD;-w&;hi(b_r!9aE&+Y5E-OK}+<$93|aQF_Qzuc+W zU4868$}{a36oIb<+abi| z3GD9z4YY>djh89N2jP*&mU3!~(77k5z0h!@@|mW;^wiTREuu?5>AflajPIVZ{>@); zKjRzI&-flM?cegA)6e)0>}PyC&g$RtUe?d}j#2o`w)dUbwT}BO!HBhRNC5Y@ETc}F z`kP74JcK)3pT7+qL&@jxx<*g9%=2vDmtEdLvo!jyP*s+Jq*mmJpx);0ys;cBJmxhH zphc781m>9w#GN*JA@R1w+qw9{;!q-B|HKl@X!;q!s7~l7bw4%lW{zjVe5vb=!je(n zUTehh?stjj7w>+Tcz*hR7q7f%zi>H>F+i{CTbCEm3xB-w#Pf?+o_Kz`JYIRxe*IEb z+8Z;y=lf>lc=vkRWh?eBP`e>$@KsE=3ApPmTDJM)-Ax|PFW%kc z@%%JjdF4g>h0D{6_7#hM-}Zgvy-hb<7O#5K^{1h`9!s6N^`h00;&?U_ig{oC4i%GF zZj5+gKd-YQbUtaOXyp7{Y@DV|mly|N7bSL#AlJypZp4Y8jahcX?omFc&oIJBJVe9g zuD0L~qrWx1dxAQ=3wq=UZ!i4-?v|$VOh-F+_9D997}@Q64s<=a^&fJNk=DRr;E#f# z*#A}S%xiwra3gz(&mB(Y(L?U_roO^^vGl$b;sc^FWU0if>{?HZQO4b-d%xpz70l`Xu{fORV$TSJ=Dktx0w;(L$_ki5BcFiPlp|c6*}rbdvp5;wZSROcJ$8Y!goH zk;rgnFT!Q^%A-Cxp6d_4*W}EbT+R7~oN|e!(4_&61-7Nhl*6wA_S2RKCfjc!SIPDl zmZ(d%F-N{K*?!IzI|KGVY|$C8xB0}C0sBFp=m^-a`_@~n0sECiyif3t#38U=>c>1z zv){TS*>3e)_axgLeycvou1vC!)Xhm0`jUVM1=wTQuhd-a9S^$8@|~DDxldPN|dm@yB8=p1o<^YrUDmwuo1)%_;1nq`mPG zN;(ksuad;qDg5(*=t$w0Vs8?=JGl&=ucg5Hd5WkSz*Y=E_f6tQ{=W0{_872okD?^` zmQMIq!SD+cj44?-WcI!MK_6R#4GE9>SO@JyL8eLmkWNG6bv3su@3oo~JzkZ264jg6 zbY6<%L@Ku|W@Yhw&o!@A`|#1niDx*+X`$CS50QfMG8Z4IO<0;>G4F^l^S0EPOW>oE zSJIn7VaaHeGv-?wUU*{NOW_^X`|S=Lmd+s8cArs}wAA@^`}J^#p{x(mnFu$*(aE>P zdLv1O*{Z@4G}bA@Z87${Bgf%h4n4~drlRxCM_=C^*+2Sjv3`AbBwX9!Uckv`beoQQ z-|sFyVd}3L+r^(vSvHcrJrL};Ewu>N_XfWR3D7=l66`yN+gP3&F$LDH5eHBkaoTfq z9#p#;bRzKNzhb>?vyW+o?E4Ns;rJRq)+Pe>y z`<-xAfU&2NpGvrMIME5a1&7+OUOo)greR0H`uuRJtZ=*U3$22vlN$r}_F?RGqSaH$ zcL>4fUalC%Cs2s;bv~%^IF?VpdFCQn~7{?wS2bX`2L$RIS;#ypG?%am~uxwA9+0JAF?aM$5IGR>;R*rkWoMK~#gx~po-US}Q9ZoALXn|6scc-6O?y-W zI8=+Pcv>uMMyA8s;ksx%74-DjC$S%mrmo@k2i(SCTx=1=ehr4x*MaR8TW<-R8s2P? zvqm(R@X%iUg6{iM!g-=K?J4#na?dFK-{k>pm$}dqTP=2}B{tz65ZcG2QL!}Ol67Fr z3&?NcX;&SD-3@+^Kc4+L|EatcoR7OI(Qdb{umC#5dJeE9G4N_4doodck;tA+6rUur z&O{?)m8T$IKD0mGYW}EiMynt8Wt%G1+ zYX|WExE;9G$KImyd~J)%ee8T61<~b6Q|ZJl2k{g(T!1>a^_5=DGn5>NS0CR1f1bua z#LtElC9na{;2t_PV-c=z;z8_w1~u;PD}B1Ach|Q(W4O};|DM3V9-EWEJ=ktcPfQ&I zd!rq||8sWWW*_^2=zpP4tn{%%RSd ztnp;XEz+IT7|p4l-t}W86n8iKvBNy#_O>7E%2oX9LAS-Y9tQjDy8Hh=^kcYYtevy3 z{#W*6Z~X>!L4AY!YykSi{isj8Med1vh}-XR`y$yN%CkA)P7xdC!u(IT`l&CQ23)d_ z(z=)Kr+V6-6=QDK;m@D*gGqk0@cnL2usf}d76EZQ{+~+-EKOt|C5W37SyzI%K9Q|7 zyD)aouT|ToKFsW=D1XzjHWBMiE$kIO$u9V~MC26u?S`X3&^9a|Sz%LSQb+KT*rN{SR~8Ow{iH(hW%+Pfd9{}zytDx z6W*7y#a;C78U@jH^}$JszPj(D@ku|YQPr0;Zs5K*E$jmnm)h8TiHT?XB`bjc^X$Om zHoJ~w?lxO&w^_4IL3BCBt2AQLXe=VGlDKi*UEgrGOjGhA7Hz%(?qZEQHIb#FuSai(;QwMffCuYV6J74M#iKS0*%U<6B}L(G576bl4cbp5{KT7XeNlfKdyB(i4A~&}RjTvcvb?+aK)So(cVZ>2-DLo^GoC3m z&e83{adLz?P@Kr}X?&^s0J@Xbb^oo*TY6w+x;+>#$EiK3A?M|FJ}7Y?+#NANy<``n zx7cIdFD&sOFW(qyIjNzCJPMabmy7n(PKex3%e~@xg(Lc5@;+sf*3g)qBln+b{f>d9 zojDdg7T5Krp)Rxj)=;~DQ>f|S#-rV7-|cj#J%srOVgE0dDK2jj-KkI0bTa3^O}qBj z;WgCmJwex*-$Y1(!CSn;&KhMG4>ubrgUO0?hZLf5!EUD3^v z!MG!EFL5N6f#fe-2RbcHV-2;thLq0&l}}?XB5DoK4A&dGiOUS{mV;jO(s?!O(X>8Wj)tTM7I>_`X@55~%SnFJCUiP(Kd-#Hbm)k^ zq8gtUbmO9QbvRo0D$p~=%ALZSbkVY0$1(G&>qqm8hB4&1dA3Q;PwO^7`7rJemi!g* z-F=^q^Ci{>ZY+vb8VdP<+-^i(FVevsmsyd2B!#_i6J8Bf=V zf@*J!`!4Cg#FKF>v)&n>$}rQR&8b(tm41_S@Pvizd?yITD8@OKezJRx6L;}JwD%gf zQQ$;{UFft8 z-gJlS^S8k#s!c@JEp$=s?#A7#eeQ(6z`29&+Xx?b{vCWp*P|RKa3T3Uv|Ykd`k`OA&FH$)ZtB}> zzi7Pu{PFza?dOl@r}tKS zN=`(*9jy9Z_a5Y^aN&9&9-{WLmGo5w4Ze!$23h4*&+*PK#Pf@Hb|Idh<}0tfXuoh- zd(pmP(eKA|4c;;)e0CwaZ}W%!XnxZD#@mnQ8p8dT7w`6FpZxB|3%3Vq?=()O{zLVd zTK|w?l)uvX-7;mj_t)$6z0!=4){o~JLY9{KyG{2PwB3DtZl2L&eYtng<1N}4`k=EP zF?!Ej%)P!k9T!X=0WrDRM!CsLt1oq|x3m94xtalRZP@-r{ zWKSoG7ZU9^X)W#&zqs0OgSqv64N>#iD!)=Mu8p4iaq@Zt=U2%y57_9_9N<`ts}E34 zUkcbyTH=9#{i!A14A__3;*h{ z6RpZ5yCczhEy?~*B9`#h_=mu`#cy2_u-p9>68Xq);rg;9@kJ85024**nSj8q(wzbE zS-@VEOouCUv2>aKFO)%-B@Blou^~K@MRE}IBgxNw*e~tk%P{`$%Dtb?O#Jc}xby}K zzT4=`M7=oA*O9{RNXo#+dr4zpUl|a$4dBa@#mxiwTFgJNN0P7S@V$Nj>`ep2{R7ye z=AnuB`#MkN{hnU$&P)uReLu%8rF*UadBtX*%iY~dCoV@q{rBk z@3irQ_+IbvAc%XTPdq00QXy^={A#+==^-JW7p$EwcA{=l{-h4B^RiUsMV-xvb0*_i z&M~BJ=lrj<#qSmQM$0am0Mm&3@l1yI`=8W5xbxl9nGBkn?EN{5xMyM{-Il9y4Z&~g zoQ0GR9_J%s^@DNUqxU2`@+X#ipU+1eO6McavuXz2m(JD<25VFgT>xun*wmK{cI*F#GxewkcQ=BxLkmh4Z^B==;AOUHD<8T;d{gS)c1%xnm2Vl z9N&g~pO^e;;)W6I6UujR_`a~V5=}lHo&oF4BWMyjJkJnClQ_7Wf&0C{P5zbD50Ny%I{B<0Ayf0@Qz9IhfWR_m!XU6W2TxT}{)B7M&k4MI?;a74z=PK{^ zcFs7&KNpdUGY)s~JNbn+yOFv|>Pvbw?sWun4cxSATspjl+Px>}Ubl@k-iWil6>+}K zD{t<#GWWMTk7|q*v0mv8)7S4G*X$uLjB^%5KUxoUy~h#WH$!|>fG`?T+;6gOuTNBl zPj?x(bs8FyJS$K-8@WwFSmKH4O1Cuq%slG&yH=g$(1d4xV*L30tPu!QE@|-}Kv^PnWDv{c=hsWdD)k zSI*k8J562Y-a?(GF$Wy62U+`T7>j@0?ytlo2jEgn2~skLCr+ zqb|1@U+3LSBc#Go+arH>csDPZe5TW*FiQ=73%eWpBiwzAyPq@hy4&m|C40Q^lFVEh z`G!$Mn>E{%nTDH|L=#iq#2P149%!!v;Z^TC#5{{^mcw0sH(kBT;k7@;#Obcb(a9Ik z8T`rmlzaHJJnEIouHRwu+M7h{k)_@HUBdjslJQ^z&il?xVyqmx>fA)e4ujHEtN4X@ zhG@CH`#txF{dcrCLDicxZ?GpHH3$v&EFMML-_X* zzBVenOC~wIFY#Ad{3^?fZ%z92WcOG%OGy_$XW6KM-+}78=YJf_5)0WMfx|m~Tz`3w z8Ql-3bubScQDJ1=6-2Kic&)1ZP>_lO^KIqG82GyNGQEe|-jNp41 zZIAL!w4pKM4+MJ2r*x6Yj_{VB{&X>c<$R}p-(FsN+P^K|0dSpL3in}$iyF>XN9tZm zAL=3A^_;KqjA!m=j^HJay{!?tA^EGeAoJIo@Wvi06~}*!_%%CC*R9%r+U@sycE)$= z_wD6H$~3Agy`1^xTcRd`Jz;S3bxT)a~=T=O_LIKAmp=ASpSVo0oj&Lr*G9g3)IJFMk;m9Z(v;p; z%)$x>d%-@U(PuyE3v~I|dp=Pm*oTB`MI^4Pfh(L>cY8DX->AEWRt@IxgVXM-a=ir0;7%UxEjA3l0Svl?lgb1-INRlE}C!QPcuDh7M24#u3XD~ zO3&nkXX(SZsl25qH>J5$;U%c%fX3>WVJgDU;CC6X7H%djDQ&8srN&&pE{`E!WEef? zuVhrj+EA=DD~(^z=N&tY9ovw~4zC%+4y+o;_O2MfMi-^vPBV{vO7Z67sQ%sa_7QZ9 zUVoKi!L6=y*%XIpv{lxM!{1u}_nM!h@Yoz=-k}qwtL8^))1|I-Oqv_AM8+k04@eXP zrYG4EXWQNLg%oeQswb!2Oj0AlaE(XIgPP&ZGRBJQ#k-OxJ@z>2vYO>0+EAT&jQ4n) zyX#`cL2uhFDS%toZ>%)Tv5(H5Ip)!F(LE2W!^Yw_YPS=Nc~Y;rRLYyz+^ucN_phVc zoEHwNZ})u&7Vd$;%2c@Qln#|?DdaA#SGnhKy?BqtluM2Cu7tzQTW+~Ya>A4ygx5U> zr|G6;q!(Yyw2bpz^sVD*7^^-gkLDT!#dRC^9J@@jQ4y)p$+1P3r=jG;wL(AYAUc(maP*`-t>)J2mrYj1Qc9J%@JR`RV3w zGhVDVP4`r&H^`Gx5(Mtsuw@Iuts<#|F^z@%w!Y2TXE3Ql@pvJi z{p}^!O!;KmsSH|I(fM%mh#NoE?j-Oi!_qM_8F)+>n4CQr%K*#=42{P3SjNtQ|D`ZBFby#G!#oM|8Vqqcv=!!K(7V`)#k0?t zQL=DR`N4CGi`nGT!rA48(+lSm&R<+usy=5FE|`mtUlx{Yk14auXFK2IbKK&>1?7`x z7Z(@Io^u8{I}v_8`^>^JcFKbJFFJkxf@uq9&o#eKSx`(aKmH;qP|-?tSR_w+6Cia(kvbZp+(ndvPGkg}eT>!7cmc?r-f*aH?`YRlyL#(hk`p5 z4D4{y8Kq#Bf>RVcRlyPkFH!I&1-B}=UBTBB+^Jx~s}BBg3LdQBu?o&qut>qh3SOpQ zy@J~nd``i)6zo!P)N4*UnF?krI8DKM3YIHarQp>Hu2t|p1)ovy9R)vB@M{GFuRH0b zDY&nKISNi!aIS*o3SOb$S_SV?Q1inx>bpb1uN6#bSM{Xecm;4unLQE-}q zGZj2d!FdXnC|IFjrGl3zc#VQ<72K>~vx3_dd|bg76l_=UeFb+a_=SSLH=J^%DmY5P z@d_TSV77u&6wFodGzI4=Sfb!L3SOw-as_WvutCAC3f`w+i-ON7_?m(p3hq?!O9c}k z2kAFZ!88T;Qc&~Xfv)c#<(xyeALX1whacsfLx&&boI{8ID{^j1!t}z^Cl@a)D?G9A zY&K1PN%bC|$5l*ZCzH#R!s5bm3NVrVclYIeq=6q;P?X ze;$3Gyr{7BY#E$Tva85#MqzokOMp!|bjl%z{AR%+6P&@tl)}aH=M=JGY~tLxrxwmB zUszf=_qd8Vg(cjOB@a4?eB}GUEZlk$V;K`-)%jeITT|5IBK(g#8K4no!F_EeHW)Uclq0T{3ZV1TA$kj>r zgaz{!mYz9VW{NE)_i3}s%8x58U08|-jp+NNg>x4b7gEt_fQ2$$(e3Ks_$^i@$&IoH zB9~GY*~8ieUlZren@_{ClV+ElfzhCiurtmsD=$2A=6ql*Biv+TgUH9p`s9V6MnySR zn!DX{OXn{H9nWTaNVoZO&X~M#(E@}y$36k*=g%&l|EEGX0k5@BD4Q~A@{DPq$E35% z3y-V70~F*|Sg`2y(+f*;kzJ4$OX&!)I4U}O-KJsWwD|?4vrErLN&jPm15TY^xa2qU zDBmo_chaKb^7({%=EC33pIbP&Xm%+Z?<2;IAsl!ue z_#}hp7M99tSum$i77-j;9OZL-Y2jIm3Kz^do1N#IK6`!{il(@lu?F9CG_=`eg_1dO z6i|Q9C{)aeb8B!rbK&B`n2mznhY)3j<+2$t_8@&NIL>s!B%>og-zwg6$Y3YK6xGjUtnunHAT)5!$ z@}l`i9LCtQjte~Bhpnu9b~(9@<+DgCKpd7S6`AZm?l)2l3yqW-Tt8Q-ao1K98{u`dXmB za_m`4<}F0kvrFvR1q)HCRW?Mjtoa7pDRHAcZw~cfcv;P!H;;NEJgH#MJH4>HWMLV* z({|$DW6x7a?}Keo`5bn?gk@~IJx>bWzYzqM$Lx711I2B%=PiNog4=U8(1F`tBDiD@ zd&iz%R#q|_ebfiAEtyk(b_qg#ZX;u}iwoy0T(B6sh3qp`PKEEx!ZYU-K{_W$8wkM? zrL6?5%uhCI)GUc?NSm?2K23q4KABlIf*?{J<3na80rv4BsFNVum+XrR7R_V(`O4;> zzF;R!zfkUs^jt%*q<6EpNfK~XG%qg2g z`8kJdD&0SmU8Y-2Hkm?`uXy2t(}|z%@y$|o@uE+2);qpgvgWvu+zVb6u+5eHGF;43 zTv5p;FPw>9?4-gomCV4XkLJbVn2A$PotS&Vp%dhUCxQ<{*tv(!J>(GOkcsdAU(Jcf zP5gb*w3w;UEsn z2sQ;n!IofauszrrWUEtGXROX#U9!4zb@l4t>ZaAfwM}bTC>bMd#yZ!rhMXR=2KhTiw38V>PSw*QVB{)n?RY)@Ida*XGntt<9~? ztIe-1s%_nj$Sj3r;lF5e#pdAVrp=+vZJRqbcWqAHlCdRg%hWA-TZ*<+ZmHf9+|s#s|#%c#q&%dX3*%dN|+ zE2=B0tE{W4tEmgtHPtoOwbZrNwbymjb=9%@)cUmg%=)bQocgKtdG-1ACG{2cRrS^N z!TN^!=K7GVDXJ%`C90#Wb=m8tuFGAQzpiLq#k$IM)$3~3HLPn|7h2b{u5DfWy3Tc7 z>--I=4H*rY4VCMw*9X@(tq-klUEjXGb3NOTx*=mj)`px7xf}8~lx(QnP`x3zp=m?= zhRzLaW9r6?jaeIWHs)>&ZEW4xzOi#-Mq^fEPGfFkeq%{vWn*Ub0tkEo4pZT&jt7Tn=WKDL;dd!fu zm@DhBQr2LTtiN_yd#SSSa%9bw$a*6#4y|pKb;e|kWy$)=m$g+b>nbE`s#DfehODJr zSx1$!hMHvkw9DE_m35ONYo|yYb2||n--l7Y<=qbjP+UTbJpjs&tG4% zzOt7!7uwJoReSjxOEy++tlk*h*c7fw)|lGZyV?wGYT4AfsclpHrjAXmTiUmDZ0X$6 zMQu9=dsk3jEa(rW2GfEW!OUP*FgutNoEppx<^}VEMZuC_MX)kh6|4@{1cSi_NRehG zN7{lptEZxF^H94*kRy@u!7Ud^CgjUjTOr$RHCk>+w%Rt?ZnHMzfp;5F_O1;X;MWS2 zwFUf|25v0^pN1Mc8dEoAgDRMlG3GNOVgGRB#fp3%S~Z3EnR-6^iJ8Gk~`&gN*#jiYzuZka{5=NL2^>r z^HjNOAQK%~<;cP`$SEo>NvTRHqZ(vc+aRCV8o!iIIZ`$it*L}$s)1Yzt!a@`iAkB1 zxi$w9DG&0fa&48AMj!+^I18-NXuUcONsnoo_Wqli@QkRrVX;Ly}OWBks zrBj8JPc>3PHE$qJZ8uVCA=(9rLs5Z2#PHI*8 zDXdEJRCkMt$5SLLJ7kaSSA8-`Olnv8;I0zYu7cpOX4&7Gy=_*wHzfI4AvuluLXx1= zsyf5HA<5Bf^oP0O{*a_;jqDMd!hIr1)h_gkso`FcWNRM!#gcHpND{VL%2?eqlAKLL z-bHhC($=@3EkxfP)$)p~Wu`UyRByp_M zN0Kb=J=eB@W7&G**G$M_;@2X`;wmYP8)Q$~BKy(~aIGI4n<;zKsj@#Ul09mb>{A=i ztA;kTNa@@mdsn~gUo&M7I~6i3e`Ar9(^XPZH%M9CBKzHr2)>=#n1|lCLiWEkvIp+w zTmPms^uV!sHWZfRosfb4&8d=ivo_~!o(lfW-&`d57c#9ng;jtL^C3f=+N*+I6O?)l z)n5yGNvgpPsojuNacVJB)#FsD<>agWo}`RZn+;Oi2}ym2YP17&N-`%EQYS-dJ=u^v z`OtVOrOrb&+Mw#R4ZW&g>7`Vo*{V*9)|E)Tr%Gx*L8<$+tZS9JPlwcg9I2E6xs=tA zEoD=#lujiL6;eV~Lq-K5rJAGU6xDnx>OKRtpDpV@7aWie9w>p-a`>PI8dU>iR|wLp z74oZneTR}^erQ)D#WFW!Ly8ekR-8e6(FIwS21!PIL0pjs zzNmm4Bd(}{Bx^9`JttyL9%5-u1$remIujJ0l8KMZLJ29tpWXGi@_yb;FC1PCE1Ek94^sPE(j?X z+T0=~UAyW_{YGD!t$NcU^raQ5H?4u}Yml<9MM=L7NB#v#xVY{}{hDFtgh#~z(>WRT`D_UP6#g0&5Dj1ZFgMu(D%emPFa zkRt_>jd{>Ai{x0LQjQk1bZn91g?2e&=z?_gEBTl$`)Ef#nr*B>Nl14KON(e(G=8Xv z*{Zst+Efl&Rc?Ke97}k$toEppAGNTlkeGRLTu}mvS&g1Px^?-X$EL}#MHc#eYFGK_ z_nnqiBU@EdxLtL~zTa$9S&*pFEviB40@3X$P0816S8M8SNloFl)CSFf+7d}w-JY_c z8&I1nQn~@PsRqc|X4R%Tq?~oyRHo7qs7)0qd0XYtraGW6=r)z9Wbah8t0IhmVz;X< zC4JMNIb=b1Ao-gYmcLa}d+2Ugol-kZle%e+)J&b0N_ z@rDRZyj|)LUC>UQ_LH@`y9MRTHdGa3^xh>$?@s&4RwMT!sZCVMv9;N9NT+Z{*zUG7 zRcRJQ7->7Lr(sQ#)GON7I4#HBYIKXKiQ6Zo$uYO1Sxk-Uk%D#98?{K?!qF@;WDi6w zB~P^!r}t@*WA08lGm?f;U1qrNae5x7U62mkx~@a^I8K|$mVJ%W9-Ka=S@tmPQVaIW zo+VT2!8sA_pbFYWjqFvL!u?8z(WhiW$Ixw{NcAQ)vL}h;{|?ok_@i1tp3*idWY1EA zenq!~HuNjH9i*XO=}SB4@@NUvzffDKQvFNwrjYDkI+X65irz)H0jC92Nd376b3F~1 z?Q!=levh6d4+_$K95z_sNZW)|bN46Ch%dS~ zp_!;qgtq2)wTU7*4^=I7ZKpl7ORY@zA(?U>idsaz>_4gujf~nwhik^r-EUM#ZM#}( zWzBLc`HjBAX)Dx!6sg{$3bR8st{#N6@lK2%cdrlehxM`O_EQzs#+sy--iH38 zyZxj}eXOVc!)!Z#=w)Wx$%9^2Wb`8qa=h8Cn^8aF)qZlJp;7yxzNAL#XSxNoVMeAa z+>d0aUL-f%kLX@Rx1u&rD}ltx zgiMYHX|J#LR>f*t+S^vz%EK2VKr=y*hf+j=ioNu9r%Am5av^ABexJ4WIcH`9sQupG z_rGt@Is3iWUVH7e*IN5ka_0)gsVIsI|HtEsvL0XhE8^d;|8YAMWx$}f1}JazegCrc zj@#eA?EBgS^K<9Ud-VQ!cR!qa@7<3)@@O#kp8Im=g&xU$;E~)3Q_6E6esuPI*Yxk- zFV8G`&((VZD{gWn7?nkp24^7%6D8p6$Gfla^`Ug`E7r5W?16hVs;hU){60mw-O)!m82jBUEAEhz zcG)?O0bXSs8oEb@t}le!3->I1$wlroMM)fGggAgZ8hPxvgD$aYv#?qJ9xLERK0;vYWrGzi&FtD0@++6lPN!SBRW!5)OZ>E@^&ib4t^gm{)0DPA!n zC`2!E#cIeuX@wb~PjVS!Ux?Pas0b=2o;8Uw<>sY%U%egvSMuP}il#Wcu|5>P0y$gy zd><~QrOz$&iS^0G$BX}CeRA-d$*v*z&1Kh6{N}N1Bz}jnYczgGu!~YN%zY@0bWx0S zQK`~JWl0y6AYIc;*QH65qo@#q?XUvYN;J-Z|3 z)Jr-G-WNwMbSQ+)fPO@uoEbjpop+_4KDPEG@!EOk>i(W^^WgkV z;ijH&_n?J?^i8FHu^L&zTimf?*=@y{D!Qa4U8&q0&suel!^;Se?Vp=yf1u(t^4Cx5 zH^vvZtd^d<1TD>|8WNrB(lesN@c&$QY$Eg2_>E$etTm|xGb@wGpzWM#ijqVRs6U{G z+dSjfXJ+H_2`I0!!M)lsW0O}I-h|HZTAd;BS+37;2P*WFk^R9t^pGcVJXlt< zk*ZOQW%LPUR4HP@MVPBMPDELX8o33Sty1)zV!%8CORZ}|K+VS6C|2JY%&Ai1>vG`< zlnc*HN)ftYX65jv=`%LDQDzQeVn~U07|XKZ@!P3)V4V3;?k{fO=DsH*BpC5^l+l=y z6DaqKtY1-07p=LT-0N8*d87-)$W=NCDcl_E*r#Au01oGW?78MLCWy`@hokY!#nb&$w(2pGSUel`&16Oi%84|E4$Xl9WGW;UnUc)%_RXkpbeAAFG z{4V*F&_*NDgC@1`uM%#_Ay(b|AB?`)GS08pN z3T+(TG_&CSN^$5stDPzQfyRFY#@Z3_vqxlKy+-s=ovG;6?$9MQH!H#H3UCF8%*+&k z2y@nH&uHOb%wpmf{TSqjYBm%DZ%XjmnhiWygM+FZ@wG&{`i}ToqSW|WqFga`I%g_-)CcxwQqO75%a;x+a%mBAN92tOvib$WZ(OnMzBV zBC^0-K%bXuLqJdB{!fXNT+H(%6{npmdp8GV32_t1Rg`jY&He^ zb$7fpM~{%lcy^c_l&jUCLL)*UvB(ho5&(X!mP31bNCM$tkil$-1o{l3QVK4w(8myA z#6Qv_)V%PP+?tV~@M$1Ie|aGO5oVBBZoY2d4og!0WkF}56X;y z-+zo46O_g1EE@oFrvhLQMgaqcP9OVsNRQEyf z+{RMJD8C~#Al#f5Zc3~BAauB(slCs|P2pAtkUdxqIe&SaJ172;tcLv5P1L09 z>$Q3~iTarSX0%m|uxXO%(FGJI=#dCff@hB4kX!tj8FTPT6Ko8PfIYBRJ51L2TUA!+ zQJ9So7x{@DWI{pXMh#gS7A)8`yqw%xUlFw z+~hS3D!H&Vcwu-^rdMyBmxj?e*IO#X#e0A*{4RmvH5dkUJbysjqym_INaLySSnyKA zpt_318~+1lFY9H9L(l!u(SEV1HK2RrYX}`Y3=xqwe82uIRe^>n;V-=NuG1N)ae8y@ z7px+juiw%W-ZVJBS*i#N(xnbiRw|F#)CEgxK_zwq1V#<*(-k9jJCRQ zGM>l3J9&ikK>qdwDrokr#=KZwq0NF|BJKr`g*akNo>n35hqzV&m#Bn%Y%+2=C0o>n zISm9Ct*61O@4&PgeTm?Z6RTKOK%u5C`_{FV9L(G{Ntc~<9Z&k%CetzMZC%#Sgb6M) zv!$M8VDOsh;_7o`7boizjkTn2B-&5>X2|#i%V@0irNlSZQhAB=jkP3jwD2zl17DCA za`hweP)!SThRHC(ymVyO1?=KGNqCnsQ~39XcFZ^5;#&}N=9nr6_gHrXT*Jy zk<3I_>D8XvxcfrLO*ysk&uZ|^tc_=oAK{1KS0f{ltY*Wr0A0~P4Ivo?zfEb@Q%2SI zsm!TP*ava!0;DFjiOAU!$*#9VvcYE&$u^bBOz$I;DS~@J%x;>G-$Yn=195UCbPdZ< z70Ke9-$a$Dd`M9+VKvlKCy^54Mg39|EU4M=ZK{px6~+ddjZC4m!X$o6;5B9L&;=I# zVm^5PWr;K&FwV(k90~2?j>W+yf|isl#e7RZp}FL`Kgqm(i3B3u;C;jJtJ|6)?F8ooc}vmw=u4Cvx_V)`QBSHLwdFaCX;N`MA4VXDaVkqmY7`srWp2*-4yE(pwfU$59UqjHw*AV=EaVLZ_iD5`K(DY=^v1U$|G^E6H zjTzKi-a&U+M4bUyg@_CT>Ob$6*gOdg0MbmLlZLUqbHWJoPmPP#z zc`d5H4pb|toM|_ibfHp!J@~~D$eE3j@{CRH;cW&8G>+ z!vak1z4_wPJS(t`=xLfOEOjkMk?L9!XO!JahH?5Q1_LPYW7vr-Gf>?>sqZ$D>Zuq{ z(??odg6Ed@8ky}*=uv^H@$oD_lyowugrKF-w?Dqpj&UZFNo7LPj$N3lnTo;_%O9gGNJer-nU)Z>7F-X4{vrASI0uV6ra?v?n~~cSRY=`T%%3 z%}8j_B~a0V*(6v(iP03ml%n2qFeG4NO@8ezvScL88RffJe!v)u96^Poz0C&lHPSr{ zgR+p(WEO&W?Sq3O9nfz4GD)P1xPj^Jl$s@16wg`&El_)ksw1P0AyWd#L?X_H;un(+ zI;ImVAri{)meCL;pu62I{Z=|JG*d`jX!0a&C6`H6S+O}B3mr+;Px&v?RwJ2M!i{uc zLNQgMpQK5V#HAz~oTRxa8fof=@&<&!pryp>=Tpz(PhulhztHm6Pk}2||Ags})i1SO zVcSIpDEf;op9vS%1<*zQm@*ncvHEfZ6|t+r&M@81a4%f3`upve2jL=5to~6mES_~3 zID@c7#x58f&DOo+uv%x?)8bifLh&VJG}Aj_y1g2DVh{2Hm6yZmqOKYbP^@uW6-TIo z(6(Qo#+r8trHWejV|b86jYYNqM?*j(;xi~*dUrS;52@N=LiP`L@O08X*Wg6{3b6%A z&>5yO5|we^hO**owj;t10VnG&6X4K!c4>=cY0d4Ps=fg7 z`$!Rpe^?R!FusO5F8(3r9?VB(OG>LPGLJf8lipcc4zBv=zq7D(n`M~36tflC(RM;6 z5BR~cV3Qwc0iKOnLE`FSL~}AL&BKqFjmrjFc|{;QnLDz)Z}s1i1^01>1uOL#nGkp? z$}2>PgyVKgM7V_EaMPThU5*OdB9L=8pPLjr0Tzvo+qSo z{Sq=!28`cRWtad%mvW74dZd{OT%iNw2cIr{+C6d|3`_#LZ$RQ?BUqOO=ZE@>#NK2C zk{Gw;_{IJoG74`n*XJq%+DgKx|NM%cCZ$e}WWq=^aBtlcX!D5}h<6BB}!Q24J8H-<(^2HtqGbCpWy&5&{6wlr) z?dKSe9x>!F?B`t1_U%( z1TUh#%na29fy7?5PSB@zn5L2_v;>>qLGCrz#jiHT4i3K;FKkweH~Ga}l&ZJF&JHQD zKgAq66rI#V+O+^3G)XN-4{@^>a6Ofo`o8k0&w~oZ^JK{N5oJ-8;coA|tBgqw zJ^d^@1TN%GSPry->&%Q^s<&7mN?eH7Fc7G{>-~e%yjJJS_8Y!TKg~om38A^-W55%i z>xvJ<)))+p@K#vvb09WNYR2XdNTzdQ>5zzvvFb61n%z>FRNVGtH`NFHhC9489iN1W zjY=+Piuq_dj~8r(-HsgP>d*9J(~TLOQD=0%D|(wdTJ8x~cRCi2Tu-C9VC$I@06BU| zceA(%8hJ)zbDpEQt#8d|j)sYjhAC;Xg9sMX5Aycvd)3#c(n?RZ;d&NjqUX%XkS#SK zr{OBAsm@V?=c6YwVR2$i%tS)ky^yWco+<(;^MQIuqr zGjtviQOMma()3oj?;#r!yG+=^#!`<(BqrckV-K2EB6P)cBp0T zgO6_};7;k=n%mO!&SO8zCbk$Ef12)8>z&6PAKGNKawtCvvyR^^6E z=4&N#15nYD>=bB_8qiDzG&NK{;2Er+P}c$=buB}Lj|q|q&R>zm+04}23o1kqRBtm> z|0{glnr0)U-~SdLjbGm%&4>pE#@YRG3Hk%|Pf9a;1OT`i+~FoC^~K+M_l0W`@>8q- zbXs3fmwYoloUML~Ah`NTSdjcbtseq0*vKU`L@%p(JWUDqjrzPZ+Aha@$&QbqKd>Vg zj#O&0`C0Sl8Ij{^-OHd5OphRHk1;mac%H^o{z-LEkz%c9sop1>NCx^5QIneeWD)qS zQ6oL$YEjPRYJBFXf3KN^0`OfuSAG}Oz@x3e z&#aaBnYJ1~{wDlP+C|+{L;Nmz2?+QHRsQeC0}-S>AWV|{KO7GXkIfuI8rX-0NUnatlt&-xb?8nrBB|V8WEs5MMDY*-pz(%e7l&PEOY%l1l z!dMc2aQ9cn=%rC#ruzEH=v1NajaGXLj+4&$??|CmG-37bsQO)k*RD$zc1JT{I;sxz zbsWThIeFq}Ite)0$fHli_BHpx869R$<5ovab)I4upl_mf9#y@*4!f+nAAy{mCjp?Z zE58}rIxTuflUsCd5@29xOoW+PeLW@|hYtD<5gb*3Y`XR7rps98R5!3W_(Dkglish|mSS#H$VO?*Z#@j%=$JhgTE zu>;MQnID^^zV6FzPt!MHkRvKw-K7|=Cqsj4zNZAQu33_%l*9fL^3v|vV1^iqok{KI zi@&+?Q4=vD4*|Nbd!o~qgYoGo>A^&gDhsPK=RHMx!ytaMt(xI=mly1ZV0zOGz}q0< zMXwORzV3o1;*L>Y&m5lLvCz_wz}(DWS|D~4h!B55ml2fL5|pJ?j%fx0YB*Z+$0vJuAMqG zeAH3l{GcF?#w7T|<^(g_oWjh|(Q-V09VhB}*~)k85ETg4DZ>>z%3ANU<4 z6zr5D{ND;6AdTrUlUtvG^H>b9>!7cT7|#(h=K8Y1bMzAL!5IgVTIwu;SlDehP*y$= zTz3%hSiJ>|k{I|IDzVwy;e)=zREv&U4$e3X_EvHjRn=4v0ibto4dxMx4W6s}a`R*A z>zngij74#<_V&Dq>g!+TpPE8$5G2w-az>g-7}1o_*_fL$BsqSKZMmPATx4}~g8zoq0nxoOnovB zBte`C(n0P-;Jomp`Xosn5aMX853v{&(}x%1UB}Sq;Sv9DAby}Q(EM3i!EwxAC7l(~ zP?yD@s);|6B$HGV z6){jvs*l4eGPS3@4-_e=QNHf+dZ-IL$_a(4q!V?bW*YkqCV8K>p2qNd^xXwp!ImkvMJJc99d9Q{@C;O-t{^owLcAZY|!ULcTsNCL@z8lY>D zK|*PqkWLaw!$j;Ma20;6KKTUj)AsK~U64)oC(9;0AEH11HTXt-J$#+wlQx2{>tBJ7 zWEH6L)sVPMStZ8+#EN4^vb>Ua7I_6*cpIQimE<+Mb40bk>Uuvqeff+YeI-K3%YOk_j1X+tV=YMIP-|%D@MJ|1J^CoY>?%Kb` zmAF!{JBs5u5bXaGHDhS$AGheRpP5`B$smC7gjp%vk*N;3 zM1dSnyLWKHMqz*rSA?K@aA!}!2kPrFIb%b@0^pW>%kYL6-cF2-P!Bj%@Wyz)Bcy&%R|j}8nsyO4@l8n!)S((W<*&ccu8k3nt-a6lMvqnHT;p8QVT zb%9al(p#IGy#=kcSV#oYTBEm`NF%AV%j^{pGC(2RbvSoOBTg4L+oMJX0u@ryOU2*p zS77^AF!|~Ihh358)jbWb%!N_2u-1iO^=ayD;;qD0e+@TymofTX?)4#8%tFEkcl87e z51XwDjuYBm??#uI{muCO2-K)f*z4TnY>k$93!CQ$^d0%{LD0!BafdhMI$NFaczOKb zB$IJVk?Ng>Q$+q;)jMfexT$E4I#Ss}KL>EEXr(&v4rs+Al|A&cT^(531l;W^+%ymS zCcB+SoYg(l@KB_Zxo##7x&cV>(%;x>A09)#xEi^N_}q{_UeF9DP_ODkjS)j-y0*TE zhX@rTDHV-wj*az@BR19xYZ^Y8%4&Q-Y2+bH$vp_5N9?~;CfMiY0;eArI}%>vR)SNt zMW|bBLoxbfH=Er-JujtAVET#qX2nIh}KA**juvNTJheYG7U(Coy1YkR$;I-8{EPM|{DrJ)&}ucK)h z)Uu{vUsxiyiEChi;T_AgiC1n(204{Rd9SkEK#S2_h26@BkU&o_4a9hlFQGSi(=xBJ zbJ#wlqfUrL4%n{4wyO&+%p-`U&A;4nys4PVi~H%U#GUH8CcoAVaOF~zxny;{z=Hej zy+Y$zv~xnH!~PIz;y-^!J(ZVqGC}(cO~h=Ui7jo^O20PZ0f#r5A^wV_ytd^oc%QeB zi7|FkDXY`3ln;`T%a;B_1hKx*70})w0(p+Bb;o>%x$QpD2hqk%4|eootqluVnY8~F zy&Lm&DX-9{TUiO?=kZ`pd8y$$^T-SF(Nj{Lx;5N z`;p``B#{WveTU@wUZI&LrTw)XqtU7a3Upr%CZTK+kD`$+Kq)X1IgYa-qp8#fWyQ2I zY*zeVfKtj^k^M+Dms0)wv{X%YD(yFvVmv|TOc3i%Q43X?<6^wE9(Yy67)n*0iA4=s z-3e%WDC-a|JbOKDMudGiJsi(cec15qiSm|j$kI`R_RSjx?MVkVC3&0l&P3jch#|-x z<2^alhp~txUUCufA_%U;zWoG|pFRYbv>%tGjni1Eq zMvP~Pz{?UtR2vF(@aY>6#^u^98X?=Te;im%DyBH87%D(tL!F8p4LGBdYYrN6yLHA_ z^c;0vy1!IgNu|Ar(wK&@Kr9DQ_dyFNCL-ofb--1Ee(d!)BeEDwU8_N?UyR41Zt|+! zmK<%uBRJ2KwFnF2G9@AUSfhZcs25c+b}z#?+N%IQWRuQWVBjxKlD0 zC+7`qk#RB|@P<6vO0?N8hQY7~6&c$OE>CIU#FPd`zKecnPy3@oXC%p#vNV{$E{J|F zX}hiGfb44*(Ew2t9TYkNOww?dJ12;L(taiVgj>_ig$o$J}I|NtjB~Y zPn_bsu)T6Gc@Wdj%9Q@Zge7^;Y_v`GtJSTu5R&NBScJNna4*jNggIrdw&)>H?JrlE zW5C>ZHo*iL8yAwh9!yqu$0C|pNP-4v!y)Y|@ftI+A^J1|D3@sWR~QUH0CdZT)y$OC zjo5yXpbVVZahD;LNn^pg?d~s3bUzl1mEa(|==d7hdTOCrKFa)-H1e|9%rykM{wy_c z9EhmQA7wWk&09mLlq4Ua1$>w(7&RvS(M~lwkJS%&rOvjOK)Anp$s@djD>zghWs2G7 zpk$|sh5O8|5uj4x`K8%4=H&6KkF5&i(H-O2Jpe3FQKq{wXc9OpASDO-j?TsF?!ptn zv53V;*@g5nS6S*v*(2j*i;^UU8|*5LXZIm<8Oq7Uq>IoX_X6;EhlS5<=nrvbX_$mb@xg+t%`{`p{EF!xU!`EYC=Z=pUJLhY|h;TpuIb#R2 zx*TD!#~M@JfwGv7WlkcbB%FK)_O!xN!QqhhO%OPFFEkuPAu_r$xm+uUTZ--0J}7;x zb#sLrpZZvL3Jd1`r;Brv_&pO&Vpy6jTe_E9c8Ru{`aRQXndI(&K(o=r&B^1j0=!sv zSJ-_n4a9*n3_vT0M%o!Ta7y(5E!LY1d08(OdkY3srEbuSRH_e*myrQmk3j?zZviRP zZd(8YKB2$lCiEBV<~jYwi|Bn&Gu@ak?tu~qon$(cd~n+D>y9$*c8I%yQu7E|+&>qh zz%&+PCXv%Uvw-ebyLz;3- zcPVZFk@^|tA}DXPwKylB9iUSBqLhHd(FqbZ|vo~JfKaZoDXr%q>Z0$JEtk6 z1+*6^VHgSZDK6B4zA%pyLlWC5`e6&1z7MLv;DFXdDKE5&wC_ZC<3k%7g~YWRqcdG% zI45(V1nnqoa}V7R&~k}&d<^O!O~GA`o}3=TvK1Y{GH-aX8hE!|Bpsqy%cp}#`t-+d z)HEvPLn_7G>PWk=E5$W-mLz&c{{z3#vAp39;qb#ahah8WPnj{b%N%Ezo?x8y&r#3w zb;V0(ptEXNK|u| zX?gP<-qJXf6yibW=?>~N{ftOVmL%CSa|@Q}=|;(}Qc%Z`6EGK` ze}bbZXnQHw5uiG@qmJRpb!?Z@wng<1?m|0xSnC-{aDyCq1NH58w2ee=Us=_7;A90_ zI0olUl!ccB#~}CUF*U$?C`)@`9>&YPFLJjJZ`uq_6ZC3b6gb%q)LO~^J=?$9l#(4;_phdIE{G`Phgj4zBsIanDzuT z9%nF5yl*uf=cAA~+?^g8A`A9whbhYt&XP2TY_YS9SqBo6i9=q$mPnPSSK3@KKJm#Omb-9>Z8aLgG;)yjH5JeBB1U-v;@H_b>Nf6fz=EE46> zd~MF5L}zNSa?Do}mP%{$z1G^>qw1O3{2QQ;_zA;{$h$}b_6h)?? zZ|6jPbw-4?Rq`D>INcZ=q?hc&!YuFWYi{GMbnnxqKPyWy5VRe``ydy<1N@b(01x0C ztR)d80hL}$(oe$A{W&B7oVgf+g^=YBgZc^9m4Mao9iF3J8zuq9zn~PM{dXZ0Fqyjr zE3qGMpw9Bmt%R6=BY`5I1R%l5j;U;aV8p`=-osP zJxoD3A19nh>cy>^dYDSi_g*~7Raz!a(X`PjV)%g6`VdTjjo|>et!lji6dzUZ0(3*0 zf2_Y3^@(W7zR1?47c9o2PG}(UBHv-8!6umVdwJq;vpff zz|8M#!HhZkypPKK;(U0KNO|ukg?eXMKr8?NQQv_FnkXbX_0Y`x&S>Z`HpCpjZ6to$ z?Hn4yp*~_14tD@osgkqkdImU0dd|pMWV=uiF@fMCoLd8z zqv1%R6~@7L?$c6vs0+Z9~#lq2q(rT|#3=9kL5;`4DVv=5&nh z657tQA{&KZ7u!}0aCRfCAs1m7VEvnTzzt;og4>aIH%1f{p$@E}d`Oc;Xj?FhSjKuz zUHKl|HN=&UVzbyP4!fhzYW_|mHqt%ul2^blcE1OnEYCr8@EPXp${CxH-tc)L>tQ)fs{!`u#MCbn zDNjE!l{$WrANHyT680+WV>r{2dojapS*z)gS37Uhs5eL z&6rrd%XYbKm&bN_;i7ZHv3fqnjEi%x^e+64iNzgRu5|H9>u)py!~ z*6j|`&^dysJZ}vvx7xcX%LEmSv#@bhi1P3MEpz*VN05?vwesKh3 zj&B*PSmBLKQN}v@EKmb9On-`9FVgG~-pCYcETfNp{XU!tUeJdmy1n6zOtHo?`q*LI zE50WoqxrFAHmxkPX=Ry3E8_ak2}wDk zq=b-`Eg~%_d#AYO0IAqXW@-`%Qy36tor>@V9#+9e!y9;18T<*(!Uaxrp%D1W@cqIG zt^ykL;UXzY4Im%Oq6G=u;;@$RZQf@FZ{R=k`=LrsLcOtr?++PaN zj;lnK*kBa3@Gqz4sD%mUCf_bPo9Vg9w@0n}FAQh4E8$|A9pWhVG0^uDY}L`3?-?%< z_k*0n@gJD+Zy{b9X=4x@vCSo2rUQm^(Qv*Zl_s5^ndvXuFR!rx1p)`&@JYv#!RX19 zv@YZ(s_7fvKn+lWSxFZ~WxtE^FqfN` zQpyEAryYon76MxtXx}4dWkvgGEr!p6Mnb16yn*OX34Tv|gFR5Rp9RSa${K_0(k+uIHGkCnL4&3oGV!GiC&rLwV>A z*TUN~)tPWq*){>Erir-QE{4#MG~&?S@CIgLxV%hqu?m}uWl-7S4U&uTbgPd^aIufV z8zdKFnwDG)VUmmSXTfzKiX<-f^|KP!rY|QHCpc7$@$zljcqXi#Ny;!q5%Z=%rLqmD zXRO`(Y=1V{PYC40>?gQ5p49|4f-ab+?OBSBzrO(}UruZX9j`Y7+5-JK?)ndcS3#@c zt_Lf^st+Y!gyfWvNhMa#g`!TBcR9#p5y*to=G7qW?J{jbvgpN;0?f}rr2n~$U?5}> z@!3l>LnSO6eFr$nw$ghSA^mzQJ*BYHYef`wP)5nMMIvj=@5CZc>dT0j<;0Ad z&*7>04WL?2_iIJqMNs14BRQGQ$!mw6!dPF0pLo`95YB!$(OTMXJp+3v1LfLhl;~H9 zMC6ZW9Y7+p$QO`x%%2geM!*|z&CHJo;@|{2-=QhrL2ji8{)^~Hrw`ZAm-@lDc{?Cb zkG$mzUH$^B%@rY=qe<24(`< zP--+^ag#V*XW>s<^aC{fq*xN+o}%l#gA>9VnXrs?^a-lrjZ9d^%k&8?RoC&oXIOI- zt3Cy<(^jAe@l_oazzdZ;yU}K6&LHOwbhkUYjO6b2ba_#Ixhx*{$>U-IzU1IeDh=Qd z2Qfq4KVK76@M~PK+y+O}rn=7QkKdr>K7qJaS!sBq6eEU*H_CB*l{S~6egb58SUONOKFfra@Jl2p13XU~u#g8O>7OztyPeZt{ zN98#fmGa)M(A5^*RpsIzXi&>lb}Cvos?b~uXw@ATb6@~RxfZJg+?C@&q-cNAM1#2m z)364$Kng_pd7McykI)s`P)h!eOpcjz9M+x5KFUU-GBX#{d&BrXrZgBU=~IgDY<#hD zyEhVq19yhwcLVr-1O0*#&%i`<1kCATH=Aimy~$Rp$hn_}xqC_}p)Rkw#_$(YL5 z5=_{wETe}@1GnEV7tFOqNbDD3$fM>8y4=c~#*k;XjYZj33G2Zsu%e36Ko|YAH;}W9 zc4ygD5dXD$00}xMK{u8^v}`a=ESZgD{t0OuXaM)7O`Da%_l88F$^YnltTqeWk<8d# z+{;*hq|TPt5Q|mFkIab+olZbR13;PDO5&-v$Y{bf`lV(AtDuN%rO2Tvk(%pqgiVuS zrnx$6JKBH+X9Zb?QuN6hyT?%;?8_uVn2A5qrcsjftrEIm$|iGFmApKamm0)0fJd^^ zun(C7Tw>>4L3w{-6^}(dlnNo%;$S&VQoaQYQ(pXP-Ujb*b4mpz(^RneUF64Eykmr*NDMBF<)edpZ>18F! zV&sIq`}$Vk2O7#=RB*u`9e%%77Xci9SV|ChC^*z!35|tSmBw1qy%SnXV=d{|3BO)T z@>jwS{(ueZJtirD0ioz5g?-Ets)V|a6nnyFFZkNth9H>~*4y8^{MD)DAFTd{@|l0- zI8ymn$c@`?F$$o6dBV*(*wu3VBl0@4fVPEjb3WrHX+?7Q?|Dc-%72qq-VNRcep89p zuTC!UmRe6l*xN<00;$+Jl3GXa-_ZP!zyhjobKjZ}7<;$(jnwx3bMZH~7Zx^( zpI=KY!5Xu#p&+8m-W~Q7SCC8NZ9(7l=xS!B1x^rRo0WV1G2;_2-kCH?M zaP5TN{B`2c3><{Ry@6Or{PyBd=!u#QQWTm*2beU6EehcbHLTJQuX>9@P}==;ehtT2 zP7{U@H^P*LDo7m4#PI=pQi7q?6o(Lpl>KN}XPrYzzbVy`zy=vAsqr&uJn@NAy_Tl^ zM1SkGBU1dpoyDJn-kJ@>MwDPiW&DZ*n60s!Es;}_5%5j++c1vp_hlKBm>)ZcO+sSf zn-;UkOo55i!6F*4E8C<^t6^iYO!FGj=-02rZ)wbxr(ElpsHF`-A9CzoJIt8~)35(2 zQk&RL1j_(NA^o)tf?8UU7;vuBa&yRg+z~yBn=Ao$dSP_C`*#0_>Z<)^_WYv*yXf*&goO-KK`_r7z)n1P!G49YcBnu&# z3k`rlQHr{Y2@m_M%=^^{R+AI0mo*0h+6t6twtV3qsO31Klpeeye5!x&LJJ3v1T$pw zFVu!EL0it%x{(V_+J}!!^mPsUbP-VTG(m;tL5Cd()tS`c821mLQuNJj>q-3aQ}b3M zIU)CfS|GRWB?@l^>ck6XI3qoUdzZ~vmkq;AAkN7HWzHgx4i}v$!#{vgo&_LBOFeTi%SNv#s~o|;(m?O{gJbyCRW9;U8prP)tGsk^ zJCU|yRW3Pc6ggHEk&_09qps<3IBD!S@NUd`+OQ`9#}vTPxSWbWGjYLse{C)WkCfn< z+y2J#Rdo6u#Y#Z0o@9DCY|m$ z#M+`Y*qXwke{kZ}*pH(GZwd=%@S^pHKu8<<6e%@+v2g)|&0BZf%KB*>qhuiF=czHP ziTL`guffN^!G*k{E;T_qa`B!_$zR%&`3sSS&0p{yOoF}e+=R$I0L~CdUvM0QnySH28e^UpKGRDu zHKT{!6}q76t|~{sEMxDb0EEjZF2-d+?^(I{m|dxMp^^p>iq1=zZ^^)Fp`raXcyWn! zA~kXV)#}%K;giQiY^2cf4Z5Ee0fYt2~U%oO!_ob#3la#qT zHS=`bY>k49(q8y^GF52_D$Yv1GW9_Zg)PoPoSQrtVDx$D5)NHp||9|M8OAW$dM zm94oZj9G59N4~ydPnp7r=E=CguK!+Mql`Wq9Il~k6?V$x=4E1xc zn1AX0NYRR I-lLTC9kbgmJECjrt{Q1ai)lIhJ13ma_jtL^B0e>CY^bb&LZ0B>TPJoamr0%}hkdSO6$P2Scna$)^zO%M5JX~)@Hw_TsC6_?(K|5~hg1AxE6c!jH^2k4BQAW0 z%@gN8aKSPmVi1B2evN`myI-Ml3Z*w^!W(lzzBzAxR%5>+)U5Bs)gt0~6qz`&vr{aC zA7?Ad=m;(E6kSIPS2zeZl8)?R?TxQF3Fe}5V;!w2F$n06fLQ!jFk`7DwWkGO=_XAH zn}+o3SHpq3hWy%54-f(^u**`Pr1E6j#$P}}%sMhzimC%kJC=}9Z4TNdb74=8TguK1 zi1-by!0i-&YNbtMafX|Z29B0Xir_2eP4PrixRHqX3#~tx#%HxIk1@rDWrHowYTZBt zp$7`(lduumU;PPd4|22g}kpwjYQy0>>OzE#T_EHlMooZ zhX&9&d)PgRw!AGEM~Af*j81G8xCFOTfsx}4o*cfzUlNJAGO-#v2kfK`zPP{>%t=h+ zv-hceaq~7nv=BVqq>{vxZ;el2miOBkFVVgVJm@*2OANzKMe6s_L?GwT1wwd(RS_re zrp=w*BxpO~M=XC)HTceH zAAu+wv6i*4nZ~SvU|`CF)rbDUUL$KjqM6jrU>^~>M>ZMGi)KP8@|{yDSBzq`&l%Fn zcsG5f6FzZGvCPz2i3q2RPEJJ+Imm>PAEJ*jLe0zWv-uRe!TVk?!@h%21jz?8cMYb@ z4OP};jO*%g5fg-+;G<&EEb0L40uSCx!*MGQ&)^lc)!EcETAa(lo)^Y-3cYw=19GT{ zKH^#Qq3Ik&P=l?~2}$073a>mQMt9_!mG%+mA(?gvKw0O=WD8|Vk(CPQ>GVarMwBg* z(_aRvfw_b(20Wjf)gHQw2#@8_E}H$DlX>?Ju?_xY-i?#el5Ot?#9*LfxXs@QZ{W!Q z+X2yfw!xE84iwTAyjq<24et0NGtL;IuF&AGN&KPs!S8W@!5qF|Jd~eEsmr$mpQHUC z!QrwJe;HLE_N_vW5%MnbtIv{S2T@u|u5(Fm+9BFE5oa&wb600$>Irnp`7~)i4tPDz zk{%%h{tOMot`+%Mjrcc|OG6YAO=64A;}9$K3~YUdR6^(VNAFf&cn^vDvo5z zMRHnUZyyG4V!=IWVV(NpjBD?SWpyN3OMHbH(P{Q(S!&XnJDDK(PRQ|=xp|Z{FDKUC zPd79JJh|>q&~hE-y1y?wNytbe)(+-})%i?Q&d9~2NIPu-WY#JvW5`tHN$oXP;PVu+ zLOvvHgVUt2ui{+lW`B&WHJ-(dTa9RUYa-_-o!I%M5lA&_?)R=J8rG zX1Rmsw(!yqACZ$zT+ZF=v>fw4+E&G@LS}imN7Q}Vy29c6i1T?*D*^R${yfx~lE2qN z&ueGTU)zy`Db7|(@g6&`@8IBCh4DBRcOWPPzHcq>WY&TW-^hg}E$@^+Z;>-=22x2t zSI7s$OfMFFP^P6in6HkTucgz;=-mOXWI#Z>ohtcYHno_J^5cdS8XuoOXH}9qKEm|= z&Ym%H4G8#<_)A^35wCG+XT%@c4_2FKKlD*th;qa*%q1>&sZpF$0qxmeP5=gPh7Q=b zwxpYgyFH`!K6;#Dsaz0ic7TbC79hPSQTNVJ7q#mx;SwF17=$CdvK`goPuR zNk8dyMQOWt10ckEB<&dm$N7zm-pf*A%e{1-rq}A>>j;G1BCBVQteYH(tL z2aKGN9sIg=r@Oyq-N`5G?Ee<@RMT;8{`HVIY;LlCnN}>Zn`RnGW`}1Hsk!JzZr&&p-YEASzDytNHL0US z8_h)4R_a5*1c(}2jc8Ym{xmI(7ybCeNqrODjLU)KrO7P%JZ-jFFgng#yOVe}C@^W( zk`&i_#~7E?jxFy)APr!(m)=@5x^m9t}MNS>TW6c;6$iL z&V4ZRV&a3a8{dn|bpZwG2&6@VM9(nu>AXeh^rmX-QH@zgC)Lpz&!Sxp*j|1awxmH? zmSsX5$O#DX0@$_$s0)d|uI;uKZq1>@Z|HpbH?2oJg@Vt%9`QqTO7J^j(HH9xuVD+P zxgK#XWN;9jwH`4SG3|radpH3vOAJU&Fd8xDdPLWZl&s0?5p*Lg4ZA{q5?hVDNCbl` z@Hf!1of;wfA&Qi%DOG8>Z{+V%<5*~py5eb=ERHp?n0PPQkjQ#e0TGg{ETC2q!x!R* zvYtdn4wT!H`C=2QZHG9#j>LX1#7K-w5;dI=AQPiHYa<<+XUie%O!8$sHZ<}0hJA_j zi^RChtiggGdUSh{5nqH9r`7FC+-RMZaI z>Bu^%+`ofX@vcDF9e(yDr2anQHo8B0hsZ;jR!MUEyEN0_ihO>r$0n3ia}DuNyl>>u z@fbo+;R;eN)X1+0Ox&y5AUlAJezF5dg&~1I(_n44w5%ck%zq4_90r&FAv2UTxb#-7 z-8^iNkrX2H%|&yPNYSlfKS?SDvStakEoD<4nfmvvV?)POSh8n})9|Jgn*!RC#KPqZ zj45nfJ};Rtmn?%w0RCi|OO}BV!M;MQRx$XzRMKw5B(0=w1CtwU0M_w~qc9l4R8oLG zJKa?BKPNc3n<(p7I17@OY>_*}mv5X!pFPBQF!kAM6KW*2#|Jw{w~-k^5~U1-3x=?+ir@|6 zkr$!Zl7=T0+o9hk*Lz|gWc&6zq=tJIU6{+iPCW8sq`X#YwnI`1w^eLP8OjhNp5xJQ zH9lzc`Do;~Q)(HX$@iBe^jTUR6Wg)rfyOjhCHbUDi*F}Q7~*%Y0KI2XWz`5#Q9_+v zoJ2Ucp@$*VmIKPUC_8?m?0k9266M+4XR-dFEGd!1ux2m;RV4_F=-lR`^p1x_ffR$b*^?3?+SuuEc#N)(6fax6=FSd(DvB;H@MclbOv07@be`K=kNe8fIdg;#j1;iQ{)ge#*=IGS! z!p?jL zhW8#5?>#Aa?@7ixuJhX|UNtb1AqnpyxTa(RG^!m>eL$Vc-#4BvA)nFVH#}(&mvJ?D zbvL@AYhD%lp-g-M5dstiQUTxU5l(;`50M_`Y$47iKB4#$^i5vk(abaT%3m;ybzf&{ zuXxDZf%VIZGVvpn6EG`ziOPhg=ZtX`3)zdTc}czFQA7{ey;%2@-9@1PQgjUONz_jo z0Y_tcF|9o7mkhnv;mtp)ZkR9ti}+ZMcR^gsS~0oBbtC#=!i{zyH>{Bqb{K=9TO*`w0{(nNy{z7PkGFkqlIlFaz3&2Cv3!7p<{d&!~TF8v4IOaV6h|j8OW-d zH;T2Cy;>eVuad0@?vdnvM!LUGZc=3t{t&t8ASm2*(>}v@3Hp0DLy7S2Wj&$En?k4Geh}>JGdoj6NrF#Xrx3fDuhG17--GyJZ z?i3V)@EB?VmEyH6bN%yNB?z4{32UcMN@%R}bJfNcaD_ z!#k-k48@g}7N5szjOh@%Naw+Z4b zln)&AAe~H9Bok?r=s!yt1K}}B9*PMK(t1>+B1~uU74!AZ|%++i9tBZHr^f?uHEEN#0CUL=FDc?^EP$N<#Z7J~mPKef``o*v%mK;x@&wJr*l7ZPCw zM~(c0AXf|!40QCpnC6I<)+3OPA!wICWx+`?41e%TXqC%hc%(O#wk~;CukI?Jvm&55 z2O-HvxCsJFa{Ge?Z&3yMwnoROw9rLhO6N9?b&MM42n`4~<5|o!aHGR8LG-z}Dcp)( zGRPF{Q(V}&cpV<5i0q#pJioBB`dmHsdq=o6w{ELC0aFa|AO>6W0!;B;GzroG9`D|o znr3|wqOl8Z1wMY^L^7GHiE_O$g%IJ(TFGDo2Ciac!1yP}-Mh{S`NXh_Ux$ zMv|BKB@%#tV!!S;yw4!!EM~FvQEbRf-U>x6OBBVfHvIv6ZlHkPe$+RkZCN5sTYfAh zJ;$F>fI}&qY!l96#}4JFKnn5!+44WPBp5?Y4y5j*rc?^Kkkkf7^pQ>^MsQFZm*!(-q|78L;O2YY1B*NM*o}Ze(xBu;4@zWD|sl2v-(a-fSOqAJn zTd(pSOvG{d?TNOs|A}3x@b>a^`8OuYXuCL=n*N*o55hJ<6`6m%^K|S`_&9xU|CQLSksROKU(qZ6`QG(m zlS@keUjBu>(#Lwow_)KT2so+BeIWw7(L<>ltr!#%qSsSS1!-N%D54j!U@kq(~2@ z5G8({G1)C1$)LslTnfNzZ^;*9us(-3Pf9vyPnJi#b}iXy@n*=mKeALuZXxg^CUNoZ zIk6&`pkhT_T&yUMN>#lMbzl+Rty(e`x1;SX%8iYM5{6V`GgW+A9KF{FQ67}Mf)Akh zxbwG#o1J(_4!02(;(@%0JMdH^b}y9RM07>?q-)-A+_3os-Z*=@@GlEpg{S6U9{#Kc zZ!;C{4xKbc7*vh^rM?3NIRAny$NmFy{>;MN!T!iL-8C*cz6U9fVNoM_4nY0DZ%s0O zNqaL_%Mx3&>Ey@9(14(_>YXM|!;3P#`XUHx0*dmmf~{};>BXE{JRmYqUF*7TY{8}n zcKw?}ao`2H|JHBI*5|thzo(buU8=*n>%GDj+;JRy&!yi0y{WKMt!pOe7r4Spa=gY8 z_dKV*#2tPD#eayR&(mj!!pdx<4DEq4-0qq;Q14f$VyR-23(uM%VE%uHzw8N)XzVvi z4P6=j@~hxgcpQ4v6i4Wy@Rz58Ie0I6)ReSP|L~XbpxSt=bJP@PFyrE_;jIqZD~p05 zYD7X%*J%SyNe3Rrs?aN3dPX!&zd)Zzch|*lafw6J?^w(o)>1_4`bpQSF!kVu3p|-s zE%c1SPCObu#T9kn!n){n`eax1Cc3&V;EGOmQ8+?TI*>W_uzs6IckM15@4{J{(YtX2 zc69MBSNj!(EulW}x98{+cDr;Xir>OmZ~&#I09>a>pYd+}wj6W@3E{Y}%X-^4@i^UC z-?FscuT-x+XF)M61t?*DpXSe;?fuwzF=&38b89IcJSw3kk9Xl|>RhT6oj>1&mqKp{ z7{zW7$05IX8*9FWcxL^-2s0yrndHsarsf9~HY9*o!-ti%pA12f7^=ezEQ5=8phfUF z`!($D7-67CHXhV2b=@~-PP!Vt9_l?TfFcYxew3L+=jj>Yz>_g#U*GN(QG}V zJ*Nh{jDnu%g@|y621c{n`$z9^!!yYpaz>}Q(Fpxm%_0xX%{z$Hie0+j1tMw=jnr>- z*F28Q*B8!phx*}yu$=+%EVUbHcD59G9ONi+!9_v10ZcrPCbU;mrqD%{pk-{YMEYD; z`;5Y2R%!QBlZ&Z@)Ut>u@aREWbS!>q7WKy+f1nLKYXE{H&|M$`zpH%!LeMBz)Z6Zi z`f;6NwA6*-xHWadiE1+-wK9Yb>V<5qTjJTUX-`AYoU$N=eGz^!-d84%cRVtA=JAdf zHHF>}yXi3~J~qcZhHrzf15{A61mHftg3zx2C3tmsDF*9D7_1kBm*jbk$zBZM$=>)v zZ&`dnZmIC07wN&nE#481_NzEafRY5foN*^Isz_Ld45fnBtdSDwQ58gba0y)Qv%pPN z2AAt#Ab{%_?bL%6ODViCbR7spf3E_IlT2ajL6W%s4w!JCnI64L%@Zi9k3Qesev9rT z%m;^nLbwaEK;OH7?*5>J_kdN7{U8eDNgl#c|G2#l#m$RRUjZf?Db= z{B!}XfDO0CF>TNRSB&W1^M^U<9wj38x$T?Sr9i;r8H;ULB#0HusjwJJn&@C6n2FE= z-RS$9!`b_v}j{2!UjMKCZ3+tl}2|F4uYM`kKtf^nfM%a zST7ma?ZNoz{>JgclciXGJ@ne!u zo`@l06MN`z%HBh<@>1AT(#?k$ViP6g6B(OTxFiF`aQ>Q`#dDW|L8TSoWPK;qh6m!H zlO~RxN1qsm_tlDkYVpp^gg4j?z0vU_bi6>=YgS8^6$k^sn_f&dkg<9oGk;h3uRXP2 zn0Dq#5Jm>)H;0?p&OB0Y#_fw9G}C<94;pj=+o&3=o-Xn36~IVde1S{+bsk#|aPtjY zJ0-TcKJkJ~bc5JnrLkfqJam6|ksfe=9XOXWIMpaX;*_Dmx&(percdvR%_{H^6BY`d z7zQaoABK5-u)ZW0eRVD@#-9}c_UsBVL_$T0ZYW&n3LP}#cjL@NRc?iF%XrX%_#Lu< zRd1W#_8MGN1;z)+7Fb2uSu9YsVm!FxbG>wr*&|SNc=g-fSH|f*dMhQRgtVDU-y2@S zzVr13-om-w(B0wBUGvW8_b9;+9FiY2yATR~a7yw62l&A$lOK#FesId<2V;pJoHF^r z*k1eqC-Ja_#Z8Zk$bl~Bll)>^KCkU40{gaiTj6|P@)0OsreVARywH>az-Qn9F&$XL zzSiiwbU-c2ht@=3I1Jq~r8Rc`ID$84Rmo5>8(wt#biLDfmk!FkS&TkB_H#4#7c}m; zB2kE` zTS*0*y_xyUfMale{Sw)_O$z!YZEX`$%zTN6@!^p#T{# z2xRxyC7CfO)ViH7R#7&8$hX`F6>Ljqk0Kzjg1IWOJ!*gRUC>~^B2m)WqbS+VQa?WS z^zo&S!sl!kmJ{H{;qc?+V75-6LR7dgJD=tIK6S%jIL-Qem{00-oYZL>siJkNK)gwh z(GjIs=5io*UlZpsKbnQHpRJzhss%{ivn!-trJ%a-6t{IWLoQrLQyX|GW(qnD!={=e z)a2A3p$XP+lZ!2hlrL5x_U1%9FK5$SQiEb}7pXLzlg7zM9SeIxOjfA-%zK0jW=B;0 zncG(@VEwhk9}^T)^wB@(Rn$K5P4um$7tCvOMVRI+tPFae+#ISFlQ_PnjR>ZLP?o?r zWWK_jgc*{=6pIKkK4OrsFt58(>T9X{QCX+aP2I?!wCgzLtY-wk?O&7%6f*#OSm=jFf_&}0A`_HGGG(xB{S5zmls+Veb;Ax zNY4_n@D~s+9NtEVnRc^kcm!LWhPI~yr2R@-XoBv? zE4X2&W6fwk0cYXl1KiI<1qC%LiueemRzi}4dzcyVT}4`#)dFU3~OFVmQ$ zt^X5bWUL&0{0reMFXi#^(KDhCk)9vkNuM>JzkyeM5`h-);Vdd(hyv&@ zw?1DUr@BQ!AFiSzUm&s-@!L^=nyauKo_wMssb&!>(Mn62g$-;*Go z(f%z~`ZUF+Z`UyBOON|^CU?CHs{*np9q}ew@m{}C74~|gC(1lkw9%@V>h-69(q&Pf zf6r&Hvgi%_@2}`p6eW=}-Xu&(bpJjSU%o{bseh5LAS&_|PbyX9E9=et0IfIjl?3Yw zy~z0x29u@z(Sc71Br_=pgWo7U`1z4m82q~CA`H`RUZBRLRf%kjY(^d;q%2D%(k~PO zmPDqo z?z`Ie4luQ3GKq9SmCBOI@Q7Bc0&yGFjR=OnBEcI#R5F?E@k%rcDQ@Q=i7h2FUnqeB zx{!(*?$*!H)MJ$KBKsKo!DG1jE(jSf2$8x6o3Hc1t(}j`aUEpouw^hlFGmL3P_1~& z#VS^zqg#o{U?T7<8I1gW=6j#DWH2ei1P!duLV}tPe2zeo!an8r%yFH1eq>FKWR&hZ zM4Pw5#(T|=zKg~Zdf9_<0iOd8#$Tsat+Dj8G9vsn^CNpOes@ft4s0E{am{i?gM>Me zrpJ}V(eb#~ZRx${i>E^Ba&1-}^ljsMeyAw2Ly-mvaHo373bnTJ5`PMe5KsEJIe4Y? zY>{#<-Lv&MDAJr|2iY&^uQE8i2NWQe>VRAI8fv%*|U zbER!$F=St@lUQsX!M;Llz0$gWKJn;Z-K+kl>e9VRh_9@) z+PiTxx8cgd(2@f&VUBV*%u3d2L*7oKa1zUT_Uy`Py5_r|i$_1rLjP!&+GTvuyyJRE zbPm(m!4r>m4X62nI|tVLD$NJ4A*65;_;VV4Aj?%W_0k^K~$d1P*Y2WyyAxjaIm_RX?{XPy_vM&a$P($0o)h|a2EMWfex@0JS2VbY5lx3=sPRV!X^B(fy zS}g3Fos{UH`E8+$w-fB*7`yj?&vY@ZWo8}dG?y$DKm#0XQ$}Ed>?w7w>-))AeLr}z z7@`k2#R$Fd9Iad`J}i9`L4>DNI)aGxW-hu%2_h1FNkL>&t~J@1MxRP-Fy=PM5|c=N z%~&lG$w-NK(7c{z6l&c@CL)(y0B2)ARUBWxTDJH-*ccm8LmVM40)@=LC8ETpJH@j71=@&X~H=2qQ=k>l`pxWE4QRHkOHGVyzk>|wpP zXdmWhu4%)tQ`?7~T5-~}JH$?{Ejiep%%VfQotl4$hL;qWi&hB0TD~?!7WA1N*neDl z_=u|Dlnf}yyf36aXl|irFcb_o!qOJa^?d#hxc?1zs%pNtOr=U7<%sKgs_j6(QI~6*ip~9^AdR`MV&A zcE-JVD=&$Y4f7p@P`b5Sk6*(O^yt>z)yy*H!r>A67Q^pF-gcZ%!y9meYt`Z7&r2(R;brI|z-C|yX#aA27o zuyoBpvld^Z{)Q9SPyNXfMrB29wM@#-oA)tgsOY_3wRV!(jz4<<^qrRWXlwJ|akJy) zNf_KfRd8Nb9e$)U*$(Lr$X$Q$E`gA1ZJriZ^GCY{(Yf~1 zoDJof%k9s){uX(l-}6)(!Ya8^MQiBQyvhEK);3<^=4qUIs6x_x9E7OexOyNI7TqCC zk|%V>M)vNzlhR+x<2C$34?QRR3sDxJqfpby@CyRenyZob_ux@fW3t`NKjpNku<|0c z`XvITR`tqNw1%icDvy!Sqn%V|vqi6zMhC})ehrD~|0rMzr-zeRSJ`JlOV`T2`z`bA> z@*cpf!+RJbld$(Ka6J%O_^OXcwSPpl$inEDcPPlhy)W(gO4eYBJkvF9FL&s;zxJeL zQhFdSG!s?rVKE2sz8Z32iGWFn!xwB5vzs=bS-{~ShPN%$8=#E_3a4={gsTBxAj{ z#K_#lQBc^4oWoXTq09KHEBBCfBMAP+SDe_@taTbGQA!0@zt^Es~ERrNdKo67oIaZl@Z8CSdSZ5U=s!)m%DWfHKmdbHhzU!PWOFA zk;`~nS%wTVI;l~W=#Pfj>~t@cQYD3wbLU~mW1Q~3T2dO#8ne)CM!riboF~yNJT1!~ zu(K_HEXyG8g{^baw&ta6nVH7XP+N*w4#pNK$=&)JX*(&o>)<T;MPbfB79T4oLL?fDcY6kG^h8J_M41rctMK1t5~ll$urlC7QaAn(R$ zv6;F3(0{W%v2%^nINLoq<#g^@_sp}{ln$9M)_oBsM*SV&CC3Cj$eN3*672ez{lOU<$ki}hVa63^L_Ko&;N&73mf+d#$x`l z#8dVNagj&Lj*sx9mn!C&A0Jk6rSF!W3AH$vg=a>VhVnB*^RldpF@w+oegXZ6Rbe!{ zSUsV~3{w4#F6M+mh9FQ9ttBv=_1n;up=PI^)X#M0rej|@A?6ioa>YJk(u9W3jWdkP z+LB4vm$Cvu0|3!gC9!SAlsSYk3>#zbxtxduVEK~50g1VHINe1ZG|(%JPVBLg!fTvG zp~4H{+0NWQv2Rn3P8)~iCee>ym|>aD%)1b5yMEkj!Ce=E=dW8k-gpiA9h$3J7W-gi z%jK|TOT*3wh5TNZdU08VNi>&<(q|$q7fxkas`aMN2%%4fE1p0;R{&pEoGMX_mA zTOgeOe5uX(r9QwYt(9itm?2GOO)7UpcDtd;m>?wzRVvEM_SOW5OzU4 z*{FJLn&?8A!EW&~SR6JcaBZttH~%fc`aEgl4uqHE;ic?rHP$=LAGnZOruc`3OHZ0l zPDaID8ZO;wR>DHW`dLI5jC?+es%5A7JOU2U7}_)Uct1)qn~7c#_8vo&KWx^ZTJKIZ zm*PiUCDqIXh{0w}Y^MW<1K-%R;UkBCltwrb;1cRLhYJPLDDOHculF!;WOhbBS91L^ z*3;n+BG(@_3#f1uBYnvwJp(p9Aq2AyGK^T^}SzH$5lv>U5RC0~&@%A<{->L4C41=5YO$=Gc%1j zY1i)wPx^OhJ%;m^l!H^(JGtPpBQR2!SrWnWTQI`ejj5zFl<(|z5jYr=XKZrQ@Cwgy z8egi!MkUTleHybq3S!@C-0ys~Grs?L`t3jGLmPSkWArE^phfASB}XV!)XM*;U)z@@ zn)*x0iZB}Kxqi1%nHE}j+*s^1ChbmX3r}yQEm6p?g*F@uc~9iFBL%gyfb5)RIHZTn z7j8;+ot9x+y4nd)COZL;Nj7HYu1gOr41Oq<|4F&YShQizhVlQ0V$l{6i#FN+_cy_a zShVR4fL8}2V$qhLJZ+{}v_-_CEk9-2%tVVee>z(bz|(ue*l?_?1_s74DxZW(4;!UN z#Fl@9i%kzxmz+@OW*7^P8Q$ZDGu>F&V>pcY&d@^DzeAKwA-q%&Uh0aO0_T=x1{#cA zK@;P7S97M==cWX%q@;pI4?Un zN_%9+l9W3ofMH``yv4=L8^utnw5QHx`p)v!*CZ5%jIQ8!7C-C2cy}Ewzu0BW!za=HCPPIdWG zz)PRZk6^p2hXL~?S=&tEVsRc*@G$9;0lG#Y)o$l1k?&PWNb$W~JHIW~YwAF_u)C?l9L82=cJ=+(3HZn}X4V z{xFL2NPFzJ#$WcQ2GTe@gFUKYY|4Irv!M8fx}W*7P@JkzJY9GZ6#s)j=_BfRz-1wq zI>$GTYsWC6zJe#yja{;TDnuJ`h1oq(dalBlAQ&PzZMYz&`|j3_bW!Ll!)kbAy3r0Z zONrZi(2{Ocru*j43oUe+kFf<3gXq?_^{MPS=*~rURZ}^&$$@mYtDQ*-0y1G`qy?31 zHEERX9Le0p?A*E#;)=3c)s_W=y~fCJGUH=|u`xmICAeMppM1tw|W(?)jlS3-W85-{|=^|{#;qGMfFLZt}c(_NkU%khI`_coIG8V{whyR7qfMb+J=I&yVR_au?I+dHjH{~O3vj`f?+yw`h zhO`8ZMgxzfccQuIqa4=q>O3Q<+(09AL5T_W)|r`B{a<|F%y4$+#x+H!@t)PDI-qOr z5&x9neeAX=m#sAA@mpzHtgSS!b0)S*zixy=lf6M2O};4FvREmsE=7Hp$4sQm8H3gG z#SO5a(}%`Dx~ysD3thGP6I98ZJF%-i?Sr zhvL;{rLT}Dt0!Y5v{~n$DUwgrx(NT5K~d{AB~}SA`m7ztRgA``I1!&d{9PcuiGm^# zn+Y15ObI=as;H4B?^6;mkmEWMFo^agi+?hIxi6OggD2(0`hirWbh`~~gmgOAT*2tE zU)C$s+L+HQN6gFl_+ho+SsAB3=C+G5%Je#Yld@fNxWD-fok_>&SKsYR(05z=Uv_JK zw@;_@nI{VA4C)RUy%1>CkgU;a^HJ6tp4dkhQKmVB5d1#{QSyAKD?ca)h^onH(Ug4#zWa=a7f zBhJX^#{~w(4vb)h>pYsloHlg~Uq9^!!(^omQA_r$pT*lFA2ENxI(prp+U?{ei;@k` zC$<>b_!b%ch{71+A;KIqw@P*&cVEf11=%ztw)ctNhNY3hjBrbmK-v3wT2k-r{HhWB z{dCm`;^x3iQn>u<%E&G5|CjId&97~fQV&+8PH(SuJuJ$tAr8l4yWL2Am$5y3-8eRw zk#dZx{cAapW>9{pENy9f-K_Z>SOdnOJ2+C9W(-=&MTB;BTKXz8zCUIS#O!r_ZgBYr zZ%gWGmukcmUDd(pXQP#PozTegrxhjC%rX}JxGHT6NiSYAy=rA}enPDr*>>q#IRk@d zg~_fJs)UN^&|5oyrfOy4=P=aiJ$qEOlA5b)MVM$XpG(JwM84vRjDCnRwvU^Ap=&SW ztli~wfAHK9CqHEMCqKyf1f{ZBq{Dlh;%keM0(hm}{#dwSZaLGL(jH>!w{DElguTlB zpLt*e%I=Z84S&Fyduq+#ai@asJGw`3&-DuT72YGvRgJ(ABX5fFnoMk$9Ffk#?seqU z*;69SG_O!Ab1Cgss~6b2nRo~9WA$Q*EATfm34bkk-*ox%UuA4KX;e;UrknegKh1cJ z>)hm|qZB5!fGW6}eUip)e-|$6n#@IIeQSK!N&*k~2tMLuYZ+XB; z8O8yo*txafsyw6QswrE%CN>O_(bIt+JQoS1hKp0XtAcwX!M7vb`%zox!yQlqvaQD` z$(#}yJ%xz5-V=fGt#1ah0h*(L-qZ^y@lV8n4p!K854FJV<0OR?HcWREWO_i@!S5LP z?e?It=NclXkqm|@lsb#dcKq@qZk2>8M(J^@z(xwU1xS?rItt#xNX>u!62%W3LGy{3 zT4eNb+KDj&GNdxSF-mTkg4Q_I7#W%G>PJ~&_v5(sM436-kF$73A5kpW1%bqJP(`J^ ziTqGE)EFd~kXXnKH2_mP0KAt_o2jn;+i_5eEtDJSgp!kja9F!m3`f?#)0MJHw^N z%{!@q+5uxhFCw3br|Qe6Z;lw2pwpova!F zDUDsE$agXnZz57hl0=PG+a=&XZK;K+3%yQY452j)GLksOMFG+E(-fLbAiOhz9i19TKU{xHG*YmH^khKr6&P2tdk${u6xNft4O8AUtL zgca=#rEhxRgv0L&&wbo%VCdyHGP-~k8J_z@Wb_H?ac?lEktW((VMi;m>UUOjeCSVG z$G}<=#c7a*(#EuK;qP=X=5?hOe1|9Lu!*AF9?0?btU!z&~*5-g50R`*`S&1ze8RArbzd< z6Ex}e6wZLYM@Tj9oIfM7ri9CsNbAzdlH7BF1CrY^_amIis1h!<5-POS4K*c}kJY!W z{yL9K?2^Enl$BcwizT1P=n2BFky7PJF7hNDoO zV1iN}W>n}w%@=|p6;23kEP2wyfE_B#dvXlF%R+?(9feb*p;+2+g_V(CB7+JAYeKkL z++Jy{PYdS@pS#kS$6Y^PSrGcnxYI^{7W&Hk@u3Mzmqmx#Ug`ZRJ@vzQHm)SfU)iri zuZdPzuPqH+>xpuZ{lzcHX#=R6cnXRgttWYtH3)1g#c$ILhbKARX3Fl(JLwW~iu`uz z8cu@5D*eZNi zKwRPW$16DK{#iJ|7)fH6W~-d5z>bN4fJRExr-*PLNgnL9!u+AO3Bd53Xl4^gu#t#YeKG+= zudrx*lE$I#@2xQFR2t8w8ABv%>%zzxd!ZB`KcU9!^6Ff*JNSOd#lxHVVd8TI0DX`NcZQ=)qkSO*OV}m`-JUO z1?MB9&r#Dk`(WsFNbh+pW($iQF&5WRh!9LEJB;CqIhExZ!!>s*i*ly~1|z}^=l-;k z4GNQVAG}@73K6knRv6Wr*!V#&b(T0rqTgl>ROT<|L>|1K$Y@T7FSB`|h+dqTw2`^2 z@LtN zNcqh_sy3B~+Yk%2ZnRiYyjW@@4UJ7Mjqhg?&{v{N!w4#&bhs|xf# zBPTA+vBi;D5Ju2|f>gN zi%Q@O^w>>T zh0Wl_g*X1-xulH~g6C2Kb-<4Vj+npwP%#HA*J$<$&=*Ca8ygM}EIfRUOz0L#Q@x%3 z(I97+{Hj=TPFC5=r9LA5q(pt8w?$$mABG(Fc{As0O?9YoMpZmrA^N{@%`xiw(;4PypD_k*s>PY|ON~pf& zY7Q6N?H?X0^a0m!q$Gt35eqPUDa;!8+OpuT83+f3<5?TD^3dnMskx16A8EohjIs=4 zqu4s-o^SDli-3_X#tF&Bt#W~)^R_(&w3)c=P@BUgF&A&XnEJ@CD zdl%Exce^uU6TJjd$mjn+;zejog{x z3JtQZ4Yn;2xm{xn5P=26Eh)s>!|mO7E(;B^N@U(MP7bk^`cu@X$dc(KXOIUsWF!SL zR8@?SwaO*w!H!7qtq9kkEkQa;lOEvrn<;-(n{)0pI)=5g1tO3NW&Bt8xZsBtIr;)z zSFPIy=BVk6_?=LGq87guR&+haEV77Ok!P$aK=rvS)RZBXCFx7qGtiOeg2bFntHjQb zFI}AoNp#dLEEsh-pmC%lanT811Jl%)s2`3U4N*#hjewY*mnT z=Cm`aAdPAYCwLx@;&~@`StGAF7vjI?=SXp&!H$ggfJ+b#MjZ)S43E|CCkD z*M%uFZBN5AS}7Me?=?0_8Lg`Dj7rY1xjvPCZ!ZdvKl1cr@#9f!_R~w4e#e-lS;F;3 z`FLYu*f}D1Z_8)Gg%J#U@5nMnhG!;)lH4yQcl}tTx%(KzUF6jDcOuHPq=jcqpE?Nb zM)?Bc4$*Fm02+jyg?1x&AAI7fNDGzKqp_5^RlEDewywKK+;{DOsMbgqpTfQQ2^v}W zzC27&kC?yaelWfIcfhz~N;q)DJu7e|ypW%T!ji?kjqCIoUNdEnTqQhulV-oCY2|$VMAkRdj!C16g3#7ZdAh64#>FEYvnnl7|s6C1azsbKI#ErqCO&HD(A) zB^z}|N|`V6HjIM+%+5NyP4|m|x4XY5W6C!*6)3p(i2IcZ-4C+B?fkr!5)+4a>zsr? zeh#!O&5ATmYakFF40GN^rKh@Ia$BO+<@9ID~U@Y=)-ca_tE=rR1n7mvCu_X_=Z`CI2Bo2 zQbE5HRFCPNIIbsnlzx8(45+Juxtlz4-b zc$S9}rwGT1-0x8UuQq1M(0zrEVzP#4DIzH3`_V#v_HAo6X9U}{FYhB%?#$aU_nQfyq+IVB2vy(r^#!Jpmws)kA zvg`$;KK?&a9IPX9lUjy@)I8L{CzSy@xi>c=@ zgR3;O@w%)aAycxX1f38hheV}G3kGx$O7 z)-<$%Pfkba6kI3w{{98YMda-wraZ}O$hADEkF2uv=7Qebrph)iyiEGSoP9xteP<;Q&e zs<`HLKz~@tfex$$C`mCW+MFnrj@vy{8w_1x!56m4$^qz zsrjksz&*Vzth>yy!nR^f3?F=@WOvS&D7}ep)cRhG-~91 z|JJ}X>N|(O{17X)ovQ5~3H~{m13LaZ%H6tHG}3!94@4`4B-7?@{T=nn{`22_M%6t8 zwVD^5Nw%QZqjc6=(8F`bTWyS00Xf-CEbUyOTZlM@h%H2{%Vdb}77LY8Og^fVPldTd zfp*nRF*n9%BJIh_r1Gg)CKE1}$+gdr$&~m^(v(kyS*|moq=7s2>BmAIMJFLr@!Q|{ zDnvTB@n=7UNNfM?!@&^gf$y#Pr4UIZ1^Pm$h&A1`dFp1-CqS-m{Wu+ph#8>XA$wgN z33;q5eeNOh`0cUpJw+aQJ3QBsNA}$)Q5q5z zoJQ`KQ2o;rS(|B2O2faMs=i4qTb2Zu_twkymh2b;72e4YOTE2 z4KngP3H-`xTi|{!DR5Uuk)AylshM_%K8?MjNbLnS){gHe8ZY3j8vKWeQl}N>$Kb+9 z#wijVMJy>r!@otn)lI1|e`SUDY0yrG=C_Z<+A}2Uk42htJs%T=2ZV2}rj=es-;^`q zDY7|QWpA>5h1Hf}1)q(vzqk&oV_7}nJql(_-ULKrhOl5#xqLpKF&OSDCMk-c zpvRWF5>6aQll_)YKz%WB;!YWe#Padg!HwAtKMIvhu9a}2UmAjq&;&F1B5k}Zn`!)T zHlt%p(NUN!q%_LL$NMSr8)cc+z8PmsA(Xg7Q19kmlA$W5Zh~dW#-?u3sI!~f=`izj zVAm)3So1_$z*1xK=J+BGV`Nsti!NnK?^3d}Sn+Vm=m@T7;A;IB;032T0z=K~81=jU zflsrBQK#!s36QbuA$hr-4gNu1+%IC6bHW#yEHsTw-on$YV5b(IX2Us%Qk2DZ%mBCQ z_!q2r*eJ>#SD2YwH0J&<8HE{gG4nhO?9;6B5zV~u&!4c5bZ(aU?N?}hSw3^o6;M&_ z4#ksT6jS5k}(;t1ix_xR+U6#35#|b&uFB-~I z(~_hldy$}`E(=xvGejBiJO~j8UFP!&3Y)YOEiULEGJjza@*U%>?6?VBClb|u^EV=< zBT-eV?XJ@MKG6~t{W%VZ?q3ID{cBzydz*+?j#P;tK^>_l ztT$6m;c{oEZu_oWll0}4dS;iY2N*8R)lJiRDIn`F8Yo<1*x1<{LU2NTX%@`$q{*$?H_)~MglHQVR zypj8cyY(Nz{0R}7jN$9#IpYbQ?6BP8eIGHJH4xojDkGg+z3&^c)%t=IR*Bd;EQv5V zcxd5~`L!jhSTS?J@xu#`*Euv5MNpgX9?2d;SA{P!j|H3cT&>uByCM3Uw2-$g?A;kE zeU)QXe4)Tj)9j%*yvtcy*g(h$Mm4N0b*CBmsFshQ4&>+ol{RkI0b)0H7;~rx(V5uI z*^)0jWl?#R^`-v!vAz%Fhst_FOo#(Z;)Smnj|)k>Jur)?aH`5Ii$#hUal)wtFbgac z`vEC=gkvgDKCtHh?VZF`2LXyktyRvriLA*s_Dg?Bkvg35v{b+~QVry$DrJjz7?d6% zwwLm+YGD|VWe`+VpaWDDU~#>$2W16p#LjzOhOSyw0u6Z}i17115c?@dk5vxXRW!HA zymTv@XQKreC>tfKim(-rc$&{b7)pJ6CuQ3q<%{d6(NW!=C|SR{zg%wpzJd;v8SVeP zez7B8CP{aTll|Mzg9V<8B0rr`q6UyU#j1{`2O4fe)v=72ePq##&gjI zh^@EPgSd;TR}cD#0@J{Hw|6DPVB4pufh@!1rGp=vUYhrn{ z(PB;8rKpN$!xdrJaHo-)OZe1WNVuzTYt^w~P%4ada+xQ2Puf*p>SybYa+n}bkvcdrfq0-}h$jR3C<4{f2St2=E zcecpM3X18AtQiA=*(4lUlVuc-k2JZ=%{S=w@)zA+whos8H&mFdl^@qgRkAsMOX)`( zJvq|Wf0Ro_9p73ityNXxzL*L`!nm<->G*Q0jzMI$Yo1-BST0kG?kx|Jmu`c@cSuti zt;UtobdHR({y%VFN6(cB-@5;AitqpZ&VQ{QIQbE2nD+EDer`r%ljhTF zdS*32^N%0Ngvz9Y3tK*k>zT)JEECV6k5WSRu%m_@N)O@i36##EIW9SkEhhMDc|z?E zF@`sRgv?5ka^#foQrYG4cDO0Mh+RNMhR>y>=4)6HQ6hDE?o8RczniV{Dximb@mKPx zj}1sOuEgs6v=0IwOPk^c~`}%snere&w3KS^;8?rCq3ri+n`_&(}KUVdeWcg0K$%IaSAWs{8L$ z3#5LS{u_B?tYs+s+tceiE8$ydaMczZUB6Gn>bF1UZddMOVDwj1ZYILMR*eKQdf8Sf zc417G3VTT&vVi5~B=V&A)mj14J2^*7`GqFvpC(sFs-HO0v^b~IT!KdDN%82X zX+-J8L5ZSz3@Pneha;!B?iTc3M}GKUYk`S3XN|EKic9ZzXj7AS~d1-y1ZIc)> zW#|*qDIp@u^$9s6A=~;3@yKL*dw(GX60)PekXi}Z*&cM%b;|mL zQamo{x|+kFE#}Y9rv^m}>PQv!w=~)I$k_V3v2hsNq@JDXIYq1<#!gbtJoWUklpYzo zKs^_!=UwV~w|Z8qXA@7|nIA5QPLBJtyj;&(mci|6Sb!D-9plbl$(|5Y-tM|2cPty#li_Od_6gqKGjcrZ?8PD$MUwjKzzM$>Pbjxc8RI6&&+8&1fD0SS>9^M~+l0 z!K|OLqF1bpeiV>>lz*MV-c%)bsrNJL{hWGUP)~>Qcj^*$vs~#iZ@-dk0qvHLDb~mD zmbA->P43MfAQE)_k_Wg*g#YGs@sjr3;aRZS(}CpE?Wem2Qv>GhAj!&QD~iCyBGA_+ z-3+t+BC9=%bK2VL2Al5^ON3yhl?ooeuFkV~++H~DTYGa-1(j%L2I7?gIX6v zz>t+P)wa=y})u5~^V@8RAoI>=fNo^0sfD=DVSyK%(&TBN?%sv}{5IO?B5 z9Zo_vnh+d2hI}|DwAQ2YlUk0vRcYQzja59Ajh~4rU1ag%r^fT%ePvFY&!@I#j0ezNEn$c zWWWZOccDOVh9ZAOV7v{47ML?x=nfo3zCOUZ$Jk^ORAg_M%LY3E4~v|#|Mevq9#6Z| zZ`wfv=+1gcrV;YlCZEG!5)s`FUE$u?HkOKhUl+!<+kAYsLN*W4FUx>n%EK-bGXW{L`~Nw|1pnmnyEcFA zeaaBXe&;5~qnxCWF{YznjItd#?H*Y$#-*O=p@K1)=KUibj{iIoeAUz5yMiS?RIw|V zrO&tuR`v0YptIMm=^kqO9%@|xy^643d~MAagXf+8D_^E+S#2SW zZU(|9x-<0qjpD1qWpX5m?b>en8@smMnvfI5pxrcjZ33U)%M2@lN{>@jmTdJba7#U9_t`{PY+K?U3{;Vmz2= zGz|^_V%TT>RaTU9UQ5B4jA3mXGK!1^W75waIs0z#h=Xd(2=Pf+mK~NE3(F!ba~Nld z8YN>gC4J7DXHOYNcuVK^t?qo@C1k;v4DmbEedwJ-zdv+j*wMfl!h6nEkICZH0-DO% z-=!RC9+6ADwXWvDxx`(QRF?Cmv1e{z@Y#3I9tpndxO3^U-RYJMZe_*7oJh_eBuB6s zUF7}rC};PJa*xptQkfvNM}AWdbr=0rMR2Pk3@IB&**?2qOjgcO-qLx?C|z$Ch^3CV zSYINmSRt3_LQ*gn_@xiq%QKCmv*}@HKcM*KXFpKnb%9+*iV)g$_JfqS?j#5%E!%ss zFzOiOqGS4p*0Im`5Nmn}GJ1C~QDpEkil?XS<>Zo#@Vv~FPF@Dx+mp?y&cDKXpfoLa zPFnL&&K*ygnU=e^IW4$5JNH+C-;1GgJ9EhM73Pv8|v2$m*#*t?0&WNEv3gHAA52_)T_=4ifs=DqCr5?LpOt6j}%KDgf%p`{a; zo7)z1ltR0?8DDfYD#kkfKGjJ9p@ zO-?NIigEoj&ph)>Nv}OfqWzZbNflJMpL!`GP^u}`HwV~W=lUsP;=@Rd!I}$>9i?1d zvSO;R=JddlC#UoC;12oldD&H5^3pIFJEzL62kC*^XjU&t*tlJsIsGU+Y_U}B-vrl< zaoqnoroXVZ2-h`UCkJLaa`rtq1+bh_vdh@jZq%4o1W~&6REMBHWk>a~Pt|HSL-sVr@~zmu4}( zy~bTIJeHyfWK(jEY)baXW28J% zbK3H{Cz$7158=S(xA?*AzMFEPTXC7vFBf;G2RE>J^3gUze5Ob`i`8bW^xABx=AWRD zp_OJ!UD138a~9Jcl9^e++T#7q&yuz*`7db(!5Nc;#O~IAClpf`KGeuLk9f>2O3inq z6MR=5&+({Thg@FU#KU}9rXSLVZ!piZqD5p+ZM}q+Na*)es0Juv)WoA?Xf*_LE*_hY zx?AP!M6(&Ns7P;f_^+!lD>S}ry;ghBP^PhsMbG&nzlx+T0zF96yB%#^@?Vj_Z_Iy| z#A^P7M0ubtt+rSw@ej2ACnaHP+XJ%TJHPlT`7%d=^cL@l7!i^K73N+%&3}V-=5Wvo zj#b35(H;xhO3XFyR$U-xpWG%#Bkzrm`7~fS1;_lXjZv|MQLSJ!9E>nRitW}L%i86 z8~8kohwV=S<;VE5L6^4&z)io^k&1a(YA})#DArK#A<)XqKUsSfsQkOfpw1LqnhCX! zO<^8kZxt}V%&y1atC`Z@b3P_ti)eECMW0U3OeKvW46IZ`SG@e7wpF+5TJ4)r92sVx zYCZ!)iRJY(_zk-Sq`ebGN`pDb*_Tj<56S?pH5>-3*m<}sSmlxf+_LcRNRm)B;nPW8 zRY@ickYtKVBB3ft!hsu=kWq%?#d;W?gRwyTFwAfeEY^)oh4 z{oFL2pU1zI+Qg6Hbv#wAew|O%@{8HrQ-1kwJqDxbNZm#&PU7IcCnfNydcHbR@8&6Z zccfOUP~k64)?1x((YY=Ow7M!K0*M?wUT3KF5njUb@&qp( zDqo?7k$0ia7ixW2g+42o3|=z0b=2 zMFr{VqYUexaD=5a3AKSvwFx+H8n-37C^SGFiy2RYWAD#~nM-pGj@=}$!INXkbB@j$ za!nqDtQ%?$BdSP0azbRVriV#jaJU2|=j`L)-fJXHc*C)B_m7N^?hFkMt#yXxx^nh~ zD$@+_F=NAV1dRvJ7S%KaSZ$uXs-b2!NV3>Gxxrsk50bEEoix1UScvVA7lwJy4eQ{l zj?f*hPu+};cKPplifC}&?{zR@g=CCAUUbC?WpgKs2TFj9;qJ`0ZeOH;((;qsTsPrAP-XP-N%lSTXxXSpNXa2)#aLBVr_0yjS?WDD*^ zl`jcJh4Ga5eBAEwj|%SfXm1*)_GbBIA1D6h;ijhgh$jNDJv}>6`{z8gpOMML<_Nbj z>7jbg>&1;bZZB-y0&)M{7pmdFHVDp9Axh+uCgSbU*Vmoq6ulUu)hkQ$PD@i@$3v8L z*8XBV+(gtwrr4>&ur2X5BUp0=E2lHTnsW|V%&RmtwzKAlq{%5eZG3`4Wb{t`!uEC| zZBmhXI65fDdol+MckOG}UAUt1mu0`p`}r#{?Ffcm&ens0FPM+O@Ql5=Zv+OvG?ze3 zmJbGo4j)KNMWtzT;v1+fDB&7D9`iK^Oa&oF+Fo>aS$J+IKuAQOeQ${V*y0=kmz?sO73k z<2DAup>lSBQb4}Vr8T)9HFrTyiJLBQ<#DOFk+FBN8!a++k$U>nvqU|M)w4i7^VD;? zdQMT#N$NR4J;$r(0`+`EJ>@Xa$k@&5`H*@(rk*?1vrRo;RnNWZxkEhKfvBkKcUQl>d$ILbt_x{+5q)mFLimxL+Ntj?Q&cuYY2 zs{+AdYgchxia95Vepn*iC6VMX(Ejl`N4)1Go+x5Hc-}t{J~J9ley&ss zUV1XPE3>QgLs?+wHLELmjpe(j>+LIJ)SA;nMzaLaW&w1b0U#csXnsPUtSCNj+R^Or zt#?CNqMWDg8gm5s4|&^hL|{H+M+UG(#NWQ&mx!;Zq*7noCF#>okhCr?sjiRGBVEsu zxGs|;Q+?+B#ALCy-9}?hC&>d*K=%rubpq&f7NBTElZYh}eC8Q~lkI$>;l~IcFX4|% z_^%NiRQ}QM&xo(aq)fs$8k^}!w0C@QK;7n)H6>3^)Pb=3u-vLO@KTTpYl0;NcrEtwedN@ z+m6R2<@aMLH2|!Sx{mAznbI9y9x$;BHD?R5aH$GDP9Hz)ng(ez^^eUqerm#ITzw6>4%xNR}f@tzND!Jg`&^YMpg1a7-q`ExQ)T>-A-1WscKwF>HsJNoAKEWh? z$2x(v9m_(CO40fhHgim36hBRj@7OT}-|RTBb6zFhcH-%l{8LGhDU`okr?8NEW?wu} zG-WqNQ~4#;L#qAT`Ph{vbg3n=@Q+u0=5%5v@Q)p2KRF6$oB-;S>_5QxPGDdu*R_uH z+)CB8?de#fnIj1={F>;SrF_p@(PQI_Fs5S?uFKyiT*if+(eP$F99zn+;`n@y5bqI* zw?oP|$Bq{(-?6UD`1rz4swMsjiGOvU__~r8?v0}--B7iEQt4V4Bk8wEx!y&IYiFf? zg`Syli4_Ar^MRf6_q^>mCMloLDJ8zy5zB1OVeor38vkX9@A*gKH^t(+{z;6Nj&!y0 z8*NXL?jebt%~`HpGi|&WZ&~xNV)jw$>iXqR;}Qr%zf%%CBnd`Z38L_1+?g)HYP>!D zu~p7!xD07o60YQfH~WN3`@V484u3ux?nMk|rHG|nnZsW+0$;{O7mL;&2_8-U0o+3{qNc2^+r zH%a_IVN(~)OJ0QTQ{pn4vzPc8(VT`#%I73yn@$-mh_t(t?-P3BCxrgUh8qo+d=E&t zqUYE8gbN{_lW^5v?yIC7`rj|{CrEx1?fBBqIU{WWA=1z5rl?P^ z^_h_RHc8#~EUC|&iBbVWxvt0By>BELK&v3vq^rX4E^Pxwu}gg+$VpYIbc^;i;3 zpWG*0$~iuY#jmj+R0WK}7kZ~D_(Jd9geL@@`cJY}UFpYmQk{Od98f5`*KT}LP9z*? z|5~=XROtsmq1rmsL4`8q>`0a5(wX+8N^-IAdG?;z@oxvz>33a&5RY_y7{gCQ^Xt51 zemB|q9T(UtKS{3hljME!Gln0)TbD=91iW~8UO#4)XRp9g@Fls1FUkABNB?*RV;eN*6OAG!K$3)fs0yD2E@#Pv;I8 zqs4YppIJEE!E5Yro4#ijs;cKSnl&13M`}6=G+70TCaVB(w7=v)eb@EuGMM={Qc8-@Ekt^y~2W=gW-Fi!r;xWD!`+!t_}xHR0EQOS-2xb3*danqBM9dmH= zaVv25HY<` z8}}aWG|rWg?6?+p5ARd>?E(G*e&z3KPB=I=EZOlR+<)_4hg&opoNzzHy@=b5>%?W? zo+Eq;ag%X-hbB9=;7V{;;yQ(Z@uZc%Yr%gg?i`xA-{B79Ud3(4J&k(=cO;VJ_-`DT zIGVSoB>|#$YjSxTr=(qxShl~h%<3R`JRdUGEV-c;FpIh#@&po z#r+gmU*I8Hp-FiNq3}g8|g@Y7$^Td{C3K_^>+|Oqy2uV-?1&r##R%lys0tZpEj+$#-CqZ z)#R^f&K_HRgJ(t6s`?rU?i=p8$y3x^)l|D`d5fo^(eEiL`C`E$&+^9AO;!F?_te+i z>?vQn%D=pJRl`b;ztJ0G&<8b_G?a2jeulQZTLld|BWm&=Ak`~Fo zsH9-gDiqqyjZM?06-7~*-LRsO>>3(91&eOE#Zz6gX4P^)IA%Ar_^ayceO3NiM|tB4 z|60J`RZ>$`EqQvYSJvF6O699+sHvAS++4FxlIgNozHw1hu)?EYkx-((X1Tw-rlGo~ znapF5JQT226?sKtph1WeO*6NtrXeokO`ciJHC6ta1&xjMwKerkITOnps+wAAp;k?E zb7QmMGH_a7bK~-wmX@4}g{zudqA6nFb!pW1v}v;&R{7`GEU#I$Mry8Qyk~5+XC03l zBoFzs;#qNYu?njERTOP`W1zlT6{xw!-@K}3O^v5T7u#R6&L5!4Rx~%Rwra1os-e0b zDryJ~RjYY#A(g7-Mo)cX!%A}7lqY%0U!>PRw{oWpN_7q%I>a?>#PBp3(&GMl@-;nH zHA8zUK?qu)KW@1tTMFahuRt{bPgOnCtzPe0McG$X)vx+$O|@sjy0JHZX%X=f;moRU zY^g~A)DN6yYP_n2=H4r#-d9iBl6vS>={nd%o zM!COgC7s}+wCo$tD(JMtf=b)ygA?WdX!$pfjXN}d_V)XhdXwwEep4bYs;_`ai?k36 zZS~|-Q=lRx4fpwzpAmp(@4J+mY{I)*gT_e{;}bP z%3cMl6`ti;sd`+q$4^2Eu=*Z2aN`P3l^&Q{h|;?p32U(&c-46v;>yR zh_QkyUk?lS#}(OQ7irzU3|-rJ`sLDRZx}m0c<5)}D05UeW;+US`TdlaF}N(S+TwOC z)KOWZ4YUOm^zhezIxA6`ke`7tI>uOK(IaEQqN3S_Rm=U2&FgQ`6iK9aOa|~-#}aoYO8Uy}wS zy#aBu_cN*z zC*@N@tKxiizemnj1X)&Ivl^+ru^G8dc*g98HHc2tq_Mo?xV3~wqesQ9nsp4qYAliP zg$?&MG_Gxk4ycJ~H0Rf&+m{vzPgU(JzTB|XvYNHZ2R>nSvRJP645UxF6Vp}Z&t9-B ze`bDJ!Q3)$0r^}`{KEX%B@!8?raKNqXwt-yCf65NVTXSWu8HX`jcY&gZCv}5YZgLl zL!c=}(thwRZmh2^Y-*9QP0B@EP+;=aa8Vk7BlRt-X3%j_g!_vGyUJ=Yu~EIHcU$f+ ztu(~{QQByKh_=7W&sPsR)f6E?j*Ag(+O%1Tb6|nRw4Czh~mj6DE9#FMsW-mc;rkDoKnF2ef9ou{op1BDCigC4pGw>6NakLB@)e zh*U-P6b_cbY+{{1MuT2yqIuOfR#i(nBG)uXVT5`1n@`JnrZ=lS6hpF$=~9?mF}2bf z7E3<@2#2uW7LhA^DOd2Hr7_m>wFHr6k23Nhm>K! zsIh4M=drRLqu&L3&cK|@CgerSotW8*K*Ms8S!45m;fwL*)#G(}AJtMcH{D)KRyEu! zWEJv4Wvltxe8ip^=xJ(i-vMbo0IqgPg?0-hKPxwBzA^;^38kBCiS`=_sRu*dg`)J) zWmB4;Mn zg95A7%LYlV|P9`hrDLZ+h-nRuR(>T_oMKzUiV(3msDe!@haZ4M^&OV{B+|6iGvPg&w_f z3am=JS;bpGK=nFnGHVUAErF({#%2_YH)~i4a~k{->UW@WGO*0A(TXPdipOQfXMJq>y)k^?8O4n)ep$d|(e8!>Ldj&qQsk^+{WF1gTr6G7Mbar= zY%ixpac7FDbqF%9iX16@S1V#eeN8|z~*^kgj_ ziHnuto|Vm2v9zBq|K*KM>tks@UA|3}J+7iY72RwOA5Gs2?Q%73bvO!|W%;?FriHnh zez#}u=$t0sJaGl|m5OK8-XCbOhjKmjV%1jKzoV#RS>gQrQt!-#g@xYv%NCZEFZB85 z&R^gySms@X@}gJx?6O&NOMNBY1>R-(3l`+hDlYYwEzmJ97PoYEdHL+JqED5k0R2f> z`Ruu6|u)>3Cvb0ebu>K0L$42)yp-1(*X3lxBh#w(bgU&;8TNT7;+5t#G6 z`2~q_ZTV%Evb50snQp2ir>NMjKUuDg(I1o?1&gLSG`CYyj04p|j9;ObwE5M=c$K}_ z6zvC<&8x72&bB`zL&yr zpmg!Liln5mY$>a_1nm;yY9IJY01AB*Ao$?me zL=w_OJ8S>`IVwJCinwfazWBxGho@3!)HKs~OII~nI%M(FYhk)D`F?-Z^4itRBz*S# zVAUFhEAistB?bd~c1s)z>N`Fn$1gT*5 zYD!TaxJN?*Kdp7J*dz38UUg4P{`{G`-6x1_(_nnIa>W|x1sCB_z2b=%!*^5)(Aubh zLg4YhQsRJ|FPS78#@5 z#|quDS%`E9w6==Du?7`NWApR{w?S{)#1h`{#g-a>f~Q!=C3ui=xvaxz&8`;fnC+?6 z7pUS@5+OJzE`K2Xn7A#veRD0}rhK1sq^A$#2wQtG)wVq&eA{EO@OxN$TVB;7 z%XE$j_+$8-VOJBP9v-<6c^0cLtyQu?MrN$GbFPD-DE-zMDg zq@;8uQWmUjY_49=s9SHdtTx1y8*4?*l}^#DlyJ?gFo^a*=J$n|(Ds`~skvGL_uN~v zUiW=nE7@b~)ndJBd*I%JA$9|$V1jiIt04|1aLNc8n`g1Kb0~41cqNKBXuQq-m@5y z6Vpfow*-R(SeA)#EGRA?88%hN5;Lqg|MKNk4Z0avqF#KMT9(lMU$meKTaU*xKCK-` zu)dr)O|q~aT_1_jBmrh&eV|2}-avRMVNDlp;5e$^X|Pf143MA29OfhOUJ9OOR0F^f zjZd!}!#>)Lpm;kR1NpDL=FSE+Tg^7@*Zras=Y z$^~X+)x9X~BflIp^&uyw$gg{f z_P^Wf(n&bbMgDp`IZlV;cASGV%p%;;c>5I&#|8M#tCRGejDo*Q`v2Pd^7tr98!6%jQef+9eQ)Ir`E2nO3(D7 zjzK*`brZf{sO3w_@Lfv0UwwV?!i<`-1sN#&^YD=aezda_?f69Z#_yvSA1tDK+TKs> z#n^W2FSEUwi_}UUfAB|p)pSB8><7$fPZkRsJ;fHcKkzURyMYV==&-itXdEIdK-~Om z7|xVbng&`RpAi=s0=aF4Or>ZGiH3fC zfC!$K1M2}Ncn!kU4v;_5Q#ksW<S!Rvr29O zA(<-h903fOh$fj#=5WL-19a<5yr?{F#PilTendy{(9bLzg~j$+%rjnKb->-g`vA)l zSO!oD;BW!f2K)<9vjtWJGy|=`&%jv|1a>*_6u>5e7jQA~CU9JizzTsofDYhi;H+GM zEdbhp4xkGdG)Z7Nz{S8O;42_wvcS#;aPl>40os6{fU~fxc?GZrz$xzxCxK(IA~2k2 z&2S1a!^y1-r%N)Nz{oPD;af+b2xtac0qon)6@lE!fKtXpFmxMMs*UY324LSZNzmP@ zwTVCx`e?&OsGP2ebt3!~(Qpe(HD*PSAIcw7iQZQ6Fl{d~)VErB!`ilzax93$&Yt{v z{EUKOh2t|RT%Oepv!f^~Zh0ErQmdOrx7^}}m$3M?z>Nw7Pe*}9*9y008E*BYC+L5* zo>uL77~T%xyG*#PCtY$k?HfC^VQe4q;%?z49$afDslC+Q7cE*;I+xZS_P$+DOMRqd zSZ<~!Pd|&>xtcuv&29yp4qKFQJy6&JPKP#*yG5$B(eNPC^DxAR_Alx`>|7ou18$xD zA)6-buqKc(c0cTLI^4>50=j+?@C`Jcx!piB$ZMR3GZ0tZ%|>p`a5LGLo!sa<-nAgq z=@fD!gDxO`x_;1(GCE#IdmdKL@=n9|%4lT9%nfVlU}738La;IQ;rfzcqPBjr2yV?3 zhP!Dp5$hzsW^$wY1Z5 z3|tMpRm8~!a_vXqC`_lWA9}v68(QK=@$K%0hWNGXGHk<@c)pD*$-fgu@Ev)k%01_Q0cS0*~Wo{c6NdvfkE1*tUs0 z>{GZ>{4d}dpN98);KB4X93Ce-#Xn?i_vz1o%#<$_cVSPoxiQ)$J7ya(+K8+%DYNXNI18tp&wxS2xHk0mF^*~z$-9c1Vq3e+3Zto_HQC0@6 z>ppEoy3NhUmGZDrzmg3ac4S-)9Rz#e*{aLB9#?Z%vZtyZ!q%Dca(xf9Z6@07-OvUR zukri*v7YOEb{EfY(s4TONiP|=8a(JqZb7=yfA{>2CDfCJ2t(;7l2ljHDb+KJ^>`|J zh-Z3R&+@l}2k|BOJ9NICN%)dXohBU)y4#vYlAC^%R-(kz|_@`}&~UIyQG+>={J9Dj2A4e7%LdkgU^Jy)uj#{tOQ@b57BlY6Jj>c2hC zzs{Z7f2v1FuL6jVVYjR9<96GME7>i1(tHWgfOXW~Ka30aD(J~}cHnA+r7$!%LRWLx zBQd{AZpP2>I}*nSlP+$?Kf)Op&n#sZKoOl-8`z8xd2 zJm?_f8Mp&2nE4R95PlkH;MWEkLS6{`fHu&u!H@%EXZ9?@Z2>Lf?#M%UjI4u;plA5E z6K{ZR1|)TJ1R3ZV*G^pXaP7ji2v_z1p2>~;LE8Zoksr{B z`!1xT4)=sEJl7#i2Ew!>&Su;=dkOqrg*-qjXhir2b%=}M2DD!SesCjn;Jye~LMQHx zFl`812RA|x@wZcamx3PX1iAor8R$=i?4W7GwFOr~XDR6M+=_d=pknEuYa<#U1NR;9 zD}t@1!;kV%)ZIGa-VT}|o?9*l4eYP$3h==-9dGSguS8f}gIB{3XuSqJmjc&9O7%Z=c96Zn94-cW=G|4zbbpgA4S!;!`j@P`|Fkl(kE{$|4;Xog=p z+?&sUA7pNR9l&g2a25E%jnDyPfF@%U{6K@3b*u%~PF!2*`7Ovh26BOh(2VCgJO^=4 z5DP(f4&=kV2JkMzy$0OZ;hxZn`(|7TZMg3QT5wP3!hLWoXmC#`f^IYZ1UlRkI&t6r zHh_CV7oIynlZP-Jc+OajaJX+HdAEZG_wBgvq_996{L^nnI0_5YtwGpw(BPVW3$A-0 z*PlTrf*-=QyaPA*w;^5PZ3qLj{RK3)L$<%-z7_5Yu0T))Ef93#3Uqx0-d{r=K->j+ zT%g0X9ao~IFcdb=&BJu!TI7QqejdIZ*UkXKjl(lgHy(Zya1XE?-0y}QfOr?~zX6Y7 zm=`@AbKgKG&;_&(#~k+vT!A*A9q6Fz8K6B&U_;REj0PqE=L3s?6~H~f7T_IV50JK5 zU?&1HFdZlb76Uf}_W>^eoj}^(1vV7O0m^}Efct?Lf!#o_r{NC-fH}bBz&hY1;E-no zHW8Q)+z504zW}GT3#y z2RQ0EfjNOPpapmw*b5BZDzIh1v%nX?;m>2f9+(O=0Cxe~fIYy_7vK&&0sI3v;ziH` zvw=&2dx3X>qqhlcEKmSk3p@sV1Pp&kVB>%}z-7RFz}tZEGV%f_0|TqhrmVwvw>#dF5o5LTj1z71ttQ8z?HxT;7wo`aOhjm z2QU=~12+SkfzN;%&PfpEZiKr?U$unqVIIPyc} zACLvi0Tu(d0-J%40bvJh7RUxJ1eOEqfmeYpV8}0Macmnts_zf8HDbfg>2P^>|0Nw-GPJxX8 zW&$??&jWjblmCf0fCk_W;5pz+V8CYrlYsMq7T|H-URjoCwz-M0xkk>1Re)=0RI6_{!U<1fJWeUU<>dSaAX(W7XovE6~M#52f$%_ zU}r!Ruoid~_z5`mdx2d5tOT9_I)T1>QRaXdz(QaxupKyVAMy;S051Olb^*K&`~aNz zBm960;1*yDunRc)C)fp04Xg&92D*Ube-_wypcc3T_$P1xIPMqZDIfz`z-*ulSO_cw z{tVm?{0(>>cpsoqU>fVidb2*PFFOS5BM!xWO^0L7;0SgkI|`EpN3#L!7z{s-#a^<< z^$?O!C!A@mE*=cMTJDm+@BiI@2Og568#YUlHGKP(1BGwei%*O1@ z!4#%4CmL8c^Dr;-F+U5iAj?G4IUYNhWwQxvBAU!xHi=DUQ`l5CjZJ5H=(x{d`K*A= z#7<|kSs^=zoy*Q+bJ+Rp0v2LLteDNk`lV8I{>s@rtYfOgL4)(LQmGm%mTIy3=_0IM z3bP1n!2Y)jSQFMeEkdV!F}s9aicV!SyPRFYu4GHtRoEl<8n%>O%a*b0(7n5!-N06` z7Iq`MiLJ!Gx_@G;+0ASXyM^7#{>*M;e_^+?zp_?#2V2YT#NNAivAfwlY(2Y|-N)`{ z8`uNvLG}=9V-K@O*x#@}@1yK7_Bh+bo?uV1r`TrpclI=UhPAV2*%tO3hAhvcYyKkJ z#$IACvsciqevQ4(-e4Wi|6m`o9qc3aG5dsdvQODg_D}X1 z`yBfLf62aLU$b58Uu-w~hJDMvV_j?y`=0H^`_muTkL)KbpWM%WVZX8i?BDD+?Cr?} zK}ZvN3B83rLSNw!p`UQ5aF}qo&|f%0I8rzY69PvI1B7FQfx@xEal-M!AmIdIuyCR< zL^w$}SvW<=5Ka|_3a1IfgwuuL!U*9E;Y?wqaF#Gi7%hwu#tNb!39?`l?1Dp31XXYf zF2OB$1h3!|{6ato3Yo$Dh%Z2NO z8-x`?i*TcGldw`)CHzTPEksx8jVZ0FVu66DEy)Z9&(6#a7M>e*(3eowCwTA`hKbJF z5=p***6fLeo(&ONE1BS^@9dJ`K7qc+#<%n}kp!=aQxcrGINEw{lb;lyDDIFXQQRXT zQMz;TL`lgK#T^q9#od!8ihEfS#hsET${tHpX67t0m^lvrf|O<4$CA3F6sBY*_m59+ zJe4)!Nqx;4NJ5nF5tUs1vM?lsi{zljEGG8a3xaaW@Z=WWzLNIbTO!z3D&CCF3?x~ zb{A8s@buM~Wg#z*UeBx0G?LJ?g;}C-sA5c1J*6WwEtMczB($t};uJkOF-b@PnVGrx zQOVFKqd5|@3F4gvGAT1NG%W>TG#FKl$phr)XY-hO1xIm5m7r&_9w)p)(@ZkyzFJQ6 z`&bo*xW?(imRGrl^sSNk%h+i=clg74we;#g_8)0wNo7(2r?Dy>BtZrWU?I4ji5E4Jm9F1NP+UTgmJ z@@1khN1^+oHRk(Ba1r&^c^qnvaoKs9*(f`Dp#Y&#!1Adbj}wMU8PW2h7Ei33I4?aZ zNv+~p$+V9ZQe;gab2e}F_-6{(_okr=9R`#fZs1zjo^nkqXES{ zz|wMO+i4f!5dX9uLS&|_xuWs#U7Zs7M?)IiwH()iC77^YsZ7>$OC##Zb`ppz*%XUR z=VQ&Dn0M3?G`rAEPp?zW;#ldTPnIgxOs`90;W{oWH<#Cen($^4i}1+%WQ1B0IAL5J zo12UJHGwlegyY#_38U#cmVRDUm^NZg%*j7)DVeaJLNZJ3Gq)54K&wnNf+@B0;$p{w z(O56QFeIo4>pBDY_R6{&G3T#kA?KN#z>;^}5t{NO1(}v3$tuwJjgon?;wh03QqBZ) zN6epMCdo9^s-bCT8!dgTF{Pl>X60t(W||TonwFWV)g2~ZO;V$>=0qsz>>!s zv#L}A8|ka6)IVb6gh{GtO%3!}*zDp;-Du6iCb0pdYsig4|J;~&52L&B@#rkwI(_So zm`}7g;Bz`lCgf8)5vvbK!lWb?bE2Z62+3mwzdhpE=Xg$JJ=H z?lZ~8xBoX8jW$4t_pzicDTOIX@%{-W7e}B86sKhozZ|108wj)E<|3vw*J%3<%LqnQ zh7E-^L*m8~CpR@DlsqeuMc@PyO;T&AEQ|2%7^Y&Eo$lg^r%D!)iKd&F!bzer43u-w zDNIqs`VUovWB6oGCR_wOKy_2bwJd>&u zTeEU2$4oBuHTR@+~Y)!O)270nJ{f_)G-a2|%W>xkgBn zhbd&#Ti*|lhm0$^Xq-*;ld%<5g8ZoJk`r3BX(iG-_-1>E=B<(H*q#ze#4}1$Jdr7p zNl45hrSj$+V*TeRowm8UR?+oT3Gs1t9H~jNXi<$PG|LwyiZuzE1wxT}=EgisyiMNv z;R%Tqf!0|xn8Z$;G1-riXw!K#-DE-nl}VmtoU~+`YaD}UMp-$w9j%ywZ4eTrHdS9b z|9n#q%-ocjz2l5J6`4um(6mG%OO33z-ns&LNDDz+oK`|@x<4klk#wC+%-6ysC6!6; zWHg$lIZdKPb9cTsyD9G{TjVu+TSST@OIl0nF&KW9@J4MJqtS#lH(0RKII0vitIi|l zYl+FIVa-&@;S{h292+7g3B;M`c8(gQ`yfe;tox{9RTo!nv`*tO$Gk1#$Lh8inU>NN5@_W( zD!V>BiUmzEolAZ9S%G2L?KeN1;ePhN0nLRxlhX4HB8Y zvqWt@+~gp425}Wm2>UN`0Xqx-|C&ru;VjzdW+Djhoc{mP#cVoR(NrB;OQFfvVwzDZ zdaszGe-N#ptu&^>mPnylw%#?e_!_$bW#QxOSjSbHtT0VgQ`y$ubn27axv*GjG>KDL{7K0kphne1jFb7Y42hzGkV6<6hBgWqlWTyPGRJ|s56I)Fm z`uR;J6DZV%x)yg!<|pwtF}3WJ_-I9wjKSRbclNaf6?Re&fF+4Q; zS@dZL8dDRWE=|TK1XnS35P`m~=y{yHs zocicQp%0|_hHWt}P~{{oLj0p@f!=YYV5W7{3>uo-2~&ficWyQPm`7^VInvi$=!5qZ z?*L5^b3)|2MLsQF>Y+)|$ocE>Wbc!?N+=b&Fb0v{kR|xXqKcX?h1QBjoF9KFmxtq9 zBG_;>tZn=oBcbY5%d#2RTaeUKM+aKPFE%j0OEw52*sG?YULVMkoSJ=`8fPM;^42ZK zXxv13P%L#riJCSqR@8_@-(XYBoXq@oJSrnvocIK3bV>ReQEM<2*Z8oyS4^i`mZW}l zOw#FLlEg^Kz}w7h<88cN4z*2rEfp|Ki~9ZtN7@a$xPpE#Y!iaSv*$IVmO5^d+&HLI z>tPM0>E4>kO!-$rXD212(ZxF$(p0g`)#RvY8WmMsKtp?4Ox=f!veLsCjgl@#G)1w@(k3yJdPj+)OL}xN zy|qlv!|bWwCl7y6%B!wzEXyk{EyZ4@yi_K6cC86S@y;23jQ8E1(AhYv^gU!O_*D25{A}<>Fa$go+f?9ktC^9#_>f%dZKGe zO(YgRSYV{Z79}*yEtbDpWJWbcfh{B!ZdB*#tB<%lUoWAVE_a}OHx&|X#DZac>NnPg zN|TVJQfLxVi6saQM`+1L3%g`5 z5u?H+zDA6C#YU>8Iw_WG@!l2zQj?iT>267x658q-JI+fu7C3>%6gGIL5KiE7GhWqd5HH?%26 z7tw~6rbN4&sx(VRCHzuqcoA?dVEEcdI^WtrJ7lDFrO$SIe{-$2S!Ju=D`#{ zi-*@wTvhsLGTPbX6bCu&z$Z*}O~i_U)<@&>m5CG5bFH>Ia>vVVLFs zv{*w6V=k>of8iuz{ok>okRMi%a&|!P3u>{^sRh&~MS7YZ(0HbvA29bXqofDNH05BP z7R4uiQ4{SoYta~;RIBl(9?j!m7MTub;W=O)XwZC^(IF?Q`gwCxQtAEnp2&D*NYPQ8 zJw{nfaUL91O38SXC9$tWP>FJu77HbFqsC#LwNI{9i;4EE6;6FgCqnR|*h8g^th3Z^ z8o9Qfv!XbBP#nlUtIMiO>K2B=;W9ZvF_^&|$0x(;F-60Zht$$(8@wx+B;AuK5GG>& z_rFEdS|Hd{x7M!PaZhC2sE7(kX?iAR-H}C^bz3N6%(^ABGQ-Cx#np9H`Xpy!;f_`v zBwzQ6iHrXr65TyRlc0z^!IsDI+6S@9GTFT*ApRXximX9Wi)v02MbM2DW*LePN(du_ zcJ!5*bFTJ%leu=KxHYnba@_;1t$V)VgRji=o*qIRR8^F^GQ;U!)m$olz8VSDI@JrP zW##n{)kx9mi4$8YV^m7`r1*dRx&|nQDkbB)F>TJcUVr5JU|1k9z9Aez1x^R@HPn=l z3qQ0kyAfv~8BUy>niL}7S;${HQ42Z#H z=(fS_0O)Qr(ftCqA)uqZ+l^mE?=);4g?)ZZVVA<~GlbpvpBP;`-0UUT|HB5q8eMV`0BNB8}}p92-n@JC96bqvm2y7ZbnbN2js%aJ$Xq_8{DbAdb&W zVLRYf3c4U{J?Nv5YQjk2fnWY8-d#ZFYqh9wg4Xk-vj*yrm>TOxwv=Y z+6DdvxYBQMe}p|ejjaW~#r=gqA@Xk-a69lAum$J<1_B%4?*wfcuI?e=Du7i$Col?O z>31^ZKMeR8yT*J0YzMXi8-aDeD&T$O?Y96V#hx)~*as#Jd#j{j{}sp$_aLq_fO3F- zje33#MBKY@f53P~-ev$IFaan4E(ERsRsrjP&A>*0e(Pc9Hvo-56)+bl1f~I5fEySF zYypl04nU{$laEScuLJa3j9qb;0n_jt)ZK2y^KRVVjVt|HaNnliFVSiCfnNp6#ic+! zFdWznn%9A^fWz=S4mcN}pA&9DAO{!&Q~>vZ*Kk~i00V#-z&^OG0WQFOJ+O%G0s0Nc zbujQQuoKt{&~H8Tw@TOH%lh?jIw2Kb?&)OYN9!@{k29}I8*tL`uVt0k-G)wuEiN@e@6(_8n`p-D!n`W5G7`xg z{5g6KYdKTnTq>EHyO?xSqNgpdzP2Q@v=pn#!`NTQa*!vRo|ips;uM>#Z4ZN;gtP;M z`N9Wwc^~aOG}h9mpsc>SvIZ;Ci50P7fix&HyQvbIERDGy)teR=7(|UkgLQxnRb>-! zm>@NhnK<7i=E~!N+hJNbZAlEC{-Za~1+}$R6=hX*HaWkhxGr2#8^Pw0y>;$3c|v79 zow7JK<}wY_32boh=?#&(hKTldh#xQto~0D)6dcQ_=g9QlXE&79FU%{e*XG4*O86c$ zWjJ#r!Dm8!*+mUyH6;t#W4)vADRCTT1@e-yM+`UpXuA*l&}0g_0Qq>cSXIV52-pFM z_dtv^?$)34%XCJNac3_aMLDaoY{B$$(ihv~<% zxcNCv*Dvm8=4a0^?D7OQzM>YpEokLK?_FI>a+@94#H?IBzz#j&@pN7`**LNT4lx=?~8 zH_fZ$rFA0H&iRBbpdf}LQ2lbvWd>djG{Q|k2pOqcqq$RIsG}fo$WgdUVdP9J$fNO9)3#J0TG>UPIg=M= zueDDt?}Cq%;Dae8c5SsJ9%4{5Nj^QGmk z>>VKxf(6d2s-4Rhv4g-&Hy)qp&!TuMtLuW2OrPelzoZ3Y542NoJOKNKxgC(d5 zOBy2~td=*}kK;SwuwQxwDrkJ)+$pu7JbW+O;z;fl)gKfn)*)}k^!%=K4-_lw;pGCvbD?Rn#7l^2&F z<+_Sx?Bg-ZF4Hs}_TNL^o4zJ{ zO;Md3RA|Z*DwloH0w{(y4>lz2Hzx)2luUlZ{|C>d5?0(h0K5F%vVaAe5Unn+=oKiZ z4L$xK4Xe(c~9<2ew#IyP&$bX5sIy4z$9Em|j8~ zRtiD8Ys2JOVzegAWJ~&lrbe1Vm8e4SFBGnfG+<1jxs~$nVAPpi#oZBlKD(CRH`HiP z5#%{K548(Id=OG^V{8KBFMe<=DBV#f3cI;3C<&u5;G7(Wi*}boz9`$MW67ApBZ_w|%U zOn=S|)6*aps>bNI4*f(t4q+j5`YR*)Blg$TWUH*zg$*@^>uA+@IcOmTYWtD}rP$3j z1a6fj)pgiwo|RYC)dLADyLc2UJ1O)IWO#kTNw`5p^t$5bc-Xk*eSn- zdYTyf7g>Ov9i9lrW#Wm47(SbDQauV zFkBBsw1dtun-Z!o;|q>Mx)0?E^_ofUGCqzmym+8fAPe#jomMcy&dQ+@?FKs}Yw=K_ zqnseA=sr}&it8#zSBFP0sH_={kfZA{O29Z`bd@w(8qJGr90hU^gGe($JP+z>V?~OY zB#s9uKfEv;DXTUU#q&WmQCVvyh~rX?4dyE6E{t?1E!NXjm|4WfQBhW0XYscS*<_OA z@s>vW`VY&6N#X3-UQ^178_N>h=k}uhmwsBkHBcsY=fwD5TP4Ge5%lRUD-9deCm*vk z^bP}OTVkF97OOw)NH$B6-Nd%&V@{21HV%V{pRIx0!{lb3RALWfrh?aErO{dz^ASiY z&YmI}QhE<2UiwU%F>iEjFMR04Cz@*OCtyep+t0)76(!>e_-Qjc^UCTCw-Xb2c9UzqW*r4E#mq3oETcPis-W+c#)+p?&aE%5UpOA6G|b9P`H(*am2eK# z5dZi4pQr%=LeZ@9lolcVf1-T9N2a4v5dRVPhfjDWYuXpVry6i34SvnqfBZAf3NxNb zf94-O_xlsqg>nK8|}#@k!fymDVp-IK0B2>PHKjFoVtjM)6gwXY0sg}`4TaDi@~5pe9$j5oQePXcEsu=GAi!N5t{&4UjmW@&t+E_LC9JHC z#RgUx8Qw@emMqX(1fAQ^9=O?tYT*zvj45jL6Bg>vaM9*z(P1jZ2cV5G+j(W-sHfSR z&u$~xQ_334sxqqRzi&iwIJc&;c79p?h>V6xz6Y;wM0s&lxNJnm*eD_lXaQ z8^tHYr^T(}Ht}`w9dU=)DSjdD61&8G;xFQFVsELRbfh#u8YB&sMoEeklqN|9()m(} zv{G6lt(E>JZIZS~Z%ZFZd!%1+Xh?r~xa^c4kdL~ z^EB60F1NeY-QgbT@p>-x-0ykWd%(Nex87IaKQZub;L8BZz4;t(e2SOXGY!BMr zvhB77?2GNs+kdu~Io3E{RgQEX=L|SMbAFE_RQkC3yJopcT#H>TkoaflVYa)kXNYHv z$L%Tc-0XSSGu~V7z16$fyVKj-m*ETeKK1?NJJf%yf0}=e|33de{JjJH0|Nr51SSQF z0~nTL{KeQzaj@i+ilp}>Reo9iM*dZP%67Q@1pCYO&+U8d$0@^=8OnU6Mfr;+^7V z@dNP_@!!bDbZMmIk!DDjNxP&p`FMGPJXn4<1pn^Wuy{<{7aQvm0U=^R^6bs!=lb}Hac6KFF49w`Zd#&3mGEhW93Ki*L67O|mH%)B(tJIIR3raS(LXDfN|)l4aQ=&z0B8&&b>4 zPWfy3INK?<3AX9B3vGX~-EVu&_PXsW+g{smHn+XNe!hKyeVP4U`-}F&93_s+9Jf0* zIgVAvDwCCE%FW7i$`0ihJZhdPFDY}zM$?cjQ5~Gi~E+b8L;aOKf-BHrc+jjj(swf3pvB6gyTrZgH%4Yse8)yg6$34PqzN{Gwn~=!1lGUQ^%vJit{-sR(FpfAcagi+z1aP<`xW;d_W;jO z&q&X7)CTjBGf#Nl^6d8P^&H`4{(gSZKf(V2&J<*=jAfv`d|X^9JtTFYCfP5YD(Bh0 zuup=uJnMMZ@u6d<<4ec4j=hdw9RGpN4p#;!$15i*r@_w0DvIKP7AGpxlzin}*nK%H zzg}6OT&i3ND_fzgR{o4qe6RATvPF3V7WcLCqtZ)FS5Hz$s;Zi$o~>S>&R4HeSD>6c zq&}uTr9P*=1Uvj1`S62!00;T>a~|Owh*F>7Jl#3UDLGxR%!#O(&vDLm&UaqsTn=5V zb3TGxde-@}bEorb)LaK(tNmTapyoZzH4+xccJ@y=jtP7b_?hyt4Sfe(CP;<;@s?ZX{T=yQ;Axw29jt&VWs?cC&i%(czc;=aT)#_RR2_TJ_F!uzY&>pRwe zwSSHO_`vA_9Mps}tQZ?2U5xtRSov!CPx80&0r_Ryd$t`K=l%8z9IG97IUZJW)CKDO z?q0r&d@uWc^!4+f?zj1WCAm7eTrRY%ij*VGvX|S>cYNn4blvURg1pxd(cB zLx!upYrMz#PDi=@$+y_w;=jxPr2k$2=l-FAv8dC_k<#sfZ-{3X&OF8?C{7cv7Vj1x z6~9C|og!T*T`9dHeIflUJtLoD%dtglkJ_HJy^lJ|XP;}Yu{YYUwy&{2WZ!6i67~Pl z4zDBIQSMlQ^7)$MZOAlSk(CBm(OTsTl!XE6EVWF%Ty0g~Q#;kKP*MjvZO#hRPIlJ} z*ZHo$yFPS%;o9$d67}oJo*b0TCeISj^_~|!eY}}S$&21^ygzsc`_A>1`jtvw^Y zAig2KkD7UxxK}(NW=O+OAB~bk$u1QmXO^LLeFbSAh`xm?FOpZu8)OCb(QMml+t;=+ z_Dk)99RFR~*BK2yuMZH74M_uS# z;#}r@)cGq8)M|9ia+kO-MoDRLuR}@M>VDb%j{8IR=kD*c_Uuqkx@WLQK`&-K`X3uT zdpu-4o4wCM?_+%qpU-!t?^@pqw8mYq$8vv@|2DM8_xO(r92+<(P!gyN)S?CGK%WW; zMWwVE_0j~fP`pT7AYLYZjaIprunS5*P~TF-|?p7Q^${ve#&4a1AU6Slyr5FI$U+D6VxecfqFjbov?a|`mXx9`jh%^ zwU=|2^E_v*Gvd4wDW*E*HRm4ZA+B_-|2EuZcez|a*ECnY>s-_!)u?%|a9xA`+-;~w z)}tnQ%C*JSf%;^JYnSUg*8vGEq|U0_OyZ0`mhG1)2iaqQu-2c$LbFh;t5+g~y2J zi6!EEajc}G9#|+XmA2xLwg4>kukvH^)AHx2xjO7#M<1*v9=R!=i08YJ#X7(8(^317u(m`-#}k4-%;f91|C75 z?#sZQ09u_qoNWo4=p`N_juj_iT-PWr5m%#Ew-LH}9wWK!Vw!Y>G)D5HMVcXD(z zalN=fY(os2(64XTMvT23{T%6zfsR3rQ4Y~zN1v;}vDwk?*yhMkhAC$#qZB7<#3H3s zsZgqvh_W2xkoC$YWwX+*Y*RXwE@hu`KpBXdL{#mlN9L$SYMmNE|7@|^tS(WPtLxPD z= z+1U?0mm#hU*BPj7@>~V3Qq(q8sBM;`rfGGxVf47kwb`{5^~^Bz;`023{!;%E|8oB- ze=ExCtNuX&uU0ZE0(B^r&4J~Cje)Ibr8@&(QN7xV_4Lr2SIiSj#VTm68JgN4c3@2S zGg|C^u-ZXV23j*w@}j0Km8ztO)GW11>tVs0r5(~|(r#%V+MNvf3|W-D@*KHBUWyiO zquh=W$!@v7ZJ;f~7PL*VRoR+sYi#RmTWznR#Xn#hVjpH7Ww+bC_AGmzz0TfbZ?-SD zZ?JE&zindwf*Ywf{^W5FYUaWih<2=@4sI@ zpUgRDpZ!>S?X}ikYwfl78TW%mPqxS7$-%#Edps*}+u{lbmdW=7yE5E zd4)H+;pD5Q-+HHi*6f)-oPFc%{;4Z=W=}63@AtepWF>u4ctGay2SO%k_bZ@wis3Z>YFdt`Ag% zah>qw1Ec?f>!yuH#r1N%U*2!p_~X&cw`t=ddA{n_snglkH}$Nl(&M>#K_AZtYyYd- z&9m2Yihn@XQ3al9=-L#Brb%)negy(9! z_prSC2dJ02z`AJ}*K=aG%#GoB&&?=AfY^7ZA8s~3sy%1+%{Rtw^mq>LMJnp_e2VLj zaLxD&0=#onHqYjKyofu9nuKe{U(n-eK4+H7D1AgYRIb7q!DH+JaeNe{_gr|o-z8FeE!!Gx(*Il7s<^I0^T%sC#Zw>zm} zbN)m$7fyzc|3Wu5*}j`+6WZM8{)<_2FGsdu!+EXh@+THDb3?o&bH}Ksa`hBePnGJ4 z<&g6d^`xt(hMUXWL=Y8JPx@k z4-UQSt*t<1?G+-eaV^w<)wXQn#D9IO?K>V6x}N>-!7s+HsNo%Fbc{1F0#^ru z)+!8Dhp(IOz$grvnF2)AdFVkD6(kx-9R1HyM9ZH2( za4OJ-2GNOloVRG!{JGo>3dYfPqc%uyMA0SMpx_cbFU9jxJU8RH8PA*Xycy4X@Vp1l zd-1$ClCZor&!H}DkOyf6NORy1`te+X=Mt0&qD&CaRd}w#b2Xl;bz{sdJ*m%%^z4(1 zFGWkctaGmUj`&jTMV$6RPJ0ojy->A-IHQ(ynZ}}S){+oY2^5fddU8gffKsxM($gO? z4n>T;y74|p&Kdyv0R@kYnu%&CVnV#SvBCCjo#piyiRxU?ejg)oGp~JhBOIvGmKmGz z)R4E-+nqJMnewDWH)aINC{%)^gej@!*Y|2)PtFVYLsy5c4H1%H$gsl3r@HY;{npsj z%KGNmuf)R>e81U5eE!}E81Fa(d@-{T+(dy@daZ0!9#zt%K0)nm8oex=3S!yFG zT=wz~K#sb!dtP$fiUGn~{l@)G8_MbW+<5f7hjF=8-4>c$Mi@3Iqc|@{VV=r~ZPI3W< zI%+Q908{*IwBEv9y0mWIzXWJ=}YYno8M+t~E14jvfTHPwN6&IX)VyE^%dK+-UK3W^^ z5WG+6N}vMZmKfCyO|M@U>!TZ9yQ+X=Xa0sbLVln*FtNJ0*G4O>q1**J8$~23cVe?Q?5tqNqYjylEEz#fwiP zQ!Ox$R#ygs)RQj-9>LqFnL7tOQ@XXu>lx|^4!3RJM?ds>f@Q1TK&hJ3b z-RQ7=kMOOwtX(%$1zjJo^7`hQcXY$hf%j?21REr}ptD>Z@Y}w5D3bt5durC|iPn;~ zx`H?(747M9Hrh<=4DGVdz?!&Wz6^#wVp)$5D#yvhwCDQuqxJ z5uX>R_SBphzr+(e4wG^<=834$?o7${ZC+1z-?ju(i8AY`0n)qa@l{)aXHV?B_$tZ} zPwcd?VUX96DXfH_v6y^8%Jy0ZZj)l)Z%atAo}v@V;lpT0iOx_;cJ@h2%OFLMPSI1v zsWvn@EiNHE2J-os82GXneHH~+j5bQCZ>xq_r~`(s1tgSuMSzGMqbDsq#IGpKh$MJ zqF@$^(hm3qwJ=EuMom*5KuTqy6}3QzD1&j{n7=3iG3aJAP-gokOa~24{cAH|kDB%J z!q^d^y1({TuP0PCw5Bg03!vh02Do;I(Donk3Wi1%)L+lEMwl9evdY+2y3Y2U18%Ly zEVT|zMa^+@Q|&rnpmh+H)A}xC*3m4dzZC=+aF>ufIBgJ6WCcd7VLxG!dcFb}(c)%p zS;1&+*+5V6mYTl0-CVz}=EM4}HK(%+EbhRW1vr_6>X8&N*4w_1(ck@*|Mteta`FnF zL^%7uMpOWkx>LmApuZy7ZcQBSuPr)S_`Niz)X?dMDbzvz_X1&Z zQjbiyH-silzW#;`@?YO|+a*2eZ~O$1n}}H>_pYfaaqI_vB2%Hq>`d$Ae(R&4Fs2V3 zQz4l(e{6@AAvP9ez3D*{J1Yl>!<1SLP$^kXq_5 zsrOy?jPBVV@Y4iG0WxO<8qqn-8A6aHn8_eHb037eL9CO?>Ty#KLB>%-+ErQlZZvsw zz|S98L{VrRejf^wIG9#N+L}lkAlz^>8DOk1h2Og1RV5w&Npc?*3lwSdA+J3lHOKNO^PYgov>@l9*dqFgrV96pS;11#CEIy$1&n@e5^d zUSMKDRI9+f(j4)=+V=et-kS2SV%0Xdq@o}`cZer;3hwfF2Tm`aSWuI%8#{F)C`qvo z@z8y$q~yi#MxNuep>+TV5W^}mI9*C5pXlY20)DOjT43r0Z})K#HO|!_LfdyT8bxB( z@ZGv`HLY71Q|Hl=5`kc}xE9rkw5D_;a!@aB(G$&LQO)UV`?}z2T5rufA8gVCpOE=M z$Qs}(Z8w#v5%?**Lyqml0VzewN zod<9!$k;|=O^|B4QOl_%MZWL{V1Br4O^Sw%T26x*@16POU0BRAUqFAFfLXfsgA$Up zk=r_@2hVZ}FuEY?PX$-X)b_bm^d)odh$!{ddRo-K)Z@>ffa4XpDm{~*hp{s10&%o~ zu@5QzHRLGKjson3BvCJEd|6rL7zMH4kzHxh7*Y^81lY0*MQ$92cBtJ)AAi)2Ut z$+X`}Ft&4H!-chF(E#ktyBqg`Awl{@DGSD%L>a2omSKbsD(h0K{}sT16?e;AC4?G)E_30b zf7y28pm&aDF7)3gx7xxx@Fu?MI$+;p9H=?5*4`8McwX)cid~V1AFc90t^E#?v@mqO zPU~u9r~P+|6jR#U6|VL+>|3?BQ8%fgU!W<@QsNGqK{ksKee-}zFaxwQz5YY3ZaZ@6 ziB%N(o|^NOE~uM}NsefR%n&u!h8tqEfjh~gg8f_Ov+jljX`%Zu7p`D@)dY4hHWDK? z3raF-;Pio#&@x#U3YW05A{gs_>*IOpTDrzV=EYZSM1yWZZBtn(3G3BUnb$^4Hp1{1W{R0oVOht7{Pd6WBza8S#jYCnR)e-y3 z)UbVzReMvmK+TYpm0(^`VtHXOa>&MD$drPUdTng75}(>O=(TU#Leb92eVD+MNu#s) zRsU4Q2cS4uKa7i>d^XUK@H@DV11*(4p3Vz!{(!96(so~AtFS~<>YcKv3FN?#OA#E9r332UFpIwGCD0U@SzX^KI$ztoaxiWe@}ZAEka;_q69V+I!9oCo++;@ zz>1*%>l}FW>CnJpa{ssGR#tJV2f*-4C9lY|Jn&kiu6EGX@)$ zlht+Oah)7mzdLp;x$u+onYI}+ickASNscNf$8k*C)Fa0hLz8$zkO{= z?~=;#Q@XXQACTof!oPnF<@IJ|k6(LjN?tch${`)X>!kPvo)}E<)w;PTuoUC8(gXQo z`}Y0-1Cj?964Nk-i$tGFyNjlSlwfNA7#HhitgDuOh=sGoc!G4O?+0$6iJJ|FHr(-e zqKKkGCcdqAF+tPq9HeBWGk_0eY=bhI`fZ6@W{F@&G+70KQypoLd2HX?6A4J}Ks3El zN>NU@b4e^=@s(32XDI6roP|N(1Jbe1 zzlhb=383u@nFRMV5VY_h2}@-Xv|(7<7ru)`PzK+7fXDWQ1^7i8ns^-C)3%Teh`EoCOO-baXL#B#6)`@ID z0i1F9dzoW5a&+IAl4qc=en2MelX zw;U4)5o;kkTpWKzDcgR@f)dPv63EP4tp2O|ug6S=5s`_U{|-Nuj&?@u%mR4Y+lx&o- zS25G=A5!NMKH}?(i#bmvXrpH?$a68Q)7sKa_ZfH$94-|S^{)NBCa6HBasiJ4Is z#*UrI`4Os$Opg$8wr>jsxcLAlZ`aPTeJ_brMmCIApvUo+58HHs}KvQ#?V+$#d@w13u5NWmz=7`*E#ZC7hLT7Y}LIt@7AUNef zXqHIQD`*E04;6^7rr~sXi8bht#AWPaE|aI^ZB&d@KjypD5C=*@V>Q;DkfRi@CGgp? z^tPvEBsPg5rt)$2cu6GbqJZ=R@^eyvUggIm&L(194|n37MG@m4DZhau51`l#eEk|o{X33f z%fOC2Dzzz>S`#S2V@2UOp!*D~5V!`hL>?@d)*dYMl6I)*I)8*eW9dBplOc*=KGBWO zwfg%|6&0J3(hs$vaXjGVgaWR7t`Vzye3@=sB96$jbz`jmzYFWAU|7dTClj*UN|d9n zy`oH$YCD4sxB0Ctd}+KLESotb_7FvJ2`L_}q*mVH2L-{n;IEI$G$OdyjnM^BbF?g^ z1>uLonv6JAPsR)7nf?B>M!meMpk^3XUsJx>ZUjOVu;Vp@@ZRXJlN7hmO&j|pVrUVg zj7TaGzinasJ|yQt#COBNJGUTG-mcX@gAOn~Vob@a$arK20R)Zgwn!ELe43A7U%Gmlz%vqEQlD#Mo0am zK&xNkG#eWTYSEKFDCoK$DY|hP256IbqBZuX13gtP>V0~0OhNYyJsARknx4#ylzRXd zT+>4di*8JGzz3)i10_M)`SW0dUs0$n zt14{J3quVP3PbVx3cXtWeDE)DqLa2?-FVBmD#dHe&P)fFu$)aGY2x6&{a&eJf1tgBni%_m$K+3D~Y6eE}0P2h;N9SRt z8x80SY6e7;9ybl|3*7q@_p<)12-jVba{1=^^Hu#-nGJxGnT%?kWNFU1ciMnx#0o@(jNDoXr!%An=J#m%+PhAsLYMdwi$uCHN>Bcn>}5qU zLA2$J^mJLo@GFpp{JT#tKcFpSh%RKLo>-^p<(uvr3P-38v~PJ|FJ7&eTX!9$n>lB) z(((>n8+}kWFN1TB0`4M-h&x9&^)vML)vQpmT>7eYFF=RAqt!itx})Z-Ga`w9?TI8W zJ=pD|83b9>VO@tjQDbj+c4g`QC_HM(J27%QAaT&0jn*&DrJq0Nd^oJo6^QErx_OP) zT{HUHD7@1tt}kJ&$x@OBh-LQ#f0S&K?)E-n3 zeh3{q7)dmrk+B|i7ud4}t8Wxf3B)+=IsxmhzROro&%YoRTV!00h>4||4y;v6wAW4y z7eu~pd_P*=r{?@<`NkSpgV*L+Ct^LHk|#NfLRn9isE2~m4bNySODYA^wA$bAtYSs!88KW{6>*b+>n$v(Ctl&vf?8EM3-Kz2%GYbEk!}`TR zDusJ>qYB;{EC`-03xc{oHLzR^WQb*Ec;z?_?6l)K58na2UMf>?u;C8Bnv+p&gfD@P z`Y$l3k>pSj8$A~i5{T?TP}vlYzn&U5xH0a&EGxa<6NL^^7=@DJ=fW8k6^7_j2I{VFZXz>iI@UASl%*G=Kq?Y{SP(T@rnO_>+Co_# zc=Xn>mOLr)yY`#_Z>T0=NoL-#(se74(WCuNTh`L@{_#wY|J@t#wsiH2zvB%x6oeY| ztWZM`(y|$?6=bZPlQPqmfTGh>`>7`3TvSb#Hfz88pEuj9O_F%tgfKj*B{VR#=Rb`Y z2kAa2Gjr&(@Puj)(nyT;!wpTwnrt&?4x)sDaEXP1{4y*mhLhBp!NCPnx~`Wphp4&V zIVg-i8k?LqcNTj+PiZwn;-fsV!O+LUR2?t~QY;MpAGx2(uGtuAv9cH68QUGB+%znm}f;ClMiyt zoM>y$|BZt0SrmzaPUeOUD@vm;Y)Gwdnq7ks0QCQ$-qOWBu|qIN*{kW@nBqIS2cQ75 z8=ZRgCPbrHm!GK?X3+lK2oxj>MOtxIYRpIhSIMA(uU;*fT)&?lHf|2gB}R%E>HsnUMyyKX04Zi- zsMZ#=1YP`$48gn}umx%p2vN`4^Q+B)L5xpvhn~Hq5~l1Jx(G&ujCHR3)RuucVKt2gs|F>` z8UijG_gSH~V785ECPzmi3`k20t~TLkik1dk-+zV zg`d$q5tQ}6z|VJRKbqab@u?&-&h0TiY(JQl9w7pdgE0d>vSn!AbcZHd+#*A>N)3%r z$an4kx3`}`AWrkatnb)9W~k8q7Okd)Y;sZj?kv<54os)F34B-$@#c^9w@xbnE7Fj* zI*)Sh+-zK3FYC&2lO4KuFBF8Kmae|Qn^yNrFtj!d@>MrS`?X<+PA*;@(hBQ5d+UnY$N1CHS9S zfS+nVekSs>{ULWvf;CZQEw7|@Cc5Tut-=Kp(s`6l}Ozu=eu9X~rH^fmmP zNxq|xq~A#PHiw^G3jSt(jv8;K<4Y4CU{&|oz)lYPgyt|-%s1nHe<4AMsD73-WS#;HzPmauI0n#O2%^B3u=iZuZKc= z8;qiR3Q1elsB`Qi$WxGC5{6HF7@~4ZKdh|ZuhmiKMJ4d4PO$gss)-IZf%}7?qU%<3 zePj<(Vl~#or^0@~lv}j7_^W-|bqDNC5Z7NdqP&@Nu6bh6SSwYqShMvbWH!fU@u9_D zyHA_QE}YdIGB(rMb;{_5oKYb&=rzZB`RsR|v)qUBQ29r*pXmN+scrdD6WTOBVw-63 zBjp}R>F4S8+cVmKAKtH2`|bam_P?6_gxwY@|4f^|2^w%%D}oPED+2Dw9+=`@3M>U) z80sLivhi4837(NJ90=m~YWU9+Yi6Z_KvPm)R3nB+BH|db03P}m196lr-3|3_98?=R zpAO0JP@$n_T&*p8Ht+}@IPHUg{zdg?ZYc4t76uqpsisX!;lt?Ep2r#_i&CX=rngA; z+F;#>&=HO8#oO#xyR(dKz~v6T<^8O2=HSN4`gd!Fhs(~0-H26yV1p>*TxX&5f#ZW~ zIpMM&X2tqiXAgj~P;PC9GqrmJVnj-!#aMuDOSc~~2BOtqjbwTNt+P~W#+f%wF zS@lJPn~(M|aBsTZ8Y+KFn_mUJJc>DRE_DYeUFa&1hIsMN4Ga!(<^!mb-+(W~jw*b8 zBKX?FPP_Ob1{{37_pSJ9)t-k#I0p+I=<0Vu)9JAvgpEyKizaN+nMO4A=}-Jv&*$NC zHWoLA37Xoeul^74Q~e$A<3z4w*ApgfsIHemeXcaNR2rYTs?9hq7e%QrV)_afcU0Ed zv4W6+iRSrcXj_rujnV8~vQG6XP@pYa6o}(WxgR7p;XJUYQo`vK3(Pfh`XxSr3vON@ zFMC}y83^c8*HNXd5??b^dMwaUF9?q@Pb?f`UN{6$^$*tVkL9z);%2+U%n5cw$@ZBaz2g5DoB z00pQBt|(4ipdu*l1YUeuB&HPefubmn8K11!Zx*{tKBE|Pq%nN%FN%mBXY3IH8a3V* zxvWjtPZ84w*-R15`@NY$*=R}Z^=3C?)8%H=XteCpChwI;rvW9(m9U2N{b7c%CWr4q zp>Yt}z}QOxi!f1CJ5z%z!f(eelG5E2-v4F}K%EwQtF3)lBnLztc*WU7D>^7MN2dRQ zMOu}l)UIo@T2MkO5}G)d65`lOY&0w06xN={r88u&yUZLI={`GbUg7PPHpCGqZN=?& z2LwvH_Iz7*Ynb}GLTN}VY7S+ugWPVnTR9Wpc4ABBJa8uD{>hvNLS{rJf+8m&3sn$@ zD9$NCk|{7Q0YljBq4KY^`3F)`S;<_H&5Sr(igLZhvdHWVsSKK+VMe;pjWywHTArvQ#7XLVd^ju2BKWW1Fr zk2hq>W9%ZLAjd+~g%3~~Zz|qkuLJTnfEhO^fj#19p;~2~pTw{@?ts~3?Zi|~CZ4Oq zUYd>;y3Y^oZ_{edkbQ(P1kk~nL*^ZLg`E%9FF)hbk(_(*@C`d?1&NykZKB!BC$;~ zup=|LYtI>L(e*XJOQVCAg|UG!Rg2f!9oq99-Pt|xBBuVGg=xGr(@o`~Q$q23 zp|G6L6D1q0#J}k%1NJho;ecwx4uZvLSWG-IkmSscjE<)I)|+jf_=t2lE1%Mp9`1$LF9~9 zw*ct2T8Dg%PG_Tvkg;a8dEyx@|H#Tvs(yjo(AY$&3)yQjw5n!uX-Pv)F`3!9ABOuZ z=wKO-+2+`6_p!44z1hF)A{0>a%26|vJg7F*@+!6G-%IH;>`!~hJn_Pwu=LA-#m-dl z{uiKx%I(>YILh9iQeq{o>_v?~I8x=M@1X2W?lIknJr7qH*B9t-s4U%DY3!m4)Oa6p zd_NV-g%dXx!{X!sH8Er9d$4FEK}>#wjLuN;tM)oD3b^>4tZuAByc#tJ4uje`?i-J4g4BAE3sWC(Z|W>+#<@ zO?$g@nznn*r`oLMKkd_IZT{0Vt$Pdd+&4G@&ycENb|)J@e_Zjlh&eccxTbJ%a|-^D zk#n?eUX^2Xw6qkIcGSKj`fEpWjHAEWt?-J^KNeELQ8xsG;`D>O=(%=A1vWUIyG5X$ z-J%;gr%l8N!|!e6|D`kwiuJ*j@JYfEie-R-9Y#+7QMor@N1OHlJZ%v7ke{HI`rTSx z0iHPm=i)7CDM-ZYRBx-GEx_+a4R_+@=7r)BhN5M3l3*(9-c@6OK;jPIIdO$KxNKbc zYAvw@&58!tW^_b~TcXA5r~>IIx zPtWd-7H^7XcOEewboB)HVO;v)XK)dRNQe>+hceF^{=B(QyDzu|KNFYo@iqRe$75A9 ze)P?NarQEMb*OxsHvb$E$mkx8geoE(${$fc^=>k@wqbSejB{~%#z#5WIegIxxV5$V zm%+!tSndtn#bW07LFzQ^zTA(_LB?BU3&~8J}C0p7< z0S}akOyv>zF_h_03q5gnfhX3-LU5gjr%E8MLY;@eRUR|H0gYS5>p0|N3$WHIVT6kb z5n#W*YmmGdU&xRhEa1Wa{3JRwJ)n0?Vyj-rElgPg}7(jA`mtwfcsflxW{!O$p+U+p5Mx~+Oq^rzzPK0 za_^CeAX8cIMNA{jCd4+<*e)Rz@#RE36cKF_M9Ca}>&IWhlDtVbv3W<>EhVoE1fHTk zsTuV-^@4IxuY|cDS*_HVyw-1>h)V05?;dL7c$4;=#Nq7Of5Ic2k@=UF0^y-HfY99S zgVF>qVg5}_y8&q&05Br8OQ5>kCITJ{!~rk@q>3WOZCGRd2hmQ7<^Jl_e$ZzFvnX0> zKWGFBf%Jt%4$>=U>Be6UqJ~QDxp@Mkhr7K(y}KAg#(25@Z2!5n5|iA(^7Z>A{Y<8x z2DlKbEIeW6Pe4*M3Dq3gtUsbi6d^Y$V(+xtVV+kq+B^Sj$%)8q>jh*pe!UkkAo*e> zb8pHd*_&eQuzrEJA+vG4DlBrh%OYP5&tQgG*7Cm#ixdH>6ywaYeT8Q!7MTTzPsBUxfi=P+ zm}&r*1h%ow62u_?mHTcWRSKK|{tOLR)hhe>%#Ja8jTx!{Kc3{afFq5ap!t1KxsILw zn=7^DIRR@T$}ROqY5M?lYzCc0LKqHe0?%=1#q9+H3tOKv)_)l=2*HB_x%Z!*5?bID z(9KTWd?`QzuvQ_mjrs?oHn3=ka6aPEk2i?IkKM}Je>~!8u8V< zg;vi>3Da+|2M#c?Rc8~lQpJ=6-6PQFdegvcMhYW%&HTX-)1(kCoC1gb;PCy{!9(O1 ztpP>{T0w)dg|c+3@ui@v?4m5sPa3qkciDLIu>dzAG%}x`I|r69HHBb5i$bhIbdt+~ zcU2l1Aq&V`RQ$KhSC^3U`MQX4JICS`!3(0ON@OhLRY0)m z<|2X1`dL065POJF7q?q>JJ)_wfNAwO@5AoS4lYCRg6f;(l`IAH@bnEOFLw7?!h9!= zFajqYX1AXW6aX0*38LH;4Ui6y$C&&srFg}n9Nae&fg|gnYU0`*!vPDZpwn)g3z5hG z0fM#B8UYU^)mKnzkBusZx95Z%bj;Rkb@SN(PGF?;;lO|h`vn{#tlxvNfv+9=?L{g8 zsi1(PLG;2t{L!KKS_iQe2>e4~^cmT0Z?gy;m|>_c8VEWZ_flXlQmE+nqzmwe&;^t@ zTwe?vWI6LLyNCXykZNADR1k|Q$1Npd{8+^&jq6}j#9IiNJ0n#__{vJLWYB|JxCJ4s z04pQCfXjtmsz5K{QMWIN9sf0TZ?}D=PTe3Xm!5>q%X-t(6X`yO;FRe_EhC6(IMSq( zAQ|TL@qTVx~o)oFPGS*^8H{c<67H@30A7`Of-Ng8i+G zdSm5$_5VPqr#e8{9X0xe>?@r)ss0*aM+LcbR5u3MR~100fDsjsre*eY5QrnIQ+@$= zSj4_b$KpkJ-riOU@iAn=N^VZXXl9M0!I^s>B8m`V5`kgUxCbaE=C$S9Fe1<4jkR=@ z@Z$GmKLbwW1KVKvM=ZK)_`XrztF#{N`;~pQ2b-jGsPCfe@s?nbQfuV(bL`rwIImSliX8 zEo^iGi5K8eECFjNHUw}2Of?M%zj^B18k^41hyf!XpN$%Sw=$zS-MG9EN*6$dZ+MXX zb3&Im?45HebOtB?R^(R@6rRIjlxg?u3=q;2FN&PSCLU)K^}A~ZB4I2O?w2+dYRuWO!jNI6XDIQ(|{P5(vU5U?at@3kg&==_b4pXC5My{FpAHh>%-P$D6 zu!ZcQrZ|2T6JyX{LGY)s13T5let^zsU8M4IN0!6tYSjmIoyqt2;yo`8ZaJ06V`Gyha(|7e9!@N_(n$8)kALAQBUnN-qgHGYCJAhuyr;3^jQD+=g{ zL&bS6RRzPF+kti@v{&Tu+U=Kp37ytL>_;|^Q2?6xH?rWnD9Fju0TDn$i z^khQk+xI{EhPPFGyWV*V_{&gYBGR0|X~gNul$>03WTF$#3Od-elF;ZzQrcR{+6;p= zOS<*6N?;8t;Sos?H&d*S?K=tRV~DqVd@9M=_Vs0|LvtekIKTEItz#F!X}97nJOLjR zMU7WE;5ii6|NZkNi@w^H?BGoF>*(r%90gb#QR~$_l);eYc_{Mm>5FbH|2XL{E2Y zB(?#^C`LLV46XeylJBLvNNQlxKYAopGHG)(LfIn z9X3Z-Kv@J_qZM2Q0#}U>?LURW-Eh?9&t$7VK&vt)j^dFyKrYPbAxi<~3|WuydhgiO zcvYpx>$LQE`PF#oGG6du!rpe zO|5~vYJH3iv-F4BzHvTGf~X7oobG{iSVidoHU&L-tVeU?UWtcQA|AMC;mQHBTRMn4 z?VnYI53cxRFmbOWagV%2iGvRu_aq#g`lx16J-9b=IUG z8Z-_O_#VJlJJxGxiJU?0=FfkYxg%oxHWL6)zdv!XkG#K(?|-h|54&hNNTLRNM)GGd zc{h@~5&1*E_v1`>6$yHBC?|(S0f7m~exjS0drY0Xf>WFTyrTJ3|E>8LoVJR7vX?ZC zpVavK<9Fww3T}d_ITmf50IiCu2SqpzVZ0ix#_#Uufgi%mAKCL=8Q)!i?N4|$spqSE z1=tzfP^c%L=J4U7M($~joV6Z5=D57n;3c04GWp&vo#56p_bVHc=Zz78|Qqq(# zKFanr9u3qXBo8|r3w6_AbLo@5#^Mpjpn!^Yp{V2D8(V0#ZX^YbEnJD*IEW&&0$g>U z?R%4T83!TXJ>d>wM61bm8~Nc=crav;FMnk|NEi1Hp5C#GWnKV^8~r`qI1H6AiKQk7SoaMOYO1beeW< zEt!*65oY=7IXB~7egf~NX?L{k)BeQ)?*Jz!g@w1mFA5oGt>N`i{lH=F{knCv=hgox zkKWqC3sTMeZKr|i4jeYNN3rZ^ETsB_ZGG0e&tYRF*F~+LIrYqwdbA1adQ_!qzIBV# zmyOX`NEx6fLB&!R4&7k_AYG_nAEXx-=qolI82^taeznH0A9!DH`MfW;0Jm6|=-Hcz z;#bj+{AWN*=yA)O*`I2YT0TWIt3DMr+kG?!>9N6oQFqAN^AEIkYiGe3xMX+eD_(eL z`{~wza|T6kYq>dcz(VE6rz=;zXGo|YYtY=SQ^WvLzf2@puf(nOTU2QMlC=VN4ZQZm z-H{z8%A~^#z`^WWLV|ecpR57fTEKk4wEDB2oEPgyR;$Tg>V*lOCI#VfZCR*)W)di3 zIw)epQ7MY3V#q4k>MW=Q*b^iZS*BVrm@|{30~|#t5^JW@)OXW9=QuJ=+EelXtwMp= zRkt-(0_$yZsEI-lB66A^#9{ho^5Q7+*JESQG#F4w!NhcZE0ucbPOi1&fNgV4%*;JU zl^dB+?o_9oG)_)ce?8=pI;BEtn@1T$Q8PAQxbPe$YL2C-sRr2&M#QlI(DlY2Q6=b@ zJJ|_Q*E%LZrocW5nN?Y~@8CdIA*;bPsa(HDE;~VH6tP29M@rvAj+UNf;0L&I1;ChjRDfVw z2gb(9^#Ve&;8Shl{nR~hUEs$RD9nEjVdp@XJmV_w=UjzaTFCB_jEgEYc{NJpjz@_( zl#cngN?A(2f(2z#?{)c=l6GCLx=y52yr1tJaM;kMO)4p@R2wl9sy4tv}w1oiUPAh`ux=*ove*w3{M&52++oM7qPpY!y#X2AXMAf7-ShX{-EQ~upaL@gJ zHvs+CT`j3&C~^Lzv!NMg_7V6$l!5f zo5m81lC|aoB)7>YO>lrvbq>-fndGe0b~!$O0+QMjJQ2wYN=nKplMV8927GqmH6-ip ziMhD&bSV^MBug?8li%rln@sTNP+a1;v?q7~5UWIjIy*3-&JIjW%$CGQROTh>@|3!) zP?u(P>A)qKsDkbe2(DL`iRy9b12};DDbBv z3J|6=EN;$^ncsKJOROaV0GDnbEXamO%Rs#H_v6T42)CcjM zQcRpFS=RT`>o4T9AgK>toPaxc!4%fnaklJWw{^N>7h_?&^x#PdlXenUx}*_M&~29rlE=eW!{1+RHy zJixx&zB^bSPP0^FCwZLHFO~CAyoZf+8NGzIPsW@1{J-n?w`20oLrJlKdbU$vLl! zksl@EGhkrJLNGJ*)=9dtm{q_fA#4Po#}$en{a9l$2f;ZLZ*LCV+RMD%u&{gQzjveu zUuM~l7t)v`Ebc=8#EK7U%P_ywQ<3uIh^7=2$Dki}0sDhc4EH>4YI*AX>k=air&>X1 zR^yCaIpuB_=H^q%YbiKtjt`gD&gIRZaCveTZ}Q5YrZ9;GIQdvLM`Llu=;Mf)Rm_om zMug1^Eao722FWO!!p#C184iOGe@sHfUL*sN7Op(!9DO02xyAkA*OY~Y$;n%AYFyPb8_`1+ObjnG%>X;ZblW*7P4W0|zVD zVNC$wj^t^~9lXURIE3PKT2t8?Ph$mwJFQ!Aik)u0KoJ==&L8Jyx>#kBP4%5t5Se&v zGV6&Z&y6O}p%+&Qv5rA1Glu|&1~&ptI5n}-Xa|UXzW?NPp_*Gli7&iAh4s~Gy}d_Z zklE<#O1z>xbAPZSd#Ov%U& zbUPuN8)X|!k4^r{ej@s>A}~b%9-;{%sswCp(j7?4!8+zQtYsC+)DsKi)z9dx`SRCD zH4JhAM**kAEEZOPeF;zPlxz$&`g!1OB2FeIXT|I@M95*iKly@?ee#6{R$!UFzFH|O9s7C9-h8L>Q z050l?U>Jf*nxOYny1-=~H~u*-3*os=$-y{s;GAR+x&zr!gF$}+c9E3_$Cqv-WYFP2 zz^f4%<6dO@e(24j!AzIlA{H1a1r(LEi>yS&LNF)WzBALAxo6qx&&=&oyX105N)1wq zUQzc`nEb7KenntX*y^LO1&To(L?QpIW4B`P+eJa*b87T6*6&c?!6B%xnDr%Ab+Bmc zDzzN&q%BgN?#vIE=gI$YmXqLzK-sl7vYBaqW~TOpRLHiC#Ve4X9vBRU(JW=# zRN0|u;4sTxs>-$}n3aDDVkbX2ZJ6!5J6-5278>LhVx1X<%zW*5yuJ#rQ*O=_#rK*& z+|!$?@EJU8a5jYCB`_UF&DOvhE(uK}9ouKwa4U)u(iAkA@Bk84?txW^uc&cjA}1pp zP->3puzkP4?3RjXfz zlHsyfu7!FRn-(_e#J`F)H#k(6;FZKt>z>o0{9&%}1ey6I*$NapkqwoFA(BhNh>=Ge zJV3O4lTmkfHB;Pokm1fdw%Z-XF*G=B^7JnOIgWQmBXCrq7RG|7+Gnl!>;bBD%btV$ zh)P1q557Rjha}L|>Ca7H$!CDRhZqv*MT3v){eCpw)9p4%ZMB}uSb{hj1}Rk0{83K9 zUgM|c|J3&kp=5?+Yr_qo05#KEW8jR&4m55pV|B4m)Re=^$BjBYR-l`rnMFsPuGKGK zV*qW`8{AO8d|?B~3Iuv4sxmfPzkirK&@~pM;1)`r4oxmE`8Z9F?mmWGQGrvx^~o+U zq0B3oc4>e))8iygkDILdSb}pxKZcTCN2>J*}C^Olo^=4zClM$yuazeLS`y+pHp)>6Km|O0>9%}M?Hc4_&xUI~OVd8QSuVeuHgReHSnPfu1P_hnMQn3SJ~9NSO>ERd?S5QO-MKVO_HbiWG2Vtpj3S6%WjByHp6m8#eD1+}q9Yjf|$OaZEaEcVEBCrti|A}-7 zHTZ%Vu0RI0?o3*tZg}e$TLd3|wgcg7b>fRIaUu7MJ z(T3r14n?*GZb#n%6z9r=9KL(-UaXbi^{w$$^cZ;LWi}Skt;rcLQQ%yr{gD-7c&nUQ z<^psRK7cA!Yy`8M(W6*8YhPjna)NoLvKo-hJm$5mqkYh56bmNRlpMek z(&#-S#{59g7NUeu1ykMQ(qOaj0sXyOq*fN>EP z2*UX20C*L(F6dS3f?l=01=a#5tBLQ`Qy_69Q{cC-*5X`E5JedsL%>CfdawG$m!v#FsDE`X>c8ci>UX|J zR7HLR>iE0lEK(+(79} zHgPmwk3#l2{mcrS(ZsbsJO;IgTg7vRM^fC^>N8x&s^WKo4!H{HE>WW3*}!+jKcn=0 zfYY<1d+t}C4&d%CzbKUFB8#JYKD5tOI{6kF2#)5LJOh|VDV6{E&aqH-tFUp|`v6Bcy8L;H4n`ji@xkRn_GT@Iy;Z!fF z4iO@J=UTlSXS|M}Q{Ri9ipI&d(i$g=K;1?DBC5_(tQ8rdYNALj?oj(crC6>S2x{By z^nN>QQxlWZ!8b|4)Hmcafuek5=p9u@ICP9!B05EG_&y(XWl?#9YP6&x(z0&irsZ`*e)sYOBXO z1@`s94G2*iln;cIc?Ub5I3TJdv|=J~Nr`XN1#rh(ApLff+lN)ki*S1G%B-T4>u#Kr zej3xW)9L3SeWk~J4z1w$V_s&ew|A-+sm^yU9Q95u>sL(yDqh1FVG9pbWj4f5m5Ca6lx7cAefT+H^x zKg7JYd?&R0jiBrzjtFGORag*R8AooeoCmF`Puq6-F>!c!?6}0?J7WEivjaK15dxGu zlQ(^Fb3blu-&3R$Xc9q4-e;jQSs(ulK`GO0o-n)})1>Wd+Y28!fZ+FHK1CU819OCt z19)Hu5uwhnkid&4!IF+SaUY6FaQS|%{&8foeSiHxx&ZJYQ@9I&+ISjV>xrlES;517 zV&^6f=f_S?zi_*dOUO?}xkV_~jjdj}V|l~AoPrxcfs}%L06Dq6+75-s8UmOdONW}k zAltX&V-#tZQ2=y!+1521ZmzD|diuIZcZy#VO;9IUSU;7``)3>_B{}!E6sXvd5Dr4v-{NnORJK(*P-0#Bifk>Cvr{44PJW-X*^%hVk5$!n!3*SxU6MGI z9XkolzkZb0vnn@;*?ZeUh*4Qw@QXr)mnHJj(>HD{JM!gicqx{}aOTQk6^*@et>}ZY zQdzoF+#jfp^TL9FIU^8)(8Y+@`M>!$%gHWlh-1;>|Hw09>*_qtzN} zi!d@BY&Ob{Neiz zuqd$dbf_SrRd61{fluB^HFF~6TeSIKvY#+MidQ3c!8`l=I7JjIrnEpzIiFn$?Tlpa ziWG0bhcU38F&3d%+pNYdP%avZyNAMTEt*82MKr1SB;+E1SHBI=A*96S0GI+H_La3u zYzSo@WrhnGdgUyo_(M%YJXz2!nxV!4pK*Mb={;J-TKzxKHMHe?7mWrJr%jfe#XHF8 zXkY{jn!fD_xn$c2DBb-p>cMYOs8SD}1yPHT4%oR6@+|u;wJb^3@(a|0Dy~zlnRC4H z3rjpT`_*H@f;VVjiS4_jn^8d5<=zMW(u#IYi)cUH1&KKw^`xo58uoh(szA-HZTQT1 z1BA5$?MY~-k-K54dwiZ5%Ub{K=b6W#@%7f`mz1`y_SC=iSJvzhaP1lrw(PA}>n^R< zTLCneW(M4)^d<0H9yrN*rjAuO!DKIY^e|?6h^Mby0Y1TjE-+Z-8`F_?tf^wM1UJMl%o6l-CcgVO!V9wDRTyHmd??^x z&g}DbGn7NxfUig*&p$8FwF=&4@4`p)*skgO`&ZIIYvo4B!-^c}2}03)8#VLS;H@I; z9GUd2!|*=xSQAjg_e{OSI&~F_qX}$kX{OcNVKv1#hDj{NajJ(^IFYUL9xva#OYE-# zp!dh9+IluYb+|k01#lLD|DS%8`|2)^`Wq`bmq1#Q-C&{pi$G!A1+`deOZ!knpOyVm zSXOxoY7xqDwR28h9i&HJN(3{%944Rj=Uv!D#@&3Q2%bVxm<9A&v4>AeH{nHRr znAnCO>&46(LAr7jJ3AcV?*v&BW6X0E^PJW@kIWaBfYV89$pj&@_9Fh$srVWe+FRSJ zVxDf5M-bX@1`MxneJCYHqM4~IaXFfCzUqY!3oJzv-aN>Q7VfZ0@RpV>m!T4Bn{)oN zEVdjCNwT;QxU8M}1AnAGTb1{&L$P&%5+KfaLjrMmwpQ-Fi2F*he2I1byMgVFo!Nu}zR%wso!H|$4yBUGrp7_0e?T$ppS9UY@$iZ>bI~7Ec zOiaQHYhMdUWa?t&)b4Orf1?J-=b>#}p$*v&&P9dtaX2o*PhHGnDDQkkw*e9hv+OK4 zKj$9xJzdT{)|$K{`Vm@Z+lsuZ=sagY0wSkLS5;(>R7#4rcq4~}KqbNXq7tD{9WuJ$ zRtR$=jeK44?*LLxTit~l>m>GyDp)6;c<|^_AV{gKIOUKB?{BjDy{&Nf6tckW&(1RW z=>C*MTHS+4PQ1eKfD`3wicRmtfriQ!OLUlr#2$A(cSsKg<4tVeYww7W%v$i>I8>4PGUT7}hA@vnCC!8%--r;fl$VDs z06*b|o4Ixe3m^3rNe52;2eG)xy7d)a1#{F^u+!bh!&dvbJST7oDs;moo|Pp+P))U( zv*kb}-B_bER`Ef(F+(5{oOgsHNI)c7-5p$}#i zYI#whUIIUVQfJqdgbGBob77nTED&{<6-Ho#5x9|v^kROgRhh2^<qkbC3({FCnJ87mI71|;OrnyoTcLS3^tMqUp!5|;8!EaF$jUv>K^6| zwD1OI>7g!kS}~?kPf#j?XbUp?y^enSfskIR!dTP=3ZewLNH7;ltP&jsPKY8RaS7fa zP={7i6?VfCm(GeNDUWY_`KIQ7SLGeV@Jv)2i4F_6d%*8K&FnB5Us8mch;lJ9Ewmp zq0zYTlRkle{uJ>?+$<_s7EiiF#Z?)y-Cz{*)!eOgY1{{DZtpn_@T{{q8(IRz3G>lt zcYgA$k>{c8_+S8$3h9KVdYmX#qSE)Q&HCeCi7Hj4iyG>$FlwHEmIVBm2yBQ0V#l#( zB%XO54>i6SlEhWc5tXKIJp>A;J5=d2cu zfEtg(w`)!ck9tYu^_*i2_5SHaRGZfCq}}Hvsi?LlBsuG6*Y1F#!XP%6i7@{{my!j< zSD8&MAkIWKkR~CL05^ogxl57|jFS5?=2rFJid!eJjU&xiHBN7_iQ%$Uvf6kBT9a@# z2rt~K6-HyNgtB2?f?ig-PBb$oVyzJsIz4zwI&}ba<$(6kcJTQ_!sks{P~t>oe;$dt zGk>5Bp&!KUA%&BV%rr$@MU#*>%r2K9KjuD`$NZvd#i?9n_qZLBR4EU+U#0*$gGaW?NpNu&;SchC2as9VFPub<)RfNg zms2sTux<@mgf)Wt$!KeoT6NbJ&^&bbWY%jb#wYNKWljAx`Xs7tUkI-qx%0hkB2ZE> z4y7MD+9k{=a|}ph9P=u1a(ueh7tzOH*)t+Urt}V3V0c z0kSmIY~RJG6Cnk6s(=Nmu{5&f)v4;$#2!0dzJg*7=@CbLz%V8t#>uiy5m$~HEyV|d zrc-KkJBqoH3!Ro1yKIKFR&RR|rbpojm%F}>ht1YDt)=(X4Ceh%RQTb&}l_DlIXXkP7?d*YaV`-ENs zKpw~V!o1rDAHUR|KbUAzv-9^LpmrhL#(I(3e2XIpSS{3>pc@Zgi%X8zxq%|y0d zn6hV|&c;uWx1$(IVjh znc(RlBT2avy*UOP`5tmP92wn2a+4;zk3!WQ$O}v~fR7_no13~pd&WZvLT~$u03pR$ zP2-pgA?)n9t8S6%G_Jg)`5S^RE|(ZoKy3AEX%mw zLFxj4xdb)z)B=QcL&%xZ0%qVrpPC?Qdv?AUt*l&uw#_l6w(o2_!DzF6Vdlp+tC8BW zhXT#0pLRwRNMDM3teZB_VGhd-az^jq1^ zP9T@Do$LQ-ef`OeU$?&A01tf>w7=O6of$2 z{QGdTDwhlG3`nPqA9uZM?s}xeSBd`=6rZB~wLp~)_qywRMRUMokVk)1p`x;P;y@rLGbAvg zSiIeEriKt84`=GiPl=pPYxYxur2oU-yT?aeT>t+GVIf@N24ywgqoPL98jaLojBZQ< z?}d#<5sl&{Eo!N^M#u^ZN^}!teY=%fZR@wT)z(^X{ZxBF!G3BGB>_|}whB@!+KcZs zTJcheH}?B{&Aj)LfYp9JkMHC6&(DWs-!t!d&zw1P=FFLM&YTfMW`~;Dp2B7A=zw2_ z!Xiz=cxz4=pF?+V!+e zk@vON!542j1^SPPr;12Uwp25uBh;)p2CT{ZPqc$>gcL__e(U<+wJa7e{vC}X! zT2y3^zN|rcOx*C7)R(nTDcBJ%tiCMj>y?sY|C>B`p+%it)|kFp(D$MW{5ckfLwmnl|-R{uY$BsSbTs?%_&3Vy_)*5R0ASkq3GXRV?Gh(YeiIgy<^)7$dOsVPW-n&250yo@H+D;a?4ZI#eh5p<* z{CCP9Fj2qpU^;Csa1v#&QBfs;0^#wK1_$MTOqVqtHiF_hx{B>1oRZ=jB;Uog_r{#kDcbj*<&6{iT*4w;GY~H0N@4s!{6*lhzllOqln{D%^ znY=q}-gP!_vdO#N=G|cPYE0hcHt$B8ca+IH+veSD^A0k3jW+MwHg6A;ceKsB&E}0V zdHdSD@7cUGQ!gDFVe=ledGDLNe=RpSSYq?uFnO=pykFbA%_i@;0p-@3yrs&E*G5PP zflu)p?EIyq#dz%r$_#e?#HPM#Q{SowyC3RYM4zOU{eJ)wVO?S{FH$#U{fF1)HZ}Jp#G;#rEJQxsm)4BxZI!zCV>Od zJi`Qia!7&5=-1uK4y>Ux#oC8IIgIQ+&AY8&(Cb5Y#`D8`kPh9bvdNOiNbt$se1d*L zdGXrY)Eb%J<+pvLY6`^HmYRAts-B~L{Dbu@R)4RjfyJuz?0KP(F=}@a$Nd#6=*vCWIl&nTwayl-f5**mx!mK^n_sxP!f&*?VR8xHvuUZmC) z7#L1Bh5q~p14Cn8q0?08AzSELQ|K{Us3Nb>0u{Q^7P{XQy3H0ERdCi23&>>Sgn z=^)8#<+-mYzP4~#xdrfB%Ki9WNL8Cp2Poct-;9}zUo84hFq#a0~pfCY!u z)Vq(?X}p+wAE|Z03+Ncc=ELnHmA-c9qlJAZQT!Pd=ROrJQ+J+CH?(LK0FrTOpR9h| zKsF_RXiHwGtRPv(5ImnA5Jrt^%XiYhWJ%fEl#RD!SBU)eG3)Q^y*E|syn;sgN8d~_ z^FA+L6cX*8GmXEkT!JfSq&|rbSa4JBDgRk|6y~@*fV5{1Bld+;@0k~=AL8LQ=)DZ* z6{#W9^dePr#(?*!sb7$O;>>~N2d6i)-^*(+^`EB4<4BYL{ft5BzAs7-g0F9Ix@BPf zeS^|7&K~%F>Y(rc)AZhh>Z=)4->5#83>ieSfL#qbXKd8Lu zsahMI)CN;=YQ{MO%lDl(Ae}3J`UQHC8s9qLed?jF4NUJn>))q0|8?N|!Rb#1y&s(3 z`)>okpE{_$&4b<#PLCf{e*WJF*7wjG1JXO0?-4Mt7@6D7_fe4n)pdi}zI>Gv*DI`zai2G+krdSL&eG8M?Xq*(j1JjMl6cf2bq z#g+TD!9p9SQx-1vc&F406!W5IGOtyD<-r_)8Fbf($k+{>Mp_?< zuNWR#PRRP2)lI?4o0^Ddaz!Nm$&lGob+27~dH*fX`HNA7b8o|VxIANR< ze|@{Xzbz79J|tSRn%zrs?4Q)Th*XNJxy_v$cpr)uZE)NZ#x>QfX)p83y9JT-@HuDDHe6EBZ7mKuDyS^$(>c&slblxS#OGI(&K~Nx(@Ht& zV_S~6!D!8;<*^r=+-JPE@6w{&#MMf%m67BrRB#smhC2!F&?S)9WHy8+7dz<)nJ;-G zj}l2()rylSTNy4cNKFLVj60t`tl8LpB$qSs9a}nwA42PK2@sdjxYMXaIV4R1J)cz^ zanGa^Ltl^7Oe&5ArzB3GcXTVUU`uh|QBKW@*f8bwjho^&yv~QkQxZ{rYu2{!YQHqO zj?Lyv`gvwGfsE~K>%m369%V?8pDopn(5qvc6PzZ6?tl zsra8hLzt-fOKeLNTZoiWk;L(JD^D&ijJO;&^R;N^6w-jx16CgnX$>$Hlsk`$rueUj z`@+~*EhYw3wCN3~qUH(hMOQxI_y-bYm0ldkIAZ51IkuZ(V8M zA-Z&ursxd=SjKG=iHg24x@W;;w3Nm;Iy8$!BOkufF|Q1d>EHQOdT}6+Hp1Cb^e(YWKb$lW)O54_a}V!sJpOZ-kt?&sD&>fDFF#I zEf59VgS>UnQY2B_2UZIN&l=(2-zv-kygzkmvlMq$@G?Y zCzoa#g%)+ipNL(pI>oUPC(%sCl+u)pr{-;qQ);sLnCyF$ov_b$@T~sD_E{M&E8JPb zEyaCvE!4oMSeP3^gh~^f>`Jr|!}ztv;1amqdob*%dsxK%SHwN9IQ&>)$9zVYP&w~6a#9IR z(bRJ8-}H*B*g^C!e`o)2$F@Sckeo*Lv);SM;Qr+8Pfa@46kt}-A$LZpDrtWr%5v4_ zxLo}AJgr z8oBGJmhg1vm+CglVZyYo-kSv00J;Lzl=v~h*rQTSuXbumnMESqFt~jIdBA+}s_Eik z=0z_@=S%@hU}N-sUPk--Mu=E$a4^(%R$ezdgC94a9(8~L(=pk9d@{HTeWN0Y{nQ`0 z63WMOb?dhE=^MaaatoI)gJ$+SFMG!vD*_+9-^tlSjFSaAHP%Z*i<|fb?MNw9SIAGD|k#}xL>bCw!zWul`0%ZWb^3wqZHPJY)(o>`cQPkpSD zoN}mRPc*W)JHbi4-b-vSrGjO{NYuk_;+SvQ0`(EcJRQ39QBfmN`oR8b@0XN}CL7@* zz<~j<*ZUW<(K0U#S98il=#@UnUuG4G#&%{`Z8=B{xQL!O{6kLAvBl&mm0o`hPfNq} z#%nYX8G)&dsHXsSa)PZXd=+_Wo|tFiQsk9x-4(UQ3mz&Ma7+GH8UM=pSJ5*ZN;@ez z9jMoOCsk0fuHX60NnF>8tT0QB=-los{Fxs8J6|V58?@8+L%3Ywn7#I_#H3jS4Pa!e zIX5w2#mI~&!EGXC@|8Y`CAY#Eza9~&KZEPCs9V>sQ0cc&TuP!p{na3iY_@&x2J_9RyiXeVB>UdKB#dzH z2q<3yyuAh95Fb3_>1|dFvpY|R&db1|abPeq@jL$y)6s-#jaH`(M16t!+u0nkd}1SKyyJVH8Bq- z<~+Sji2j|s8G$hG82$PO(F5riJqDe^TpW*&by{W%88TUV`h_kkyi2Klv58is)Q=!i zc*ZpQ?kG~C$p&3)PdBzModnG9|J=TA||zPwO>bd zLHiheD*g%(yS%xLWI)Vvz(Eay46Ka-VdlEi-^Qo~_U zM2|>(UK!jl;v(jUO9gV9_Xc}DIT&FmyLM4&G+580xz~*IGmij$I&{Y`X^OI8&ppnJ z(jCgTIZGik#ux^v_fti5z~ldgmC=JuMhOf;bj z{B-@*NEz%SfS}y_J6Z-gNWfC&F%!)LYnja`wWI4!Uo_yjciWdZHW`AFrc9l|z_h|CVg6%DCSIALCraGw>;@w?|vf zqM(h#;9UkaQ$}woB=bYL|K{uasWyCPI=dyIwTR=i2Jh&G=~T*(!McLT9@gO2LCm46 z1qsu^+c?2Y0@Sc2*OKQgs+Uob?G>WLcIQIOM(@tKyZSexTyz zZW&nARx@Mo9oMgKlD8XH;nfC2yBvinP^K8lLx>qHtMMJHr((w2d+l?vbw}jZYP&{LBO0y6=1@J zu?cD@;P>cN^jKiQ7R~D_A#v< z%Z{{QZqTU3uYHnr<0l3|dcBuZ^K!8BR?@z{z^)&S+q8V_x0B@qG(BK=r@r=C_CZ;e zJ$5mBTYkd3%sYPW_x>6BzabO zB)(AfM%=T?1*PBQa}oCf+E|I|g*H}rL$htXKcJ2Gvu&V~qg#K`_p>KPSU1=oK9iA~ z_Yq|@xtI4x#y`V;#8Adn!_%Qx?`0K=xX*cCzsizgwC0mw=Viz{zbQ<8gC8%#3*!>s zw1+0!nRA6Ef9Ak#z?$JUejJ({JAO9m{@KWmBFhY`i6mx}MG|vBVBn6sb1X+i+?ONC z?|Mv3@4JT?7BbIrh6zU*CXvr|zs`;mq&C?C9~{ls(DR8q<+{Tx(-w~zMNK<$-9LeW z99w+@(SIOYy-0{*VHICxVP#F5!|M0f3s!Ld%Jpxxi3eqRr{islmEi^+`$@KUttRJV zt>mrV8*~uR&#|DNO=~bfX|D|zOwbkH9%EB``yFG_z@|58OKYO+Pu{heO;csD+vgB*B`o_$-6K9*zaK1BhHg7TVeS{ z23^##6JdD`dstQeSK-;0laHo;E8Lkqmlc++KK)C{%a2XpnY^q@GxG99KUG37Z zi%-8!F^Z1e%LUF9k;7MpYhymR2ZfAYa9|ivNUYw3Wo717q3bMQ^#P(x0%kVJI3Rv^ilmsmKKyn<( zUK1F+L8t9@LYu)G8+nlqefLLZe4h8dKAv(6#)F1F1%Y^cr9`Z=##tD?#pp#RqIj9z zC3eF*sd$2&D}Z}|d?n?^=kCv2y~(gx?ay1qz~IKEDrlwQHnXjQ0p z%~t6FI>XrPBGPiA-$0jL#abBb?0_zCTHcw zSNZn_;^wQ~Gk5_gqrsh=*{*!dr_w5(12Y9yg=kHa<&C6AjmLbLTBUiw`)gQ0quAgn zQ>^?)$yYV(CtigVyh{#%*PJzL;`BFS`%uS2YpLT#>d?1Wz=!IV6sE4_8|}8f0_AJB zwa3cF;Yd^~AS-0`6;_BJW`y_`fp@q!9j_$rW^a56BT0Fb9Qk=Cr@v!5Q}z#CD6&N1 zHK*@yR5Hifozn2!Jf3Z2;X%73$-*z(DUHn8m(s~j!tXv{@VC}$A3LyDx0hRp7d+)d z+^{G%9DSPcF5VCCV!+1aVt~CL&h)v!UW)(5{}|Xq46qMhVt{QwT4>kA(umFx{UlE% zAhqF{$Dz47FbyCP^_%(}#cq(d3N>8Jd=uIbLY_ z>d}aq6DX^f4;(Cl-lC?$P<60#AH5i`pDZ$@_<~@V=dHrguF0L-Dh|wc1s*S%Bfhsf z1XGtwK(O<4Gh15F+;48*Q}a5`_+;-Qd~=r8{k$q#RK-^Kkfwf%m=2Xznu zr=~x)k9-}xmqS#qz>PQq#%lCALRhcqhUUE|f5U`By_LjF-#aTDUJ|peb-^AKJA3LklgL(PMsE zR+2YrX_W#`s6MonvoybHttEnq5QP8}?cXT`&O#$) z80Qx&1hAx9g}~iSH6OH}5=owkLf|^95ID13WR_`jEjo*Qjlg?XXBzo88i5Z4@a$tF zTzMQpgtd~4<$z7@LbL%r`PzW>w;OH1TJMaDp~{*Mf}Oh*eGz8mtXeI-I{2;cI6G58lm%+!j0UDBRSq+KR!kkmru@D1!ldY%8CA2IsNPcQl zbXT5psvUab-JGrWbF@3rVB;rIx6dC)(>K$tVCO`!JaGbpB-3uhxGa|$Tl*#Q7s#rW zc(kK!dW$dc96rnHn1+546zveNv`aZpgB&F7-$NDDRP#>z1^8v)$U^tA^E+0++sl_X zotiqMk6X^tXx_AAKUpsO2{~gruG!Ikf`rU`U2p1pH&W9RyQj%ri-c!5p*mCUO@;z2 zEqu1WaDg+Pm2^0lZc98PZt3s7A-@9F^1H<)ldwScHz1|)?&$cf7qg6(!h%Luj$a=e z?xef9?dfe}L)W*3F>XwiJb-gVyqj;}$Dc1Y&+|$rL70YV$FE&%rRI4Vsrl}7X!&h9 zI0Ad|3_SmhFhc|hLZ8T?kc@}PIA$};=i*4bzjXGl(7)Y7(D8ZR`D3hhtN#3tOfc7`#rd{tsnlw^obxtKTVExtwt1#H=%%a^b$lSoXTl_^E zA>BC5q~yA$IL~I4uJFF$Lr}rRr`-Q3z&lQ4b$*ejMz=8|aV}b^MeI4xgBW0(TAh<* zc|Sm0PGMv=FGtCYq*eJ&GSnmVaL;)cePEA?n-G|iD}c-_1}**?0B5o*_znyz>=idy zqO8z5TkdEQ&tM*1C?3G!ExQPC2!p=1E0!Eo>+5H~Uj^TL|eC6;LE(cG2 z+g}bETfqSA11s^1!uh+qo4Gk!&p&5Wm=`1Ud?(ME5)6Ni$PM%rUM;B35_yI9-UU99 z`{xX|s|iTFTgZ-^D`n3gxKGRNzu0YIrQzNP_6**i*miNwG%;U}C)MO+BIqPTr{ASI zGyAMm4dQN|emdVCwrGgH18hUzZlIs&s>Yh%X`&c$a+=7!iZvw12Fgn2T(HED^anT&@=y8Ik#J4E1Zh3t$h1V>vaGkrCM$kwiv>uZ%O|qh~1nG4k;U zIYVd8TNHz<*}Y|)2LQ;#=K^ml?}nwJ|Xi7Ur}?R7X=B+@S+xngd|LQhb_* z1WO(Km#35lOYvnMb29$SP9^C|(qYnJ(#@osNw<=2b&|Jr&yL+|M%38bJTOeNenSR@he*J_ZJ3?gjX`boK;aok9mQ>XgsjhDC4DHf+Or)Fan1 zI^3qwfepTVKEKyLt-;DS^!a0&vHx19jqBe62WCv|M#Bw^BZ7(-x(LVjsJ%_<9oS_qA+;F zDpkzVmuM`F$Q?Q{c3hN}wUJ2T_$hPjp_D?oG#-l7({sK`+diYe>6KapIkN0>wb>eGX4`vmbV|6kBX?srkdq3_8TVp?a@2)td!zi^qBAX ziGOylcmG+Mb2UzK=r;T+i>KIM<_s`vs^DLA{tEmby7Kxi1kgh$t>mKLGvB^)=Af6E z_Zj!!{i*&>bT_liJ2mUC3P7WXR<#AC1qHKN+MPq4n%;=Ke>YK`x{D29OuqLo;8Xz0 zB?3h+A*o*FrS8`UdTB<+{;~YQhDaN{rdf-uo02BlS3@_#w7vTQ#h0I(lx~3yq`p%m zXrA-d?5f|58ZIanIeH#1GV*%Z$e7+^RS+Hp!VL)LV%}jbK=+J7o65M)`&ZsWpNH$o-5EYt!&cV^p6k09oI?E^bZ{!!pM++Ug(9) zd7+4Va;0<7QxSIxJoJ`vTTJ`?P7#!T!beU~H)ma*VKy@UMy?vV+`$#qBSZS0nx|t7 z(bIkCeuuJ8MS|@Qb|TU;-CxWcCE6WDDN2Ne6_I$_2-~MZINvId)Vv)d`x!4eO9*Y> zPmnwANs>mks6Ey#H6sb9yzdStc@_#ZDk$O<8fpqOI8vr58aWk>)}xU2ezENeeFdxT7yEl=@nKQ%&(XkzNh`cla_%|` zR~ViA*v-rfMjh6nJ`HDPXm0%kj4js2C!E>%+-`^2l&U)}Z|@WKK0KX|b|QV`O@8s8 z-1?}6k+H;WUk>3+1={4m084%1o1B^1v;CX0nN=EpdAH`vujMC;f6fv#iA&1|ujAoG zmzH`{_0oOSsW~xrk2aCCVb0!M2BKJ6#8~g@u)H&Gf2N}qQFrz1q9_U?DVACLH8-Hf zYp@lrM_MMUm$eRZGRnJyFEWg4U)I|>rN)ISw{cs6@*kD<_q+45gdg#5_o>MB{e}TE zJ*V`e{5dqw_igU3G^|5av?Vrs?P(H7`W701Gv8mjt~x95pcKP33Lm=h%QJe>xlAM! zV77u2Oa%{`3jFVGju>~S;$j$mYZF>IsB>3hm&LnM(aP-n% z3DP7tZ8W+l>PuN~BTF;9mv~g|2RKV}47i{keSIk_YqY928vNC&Xw5UT-{RmRc$&;8 zE-a25M7LNC6u1aZTExEngyoXt-F-H(+QCYt)Tv2xAj|FPgIz-iOc9LKKcTyZhYFC0 zySq81iALOd#{p@5Ij!L+dg@HWJz>6kYuRY+dqjeNE2pU7&)KSnN8F(VzE|A}%)yCI z9sSIl`h=OT`^^^0u!VY5}ml`yN-7vz(gu+c`&c?6?TCrnqlJByj?d3ph}L z;-*c)T}BX+?brCl8hXv0x4`?oqO>X50)5VaIAtjnmiOieZzOxrRf695d@P4i1^D)H z;d@U`+(xU`f$#Ovnl-}rS>XEAvdBRjoaL_%b&6Iq38EZ!j2(=6l7ouogeud*42x9c zBa8b&5mz%C6UitQ8fK0YqP{0Hd1`S)^B)NpI8_RfANoe(_l`gj<|Ovh=^Clz2Tm5B zpYTEEd`ZOR{DRK8twM}3E{O+`RcsW~Ra(EDn)*^Up)zL9Fxl;I_w9v*W<2S~a37(j zGc4QppEok}D(|Wzw9o5z+-77?_G;`YoboT)Q=B9|w55qj)MF2Bn~e&IYP+XcyK-`Q zf%l{e?6ia2kGo(80nXe%dj=8SwXZ-Q)e6%3n_QeEbo~LxnVCtlBn+NOO^D`)=Eiuy z_~y;0rkWm&uf&2$jPX_3`Gf_D`DDV6FsU4OY<5y1q_k#c)-3#AU)0oEnK!lCW9)n_ zR3`5I99EgBNEX}undP{bBAUDt8?8wo4H}{e?1{;xnwep<`X12SF<%&2#PkrsC0g@Y zEZBrO0W0TH`yucD5=op#%$Z0chP2i$TiP?)J+RAux`JK9z*D_>{5>0L9AEu?A3@Gs zS8UuSILXSS zRo_h-HPqB~Rt;6Zg*0HHSQ#^Qs}p~-F!qSrsTgVW)>$1Nw2Hb9uM1{-#?LXsV)57H z28`TZTZ~WFs!Np^#i8oip)BFjJebt>;YP(d-li6lQh)Yw-0g$CG4CCbr|~l1{*;=m z?n=BhZf+mIA55_Z^4e!(YD%AB+chTT3hzeSE;pzOrZT@>92=FKNK@!qhv2Pb(|jtA z7n+!{BI^&5yY@7vu9wK?1`dej)SBej!yb|;;@1=xT(vtogpBkeMK?;OMPE@Iy)+(s z!6hKJZmBel*xc$^!-1fUI8j(3J20IU1iy{m4*i+T)aWy2Y38CjYi7_f_T^OYXh#W$ zg#PRda6=u(AWPNZ-eEFF4kZa!1V z=}Y{hp6PCLcO|<{9nhrX)lf)FvaPUI&0c$oBJ%sXSr@nd(EATFQ-*2B1m&KHOe>12 zh|YvxV~OweK0`^RSJN1Dj4?=CFmY84F{7GNTK+`YoD5<6zh6Y(Zvj+}zW1Yj%xgxB zt?(X!kOa-1uo4UAIdJ4hlH$}GR~xuWl7ewTllR-m0Z>gaGO>Qv&^T9J(1L@`0< z9%mL6q|7ylOg?+<6@nUPm#ybmqi&1UnX0u0tjPf0-F{X&)JC%E?OK^tV#6AebB6Sl zHMsxc-574QM2_Mn`7F;Di@(*TD`hVccWv-F~Q8kOmWqfR*`o+zvB$+!6~xo|8#!vY-|G5%i=x zZkdR%($EdSCzZ^LXuVd}56j$ftG8(GFXSx%*Cm@dOQgp3AQX@EiqwYj$j*oAstqy{ z-F}5SIhg_Mjv=A1^*&*b+lPXJdGa_$Mcxsqe_=&k@(QM;K+Pv!Sko60?+vp>yu}T8 z0U}q($pZ2XHL3&tD6?>7*zL1~i-2-Aw2y5FK2}%U0Qn_L?tg$`eqVd+WXa$3{07e% zey8;m;@ZS<@vc?#PGs9r%2ixjtBBO`%3e+yk~NS zkYR63{?F;_Kp4}r-u-n}2+9!HZ%@`#I2Rpw{%M_OpN)UBtWbWp5lkEh-*jn#?(T7B z)_sa4D;1WU<*UAPakH~#8TOR(WQ}m&t=jD09~iM$x<}G0Pp;nQ7&)AdpfZ@wf=ZOD z>FY*DYPMe&h>YKkc@H0`e@IAx;h$0IM432{IqU=d`|7mJI=he;of+Y4X)EgD3yv-= zh@o?g9^EX}`PgX9^Xlrd6>R8ssNzw-ih!xYfRVXo(H4g8k2XWi;d}&`Hs*f^U~20QQcQhL z(en_O`vUhLQrlwh$rB}@#PBQNUUlyhvW%Jl;HS9J101a}D0T^`T#8VG2&Etv@k~%} zEr!~!lYVP6?AIW%-!G7O>8Tyk;tj><|301JzP8BnqEvq8yy7!<~zqX2pnz<0zFTuNmFFf zYHvAx5^K7~NzNlA$QxT=41@$xR*59Qd-UGzHzbp|P8xG3fvreDpaYrexa{s<@cx7n z3I~zGNsGoEck;@H5tG_~pQ_myOF{qhc`Wg?v8;%L3LvJxPVYV-NN$Sa~ zBSAn5(4ii%2Mo&rhSf<1B^aabxWIt)czG^_TSgvcaoF_hk)kT6h!yv|Z)!TOGplcE zmij|x8JR*}K8w}s(yvH zacbt3&0!v45_K_#VRHS3jOiWo#uc>h=8dbRO_cxvgfnpW!BKs4tWjN>r6&ZM7uDLV zbm(f;sX0(<-$FTULfHdsRkT9T1x-_ZnAmr$K(bI4X1f)>;Cxw+B{H7@VY5)b@^}3x zV^0)*EGrp&F&Iy=Nk^GeQuuSqBt}&cV~$8ic)=!}Vy~RyTyY*U?`S)NHS)$Nucxk* z7WfXSj(er<)gxmt(73wu_P%2Z4{Gm`Q>h`_N^bo#@aEY7p`v8q7k+c`r5ysI{V4b; zhRymmXJTROz^EHvEYRHVF49ke$zETL{kmcNQ#>^{Bnmp_FDPgqA>96Qv>D+w&_v}7 zIC6l|%{9)GFMz_a3(c(!PP#nbJSP2bbsp`|)(}I4Zgk8*?ht?4c(nojcYbD(h1ERu z<8AH6$~Q3Exn?mH!nL;Un);#K8|&6tS2d-MQ` zt4JjSH7vRBo#avhp=#E86L_-K6pO`@vkk25q?-Ki18=B%^8GKQ7KY0!Z7L|R)s*?r zJhJm@vOUVy7dE$~v<#(rg3ifZ1BOz~zsl+%T!bv?xNhm51w$m<=v8?-G|MWO>m{{T zt3-=lR7gQlX-XMy!I!wNkb#NPN5^dhkmAssPOT0;Bfiw8dT-9ONU_Oxc zVq2nB<=~ua;8dTucU8a|NP#6Cdg5y=_#2VpkN;e7(e1H(r9(fUXcpZ0Bmj3P=ZDAY zl9Xi0)%WQ2OWtdsSgHnfLf!;gvr)mQJGmYhdC3?pqQJ?Ti8m>8lJ$JO5ekstZ{I)a zx*fEkb-5bndc)0$YkwhGoT^#fG5^Yf;O&0b{Qc@hUlmrYblI9u|GxZEUKj5tVxpS* zSe>}Ndr{p2^rEd0#fNh9ImJLK`9Cah9X&Zl#i=Kxa0a?q5E#dbO#Ctul+@~3AJ!Wf zP(5Q`&+ika3vM7j6C5V$LB||T&T@$$x#`LJnJ@*7pqxJVj<1^?Pp&}JtlV{N5v|-@ zD6b_u>Rzt}Jdzk=mh3v3FLm5Ht=uRe2h>+PxW0`4r5}Gs^9Ew`Jyintad_5fb2`U$ z@T!SZR_>cN&`Om%U~}71yZ&6JYAle_g3+}(*!fL9a0A`s%4=l?DXfsUOj8TGwR#E< z-naK;FG`$R{5LC%R6sZA&T}YWp+qNnyA1&57N~w10jjtDE*qi%h(~ zg|vi*?l_MQ#A|=fkJK`uE~Qn#C}zbWVffqiiaT!@;b_f-*%XP*LW=h$O%j1}NI|9? zj`tHhkR{ZY+I`*MLZY?|IE_;eRWpify_LrRuzQO^oTk_Y;y*CO7Sr#HZx(bj|zc(F_p-Rt^)xq9xmx z%e^bR36^B2L;5LNIfGU@YOjJ}0KYwgUHj4ulWOKKC6|$6Xjb!MhUP&Y>XwG-9eTjk z;Ni}5z{6fon9n3^k0&CXzIw1COORBtpHn1$ZPKUc!=@tODG?vmI3CpbG6HvFt7KVU=6 zR3_|9dPnv3W(eH-Y9<{zm)qLXq5EW1;QrsU!NBo?5HiGy6}XNJBQ6)M1sk^O4^noq zfHSI?;0=qA0DY4SRGt~s;0>25e`k?~PUl5BDRMr&B=Fy_33qwqleLmhLxO@eLGRf`$@qjHnUdcVP$#F`K z)DR~_<=>^c9vo5)w$^0gb+0Tc@JeiVOC)ltp9XbGvKySfD)I|8lE9rb4}f=d&$|SPGaqu@7yC5k^$w_^kuvqZX9d%jhU{db)T>&DI$4jcE|tEp#T*sM`|@JT4hc z0fz1t?1-Aiz5ZyCNk+$yEXcbHh-I7EUm{V!PjrUIHJfY_XyPXp&pC=AYA+5hsY};9 zC1lk%r>O@aC`~-AIC0Dy`dK#fN!xTx>eM;BCT@Iu{;Yyn5c?$fb(s?gk1;HhRFRy< zSe3R<#YMR+yy*A{cE*~g+RL0oTw|uToSDUuB6cXQF9I=d_;CE{`0^`_7{o{x4{Dy- zX)$1@Xg<5h^WPKGfHI91@-!f+YvXoHvsHMR-9lvIkXUIQXDLtAyoGSd~gAJKSgKIZ9crO!jk=SWK9k#Upus+QYP+TpK47=nvG~3n0W*yz!wi{5lg%_b zwOz7srK6CpD{=s1g@h;|BV=p~vU#L;wwt+MKA-!U@$yFx z?#F0p(8L7Iu*DZb)d%^6kPfZE*`0YAT(U9P^*$WNXysEWo(SW2oSNeIq#(a58xMuL z46$RcAzcpWe|9>-~66zj%t+IVQgqM^kr8`wqkjYZqv zYvml&X-$WEufCz>YC2`FJxMa-^h1eXb7(YJ&mZcI;;5G-7$mgJd~Jj&i0YD!Tr2_K z<$;*~4X8VkXF-ssqCwt&n&G@x!g+(YeylF2@I?49p6b06J$G{PgbJ*>to2%K# z!1n=FoBzyvbGR&{2ay1H2-r(HCf8nI5M7Xcrzikjf>b77;hMGHcx0`prIV<; z!mQm?#rgnkI^#Er(^opbS_bs@ zv}}J@W%~QEQMOEO$?I>}$@aJ0@13=Y=6CTCxvBq$T^yu}wALtANZbM2rGMMx9X~?e zZy0A-z7>i=Zd&LM=BTkaHwq2Xw@AOa<9$K_ZIWRY{(V9^;*@a8gQfMw+$MyZk~zy~ z@twW36jXt(k8-CiMPo>bakCrOVM_!L<5Xa23N=zRq04WEM{9a@-$n8T|Nng`U;aLn8bm7i z)BiX3p)l0!86t_VVh%+vv$H$@DipT$E#eZt8wEWkOK$8!8FAeHW~VOd6Mut#4Qn%- zLf;+B#30gqfbq?W5Z2zlPUX&><;6N!Uhk=RTrMWCs;8j(9VpV%*?@v#4EUHS7G#PpZ9F@rTh7fyD5Y zlZ&N1OFhOXbtd!(4)SN0_ML}BZ;l96MwmSY9>Nu@()N@~Wgu@DAP)2XWhb8TbI0j# zV;^FtUfG*Y_Q*evl+D(CC&QeH_2qNM4+79A-Q=oz;$Q&#_Ou6T5WCyFp&;5x><{d) za~O#^rfIkgScM0K>u^{Y^q<+E=h9q zf*2Gg)J-si&WB-h9knmhSV8-qx$jF(qspioTE>gIG`rq?n*|R80NU4hseL5tnQp$x z;ouVNhf=XVkfCu&bP8 zk5p!mYv2t>bkdC&zJJ9JU-{Lby30-7m6|K*W-w=w?IbTK1+z%v z(pex_!4%p1ld6<$)3k$eN8@7lXiR=HFVAGsom%NtmkAEG28Ge&WOj0)pR*9sP*0#4 z(De1nz-c^Dh$)&3oyc=t@{|wK&EdYY(f7yBP}qOOC2kAjA7HfsVM{Z=SXnotfrV~g z+asM$o(X4NTI1eh+tAqzc@>k?AilU2O%KG)!ow##98_wR? zk@I>nEQvLN>SdvKU*`6w2F$y0bK4-s$p0c^D3^HY zqn{U#R(%7Qw8;fc!On9u@2&>;cnz+Q3X)d97E5kZI$UZFS|jPSc;EY_NPB8^qb4EF z=~i_dP0WF-P7M#t3bQ8ufmp zcO?ulC8G3x!5VE&dNW;vT@%QPUt3TZ>>6*1?^|ISo>1sFyi0CPTa(`1pj)R#vG&+C zQJI8w0aXNv;c)!x^b15eU0QjbyCz=J+r^WNH{6rj(>GJ*}n4%PWg$%4;& zf0Qc5&4_|)y?J~tF%Uerb39QyNuvosX_4>VVD&FKIn6B@1$AEJxI+(a0g7dEB5~Z& zy~I|S7+Bm;Sg^1J?a84$2y-$=ms~@_`xDXVYHse4!if6)3TpU~&C^nC) zcq}R5k(aycCt0$GO_kc8G5mN7_p;uG?` z8+HfGWZ+i4&+WA(!&-SE6Io+1bs;v~Efs1;Y=E)7Q_FW%=7zIHlxUQH&&!lkqQKik z>8K7fNrqb;b*B`Y9Z9Uh_!CS#yL`^DCj8C&*rBW1O88c8y9MZN&N8jZn32wJ_ERWRHkhl^WQ>8dD2y;^WmFzY^@yDunX;>>Cr|;^{lmGS? zuXiTm;78sxnWNo}F0(myHdvfmXR!DwatK)bjGr%$Mb?F~sAAwwuI7Y$UHUuoV63Tw z#b?p%ns8pkuY`XP2al7qYMCCk((2!7hq1fSwtCZl+NuW2H>e815_sGR*V{Uev2|Ac zr*)Q5r+OljertNMxC*sivg~iju|n zrug}PKfcoxyU2$1!noLwaRuAt{q!T_s|5nO#a`VbPcvZEo^HVU(nC2=7)0h557%%Z z*5_>iqHMv$bfRQ-@EdVYZSnR`+Nhy@WVkjzQD4E6N+#-$;7PS5>S0_Hj<--gbb=ZB zhxz&PLr-g^8m8pbYW#ubHE0UnZgwZ>#an1W=6W#DL#0u7f@7MP5HU@Bm@ha!S7#>R zhXdthlbdTIEH3O$t45~)Ge3Z-$=sLNhV&}YK~BB#ryc*u-3)t&UM^|pW#(_jpU~eH(vAORo4@o;__W51VUi!%?YH^)^4M{bIz;-C6JKa$dL;bLagP9~Ka3gI z294q4WNQq&`DJx$@n*PY47+ZCul3Ydvg)&-{VkffcU&)zAoUVp0jclf_Y_<*;RAkj zQFxv-{%??KTpa`j3umXTP?Y7?SMpQd;7&b)b)X{RPA>(PW^exzOHUt~mNOsVcHkcQ z7VQGXtw$;Qvk zBK;)WDHxK!?q|DaJo3Qwax+`x=falC-v`X(DMMb-#7vH+8;{`l)3fXnPMDQ}_YX=` zHLe5A$W`Az7NU_{1xe|w@w>9Cd5M2PToaM<<)-sIU0mu2p9mncye^};!y?(;j*j+Q zfzMib!~Xnoe!4z1XU9$8;c6^*FXn|Cs6Jr`r}J=}sqprCYdc2Csl`1-Pz)a<33)Ge ziN(*a=3n?pligEa0gb1n!g)3PVNap1(#{>-Mx9$>46GS@3q|&Z9IqAUiY%g@ z%SY5a@7!WlZV+{m5cNm=20>JaV_%<(sEq$>9%#@L!PC4fo>HbO50C56aDl1;Y7wOR2U6*DR{uwO(?9dletchcY&m;| zvDK!KclOY!Id{UwuZlJ7yNMsPr-Q^Da(0k*ynoVcFcZccXrG>4e3sRR`$iq>x_{kd%sV_#ctHi zNmLuporYp}Wt>j3+dj7>0OsuG4|-&E9NlYnfVTnU!g~B`la*k$<`Y6m#OEvU*9+3s z?54xnGE97*8~$*pT}UChUDRHn($XhnE%I#KCQ+An7!xO6dpwWn*!^T4c@P_}6J$(H zmK>}C_d^_g-_ER7&pzwcRc2{Hxo+JNgVF=SD{_A9YU~SlbY}|f+}_%~lbN6j9b(`~m6M6L7Uk62Q;7DaBT8eo* z&^#jT1A=TOw{tGz>2BM7G4&Y>6G< zxF=iUBwJz!eB6{Rv9B$$13oU#miUCr4C(E;gW;H#EwRa#xMXmNiP;j5*%EDoOYEO5 zafdB&)!-6=Y>7FxMCafVedHUQnkf-@R;(avpYf?OW1ty8mC2G)?s?)!F2+8@+0+nH zhQ1NE0$n>)Q=YT)s2anuWm`y=tl|bHBOM2(@|BrQQrV>st{9I__u#|L-y_W5=PQ-d zZT@aBf1f=&)K`=IQG9 zs7EE?>?$WAcgQjUl@48_H_J*j*|8T$4yN3`N2mhM?>!<;f|p@tz1Xx=B|W^en6L6* zqdsgOp-+Vve38Xd5`ljzh01RRy*=H)YWw*W)7xtE_jvR71oQVq^Eb@jY&*IOV~zJi z^f>hXUtmfXZH9PT7((S{%wWGDbr}Q^fRKi~~RzzfzXV+@NL3(8Rs)M+Vfg7II zNDv_R<+}J^`-xCj_hG@%sJp&>w>mVxO&oyTwlRta*v#JOLF*$kS4?rog01>e);;-O zeArM}6l@uYWN8{ezb=x*J6m>Ur)emhaCL!0J;BxVzgITX~SB;ZV zt6nCDFZrbAyuvc8jaDfAm*;O#Q*!-bg$3{7X1#oQ>BZZYr_=AnhP=1JS-z??HC)(} z&SYn{b5@gOcVnD@qW3?FITd=h!fHUTzFg$fhl?EqBZ)A!7iAtYxw<#O&kc5(ZA&ur zC~p|kbm$TLax3iPzcYDv*}Q)8R%P-QWh?ox{W=|XyIRBF?!*s%<}1)HjVg?>~~Sl~Vt-*VE@FrzWP*Lh*B4#ZdWK$Lf?@C$34su!F@=ynoStGo#)nmI#_ z6rLif6()Awe)Cf)u{wsyDVSjyKu4wmWc*j_hKOdH%a zFaEgx2)ZsNfiL6FsnFubElDY#^9&X6+vg4e_Fktd@HaB!ubt$)(94%k+ArBE9sGN7 zj?j$<8)W_}mwy>KK3?Lr-y^@k-4v^$#`)9;k)1&n#v=9vRe=tkvvtq3br`5FpmLh4 zAS)djVh3z02}nVqL<-buvSdWw7k?)!!z-~@Tq>|OIf=p#pDJu0xvWfhI@2f|vvC)o z3GWxs3S@ME!5i$DkDTJZ0M66xW2?HiI>ARvKE(zX`=`;cRG?Yu+vd}gcd7k$xc3*f zeSLd+(@0}kY)6)*%AstWhkKWk;5@BpOEd`GqjTc4Ox{hD%J=3|&RmJm-M6cEg-s0i zF5;n&oAt8ad(+7APT`NADOeE6;QW`3gYD&<_&>sjUkCM5-qXwhIK=KUa>LPxVC1;Z zA)BW|A0MXv;y=blrg<=HgFG%s{j`J1eXLJk%r`l@&MrN`w3-1_Sh0u!4?*L{3oyZ<~?ASu9y{rqZw2k(nk*v^q9^&A5VV^)wP9AI9$xL-S=? z+3fh;yvdu(P*rUJzoR-g$A&vMh5iEDH>||xogK9=kW+B;ruLzo8)CcMyvDm5(&6V$ zeoU`*aw5YwL*F=%&p9%*+Nlctj1LVnSdA?|t>7AKyhgr~Ji@8fk~r_Z3Norz>Cj!n z8tr<-#fU*58vO-}xwCEK-rd_arWr#?9LmQhdm@2F+bi^E_xQ)K18dGu3GY7q`}zXj zTz-N}y3JRFYSM2?ZULMR3ErVrDpLEa zOTNpGccLNl*kRt4ws<-3XWRGV^}dYvJ%MAX6f!B`(jJE3t0;NV;Rd^AfGMw+nk7BN z@xZ`Wve%n$z;A~LSDNsy=o1lXqi)FtSZiH+eL8S7)fwES_NE5A+TNjc91_X!p$rQO z-~6r{DBy#t&0XCK{VlS=Nf>lul1}#~0$W%Tyg45O*3JE(r8-{QMb41e1n)+=<^79! z;av!viG8n7$$Q8Q-@Mkl97wA+gl~S{yUD;DykmvCqVLBRprJlMRvs*mCcbA$gQqCU7`Ho#L&6ayikhCtsp9SGUpr$=Qgrjy~Wxp(Q2ej92%LvvFT9HIC#!R z7y^O0f}I*Uu%+|O&wGmjCHG1qY4+7e!!lpR(}gi~_%UwEff4JoS9q6AM5%+Oue43K z6FKnKW?to8VQr%gb9H!Z3ocP8w)1Q@27|Sw5kK7tt?S^3e=X zm>4DZ9=3FeTr8xq3@m!RJ7?-WdZY|@cj8|w)r-aEg$aZdGmp}1!H6<^!>|9&&#V8p zAeCyq_IdTU_p&RRyAMsAGn`4J%Q`UQL83-I8UnK%g92p2=iXN`92dEdnC%8Ng;WOg3$;dwktcGEV1@lEe{_pQigGPZ&zxu~GT%8Y#g-&3Z#UCu9Im zZZU67p&aly%_Kd&uxg5?t$HXIZG6Mvq^sAoB`GY?rDg<($*g<)2Wr)fZ`UHh`2^59 zuKfZ&)CzZM#?2|r?-?3W&SL`}WKr zd2!My@}6WK>xAz*@IxpHp^PJ2hPRhy#miD+8U>!&%PuX%sR{g!XSE&tX@k4GD&63& zsk?sb73~*YR(JiolP|g=*5Gb%w^pr6PA+U5)f@b2-SzK%^NNciiJ{{fN3CWkhc>vI zMEtn0jE*%s@sc*`OCP-Tq;#;hdstyXdqr*QuptHQ2h_IdXRp8`AAJg&E}uKjA1;)V6>*BqI4T-=o9{Yxq_Zc(7gdnKdy5NwiRl%RqwEKx#&NLfb_SX?} zM)BPczI&eHb>xhl)7BH%w5RQ7Pv8Zfn3U$#-gBm_#6ELQp}N9#Tmn$;j9MoroN~>% z@^QmX7#2Im4g8F6;=RQ^f!lZxoh1T`dBXlw-o9JBx4b8CHA%3{i@7|BuU1HYu+gAP zF(R1-mocd7o)~DQh*aBV0!(+@x8N5v7%11LPaN~pSC71NJOfv=BF0|*qB7BM8FD_m zAIEJ(CDMpK>Tje7_i?nI*V*S}Q@Kr7D&1JlXQj^aE#*!X&sB}3PStW}Df5H>sEPX} zmR9AOLJ~vy9QaY0h2C+tfrr42O2XaFGy5JbAf?y`zOS8rj2-t}8ZsTDjN~-#YZCKH zAAAKbptoenbkeEq6o-$W&9kY;Tlj+P48=n|DGGTQlKDPRYsxUDeyro$z%PosG#z>lknjILDscH~kIsZ9hNx-}Z`6@8nz9PWHd_!ONIb z?2pag@0q{i6X@g2-&@SztIXe7=I=S??*jApMDw@O{N2_3J=XmFi}||+c9E(7VUx4O z{Ovb?KQ@0qHGj98zXhiJ5c7Aa`8&+~eZ;)|wfXydJn0@OTmgMa($D;t(_f{xWb*8< zeufSvP+BeNt77JN8 zU<^6@wix_w!9m^N_dEp0o#Hn$68GKem#oT_v=9xb-*NBw0l+zKvV$KlocZcA_EU>Z z$!P)?h0>c*w`;MAChssm{uifwNB$Kjz+R;8Np$o-JRk^w?Z_p3?UYDt~(}-Js0xaDA1T{|y=Vk~cRC-V5)^ z@(YuG`e)hxSLpq3b7_N*do$_${?T4rCeCKjYK{>alQsJ?l=GU8SN$SyBz=1E$LrXK zv+bMqZht77Zl!(Jo{^Y24FA&jr_S)-XX(Xl49B+=BJGvMFA8sm6YN^bl6C#^`zcLa z4w(lAa-vN8C8?km!{rK4y?uTL3@5t*Ga_5w@EwC6 z#^}CG`8hk3_s3&wukC-ff97}+Gw=uW$2*(_)^;cNUTDd@ADMj*{H?r5J>BEuGk?4W z(O2v3elK3>&-Nk<{{Z^6>p^9v{4ev$v#$&x8#H@nF6+`COas?fBSaB0d%3$@F$OX` z^5&+n=|$@Jw}I~eviC0Vah6s7_<7SLP47u*OH)djmKF-MAx$Hca_OW=+62-xBxxJ2 zlSyWh44ur3Gm|z276NjqfKXXhS(ZzdWw9c%5m76PZUkg2f*TPP0X1C2g8VdKRY1i5 z_dL&eXP)<+nIyRT|NK9n-+$ls)2UQv4YbM|^%gY|)XDIv= z6uwGie&ljF{|x1c*Z=xgzRWZA4E3(Of+LaesRF`Zu1x$<$@!{Mn)O9>rv?8o3)jy+ zQ*bj-9lxXbGX<}mO>{O65ilR@m(b6Awhi;7jh}9{K16-J1fhri!Y$-8v%28McN6sK z(mPBJaj2g+Bg7D9nYkAir;Zp@M{I%tM*WCc^J%ywH=?Dn1f3ml!!}uxJ(cp@c*|A5sRSa_< zY5+s7cKh%O65OsU7)JW13ciTH+DuUBE@<%P!dH04|G&?87C5V&_eqGF1kV(_Nbre* zFBWX`8uRINFAKKApO5PBVZjdxzC-X0g5!b%g4+ap1=n1p`7{eYUvNb5HG*#yykGER zf}a-rhT!)E=kaIT@hrJm<1)c@f&+s41@9Gnx8R2aKQ8z=!LJMcK=2ZgvrzIwf)7Qs z+%qJ;NpM*3fZ)#weo*jlCH+(4FA_Pgir=<>SxEEWF8KZ)?f-%JUlsg;;KECE{5-*T zO88rnu37Lr!7p}e`iS6lfG}m%3Vu7F!ygcQvEcQ79e$zU znBeOK-!1q-!9NiEmf(E;sWhJB1lI`e7kr=K_XOkpQ;Pm}!EXp&CiHa8qx`Zzge2U;Z1>Y<}OTc1BlJ-b5iUcoO5ep2x4o!Wjw z;=f<;oq~G=-zxY~!Ct}5f^E512*1T)DJO}zNy6_C{Hnx1@1lEG{566c(a>1}x< zF8{ZCwcMu#dnLX|{EGxv3f?X_F8F4__X~bRur2R8(dPl-dxiL)5`R+s`vkus;ZKWy zSn$^cKOp!L!3}~31>Y|CJ>g^Pv0TFE3N918UT~Mt$6e`$q#oYss*lgP{3B=50LFP5 zy~I-3mRmPhhnE*?JY1sjKEWj69-$kv!)*qFYucQAUC|SImlgayb~Ev__UHJoet73} z0Dh17Ifm&t{K6kO>H6V!)A0uDBL*G&N8v9A=Evs8HSFyl>mB6}f!V+ECz<@1ei-5Q z!>)sqq+9vZG(Xm3MZ&it0NfIb_9fS^ZwV%=0{&Ps7+<*}aDu1H9|{LKI`w4Gc~*Ni z$NjOMP-nsui6%Xp8&0li^K?dgWBz2QBOEOAwCoNgJ9|QrZcj4msczclN%Z*RK~HZq z5G49w_uH+zk9eczri#6P@zoq`NU$E88*17@*ujrSW9!#%PN`HM>54*JB=#2Xo>h^i5^%m7>`HeDiipVJAG3;+8InF)>do^#S^JiX%RYi%D;YneI%4@ z4t54ZySQW%t2`?Lo__o}!IooVp%+@6%^H8wkF0h^`@#X0!FVtk4+VDxJqc}wWUxQk zha&BYM|-7od;F0=7}nJsBK}^nbOI?=O^ABJ(FiuUX~1jCX8c#zzdRgV6c*%9oj$E- z#_U-$=Wx3->DjI7|BKFg&2(may6`27@7*u#nNa5`<@P#k57!sSA$(VjJHRs`@LnTqrm}y2fn{4UUGwdI--n6X^fQdf$|?x~9fQj=AB=8(;X`jBI>c zxZMU=fmSK-4E9;|$&oG=(-Fc9O5mB4T+neoVp1??N-?bR><$Ic2G2yrUghZthPr!_ z;^~UUd;Qv@#7s_(r?$CyYcq_00o%LnBF}n{PEE8e5)LJjr~%SiS0p|T-_@RT`-1U3 z_1wpG`8$I)7s;1xUOQuu8|YWYs#DDhnX)ThHhXaiwIu!BXlN3+03nDlVh=t1?gldIIZ)2m_mf)xoq%H(GpeVuY*Q8l8vMRB=y za(+~=9K=APdk4*ZlKd5epgAhL#SqI$^mX!x)rI2UgP|j7WZ7e9ssEwryQA+ux@G?f zE6(`T55IbSBWElv87z zN%CE=y;5ruCD#&!qKp@@dvXjoEdpc~rWrCr6*u z{XTL&A-&yP#at88ulB@)U8u4V)k}x_{?>H3dB{&rc`|0W)SHk#hk7479jnK%DUJ%K zvdh|Ho|JpOs^fWHtP-ILL@-mYjrcLUPKRKOK$B9Z zEWzU?$D@8IR#j>U+R}%fjDs`N=?>o@<57iY(IKft&RIi-+-&K&lK!{Tr`k)ZZcbW% zC0`F{0c6LXJ7!Pc6YSinvk%gY^2^L`CcRmH6VUg$o7Si2-h9_rf9l(G)p09kSKjg7 zMJm0lq}H#mW?|<9_XGo?;d-}*lcR5~-%`7ETPqB(x_a?%UOi>ehRfzXwE2}wui3Cx zJx>V!%?7p+(U{Z6i9`SQbu665xL02GjoPKOn z-`MlKf?Koj4+3Y~FDiaDEtk`K;CIt8MbjH;I@Y%helIXT9OFaR$Zlo7%?)L}!Cp*u z)I3=)i}gZ&iwZ`?;F+|ZMh85aHa#z|>PtqM7e5>Oy1IhA<)jD(g>*zS+~Is;tHjm*$eY9L+`N{nOoEmhu*tq+!&%D1_dfgO=_xLO490&jBz z!dtlLw2wA!Yi-@ys5Q?@k3z*JUe9jql8qN1=rr{(RGGUoOo?c+25^YNDC+A3)HnXj9&knVh%J%5wtOn2@1YM?s$x{4y?-*4D z`*i3zu%2a|d3o(Tm!DpnH*Qbw*rn~3k#2ovx>Qxeo}Z(GFKatN_61na^mHN0vl#AA^kiXe zjTC4ZFSPZnFmPvI90N^~ zO~~=}k z;|N_FQuNy*4LLPx+}i46DOmhZir$ffk0HmAlS!q^$Wcl^S>M|oa*l9x$myv07 zOP3fYo$AN!BUFQ*lmm~=JWu6zsyD&dnriKWnVq(_Lyrbnb#ntEWPN20{-(YebZW>( zF&S$!PkMrt%4e2zQisfhyiQ9eor+Mi` zqeGbq_;hr~{ps}Cbs0~O&S-2;I{n9&AA>!N0?e@GM0T)8h!hW37FyJDnz`Uh3UR*T zP!mjG?U?r4yA9X}{6twr7b3V~;KoR@FJVs=^imL~`P@cmbAxYFbJdpGjoUVDs%`dd zYi!xp)U>s^wYJ7r+lGxJSA2bA_0}y-4YjSczN*&Ns_MEewT-QsQtOeMeoK8zOMTsixWwF6_J zGKVsO%2;mt=Gv;7OnQ5+RIP6R*y|xZMMy0jv=_(t=`vwqHEpMn?kUwwiLe!tZa>&Z zw)?s9`Z)WbF;(Ap#6!4+qdT6J^=i2%zKWU?Pqe$F)Kw_%w=$`CgIJk^I6hY2+Zzmo zaJ#2k?pKoiWPDUhvCEB~za_=S< zP2lnh_TBVzo|jIxHjBrB@IwssWX#PaoCiA@qifTBbCx-|}gTt04k!;Xqy zdLd)aR>$X;NuT1V_~n|5Po!tAbSdscia*cPw5Ey1?b?vz=HEfDnMuBRoOf^E)o;+`7XXv5lopW$dYo%AgK!R@+BrM0Z&2H|)lP{rBdCP$9w4jZh@NMY!Rmj=ED2WZ*CD{_RdRpHozF+|x4tF0MRu0*Kt zU>tqHmQYOg*jXhG*XOx9b5+Ttzq6+otDh!&O%vK>)0upo(cn{`Fw{|glU%Zoa5J<8 zHyQlhyd#D3!A!;AAYD7^S<7yJOf_+wo~Al{ghTPnD3#BRYSQW`Cp$>j1MOp-;8(6GC%IP*uX}=%6l#2 z(qnm%mA&c@v+!r5eH{K`#Z(eC3m?ZmnL~qQ0rLgaB_B^oRfcqRQkOzQ91u#RWVF~@ zEg0BRnN#Dp8VmLHo*eXwEi2I-jPF_rp^e+Nuwa=noq&4|sjIAg@rcLoK_%})gBXur zi&oQ+o|C>$UBBQhh%R)CF7-K|xy}Oze{GS63GncFUM{)=E;^M!=sDfnh_@d;Ph5B? z&6i`CFW+AeBiw$b!m$^AzR${!Nq5MgV}A6eMNN$H*mQi~whiI-!*o6HyU!z8?yx~u z1pjCjI_6jRmXlu_{BHf2;z5Is`5%Da1I!P{bAB0*x#-@5pMOWmk4fj|xAHgH`MK%Z zCP_DtgYGee+YjgCApGkjU_AZk?aAr4ZjyBUS?IVtoC07YsV)KMKDGm>=fD z^@_vo-)-doPXBJB9N2?!ezMVhD0C~w#;0pTJo6uzfbMOfTlh|9e%XFEA)NU<2+V$Z zcYL|6h*xqapnC-IY`;+#9gE;+i@#sr9FX~tTL0(}zH*sZzuunYrvtHm(;oDjoxxxr z;pz4F%SKg#S3B50s=^W0u3$QimL~ft>0t23#eA@}T=lUe~oW;kJse8cS+yFxXqh zip4H$k4NKYw4Q~rCiRmF#9;1paw3?_h~Qi68G$t5v-`)DzvtSjA1>E&__MVilaA|2 zkBd&{SDhg0B|9$fs1tmYK&?8Pfo)vJ@4nvDwJgyy|9Nz{PsA`;ilcV9j-f^X*H7*zVO=Uta{-Fx(9~1iFRoXweT4NG=?@H}g+f+5X zqwzp%RQH&1zTuEQ1li5|SUlm3s{_2ay466$rwhFIzX?Ch%9>6cktO;%b_Vz8j!n1D zl`F#P;-u>9V5uj_cL;PIV18`5oDaLc)cr-* zml&{ziST5jdr;_J05-?7#1j9tUyRMJ|J=MUzLvLpPyRV!|4ub_om>;bTmUs)Kk4vR ze;ns#dh?Aa9lk9Vz%I`Y{1&zvJ2{!@c<`5vC$LPXlb>3qqm;mOJa4zC$p`-g#7NiD z>5u54OEv;s>CCv3g*z|%-TBEz$GMm+U5qc|rtTA^^>*;x6z)s(FvlG6YBNx0b6mMH z8B_BLhsAR7RdbG(X4!4cEnm~gBrms~e7dPK=8$gk)pyIY^)Fm6y&t9PDcA2@bbDQN z+A2hTicyGGQ!gd(cQ@P-;7*ECoPuyAXb(a!FERW#hpzSQmcG ze6n2g83rBK34TnvF&CYt(D^I+ewxQ*bxNl|S$+!n2M??nY_=JgV`4`9fZ=9h=3zgk z-ptp0OkX?Fj36Fs3X{a)X0C_K_-C+B32;Bm%MLZ=Gk^0L%Asdd7M`4rQ}-BgZrLXH za_}AmE!I+|NQayAbHIonf!l3MPQbiuE@pn1zxkNH_mIZ(ti@xBN#byG%sSB6Po3fB zFy>)Drd;N0KBjNsHFloxhOlBRW^`CTQ5=0qir1cik~3h@5H=dhLYP(imw$r8FgD^fKnN=@@9gTv zngV|A@5-v1@fo4&DyBK;3~S)95rmZk3*9yjqw5`M&*z{bM_9e$SL_U{X1ayWFqPKh z2y0MjF-98tH7L4rM_7}hTjvZ@bY4eTtD>uOhAFxxgcT#UEY5a9nV?@@2_3b6Ic_Rp zFA8CAqa&9v^==uS(_bO|5vP`E!)2w6$X!$NBf!) z7SuHRTJq>}rqT7Kf=Om>%cFU~61JAZJP0%DRV9b4y*xR2EOfJC~QM-=MW44At5WQ#yiV zGS7fbWX&z0xgE1(v)X4i%|NBL3iGJ2BCp(L93Pw&pGUcMN@=<0RiAtAGp=s7i%7dJ}JFriHx>f=GxnJNm%+F18 zwf`T0`T3>zOP5cjxq;QtXBEu_j~OwP2Y8etndlr-`c)Rv$cZ>k1Uw@8nSN_t5zPzC zq`F z&I_Ie*!)eu%4-Kv$-I2u3=qT$gnmIOov}mMo*w#yx z3HsutMR`<|e3J(8hJFveGqCb`sVj!xngiRyrnZf(`9(B8Ii2PQrqTRLxSLBxb$Ox8 zTBpLEg*2}M<)z9HW!E|lVTfxkj+Gu=Kr^flC_gr(iR%~ZF>LD*Ad9~V`n^?{Gl(9h z-&!)0mL%uUlE7?Q(mIQlRKg!$G`4Vb!EmW(D&FsV98Dcnwomb9duW*rEVJE~*@Qw{ zdUPQjeYl0@zurtmt>@Cd6+~wqhrR6|Ya2NI7?eOupd}Y=ihp}LPl~^?Z42#Nh!4X6 zZc=<9IOz_VkSwBhjJydz9eAtuit=awk@#*v zD~ExX+i#{RSvH-Pp`9L$cDfMlbb52)SpKMPV`GvhuIpEx&RQZLs*V+*j-j4$JLW#D zwU7p(|KorWk?HiqmM)soIp`Og^U67Y3-@Bqb%gNe{&Ft*%fcyC7=SwlnMX~fqc$En zI)C_x*xdG#ref5`rL*#B*5Q0AczzCzorQBuT%@h}sm`y%&vgCRW9`8>T!VCgR_Vt~ zzqO!{7BtTtD;}9WjJ~;PDd+Qbw9h~R`ly*S+(`63V86&P{Z?rKm3GV@J7TybR@?*` z3yWwW($0LofQkZzl#ld-TZo;jk20a-g=@aASr1beiv6oswr%sYv8hdvar|^TJ}`q8Bj59o@99s@ zLj9ac#a^u60WXUz({FLzsYHF}elTgcD^wjES-NsMt$Y%Da7hbe71~4V6wss2pN)P8 zQ2sNWchhg3KAld7E!V-&Sd52-kR&C3D_(ks$%tT|t z&-7bsr_);SI}z!MpG)`78D*19^P^2fp9BmGKhtl`K)>3Gwp=-dX0)TOunmxRLU(lx zp!h|dC)010Or?_73#cTSPbElKGA8L@lOd$}IiN<;nSKkO^O{ysFv?@j(nUq612bsO zlW5}@4+>g~&=82u1zc{+H2kHrFvpO-ZR`e%Uf(9;*m8^`tqU-o%%}P9&K~7?43742k^En*YNA{p^V()Lp#zt`ivX7m(<7-BCu z``31(f1TQ?X_o_YKf6)<$t?ZtLhvpBhQlC=<4wPrMvp@kdYnTWX8R0S!oTtq^7@GG1pyqlM0)2G0|hfmuXDDBb{pNg%pE5zX{NDJL&`xgP)I`3LqK7On)ifbTYlNn5I8m zsCYMl%pKOoVXD5Ijry`FRbM>FPU#V7^N(wLb6RUIbVWab^-BBFnHbNKdcHoKgm}PX zqNnLEJr?~`&n&c^#cEx`c^n3>k|WT6Hy5h$e&8SVoP8hK9zTQ928V#51`PwBa;a{o zUSNLC24?CVz)bV$%Si141f3go;<|Jmo*-+nDom7-%`(^gGh9 zgDhQD}X8KD{#Jta1L`7qTqxL+V z*PbJ=^%F?KeJjwUG1Kw`RTNzKimn4(##1CLhOm6N844uq8iaY_wx3bd8B9|gVMXE0 zuyP5r)1CSE+I1c<>;48X%l^Iii*D0$R{?YUVX3Q&!H4y$0cM@le7#xE*Vz`O$K}(J zm2;`^xx5(L=RJgVfR1_anv$Ow(k}Za9kvgcp9g?B_JH``l6YB@H|f42pZ0wYV+}yh zWubAUI}B?TlScKw`84)5)S<6C(>cS)L8I65Si=XfhR6DF5!%2$QeIaJy@n@THZQE43W;n9*|r7z}z?T=#b4{!+YKU#|XnSQl5f_@8q;+UGX z4i~no`90Q<1>iUKFGT0xhq>-+I<4u~{q!uFeyiP2V}3h?dsl#Vp*Q_HKXZ_u*~ky} zD4_qMTalmHg*3ahm}cKPeXM8{@{i4@V_81hy62nt&Lv>K@H71?-K|)&4;RMNoSplb z!*el5FQ(#qi6VeePRDD^=S!6TQG|^NFOE0;W*Tcr5!TMdwB*)BqYH-@#OAlpYtsGD zT=YXF=!eiBJ*@j7tE7lZFrO`Xc-EMj^V1Cz4v3L2u5p7Y)Aj z)ERU_V|is+o@^Jx>>?`&Sr zVUM5~6aBLQ55A$x#Pm!0(Si{p{gX41eg@4xjJ0~}blSIz=-Ys|CB4J1<~Y-+co^%` z$EA-tqL7Zjnz8`<4U}}nsrgnB`M*naH^BRAt&`ht@-x>E2fk*}txsvYnc<@dzxrt% zZdDXf1;)fVm0!Go(2r!QqqY@u_ zUh_`?^K%6-(?1Bz^v?kEc=s0xFRhqH%ki<#c^2xjJ@!i7SO?ixgOBFAI#dK`tMYOe`4nfYtFo>BivhyXjWxnsc zs%e(IrsXYoUFWX_nDaODS4>4z56u26#s4%g^Vaq~9rmrrn%@^VzevcmKvH~*;POUtIx;=m4!#oMu8-i&pF?ytwd16L+!dI6s0MQ~ZIhk1K)s@%~xI-v`VO_hY&0;Xc-1vnBeePB$BvAFudz{ac$+{|-pn?@2y? z4$RMy(l3;%_I@SW`xR*Ke~0$o?`ZF%NdGW8XwIYEkD2YA)#ColdO_2a0dv?Jz-;nk zf2RFk2IhYLMPPm|dQsC`#};BfITdFjh3Y)8WGU8@uy@JWoY7e$GluQag!jXXzNzbM zaa0?_1KbH|tlL9MD(*|?=|1-MDVpY0V2)4Qw>+brmxHf8hbR}`3uozc6~O%5CjQbB zi|DAeM7=nfHG@8d zdBtU|vuXB5%=t$Ohwb&Ob=h>fjOVZw#bemv9GO0h*&0TAYr%9{fO+78${Dnv0%rxI z>a3u>)PsE)ta;`(>-|v9_x>#TE*^8{d(_DH4?og2oerD2^Ub_Ujs266EWE=m-b2Fs zqz^UU=d;+8`Ka?%m}hA|?tvw-F8MxD#WR?{fFIk@^p`H5PRp?e;;F=l8uV zI?+4M{Khc0@EV<;jn8R(6~a>amGv|8((_lGTLv(P#oUkQud1xEe>3(2qLcm$_l3Y; z>1g;%kH?xxpEZum8`kq$*3a{(uAeNG>uENuHPUsIb$TBBxotCWo93`Xt~`yQALP30 z1=!CbBcInpH%>nc%yQ>RelG-Oo@V`K9ZP56Twr5*Ua7*2vabV;{jiIn=Uu0rheao* zyC3Dra({s^rZwd;uhOIQ>1edqIn6WFo>?pl|AQ|6`waeDgnt(>KaXUQ!#qn@6+zB? zn)z^g_QCy0-D4J=k94eK6YBm0CAysW6Q}$<2F!7##}{J%tpw}GVk&w#U+t;HBrVeg z=4txH^M!s^`ut+xTNZuuC>?Gs#ChXJ*iG#V<18eOePMOh-Gs55X8^JvheA{9(8{ee ze2hgO0q(9(Fh5^7PV#4*pN=5SY{{R#Cow&BPvSkqvHiR;jqQ62Pps7bcYyg>dV;PWwZO{W zxUVn^qnD7|_ALcg*tU2j)%!9+ZJb0bQ7*=xhHQqlu z+jTp5*yALp=V!qJ&A%F$pU(j^pMoQ`yfR?sUj|!{GG+to)DgI=-9DZ7*?NEs@rZxLl=4FoC!|>aW&3pNKPTpSOebh$HH;{!d z^WpuoB?0WYwmQ!|4vCDN>$EJj9+G<&#oy69W8k@=TH@9Hk6Bsof2;%jy3IOG6quiD z#s4eu|5^N})#>=Hz+AuX75_KHukV>;m(vb8_S06Y)87Kj&%cVlV3YPA1+7VvW=zeA|WZnS&&%qANuf9g}_W`rNWYIJ#dEC7k z(tABahQ809t?54k=4akH+J8GRKM#q2NrU!R0yFQr%C*y;{T)gt3{9VL@%=q(c`#hih7~)cNEX>=V5*i+dQY|_uSrBf`;RVWxN=b z{_noib@+?G{JbOnO=swOe*v)KJ5GIS65fRR#}D^;oQBgWw13wRK)%rgU%+Ghlug6ShpK}mtetxc|e+QVK!{R?4eJ(#8z-$kdAD#;|;mi== zm>(EnX1_TmIx!#S#&F?Zoc(4K%8AFuKd#ksBJeYv*&j2X(qoIT4#%BD+&KQc?2<76p7#3Xj8irJ-KHE_zc4R#UoTn2_w`22yRIJGcRB~~9(XT>IMZ*A zX}5n@^Ix)EV=E8!rW|?ab2f~hrC1l0woXMJaPD0(f0U_8vz&ns3!lHVX+G2PF&|il zvk~N(L$+RQ(Tjk~(Iy!yIZc=wsk@`R{z{)8a2l?=>)I{)0^l~J;pct0^ZjXmN$QRu z_RTA1#O!nppt%I_B}sP!-2Y(sr}5o0%%%9Q@VwX&?Y553g63--7X2sEF;-`x&3R4M zG=2Zl;(4CTS*-a5ST8yO2;5_U;(4F}i~?vr^al)q4?`2&!@vxK;4=ikk9O6akU`+$OAvMi^a9-o zXhtD(l+!~N-v#C~$swk}{^ZyI;40{`6Fjbl8!!kx_rX854en1NE%N}3!R@9j;Li~BaxVu9aKu^SZK*O*P z_m%j5Qafm32|HpCJZXzI$H0 z1p2|x!1ud6@VCRw!1vT*?EttLnwT#zLp$92fEi+N4+1j`z&#p4T0hDF?k3<7;332@ zjKaMSGQ0;t&$5AsSSIi=aEvkN7(6#44ln{Y!!X?YUIh=h8Adn`Y4#zF2XE6Jg?kL) z4DFChF}M*%h*z)_`Gva}*u!Z6gW$Ih{&Ki&z4jrUt=k~nZv6&9KLC1$F`WC@I*h)7 zbU2?G1`L5_5b;9-#kYVS;Q1`#5ynss_Xse97j8SvFw%}9jDhcrjj%k#58MhJ0fT@c zz{oPlXF6c|o`%6V!r(84e;Dpz(0Sly7=fFPMOxIg5yWvBj!IZD!plK32LIS?C>PW} zzHc%FJkkN$&m*i8CcOjl0Zn&8m%9*uH|XzyynBKF1w8&0dHDk9_5&V(&R>FTmI?5J ze-nW3_ct969ah490(c`V#^G=`y#<{ir#*l)@DCuIf1ff8oyTy7S?mSfmm%jQ4g5QW zeVn!obf6hI8F^ybasY7qVWeFHok7De1pf&9L+l3d-N}J2(7??w2;L*W3`1~_0xN)f z3~mK*7e54Bf&L+ zA4UHD9q=vis6srTd?R!Llve`-$_ahebnNrbu&{Ba@7T8k57%f~PQz*2YjqmF3(a@P z`OZ0~=eyf{-Hoe*i4Pe(afmF2MDGF9DtdyaOnmmq%*==K`XDn*m<~ya=HAc^G^0=xV?h06zfC zS&&Dk19|{=0UibX3^4ylgaf(&Uj+OR@H;^9!aOc%T>HBEVk20l;4Yi0@@OOA zGQd{=uLAOpgG~VI0p|iDfa?MG1D*i90ifeS184+X3b+?=5b#^T+?9D$0k{BgJ>V;V zp90r0R9#5eZXPB{1Z{X071a@fUf{X0Dl53J}Hkj0lEM;1HJ?p0sIND zU={KQ=mLBi@Ce{}z=wd7SLe|sfPVqJ0>~@NqmuwT0hgT&`f|)i0sjR!3^;O49-RUR z0&W0240r+X0bp4L+6mwiz^4HB0{$KFGT_gEC2L_zKsVq9z?T6(0{jthL}ebW16%~S z0q`}z>j3&h9xVr)4d?~j3iuk}dBE=h3s1?TZGhc?I{?FgmjE9DPC7M@wgM7>djSUl z%hu)57C-`U8{n&e=KzNR$DEc&^?*LWJ%EFN_W|qHqdfxd0sH`P7;w_*C?mk-fPV)3 z7vOh*#b@MEGvHFdmjQffb0jz1rqg{ae06ze{xdnBt5&aLK3vdhIn}AmV3${WY zpcn9Yz!QM?0V|sFs0nZ_;NJkh0L(f!kE#II0sa~At!CI1@H4<~03QKnw!rp)HGqwP zX2AJ?FyL|kuORu&7`UNEg)|jwKb(Ej44R3z)y$?jR7@o_myW>ioafU5IudKjQd&eu z(PBE9me4Wep{2Bpj-};F%C+cxNe-1U!7HXuec*o1R7*1O-ly1Y9+IQex zXXoL(?E<=xE~1OcNA2XN4%{vXP>{N)8|%IhT|ztY)}da!eJF}4@h2&cw-zO-k9OgG zM*Vny(WP`5T~2>TSJ0I-Kv&V#^eMWAuBGefdfH2$#=h!}bQ67sZl+skAAOc?rN5`! z=pX2F^m)3S{*msWf1*3-F1nlUp+Wj*x|jZi?xTOD`{@g`pT0;B(3j{z`Z7I)iO>*z zg&xMF$&GRSeyYv+OCmp2k(bJe1JwwmZ z59q(Jmi-|;M?a$H>BsaFTq=2ienv0SOY}1RoPI&Sq)~c>UZvOQb@~;(LBFO$^d`MU zzoED3|IlygcQi)t(7W_|I!u3{KhmG*J$j!$pg+@x^cVVw{)*zauw^m@#|;Hmp*7Vi z!luM@Ylbz`nq|$l=2*p6i8a?c!kTBzw-#7O;`p)DT4Wt%Ew+xfmRQGF9&4$!%sSRu zZmqD6vyQh`S|?a1S|?entkqVTb+T1%t+6VswN|C|3F{Q=RBN4enzi0K-8#cM(>lxA zV0o=7Yok?d)mXLGCTp`*XVqJ0Tjy8}))uSL+G;gf=UUBHi`8mvv$k71tTyXB>wN11 z>q6@y>tf4iwOf9x!|JpGR?zCQx~(27WL;wIw8B=e6|tgL%=)Aiw-Q#;>a%uPyRCj} zk9DbanRU7Kch(iwm3Ya}Ro2zkr>twNYpv_7>#e=kr>z^T8?BqH&saBGw^;kE&sw)y ze{bDp{e$&6EA{Xx#S6L1vpOM|6hO+;mj|e+=J3^BQKX<0jw;cUmwr-ZY*W%XQJ@+=P$)7|her zP60W|OgSkcyzXsxRcB`~k?<<(yA9W-Br=upN$^b4dNlqvFx}?*ZjV=0CA_3Ax?5i6 zH?FXp9Qea0j&}lT73}i!HL{xO1&8DDH^?T;jju7MGD;4=rEqhDWGbzVG6bqgJsxgF ziZ)e1MmZO=(5t9Ul~Bf+p;Q#E@K*3_k`lKyVIz*dYUHI2*8)+J3kiCQvV$%KP= zVW)b-q)5rgkgCwehw{=z#{-xnR)1kHH-XVsl<^F|DlL;4a;s?UT$^$7A&)eHp$XoO zsx7N)zkY$X9-xE;D0H1yFU8bMa%cil={(o0(S(k^G|kWsPO0qFNY{O>m%D(S0k!TF|`csWsPkZp+$i2+QT2!xEG%#s3ptaj!3(pkXDsfw6V%;F! z)KdMWedVNeDe0tBZ#Kw^IzCl3R7J5XByym;I8!MnY0BsBhs`9Sm5cYrn)-U( zW2$VJM9yq*jmSo-a-&Hzdgl6iDBqUB9v?N(CFMw_ji0uL?o+sM?e?QY*{wgFRjC_x z`A)h9VXR>FxYDXG3gl`cs^?J@4bg5_6=S81sfDcr8w;;8+kjU{^9ys09?vkp=9`_u zS)$`nnx&M3PT9@SA>IGis;?9oQQ1j3J8Y&+nCO__-N;gk+!y;A@i*(R%nTa0*Voin zX=B@U97Ume8zVkjVVh)mB}(RBcB!&00h3K26sd`M#E(lJaNP(HsMNv{2_n5+C#8&u65g(hUc13U?Gw3lBK9 zjoBisXjUR;eN!ECZep{_=j zO=4!vO^{h5T@*^G44aqZsYCVCeQ{b~4rt9DVvSBDH@9K!Z(v1I%BlJ^un$(-c%0yl2KK|bjRe@pNAzb z6epEa?+h9x-_>}7N&OAOE%^NHxT4%-S!EeS;|WV-lVn$3%|l2`DQ*IX1UnL+;O(6# zD-Ie{f}T#pt~P~3L^_r?%Ixwq1}n8fQ;Tb`;E96Wi7GaZ9#|Lr+L|?MT-~h{T1INS z*d~)uM*WGUdes)BC~Kz5CCx~1TDCGwnFwD-*6~@*%dy!_yD26GubZ`P%v7++E)~g} zms*-mb+#B$6-}lZc66OT5(qmI!nkV60*jcDrcje480zjxnu6;^aGeojCQiji6ZooX zvPY+Nw{0HlAtu$C*)%nA36IcQzxb<@dGBS)FrMo53AESsiwlXFvX7|~d@lIAwx@?o_>^s94Yc%V0 z5+`Hb$z#H<_P$wTd+nGdsb-}$pKQYHwQv%t)197e_*8$W^+*#qvt;y(X+o9%T)OBE z!Zd;`+0yBA?O}69s*|uSMC(hb@$v9TZ32%)zkqmg5 zOg`;{b#0Be!mEQp9Okp1{~i~xbMXIfbJNN>>@nVs7K{jy|9`T^j!?j!Yh`QGMzph< zrkXUL#^#!Br22Iyk=YP4NmMnrC)ti@`-^Nf{-i%WN7h>^#>PB1eRW1Gdy)01xjgdP zJX5N3;PzlV5sF5}o5Qta&}GelN#&4d=K-Sd8AgA&WlyAYJb9UP+2lE>vdS~c&RMiZ zgvnXir7ju{q*fFolS(gMv&v+Rrhch zsk5J~)hC)ZZk@mqEjy~3CL-Yu%+xh&UiF7Fv*yzgmCe=-p~y})WfET@>ch&(*)DnZ z#!z0a+HgbEAHeo`e=->14%$VmP2Ujh+^H*>?(oe+ZLm@cP^OU;z5euOS}NQ1Y!S2#~rEn$eZHWzumNPYa;1S_8Enwx@1+5%{Uxk zTg5{C!LW-$Stxw~Z<9&|NlVl%z!>A1lB?1LOj8ON)ouc=QioEN-)?+70;SIWS-d7R z?-tlYkuE5ds557ZG~3)ISA}pU&lvS|86k1j^jt$&O-YtbE@y~OeQWJ24bo`qd;Q&x zy+2h<`jBwaVd3Ei5|HsQF>}aHfwx}I(>*PbTR_x;9|y#I|qkJ z+OapfE7;@@1aNgt_deN=rlq&aptk#Ko(J1EmK1FZtkNl4B<5sGnItnZi#<#t$L%}2 zbJ3Rxa*#P0rfUuxZBs|oREaMN$~7xTtZ82tP1bH`qwW+X`;mY_TdY zRkIN(WmAnY#l<+-ZQ(g|E@^JM?BWcnaph$_C)Vp|>IamX>^d3fp4`}hu$HrL%kDcRKFsng01hFOnSQwn7{U`@rP7rJKOm97i!c&8G% z=}g;XrBYcpxa;vIrB~{hGi9Rmv{Ve^K52BRW*4lR%%NEpqLe@$5K@)L;GzgL7o-16 zQ%>egGL=vFSz`;gCsReEoZYkzO$|D1Bq+n`kvGG}JUK#xvCXAMbR||czl@$Vlg19o zq}58>4J4&oy4X^A)|BQ^m2gvc;GkM2foTzaWiv%K?nwdX#kl90N;F=kwX8ISL$+ZY z*HN;|GIq^!Q8}1p(xlAhsC;^@FC%rXbxmrd<{jQ~w_S~@l1XYRn2XS%Wr`^2kK>nS z<6MSOleBG-N&O&YTO^F_5Xo}(B_~f$9E&+llY4taq%+CK*d5VZJYp21mFTIT-h9oZ zaT-xqLhiL3l*)>l(&$HQ##k8Wif*RKdg#h6tnF-O|37rWb4NUsREwZodkr$rR3dHK zq~78hXRkrA9d8T6oW7=rC&_o5tp>G%$lQNYliO4lq^70Sx0eIC_Zm97;}rlom~k#} z)V`iQ{b#~>cgJ{yvQU@=rS3&pE(_1LxN^((v+zk1j;E!T-I@NS5c*Ti*insDh2&AD z+qn=>U20~n*CPb%t>*7Yqr1Ba`*mJAJ9WapMfbnXi z!Eyr16w8U)O`7FIlunlTagx6`W}m%f?G9314(mFhwOoo!&I}W>HI#-HS?c>n=|3R8 zqJo=;QWk$En?Yx)an&}n$YRD<$5h5YS#9h@KJGG2{`Ix`7jcg6l9f=D8NI>8%gZ#<)XE^=_Kn(XXRVVM zO~ZYf{i8#*K^_;cwg}=LvM7X|h-h5PWcMm|b3{dzWy zx3#pj@jF}ebIL_{56!3W-mq=yu-QJmCuRWe6gw{+HiEF?Yw+z8gD$TfX+h^P!eR(h zAM!QQ?nBrpWbD5n&F>(>_Fji~q#0p{5H^UgVk2#tAMf`;+Oh5Fv=x`&olsZd9cL!p z&OC}izrE+D>0ao?JH@U=-V7NZAgl>8iVV8N5xn0BX+1{RSqLMfJ!FIh5Oxq@{YKa| z2x~)Fj}f*XVRZl$j^m>V}h>}e7E2S1^+1xEze2|i!&6@qO&uW+^7#kO4pzw3&>P}*}`@C}0R6#Ssz z#{@qqc(LG>g4YRd6m0ABN2zC52;M9BWx-Dho{c`0pCR$zFZfQuJ%Vo){HS2B;AX+L z+$)6N;;`mxhunGQsNwcL{ymm2ODt;hnDf_?*i>gSx}Kef$3gyD^H)%?Z}ed&sBDQF1?gE6|hpfwop4MkvMX2oo1 zQyz?2+aH1@1L@GY`Fx|vCc2zyaDBNCKl~4cgFFkx`)RL8hiW+po2AmJ8+!14B=g_a zXf)gt49C`1v_$-|L{AiDTb?i6*H&x_#S;jrNQX3X@gJSPwJ#a#OR5v(7IoboJTGCX z4gQ2(BF*{d_66g6nqW&lAB%MAw~z(n)RGaiDIWY}Uog_ShaSyO-Ervk$9hnf_&$*x zrqm~TtAO`LF~@Gfjf8MePnq#1JY7lcJieWp;|n9`_^T;f{ITt!;O?zmY%hAEU|R&S zM#z6kDvkzi3=)uTnzEiV?3~)>#@bZ5ZqBPu>_A(J?#6d9r(i=#dzzvs$#v|9y20)^ zcGLqxR$}oB0<@j8HI1LLCI-{e?QOI(2P-72YUV z6T~kcqI-n7@p}K-YHu1|0n8$whL0~#X zRn7LQCR-pqXtkiKhHLwSoqb8gvZb!J!7hM8s^Op9RxAG6et3JO3fmf4Q{e~?tPQML zqncyB*pYvyy~*E+u4510j~(dm4(Zmq8SijU_HenQAtsVA{Y@&Q8OMUV5GJ=fk-OVf zI5&nECqYO{T?1~d)+zm0E| zD616wineJdeoHuh##^d`TXy}pKW_scR>f0R zm@uV2c2|4k^j(x^Fsb^1zllL*!G_(T04~?t#W)G+8>?zmU7BgOs0q{AZE1y>3U3v_ z$ksc)rBwfo(lUQ`I6(ti<5lLl&Mc8h$+AnO2K9SuqN_h;mr12oC4-t-h_T`n+oF?B z$>(t8YrIXTREbNF_k3<~{`?K7qaR-%W`glXl~~V|4P87h`J1^QZ(l;I-4u#qQe+R0 zD4K1)P?UR9{nk6)m!==1X7)sPV}`uvV|Nm|fkGI4593|{>W(+=RctR$b&^$dO@VJq zvfmd%$AUk;L@3!uSLv{To=T>I=~^9*)H~_Z+TEw_XHXL5k7-AAx3AhYv*FBbY1v-g zw5GCL&!&zgAAX%1@L_qS*E)FLxUaguU!||LCliEsjr%xQ-F4CnnD|=k@{vB;CA=*h zE}np4#R?bNHC9WsyEB1C!fQz&=MEZ7<9!q1C))T>3nbA_Zx?ui9qsjjHcHd`1|MSNwox_Mh;YyFnmRQ^vR(CzYv zLjhmRUT0!TqtZsOJixDtB7`xNwdNyi!h6Ws?N72h&N;*xMMr{t3(41u6?6=9O?Vd* z6vWwuc=4`wW$929xr3!5zFmnJ|I(!kw5Jo#F*|n$@Md%$xP>~|F8@JY;b;`gUOYaZ zzcY?X5$*7G@yW-O3~pVT8{VoON+e>KO5pA6{$v!XuTvT`$9?RI=!~2I{gUxOUkrL< z#)>r^YymAe6g`v=O`(vl=uzpU7fs4CcLG+OSMG8+uFNWZ@jaeaSRKqE2)bI zdAzY5JaI;{m%30FIOb&X!5Q2cI;9eCaPLybVmwDj^e)K4``Y_3B}P)b$KJ=a+SkR) zLA<%%r|Y%&QTCX`h9kk5kIyh zcKiJC?p=hp-J{Gy$q-8Y(o|G1vMUsiMtZSLf}IElMKlt`lHZr)AAWM3_r-(ymk&OP z;S%9FH`mypUJKb#I?)p7g3`l;7mPT6oyvhX?ki2W@!{S3DYq|3{#a;rZ({ZCP-Hby zu8!l@7gi#x!)sQrS*@F{ivp#Fg{Vp3=E2i+TwF6rTs+v|i9PsDN3Tib=7a7c6g3H4 zTzc^e(NM>p&&yp=O7vtj!TCmf@2aQ+Zh(>qz#rTwyGm6Z|(IdXbG227&WS>90 zErQAsAR5MgiS7Ucss0+PV;GC*O3p>jXb)>6`+fHA)lF0I+fTjS6^(Dg1|#%p!X6qM z;#$P1{Uz+7*GvGkqUu*GDsxo=Y6jUwD=c|crY3F(b;SMg zJ=JL2*t;`IvZVptcpdjE|NCeQSU~2EfB(1e$%OwkPEHHV$r+;~{-@)gy~y)i*Ykh< zYsJ04T>XzHVVCfBC1=3?wxwNuCwsJfci9a;5Od}EjJt8 zhULEcXrcq#Pin(R5oV{;%kgNJo;r-bBGU5gzvJ@z80@m~NzErG(7(eUz?32(J8rgS z8fW8c+ny;kNtRD@1D-!uhkJlGi<`fX`)9y~ zpvUK=$OqtWXSW020a*A`OMUnDSqbNF-TnojXz;z-p91zhZ>ewBUWM=09)_F0U;6~$ zrXO1hmy{CS2RGwC0}jB=c;O<Q@O?;@bu7_81MUMoe+%^L z70?;^ zQ&A7$X1sSD_`}WkUcdm{jK2oh2lv2fM4tt4eI5ipem%+>ZpP077Q@Z>H9$GsjNbxy z;buH0;fyOz*L=LdZ=Hc}gMvRcFsKbM_Cx3i`~;vJI*$UMdX{$c_mtlNtV1||-+0Rg z)D5^9zYl1Gn{lBRbp!5V;3mM!FW`Hk!0!PL!OhsJf}MW`8sL3^#c(rTwh=2{xXXcu z036Qvq-yQv@1lN5-28o0t47zWV&J6!wh!ZP00y7~_fp>#H#TbM zlYn8!V*K09L@&V2xCq};r5B+m@CHB<`ZGSc9{Rz}_;kQCaPv1;qX4F1y!C9NYv5*l z0bmgBcHjema`0z-={ZE_VunFiHzjQA2ft&GRKmcz3 zUhFY|V%UN4T>uZC$Og8BeA<97gIxcPgt=K?N=oAG(ukT19y z-wD_cH-B&ZcYp(M^EbWE!MD1(kL7Q6@5KtT{3X~2_%Ch918Df$+HMUSOquZMeU%2n{fcp1a}Phn*i?j7%%Xn z{y_)EYXFPkZU=q@Z~*yY{6oMqa5Mh<4)i~8Gu{t43^(KN0P?|q1h~Ev`9(N?JNl~t zw(T(RMFH?fAJ`5&FR1%E{uc8+fB@1m-rj|>gPZYgz&^P7o5u6I(bm{*z-2u|55mpg zjK3Se{P~;j?*h1O;>rx&4jA|a>M-!^OLRDY2mTA<=I^~P-U%H*!{2&86~KHLUk#{3 zIODy53*qMPzdr&{c>%sDOmrKE1MdeY9e|JMh25YV<6i-ugq!gpzzc9Q?v9`?!Oi$; z0R2Dhoqcpusg9I_UIvRMac*r|*$khHW=w574BtavEK zfznN0G7c|2lVNB}+6kDjAr!_mla1lT8662YWOZ2zt2 zeEod;^tr$LyU!ap@g|SX1z$v}Bff2U?W^9m+>EdN&aYWs`7s^@FjHqj4j2qD#N&p7rUd(cUa%xShSUL@r8xN$BR4A349Fpdz_ef2fTX`Dm|=9m%Zp&G`6 zxC(8+i(4%(?nF__wO9SgUF69)(Vq1^chk1S)ZXUi=Lz!iycK5-*N=*(`U% zDM<50``g=M%mv!n4$EIL%f*7XkFMRnlGGo0%j;}EWX*DxIT5d0<5xnl6{bLL#|z*Fa0%g%Bv zoZim0;k~dCrCx`^F&)I`yl(gu(mV>nsh7x!_+GgEWBP@BVzB#V#_9)*ANT;uQy;-A zNNs4pLXKBy{}0IxF1<$o;e&7!Ql3%xHN%$jF4#ZKW@Hf41!p1;^~L?jix-ceO1yXy zEyX9`^B2u>2VB{edq$28!pGBXsXh(B!fvMb!QI_$MlE$> zu;NQ*`~bXy?6j59gS?OrFYdY#PyR7D0i>uJWc!`p7A z{$IIf7)ENtC|ul|&o@yXg5|dm<8Pb;)*++A6j*Sw09~wtNg;MGe#! zk2`F}Uc7h_#TD~*&V_1d&p0gZ&w7kczz+uU{t7uH;SQ&HjWIYb%N!eS7(}T#0=

  • Ry5R>vC%>E|h@Dk^RUG8PR;O($AkG!apgmvGx8Ck@S!i$sW z3+fn?ZN^=w=(5Q!_Y(&%_C?F_4p@k?@Z#VH$QLi>p?tg#4)oZJ4R{xfBelQioI)0Ae3+ILOg z0}eu3>xRN*D3AIzuvP``DS(DFNMz{<+%Z#x4d{m0b_2Mut$JfHw3TfkOv=!_& z+Z>-g;6$W+O5qmEAB5+T`daK!Wcpq(52?P`rCNA@-Kl)EWaEcKw4YGw1-WffUPLRv93pWoq$FkVO+r))O4J-hv}uf?r$;a zvb;FW@;jHBVzK#?pFrP7x+#ga7 zkD*|ae4xFYJn>#wi$WJEhdq7fu^w270#^`hKxgqWm_Ujz8jqUZ4#%J*{o;lXtGttS zAFe@B`dZwga*h>$Z+Y&I(US4eo;XwPebK87Z&@S4Q|OkW z!evh?UQk@>DAj*+ody2;<}WCJq`1QAcx;}zF>H0d^Vg6cZThaMwGe4-%7Umw%H>Y z5l6%w$%}X*B@thwDiVm)M1qmpNGQ@2iAI_uvB-f)JaROWh!`=}J&tP*$E=8*VWTm< zF{{zl*xVRzJlg1ODrxdHRq-Bx5$IwJ0QOK~lcO%L&Q}+!ORsm;d+Ve1o%I _dataMem = GCHandle.Alloc(data, GCHandleType.Pinned); + + public void Dispose() + => MemoryPool.FreeOnEndOfFrame(_dataMem); + + public void IssuePluginEvent(EventID eventID) + { + if (_cmdBuffer == null) + _cmdBuffer = new CommandBuffer(); + else + _cmdBuffer.Clear(); + + _cmdBuffer.IssuePluginEventAndData + (Plugin.GetRenderEventCallback(), + (int)eventID, _dataMem.AddrOfPinnedObject()); + + Graphics.ExecuteCommandBuffer(_cmdBuffer); + } + + static CommandBuffer _cmdBuffer; + GCHandle _dataMem; +} + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Event.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Event.cs.meta new file mode 100644 index 0000000..dd49f85 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Event.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 711afc65662fee5429d958cdc98ea404 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs b/Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs new file mode 100644 index 0000000..e2ffe99 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs @@ -0,0 +1,70 @@ +using UnityEngine.LowLevel; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; + +namespace Klak.Spout { + +// +// "Memory pool" class without actual memory pool functionality +// At the moment, it only provides the delayed destruction method. +// +static class MemoryPool +{ + #region Public method + + public static void FreeOnEndOfFrame(GCHandle gch) + => _toBeFreed.Push(gch); + + #endregion + + #region Delayed destruction + + static Stack _toBeFreed = new Stack(); + + static void OnEndOfFrame() + { + while (_toBeFreed.Count > 0) _toBeFreed.Pop().Free(); + } + + #endregion + + #region PlayerLoopSystem implementation + + static MemoryPool() + { + InsertPlayerLoopSystem(); + + #if UNITY_EDITOR + // We use not only PlayerLoopSystem but also the + // EditorApplication.update callback because the PlayerLoop events are + // not invoked in the edit mode. + UnityEditor.EditorApplication.update += OnEndOfFrame; + #endif + } + + static void InsertPlayerLoopSystem() + { + var customSystem = new PlayerLoopSystem() + { type = typeof(MemoryPool), updateDelegate = OnEndOfFrame }; + + var playerLoop = PlayerLoop.GetCurrentPlayerLoop(); + + for (var i = 0; i < playerLoop.subSystemList.Length; i++) + { + ref var phase = ref playerLoop.subSystemList[i]; + if (phase.type == typeof(UnityEngine.PlayerLoop.PostLateUpdate)) + { + phase.subSystemList = phase.subSystemList + .Concat(new [] { customSystem }).ToArray(); + break; + } + } + + PlayerLoop.SetPlayerLoop(playerLoop); + } + + #endregion +} + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs.meta new file mode 100644 index 0000000..f52e333 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/MemoryPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d6cd0890fa1bb44c9cc572948deacd4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs new file mode 100644 index 0000000..0ee1391 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs @@ -0,0 +1,35 @@ +using System.Runtime.InteropServices; +using IntPtr = System.IntPtr; + +namespace Klak.Spout { + +static class Plugin +{ + // Receiver interop data structure + // Should match with KlakSpout::Receiver::InteropData (Receiver.h) + [StructLayout(LayoutKind.Sequential)] + public struct ReceiverData + { + public uint width, height; + public IntPtr texturePointer; + } + + [DllImport("KlakSpout")] + public static extern IntPtr GetRenderEventCallback(); + + [DllImport("KlakSpout")] + public static extern IntPtr CreateSender(string name, int width, int height); + + [DllImport("KlakSpout")] + public static extern IntPtr CreateReceiver(string name); + + [DllImport("KlakSpout")] + public static extern ReceiverData GetReceiverData(IntPtr receiver); + + [DllImport("KlakSpout")] + public static extern void GetSenderNames + ([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] + out IntPtr[] names, out int count); +} + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs.meta new file mode 100644 index 0000000..5d6f518 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Plugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a6bde715fc227c74abc7562678c323de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/PluginEntry.cs b/Packages/jp.keijiro.klak.spout/Runtime/Internal/PluginEntry.cs deleted file mode 100644 index 4985bbd..0000000 --- a/Packages/jp.keijiro.klak.spout/Runtime/Internal/PluginEntry.cs +++ /dev/null @@ -1,152 +0,0 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - -using UnityEngine; -using System.Runtime.InteropServices; - -namespace Klak.Spout -{ - static class PluginEntry - { - internal enum Event { Dispose, SetTargetObject, UpdateWrapCache } - internal enum BlitCommand { Send = 2, Receive = 3 } - - [StructLayout(LayoutKind.Sequential)] - internal struct SenderInfo - { - public int width; - public int height; - public int format; - public bool exists; - public bool isSameSize; - } - - internal enum DXTextureFormat - { - DXGI_FORMAT_UNKNOWN = 0, - DXGI_FORMAT_R16G16B16A16_FLOAT = 10, - D3DFMT_A8R8G8B8 = 21, // DX9 shared tex, interpret as DXGI_FORMAT_B8G8R8A8_UNORM - DXGI_FORMAT_R10G10B10A2_UNORM = 24, - DXGI_FORMAT_R8G8B8A8_UNORM = 28, - DXGI_FORMAT_B8G8R8A8_UNORM = 87, // Default DX11 shared tex - } - - // Tedious, but we only need to support a few formats - // (the rest aren't compatible with the DX sharing feature) - internal static bool DXToRenderTextureFormat(DXTextureFormat dxFormat, ref RenderTextureFormat rtFormat) - { - if (dxFormat == DXTextureFormat.DXGI_FORMAT_UNKNOWN || - dxFormat == DXTextureFormat.D3DFMT_A8R8G8B8 || - dxFormat == DXTextureFormat.DXGI_FORMAT_B8G8R8A8_UNORM) - { - rtFormat = RenderTextureFormat.BGRA32; - return true; - } - else if (dxFormat == DXTextureFormat.DXGI_FORMAT_R16G16B16A16_FLOAT) - { - rtFormat = RenderTextureFormat.ARGBHalf; - return true; - } - else if (dxFormat == DXTextureFormat.DXGI_FORMAT_R10G10B10A2_UNORM) - { - rtFormat = RenderTextureFormat.ARGB2101010; - return true; - } - else if (dxFormat == DXTextureFormat.DXGI_FORMAT_R8G8B8A8_UNORM) - { - rtFormat = RenderTextureFormat.ARGB32; - return true; - } - - return false; - } - - #if UNITY_STANDALONE_WIN && !UNITY_EDITOR_OSX - - internal static bool IsAvailable { - get { - return - SystemInfo.graphicsDeviceType == UnityEngine.Rendering.GraphicsDeviceType.Direct3D11 || - SystemInfo.graphicsDeviceType == UnityEngine.Rendering.GraphicsDeviceType.Direct3D12; - } - } - - [DllImport("KlakSpout")] - internal static extern System.IntPtr GetRenderEventFunc(); - - [DllImport("KlakSpout")] - internal static extern System.IntPtr GetCustomBlitFunc(); - - [DllImport("KlakSpout")] - internal static extern System.IntPtr CreateSender(string name, int width, int height); - - [DllImport("KlakSpout")] - internal static extern System.IntPtr CreateReceiver(string name); - - [DllImport("KlakSpout")] - internal static extern int GetTextureWidth(System.IntPtr ptr); - - [DllImport("KlakSpout")] - internal static extern int GetTextureHeight(System.IntPtr ptr); - - [DllImport("KlakSpout")] - internal static extern int GetTextureFormat(System.IntPtr ptr); - - [DllImport("KlakSpout")] - internal static extern bool IsReady(System.IntPtr ptr); - - [DllImport("KlakSpout")] - internal static extern System.IntPtr GetSenderInfo(string name, out SenderInfo info); - - [DllImport("KlakSpout")] - internal static extern int ScanSharedObjects(); - - [DllImport("KlakSpout")] - internal static extern System.IntPtr GetSharedObjectName(int index); - - internal static string GetSharedObjectNameString(int index) - { - var ptr = GetSharedObjectName(index); - return ptr != System.IntPtr.Zero ? Marshal.PtrToStringAnsi(ptr) : null; - } - - #else - - internal static bool IsAvailable { get { return false; } } - - internal static System.IntPtr GetRenderEventFunc() - { return System.IntPtr.Zero; } - - internal static System.IntPtr GetCustomBlitFunc() - { return System.IntPtr.Zero; } - - internal static System.IntPtr CreateSender(string name, int width, int height) - { return System.IntPtr.Zero; } - - internal static System.IntPtr CreateReceiver(string name) - { return System.IntPtr.Zero; } - - internal static int GetTextureWidth(System.IntPtr ptr) - { return 0; } - - internal static int GetTextureHeight(System.IntPtr ptr) - { return 0; } - - internal static int GetTextureFormat(System.IntPtr ptr) - { return 0; } - - internal static bool IsReady(System.IntPtr ptr) - { return false; } - - internal static System.IntPtr GetSenderInfo(string name, out SenderInfo info) - { return System.IntPtr.Zero; } - - internal static int ScanSharedObjects() - { return 0; } - - internal static string GetSharedObjectNameString(int index) - { return null; } - - #endif - } -} diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs new file mode 100644 index 0000000..7464b60 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs @@ -0,0 +1,98 @@ +using UnityEngine; +using System.Runtime.InteropServices; +using IntPtr = System.IntPtr; + +namespace Klak.Spout { + +// +// Wrapper class for receiver instances on the native plugin side +// +sealed class Receiver : System.IDisposable +{ + #region Public property + + public Texture2D Texture => _texture; + + #endregion + + #region Private objects + + IntPtr _plugin; + EventKicker _event; + Texture2D _texture; + + #endregion + + #region Object lifecycle + + public Receiver(string sourceName) + { + if (string.IsNullOrEmpty(sourceName)) return; + + // Plugin object allocation + _plugin = Plugin.CreateReceiver(sourceName); + + // Event kicker (heap block for interop communication) + _event = new EventKicker(new EventData(_plugin)); + + // Initial update event + _event.IssuePluginEvent(EventID.UpdateReceiver); + } + + public void Dispose() + { + if (_plugin != System.IntPtr.Zero) + { + // Isssue the closer event to destroy the plugin object from the + // render thread. + _event.IssuePluginEvent(EventID.CloseReceiver); + + // Event kicker (interop memory) deallocation: + // The close event above will refer to the block from the render + // thread, so we actually can't free the memory here. To avoid this + // problem, EventKicker uses MemoryPool to delay the memory + // deallocation by the end of the frame. + _event.Dispose(); + + _plugin = IntPtr.Zero; + } + + Utility.Destroy(_texture); + _texture = null; + } + + #endregion + + #region Frame update method + + public void Update() + { + if (_plugin == System.IntPtr.Zero) return; + + var data = Plugin.GetReceiverData(_plugin); + + // Texture refresh: + // If we are referring to an old texture pointer, destroy it first. + if (_texture != null && + _texture.GetNativeTexturePtr() != data.texturePointer) + { + Utility.Destroy(_texture); + _texture = null; + } + + // Lazy initialization: + // We try creating a receiver texture every frame until getting a + // correct one. + if (_texture == null && data.texturePointer != IntPtr.Zero) + _texture = Texture2D.CreateExternalTexture + ((int)data.width, (int)data.height, TextureFormat.RGBA32, + false, false, data.texturePointer); + + // Update event for the render thread + _event.IssuePluginEvent(EventID.UpdateReceiver); + } + + #endregion +} + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs.meta new file mode 100644 index 0000000..09cb039 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Receiver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8219c164418947e43be8c668062162cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs new file mode 100644 index 0000000..c08829e --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs @@ -0,0 +1,63 @@ +using UnityEngine; +using System.Runtime.InteropServices; +using IntPtr = System.IntPtr; + +namespace Klak.Spout { + +// +// Wrapper class for sender instances on the native plugin side +// +sealed class Sender : System.IDisposable +{ + #region Private objects + + IntPtr _plugin; + EventKicker _event; + + #endregion + + #region Object lifecycle + + public Sender(string target, Texture texture) + { + // Plugin object allocation + _plugin = Plugin.CreateSender(target, texture.width, texture.height); + + // Event kicker (heap block for interop communication) + _event = new EventKicker + (new EventData(_plugin, texture.GetNativeTexturePtr())); + + // Initial update event + _event.IssuePluginEvent(EventID.UpdateSender); + } + + public void Dispose() + { + if (_plugin != System.IntPtr.Zero) + { + // Isssue the closer event to destroy the plugin object from the + // render thread. + _event.IssuePluginEvent(EventID.CloseSender); + + // Event kicker (interop memory) deallocation: + // The close event above will refer to the block from the render + // thread, so we actually can't free the memory here. To avoid this + // problem, EventKicker uses MemoryPool to delay the memory + // deallocation by the end of the frame. + _event.Dispose(); + + _plugin = IntPtr.Zero; + } + } + + #endregion + + #region Frame update method + + public void Update() + => _event.IssuePluginEvent(EventID.UpdateSender); + + #endregion +} + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs.meta new file mode 100644 index 0000000..4039a98 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Sender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab35b32382688a747a0fa6b0b1d2b6e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Utility.cs b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Utility.cs index e58c11c..c86a08f 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/Internal/Utility.cs +++ b/Packages/jp.keijiro.klak.spout/Runtime/Internal/Utility.cs @@ -1,57 +1,65 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - using UnityEngine; using UnityEngine.Rendering; +using RTID = UnityEngine.Rendering.RenderTargetIdentifier; + +namespace Klak.Spout { -namespace Klak.Spout +static class RendererOverride { - // Internal utilities - static class Util + static MaterialPropertyBlock _block; + + public static void SetTexture + (Renderer renderer, string property, Texture texture) { - internal static void Destroy(Object obj) - { - if (obj == null) return; + if (_block == null) _block = new MaterialPropertyBlock(); + renderer.GetPropertyBlock(_block); + _block.SetTexture(property, texture); + renderer.SetPropertyBlock(_block); + } +} - if (Application.isPlaying) - Object.Destroy(obj); - else - Object.DestroyImmediate(obj); - } +static class Blitter +{ + public static void Blit + (SpoutResources resrc, Texture src, RenderTexture dst, bool alpha) + => Graphics.Blit(src, dst, GetMaterial(resrc), alpha ? 0 : 1); - static CommandBuffer _commandBuffer; + public static void BlitVFlip + (SpoutResources resrc, Texture src, RenderTexture dst, bool alpha) + => Graphics.Blit(src, dst, GetMaterial(resrc), alpha ? 2 : 3); - internal static void - IssuePluginEvent(PluginEntry.Event pluginEvent, System.IntPtr ptr) - { - if (_commandBuffer == null) _commandBuffer = new CommandBuffer(); + public static void Blit + (SpoutResources resrc, CommandBuffer cb, RTID src, RTID dst, bool alpha) + => cb.Blit(src, dst, GetMaterial(resrc), alpha ? 0 : 1); - _commandBuffer.IssuePluginEventAndData( - PluginEntry.GetRenderEventFunc(), (int)pluginEvent, ptr - ); + public static void BlitFromSrgb + (SpoutResources resrc, Texture src, RenderTexture dst) + => Graphics.Blit(src, dst, GetMaterial(resrc), 4); - Graphics.ExecuteCommandBuffer(_commandBuffer); + static Material _material; - _commandBuffer.Clear(); + static Material GetMaterial(SpoutResources resrc) + { + if (_material == null) + { + _material = new Material(resrc.blitShader); + _material.hideFlags = HideFlags.DontSave; } + return _material; + } +} - private static int frameCount = 0; +static class Utility +{ + public static void Destroy(Object obj) + { + if (obj == null) return; - // Calls a function in the native plugin once per frame, - // on the render thread - internal static void - UpdateWrapCache(int newFrame, CommandBuffer buffer) - { - if (frameCount <= newFrame) - { - frameCount = newFrame; - - buffer.IssuePluginEventAndData( - PluginEntry.GetRenderEventFunc(), - (int)PluginEntry.Event.UpdateWrapCache, - System.IntPtr.Zero // This event doesn't need data - ); - } - } + if (Application.isPlaying) + Object.Destroy(obj); + else + Object.DestroyImmediate(obj); } } + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/Klak.Spout.Runtime.asmdef b/Packages/jp.keijiro.klak.spout/Runtime/Klak.Spout.Runtime.asmdef index 3e65ba8..3c0fbe0 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/Klak.Spout.Runtime.asmdef +++ b/Packages/jp.keijiro.klak.spout/Runtime/Klak.Spout.Runtime.asmdef @@ -1,6 +1,9 @@ { "name": "Klak.Spout.Runtime", - "references": [], + "rootNamespace": "", + "references": [ + "GUID:df380645f10b7bc4b97d4f5eb6303d95" + ], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, @@ -8,6 +11,12 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.render-pipelines.core", + "expression": "0.0.0", + "define": "KLAK_SPOUT_HAS_SRP" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutManager.cs b/Packages/jp.keijiro.klak.spout/Runtime/SpoutManager.cs index c466153..b7f979b 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/SpoutManager.cs +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutManager.cs @@ -1,32 +1,33 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout +using System.Runtime.InteropServices; +using IntPtr = System.IntPtr; -using UnityEngine; -using System.Collections.Generic; +namespace Klak.Spout { -namespace Klak.Spout +public static class SpoutManager { - public static class SpoutManager + // + // GetSourceNames - Enumerates names of all available Spout sources + // + // This method invokes GC memory allocations every time, so it's + // recommended to cache the results for frequent use. + // + public static string[] GetSourceNames() { - // Scan available Spout sources and return their names via a newly - // allocated string array. - public static string[] GetSourceNames() - { - var count = PluginEntry.ScanSharedObjects(); - var names = new string [count]; - for (var i = 0; i < count; i++) - names[i] = PluginEntry.GetSharedObjectNameString(i); - return names; - } + // Retrieve an array of string pointers from the plugin. + IntPtr[] pointers; + int count; + Plugin.GetSenderNames(out pointers, out count); - // Scan available Spout sources and store their names into the given - // collection object. - public static void GetSourceNames(ICollection store) + // Convert them into managed strings. + var names = new string[count]; + for (var i = 0; i < count; i++) { - store.Clear(); - var count = PluginEntry.ScanSharedObjects(); - for (var i = 0; i < count; i++) - store.Add(PluginEntry.GetSharedObjectNameString(i)); + names[i] = Marshal.PtrToStringAnsi(pointers[i]); + Marshal.FreeCoTaskMem(pointers[i]); } + + return names; } } + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs index 137955c..8e08fd8 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs @@ -1,241 +1,101 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - using UnityEngine; -using UnityEngine.Rendering; - -namespace Klak.Spout -{ - [ExecuteInEditMode] - [AddComponentMenu("Klak/Spout/Spout Receiver")] - public sealed class SpoutReceiver : MonoBehaviour - { - #region Source settings - - [SerializeField] string _sourceName; - - public string sourceName { - get { return _sourceName; } - set { - if (_sourceName == value) return; - _sourceName = value; - RequestReconnect(); - } - } - - #endregion - - #region Target settings - - [SerializeField] RenderTexture _targetTexture; - - public RenderTexture targetTexture { - get { return _targetTexture; } - set { _targetTexture = value; } - } - - [SerializeField] Renderer _targetRenderer; - - public Renderer targetRenderer { - get { return _targetRenderer; } - set { _targetRenderer = value; } - } - [SerializeField] string _targetMaterialProperty = null; +namespace Klak.Spout { - public string targetMaterialProperty { - get { return _targetMaterialProperty; } - set { _targetMaterialProperty = value; } - } - - #endregion - - #region Runtime properties - - RenderTexture _receivedTexture; - - public Texture receivedTexture { - get { return _targetTexture != null ? _targetTexture : _receivedTexture; } - } - - #endregion - - #region Private members +// +// Spout receiver class (main implementation) +// +[ExecuteInEditMode] +[AddComponentMenu("Klak/Spout/Spout Receiver")] +public sealed partial class SpoutReceiver : MonoBehaviour +{ + #region Receiver plugin object - System.IntPtr _plugin; - PluginEntry.SenderInfo _senderInfo = new PluginEntry.SenderInfo(); - CommandBuffer _commandBuffer; - int _middlemanRenderTextureID; - Material _blitMaterial; - MaterialPropertyBlock _propertyBlock; + Receiver _receiver; - #endregion + void ReleaseReceiver() + { + _receiver?.Dispose(); + _receiver = null; + } - #region Internal members + #endregion - internal void RequestReconnect() - { - OnDisable(); - } - - #endregion + #region Buffer texture object - #region MonoBehaviour implementation + RenderTexture _buffer; - void OnDisable() + RenderTexture PrepareBuffer() + { + // Receive-to-Texture mode: + // Destroy the internal buffer and return the target texture. + if (_targetTexture != null) { - if (_plugin != System.IntPtr.Zero) + if (_buffer != null) { - Util.IssuePluginEvent(PluginEntry.Event.Dispose, _plugin); - _plugin = System.IntPtr.Zero; + Utility.Destroy(_buffer); + _buffer = null; } + return _targetTexture; } - void OnDestroy() + var src = _receiver.Texture; + + // If the buffer exists but has wrong dimensions, destroy it first. + if (_buffer != null && + (_buffer.width != src.width || _buffer.height != src.height)) { - Util.Destroy(_blitMaterial); - Util.Destroy(_receivedTexture); + Utility.Destroy(_buffer); + _buffer = null; } - void Update() + // Create a buffer if it hasn't been allocated yet. + if (_buffer == null) { - PluginEntry.GetSenderInfo(_sourceName, out _senderInfo); - - // Release the plugin instance when the previously established - // connection is now invalid. - if (_plugin != System.IntPtr.Zero && PluginEntry.IsReady(_plugin)) - { - var width = PluginEntry.GetTextureWidth(_plugin); - var height = PluginEntry.GetTextureHeight(_plugin); - - if (!_senderInfo.exists || (width != _senderInfo.width || height != _senderInfo.height)) - { - Util.IssuePluginEvent(PluginEntry.Event.Dispose, _plugin); - _plugin = System.IntPtr.Zero; - } - } - - var dxFormat = (PluginEntry.DXTextureFormat)_senderInfo.format; - var rtFormat = RenderTextureFormat.ARGB32; - var supportedFormat = PluginEntry.DXToRenderTextureFormat(dxFormat, ref rtFormat); - - // Skip if no sender found with target name or if it has invalid parameters - if (!_senderInfo.exists || _senderInfo.width <= 0 || _senderInfo.height <= 0 || !supportedFormat) - return; - - // Plugin lazy initialization - if (_plugin == System.IntPtr.Zero) - { - _plugin = PluginEntry.CreateReceiver(_sourceName); - if (_plugin == System.IntPtr.Zero) return; // Spout may not be ready. - } - - // Texture format conversion with the blit shader - // Blit shader lazy initialization - if (_blitMaterial == null) - { - _blitMaterial = new Material(Shader.Find("Hidden/Spout/Blit")); - _blitMaterial.hideFlags = HideFlags.DontSave; - } - - // Renderer override - if (_targetRenderer != null && receivedTexture != null) - { - // Material property block lazy initialization - if (_propertyBlock == null) - _propertyBlock = new MaterialPropertyBlock(); - - // Read-modify-write - _targetRenderer.GetPropertyBlock(_propertyBlock); - _propertyBlock.SetTexture(_targetMaterialProperty, receivedTexture); - _targetRenderer.SetPropertyBlock(_propertyBlock); - } - - // Commandbuffer lazy initialization - if (_commandBuffer == null) - { - _commandBuffer = new CommandBuffer(); - _commandBuffer.name = name; + _buffer = new RenderTexture(src.width, src.height, 0); + _buffer.hideFlags = HideFlags.DontSave; + _buffer.Create(); + } - _middlemanRenderTextureID = Shader.PropertyToID("_SpoutReceiverRT"); - } + return _buffer; + } - Util.UpdateWrapCache(Time.frameCount, _commandBuffer); - - _commandBuffer.GetTemporaryRT( - _middlemanRenderTextureID, _senderInfo.width, _senderInfo.height, 0, - FilterMode.Point, rtFormat, - RenderTextureReadWrite.Linear // DX shared textures are always linear - ); - - // Set target sender on the native plugin side. - _commandBuffer.IssuePluginEventAndData( - PluginEntry.GetRenderEventFunc(), - (int)PluginEntry.Event.SetTargetObject, - _plugin - ); - - // Performs CopyTexture of the DX shared texture to the middleman RT. - // On DX12, the middleman RT is first wrapped into a DX11 texture, - // since DX shared textures are DX11/DX9 textures that we interface with - // using the D3D11on12 feature. - // - // IssuePluginCustomBlit is used instead of IssuePluginEventAndData as - // there's no other method to pass a temporary RT into the native side. - // If we had a pointer to the temporary RT's native texture then - // IssuePluginEventAndData could have been used. - _commandBuffer.IssuePluginCustomBlit( - PluginEntry.GetCustomBlitFunc(), - (int)PluginEntry.BlitCommand.Receive, - _middlemanRenderTextureID, - BuiltinRenderTextureType.CurrentActive, // Actually unused on the native plugin side - 0, - 0 - ); - - if (_targetTexture != null) - { - // Blit the middleman RT to the target texture. - _commandBuffer.Blit(_middlemanRenderTextureID, _targetTexture, _blitMaterial, 1); - } - else - { - // Receiver texture lazy initialization - if (_receivedTexture == null) - { - _receivedTexture = new RenderTexture(_senderInfo.width, _senderInfo.height, 0); - _receivedTexture.hideFlags = HideFlags.DontSave; - } - - // Blit the middleman RT to the receiver texture. - _commandBuffer.Blit(_middlemanRenderTextureID, _receivedTexture, _blitMaterial, 1); - } + #endregion - _commandBuffer.ReleaseTemporaryRT(_middlemanRenderTextureID); + #region MonoBehaviour implementation - // Schedule to run on the render thread. - Graphics.ExecuteCommandBuffer(_commandBuffer); - _commandBuffer.Clear(); - } + void OnDisable() + => ReleaseReceiver(); - #if UNITY_EDITOR + void OnDestroy() + { + Utility.Destroy(_buffer); + _buffer = null; + } - // Invoke update on repaint in edit mode. This is needed to update the - // shared texture without getting the object marked dirty. + void Update() + { + // Receiver lazy initialization + if (_receiver == null) + _receiver = new Receiver(_sourceName); - void OnRenderObject() - { - if (Application.isPlaying) return; + // Receiver plugin-side update + _receiver.Update(); - // Graphic.Blit used in Update will change the current active RT, - // so let us back it up and restore after Update. - var activeRT = RenderTexture.active; - Update(); - RenderTexture.active = activeRT; - } + // Do nothing further if no texture is ready yet. + if (_receiver.Texture == null) return; - #endif + // Received texture buffering + var buffer = PrepareBuffer(); + Blitter.BlitFromSrgb(_resources, _receiver.Texture, buffer); - #endregion + // Renderer override + if (_targetRenderer != null) + RendererOverride.SetTexture + (_targetRenderer, _targetMaterialProperty, buffer); } + + #endregion } + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs.meta index b2a596f..47c5640 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs.meta +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver.cs.meta @@ -1,10 +1,12 @@ fileFormatVersion: 2 guid: 62f7dec0b00674947bc631624c21970a -timeCreated: 1491895289 -licenseType: Pro MonoImporter: + externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - _targetTexture: {instanceID: 0} + - _targetRenderer: {instanceID: 0} + - _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs new file mode 100644 index 0000000..fc3dcc1 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs @@ -0,0 +1,67 @@ +using UnityEngine; + +namespace Klak.Spout { + +// +// Spout receiver class (properties) +// +partial class SpoutReceiver +{ + #region Spout source + + [SerializeField] string _sourceName = null; + + public string sourceName + { get => _sourceName; + set => ChangeSourceName(value); } + + void ChangeSourceName(string name) + { + // Receiver refresh on source changes + if (_sourceName == name) return; + _sourceName = name; + ReleaseReceiver(); + } + + #endregion + + #region Destination settings + + [SerializeField] RenderTexture _targetTexture = null; + + public RenderTexture targetTexture + { get => _targetTexture; + set => _targetTexture = value; } + + [SerializeField] Renderer _targetRenderer = null; + + public Renderer targetRenderer + { get => _targetRenderer; + set => _targetRenderer = value; } + + [SerializeField] string _targetMaterialProperty = null; + + public string targetMaterialProperty + { get => _targetMaterialProperty; + set => _targetMaterialProperty = value; } + + #endregion + + #region Runtime property + + public RenderTexture receivedTexture + => _buffer != null ? _buffer : _targetTexture; + + #endregion + + #region Resource asset reference + + [SerializeField, HideInInspector] SpoutResources _resources = null; + + public void SetResources(SpoutResources resources) + => _resources = resources; + + #endregion +} + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs.meta new file mode 100644 index 0000000..851fddc --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutReceiver_Properties.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 127d037496fc9b34da364f6785a8b896 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs b/Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs new file mode 100644 index 0000000..cec2097 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace Klak.Spout { + +// +// Spout "Resources" class +// This is used to provide a reference to the shader asset. +// + +//[CreateAssetMenu(fileName = "SpoutResources", +// menuName = "ScriptableObjects/Klak/Spout/Spout Resources")] +public sealed class SpoutResources : ScriptableObject +{ + public Shader blitShader; +} + +} // namespace Klak.Spout diff --git a/Assets/TestCards/Runtime/TestOverlay.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs.meta similarity index 52% rename from Assets/TestCards/Runtime/TestOverlay.cs.meta rename to Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs.meta index 0140f55..c8ef7d1 100644 --- a/Assets/TestCards/Runtime/TestOverlay.cs.meta +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutResources.cs.meta @@ -1,11 +1,10 @@ fileFormatVersion: 2 -guid: 09e531f25570e604d8fb78aee77125a9 -timeCreated: 1490422325 -licenseType: Pro +guid: 12527eb854f97c84cac3b04dc699db09 MonoImporter: + externalObjects: {} serializedVersion: 2 defaultReferences: - - _shader: {fileID: 4800000, guid: bc6a0edaa182a35449d12a1445ba38db, type: 3} + - blitShader: {fileID: 4800000, guid: eb56c59e60b76874692c486f3bdd860d, type: 3} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs index 6cdb18b..8f4cf14 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs @@ -1,182 +1,133 @@ -// KlakSpout - Spout video frame sharing plugin for Unity -// https://github.com/keijiro/KlakSpout - using UnityEngine; using UnityEngine.Rendering; -namespace Klak.Spout +namespace Klak.Spout { + +// +// Spout sender class (main implementation) +// +[ExecuteInEditMode] +[AddComponentMenu("Klak/Spout/Spout Sender")] +public sealed partial class SpoutSender : MonoBehaviour { - [ExecuteInEditMode] - [AddComponentMenu("Klak/Spout/Spout Sender")] - public sealed class SpoutSender : MonoBehaviour - { - #region Source settings + #region Sender plugin object - [SerializeField] RenderTexture _sourceTexture; + Sender _sender; - public RenderTexture sourceTexture { - get { return _sourceTexture; } - set { _sourceTexture = value; } - } + void ReleaseSender() + { + _sender?.Dispose(); + _sender = null; + } + + #endregion - #endregion + #region Buffer texture object - #region Format options + RenderTexture _buffer; - [SerializeField] bool _alphaSupport; + void PrepareBuffer(int width, int height) + { + // If the buffer exists but has wrong dimensions, destroy it first. + if (_buffer != null && + (_buffer.width != width || _buffer.height != height)) + { + ReleaseSender(); + Utility.Destroy(_buffer); + _buffer = null; + } - public bool alphaSupport { - get { return _alphaSupport; } - set { _alphaSupport = value; } + // Create a buffer if it hasn't been allocated yet. + if (_buffer == null && width > 0 && height > 0) + { + _buffer = new RenderTexture(width, height, 0); + _buffer.hideFlags = HideFlags.DontSave; + _buffer.Create(); } + } + + #endregion - #endregion + #region Camera capture (SRP) - #region Private members + Camera _attachedCamera; - System.IntPtr _plugin; - CommandBuffer _commandBuffer; - int _middlemanRenderTextureID; - Material _blitMaterial; + void OnCameraCapture(RenderTargetIdentifier source, CommandBuffer cb) + { + if (_attachedCamera == null) return; + Blitter.Blit(_resources, cb, source, _buffer, _keepAlpha); + } - // This is a hack to avoid trashing Spout on source resize (ex window - // resize). Could be done through spoutSenderNames::UpdateSender on - // the native plugin side instead to eliminate this hack and the - // associated delay. - const int _refreshDelay = 20; - int _refreshDelayCounter = _refreshDelay; + void PrepareCameraCapture(Camera target) + { + // If it has been attached to another camera, detach it first. + if (_attachedCamera != null && _attachedCamera != target) + { + #if KLAK_SPOUT_HAS_SRP + CameraCaptureBridge + .RemoveCaptureAction(_attachedCamera, OnCameraCapture); + #endif + _attachedCamera = null; + } - void SendRenderTexture(RenderTexture source) + // Attach to the target if it hasn't been attached yet. + if (_attachedCamera == null && target != null) { - // Handle source texture resize - if (_plugin != System.IntPtr.Zero && PluginEntry.IsReady(_plugin)) - { - var width = PluginEntry.GetTextureWidth(_plugin); - var height = PluginEntry.GetTextureHeight(_plugin); - - if (width != source.width || height != source.height) - { - Util.IssuePluginEvent(PluginEntry.Event.Dispose, _plugin); - _plugin = System.IntPtr.Zero; - _refreshDelayCounter = 0; - } - } - - // Hack - _refreshDelayCounter++; - if (_refreshDelayCounter >= 10000) - _refreshDelayCounter = _refreshDelay; // Avoid overflow - if (_refreshDelayCounter <= _refreshDelay) - return; - - // Plugin lazy initialization - if (_plugin == System.IntPtr.Zero) - { - _plugin = PluginEntry.CreateSender(name, source.width, source.height); - if (_plugin == System.IntPtr.Zero) return; // Spout may not be ready. - } - - if (_plugin != System.IntPtr.Zero) - { - // Blit shader lazy initialization - if (_blitMaterial == null) - { - _blitMaterial = new Material(Shader.Find("Hidden/Spout/Blit")); - _blitMaterial.hideFlags = HideFlags.DontSave; - } - - // Blit shader parameters - _blitMaterial.SetFloat("_ClearAlpha", _alphaSupport ? 0 : 1); - - // Commandbuffer lazy initialization - if (_commandBuffer == null) - { - _commandBuffer = new CommandBuffer(); - _commandBuffer.name = name; - - _middlemanRenderTextureID = Shader.PropertyToID("_SpoutSenderRT"); - } - - Util.UpdateWrapCache(Time.frameCount, _commandBuffer); - - // We can't directly blit to the shared texture (as it lacks - // render buffer functionality), so we allocate a render - // texture as a middleman, blit the source to it, then - // pass it to the native plugin. - _commandBuffer.GetTemporaryRT( - _middlemanRenderTextureID, source.width, source.height, 0, - FilterMode.Point, - RenderTextureFormat.ARGB32 // We only support this sender format on the native plugin side - ); - _commandBuffer.Blit(source, _middlemanRenderTextureID, _blitMaterial, 0); - - // Set target sender on the native plugin side - _commandBuffer.IssuePluginEventAndData( - PluginEntry.GetRenderEventFunc(), - (int)PluginEntry.Event.SetTargetObject, - _plugin - ); - - // Performs CopyTexture of the middleman RT to the DX shared texture. - // On DX12, the middleman RT is first wrapped into a DX11 texture, - // since DX shared textures are DX11/DX9 textures that we interface with - // using the D3D11on12 feature. - // - // IssuePluginCustomBlit is used instead of IssuePluginEventAndData as - // there's no other method to pass a temporary RT into the native side. - // If we had a pointer to the temporary RT's native texture then - // IssuePluginEventAndData could have been used. - _commandBuffer.IssuePluginCustomBlit( - PluginEntry.GetCustomBlitFunc(), - (int)PluginEntry.BlitCommand.Send, - _middlemanRenderTextureID, - BuiltinRenderTextureType.CurrentActive, // Actually unused on the native plugin side - 0, - 0 - ); - - _commandBuffer.ReleaseTemporaryRT(_middlemanRenderTextureID); - - // Schedule to run on the render thread - Graphics.ExecuteCommandBuffer(_commandBuffer); - _commandBuffer.Clear(); - } + #if KLAK_SPOUT_HAS_SRP + CameraCaptureBridge + .AddCaptureAction(target, OnCameraCapture); + #endif + _attachedCamera = target; } + } - #endregion + #endregion - #region MonoBehaviour implementation + #region MonoBehaviour implementation - void OnDisable() - { - if (_plugin != System.IntPtr.Zero) - { - Util.IssuePluginEvent(PluginEntry.Event.Dispose, _plugin); - _plugin = System.IntPtr.Zero; - } - } + void OnDisable() + { + ReleaseSender(); + PrepareBuffer(0, 0); + PrepareCameraCapture(null); + } - void OnDestroy() + void Update() + { + // GameView capture mode + if (_captureMethod == CaptureMethod.GameView) { - Util.Destroy(_blitMaterial); + PrepareBuffer(Screen.width, Screen.height); + var temp = RenderTexture.GetTemporary(Screen.width, Screen.height, 0); + ScreenCapture.CaptureScreenshotIntoRenderTexture(temp); + Blitter.BlitVFlip(_resources, temp, _buffer, _keepAlpha); + RenderTexture.ReleaseTemporary(temp); } - void Update() + // Texture capture mode + if (_captureMethod == CaptureMethod.Texture) { - // Render texture mode update - if (GetComponent() == null && _sourceTexture != null) - SendRenderTexture(_sourceTexture); + if (_sourceTexture == null) return; + PrepareBuffer(_sourceTexture.width, _sourceTexture.height); + Blitter.Blit(_resources, _sourceTexture, _buffer, _keepAlpha); } - void OnRenderImage(RenderTexture source, RenderTexture destination) + // Camera capture mode + if (_captureMethod == CaptureMethod.Camera) { - // Camera capture mode update - SendRenderTexture(source); - - // Thru blit - Graphics.Blit(source, destination); + PrepareCameraCapture(_sourceCamera); + if (_sourceCamera == null) return; + PrepareBuffer(_sourceCamera.pixelWidth, _sourceCamera.pixelHeight); } - #endregion + // Sender lazy initialization + if (_sender == null) _sender = new Sender(_spoutName, _buffer); + + // Sender plugin-side update + _sender.Update(); } + + #endregion } + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs.meta index 2ebfc50..9d2aede 100644 --- a/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs.meta +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender.cs.meta @@ -1,10 +1,12 @@ fileFormatVersion: 2 guid: 45099d624c1e6c14e9514f4e5ea1ed9c -timeCreated: 1491793847 -licenseType: Pro MonoImporter: + externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - _sourceCamera: {instanceID: 0} + - _sourceTexture: {instanceID: 0} + - _resources: {fileID: 11400000, guid: f449ebbe2051c2e4d993eaa773a410de, type: 2} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs new file mode 100644 index 0000000..89eb039 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs @@ -0,0 +1,73 @@ +using UnityEngine; + +namespace Klak.Spout { + +// Sender capture methods +public enum CaptureMethod { GameView, Camera, Texture } + +// +// Spout sender class (properties) +// +partial class SpoutSender +{ + #region Spout source + + [SerializeField] string _spoutName = "Spout Sender"; + + public string spoutName + { get => _spoutName; + set => ChangeSpoutName(value); } + + void ChangeSpoutName(string name) + { + // Sender refresh on renaming + if (_spoutName == name) return; + _spoutName = name; + ReleaseSender(); + } + + #endregion + + #region Format option + + [SerializeField] bool _keepAlpha = false; + + public bool keepAlpha + { get => _keepAlpha; + set => _keepAlpha = value; } + + #endregion + + #region Capture target + + [SerializeField] CaptureMethod _captureMethod = CaptureMethod.GameView; + + public CaptureMethod captureMethod + { get => _captureMethod; + set => _captureMethod = value; } + + [SerializeField] Camera _sourceCamera = null; + + public Camera sourceCamera + { get => _sourceCamera; + set => _sourceCamera = value; } + + [SerializeField] Texture _sourceTexture = null; + + public Texture sourceTexture + { get => _sourceTexture; + set => _sourceTexture = value; } + + #endregion + + #region Resource asset reference + + [SerializeField, HideInInspector] SpoutResources _resources = null; + + public void SetResources(SpoutResources resources) + => _resources = resources; + + #endregion +} + +} // namespace Klak.Spout diff --git a/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs.meta b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs.meta new file mode 100644 index 0000000..b8baad2 --- /dev/null +++ b/Packages/jp.keijiro.klak.spout/Runtime/SpoutSender_Properties.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: abd4b9ae3ca6fa14298417851dced4cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.klak.spout/package.json b/Packages/jp.keijiro.klak.spout/package.json index bb996fa..8f7c797 100644 --- a/Packages/jp.keijiro.klak.spout/package.json +++ b/Packages/jp.keijiro.klak.spout/package.json @@ -1,12 +1,13 @@ { "author": "Keijiro Takahashi", + "dependencies": { "com.unity.modules.screencapture": "1.0.0" }, "description": "Cross-process texture sharing plugin (Spout protocol)", "displayName": "KlakSpout", "keywords": [ "unity" ], - "license": "MIT", + "license": "Unlicense", "name": "jp.keijiro.klak.spout", "repository": "github:keijiro/KlakSpout", - "unity": "2019.3", + "unity": "2020.3", "unityRelease": "1f1", - "version": "1.0.0" + "version": "2.0.0" } diff --git a/Packages/manifest.json b/Packages/manifest.json index 35ebb1f..322e2f5 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,6 +1,6 @@ { "dependencies": { - "com.unity.modules.particlesystem": "1.0.0", - "com.unity.ugui": "1.0.0" + "com.unity.render-pipelines.universal": "10.5.1", + "com.unity.modules.physics": "1.0.0" } } diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..2b865f6 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,97 @@ +{ + "dependencies": { + "com.unity.mathematics": { + "version": "1.1.0", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.render-pipelines.core": { + "version": "10.5.1", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.render-pipelines.universal": { + "version": "10.5.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.1.0", + "com.unity.render-pipelines.core": "10.5.1", + "com.unity.shadergraph": "10.5.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.searcher": { + "version": "4.3.2", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.shadergraph": { + "version": "10.5.1", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.render-pipelines.core": "10.5.1", + "com.unity.searcher": "4.3.2" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 2, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "jp.keijiro.klak.spout": { + "version": "file:jp.keijiro.klak.spout", + "depth": 0, + "source": "embedded", + "dependencies": { + "com.unity.modules.screencapture": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 2, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 3, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 3, + "source": "builtin", + "dependencies": {} + } + } +} diff --git a/Plugin/CMakeLists.txt b/Plugin/CMakeLists.txt deleted file mode 100644 index bc3fe2c..0000000 --- a/Plugin/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -cmake_minimum_required(VERSION 3.15) - -project(KlakSpout) - -set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/../Packages/jp.keijiro.klak.spout/Plugin CACHE PATH "KlakSpout DLL installation directory" FORCE) - -set(Sources - Unity/IUnityGraphics.h - Unity/IUnityGraphicsD3D11.h - Unity/IUnityGraphicsD3D12.h - Unity/IUnityInterface.h - Unity/IUnityProfiler.h - Unity/IUnityRenderingExtensions.h - - Spout/SpoutGL/Spout.h - Spout/SpoutGL/SpoutCommon.h - Spout/SpoutGL/SpoutCopy.h - Spout/SpoutGL/SpoutDirectX.h - Spout/SpoutGL/SpoutFrameCount.h - Spout/SpoutGL/SpoutGL.h - Spout/SpoutGL/SpoutGLextensions.h - Spout/SpoutGL/SpoutReceiver.h - Spout/SpoutGL/SpoutSender.h - Spout/SpoutGL/SpoutSenderNames.h - Spout/SpoutGL/SpoutSharedMemory.h - Spout/SpoutGL/SpoutUtils.h - Spout/SpoutGL/Spout.cpp - Spout/SpoutGL/SpoutCopy.cpp - Spout/SpoutGL/SpoutDirectX.cpp - Spout/SpoutGL/SpoutFrameCount.cpp - Spout/SpoutGL/SpoutGL.cpp - Spout/SpoutGL/SpoutGLextensions.cpp - Spout/SpoutGL/SpoutReceiver.cpp - Spout/SpoutGL/SpoutSender.cpp - Spout/SpoutGL/SpoutSenderNames.cpp - Spout/SpoutGL/SpoutSharedMemory.cpp - Spout/SpoutGL/SpoutUtils.cpp - - # Spout/SpoutDirectX/SpoutDX/SpoutDX.h - # Spout/SpoutDirectX/SpoutDX/SpoutDX.cpp - # Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.h - # Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.cpp - - KlakSpout/KlakSpoutGlobals.h - KlakSpout/KlakSpoutSharedObject.h - KlakSpout/KlakSpout.cpp -) - -set(Link - opengl32 - kernel32 - user32 - gdi32 - winspool - comdlg32 - advapi32 - shell32 - ole32 - oleaut32 - uuid - odbc32 - odbccp32 - d3d9 - d3d11 - d3d12 - DXGI - shlwapi - Version -) - -add_library(KlakSpout SHARED ${Sources} ) -target_link_libraries(KlakSpout PRIVATE ${Link} ) -target_compile_definitions(KlakSpout PRIVATE SPOUT_BUILD_DLL) - -target_compile_definitions(KlakSpout PRIVATE $<$:KLAKSPOUT_DEBUG>) -target_compile_definitions(KlakSpout PRIVATE $<$:KLAKSPOUT_RELEASE>) - -# Enable all compiler warnings -if(MSVC) - target_compile_options(KlakSpout PRIVATE /W4) -else() - target_compile_options(KlakSpout PRIVATE -Wall) -endif() - -# From Spout's CMake -if(NOT MSVC) - target_compile_options(KlakSpout PRIVATE -msse4) -endif() - -# 32 or 64 bit library -if(CMAKE_SIZEOF_VOID_P EQUAL 4) - install(TARGETS KlakSpout RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/x86) -else() - install(TARGETS KlakSpout RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/x86_64) -endif() diff --git a/Plugin/Common.h b/Plugin/Common.h new file mode 100644 index 0000000..b8d1751 --- /dev/null +++ b/Plugin/Common.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include +#include +#include // for ComPtr +#include "Spout/SpoutSenderNames.h" +#include "Unity/IUnityGraphics.h" +#include "Unity/IUnityGraphicsD3D11.h" +#include "Unity/IUnityGraphicsD3D12.h" + +namespace KlakSpout { + +namespace WRL = Microsoft::WRL; // for ComPtr + +static inline void LogError + (const char* label, const std::string& name, unsigned int code) +{ + std::printf("KlakSpout error: %s (%s) - %x\n", label, name.c_str(), code); +} + +} // namespace KlakSpout diff --git a/Plugin/Event.h b/Plugin/Event.h new file mode 100644 index 0000000..558576c --- /dev/null +++ b/Plugin/Event.h @@ -0,0 +1,31 @@ +#pragma once + +#include "Common.h" +#include "Sender.h" +#include "Receiver.h" + +namespace KlakSpout { + +// Render event IDs +// Should match with Klak.Spout.EventID (Event.cs) +enum EventID +{ + event_updateSender, + event_updateReceiver, + event_closeSender, + event_closeReceiver +}; + +// Render event attachment data structure +// Should match with Klak.Spout.EventData (Event.cs) +struct EventData +{ + union + { + Sender* sender; + Receiver* receiver; + }; + IUnknown* texture; // ID3D11Texture or ID3D12Resource +}; + +} // namespace KlakSpout diff --git a/Plugin/HowToBuild.txt b/Plugin/HowToBuild.txt index 5c41c0d..0c507b9 100644 --- a/Plugin/HowToBuild.txt +++ b/Plugin/HowToBuild.txt @@ -1,16 +1,4 @@ -Using CMake 3.15 or later. - -For 32-bit build: -cmake -S . -B build32 -DCMAKE_BUILD_TYPE=Release -A Win32 -cmake --build build32 --target install --config "Release" - -For 64-bit build: -cmake -S . -B build64 -DCMAKE_BUILD_TYPE=Release -A x64 -cmake --build build64 --target install --config "Release" - -These correctly set the build type (Release/Debug) and architecture (32/64 bit) -for multi-configuration generators (ex Visual Studio) and single-configuration -generators (ex Makefiles) alike. - -If using an IDE such as Visual Studio Code, make sure the desired configs are -also set (often Debug is the default build type). +The Makefile in this directory uses Mingw-w64 to build the plugin. See the +following repository for further instructions: + +https://github.com/keijiro/UnityDX12MingwTest diff --git a/Plugin/KlakSpout/KlakSpout.cpp b/Plugin/KlakSpout/KlakSpout.cpp deleted file mode 100644 index aabf89d..0000000 --- a/Plugin/KlakSpout/KlakSpout.cpp +++ /dev/null @@ -1,401 +0,0 @@ -#include "KlakSpoutSharedObject.h" -#include "../Unity/IUnityGraphics.h" -#include "../Unity/IUnityGraphicsD3D11.h" -#include "../Unity/IUnityGraphicsD3D12.h" -#include "../Unity/IUnityRenderingExtensions.h" -#include -#include -#include - -namespace -{ - // Low-level native plugin interface - IUnityInterfaces* unity_; - - // Temporary storage for shared Spout object list - std::set shared_object_names_; - - // Local mutex object used to prevent race conditions between the main - // thread and the render thread. This should be locked at the following - // points: - // - OnRenderEvent - // - OnCustomBlit - // - In general, plugin functions that call SharedObject or Spout API functions. - // - // Some Spout API functions are already thread-safe internally. - std::mutex lock_; - - #define MUTEX_LOCK PROFILE_START(markerMutex); std::lock_guard guard(lock_); PROFILE_END(markerMutex); - - // The default event config asks Unity to do a lot of syncs and flushes. - // We need to configure the event to do the minimum work required for our use case. - UnityD3D12PluginEventConfig custom_blit_event_config_; - - // Set by the user before calling OnCustomBlit, which will apply to the set object - klakspout::SharedObject* target_shared_object_ = nullptr; - - // Unity device event callback - void UNITY_INTERFACE_API OnGraphicsDeviceEvent(UnityGfxDeviceEventType event_type) - { - assert(unity_); - - // Do nothing if it's not the D3D11 or D3D12 renderer. - UnityGfxRenderer renderer = unity_->Get()->GetRenderer(); - if (renderer != kUnityGfxRendererD3D11 && renderer != kUnityGfxRendererD3D12) return; - - DEBUG_LOG("OnGraphicsDeviceEvent (%d)", event_type); - - auto& g = klakspout::Globals::get(); - - if (event_type == kUnityGfxDeviceEventInitialize) - { - // Initialize the Spout global objects. - g.spout_ = std::make_unique(); - g.sender_names_ = std::make_unique(); - - // Enable Spout's debug log in addition to our own -#ifdef KLAKSPOUT_DEBUG - OpenSpoutConsole(); // Console only for debugging - EnableSpoutLog(); // Log to console -#endif - - if (renderer == kUnityGfxRendererD3D11) - { - g.renderer_ = klakspout::Globals::Renderer::DX11; - - g.d3d11_interface_ = unity_->Get(); - if (!g.d3d11_interface_) - DEBUG_LOG("Couldn't get d3d11 interface"); - - g.d3d11_ = g.d3d11_interface_->GetDevice(); - if (!g.d3d11_) - DEBUG_LOG("Couldn't get d3d11 device"); - - g.d3d11_->GetImmediateContext(&g.d3d11Context_); - if (!g.d3d11Context_) - DEBUG_LOG("Couldn't get d3d11 context"); - } - else if (renderer == kUnityGfxRendererD3D12) - { - g.renderer_ = klakspout::Globals::Renderer::DX12; - - g.d3d12_interface_ = unity_->Get(); - if (!g.d3d12_interface_) - DEBUG_LOG("Couldn't get d3d12 interface"); - - g.d3d12_ = g.d3d12_interface_->GetDevice(); - if (!g.d3d12_) - DEBUG_LOG("Couldn't get d3d12 device"); - - UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; -#ifdef KLAKSPOUT_DEBUG - // Enable debug layer, can slow down performance - flags |= D3D11_CREATE_DEVICE_DEBUG; -#endif - - // Create 11on12 device - IUnknown* queue = static_cast(g.d3d12_interface_->GetCommandQueue()); - HRESULT hr = D3D11On12CreateDevice( - g.d3d12_, - flags, - nullptr, - 0, - &queue, - 1, - 0, - &g.d3d11_, - &g.d3d11Context_, - nullptr - ); - - if (FAILED(hr)) - DEBUG_LOG("Failed to create 11on12 device"); - - // Grab interface to the d3d11on12 device from the newly created d3d11 device - hr = g.d3d11_->QueryInterface(__uuidof(ID3D11On12Device), (void**)&g.d3d11on12_); - if (FAILED(hr)) - DEBUG_LOG("Failed to query 11on12 device"); - - custom_blit_event_config_.flags = 0; - custom_blit_event_config_.ensureActiveRenderTextureIsBound = false; - custom_blit_event_config_.graphicsQueueAccess = kUnityD3D12GraphicsQueueAccess_Allow; - g.d3d12_interface_->ConfigureEvent(kUnityRenderingExtEventCustomBlit, &custom_blit_event_config_); - } - } - else if (event_type == kUnityGfxDeviceEventShutdown) - { - // Invalidate state - g.d3d11_ = nullptr; - g.d3d11Context_ = nullptr; - g.d3d11on12_ = nullptr; - g.d3d12_ = nullptr; - - // Finalize the Spout globals. - g.spout_.reset(); - g.sender_names_.reset(); - } - } - - // Unity render event callbacks - void UNITY_INTERFACE_API OnRenderEvent(int event_id, void* data) - { - // Do nothing if the D3D11 interface is not available. This only - // happens on Editor. It may leak some resoruces but we can't do - // anything about them. - auto& g = klakspout::Globals::get(); - if (!g.isReady()) return; - - MUTEX_LOCK; - auto plugin_event = static_cast(event_id); - - if (plugin_event == klakspout::Globals::PluginEvent::Dispose) - { - PROFILE_SCOPE(markerEventDispose); - - auto* pobj = reinterpret_cast(data); - delete pobj; - } - else if (plugin_event == klakspout::Globals::PluginEvent::SetTargetObject) - { - PROFILE_SCOPE(markerEventTargetObject); - - auto* pobj = reinterpret_cast(data); - target_shared_object_ = pobj; - - if (!pobj->isActive()) - pobj->activate(); - } - else if (plugin_event == klakspout::Globals::PluginEvent::UpdateWrapCache) - { - // The wrap cache is only necessary for DX12 - if (g.renderer_ != klakspout::Globals::Renderer::DX12) - return; - - PROFILE_SCOPE(markerEventUpdateWrapCache); - - // Evicts resources that we haven't seen in a while. - // - // This is necessary because of some unfortunate circumstances: - // * We need to maintain a DX11 mirror of every DX12 resource we use (for D3D11on12) - // * Creating a mirror is expensive - // * Want to support temporary RTs whose lifetimes we don't know about - - for (auto it = g.wrap_cache_.begin(); it != g.wrap_cache_.end(); ) - { - int frame_age = g.frame_count_ - it->second.last_usage_frame; - - if (frame_age >= g.cache_eviction_limit_) - { - DEBUG_LOG( - "Evicted resource (%p) at frame age (%d), cache size: %d", - it->first, - frame_age, - static_cast(g.wrap_cache_.size()) - ); - - it->second.wrapped_resource->Release(); - it->second.wrapped_resource = nullptr; - it = g.wrap_cache_.erase(it); - } - else - ++it; - } - - g.frame_count_++; - } - } - - void UNITY_INTERFACE_API OnCustomBlit(int event_id, void* data) - { - if (event_id == kUnityRenderingExtEventCustomBlit) - { - if (!target_shared_object_->isActive()) - return; - - auto* params = reinterpret_cast(data); - auto command = static_cast(params->command); - - if (command == klakspout::Globals::PluginBlitCommand::Send) - { - PROFILE_SCOPE(markerSendTexture); - - auto& g = klakspout::Globals::get(); - if (!g.isReady()) return; - MUTEX_LOCK; - - if (g.d3d11_interface_ != nullptr) - { - void* tex = g.d3d11_interface_->TextureFromNativeTexture(params->source); - target_shared_object_->sendTexture(tex); - } - else if (g.d3d12_interface_ != nullptr) - { - void* tex = g.d3d12_interface_->TextureFromNativeTexture(params->source); - target_shared_object_->sendTexture(tex); - } - } - else if (command == klakspout::Globals::PluginBlitCommand::Receive) - { - PROFILE_SCOPE(markerReceiveTexture); - - auto& g = klakspout::Globals::get(); - if (!g.isReady()) return; - MUTEX_LOCK; - - if (g.d3d11_interface_ != nullptr) - { - void* tex = g.d3d11_interface_->TextureFromNativeTexture(params->source); - target_shared_object_->receiveTexture(tex); - } - else if (g.d3d12_interface_ != nullptr) - { - void* tex = g.d3d12_interface_->TextureFromNativeTexture(params->source); - target_shared_object_->receiveTexture(tex); - } - } - } - } -} - -// -// Low-level native plugin implementation -// - -extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* interfaces) -{ - unity_ = interfaces; - - // Replace stdout with a new console for debugging. -#if defined(KLAKSPOUT_DEBUG) - FILE * pConsole; - AllocConsole(); - freopen_s(&pConsole, "CONOUT$", "wb", stdout); -#endif - - klakspout::unityProfiler = unity_->Get(); - if (klakspout::unityProfiler != nullptr) - { - klakspout::unityProfilerIsAvailable = klakspout::unityProfiler->IsAvailable() != 0; - klakspout::unityProfiler->CreateMarker(&klakspout::markerEventDispose, "KlakSpout/Dispose", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerEventTargetObject, "KlakSpout/TargetObject", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerEventUpdateWrapCache, "KlakSpout/UpdateWrapCache", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerSendTexture, "KlakSpout/SendTexture", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerReceiveTexture, "KlakSpout/ReceiveTexture", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerGetSenderInfo, "KlakSpout/GetSenderInfo", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerScanSharedObjects, "KlakSpout/ScanSharedObjects", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerTextureCopy, "KlakSpout/SharedObject/TextureCopy", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerTextureWrap, "KlakSpout/SharedObject/TextureWrap", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerTextureWrappedActions, "KlakSpout/SharedObject/TextureWrappedActions", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerFlush, "KlakSpout/SharedObject/Flush", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerCheckSender, "KlakSpout/SharedObject/CheckSender", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerCreateSharedTexture, "KlakSpout/SharedObject/CreateSharedTexture", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerCreateSRV, "KlakSpout/SharedObject/CreateSRV", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerCreateSender, "KlakSpout/SharedObject/CreateSender", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerOpenSharedTexture, "KlakSpout/SharedObject/OpenSharedTexture", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - klakspout::unityProfiler->CreateMarker(&klakspout::markerMutex, "KlakSpout/Mutex", kUnityProfilerCategoryRender, kUnityProfilerMarkerFlagDefault, 0); - } - - // Register the custom callback, then manually invoke the initialization event once. - unity_->Get()->RegisterDeviceEventCallback(OnGraphicsDeviceEvent); - OnGraphicsDeviceEvent(kUnityGfxDeviceEventInitialize); -} - -extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload() -{ - // Unregister the custom callback. - unity_->Get()->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent); - - unity_ = nullptr; -} - -extern "C" UnityRenderingEventAndData UNITY_INTERFACE_EXPORT GetRenderEventFunc() -{ - return OnRenderEvent; -} - -extern "C" UnityRenderingEventAndData UNITY_INTERFACE_EXPORT GetCustomBlitFunc() -{ - return OnCustomBlit; -} - -// -// Native plugin implementation -// - -extern "C" void UNITY_INTERFACE_EXPORT * CreateSender(const char* name, int width, int height) -{ - if (!klakspout::Globals::get().isReady()) return nullptr; - return new klakspout::SharedObject(klakspout::SharedObject::Type::sender, name != nullptr ? name : "", width, height); -} - -extern "C" void UNITY_INTERFACE_EXPORT * CreateReceiver(const char* name) -{ - if (!klakspout::Globals::get().isReady()) return nullptr; - return new klakspout::SharedObject(klakspout::SharedObject::Type::receiver, name != nullptr ? name : ""); -} - -extern "C" int UNITY_INTERFACE_EXPORT GetTextureWidth(void* ptr) -{ - return reinterpret_cast(ptr)->width_; -} - -extern "C" int UNITY_INTERFACE_EXPORT GetTextureHeight(void* ptr) -{ - return reinterpret_cast(ptr)->height_; -} - -extern "C" int UNITY_INTERFACE_EXPORT GetTextureFormat(void* ptr) -{ - return static_cast(reinterpret_cast(ptr)->format_); -} - -extern "C" bool UNITY_INTERFACE_EXPORT IsReady(void* ptr) -{ - return reinterpret_cast(ptr)->isActive(); -} - -extern "C" void UNITY_INTERFACE_EXPORT GetSenderInfo(const char* name, klakspout::SenderInfo* out_info) -{ - PROFILE_SCOPE(markerGetSenderInfo); - - auto& g = klakspout::Globals::get(); - - unsigned int width, height; - HANDLE handle; - DWORD format; - auto found = g.sender_names_->CheckSender(name, width, height, handle, format); - - out_info->width_ = static_cast(width); - out_info->height_ = static_cast(height); - out_info->format_ = static_cast(format); - out_info->exists_ = found; -} - -extern "C" int UNITY_INTERFACE_EXPORT ScanSharedObjects() -{ - PROFILE_SCOPE(markerScanSharedObjects); - - auto& g = klakspout::Globals::get(); - if (!g.isReady()) return 0; - - shared_object_names_.clear(); - g.sender_names_->GetSenderNames(&shared_object_names_); - - return static_cast(shared_object_names_.size()); -} - -extern "C" const void UNITY_INTERFACE_EXPORT * GetSharedObjectName(int index) -{ - auto count = 0; - for (auto& name : shared_object_names_) - { - if (count++ == index) - { - // Return the name via a static string object. - static std::string temp; - temp = name; - return temp.c_str(); - } - } - return nullptr; -} diff --git a/Plugin/KlakSpout/KlakSpoutGlobals.h b/Plugin/KlakSpout/KlakSpoutGlobals.h deleted file mode 100644 index e3fcd9d..0000000 --- a/Plugin/KlakSpout/KlakSpoutGlobals.h +++ /dev/null @@ -1,128 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include "../Spout/SpoutGL/SpoutDirectX.h" -#include "../Spout/SpoutGL/SpoutSenderNames.h" -#include "../Unity/IUnityGraphicsD3D11.h" -#include "../Unity/IUnityGraphicsD3D12.h" -#include "../Unity/IUnityProfiler.h" - -// Debug logging macro -#if defined(KLAKSPOUT_DEBUG) -#define DEBUG_LOG(fmt, ...) std::printf("KlakSpout: "#fmt"\n", __VA_ARGS__) -#else -#define DEBUG_LOG(fmt, ...) do {} while (0) -#endif - -// Profiling macros -#define PROFILE_START(marker) if (klakspout::unityProfilerIsAvailable) klakspout::unityProfiler->BeginSample(klakspout::marker) -#define PROFILE_END(marker) if (klakspout::unityProfilerIsAvailable) klakspout::unityProfiler->EndSample(klakspout::marker) -#define PROFILE_SCOPE(marker) klakspout::ScopedMarker(klakspout::marker, klakspout::unityProfiler, klakspout::unityProfilerIsAvailable) - -namespace klakspout -{ - static IUnityProfiler* unityProfiler = nullptr; - static bool unityProfilerIsAvailable = false; - static const UnityProfilerMarkerDesc* markerEventDispose = nullptr; - static const UnityProfilerMarkerDesc* markerEventTargetObject = nullptr; - static const UnityProfilerMarkerDesc* markerEventUpdateWrapCache = nullptr; - static const UnityProfilerMarkerDesc* markerSendTexture = nullptr; - static const UnityProfilerMarkerDesc* markerReceiveTexture = nullptr; - static const UnityProfilerMarkerDesc* markerGetSenderInfo = nullptr; - static const UnityProfilerMarkerDesc* markerScanSharedObjects = nullptr; - static const UnityProfilerMarkerDesc* markerTextureCopy = nullptr; - static const UnityProfilerMarkerDesc* markerTextureWrap = nullptr; - static const UnityProfilerMarkerDesc* markerTextureWrappedActions = nullptr; - static const UnityProfilerMarkerDesc* markerFlush = nullptr; - static const UnityProfilerMarkerDesc* markerCheckSender = nullptr; - static const UnityProfilerMarkerDesc* markerCreateSharedTexture = nullptr; - static const UnityProfilerMarkerDesc* markerCreateSRV = nullptr; - static const UnityProfilerMarkerDesc* markerCreateSender = nullptr; - static const UnityProfilerMarkerDesc* markerOpenSharedTexture = nullptr; - static const UnityProfilerMarkerDesc* markerMutex = nullptr; - - class ScopedMarker - { - public: - - explicit ScopedMarker(const UnityProfilerMarkerDesc* marker, IUnityProfiler* profiler, bool enabled) - : marker_(marker), profiler_(profiler), enabled_(enabled) - { - if (enabled_) - profiler_->BeginSample(marker_); - } - - ~ScopedMarker() noexcept - { - if (enabled_) - profiler_->EndSample(marker_); - } - - ScopedMarker(const ScopedMarker&) = delete; - ScopedMarker& operator=(const ScopedMarker&) = delete; - - private: - - const UnityProfilerMarkerDesc* marker_; - IUnityProfiler* profiler_; - bool enabled_; - }; - - struct SenderInfo - { - int width_; - int height_; - int format_; - bool exists_; - bool is_same_size_; - }; - - struct DX12WrapCacheEntry - { - ID3D11Resource* wrapped_resource; - int last_usage_frame; - }; - - // Singleton class used for storing global variables - class Globals final - { - public: - - enum class PluginEvent { Dispose, SetTargetObject, UpdateWrapCache }; - enum class PluginBlitCommand { Send = 2, Receive = 3 }; - - enum class Renderer { DX11, DX12 } renderer_; - - IUnityGraphicsD3D11* d3d11_interface_ = nullptr; - ID3D11Device* d3d11_ = nullptr; - ID3D11DeviceContext* d3d11Context_ = nullptr; - - // For DX12 - IUnityGraphicsD3D12v6* d3d12_interface_ = nullptr; - ID3D11On12Device* d3d11on12_ = nullptr; - ID3D12Device* d3d12_ = nullptr; - std::map wrap_cache_; - const int cache_eviction_limit_ = 10; - int frame_count_ = 0; - - std::unique_ptr spout_ = nullptr; - std::unique_ptr sender_names_ = nullptr; - - static Globals& get() - { - static Globals instance; - return instance; - } - - bool isReady() const - { - return d3d11_ != nullptr; - } - }; -} diff --git a/Plugin/KlakSpout/KlakSpoutSharedObject.h b/Plugin/KlakSpout/KlakSpoutSharedObject.h deleted file mode 100644 index 3512886..0000000 --- a/Plugin/KlakSpout/KlakSpoutSharedObject.h +++ /dev/null @@ -1,384 +0,0 @@ -#pragma once - -#include "KlakSpoutGlobals.h" -#include - -namespace klakspout -{ - // Shared Spout object handler class - // Not thread safe. The owner should care about it. - class SharedObject final - { - public: - - // Object type - enum class Type { sender, receiver } const type_; - - // Object attributes - const std::string name_; - int width_, height_; - DXGI_FORMAT format_; - - // For DX11 - ID3D11Resource* d3d11_resource_; - ID3D11ShaderResourceView* d3d11_resource_view_; - - // Constructor - SharedObject(Type type, const std::string& name, int width = -1, int height = -1) - : type_(type), name_(name), width_(width), height_(height), - d3d11_resource_(nullptr), d3d11_resource_view_(nullptr) - { - if (type_ == Type::sender) - DEBUG_LOG("Sender created (%s)", name_.c_str()); - else - DEBUG_LOG("Receiver created (%s)", name_.c_str()); - } - - // Destructor - ~SharedObject() - { - releaseInternals(); - - if (type_ == Type::sender) - DEBUG_LOG("Sender disposed (%s)", name_.c_str()); - else - DEBUG_LOG("Receiver disposed (%s)", name_.c_str()); - } - - // Prohibit use of default constructor and copy operators - SharedObject() = delete; - SharedObject(SharedObject&) = delete; - SharedObject& operator = (const SharedObject&) = delete; - - // Check if it's active. - bool isActive() const - { - return d3d11_resource_ != nullptr; - } - - // Try activating the object. Returns false when failed. - bool activate() - { - assert(d3d11_resource_ == nullptr && d3d11_resource_view_ == nullptr); - return type_ == Type::sender ? setupSender() : setupReceiver(); - } - - int sendTexture(void* tex) - { - auto& g = Globals::get(); - - if (g.renderer_ == klakspout::Globals::Renderer::DX11) - { - PROFILE_SCOPE(markerTextureCopy); - - ID3D11Resource* source_resource = static_cast(tex); - - g.d3d11Context_->CopyResource(d3d11_resource_, source_resource); - } - else if (g.renderer_ == klakspout::Globals::Renderer::DX12) - { - ID3D12Resource* dx12_resource = static_cast(tex); - ID3D11Resource* dx11_resource = getWrappedResource(dx12_resource, g.frame_count_); - - { - PROFILE_SCOPE(markerTextureWrappedActions); - - // Taken from spoutDX12::SendDX11Resource - g.d3d11on12_->AcquireWrappedResources(&dx11_resource, 1); - { - PROFILE_SCOPE(markerTextureCopy); - - g.d3d11Context_->CopyResource(d3d11_resource_, dx11_resource); - } - g.d3d11on12_->ReleaseWrappedResources(&dx11_resource, 1); - } - - // DX12 needs a flush call - { - PROFILE_SCOPE(markerFlush); - - g.d3d11Context_->Flush(); - } - } - - return 1; - } - - int receiveTexture(void* tex) - { - auto& g = Globals::get(); - - if (g.renderer_ == klakspout::Globals::Renderer::DX11) - { - PROFILE_SCOPE(markerTextureCopy); - - ID3D11Resource* destination_resource = static_cast(tex); - - g.d3d11Context_->CopyResource(destination_resource, d3d11_resource_); - } - else if (g.renderer_ == klakspout::Globals::Renderer::DX12) - { - ID3D12Resource* dx12_resource = static_cast(tex); - ID3D11Resource* dx11_resource = getWrappedResource(dx12_resource, g.frame_count_); - - { - PROFILE_SCOPE(markerTextureWrappedActions); - - // Taken from spoutDX12::ReceiveDX12Resource - g.d3d11on12_->AcquireWrappedResources(&dx11_resource, 1); - { - PROFILE_SCOPE(markerTextureCopy); - - g.d3d11Context_->CopyResource(dx11_resource, d3d11_resource_); - } - g.d3d11on12_->ReleaseWrappedResources(&dx11_resource, 1); - } - - // DX12 needs a flush call - { - PROFILE_SCOPE(markerFlush); - - g.d3d11Context_->Flush(); - } - } - - return 1; - } - - // Deactivate the object and release its internal resources. - void deactivate() - { - releaseInternals(); - } - - private: - - // Release internal objects. - void releaseInternals() - { - auto& g = Globals::get(); - - // Senders should unregister their own name on destruction. - if (type_ == Type::sender && d3d11_resource_) - g.sender_names_->ReleaseSenderName(name_.c_str()); - - // Release D3D11 objects. - if (d3d11_resource_) - { - d3d11_resource_->Release(); - d3d11_resource_ = nullptr; - } - - if (d3d11_resource_view_) - { - d3d11_resource_view_->Release(); - d3d11_resource_view_ = nullptr; - } - } - - // For DX12 only, not needed on DX11. - // Each resource that we use needs a DX11on12 representation. - // - // Creation of a DX11on12 representation is an expensive operation. - // - // There's no SharedObject to DX12 resource mapping possible because - // temporary RTs might be shared between multiple SharedObjects. - // - // For these reasons we use a cache. - ID3D11Resource* getWrappedResource(ID3D12Resource* dx12_resource, int frame_count) - { - ID3D11Resource* dx11_resource = nullptr; - - auto& g = Globals::get(); - auto it = g.wrap_cache_.find(dx12_resource); - - // Taken from spoutDX12::WrapDX12Resource - if (it == g.wrap_cache_.end()) - { - PROFILE_SCOPE(markerTextureWrap); - - HRESULT hr = S_OK; - - // A D3D11_RESOURCE_FLAGS structure that enables an application to override flags - // that would be inferred by the resource/heap properties. - // The D3D11_RESOURCE_FLAGS structure contains bind flags, misc flags, and CPU access flags. - D3D11_RESOURCE_FLAGS d3d11Flags = {}; - - // Create a wrapped resource to access our d3d12 resource from the d3d11 device - // Note: D3D12_RESOURCE_STATE variables are: - // (1) the state of the d3d12 resource when we acquire it - // (when the d3d12 pipeline is finished with it and we are ready to use it in d3d11) - // (2) when we are done using it in d3d11 (we release it back to d3d12) - // these are the states our resource will be transitioned into - hr = g.d3d11on12_->CreateWrappedResource( - dx12_resource, // A pointer to an already-created D3D12 resource or heap. - &d3d11Flags, - D3D12_RESOURCE_STATE_COMMON, // InState - D3D12_RESOURCE_STATE_COMMON, // OutState - IID_PPV_ARGS(&dx11_resource) - ); // Lazy - - if (FAILED(hr)) { - DEBUG_LOG("spoutDX12::WrapDX12Resource - failed to create wrapped resource (%d 0x%.7X)", LOWORD(hr), UINT(hr)); - return 0; - } - - DX12WrapCacheEntry entry; - entry.wrapped_resource = dx11_resource; - entry.last_usage_frame = frame_count; - g.wrap_cache_.insert(std::make_pair(dx12_resource, entry)); - - DEBUG_LOG( - "Added resource (%p), cache size: %d", - dx12_resource, - static_cast(g.wrap_cache_.size()) - ); - } - else - { - dx11_resource = it->second.wrapped_resource; - it->second.last_usage_frame = frame_count; - } - - return dx11_resource; - } - - // Set up as a sender. - bool setupSender() - { - auto& g = Globals::get(); - - // Avoid name duplication. - { - PROFILE_SCOPE(markerCheckSender); - - unsigned int width, height; HANDLE handle; DWORD format; // unused - if (g.sender_names_->CheckSender(name_.c_str(), width, height, handle, format)) - return false; - } - - // Currently we only support Unity's RGBA32 TextureFormat - // (which is the ARGB32 RenderTextureFormat). - format_ = DXGI_FORMAT_R8G8B8A8_UNORM; - - ID3D11Texture2D* texture = nullptr; - HANDLE handle; - bool res_spout; - - // Create a shared texture. - { - PROFILE_SCOPE(markerCreateSharedTexture); - - res_spout = g.spout_->CreateSharedDX11Texture(g.d3d11_, width_, height_, format_, &texture, handle); - } - - if (!res_spout) - { - DEBUG_LOG("CreateSharedDX11Texture failed (%s)", name_.c_str()); - return false; - } - - d3d11_resource_ = texture; - - HRESULT res_d3d = S_OK; - - // Create a resource view for the shared texture. - { - PROFILE_SCOPE(markerCreateSRV); - - res_d3d = g.d3d11_->CreateShaderResourceView(d3d11_resource_, nullptr, &d3d11_resource_view_); - } - - if (FAILED(res_d3d)) - { - d3d11_resource_->Release(); - d3d11_resource_ = nullptr; - DEBUG_LOG("CreateShaderResourceView failed (%s:%x)", name_.c_str(), res_d3d); - return false; - } - - // Create a Spout sender object for the shared texture. - { - PROFILE_SCOPE(markerCreateSender); - - res_spout = g.sender_names_->CreateSender(name_.c_str(), width_, height_, handle, format_); - } - - if (!res_spout) - { - d3d11_resource_view_->Release(); - d3d11_resource_view_ = nullptr; - d3d11_resource_->Release(); - d3d11_resource_ = nullptr; - DEBUG_LOG("CreateSender failed (%s)", name_.c_str()); - return false; - } - - DEBUG_LOG("Sender activated (%s)", name_.c_str()); - return true; - } - - // Set up as a receiver. - bool setupReceiver() - { - auto& g = Globals::get(); - - // Retrieve the sender information with the given name. - HANDLE handle; - DWORD format; - unsigned int w, h; - - bool res_spout = true; - - { - PROFILE_SCOPE(markerCheckSender); - - res_spout = g.sender_names_->CheckSender(name_.c_str(), w, h, handle, format); - } - - if (!res_spout) - { - // This happens really frequently. Avoid spamming the console. - // DEBUG_LOG("CheckSender failed (%s)", name_.c_str()); - return false; - } - - width_ = w; - height_ = h; - format_ = static_cast(format); - HRESULT res_d3d = S_OK; - - // Start sharing the texture. - { - PROFILE_SCOPE(markerOpenSharedTexture); - - void** ptr = reinterpret_cast(&d3d11_resource_); - res_d3d = g.d3d11_->OpenSharedResource(handle, __uuidof(ID3D11Resource), ptr); - } - - if (FAILED(res_d3d)) - { - DEBUG_LOG("OpenSharedResource failed (%s:%x)", name_.c_str(), res_d3d); - return false; - } - - // Create a resource view for the shared texture. - { - PROFILE_SCOPE(markerCreateSRV); - - res_d3d = g.d3d11_->CreateShaderResourceView(d3d11_resource_, nullptr, &d3d11_resource_view_); - } - - if (FAILED(res_d3d)) - { - d3d11_resource_->Release(); - d3d11_resource_ = nullptr; - DEBUG_LOG("CreateShaderResourceView failed (%s:%x)", name_.c_str(), res_d3d); - return false; - } - - DEBUG_LOG("Receiver activated (%s)", name_.c_str()); - return true; - } - }; -} diff --git a/Plugin/Makefile b/Plugin/Makefile new file mode 100644 index 0000000..882df7e --- /dev/null +++ b/Plugin/Makefile @@ -0,0 +1,50 @@ +# +# File listings +# + +TARGET = KlakSpout.dll + +DEST = ../Packages/jp.keijiro.klak.spout/Plugin/ + +SRCS = Plugin.cpp \ + Spout/SpoutSenderNames.cpp \ + Spout/SpoutSharedMemory.cpp \ + Spout/SpoutUtils.cpp + +OBJS = $(SRCS:.cpp=.o) + +LIBS = -Wl,--subsystem,windows -static -ldxgi -ld3d12 -ld3d11 -lole32 + +# +# Compiler/linker options +# + +TOOLCHAIN = x86_64-w64-mingw32 +CC = $(TOOLCHAIN)-g++-posix +STRIP = $(TOOLCHAIN)-strip + +CC_FLAGS = -O2 +CC_FLAGS += -I. -std=c++17 -DMINI_SPOUTUTILS +CC_FLAGS += -Wall -Wno-unknown-pragmas -Wno-conversion-null +CC_FLAGS += -Wno-format -Wno-unused-function + +LD_FLAGS = -shared + +# +# Building rules +# + +all: $(TARGET) + +clean: + rm -f $(TARGET) $(OBJS) + +copy: all + cp $(TARGET) $(DEST) + +$(TARGET): $(OBJS) + $(CC) $(LD_FLAGS) -o $@ $^ $(LIBS) + $(STRIP) $@ + +%.o: %.cpp + $(CC) $(CC_FLAGS) -c -o $@ $< diff --git a/Plugin/Plugin.cpp b/Plugin/Plugin.cpp new file mode 100644 index 0000000..a90e60d --- /dev/null +++ b/Plugin/Plugin.cpp @@ -0,0 +1,90 @@ +#include "Common.h" +#include "Event.h" +#include "Receiver.h" +#include "Sender.h" +#include "System.h" +#include "Util.h" +#include + +using namespace KlakSpout; + +namespace { + +// Local mutex object used to prevent race conditions between the main thread +// and the render thread. This should be locked at the following points: +// - OnRenderEvent (this is the only point called from the render thread) +// - Plugin functions that use the Spout API functions. +std::mutex lock_; + +// Graphics device event callback +void UNITY_INTERFACE_API + OnGraphicsDeviceEvent(UnityGfxDeviceEventType event_type) +{ + if (event_type == kUnityGfxDeviceEventShutdown) _system->shutdown(); +} + +// Render event (via IssuePluginEvent) callback +void UNITY_INTERFACE_API + OnRenderEvent(int event_id, void* event_data) +{ + std::lock_guard guard(lock_); + auto data = reinterpret_cast(event_data); + if (event_id == event_updateSender ) data->sender->update(data->texture); + if (event_id == event_updateReceiver) data->receiver->update(); + if (event_id == event_closeSender ) delete data->sender; + if (event_id == event_closeReceiver) delete data->receiver; +} + +} // anonymous namespace + +// Unity low-level native plugin interface + +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API + UnityPluginLoad(IUnityInterfaces* interfaces) +{ + // System object instantiation, callback registration + _system = std::make_unique(interfaces); + _system->getGraphics()->RegisterDeviceEventCallback(OnGraphicsDeviceEvent); +} + +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload() +{ + // System object destruction + _system->getGraphics()->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent); + _system.reset(); +} + +// Plugin functions + +extern "C" UnityRenderingEventAndData UNITY_INTERFACE_EXPORT + GetRenderEventCallback() +{ + return OnRenderEvent; +} + +extern "C" Sender UNITY_INTERFACE_EXPORT * + CreateSender(const char* name, int width, int height) +{ + return new Sender(name, width, height); +} + +extern "C" Receiver UNITY_INTERFACE_EXPORT * + CreateReceiver(const char* name) +{ + return new Receiver(name); +} + +extern "C" Receiver::InteropData UNITY_INTERFACE_EXPORT + GetReceiverData(Receiver* receiver) +{ + return receiver->getInteropData(); +} + +extern "C" void UNITY_INTERFACE_EXPORT + GetSenderNames(char*** names, int* count) +{ + std::lock_guard guard(lock_); + std::set senders; + _system->spout.GetSenderNames(&senders); + std::tie(*names, *count) = MarshalStringSet(senders); +} diff --git a/Plugin/Receiver.h b/Plugin/Receiver.h new file mode 100644 index 0000000..d2bd519 --- /dev/null +++ b/Plugin/Receiver.h @@ -0,0 +1,81 @@ +#pragma once + +#include "Common.h" +#include "System.h" + +namespace KlakSpout { + +// DX11/12 compatible Spout receiver class +class Receiver final +{ +public: + + Receiver(const char* name) + : _name(name) {} + + ~Receiver() + { + _texture = nullptr; + } + + void update() + { + // Search the Spout name list. + unsigned int width, height; + HANDLE handle; + DWORD format; + auto res = _system->spout + .CheckSender(_name.c_str(), width, height, handle, format); + if (!res) return; + + // Do nothing further if the current texture is valid. + if (_texture && _width == width && _height == height) return; + + HRESULT hres; + + if (_system->isD3D12) + { + // Handle -> D3D12Resource + WRL::ComPtr resource; + hres = _system->getD3D12Device() + ->OpenSharedHandle(handle, IID_PPV_ARGS(&resource)); + _texture = resource; + } + else + { + // Handle -> D3D11Resource + WRL::ComPtr resource; + hres = _system->getD3D11Device() + ->OpenSharedResource(handle, IID_PPV_ARGS(&resource)); + _texture = resource; + } + + _width = width; + _height = height; + + if (FAILED(hres)) LogError("OpenSharedResource", _name, hres); + } + + // Receiver interop data structure + // Should match with Klak.Spout.Plugin.ReceiverData (Plugin.cs) + struct InteropData + { + unsigned int width, height; + void* texture_pointer; + }; + + InteropData getInteropData() const + { + return InteropData + { .width = _width, .height = _height, + .texture_pointer = _texture.Get() }; + } + +private: + + std::string _name; + unsigned int _width, _height; + WRL::ComPtr _texture; +}; + +} // namespace KlakSpout diff --git a/Plugin/Sender.h b/Plugin/Sender.h new file mode 100644 index 0000000..8225266 --- /dev/null +++ b/Plugin/Sender.h @@ -0,0 +1,124 @@ +#pragma once + +#include "Common.h" +#include "System.h" + +namespace KlakSpout { + +// DX11/12 compatible Spout sender class +class Sender final +{ +public: + + Sender(const char* name, int width, int height) + : _name(name), _width(width), _height(height) {} + + ~Sender() + { + if (_texture) + { + _system->spout.ReleaseSenderName(_name.c_str()); + _texture = nullptr; + } + } + + void update(IUnknown* source) + { + // Lazy initialization + if (!_texture) initialize(); + + WRL::ComPtr unknown(source); + + if (_system->isD3D12) + { + // DX12: Texture update + WRL::ComPtr d3d12; + unknown.As(&d3d12); + updateTexture(d3d12.Get()); + } + else + { + // DX11: Texture update + WRL::ComPtr d3d11; + unknown.As(&d3d11); + updateTexture(d3d11.Get()); + } + } + +private: + + std::string _name; + int _width, _height; + WRL::ComPtr _texture; + + void initialize() + { + // Make a Spout-compatible texture description. + D3D11_TEXTURE2D_DESC desc = {}; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.Width = _width; + desc.Height = _height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.SampleDesc.Count = 1; + desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; + desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + + // Create a shared texture. + auto hres = _system->getD3D11Device() + ->CreateTexture2D(&desc, nullptr, &_texture); + + if (FAILED(hres)) + { + LogError("CereateTexture2D", _name, hres); + return; + } + + // Retrieve the texture handle. + HANDLE handle; + WRL::ComPtr resource; + _texture.As(&resource); + resource->GetSharedHandle(&handle); + + // Create a Spout sender object for the shared texture. + auto res = _system->spout + .CreateSender(_name.c_str(), _width, _height, handle, desc.Format); + + if (!res) LogError("CreateSender", _name, 0); + } + + void updateTexture(ID3D11Resource* source) + { + // Texture copy + _system->getD3D11Context()->CopyResource(_texture.Get(), source); + } + + void updateTexture(ID3D12Resource* source) + { + auto d3d11on12 = _system->getD3D11On12Device(); + + // Wrapping: D3D12 -> D3D11 + D3D11_RESOURCE_FLAGS flags = {}; + WRL::ComPtr wrap; + auto hres = d3d11on12->CreateWrappedResource + (source, &flags, + D3D12_RESOURCE_STATE_COPY_SOURCE, + D3D12_RESOURCE_STATE_PRESENT, + IID_PPV_ARGS(&wrap)); + + if (FAILED(hres)) + { + LogError("CereateWrappedResource", _name, hres); + return; + } + + // Texture copy + auto ctx = _system->getD3D11Context(); + d3d11on12->AcquireWrappedResources(wrap.GetAddressOf(), 1); + ctx->CopyResource(_texture.Get(), wrap.Get()); + d3d11on12->ReleaseWrappedResources(wrap.GetAddressOf(), 1); + ctx->Flush(); + } +}; + +} // namespace KlakSpout diff --git a/Plugin/Spout/SpoutGL/SpoutCommon.h b/Plugin/Spout/SpoutCommon.h similarity index 98% rename from Plugin/Spout/SpoutGL/SpoutCommon.h rename to Plugin/Spout/SpoutCommon.h index 24f898b..cebad5b 100644 --- a/Plugin/Spout/SpoutGL/SpoutCommon.h +++ b/Plugin/Spout/SpoutCommon.h @@ -57,7 +57,7 @@ // This definition enables legacy OpenGL rendering code // used for shared texture Draw functions in SpoutGLDXinterop.cpp // Disabled by default for OpenGL 4 compliance -// #define legacyOpenGL +#define legacyOpenGL // Common utility functions namespace #include "SpoutUtils.h" diff --git a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.cpp b/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.cpp deleted file mode 100644 index 31c3f17..0000000 --- a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.cpp +++ /dev/null @@ -1,1716 +0,0 @@ -// -// SpoutDX -// -// Send a DirectX11 shared texture -// Receive from a Spout sender DirectX11 shared texture -// DirectX9 not supported -// -// ==================================================================================== -// Revisions : -// -// 07.06.19 - started DirectX helper class -// 17.10.19 - For revison of SpoutCam from OpenGL to DirectX -// Added DirectX initialise and release functions -// Added support for pixel read via staging texture -// Added pixel copy functions -// Added memoryshare support -// 30.01.20 - Simplify names for Get received texture methods -// Revise CreateDX11Texture for user flags -// Add SetTextureFlags -// 07.01.20 - Correct immediate context in SendTexture -// 13.04.20 - Revise receiver methods -// 10.05.20 - Corrected format for ReceivedTexture and GetSenderFormat -// Cleanup Tutorial07 example code -// 05.06.20 - Get memoryshare mode from registry in constructor -// 06.06.20 - Working memoryshare -// 07.06.20 - Use application device exclusively -// Strip back to basic texture share only for simplicity -// Memoryshare use unlikely for DirectX applications -// Can be restored on request -// 09.06.20 - Updated 2.007 Spout SDK files -// Restored ReceiveRGBIMage and staging texture functions -// for DirectX version of SpoutCam -// 21.06.20 - Create basic windows example using SpoutDX class -// 22.06.20 - Add ReceiveImage and ReadRGBApixels - see also SpoutCopy -// 23.06.20 - SetSenderName revision and testing -// Clean up -// 25.06.20 - Include texture format in update checks -// 26.06.20 - Revise ReceiveTexture -// Remove local receiving texture -// Remove CreateDX11Texture -// More SetSenderName revision and testing -// General update throughout -// 26.06.20 - Restore revised CreateDX11texture -// 28.06.17 - Remove ReadRGBApixels -// Change to allow class or application device -// 30.06.20 - Due to hesitions with SpoutCam, move flush for staging texture map -// from ReceiveRGBimage to ReadRGBpixels and added to ReceiveImage. -// 03.07.20 - Change OpenDirectX11 so it can be repeatedly called (see ReceiveImage) -// 04.07.20 - OpenDirectX11 check in all sending functions -// 09.07.20 - Correct ReadRGBpixels for RGBA senders -// 02.08.20 - Remove console print from ReadRGBApixels -// 02.09.20 - Revise ReceiveRGBimage, ReadRGBpixels for SpoutCam -// Only use OpenDX11shareHandle if the sender texture changes size -// to avoid a memory leak (https://github.com/leadedge/SpoutCam/issues/2) -// Release m_pSharedTexture in all close functions -// 08.09.20 - Revise ReceiveTexture and ReceiveImage to avoid repeated OpenDX11shareHandle -// Revise ReceiveImage due to problems if the staging texture remains mapped -// SendImage do not release immediate context -// Made all class objects public -// 18.09.20 - Add GetSenderAdapter and SetSenderAdapter -// 21.09.20 - Add sender IsInitialized and GetName -// ReceiveTexture, ReceiveImage and ReceiveRGBimage - -// retrieve a new shared texture pointer in ReceiveSenderData() rather than afterwards -// SendTexture - set the current adapter index after creating sender -// Prevent sharing if the sender texture was created on a different adapter -// Some protections in GetSenderAdapter -// 23.09.20 - GetSenderAdapter : return -1 on failure. Remove logs due to repeats. -// ReceiveSenderData() : catch exception for OpenDX11shareHandle failure -// Initialize m_SenderInfo and m_ShExecInfo in constructor -// 24.09.20 - Move try/catch to OpenDX11shareHandle in SpoutDirectX class -// 25.09.20 - Clean up ReceiveSenderData to allow for failure of OpenDX11shareHandle -// Compare share handle to detect a new sender instead of the name -// 02.10.20 - Async readback from GPU using two staging textures -// 04.10.20 - Correct CheckStagingTextures for size change -// - Correct ReceiveSenderData to release texture before OpenSharedResource -// - Replace ReceiveRGBimage with ReceiveImage and rgb flag -// - Replace ReadRGBAimage, ReadRGBimage, ReadRGBApixels, ReadRGBpixels -// with ReadPixelData and rgb flag -// 06.10.20 - Allow for DX9 shared textures by creating receiving texture with compatible format -// - Mirror and swap red/blue options for SpoutCam via class flags m_bMirror, and m_bSwapRB -// Modifications to SpoutCopy rgba2rgb and rgba2rgbResample -// 29.10.20 - Add CheckSender for SendTexture and SendImage -// 08.12.20 - Add GetDX11Context -// 09.12.20 - Rename CleanupDX11 to CloseDirectX11 -// Add auto adapter switch into ReceiveSenderData if a class device was created. -// 10.01.21 - Add auto increment of sender name to SetSenderName if the sender already exists -// 11.01.21 - Add IsClassDevice() -// 12.01.21 - Release orphaned senders in SelectSenderPanel -// 15.01.21 - Add Flush to ReceiveTexture -// -// ==================================================================================== -/* - Copyright (c) 2014-2020, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#include "spoutDX.h" - -// -// Class: spoutDX -// -// Functions to manage DirectX11 texture sharing. -// -// Refer to source code for further details. -// - -spoutDX::spoutDX() -{ - // Initialize variables - m_pd3dDevice = nullptr; - m_pImmediateContext = nullptr; - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - m_SenderNameSetup[0] = 0; - m_SenderName[0] = 0; - m_dwFormat = DXGI_FORMAT_B8G8R8A8_UNORM; // default; - m_Width = 0; - m_Height = 0; - m_bUpdated = false; - m_bConnected = false; - m_bNewFrame = false; - m_bSpoutInitialized = false; - m_bSpoutPanelOpened = false; - m_bSpoutPanelActive = false; - m_bClassDevice = false; - m_bMirror = false; - m_bSwapRB = false; - m_bAdapt = false; - ZeroMemory(&m_SenderInfo, sizeof(SharedTextureInfo)); - ZeroMemory(&m_ShExecInfo, sizeof(m_ShExecInfo)); - - // Receiver adapter switch selection - DWORD dwMode = 0; - ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Adapt", &dwMode); - m_bAdapt = (dwMode == 1); - -} - -spoutDX::~spoutDX() -{ - ReleaseSender(); - ReleaseReceiver(); - CloseDirectX11(); -} - -//--------------------------------------------------------- -// DIRECTX -// - -// -// Group: DirectX -// - -// Function: OpenDirectX11 -// Initialize and prepare Directx 11 -bool spoutDX::OpenDirectX11(ID3D11Device* pDevice) -{ - if (!m_pd3dDevice) { - SpoutLogNotice("spoutDX::OpenDirectX11"); - if (pDevice) { - // Use the device pointer if it was was passed in - m_pd3dDevice = pDevice; - // Get the immediate context - pDevice->GetImmediateContext(&m_pImmediateContext); - m_bClassDevice = false; // An existing device pointer was used - SpoutLogNotice(" using device (0x%.7X)", PtrToUint(m_pd3dDevice)); - } - else { - // Create a DirectX 11 device if not already - if (spoutdx.OpenDirectX11()) { - // Retrieve the device and context pointer - m_pd3dDevice = spoutdx.GetDX11Device(); - m_pImmediateContext = spoutdx.GetDX11Context(); - m_bClassDevice = true; // A new class device pointer was created - SpoutLogNotice(" created device (0x%.7X)", PtrToUint(m_pd3dDevice)); - } - } - } - - return true; - -} - -// Function: OpenDirectX11 -// Return the DirectX11 device -ID3D11Device* spoutDX::GetDX11Device() -{ - return m_pd3dDevice; -} - -// Function: GetDX11Context -// Return the DirectX11 immediate context -ID3D11DeviceContext* spoutDX::GetDX11Context() -{ - return m_pImmediateContext; -} - -// Function: CloseDirectX11 -// Close DirectX11 and free resources -void spoutDX::CloseDirectX11() -{ - SpoutLogNotice("spoutDX::CloseDirectX11()"); - - if (m_pSharedTexture) m_pSharedTexture->Release(); - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - - if (m_pStaging[0]) m_pStaging[0]->Release(); - if (m_pStaging[1]) m_pStaging[1]->Release(); - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - - if (m_pd3dDevice) { - if (m_bClassDevice) { - // A device was created using the SpoutDirectX class - spoutdx.CloseDirectX11(); - } - else { - // An application device was used - // Release the independently created m_pImmediateContext object - if (m_pImmediateContext) - m_pImmediateContext->Release(); - } - } - - m_pd3dDevice = nullptr; - m_pImmediateContext = nullptr; - -} - -// Function: CloseDirectX11 -// Was a device was created using the SpoutDirectX class -bool spoutDX::IsClassDevice() -{ - return m_bClassDevice; -} - -//--------------------------------------------------------- -// SENDER -// - -// -// Group: Sender -// -// SendTexture and SendImage create or update a sender as required. -// -// - If a sender has not been created yet : -// -// - Make sure DirectX has been initialized -// - Create a sender using the DX11 shared texture handle -// -// - If the sender exists, test for size change : -// -// - Update the class shared texture -// - Update the sender and class variables -// - - -//--------------------------------------------------------- -// Function: SetSenderName -// Set name for sender creation -// -// If no name is specified, the executable name is used. -bool spoutDX::SetSenderName(const char* sendername) -{ - if (!sendername) { - // Get executable name as default - GetModuleFileNameA(NULL, m_SenderName, 256); - PathStripPathA(m_SenderName); - PathRemoveExtensionA(m_SenderName); - } - else { - strcpy_s(m_SenderName, 256, sendername); - } - - // If a sender with this name is already registered, create an incremented name - int i = 1; - char name[256]; - strcpy_s(name, 256, m_SenderName); - if (sendernames.FindSenderName(name)) { - do { - sprintf_s(name, 256, "%s_%d", m_SenderName, i); - i++; - } while (sendernames.FindSenderName(name)); - } - // Re-set the global sender name - strcpy_s(m_SenderName, 256, name); - - return true; -} - -//--------------------------------------------------------- -// Function: SetSenderFormat -// Set the sender DX11 shared texture format -void spoutDX::SetSenderFormat(DXGI_FORMAT format) -{ - m_dwFormat = format; -} - -//--------------------------------------------------------- -// Function: ReleaseSender -// Close receiver and release resources. -// -// A new sender is created or updated by all sending functions -void spoutDX::ReleaseSender() -{ - if (m_pSharedTexture) - m_pSharedTexture->Release(); - - if (m_pStaging[0]) m_pStaging[0]->Release(); - if (m_pStaging[1]) m_pStaging[1]->Release(); - - if (m_bSpoutInitialized) - sendernames.ReleaseSenderName(m_SenderName); - - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - - m_Width = 0; - m_Height = 0; - m_SenderName[0] = 0; - m_bSpoutInitialized = false; - -} - -//--------------------------------------------------------- -// Function: SendTexture -// Send DirectX11 texture -// -// - Default format : -// -// - DXGI_FORMAT_B8G8R8A8_UNORM (87) -// -// - DX9 compatible formats : -// -// - DXGI_FORMAT_R8G8B8A8_UNORM (28) -// - DXGI_FORMAT_B8G8R8A8_UNORM (87) -// - DXGI_FORMAT_B8G8R8X8_UNORM (88) -// -// - Other formats that work with DX11 but not with DX9 : -// -// - DXGI_FORMAT_R16G16B16A16_FLOAT -// - DXGI_FORMAT_R16G16B16A16_SNORM -// - DXGI_FORMAT_R10G10B10A2_UNORM -// -bool spoutDX::SendTexture(ID3D11Texture2D* pTexture) -{ - // Quit if no data - if (!pTexture) - return false; - - // Get the texture details - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - pTexture->GetDesc(&desc); - if (desc.Width == 0 || desc.Height == 0) - return false; - - // Create or update the sender - if (!CheckSender(desc.Width, desc.Height, (DWORD)desc.Format)) - return false; - - // Check the sender mutex for access the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // Copy the texture to the sender's shared texture - m_pImmediateContext->CopyResource(m_pSharedTexture, pTexture); - // Flush the command queue now because the shared texture has been updated on this device - m_pImmediateContext->Flush(); - // Signal a new frame while the mutex is locked - frame.SetNewFrame(); - // Allow access to the shared texture - frame.AllowTextureAccess(m_pSharedTexture); - } - - return true; -} - -//--------------------------------------------------------- -// Function: SendImage -// Send pixel image -bool spoutDX::SendImage(unsigned char * pData, unsigned int width, unsigned int height) -{ - // Quit if no data - if (!pData) - return false; - - // Create or update the sender - if (!CheckSender(width, height, m_dwFormat)) - return false; - - // Check the sender mutex for access the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // Update the shared texture resource with the pixel buffer - m_pImmediateContext->UpdateSubresource(m_pSharedTexture, 0, NULL, pData, m_Width * 4, 0); - // Flush the command queue because the shared texture has been updated on this device - m_pImmediateContext->Flush(); - // Signal a new frame while the mutex is locked - frame.SetNewFrame(); - // Allow access to the shared texture - frame.AllowTextureAccess(m_pSharedTexture); - } - - return true; -} - -//--------------------------------------------------------- -// Function: IsInitialized -// Initialization status -bool spoutDX::IsInitialized() -{ - return m_bSpoutInitialized; -} - -//--------------------------------------------------------- -// Function: GetName -// Sender name -const char * spoutDX::GetName() -{ - return m_SenderName; -} - -//--------------------------------------------------------- -// Function: GetWidth -// Sender width -unsigned int spoutDX::GetWidth() -{ - return m_Width; -} - -//--------------------------------------------------------- -// Function: GetHeight -// Sender height -unsigned int spoutDX::GetHeight() -{ - return m_Height; -} - -//--------------------------------------------------------- -// Function: GetFps -// Sender frame rate -double spoutDX::GetFps() -{ - return (frame.GetSenderFps()); -} - -//--------------------------------------------------------- -// Function: GetFrame -// Sender frame number -long spoutDX::GetFrame() -{ - return (frame.GetSenderFrame()); -} - - -//--------------------------------------------------------- -// RECEIVER -// - -// -// Group: Receiver -// -// ReceiveTexture and ReceiveImage -// -// - Connect to a sender -// - Set class variables for sender name, width and height -// - If the sender has changed size, set a flag for the application to update -// the receiving texture or imageif IsUpdated() returns true. -// - Copy the sender shared texture to the user texture or image. -// - -//--------------------------------------------------------- -// Function: SetReceiverName -// Specify sender for connection -// -// The application will not connect to any other unless the user selects one -// If that sender closes, the application will wait for the nominated sender to open -// If no name is specified, the receiver will connect to the active sender -void spoutDX::SetReceiverName(const char * SenderName) -{ - if (SenderName && SenderName[0]) { - strcpy_s(m_SenderNameSetup, 256, SenderName); - strcpy_s(m_SenderName, 256, SenderName); - } -} - -//--------------------------------------------------------- -// Function: ReleaseReceiver -// Close receiver and release resources ready to connect to another sender -void spoutDX::ReleaseReceiver() -{ - // Restore the sender name if one was specified by SetReceiverName - if (m_SenderNameSetup[0]) - strcpy_s(m_SenderName, 256, m_SenderNameSetup); - else - m_SenderName[0] = 0; - - if (!m_bSpoutInitialized) - return; - - // Wait 4 frames in case the same sender opens again - Sleep(67); - - if (m_pSharedTexture) - m_pSharedTexture->Release(); - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - - // Close the named access mutex and frame counting semaphore. - frame.CloseAccessMutex(); - frame.CleanupFrameCount(); - - // Zero width and height so that they are reset when a sender is found - m_Width = 0; - m_Height = 0; - m_SenderName[0] = 0; - - // Initialize again when a sender is found - m_bSpoutInitialized = false; - m_bUpdated = false; - -} - -//--------------------------------------------------------- -// Function: ReceiveTexture -// Copy the sender DX11 shared texture -// -// The receiving texture must be the same format -// and must be re-allocated if IsUpdated() returns true -// -bool spoutDX::ReceiveTexture(ID3D11Texture2D** ppTexture) -{ - // Return if flagged for update - // The update flag is reset when the receiving application calls IsUpdated() - if (m_bUpdated) - return true; - - // Try to receive texture details from a sender - if (ReceiveSenderData()) { - - // Was the shared texture pointer retrieved ? - if (!m_pSharedTexture) { - return false; - } - - // The sender name, width, height, format, shared texture handle and pointer have been retrieved. - if (m_bUpdated) { - // If the sender is new or changed, return to update the receiving texture. - // The application detects the change with IsUpdated(). - return true; - } - - // The application receiving texture is created - // by the application on the first update above - // ready for copy from the sender's shared texture. - ID3D11Texture2D* pTexture = *ppTexture; - if (!pTexture) { - return false; - } - - // - // Found a sender - // - - // Access the sender shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - m_bNewFrame = false; // For query of new frame - // Check if the sender has produced a new frame. - if (frame.GetNewFrame()) { - // Copy from the sender's shared texture to the receiving texture. - m_pImmediateContext->CopyResource(pTexture, m_pSharedTexture); - // Testing has shown that Flush is needed here for the texture - // to be immediately available for subsequent copy. - // May be removed if the texture is not immediately copied. - // Test for the individual application. - m_pImmediateContext->Flush(); - m_bNewFrame = true; // The application can query IsNewFrame() - } - } - // Allow access to the shared texture - frame.AllowTextureAccess(m_pSharedTexture); - - m_bConnected = true; - - } // sender exists - else { - // There is no sender or the connected sender closed. - ReleaseReceiver(); - // Let the application know. - m_bConnected = false; - } - - // ReceiveTexture fails if there is no sender or the connected sender closed. - return m_bConnected; - -} - -//--------------------------------------------------------- -// Function: ReceiveImage -// Receive from a sender via DX11 staging textures to an rgba or rgb buffer of variable size -// A new shared texture pointer (m_pSharedTexture) is retrieved if the sender changed -bool spoutDX::ReceiveImage(unsigned char * pixels, - unsigned int width, unsigned int height, bool bRGB, bool bInvert) -{ - // Return if flagged for update - // The update flag is reset when the receiving application calls IsUpdated() - if (m_bUpdated) - return true; - - // Try to receive texture details from a sender - if (ReceiveSenderData()) { - // The sender name, width, height, format, shared texture handle and pointer have been retrieved. - if (m_bUpdated) { - // A new sender has been found or the one connected has changed. - // The staging textures must be the same size and format as the sender - // Create new staging textures if it is a different size - CheckStagingTextures(m_Width, m_Height, m_dwFormat); - // The application detects the change with IsUpdated() - // and the receiving buiffer is updated to match the sender. - return true; - } - - // The receiving pixel buffer is created after the first update - // So check here instead of at the beginning - if (!pixels) - return false; - - // No staging textures - no copy - if (!m_pStaging[0] || !m_pStaging[1]) - return false; - - // - // Found a sender - // - // Access the sender shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // Check if the sender has produced a new frame. - if (frame.GetNewFrame()) { - // Read from the sender GPU texture to CPU pixels via two staging textures - // One texture - approx 7 - 12 msec at 1920x1080 - // Two textures - approx 2.5 - 3.5 msec at 1920x1080 - m_Index = (m_Index + 1) % 2; - m_NextIndex = (m_Index + 1) % 2; - // Copy from the sender's shared texture to the first staging texture - m_pImmediateContext->CopyResource(m_pStaging[m_Index], m_pSharedTexture); - // Map and read from the second while the first is occupied - ReadPixelData(m_pStaging[m_NextIndex], pixels, width, height, bRGB, bInvert); - } - // Allow access to the shared texture - frame.AllowTextureAccess(m_pSharedTexture); - } - - m_bConnected = true; - } // sender exists - else { - // There is no sender or the connected sender closed. - ReleaseReceiver(); - // Let the application know. - m_bConnected = false; - } - - // ReceiveImage fails if there is no sender or the connected sender closed. - return m_bConnected; - -} - -//--------------------------------------------------------- -// Function: SelectSender -// Open sender selection dialog -void spoutDX::SelectSender() -{ - SelectSenderPanel(); -} - -//--------------------------------------------------------- -// Function: IsUpdated -// Query whether the sender has changed. -// -// Must be checked at every cycle before receiving data. -// -// If this is not done, the receiving functions fail. -bool spoutDX::IsUpdated() -{ - bool bRet = m_bUpdated; - m_bUpdated = false; // Reset the update flag - return bRet; -} - - -//--------------------------------------------------------- -// Function: IsConnected -// Query sender connection. -// -// If the sender closes, receiving functions return false, -// but connection can be tested at any time. -bool spoutDX::IsConnected() -{ - return m_bConnected; -} - -//--------------------------------------------------------- -// Function: IsFrameNew -// Query received frame status -// -// The receiving texture or pixel buffer is refreshed if the sender has produced a new frame -// This can be queried to process texture data only for new frames -bool spoutDX::IsFrameNew() -{ - return m_bNewFrame; -} - -//--------------------------------------------------------- -// Function: GetSenderHandle -// Received sender share handle -HANDLE spoutDX::GetSenderHandle() -{ - return m_dxShareHandle; -} - -//--------------------------------------------------------- -// Function: GetSenderFormat -// Get sender DirectX texture format -DXGI_FORMAT spoutDX::GetSenderFormat() -{ - return (DXGI_FORMAT)m_dwFormat; -} - - -//--------------------------------------------------------- -// Function: GetSenderName -// Get sender name -const char * spoutDX::GetSenderName() -{ - return m_SenderName; -} - -//--------------------------------------------------------- -// Function: GetSenderWidth -// Get sender width -unsigned int spoutDX::GetSenderWidth() -{ - return m_Width; -} - -//--------------------------------------------------------- -// Function: GetSenderHeight -// Get sender height -unsigned int spoutDX::GetSenderHeight() -{ - return m_Height; - -} - -//--------------------------------------------------------- -// Function: GetSenderFps -// Get sender frame rate -double spoutDX::GetSenderFps() -{ - return frame.GetSenderFps(); -} - -//--------------------------------------------------------- -// Function: GetSenderFrame -// Get sender frame number -long spoutDX::GetSenderFrame() -{ - return frame.GetSenderFrame(); -} - - -//--------------------------------------------------------- -// COMMON -// - -// -// Group: Frame counting -// - -//--------------------------------------------------------- -// Function: HoldFps -// Frame rate control -void spoutDX::HoldFps(int fps) -{ - frame.HoldFps(fps); -} - -// Function: DisableFrameCount -// Disable frame counting specifically for this application -void spoutDX::DisableFrameCount() -{ - frame.DisableFrameCount(); -} - -//--------------------------------------------------------- -// Function: IsFrameCountEnabled -// Return frame count status -bool spoutDX::IsFrameCountEnabled() -{ - return frame.IsFrameCountEnabled(); -} - -//--------------------------------------------------------- -// SenderNames -// - -// -// Group: Sender names -// - -//--------------------------------------------------------- -// Function: GetSenderCount -// Number of senders -int spoutDX::GetSenderCount() -{ - std::set SenderNameSet; - if (sendernames.GetSenderNames(&SenderNameSet)) { - return((int)SenderNameSet.size()); - } - return 0; -} - -//--------------------------------------------------------- -// Function: GetSender -// Sender item name in the sender names set -bool spoutDX::GetSender(int index, char* sendername, int sendernameMaxSize) -{ - std::set SenderNameSet; - std::set::iterator iter; - std::string namestring; - char name[256]; - int i; - - if (sendernames.GetSenderNames(&SenderNameSet)) { - if (SenderNameSet.size() < (unsigned int)index) { - return false; - } - i = 0; - for (iter = SenderNameSet.begin(); iter != SenderNameSet.end(); iter++) { - namestring = *iter; // the name string - strcpy_s(name, 256, namestring.c_str()); // the 256 byte name char array - if (i == index) { - strcpy_s(sendername, sendernameMaxSize, name); // the passed name char array - break; - } - i++; - } - return true; - } - return false; -} - -//--------------------------------------------------------- -// Function: GetSenderInfo -// Sender information -bool spoutDX::GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat) -{ - return sendernames.GetSenderInfo(sendername, width, height, dxShareHandle, dwFormat); -} - -//--------------------------------------------------------- -// Function: GetActiveSender -// Current active sender name -bool spoutDX::GetActiveSender(char* Sendername) -{ - return sendernames.GetActiveSender(Sendername); -} - -//--------------------------------------------------------- -// Function: SetActiveSender -// Set sender as active -bool spoutDX::SetActiveSender(const char* Sendername) -{ - return sendernames.SetActiveSender(Sendername); -} - -//--------------------------------------------------------- -// Function: GetMaxSenders -// Get user Maximum senders allowed -int spoutDX::GetMaxSenders() -{ - return(sendernames.GetMaxSenders()); -} - -//--------------------------------------------------------- -// Function: SetMaxSenders -// Set user Maximum senders allowed -void spoutDX::SetMaxSenders(int maxSenders) -{ - sendernames.SetMaxSenders(maxSenders); -} - - -// -// Adapter functions -// - -// -// Group: Graphics adapter -// -// Note that both the Sender and Receiver must use the same graphics adapter. -// - -//--------------------------------------------------------- -// Function: GetNumAdapters -// The number of graphics adapters in the system -int spoutDX::GetNumAdapters() -{ - return spoutdx.GetNumAdapters(); -} - -//--------------------------------------------------------- -// Function: GetAdapterName -// Get adapter item name -bool spoutDX::GetAdapterName(int index, char *adaptername, int maxchars) -{ - return spoutdx.GetAdapterName(index, adaptername, maxchars); -} - -//--------------------------------------------------------- -// Function: GetAdapter -// Get adapter index -int spoutDX::GetAdapter() -{ - return spoutdx.GetAdapter(); -} - -//--------------------------------------------------------- -// Function: SetAdapter -// Set graphics adapter for output -bool spoutDX::SetAdapter(int index) -{ - if (spoutdx.SetAdapter(index)) { - return true; - } - SpoutLogError("spoutDX::SetAdapter(%d) failed", index); - spoutdx.SetAdapter(-1); // make sure globals are reset to default - return false; -} - -//--------------------------------------------------------- -// Function: GetAdapterInfo -// Get the current adapter description -int spoutDX::GetSenderAdapter(const char* sendername, char* adaptername, int maxchars) -{ - if (!sendername || !sendername[0]) - return -1; - - int senderadapter = -1; - ID3D11Texture2D* pSharedTexture = nullptr; - ID3D11Device* pDummyDevice = nullptr; - ID3D11DeviceContext* pContext = nullptr; - IDXGIAdapter* pAdapter = nullptr; - - // Get the current device adapter pointer (could be null default) - IDXGIAdapter* pCurrentAdapter = spoutdx.GetAdapterPointer(); - - SpoutLogNotice("spoutDX::GetSenderAdapter - testing for sender adapter (%s)", sendername); - - SharedTextureInfo info; - if (sendernames.getSharedInfo(sendername, &info)) { - int nAdapters = spoutdx.GetNumAdapters(); - for (int i = 0; i < nAdapters; i++) { - // printf("Adapter %d : %s : handle %d\n", i, name, sharehandle); - pAdapter = spoutdx.GetAdapterPointer(i); - if (pAdapter) { - SpoutLogNotice(" testing adapter %d", i); - // Set the adapter pointer for CreateDX11device to use - spoutdx.SetAdapterPointer(pAdapter); - // Create a dummy device using this adapter - pDummyDevice = spoutdx.CreateDX11device(); - if (pDummyDevice) { - // Try to open the share handle with the device created from the adapter - if (spoutdx.OpenDX11shareHandle(pDummyDevice, &pSharedTexture, LongToHandle((long)info.shareHandle))) { - // break as soon as it succeeds - // printf("Found sender (%s) adapter %d : %s\n", sendername, i, name); - SpoutLogNotice(" found sender adapter %d (0x%.7X)", i, PtrToUint(pAdapter)); - senderadapter = i; - spoutdx.GetAdapterName(i, adaptername, maxchars); - pDummyDevice->GetImmediateContext(&pContext); - if (pContext) pContext->Flush(); - pDummyDevice->Release(); - pAdapter->Release(); - break; - } - pDummyDevice->GetImmediateContext(&pContext); - if (pContext) pContext->Flush(); - pDummyDevice->Release(); - } - pAdapter->Release(); - } - } - } - - // Set the SpoutDirectX class adapter pointer back to what it was - spoutdx.SetAdapterPointer(pCurrentAdapter); - - return senderadapter; - -} - -// -// Sharing modes -// - -// -// Group: Retained for 2.006 compatibility -// - -//--------------------------------------------------------- -// Function: GetDX9 -// Get user DX9 mode -bool spoutDX::GetDX9() -{ - DWORD dwDX9 = 0; - ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "DX9", &dwDX9); - return (dwDX9 == 1); -} - -//--------------------------------------------------------- -// Function: GetMemoryShareMode -// Get user memory share mode -bool spoutDX::GetMemoryShareMode() -{ - bool bRet = false; - DWORD dwMem = 0; - if (ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "MemoryShare", &dwMem)) { - bRet = (dwMem == 1); - } - return bRet; -} - -// -// Utilities -// - -bool spoutDX::CreateDX11texture(ID3D11Device* pd3dDevice, - unsigned int width, unsigned int height, - DXGI_FORMAT format, ID3D11Texture2D** ppTexture) -{ - HANDLE hShare = NULL; - return spoutdx.CreateSharedDX11Texture(pd3dDevice, width, height, format, ppTexture, hShare); -} - - -// -// PRIVATE -// - - -// -------------------------------------------------------- -// If a sender has not been created yet -// o Make sure DirectX is initialized -// o Create a shared texture for the sender -// o Create a sender using the DX11 shared texture handle -// If the sender exists, test for size or format change -// o Re-create the class shared texture to the new size -// o Update the sender and class variables -bool spoutDX::CheckSender(unsigned int width, unsigned int height, DWORD dwFormat) -{ - if (width == 0 || height == 0) - return false; - - // The sender needs a name - // Default is the executable name - if (!m_SenderName[0]) { - printf("CheckSender - set sender name\n"); - SetSenderName(); - } - - if (!m_bSpoutInitialized) { - - // Make sure DirectX is initialized - if (!OpenDirectX11()) - return false; - - // Save width and height to test for sender size changes - m_Width = width; - m_Height = height; - m_dwFormat = dwFormat; - - // Create a shared texture for the sender - // A sender creates a new texture with a new share handle - m_dxShareHandle = nullptr; - spoutdx.CreateSharedDX11Texture(m_pd3dDevice, m_Width, m_Height, (DXGI_FORMAT)m_dwFormat, &m_pSharedTexture, m_dxShareHandle); - - // Create a sender using the DX11 shared texture handle (m_dxShareHandle) - // and specifying the same texture format - m_bSpoutInitialized = sendernames.CreateSender(m_SenderName, m_Width, m_Height, m_dxShareHandle, m_dwFormat); - - // LJ DEBUG - // This could be a separate function SetHostPath - SharedTextureInfo info; - if (!sendernames.getSharedInfo(m_SenderName, &info)) { - SpoutLogWarning("spoutGL::SetHostPath(%s) - could not get sender info", m_SenderName); - // printf("spoutGL::SetHostPath(%s) - could not get sender info\n", m_SenderName); - return false; - } - char exepath[256]; - GetModuleFileNameA(NULL, exepath, sizeof(exepath)); - // Description is defined as wide chars, but the path is stored as byte chars - strcpy_s((char*)info.description, 256, exepath); - if (!sendernames.setSharedInfo(m_SenderName, &info)) { - SpoutLogWarning("spoutGL::SetHostPath(%s) - could not set sender info", m_SenderName); - // printf("spoutGL::SetHostPath(%s) - could not set sender info\n", m_SenderName); - } - - // printf("exepath = [%s]\n", exepath); - - - // Create a sender mutex for access to the shared texture - frame.CreateAccessMutex(m_SenderName); - - // Enable frame counting so the receiver gets frame number and fps - frame.EnableFrameCount(m_SenderName); - } - // Initialized but has the source texture changed size ? - else if (m_Width != width || m_Height != height || m_dwFormat != dwFormat) { - - // Re-create the class shared texture with the new size - if (m_pSharedTexture) m_pSharedTexture->Release(); - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - spoutdx.CreateSharedDX11Texture(m_pd3dDevice, width, height, (DXGI_FORMAT)dwFormat, &m_pSharedTexture, m_dxShareHandle); - - // Update the sender and class variables - sendernames.UpdateSender(m_SenderName, width, height, m_dxShareHandle, dwFormat); - m_Width = width; - m_Height = height; - m_dwFormat = dwFormat; - - } // endif initialization or size checks - - return true; - -} - - -//--------------------------------------------------------- -// Used when the sender was there but the texture pointer could not be retrieved from the share handle. -// Try using the sender adapter in case it's different. -ID3D11Texture2D* spoutDX::CheckSenderTexture(char *sendername, HANDLE dxShareHandle) -{ - // If the user has not selected adapter switching, return a NULL pointer - if (!m_bAdapt) { - SpoutLogNotice("spoutDX::CheckSenderTexture - user selected no change to sender adapter"); - return nullptr; - } - - ID3D11Texture2D* pTexture = nullptr; - int receiverindex = GetAdapter(); // Save the current adapter index - char senderadapter[128]; - int senderindex = GetSenderAdapter(sendername, senderadapter, 128); // Find the sender adapter index and name - - CloseDirectX11(); // Close the current DX11 device - SetAdapter(senderindex); // Change to the same adapter as the sender - OpenDirectX11(); // Create a new device with that adapter - - // Try again to get the texture pointer - if (!spoutdx.OpenDX11shareHandle(m_pd3dDevice, &pTexture, dxShareHandle)) { - // If that didn't work, change back to the original adapter - CloseDirectX11(); - SetAdapter(receiverindex); - OpenDirectX11(); - SpoutLogWarning("spoutDX::CheckSenderTexture - could not change to sender adapter %d (%s)", senderindex, senderadapter); - return nullptr; - } - - SpoutLogNotice("spoutDX::CheckSenderTexture - changed to sender adapter %d (%s)", senderindex, senderadapter); - - return pTexture; - -} - -//--------------------------------------------------------- -// o Connect to a sender and inform the application to update texture dimensions -// o Check for user sender selection -// o Receive texture details from the sender for write to the user texture -// o Retrieve width, height, format, share handle and texture pointer -bool spoutDX::ReceiveSenderData() -{ - m_bUpdated = false; - - // Make sure DirectX is initialized - if (!OpenDirectX11()) - return false; - - // Initialization is recorded in this class for sender or receiver - // m_Width or m_Height are established when the receiver connects to a sender - char sendername[256]; - strcpy_s(sendername, 256, m_SenderName); - - // Check the entered Sender name to see if it exists - if (sendername[0] == 0) { - // Passed name was null, so find the active sender - if (!GetActiveSender(sendername)) - return false; // No sender - } - - // If SpoutPanel has been opened, the active sender name could be different - if (CheckSpoutPanel(sendername, 256)) { - // Disable the setup name - m_SenderNameSetup[0] = 0; - } - - // Now we have either an existing sender name or the active sender name - - // Save current sender name and dimensions to test for change - unsigned int width = m_Width; - unsigned int height = m_Height; - DWORD dwFormat = m_dwFormat; - HANDLE dxShareHandle = m_dxShareHandle; - - // Try to get the sender information - // Retreive width, height, sharehandle and format. - SharedTextureInfo info; - if (sendernames.getSharedInfo(sendername, &info)) { - - // Memoryshare not supported (no texture share handle) - if (info.shareHandle == 0) { - ReleaseReceiver(); - return false; - } - - width = info.width; - height = info.height; - dxShareHandle = (HANDLE)(LongToHandle((long)info.shareHandle)); - dwFormat = info.format; - - // printf("Found sender (%dx%d) format = %d\n", width, height, dwFormat); - - // Compatible DX9 formats - // 21 = D3DFMT_A8R8G8B8 - // 22 = D3DFMT_X8R8G8B8 - if (dwFormat == 21 || dwFormat == 21) { - // Create a DX11 receiving texture with compatible format - dwFormat = (DWORD)DXGI_FORMAT_B8G8R8A8_UNORM; - } - - // The shared texture handle will be different - // o for a new sender - // o for texture size or format change - if (dxShareHandle != m_dxShareHandle) { - - // printf("Found new sender (%dx%d) format = %d\n", width, height, dwFormat); - - // Release everything and start again - ReleaseReceiver(); - - // Update the sender share handle - m_dxShareHandle = dxShareHandle; - - // Get a new shared texture pointer (m_pSharedTexture) - ID3D11Texture2D* pTexture = nullptr; - if (!spoutdx.OpenDX11shareHandle(m_pd3dDevice, &m_pSharedTexture, dxShareHandle) ) { - - // If this fails, the sender graphics adapter might be different - SpoutLogWarning("SpoutReceiver::ReceiveSenderData - could not retrieve sender texture from share handle"); - - // - // If a class device has been created within this class, - // we can re-create it on the fly using a different adapter. - // However, this can't be done if an application device was used. - // In that case, the adapter has to be changed and the device - // re-created within the application itself. - // - // Refer to the SpoutDX examples Tutorial07 and Windows Receiver. - // - if (m_bClassDevice) { - // If the the sender adapter is different, switch to it and retrieve the shared texture pointer. - // nullptr is returned if the user has not selected adapter switching with SpoutSettings. - pTexture = CheckSenderTexture(sendername, dxShareHandle); - if (!pTexture) { - // Retain the share handle so we don't query it again. - // m_pSharedTexture is null but will not be used. - // Return true and wait until another sender is selected. - return true; - } - // Use the new sender texture pointer retrieved by CheckSenderTexture - m_pSharedTexture = pTexture; - } - else { - // Wait until another sender is selected or the shared texture handle is valid. - return true; - } - } - - // Initialize again with the newly connected sender values - CreateReceiver(sendername, width, height, dwFormat); - - m_bUpdated = true; // Return to update the receiving texture or image - - } - - // Connected and intialized - // Sender name, width, height, format, texture pointer and share handle have been retrieved - - // The application can now access and copy the sender texture - return true; - - } // end find sender - - // There is no sender or the connected sender closed - return false; - -} - -// Create receiver resources for a new sender -void spoutDX::CreateReceiver(const char * SenderName, unsigned int width, unsigned int height, DWORD dwFormat) -{ - SpoutLogNotice("CreateReceiver(%s, %d x %d)", SenderName, width, height); - - if (m_bSpoutInitialized) - ReleaseReceiver(); - - // Create a named sender mutex for access to the sender's shared texture - frame.CreateAccessMutex(SenderName); - - // Enable frame counting to get the sender frame number and fps - frame.EnableFrameCount(SenderName); - - // Set class globals - strcpy_s(m_SenderName, 256, SenderName); - m_Width = width; - m_Height = height; - m_dwFormat = dwFormat; - - m_bSpoutInitialized = true; - -} - -// -// COPY FROM A DX11 STAGING TEXTURE TO A USER RGBA/RGB/BGR PIXEL BUFFER OF GIVEN SIZE -// -// A class device and context must have been created using OpenDirectX11() -// -bool spoutDX::ReadPixelData(ID3D11Texture2D* pStagingTexture, unsigned char* pixels, - unsigned int width, unsigned int height, bool bRGB, bool bInvert) -{ - if (!m_pImmediateContext || !pStagingTexture || !pixels) - return false; - - // Map the resource so we can access the pixels - D3D11_MAPPED_SUBRESOURCE mappedSubResource; - // Make sure all commands are done before mapping the staging texture - m_pImmediateContext->Flush(); - // Map waits for GPU access - HRESULT hr = m_pImmediateContext->Map(pStagingTexture, 0, D3D11_MAP_READ, 0, &mappedSubResource); - if (SUCCEEDED(hr)) { - - // Copy the staging texture pixels to the user buffer - if (!bRGB) { - // RGBA buffer - // TODO : test rgba-rgba resample - if (width != m_Width || height != m_Height) { - spoutcopy.rgba2rgbaResample(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, width, height, bInvert); - } - else { - spoutcopy.rgba2rgba(mappedSubResource.pData, pixels, width, height, mappedSubResource.RowPitch, bInvert); - } - } - else if (m_dwFormat == 28) { - // RGB buffer - // If the texture format is RGBA it has to be converted to BGR by the staging texture copy - if (width != m_Width || height != m_Height) { - spoutcopy.rgba2bgrResample(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, width, height, bInvert); - } - else { - spoutcopy.rgba2bgr(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, bInvert); - } - } - else { - // Used for SpoutCam to receive RGB images - if (width != m_Width || height != m_Height) { - spoutcopy.rgba2rgbResample(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, width, height, bInvert, m_bMirror, m_bSwapRB); - } - else { - // Approx 5 msec at 1920x1080 - spoutcopy.rgba2rgb(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, bInvert, m_bMirror, m_bSwapRB); - } - } - - // 0.03 msec - m_pImmediateContext->Unmap(pStagingTexture, 0); - - return true; - } // endif DX11 map OK - - return false; - -} // end ReadPixelData - - -// Create new class staging textures if changed size or do not exist yet -bool spoutDX::CheckStagingTextures(unsigned int width, unsigned int height, DWORD dwFormat) -{ - if (!m_pd3dDevice) { - return false; - } - - D3D11_TEXTURE2D_DESC desc = { 0 }; - - if (m_pStaging[0] && m_pStaging[1]) { - // Get the size to test for change - m_pStaging[0]->GetDesc(&desc); - if (desc.Width != width || desc.Height != height || desc.Format != (DXGI_FORMAT)dwFormat) { - - // Staging textures must not be mapped before release - m_pStaging[0]->Release(); - m_pStaging[1]->Release(); - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - // Drop through to create new textures - } - else { - return true; - } - } - - if (CreateDX11StagingTexture(width, height, (DXGI_FORMAT)dwFormat, &m_pStaging[0]) - && CreateDX11StagingTexture(width, height, (DXGI_FORMAT)dwFormat, &m_pStaging[1])) { - return true; - } - - return false; -} - - -// Create a DirectX 11 staging texture for read and write -bool spoutDX::CreateDX11StagingTexture(unsigned int width, unsigned int height, DXGI_FORMAT format, ID3D11Texture2D** pStagingTexture) -{ - if (!m_pd3dDevice) - return false; - - ID3D11Texture2D* pTexture = nullptr; - - pTexture = *pStagingTexture; // The texture pointer - if (pTexture) { - pTexture->Release(); - pTexture = nullptr; - } - - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = format; - desc.SampleDesc.Count = 1; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; - desc.Usage = D3D11_USAGE_STAGING; - desc.BindFlags = 0; - - HRESULT res = m_pd3dDevice->CreateTexture2D(&desc, NULL, &pTexture); - - if (res != S_OK) { - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476174%28v=vs.85%29.aspx - char tmp[256]; - sprintf_s(tmp, 256, "spoutDirectX::CreateDX11StagingTexture ERROR : [0x%lx] : ", res); - switch (res) { - case D3DERR_INVALIDCALL: - strcat_s(tmp, 256, "D3DERR_INVALIDCALL"); - break; - case E_INVALIDARG: - strcat_s(tmp, 256, "E_INVALIDARG"); - break; - case E_OUTOFMEMORY: - strcat_s(tmp, 256, "E_OUTOFMEMORY"); - break; - default: - strcat_s(tmp, 256, "Unlisted error"); - break; - } - SpoutLogFatal("%s", tmp); - return false; - } - - *pStagingTexture = pTexture; - - return true; - -} - -// -// The following functions are adapted from equivalents in SpoutSDK.cpp -// for applications not using the entire Spout SDK. -// - -// Pop up SpoutPanel to allow the user to select a sender -// Usually activated by RH click -void spoutDX::SelectSenderPanel() -{ - HANDLE hMutex1 = NULL; - HMODULE module = NULL; - char path[MAX_PATH], drive[MAX_PATH], dir[MAX_PATH], fname[MAX_PATH]; - - // The selected sender is then the "Active" sender and this receiver switches to it. - // If Spout is not installed, SpoutPanel.exe has to be in the same folder - // as this executable. This rather complicated process avoids having to use a dialog - // which causes problems with host GUI messaging. - - // First find if there has been a Spout installation >= 2.002 with an install path for SpoutPanel.exe - if (!ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\SpoutPanel", "InstallPath", path)) { - // Path not registered so find the path of the host program - // where SpoutPanel should have been copied - module = GetModuleHandle(NULL); - GetModuleFileNameA(module, path, MAX_PATH); - _splitpath_s(path, drive, MAX_PATH, dir, MAX_PATH, fname, MAX_PATH, NULL, 0); - _makepath_s(path, MAX_PATH, drive, dir, "SpoutPanel", ".exe"); - // Does SpoutPanel.exe exist in this path ? - if (!PathFileExistsA(path)) { - // Try the current working directory - if (_getcwd(path, MAX_PATH)) { - strcat_s(path, MAX_PATH, "\\SpoutPanel.exe"); - // Does SpoutPanel exist here? - if (!PathFileExistsA(path)) { - SpoutLogWarning("spoutDX::SelectSender - SpoutPanel path not found"); - return; - } - } - } - } - - // Check whether the panel is already running - // Try to open the application mutex. - hMutex1 = OpenMutexA(MUTEX_ALL_ACCESS, 0, "SpoutPanel"); - if (!hMutex1) { - // No mutex, so not running, so can open it - - // First release any orphaned senders if the name exists - // in the sender list but the shared memory info does not - // So that the sender list is clean - sendernames.CleanSenders(); - - // Use ShellExecuteEx so we can test its return value later - ZeroMemory(&m_ShExecInfo, sizeof(m_ShExecInfo)); - m_ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); - m_ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; - m_ShExecInfo.hwnd = NULL; - m_ShExecInfo.lpVerb = NULL; - m_ShExecInfo.lpFile = (LPCSTR)path; - m_ShExecInfo.lpDirectory = NULL; - m_ShExecInfo.nShow = SW_SHOW; - m_ShExecInfo.hInstApp = NULL; - ShellExecuteExA(&m_ShExecInfo); - - // - // The flag "m_bSpoutPanelOpened" is set here to indicate that the user - // has opened the panel to select a sender. This flag is local to - // this process so will not affect any other receiver instance - // Then when the selection panel closes, sender name is tested - // - m_bSpoutPanelOpened = true; - } - else { - // The mutex exists, so another instance is already running. - // Find the SpoutPanel window and bring it to the top. - // SpoutPanel is opened as topmost anyway but pop it to - // the front in case anything else has stolen topmost. - HWND hWnd = FindWindowA(NULL, (LPCSTR)"SpoutPanel"); - if (hWnd && IsWindow(hWnd)) { - SetForegroundWindow(hWnd); - // prevent other windows from hiding the dialog - // and open the window wherever the user clicked - SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); - } - else if (path[0]) { - // If the window was not found but the mutex exists - // and SpoutPanel is installed, it has crashed. - // Terminate the process and the mutex or the mutex will remain - // and SpoutPanel will not be started again. - PROCESSENTRY32 pEntry; - pEntry.dwSize = sizeof(pEntry); - bool done = false; - // Take a snapshot of all processes and threads in the system - HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); - if (hProcessSnap == INVALID_HANDLE_VALUE) { - SpoutLogError("spoutDX::OpenSpoutPanel - CreateToolhelp32Snapshot error"); - } - else { - // Retrieve information about the first process - BOOL hRes = Process32First(hProcessSnap, &pEntry); - if (!hRes) { - SpoutLogError("spoutDX::OpenSpoutPanel - Process32First error"); - CloseHandle(hProcessSnap); - } - else { - // Look through all processes - while (hRes && !done) { - int value = _tcsicmp(pEntry.szExeFile, _T("SpoutPanel.exe")); - if (value == 0) { - HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, (DWORD)pEntry.th32ProcessID); - if (hProcess != NULL) { - // Terminate SpoutPanel and it's mutex - TerminateProcess(hProcess, 9); - CloseHandle(hProcess); - done = true; - } - } - if (!done) - hRes = Process32Next(hProcessSnap, &pEntry); // Get the next process - else - hRes = NULL; // found SpoutPanel - } - CloseHandle(hProcessSnap); - } - } - // Now SpoutPanel will start the next time the user activates it - } // endif SpoutPanel crashed - } // endif SpoutPanel already open - - // If we opened the mutex, close it now or it is never released - if (hMutex1) CloseHandle(hMutex1); - - return; - -} // end SelectSenderPanel - -// -// Check whether SpoutPanel opened and return the new sender name -// -bool spoutDX::CheckSpoutPanel(char *sendername, int maxchars) -{ - // If SpoutPanel has been activated, test if the user has clicked OK - if (m_bSpoutPanelOpened) { // User has activated spout panel - - SharedTextureInfo TextureInfo; - HANDLE hMutex = NULL; - DWORD dwExitCode; - char newname[256]; - bool bRet = false; - - // Must find the mutex to signify that SpoutPanel has opened - // and then wait for the mutex to close - hMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, "SpoutPanel"); - - // Has it been activated - if (!m_bSpoutPanelActive) { - // If the mutex has been found, set the active flag true and quit - // otherwise on the next round it will test for the mutex closed - if (hMutex) m_bSpoutPanelActive = true; - } - else if (!hMutex) { // It has now closed - m_bSpoutPanelOpened = false; // Don't do this part again - m_bSpoutPanelActive = false; - // call GetExitCodeProcess() with the hProcess member of - // global SHELLEXECUTEINFO to get the exit code from SpoutPanel - if (m_ShExecInfo.hProcess) { - GetExitCodeProcess(m_ShExecInfo.hProcess, &dwExitCode); - // Only act if exit code = 0 (OK) - if (dwExitCode == 0) { - // SpoutPanel has been activated and OK clicked - // Test the active sender which should have been set by SpoutPanel - newname[0] = 0; - if (!sendernames.GetActiveSender(newname)) { - // Otherwise the sender might not be registered. - // SpoutPanel always writes the selected sender name to the registry. - if (ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\SpoutPanel", "Sendername", newname)) { - // Register the sender if it exists - if (newname[0] != 0) { - if (sendernames.getSharedInfo(newname, &TextureInfo)) { - // Register in the list of senders and make it the active sender - sendernames.RegisterSenderName(newname); - sendernames.SetActiveSender(newname); - } - } - } - } - // Now do we have a valid sender name ? - if (newname[0] != 0) { - // Pass back the new name - strcpy_s(sendername, maxchars, newname); - bRet = true; - } // endif valid sender name - } // endif SpoutPanel OK - } // got the exit code - } // endif no mutex so SpoutPanel has closed - // If we opened the mutex, close it now or it is never released - if (hMutex) CloseHandle(hMutex); - return bRet; - } // SpoutPanel has not been opened - - return false; - -} - diff --git a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.h b/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.h deleted file mode 100644 index 0d4e22e..0000000 --- a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - - SpoutDX.h - - Sender and receiver for DirectX applications - - Copyright (c) 2014-2020, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once - -#ifndef __spoutDX__ -#define __spoutDX__ - -// Change the path as required -#include "..\..\SpoutGL\SpoutCommon.h" // for dll build -#include "..\..\SpoutGL\SpoutSenderNames.h" // for sender creation and update -#include "..\..\SpoutGL\SpoutDirectX.h" // for creating DX11 textures -#include "..\..\SpoutGL\SpoutFrameCount.h" // for mutex lock and new frame signal -#include "..\..\SpoutGL\SpoutCopy.h" // for pixel copy -#include "..\..\SpoutGL\SpoutUtils.h" // Registry utiities - -#include // for _getcwd -#include // for PROCESSENTRY32 -#include // for _tcsicmp - -class SPOUT_DLLEXP spoutDX { - - public: - - spoutDX(); - ~spoutDX(); - - // - // DIRECTX - // - bool OpenDirectX11(ID3D11Device* pDevice = nullptr); - ID3D11Device* GetDX11Device(); - ID3D11DeviceContext* GetDX11Context(); - void CloseDirectX11(); - bool IsClassDevice(); - - // - // SENDER - // - - // Set the sender name - bool SetSenderName(const char* sendername = nullptr); - // Set the sender texture format - void SetSenderFormat(DXGI_FORMAT format); - // Close sender and free resources - void ReleaseSender(); - // Send a texture - bool SendTexture(ID3D11Texture2D* pTexture); - // Send an image - bool SendImage(unsigned char * pData, unsigned int width, unsigned int height); - // Sender status - bool IsInitialized(); - // Sender name - const char * GetName(); - // Get width - unsigned int GetWidth(); - // Get height - unsigned int GetHeight(); - // Get frame rate - double GetFps(); - // Get frame number - long GetFrame(); - - // - // RECEIVER - // - - // Set the sender to connect to - void SetReceiverName(const char * sendername); - // Close receiver and free resources - void ReleaseReceiver(); - // Receive a texture from a sender - bool ReceiveTexture(ID3D11Texture2D** ppTexture = nullptr); - // Receive an image - bool ReceiveImage(unsigned char * pixels, unsigned int width, unsigned int height, bool bRGB = false, bool bInvert = false); - // Open sender selection dialog - void SelectSender(); - // Sender has changed - bool IsUpdated(); - // Connected to a sender - bool IsConnected(); - // Received frame is new - bool IsFrameNew(); - // Received sender share handle - HANDLE GetSenderHandle(); - // Received sender texture format - DXGI_FORMAT GetSenderFormat(); - // Received sender name - const char * GetSenderName(); - // Received sender width - unsigned int GetSenderWidth(); - // Received sender height - unsigned int GetSenderHeight(); - // Received sender frame rate - double GetSenderFps(); - // Received sender frame number - long GetSenderFrame(); - - // - // COMMON - // - - // Hold frame rate - void HoldFps(int fps); - // Disable frame counting for this application - void DisableFrameCount(); - // Return frame count status - bool IsFrameCountEnabled(); - - // - // Sender names - // - - // Get number of senders - int GetSenderCount(); - // Get sender name for a given index - bool GetSender(int index, char* sendername, int MaxSize = 256); - // Get sender details - bool GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat); - // Get active sender name - bool GetActiveSender(char* sendername); - // set active sender name - bool SetActiveSender(const char* sendername); - // Get maximum senders allowed - int GetMaxSenders(); - // Set maximum senders allowed - void SetMaxSenders(int maxSenders); - - // - // Adapter functions - // - - // Get the number of graphics adapters in the system - int GetNumAdapters(); - // Get the adapter name for a given index - bool GetAdapterName(int index, char *adaptername, int maxchars); - // Get the current adapter index - int GetAdapter(); - // Set required graphics adapter for output - bool SetAdapter(int index = 0); - // Get sender adapter index and name fro a given sender - int GetSenderAdapter(const char* sendername, char* adaptername, int maxchars); - - // - // Sharing modes (2.006 compatibility) - // - - - - // Get user selected DX9 mode (2.006) - bool GetDX9(); - bool GetMemoryShareMode(); - - // - // Utility - // - - bool CreateDX11texture(ID3D11Device* pd3dDevice, - unsigned int width, unsigned int height, - DXGI_FORMAT format, ID3D11Texture2D** ppTexture); - - // - // Public for external access - // - - spoutSenderNames sendernames; - spoutFrameCount frame; - spoutDirectX spoutdx; - spoutCopy spoutcopy; - - // - // Options used for SpoutCam - // - - // Mirror image - bool m_bMirror; - // RGB <> BGR - bool m_bSwapRB; - -protected : - - ID3D11Device* m_pd3dDevice; - ID3D11DeviceContext* m_pImmediateContext; - ID3D11Texture2D* m_pSharedTexture; - ID3D11Texture2D* m_pStaging[2]; - int m_Index; - int m_NextIndex; - - HANDLE m_dxShareHandle; - DWORD m_dwFormat; - SharedTextureInfo m_SenderInfo; - char m_SenderNameSetup[256]; - char m_SenderName[256]; - unsigned int m_Width; - unsigned int m_Height; - bool m_bUpdated; - bool m_bConnected; - bool m_bNewFrame; - bool m_bSpoutInitialized; - bool m_bSpoutPanelOpened; - bool m_bSpoutPanelActive; - bool m_bClassDevice; - bool m_bAdapt; - SHELLEXECUTEINFOA m_ShExecInfo; - - bool CheckSender(unsigned int width, unsigned int height, DWORD dwFormat); - ID3D11Texture2D* CheckSenderTexture(char *sendername, HANDLE dxShareHandle); - - bool ReceiveSenderData(); - void CreateReceiver(const char * sendername, unsigned int width, unsigned int height, DWORD dwFormat); - - // Read pixels via staging texture - bool ReadPixelData(ID3D11Texture2D* pStagingTexture, unsigned char* pixels, unsigned int width, unsigned int height, bool bRGB, bool bInvert); - bool CheckStagingTextures(unsigned int width, unsigned int height, DWORD dwFormat = DXGI_FORMAT_B8G8R8A8_UNORM); - bool CreateDX11StagingTexture(unsigned int width, unsigned int height, DXGI_FORMAT format, ID3D11Texture2D** pStagingTexture); - - void SelectSenderPanel(); - bool CheckSpoutPanel(char *sendername, int maxchars = 256); - - -}; - -#endif diff --git a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.cpp b/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.cpp deleted file mode 100644 index 9b5bd44..0000000 --- a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.cpp +++ /dev/null @@ -1,558 +0,0 @@ -// -// spoutDX12.cpp -// -// Functions to manage DirectX 12 texture sharing by way of D3D11On12 -// Base class spoutDX for sending and receiving functions. -// -// ==================================================================================== -// Revisions : -// 04.12.20 - start class -// 26.01.21 - First working version -// -// ==================================================================================== -/* - - Copyright (c) 2014-2021. Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include "SpoutDX12.h" - -spoutDX12::spoutDX12() { - - m_pd3dDevice12 = nullptr;// D3D12 device - m_pd3dDevice11 = nullptr; // D3D11 device - m_pd3dDeviceContext11 = nullptr; // D3D11 context - m_pd3d11On12Device = nullptr; // D3D11on12 device - m_bClassDevice = false; // External or class D3D12 device - m_pReceivedResource11 = nullptr; // The wrapped D3D11 resource for D3D12 - -} - -spoutDX12::~spoutDX12() { - - if (m_pd3dDevice12) m_pd3dDevice12->Release(); - if (m_pd3dDevice11) m_pd3dDevice11->Release(); - if (m_pd3dDeviceContext11) m_pd3dDeviceContext11->Release(); - if (m_pd3d11On12Device) m_pd3d11On12Device->Release(); - -} - -bool spoutDX12::OpenDirectX12() -{ - return OpenDirectX12(nullptr, nullptr); -} - -bool spoutDX12::OpenDirectX12(ID3D12Device* pd3dDevice12, IUnknown** ppCommandQueue) -{ - if (!m_pd3dDevice12) { - if (pd3dDevice12) { - SpoutLogNotice("spoutDX12::OpenDirectX12(0x%.7X)", PtrToUint(pd3dDevice12)); - m_pd3dDevice12 = pd3dDevice12; - // Create a class 11on12 device using the dx12 device and command queue - if (!CreateDX11on12device(m_pd3dDevice12, ppCommandQueue)) { - SpoutLogWarning("spoutDX12::OpenDirectX12 - CreateDX11on12device 1 failed"); - CloseDirectX12(); - return false; - } - m_bClassDevice = false; // An existing device pointer was used - } - else { - // Create a class DirectX 12 device - m_pd3dDevice12 = CreateDX12device(); - if (!m_pd3dDevice12) { - SpoutLogWarning("spoutDX12::OpenDirectX12 - Could not create DX12 device"); - return false; - } - // Create a class 11on12 device using the class dx12 device and no command queue - if (!CreateDX11on12device(m_pd3dDevice12)) { - CloseDirectX12(); - SpoutLogWarning("spoutDX12::OpenDirectX12 - CreateDX11on12device 2 failed"); - return false; - } - SpoutLogNotice("spoutDX12::OpenDirectX12() - (%.7X)", PtrToUint(pd3dDevice12)); - } - } - else { - SpoutLogNotice("spoutDX12::OpenDirectX12 device already created - (%.7X)", PtrToUint(pd3dDevice12)); - } - - // Initialize DirectX11 using the D3D11 device created by CreateDX11on12device - // so that textures are created with that device and can be copied. - OpenDirectX11(m_pd3dDevice11); - - return true; -} - - -void spoutDX12::CloseDirectX12() -{ - SpoutLogNotice("spoutDX12::CloseDirectX12()"); - - // Quit if already released - if (!m_pd3dDevice12) { - SpoutLogNotice(" Device already released"); - return; - } - - // Release class D3D11on12 - if (m_pd3dDevice11) m_pd3dDevice11->Release(); // D3D11 device - if (m_pd3dDeviceContext11) m_pd3dDeviceContext11->Release(); // D3D11 context - if (m_pd3d11On12Device) m_pd3d11On12Device->Release(); // D3D11on12 device - m_pd3dDevice11 = nullptr; - m_pd3dDeviceContext11 = nullptr; - m_pd3d11On12Device = nullptr; - - // Release class D3D12 - if(m_pd3dDevice12) m_pd3dDevice12->Release(); - m_pd3dDevice12 = nullptr; - - // Release D3D11 - CloseDirectX11(); - -} - -// Send wrapped D3D11on12 D3D11 texture resource -bool spoutDX12::SendDX11Resource(ID3D11Resource *pWrappedResource) -{ - if (!pWrappedResource || !m_pd3d11On12Device || !m_pd3dDeviceContext11) - return false; - - m_pd3d11On12Device->AcquireWrappedResources(&pWrappedResource, 1); - // SendTexture handles sender creation and resizing - bool bRet = SendTexture((ID3D11Texture2D*)pWrappedResource); - m_pd3d11On12Device->ReleaseWrappedResources(&pWrappedResource, 1); - // Flush to submit the 11 command list to the shared command queue. - m_pd3dDeviceContext11->Flush(); - - return bRet; - -} - - -// Receive a texture from a sender to a D3D12 texture resource -bool spoutDX12::ReceiveDX12Resource(ID3D12Resource** ppDX12Resource) -{ - // Return if flagged for update - // The update flag is reset when the receiving application calls IsUpdated() - if (m_bUpdated) - return true; - - // Try to receive texture details from a sender - if (ReceiveSenderData()) { - - // Was the shared texture pointer retrieved ? - if (!m_pSharedTexture) { - return false; - } - - // The sender name, width, height, format, shared texture handle and pointer have been retrieved. - if (m_bUpdated) { - - // If the sender is new or changed, return to update the receiving D3D12 texture resource. - // The application detects the change with IsUpdated(). - - // Release the wrapped 11On12 D3D11 resource because - // it has to be re-created for the new receiving texture - if (m_pReceivedResource11) - m_pReceivedResource11->Release(); - m_pReceivedResource11 = nullptr; - return true; - } - - // The application receiving texture is created - // by the application on the first update above - // ready for copy from the sender's shared texture. - ID3D12Resource* pDX12Resource = *ppDX12Resource; - if (!pDX12Resource) { - // SpoutLog - return false; - } - - // Is a wrapped resource created yet? - if (!m_pReceivedResource11) { - if (!WrapDX12Resource(pDX12Resource, &m_pReceivedResource11)) { - // SpoutLog - return false; - } - } - - - // - // Found a sender - // - - // Access the sender shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - m_bNewFrame = false; // For query of new frame - // Check if the sender has produced a new frame. - if (frame.GetNewFrame()) { - // Copy from the sender's shared texture to the wrapped receiving texture. - UpdateWrappedResource(m_pReceivedResource11, m_pSharedTexture); - m_bNewFrame = true; // The application can query IsNewFrame() - } - } - // Allow access to the shared texture - frame.AllowTextureAccess(m_pSharedTexture); - - m_bConnected = true; - - } // sender exists - else { - // There is no sender or the connected sender closed. - ReleaseReceiver(); - // Release the wrapped 11On12 D3D11 resource - if (m_pReceivedResource11) - m_pReceivedResource11->Release(); - m_pReceivedResource11 = nullptr; - // Let the application know. - m_bConnected = false; - } - - // ReceiveTexture fails if there is no sender or the connected sender closed. - return m_bConnected; - -} - - -// Create a D3D11on12 device -ID3D11On12Device* spoutDX12::CreateDX11on12device(ID3D12Device* pDevice12, IUnknown** ppCommandQueue) -{ - ID3D11Device* pDevice11 = nullptr; - ID3D11DeviceContext* pContext11 = nullptr; - ID3D11On12Device* pd3d11On12Device = nullptr; // D3D11on12 device - - // Only allowing for one queue - int numQueues = 0; - if (ppCommandQueue) - numQueues = 1; - - // Release the class device - if (m_pd3d11On12Device) - m_pd3d11On12Device->Release(); - m_pd3d11On12Device = nullptr; - - UINT DeviceFlags11 = D3D11_CREATE_DEVICE_BGRA_SUPPORT; - - HRESULT hRes = D3D11On12CreateDevice( - pDevice12, // DX12 device - DeviceFlags11, // FLAGS - nullptr, // Feature level table - 0, // Feature levels - ppCommandQueue, // command queues - numQueues, // Num queues - 0, // NodeMask - &pDevice11, // D3D11 device - &pContext11, // D3D11 context - nullptr - ); - - if (FAILED(hRes)) { - SpoutLogError("spoutDX12::CreateDX11on12device fail"); - return false; - } - - // Grab interface to the d3d11on12 device from the newly created d3d11 device - hRes = pDevice11->QueryInterface(__uuidof(ID3D11On12Device), (void**)&pd3d11On12Device); - if (FAILED(hRes)) { - SpoutLogError("failed to query 11on12 device"); - return false; - } - - SpoutLogNotice("spoutDX12::CreateDX11on12device - (0x%.7X)", PtrToUint(pd3d11On12Device)); - - // Update globals - m_pd3d11On12Device = pd3d11On12Device; - m_pd3dDevice11 = pDevice11; - m_pd3dDeviceContext11 = pContext11; - - return pd3d11On12Device; - -} - -// Wrap a D3D12 resource for use with D3D11 -bool spoutDX12::WrapDX12Resource(ID3D12Resource* pDX12Resource, ID3D11Resource** ppWrapped11Resource) -{ - HRESULT hr = S_OK; - - if (!m_pd3d11On12Device || !pDX12Resource || !ppWrapped11Resource) - return false; - - // A D3D11_RESOURCE_FLAGS structure that enables an application to override flags - // that would be inferred by the resource/heap properties. - // The D3D11_RESOURCE_FLAGS structure contains bind flags, misc flags, and CPU access flags. - D3D11_RESOURCE_FLAGS d3d11Flags = {}; // { D3D11_BIND_RENDER_TARGET }; - - // Create a wrapped resource to access our d3d12 resource from the d3d11 device - // Note: D3D12_RESOURCE_STATE variables are: - // (1) the state of the d3d12 resource when we acquire it - // (when the d3d12 pipeline is finished with it and we are ready to use it in d3d11) - // (2) when we are done using it in d3d11 (we release it back to d3d12) - // these are the states our resource will be transitioned into - hr = m_pd3d11On12Device->CreateWrappedResource( - pDX12Resource, // A pointer to an already-created D3D12 resource or heap. - &d3d11Flags, - D3D12_RESOURCE_STATE_COPY_DEST, // D3D12_RESOURCE_STATE_RENDER_TARGET, // InState - D3D12_RESOURCE_STATE_PRESENT, // OutState - IID_PPV_ARGS(ppWrapped11Resource)); // Lazy - - if (FAILED(hr)) { - SpoutLogError("spoutDX12::WrapDX12Resource - failed to create wrapped resource (%d 0x%.7X)", LOWORD(hr), UINT(hr)); - // TODO - error reports - // E_INVALIDARG 0x57 - // E_NOTIMPL 0x4001 - // DXGI_ERROR_INVALID_CALL 0xa001 - // D3DERR_INVALIDCALL - return false; - } - - SpoutLogNotice("spoutDX12::WrapDX12Resource (0x%.7X, 0x%.7X)", PtrToUint(pDX12Resource), PtrToUint(*ppWrapped11Resource)); - - return true; -} - - -// Update a wrapped D3D11 texture resource with a D3D11 texture -void spoutDX12::UpdateWrappedResource(ID3D11Resource* pWrappedResource, ID3D11Resource *pResource) -{ - if (!pResource || !pWrappedResource || !m_pd3d11On12Device || !m_pd3dDeviceContext11) - return; - - m_pd3d11On12Device->AcquireWrappedResources(&pWrappedResource, 1); - m_pd3dDeviceContext11->CopyResource(pWrappedResource, pResource); - m_pd3d11On12Device->ReleaseWrappedResources(&pWrappedResource, 1); - m_pd3dDeviceContext11->Flush(); -} - - -// Create a D3D12 texture resource -bool spoutDX12::CreateDX12texture(ID3D12Device* pd3dDevice12, - unsigned int width, - unsigned int height, - D3D12_RESOURCE_STATES InitialState, - DXGI_FORMAT *format, - ID3D12Resource** ppTexture) -{ - if (!pd3dDevice12) { - SpoutLogFatal("spoutDX12::CreateSharedDX12Texture NULL device"); - return false; - } - - if (!ppTexture) { - SpoutLogWarning("spoutDX12::CreateDX12Texture NULL texture pointer"); - return false; - } - SpoutLogNotice("spoutDX12::CreateDX12Texture"); - - ID3D12Resource* pTexture12 = *ppTexture; - - // Release the texture if it already exists - if (pTexture12) - pTexture12->Release(); - - // Use the format passed in. If that is zero or DX9, use the default format. - DXGI_FORMAT texformat = DXGI_FORMAT_B8G8R8A8_UNORM; - if (*format != 0 && *format != 21) // D3DFMT_A8R8G8B8 = 21 - texformat = *format; - - // Describe and create a Texture2D - D3D12_RESOURCE_DESC textureDesc = {}; - textureDesc.MipLevels = 1; - textureDesc.Format = texformat; - textureDesc.Width = width; - textureDesc.Height = height; - textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; - textureDesc.DepthOrArraySize = 1; - textureDesc.SampleDesc.Count = 1; - textureDesc.SampleDesc.Quality = 0; - textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - - DX12_HEAP_PROPERTIES heapprop = DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT); - try { - pd3dDevice12->CreateCommittedResource( - &heapprop, - D3D12_HEAP_FLAG_NONE, - &textureDesc, - InitialState, - nullptr, - IID_PPV_ARGS(&pTexture12)); - } - catch (...) { - SpoutLogError("spoutDX12::CreateDX12Texture - exception"); - return false; - } - - SpoutLogNotice("spoutDX12::CreateDX12Texture - 0x%.7X", PtrToUint(pTexture12)); - - *format = texformat; - *ppTexture = pTexture12; - - return true; - -} - -// D3D12 device -ID3D12Device* spoutDX12::GetD3D12device() -{ - return m_pd3dDevice12; -} - -// D3D11on12 D3D11 device -ID3D11Device* spoutDX12::GetD3D11device() -{ - return m_pd3dDevice11; -} - -// D3D11on12 D3D11 context -ID3D11DeviceContext* spoutDX12::GetD3D11context() -{ - return m_pd3dDeviceContext11; -} - -// D3D11on12 device -ID3D11On12Device* spoutDX12::GetD3D11On12device() -{ - return m_pd3d11On12Device; -} - - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// -// Private functions -// - -// Create DX12 device -ID3D12Device* spoutDX12::CreateDX12device() -{ - - ID3D12Device* pd3dDevice12 = nullptr; - HRESULT hRes = S_OK; - - IDXGIFactory1* factory1 = nullptr; - if (FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&factory1))) - return false; - - // Release the class device - if (m_pd3dDevice12) - m_pd3dDevice12->Release(); - m_pd3dDevice12 = nullptr; - - IDXGIAdapter1* hardwareAdapter = nullptr; - GetHardwareAdapter(factory1, &hardwareAdapter); - factory1->Release(); - - DXGI_ADAPTER_DESC desc; - hardwareAdapter->GetDesc(&desc); - // printf("hardwareAdapter : %S\n", desc.Description); - - hRes = D3D12CreateDevice(hardwareAdapter, - D3D_FEATURE_LEVEL_11_0, - _uuidof(ID3D12Device), - (void **)&pd3dDevice12); - - if (FAILED(hRes)) { - SpoutLogError("spoutDX12::CreateDX12device fail"); - return false; - } - SpoutLogNotice("spoutDX12::CreateDX12device - 0x%.7X", PtrToUint(pd3dDevice12)); - - // Set the class device - m_pd3dDevice12 = pd3dDevice12; - - return pd3dDevice12; - -} // end CreateDX12device - - -// Helper function for acquiring the first available hardware adapter that supports Direct3D 12. -// If no such adapter can be found, *ppAdapter will be set to nullptr. -// _Use_decl_annotations_ -// Copied from Microsoft examples. -void spoutDX12::GetHardwareAdapter(IDXGIFactory1* pFactory, - IDXGIAdapter1** ppAdapter, - bool requestHighPerformanceAdapter) -{ - *ppAdapter = nullptr; - - IDXGIAdapter1* adapter; - IDXGIFactory6* factory6; - - if (SUCCEEDED(pFactory->QueryInterface(IID_PPV_ARGS(&factory6)))) - { - for ( - UINT adapterIndex = 0; - DXGI_ERROR_NOT_FOUND != factory6->EnumAdapterByGpuPreference( - adapterIndex, - requestHighPerformanceAdapter == true ? DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE : DXGI_GPU_PREFERENCE_UNSPECIFIED, - IID_PPV_ARGS(&adapter)); - ++adapterIndex) - { - DXGI_ADAPTER_DESC1 desc; - adapter->GetDesc1(&desc); - // printf("adapter %d : %S\n", adapterIndex, desc.Description); - if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) - { - // Don't select the Basic Render Driver adapter. - // If you want a software adapter, pass in "/warp" on the command line. - continue; - } - - // Check to see whether the adapter supports Direct3D 12, but don't create the - // actual device yet. - if (SUCCEEDED(D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) - { - break; - } - } - } - else - { - for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != pFactory->EnumAdapters1(adapterIndex, &adapter); ++adapterIndex) - { - DXGI_ADAPTER_DESC1 desc; - adapter->GetDesc1(&desc); - - if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) - { - // Don't select the Basic Render Driver adapter. - // If you want a software adapter, pass in "/warp" on the command line. - continue; - } - - // Check to see whether the adapter supports Direct3D 12, but don't create the - // actual device yet. - HRESULT hr = D3D12CreateDevice(adapter, - D3D_FEATURE_LEVEL_11_0, - _uuidof(ID3D12Device), - nullptr); - - if (SUCCEEDED(hr)) - { - break; - } - } - } - - *ppAdapter = adapter; - -} diff --git a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.h b/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.h deleted file mode 100644 index 6ed3dd2..0000000 --- a/Plugin/Spout/SpoutDirectX/SpoutDX/SpoutDX12/SpoutDX12.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - - spoutDX12.h - - Functions to manage DirectX 12 texture sharing by way of the D3D11On12 - - Copyright (c) 2014 - 2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once -#ifndef __spoutDX12__ -#define __spoutDX12__ - -#include "..\SpoutDX.h" // Base class - -#include -#include -#include // for IDXGIFactory6 in GetHardwareAdapter -#pragma comment (lib, "d3d12.lib")// the Direct3D 11 Library file -#pragma comment (lib, "DXGI.lib") // for CreateDXGIFactory1 - - -// Copied from Microsoft examples -struct DX12_HEAP_PROPERTIES : public D3D12_HEAP_PROPERTIES -{ - DX12_HEAP_PROPERTIES() = default; - explicit DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES &o) noexcept : - D3D12_HEAP_PROPERTIES(o) - {} - DX12_HEAP_PROPERTIES( - D3D12_CPU_PAGE_PROPERTY cpuPageProperty, - D3D12_MEMORY_POOL memoryPoolPreference, - UINT creationNodeMask = 1, - UINT nodeMask = 1) noexcept - { - Type = D3D12_HEAP_TYPE_CUSTOM; - CPUPageProperty = cpuPageProperty; - MemoryPoolPreference = memoryPoolPreference; - CreationNodeMask = creationNodeMask; - VisibleNodeMask = nodeMask; - } - explicit DX12_HEAP_PROPERTIES( - D3D12_HEAP_TYPE type, - UINT creationNodeMask = 1, - UINT nodeMask = 1) noexcept - { - Type = type; - CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - CreationNodeMask = creationNodeMask; - VisibleNodeMask = nodeMask; - } - bool IsCPUAccessible() const noexcept - { - return Type == D3D12_HEAP_TYPE_UPLOAD || Type == D3D12_HEAP_TYPE_READBACK || (Type == D3D12_HEAP_TYPE_CUSTOM && - (CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE || CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_BACK)); - } -}; - - -class spoutDX12 : public spoutDX { - - public: - - spoutDX12(); - ~spoutDX12(); - - // Initialize and prepare DirectX 12 - bool OpenDirectX12(); - bool OpenDirectX12(ID3D12Device* pd3dDevice12, IUnknown** ppCommandQueue); - - // Release DirectX 12 - void CloseDirectX12(); - - // Send wrapped D3D11on12 D3D11 texture resource - bool SendDX11Resource(ID3D11Resource *pWrappedResource); - - // Receive a texture from a sender to a D3D12 texture resource - bool ReceiveDX12Resource(ID3D12Resource** ppDX12Resource); - - // Create a D3D11on12 device - ID3D11On12Device* CreateDX11on12device(ID3D12Device* pDevice12, IUnknown** ppCommandQueue = nullptr); - - // Wrap a D3D12 resource for use with D3D11 - bool WrapDX12Resource(ID3D12Resource* pDX12Resource, ID3D11Resource** ppWrapped11Resource); - - // Update a wrapped D3D11 texture resource with a D3D11 texture - void UpdateWrappedResource(ID3D11Resource* pWrappedResource, ID3D11Resource *pResource); - - // Create a D3D12 texture resource - bool CreateDX12texture(ID3D12Device* pDevice12, - unsigned int width, unsigned int height, - D3D12_RESOURCE_STATES InitialState, - DXGI_FORMAT *format, ID3D12Resource** ppTexture); - - // Device pointers - ID3D12Device* GetD3D12device(); // D3D12 device - ID3D11Device* GetD3D11device(); // D3D11 device - ID3D11DeviceContext* GetD3D11context(); // D3D11 context - ID3D11On12Device* GetD3D11On12device(); // D3D11on12 device - - protected: - - ID3D12Device* CreateDX12device(); - void GetHardwareAdapter(IDXGIFactory1* pFactory, IDXGIAdapter1** ppAdapter, bool requestHighPerformanceAdapter = false); - - ID3D12Device* m_pd3dDevice12; // D3D12 device - ID3D11Device* m_pd3dDevice11; // D3D11 device - ID3D11DeviceContext* m_pd3dDeviceContext11; // D3D11 context - ID3D11On12Device* m_pd3d11On12Device; // D3D11on12 device - bool m_bClassDevice; // Using a class or application device - - // The wrapped D3D11 resource for D3D12 - ID3D11Resource* m_pReceivedResource11; - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/Spout.cpp b/Plugin/Spout/SpoutGL/Spout.cpp deleted file mode 100644 index 4f7cf1d..0000000 --- a/Plugin/Spout/SpoutGL/Spout.cpp +++ /dev/null @@ -1,1964 +0,0 @@ -// -// SpoutSDK -// -// Documentation -// -// ==================================================================================== -// Revisions : -// -// 14-07-14 - SelectSenderPanel - return true was missing. -// 16-07-14 - deleted fbo & texture in SpoutCleanup - test for OpenGL context -// - used CopyMemory in FlipVertical instead of memcpy -// - cleanup -// 18-07-14 - removed SpoutSDK local fbo and texture - used in the interop class now -// 22-07-14 - added option for DX9 or DX11 -// 25-07-14 - Malcolm Bechard mods to header to enable compilation as a dll -// - ReceiveTexture - release receiver if the sender no longer exists -// - ReceiveImage same change - to be tested -// 27-07-14 - CreateReceiver - bUseActive flag instead of null name -// 31-07-14 - Corrected DrawTexture aspect argument -// 01-08-14 - TODO - work on OpenReceiver for memoryshare -// 03-08-14 - CheckSpoutPanel allow for unregistered sender -// 04-08-14 - revise CheckSpoutPanel -// 05-08-14 - default true for setverticalsync in sender and receiver classes -// 11-08-14 - fixed incorrect name arg in OpenReceiver for ReceiveTexture / ReceiveImage -// 2.004 release 19-08-14 -// 24-08-14 - changed back to WM_PAINT message instead of RedrawWindow due to FFGL receiver bug appearing again -// 27-08-14 - removed texture init check from SelectSenderPanel -// 29-08-14 - changed SelectSenderPanel to use revised SpoutPanel with user message support -// 03.09.14 - cleanup -// 15.09.14 - protect against null string copy in SelectSenderPanel -// 22.09.14 - checking of bUseAspect function in CreateReceiver -// 23.09.14 - test for DirectX 11 support in SetDX9 and GetDX9 -// 24.09.14 - updated project file for DLL to include SpoutShareMemory class -// 28.09.14 - Added GL format for SendImage and FlipVertical -// - Added bAlignment (4 byte alignment) flag for SendImage -// - Added Host FBO for SendTexture, DrawToSharedTexture -// - Added Host FBO for ReceiveTexture -// 11.10.14 - Corrected UpdateSender to recreate sender using CreateInterop -// - Corrected SelectSenderpanel so that an un-initialized string is not used -// 12.10.14 - Included SpoutPanel always bring to topmost in SelectSenderPanel -// - allowed for change of sender size in DrawToSharedTexture -// 15.10.14 - added debugging aid for texture access locks -// 29.10.14 - changes to SendImage -// 23.12.14 - added host fbo arg to ReceiveImage -// 30.01.15 - Read SpoutPanel path from registry (dependent on revised installer) -// Next path checked is module path, then current working directory -// 06.02.15 - added #pragma comment(lib,.. for "Shell32.lib" and "Advapi32.lib" -// 10.02.15 - added Optimus NvOptimusEnablement export to Spout.h - should apply to all apps including this SDK. -// 22.02.15 - added FindFileVersion for future use -// 24.05.15 - Registry read of sender name for CheckSpoutPanel (see SpoutPanel) -// 29.05.15 - Included SetAdapter for multiple adapters - Franz Hildgen. -// 01.06.15 - Read/Write DX9 mode from registry -// 02.06.15 - Added GetAdapter, GetNumAdapters, GetAdapterName -// 04.07.15 - corrected "const char *" arg for GetSenderInfo -// 08.07.15 - Recompile for global DX9 flag -// 01.08.15 - OpenReceiver - safety in case no opengl context -// 22.08.15 - Change to CheckSpoutPanel to wait for SpoutPanel mutex to open and then close -// 24.08.15 - Added GetHostPath to retrieve the path of the host that produced the sender -// 01.09.15 - added MessageBox error warnings in InitSender for better user diagnostics -// also added MessageBox warnings in SpoutGLDXinterop::CreateInterop -// 09.09.15 - included g_ShareHandle in CheckSpoutPanel -// - removed bGLDXcompatibleShareInitOK becasue there is no single initialization any more -// 12.09.15 - Incremented application sender name if one already exists with the same name -// - Finalised revised SpoutMemoryShare class and functions -// 15.09.15 - Disable memoryshare if the 2.005 installer has not set the "MemoryShare" key -// to avoid problems with 2.004 apps. -// - Change logic of OpenSpout so that fails for incompatible hardware -// if memoryshare is not set. Only 2.005 apps can set memoryshare.\ -// 19.09.15 - Changed GetImageSize to look for NULL sharehandle of a sender to determine -// if it is memoryshare. Used by SpoutCam. -// 22.09.15 - Fixed memoryshare sender update in UpdateSender -// 25.09.15 - Changed SetMemoryShareMode for 2.005 - now will only set true for 2.005 and above -// 09.10.15 - DrawToSharedTexture - invert default false instead of true -// 10.10.15 - CreateSender - introduced a temporary DX shared texture for 2.005 memoryshare to prevent -// a crash with existing 2.004 apps -// 22.10.15 - Changed CheckSpoutPanel so that function variables are only created if SpoutPanel has been opened -// 26.10.15 - Added bIsSending and bIsReceiving for safety release of sender in destructor. -// 14.11.15 - changed functions to "const char *" where required -// 18.11.15 - added CheckReceiver so that DrawSharedTexture can be used by a receiver -// 24.11.15 - changes to CheckSpoutPanel to favour ActiveSender over the Registry sender name (used by VVVV) -// - Reintroduced 250msec sleep after SpoutPanel activation -// 29.11.15 - fixed const char problem in ReadPathFromRegistry -// 18.01.16 - added CleanSenders before opening a new sender in case of orphaned sender names in the list -// 10.02.16 - added RemovePathFromRegistry -// 26.02.16 - recompile for Processing library 2.0.5.2 release -// 06.03.16 - added GetSpoutSenderName() and IsSpoutInitialized() for access to globals -// 17.03.16 - removed alignment argument from ReceiveImage -// Check for bgra extensions in receiveimage and sendimage -// Support only for rgba or bgra -// Changed to const unsigned char for Sendimage buffer -// 21.03.16 - Added glFormat and bInvert to SendImage -// - Included LoadGLextensions in InitSender and InitReceiver for memoryshare mode. -// 24.03.16 - Added HostFBO argument to WriteMemory and ReadMemory function calls. -// 04.04.16 - Added HostFBO argument to SendImage - only used for texture share -// Merge from Smokhov https://github.com/leadedge/Spout2/pull/14 -// - Changed default invert flag for SendImage to true. -// 24.04.16 - Added IsPBOavailable to test for PBO support. -// 04.05.16 - SetPBOavailable(true/false) added to enable/disable pbo functions -// 07.05.16 - SetPBOavailable changed to SetBufferMode -// 18.06.16 - Add invert to ReceiveImage -// 2.005 release 23-06-16 -// 29.06.16 - Added ReportMemory() for debugging -// - Changed OpenSpout to fail for DX9 if no hwnd -// https://github.com/leadedge/Spout2/issues/18 -// 03.07.16 - Fix dwFormat repeat declaration in InitSender -// 15.01.17 - Add GetShareMode, SetShareMode -// 18.01.17 - GetImageSize redundant for 2.006 -// 22.01.17 - include zero char in SelectSenderPanel NULL arg checks -// 25.05.17 - corrected SendImage UpdateSender to use passed width and height -// 2.006 release 08-02-17 -// -// VS2015 -// -// 02.06.17 - Registry functions moved to SpoutUtils -// 06.06.17 - Added GLDXavailable to OpenSpout -// 09.06.17 - removed g_TexID - not used -// 05.10.17 - https://github.com/leadedge/Spout2/issues/24 -// - OpenReceiver simplify code -// - CheckSpoutPanel simplify code, remove text file sender retrieval -// - Add InitReceiver override to include sharehandle and format args -// 10.03.18 - Noted that change to OpenReceiver for offscreen rendering -// not needed because hwnd can be null for spoutdx.CreateDX9device -// https://github.com/leadedge/Spout2/issues/18 -// -// VS2017 -// -// 23.08.18 - Add SendFboTexture - see changes to WriteGLDXtexture in SpoutGLDXinterop.cpp -// 17.10.18 - Retrieve global render window handle in OpenSpout -// 01.11.18 - SendImage bInvert default false to align with SpoutSender.cpp -// 01.11.18 - Changes to SelectSenderPanel to terminate SpoutPanel if it has crashed. -// 03.11.18 - Texture creation patch for compatibility with 2.004 removed for Spout 2.007 -// 13.11.18 - Remove CPU mode -// 24.11.18 - Remove redundant GetImageSize -// 27.11.18 - Add RemovePadding for correction of image stride -// 28.11.18 - Add IsFrameNew and HasNewFrame -// 14.12.18 - Clean up for SpoutLibrary -// 15.12.18 - UpdateSender - release and re-create sender to avoid memory leak -// 17.12.18 - Change Spout dll Project properties to / MT -// 28.12.18 - Check mutex handle before close in CheckSpoutPanel -// 28.12.18 - Rebuild Spout.dll 32 / 64bit - Version 2.007 -// 03.01.19 - Changed to revised registry functions in SpoutUtils -// 04.01.19 - Add OpenGL window creation functions for SpoutLibrary -// 05.01.19 - Change names for high level receiver functions for SpoutLibrary -// 16.01.19 - Fix ReceiveTextureData for sender name change -// 22.01.19 - Remove unsused bIsReceiving flag -// 05.03.19 - Add log notice for ReleaseSender -// 05.04.19 - Change GetSenderName to GetSender -// Reserve const char * GetSenderName for receiver class -// 17.06.19 - Fix missing log warning argument in UpdateSender -// 26.06.19 - Cleanup changes to UpdateSender -// 13.01.20 - Removed sleep time for SpoutPanel to open -// 19.01.20 - Change SendFboTexture to SendFbo -// 20.01.20 - Corrected SendFbo for width/height < shared texture -// 21.01.20 - Remove auto sender update in send functions -// Remove debug print from InitSender -// 25.05.20 - Correct filename case for all #includes throughout -// 14.07.20 - Removed unused bChangeRequested flag -// 18.07.20 - Rebuild binaries Win32 and x64 /MT VS2017 -// 04.09.20 - Dynamic switch between memory and texture share modes -// 05.09.20 - OpenReceiver - Switch to memoryshare if receiver and sender use different GPU -// See SpoutGLDXinterop to set adapter index to "usage" field in sender shared memory -// 06.09.20 - Do not change share mode flags in SpoutCleanup -// 07.09.20 - Correct receiver switch from memory to texture if texture compatible -// 08.09.20 - OpenReceiver - remove warning log for receiver and sender using a different GPU -// InitSender - switch to memoryshare on CreateInterop failure -// 09.09.20 - SetAdapter - reset and perform compatibility test -// 15.09.20 - Remove SpoutMessageBox from OpenSpout() -// Failure must be handled by the application -// 17.09.20 - Change GetMemoryShare(const char* sendername) to -// GetSenderMemoryShare(const char* sendername) for compatibility with SpoutLibrary -// Add GetSenderAdapter -// 18.09.20 - Add SetSenderAdapter -// 22.09.20 - OpenReceiver sender/receiver GPU check -// 23.09.20 - Corrected SetSenderAdapter -// Logic corrections -// 24.09.20 - Correction of SetSenderAdapter as bool not void -// 25.09.20 - Remove GetSenderAdapter/SetSenderAdapter - not reliable -// 17.10.20 - Change SetDX9format from D3D_FORMAT to DWORD -// -// 27.12.20 - Multiple changes for SpoutGL base class - see SpoutSDK.cpp -// Remove DX9 support -// CPU backup enhanced using dual DirectX staging textures -// Auto switch to CPU backup if GL/DX incompatible -// 10.01.21 - SetSenderName - auto increment of sender name if the sender already exists -// 12.01.21 - Release orphaned senders in SelectSenderPanel -// - CheckSender : write host path to the sender shared memory Description field -// in spoutSenderNames::CreateSender -// 13.01.21 - Release orphaned senders in SpoutPanel.exe instead of SelectSenderPanel -// Additional checks for un-registered senders -// -// ==================================================================================== -/* - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#include "Spout.h" - -// Class: Spout -// -// -// -// Main class for Spout OpenGL texture sharing -// -// Contains both Sender and Receiver functions. -// -// This class and other source files are included in a project -// -// Files required are (.h and .cpp) : -// -// - Spout -// - SpoutCommon -// - SpoutCopy -// - SpoutDirectX -// - SpoutFramecount -// - SpoutGL -// - SpoutGLextensions -// - SpoutSenderNames -// - SpoutSharedMemory -// - SpoutUtils -// -// Note that Sender and Receiver functions cannot be used within the same object. -// The SpoutSender and SpoutReceiver classes are convenience wrappers which -// insulate the sending and receiving functions for the programmer. -// -// - SpoutSender -// - SpoutReceiver -// -// You can also use the Spout SDK as a dll. To build the dll, refer to the -// Visual Studio project in the VS2017 folder and the CMake build documentation. -// Also refer to the SpoutLibrary folder for a C-compatible dll which can be -// used with compilers other than Visual Studio. -// -// More detailed information can be found in the header files SpoutSDK.h and SpoutGL.h. -// Functions for individual classes are documented within the respective source files. -// You can access these from the following objects included in the Spout class. -// -// - spoutDirectX spoutdx; (DirectX 11 texture sharing) -// - spoutCopy spoutcopy; (Pixel buffer copying) -// - spoutSenderNames sendernames; (Spout sender management) -// - spoutFrameCount frame; (Frame counting management) -// -// Details for practical use can be found in the source code for the Openframeworks examples. -// The methods are simple and you should be able to quickly extend to your own application -// or to other frameworks. -// -Spout::Spout() -{ - // Get graphics adapter number, index and name - m_AdapterNumber = GetNumAdapters(); - m_AdapterIndex = spoutdx.GetAdapter(); - GetAdapterName(m_AdapterIndex, m_AdapterName, 256); - -} - -Spout::~Spout() -{ - -} - -// -// Group: Sender -// -// SendFbo, SendTexture and SendImage create or update a sender as required. -// -// - If a sender has not been created yet : -// -// - Make sure Spout has been initialized and OpenGL context is available -// - Perform a compatibility check for GL/DX interop -// - If compatible, create interop for GL/DX transfer -// - If not compatible, create a shared texture for the sender -// - Create a sender using the DX11 shared texture handle -// -// - If the sender exists, test for size change : -// -// - If compatible, update the shared textures and GL/DX interop -// - If not compatible, re-create the class shared texture to the new size -// - Update the sender and class variables -// - -//--------------------------------------------------------- -// Function: SetSenderName -// Set name for sender creation -// -// If no name is specified, the executable name is used. -void Spout::SetSenderName(const char* sendername) -{ - if (!sendername) { - // Get executable name as default - GetModuleFileNameA(NULL, m_SenderName, 256); - PathStripPathA(m_SenderName); - PathRemoveExtensionA(m_SenderName); - } - else { - strcpy_s(m_SenderName, 256, sendername); - } - - // If a sender with this name is already registered, create an incremented name - int i = 1; - char name[256]; - strcpy_s(name, 256, m_SenderName); - if (sendernames.FindSenderName(name)) { - do { - sprintf_s(name, 256, "%s_%d", m_SenderName, i); - i++; - } while (sendernames.FindSenderName(name)); - } - // Re-set the global sender name - strcpy_s(m_SenderName, 256, name); - -} - -//--------------------------------------------------------- -// Function: SetSenderFormat -// Set the sender DX11 shared texture format -void Spout::SetSenderFormat(DWORD dwFormat) -{ - m_dwFormat = dwFormat; - m_DX11format = (DXGI_FORMAT)dwFormat; -} - -//--------------------------------------------------------- -// Function: ReleaseSender -// Close receiver and release resources. -// -// A new sender is created or updated by all sending functions -void Spout::ReleaseSender() -{ - if (m_bInitialized) { - sendernames.ReleaseSenderName(m_SenderName); - frame.CleanupFrameCount(); - frame.CloseAccessMutex(); - } - - CleanupGL(); - -} - -//--------------------------------------------------------- -// Function: SendFbo -// Send texture attached to fbo. -// -// The fbo must be currently bound. -// The sending texture can be larger than the size that the sender is set up for. -// For example, if the application is using only a portion of the allocated texture space, -// such as for Freeframe plugins. (The 2.006 equivalent is DrawToSharedTexture). -bool Spout::SendFbo(GLuint FboID, unsigned int width, unsigned int height, bool bInvert) -{ - // For texture sharing, the fbo must be equal to or larger than the shared texture - if (FboID <= 0 || width == 0 || height == 0) - return false; - - // Create or update the sender - if (!CheckSender(width, height)) - return false; - - // All clear to send the fbo texture - if (m_bUseGLDX) { - // 3840-2160 - 60fps (0.45 msec per frame) - return WriteGLDXtexture(0, 0, width, height, bInvert, FboID); - } - else if (m_bAuto) { - // Auto share enabled for DirectX CPU backup - // 3840-2160 - 43fps (5-7msec/frame) - // Create a local class texture if not already - CheckOpenGLTexture(m_TexID, GL_RGBA, width, height); - // Copy from the texture attached to the bound fbo to the class texture - glBindTexture(GL_TEXTURE_2D, m_TexID); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width, height); - glBindTexture(GL_TEXTURE_2D, 0); - // Copy from the OpenGL class texture to the shared DX11 texture by way of staging texture - return WriteDX11texture(m_TexID, GL_TEXTURE_2D, width, height, bInvert, 0); - } - - return false; - -} - -//--------------------------------------------------------- -// Function: SendTexture -// Send OpenGL texture -// -bool Spout::SendTexture(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - // Quit if no data - if (TextureID <= 0 || width == 0 || height == 0) - return false; - - // Create or update the sender - if (!CheckSender(width, height)) - return false; - - if (m_bUseGLDX) { - // Send OpenGL texture if GL/DX interop compatible - // 3840-2160 - 60fps (0.45 msec per frame) - return WriteGLDXtexture(TextureID, TextureTarget, width, height, bInvert, HostFBO); - } - else if (m_bAuto) { - // Auto share enabled for DirectX CPU backup - // 3840-2160 47fps (6-7 msec per frame with PBOs) - return WriteDX11texture(TextureID, TextureTarget, width, height, bInvert, HostFBO); - } - - return false; - -} - -//--------------------------------------------------------- -// Function: SendImage -// Send pixel image -bool Spout::SendImage(const unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat, bool bInvert, GLuint HostFBO) -{ - - // Dimensions should be the same as the sender - if (!pixels || width == 0 || height == 0) - return false; - - // Only RGBA, BGRA, RGB, BGR supported - if (!(glFormat == GL_RGBA || glFormat == GL_BGRA_EXT || glFormat == GL_RGB || glFormat == GL_BGR_EXT)) - return false; - - // Check for BGRA support - GLenum glformat = glFormat; - if (!m_bBGRAavailable) { - // If the bgra extensions are not available and the user - // provided GL_BGR_EXT or GL_BGRA_EXT do not use them - if (glFormat == GL_BGR_EXT) glformat = GL_RGB; - if (glFormat == GL_BGRA_EXT) glformat = GL_RGBA; - } - - // Create or update the sender - if (!CheckSender(width, height)) - return false; - - // - // Write pixel data to the rgba shared texture according to pixel format - // - if (m_bUseGLDX) { - // Texture share compatible - return WriteGLDXpixels(pixels, width, height, glformat, bInvert, HostFBO); - } - else if (m_bAuto) { - // Auto share enabled for DirectX CPU backup - return WriteDX11pixels(pixels, width, height, glformat, bInvert); - } - - return false; - -} - -//--------------------------------------------------------- -// Function: IsInitialized -// Initialization status -bool Spout::IsInitialized() -{ - return m_bInitialized; -} - -//--------------------------------------------------------- -// Function: GetName -// Sender name -const char * Spout::GetName() -{ - return m_SenderName; -} - -//--------------------------------------------------------- -// Function: GetWidth -// Sender width -unsigned int Spout::GetWidth() -{ - return m_Width; -} - -//--------------------------------------------------------- -// Function: GetHeight -// Sender height -unsigned int Spout::GetHeight() -{ - return m_Height; -} - -//--------------------------------------------------------- -// Function: GetFps -// Sender frame rate -double Spout::GetFps() -{ - return frame.GetSenderFps(); -} - -//--------------------------------------------------------- -// Function: GetFrame -// Sender frame number -long Spout::GetFrame() -{ - return frame.GetSenderFrame(); -} - -//--------------------------------------------------------- -// Function: GetHandle -// Sender share handle -HANDLE Spout::GetHandle() -{ - return m_dxShareHandle; -} - -// -// Group: Receiver -// -// ReceiveTexture and ReceiveImage -// -// - Connect to a sender -// - Set class variables for sender name, width and height -// - If the sender has changed size, set a flag for the application to update receiving -// texture or image which is re-allocated if IsUpdated() returns true. -// - Copy the sender shared texture to the user texture or image. -// - -//--------------------------------------------------------- -// Function: SetReceiverName -// Specify sender for connection -// -// The application will not connect to any other unless the user selects one -// If that sender closes, the application will wait for the nominated sender to open -// If no name is specified, the receiver will connect to the active sender -void Spout::SetReceiverName(const char * SenderName) -{ - if (SenderName && SenderName[0]) { - strcpy_s(m_SenderNameSetup, 256, SenderName); - strcpy_s(m_SenderName, 256, SenderName); - } -} - -//--------------------------------------------------------- -// Function: ReleaseReceiver -// Close receiver and release resources ready to connect to another sender -void Spout::ReleaseReceiver() -{ - if (!m_bInitialized) - return; - - // Restore the starting sender name if the user specified one in SetReceiverName - if (m_SenderNameSetup[0]) { - strcpy_s(m_SenderName, 256, m_SenderNameSetup); - } - else { - m_SenderName[0] = 0; - } - - // Wait 4 frames in case the same sender opens again - Sleep(67); - - // Close the named access mutex and frame counting semaphore. - frame.CloseAccessMutex(); - frame.CleanupFrameCount(); - - // Zero width and height so that they are reset when a sender is found - m_Width = 0; - m_Height = 0; - - // Reset the received sender texture - if (m_pSharedTexture) - m_pSharedTexture->Release(); - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - - // Reset receiver detected share mode - m_bSenderCPUmode = false; - - // Release staging textures if they have been used - if (m_pStaging[0]) spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), m_pStaging[0]); - if (m_pStaging[1]) spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), m_pStaging[1]); - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - - m_bConnected = false; - m_bInitialized = false; - -} - -//--------------------------------------------------------- -// Function: ReceiveTexture -// Connect to a sender and retrieve shared texture details -// -// The texture can then be accessed using : -// -// - BindSharedTexture(); -// - UnBindSharedTexture(); -// - GetSharedTextureID(); -bool Spout::ReceiveTexture() -{ - return ReceiveTexture(0, 0); -} - -//--------------------------------------------------------- -// Function: ReceiveTexture -// Copy the sender shared texture -// -// The receiving texture can only be RGBA of dimension (width * height) -// and must be re-allocated if IsUpdated() returns true -// -bool Spout::ReceiveTexture(GLuint TextureID, GLuint TextureTarget, bool bInvert, GLuint HostFbo) -{ - // Return if flagged for update - // The update flag is reset when the receiving application calls IsUpdated() - if (m_bUpdated) { - return true; - } - - // Make sure OpenGL and DirectX are initialized - if (!OpenSpout()) { - return false; - } - - // Try to receive texture details from a sender - if (ReceiveSenderData()) { - - // Found a sender - // The sender name, width, height, format, shared texture handle - // and shared texture pointer have been retrieved - // Let the application know - m_bConnected = true; - - if (m_bUpdated) { - // If the sender is new or changed, reset shared textures and - // return to update the receiving texture. - // The application detects the change with IsUpdated(). - if (m_bUseGLDX) { - // CreateInterop set "true" for receiver - if (!CreateInterop(m_Width, m_Height, m_dwFormat, true)) { - return false; - } - } - } - - // Was the sender's shared texture handle null ? - if (!m_dxShareHandle) { - // Possible existence of sender memory share map - ReadMemory(m_SenderName, TextureID, TextureTarget, m_Width, m_Height, bInvert, HostFbo); - } - else if (m_bUseGLDX) { - // Texture share compatible - // 3840x2160 60 fps - 0.45 msec/frame - ReadGLDXtexture(TextureID, TextureTarget, m_Width, m_Height, bInvert, HostFbo); - } - else if (m_bAuto) { - // Auto share enabled for DirectX CPU backup - // 3840x2160 33 fps - 5-7 msec/frame - ReadDX11texture(TextureID, TextureTarget, m_Width, m_Height, bInvert, HostFbo); - } - } // endif sender exists - else { - // ReceiveSenderData fails if there is no sender or the connected sender closed. - ReleaseReceiver(); - // Let the application know. - m_bConnected = false; - } - - return m_bConnected; -} - -//--------------------------------------------------------- -// Function: ReceiveImage -// Copy the sender texture to image pixels. -// -// The receiving image can be RGBA, RGB or BGR of dimension (width * height) -// and must be re-allocated if IsUpdated() returns true -bool Spout::ReceiveImage(char* Sendername, unsigned int &width, unsigned int &height, - unsigned char* pixels, GLenum glFormat, bool bInvert, GLuint HostFBO) -{ - if (ReceiveImage(pixels, glFormat, bInvert, HostFBO)) { - strcpy_s(Sendername, 256, m_SenderName); - width = m_Width; - height = m_Height; - return true; - } - return false; -} - -//--------------------------------------------------------- -// Function: IsUpdated -// Query whether the sender has changed. -// -// Must be checked at every cycle before receiving data. -// -// If this is not done, the receiving functions fail. -bool Spout::IsUpdated() -{ - bool bRet = m_bUpdated; - m_bUpdated = false; // Reset the update flag - return bRet; -} - -//--------------------------------------------------------- -// Function: IsConnected -// Query sender connection. -// -// If the sender closes, receiving functions return false, -// but connection can be tested at any time. -bool Spout::IsConnected() -{ - return m_bConnected; -} - -//--------------------------------------------------------- -// Function: IsFrameNew -// Query received frame status -// -// The receiving texture or pixel buffer is refreshed if the sender has produced a new frame -// This can be queried to process texture data only for new frames -bool Spout::IsFrameNew() -{ - return m_bNewFrame; -} - -//--------------------------------------------------------- -// Function: GetSenderFormat -// Get sender DirectX texture format -DWORD Spout::GetSenderFormat() -{ - return m_dwFormat; -} - -//--------------------------------------------------------- -// Function: GetSenderName -// Get sender name -const char * Spout::GetSenderName() -{ - return m_SenderName; -} - -//--------------------------------------------------------- -// Function: GetSenderWidth -// Get sender width -unsigned int Spout::GetSenderWidth() -{ - return m_Width; -} - -//--------------------------------------------------------- -// Function: GetSenderHeight -// Get sender height -unsigned int Spout::GetSenderHeight() -{ - return m_Height; - -} - -//--------------------------------------------------------- -// Function: GetSenderFps -// Get sender frame rate -double Spout::GetSenderFps() -{ - return frame.GetSenderFps(); -} - -//--------------------------------------------------------- -// Function: GetSenderFrame -// Get sender frame number -long Spout::GetSenderFrame() -{ - return frame.GetSenderFrame(); -} - -//--------------------------------------------------------- -// Function: GetSenderHandle -// Received sender share handle -HANDLE Spout::GetSenderHandle() -{ - return m_dxShareHandle; -} - -//--------------------------------------------------------- -// Function: GetSenderCPUmode -// Received sender sharing mode -bool Spout::GetSenderCPUmode() -{ - return m_bSenderCPUmode; -} - -//--------------------------------------------------------- -// Function: SelectSender -// Open sender selection dialog -void Spout::SelectSender() -{ - SelectSenderPanel(); -} - -// -// Group: Frame counting -// - -//--------------------------------------------------------- -// Function: SetFrameCount -// Enable or disable frame counting globally -void Spout::SetFrameCount(bool bEnable) -{ - frame.SetFrameCount(bEnable); -} - -// Function: DisableFrameCount -// Disable frame counting specifically for this application -void Spout::DisableFrameCount() -{ - frame.DisableFrameCount(); -} - -//--------------------------------------------------------- -// Function: IsFrameCountEnabled -// Return frame count status -bool Spout::IsFrameCountEnabled() -{ - return frame.IsFrameCountEnabled(); -} - -//--------------------------------------------------------- -// Function: HoldFps -// Frame rate control -void Spout::HoldFps(int fps) -{ - frame.HoldFps(fps); -} - -// -// Group: Sender names -// - -//--------------------------------------------------------- -// Function: GetSenderCount -// Number of senders -int Spout::GetSenderCount() -{ - std::set SenderNameSet; - if (sendernames.GetSenderNames(&SenderNameSet)) { - return((int)SenderNameSet.size()); - } - return 0; -} - -//--------------------------------------------------------- -// Function: GetSender -// Sender item name in the sender names set -bool Spout::GetSender(int index, char* sendername, int sendernameMaxSize) -{ - std::set SenderNameSet; - std::set::iterator iter; - std::string namestring; - char name[256]; - int i; - - if (sendernames.GetSenderNames(&SenderNameSet)) { - if (SenderNameSet.size() < (unsigned int)index) { - return false; - } - i = 0; - for (iter = SenderNameSet.begin(); iter != SenderNameSet.end(); iter++) { - namestring = *iter; // the name string - strcpy_s(name, 256, namestring.c_str()); // the 256 byte name char array - if (i == index) { - strcpy_s(sendername, sendernameMaxSize, name); // the passed name char array - break; - } - i++; - } - return true; - } - return false; -} - -//--------------------------------------------------------- -// Function: GetSenderInfo -// Sender information -bool Spout::GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat) -{ - return sendernames.GetSenderInfo(sendername, width, height, dxShareHandle, dwFormat); -} - -//--------------------------------------------------------- -// Function: GetActiveSender -// Current active sender -bool Spout::GetActiveSender(char* Sendername) -{ - return sendernames.GetActiveSender(Sendername); -} - -//--------------------------------------------------------- -// Function: SetActiveSender -// Set sender as active -bool Spout::SetActiveSender(const char* Sendername) -{ - return sendernames.SetActiveSender(Sendername); -} - -// -// Group: Graphics adapter -// -// Note that both the Sender and Receiver must use the same graphics adapter. -// - -//--------------------------------------------------------- -// Function: GetNumAdapters -// The number of graphics adapters in the system -int Spout::GetNumAdapters() -{ - return spoutdx.GetNumAdapters(); -} - -//--------------------------------------------------------- -// Function: GetAdapterName -// Get adapter item name -bool Spout::GetAdapterName(int index, char *adaptername, int maxchars) -{ - char name[256]; - if (spoutdx.GetAdapterName(index, name, 256)) { - strcpy_s(adaptername, maxchars, name); - return true; - } - return false; -} - -//--------------------------------------------------------- -// Function: GetAdapter -// Get adapter index -int Spout::GetAdapter() -{ - return spoutdx.GetAdapter(); -} - -//--------------------------------------------------------- -// Function: SetAdapter -// Set graphics adapter for output -bool Spout::SetAdapter(int index) -{ - // Return if already set - if (index == m_AdapterIndex) - return true; - - // Set the adapter as requested - if (!spoutdx.SetAdapter(index)) { - SpoutLogError("Spout::SetAdapter(%d) failed", index); - return false; - } - - // SetAdapter has tested DirectX, but the adapter is different - // so check again for GL/DX compatibility - if (!GLDXready()) { - SpoutLogWarning("Spout::SetAdapter - Graphics not GL/DX compatible. Switching to CPU share mode"); - m_bUseGLDX = false; - } - - // Update current adapter index and name - m_AdapterIndex = spoutdx.GetAdapter(); - GetAdapterName(m_AdapterIndex, m_AdapterName, 256); - - return true; -} - -//--------------------------------------------------------- -// Function: GetAdapterInfo -// Get the current adapter description -bool Spout::GetAdapterInfo(char *renderdescription, char *displaydescription, int maxchars) -{ - return spoutdx.GetAdapterInfo(renderdescription, displaydescription, maxchars); -} - -//--------------------------------------------------------- -// Function: Adapter -// Current adapter -int Spout::Adapter() -{ - return m_AdapterIndex; -} - -//--------------------------------------------------------- -// Function: AdapterName -// Current adapter name -char * Spout::AdapterName() -{ - return m_AdapterName; -} - -// -// Group: 2.006 compatibility -// -// These functions are not necessary for Version 2.007. -// But are retained for compatibility with existing 2.006 code. -// - -//--------------------------------------------------------- -// Function: FindNVIDIA -// Find the index of the NVIDIA adapter in a multi-adapter system -bool Spout::FindNVIDIA(int &nAdapter) -{ - return spoutdx.FindNVIDIA(nAdapter); -} - -//--------------------------------------------------------- -// Function: GetAdapterInfo -// Get detailed information for the current graphics adapter -// -// Must be called after DirectX initialization, not before -// -// https://code.google.com/p/chromium/issues/detail?id=106438 -// -// NOTES : On a “normal†system EnumDisplayDevices and IDXGIAdapter::GetDesc always concur -// i.e. the device that owns the head will be the device that performs the rendering. -// On an Optimus system IDXGIAdapter::GetDesc will return whichever device has been selected for rendering. -// So on an Optimus system it is possible that IDXGIAdapter::GetDesc will return the dGPU whereas -// EnumDisplayDevices will return the iGPU. -// -// This function compares the adapter descriptions of the two -// The string "Intel" reveals that it is an Intel device but -// the Vendor ID could also be used -// -// 0x10DE NVIDIA -// 0x163C intel -// 0x8086 Intel -// 0x8087 Intel -// -// See also the DirectX only version : -// bool spoutDirectX::GetAdapterInfo(char *adapter, char *display, int maxchars) -// -bool Spout::GetAdapterInfo(char* renderadapter, - char* renderdescription, char* renderversion, - char* displaydescription, char* displayversion, - int maxsize, bool &bDX9) -{ - // DirectX9 not supported - UNREFERENCED_PARAMETER(bDX9); - - IDXGIDevice * pDXGIDevice = nullptr; - - renderadapter[0] = 0; // DirectX adapter - renderdescription[0] = 0; - renderversion[0] = 0; - displaydescription[0] = 0; - displayversion[0] = 0; - if (!spoutdx.GetDX11Device()) { - SpoutLogError("spoutGLDXinterop::GetAdapterInfo - no DX11 device"); - return false; - } - - spoutdx.GetDX11Device()->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice); - IDXGIAdapter * pDXGIAdapter; - pDXGIDevice->GetAdapter(&pDXGIAdapter); - DXGI_ADAPTER_DESC adapterinfo; - pDXGIAdapter->GetDesc(&adapterinfo); - // WCHAR Description[ 128 ]; - // UINT VendorId; - // UINT DeviceId; - // UINT SubSysId; - // UINT Revision; - // SIZE_T DedicatedVideoMemory; - // SIZE_T DedicatedSystemMemory; - // SIZE_T SharedSystemMemory; - // LUID AdapterLuid; - char output[256]; - size_t charsConverted = 0; - wcstombs_s(&charsConverted, output, 129, adapterinfo.Description, 128); - // printf(" Description = [%s]\n", output); - // printf(" VendorId = [%d] [%x]\n", adapterinfo.VendorId, adapterinfo.VendorId); - // printf("SubSysId = [%d] [%x]\n", adapterinfo.SubSysId, adapterinfo.SubSysId); - // printf("DeviceId = [%d] [%x]\n", adapterinfo.DeviceId, adapterinfo.DeviceId); - // printf("Revision = [%d] [%x]\n", adapterinfo.Revision, adapterinfo.Revision); - strcpy_s(renderadapter, (rsize_t)maxsize, output); - - if (!renderadapter[0]) - return false; - - // TODO - check default Windows render adapter is the DirectX one ? - strcpy_s(renderdescription, (rsize_t)maxsize, renderadapter); - - // Use Windows functions to look for Intel graphics to see if it is - // the same render adapter that was detected with DirectX - char driverdescription[256]; - char driverversion[256]; - char regkey[256]; - - // Additional info - DISPLAY_DEVICE DisplayDevice; - DisplayDevice.cb = sizeof(DISPLAY_DEVICE); - - // 31.10.14 detect the adapter attached to the desktop - // To query all display devices in the current session, - // call this function in a loop, starting with iDevNum set to 0, - // and incrementing iDevNum until the function fails. - // To select all display devices in the desktop, use only the display devices - // that have the DISPLAY_DEVICE_ATTACHED_TO_DESKTOP flag in the DISPLAY_DEVICE structure. - - int nDevices = 0; - for (int i = 0; i < 10; i++) { // should be much less than 10 adapters - if (EnumDisplayDevices(NULL, (DWORD)i, &DisplayDevice, 0)) { - // This will list all the devices - nDevices++; - // Get the registry key - wcstombs_s(&charsConverted, regkey, 129, (const wchar_t *)DisplayDevice.DeviceKey, 128); - // This is the registry key with all the information about the adapter - OpenDeviceKey(regkey, 256, driverdescription, driverversion); - // Is it a render adapter ? - if (renderadapter && strcmp(driverdescription, renderadapter) == 0) { - // printf("Windows render adapter matches : [%s] Vers [%s]\n", driverdescription, driverversion); - strcpy_s(renderdescription, (rsize_t)maxsize, driverdescription); - strcpy_s(renderversion, (rsize_t)maxsize, driverversion); - } - // Is it a display adapter - if (DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) { - // printf("Display adapter : [%s] Vers: %s ", driverdescription, driverversion); - strcpy_s(displaydescription, 256, driverdescription); - strcpy_s(displayversion, 256, driverversion); - // printf("(Attached to desktop)\n"); - } // endif attached to desktop - - } // endif EnumDisplayDevices - } // end search loop - - // The render adapter description - if (renderdescription) trim(renderdescription); - - // 16-06-18 - if (pDXGIDevice) pDXGIDevice->Release(); - - return true; -} - -//--------------------------------------------------------- -// Function: CreateSender -// Create a sender -bool Spout::CreateSender(const char* name, unsigned int width, unsigned int height, DWORD dwFormat) -{ - // Pass on to CheckSender - SetSenderName(name); - if (dwFormat > 0) - m_dwFormat = dwFormat; - return CheckSender(width, height); - -} - -//--------------------------------------------------------- -// Function: UpdateSender -// Update a sender -bool Spout::UpdateSender(const char* name, unsigned int width, unsigned int height) -{ - // No update unless already created - if (!IsInitialized()) { - return false; - } - - // For a name change, close the sender and set up again - if (strcmp(name, m_SenderName) != 0) - ReleaseSender(); - - // CheckSender sets m_Width and m_Height on success - return CheckSender(width, height); -} - -// Legacy OpenGL DrawTo function -#ifdef legacyOpenGL -//--------------------------------------------------------- -// Function: DrawToSharedTexture -// Render OpenGL texture to the sender shared OpenGL texture -// -// Legacy OpenGL function -// -// Enabled for build with "legacyOpenGL" defined in SpoutCommon.h -bool Spout::DrawToSharedTexture(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, - float max_x, float max_y, float aspect, - bool bInvert, GLuint HostFBO) -{ - GLenum status; - bool bRet = false; - - if (!m_hInteropDevice || !m_hInteropObject) - return false; - - if (width != (unsigned int)m_Width || height != (unsigned int)m_Height) - return false; - - // Wait for access to the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - if (LockInteropObject(m_hInteropDevice, &m_hInteropObject) == S_OK) { - // Draw the input texture into the shared texture via an fbo - // Bind our fbo and attach the shared texture to it - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - glClearColor(0.f, 0.f, 0.f, 1.f); - glClear(GL_COLOR_BUFFER_BIT); - glFramebufferTexture2DEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_glTexture, 0); - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { - glColor4f(1.f, 1.f, 1.f, 1.f); - glEnable(TextureTarget); - glBindTexture(TextureTarget, TextureID); - GLfloat tc[4][2] = { 0 }; - // Invert texture coord to user requirements - if (bInvert) { - tc[0][0] = 0.0; tc[0][1] = max_y; - tc[1][0] = 0.0; tc[1][1] = 0.0; - tc[2][0] = max_x; tc[2][1] = 0.0; - tc[3][0] = max_x; tc[3][1] = max_y; - } - else { - tc[0][0] = 0.0; tc[0][1] = 0.0; - tc[1][0] = 0.0; tc[1][1] = max_y; - tc[2][0] = max_x; tc[2][1] = max_y; - tc[3][0] = max_x; tc[3][1] = 0.0; - } - GLfloat verts[] = { - -aspect, -1.0, // bottom left - -aspect, 1.0, // top left - aspect, 1.0, // top right - aspect, -1.0 }; // bottom right - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(2, GL_FLOAT, 0, tc); - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(2, GL_FLOAT, 0, verts); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glBindTexture(TextureTarget, 0); - glDisable(TextureTarget); - bRet = true; // success - } - else { - PrintFBOstatus(status); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); - } - // restore the previous fbo - default is 0 - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); - } // end interop lock - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - } // mutex access failed - - return bRet; - -} // end DrawToSharedTexture -#endif - -//--------------------------------------------------------- -// Function: CreateReceiver -// Create receiver connection -bool Spout::CreateReceiver(char* sendername, unsigned int &width, unsigned int &height, bool bUseActive) -{ - // Make sure OpenGL and DirectX are initialized - if (!OpenSpout()) - return false; - - // Use the active sender if the user wants it or the sender name is not set - if (bUseActive || sendername[0] == 0) { - m_SenderNameSetup[0] = 0; - } - else { - // Try to find the sender with the name sent - strcpy_s(m_SenderNameSetup, 256, sendername); - } - - if (ReceiveSenderData()) { - // The sender name, width, height, format, shared texture handle - // and shared texture pointer have been retrieved. - if (m_bUpdated) { - // If the sender is new or changed, create or re-create interop - if (m_bUseGLDX) { - // Flag "true" for receive - if (!CreateInterop(m_Width, m_Height, m_dwFormat, true)) - return false; - } - // 2.006 receivers check for changed sender size - m_bUpdated = false; - } - strcpy_s(sendername, 256, m_SenderName); - width = m_Width; - height = m_Height; - - return true; - } - - return false; - -} - -//--------------------------------------------------------- -// Function: CheckReceiver -// Check receiver connection -bool Spout::CheckReceiver(char* name, unsigned int &width, unsigned int &height, bool &bConnected) -{ - if (ReceiveSenderData()) { - strcpy_s(name, 256, m_SenderName); - width = m_Width; - height = m_Height; - bConnected = m_bConnected; - return true; - } - return false; -} - -//--------------------------------------------------------- -// Function: ReceiveTexture -// Receive OpenGL texture -bool Spout::ReceiveTexture(char* name, unsigned int &width, unsigned int &height, - GLuint TextureID, GLuint TextureTarget, bool bInvert, GLuint HostFBO) -{ - if (ReceiveTexture(TextureID, TextureTarget, bInvert, HostFBO)) { - - // 2.006 receivers have to restart for a new sender name - if (m_SenderName[0] && strcmp(m_SenderName, name) != 0) { - return false; - } - - strcpy_s(name, 256, m_SenderName); - width = m_Width; - height = m_Height; - return true; - } - - return false; - -} - -//--------------------------------------------------------- -// Function: ReceiveImage -// Receive image pixels -bool Spout::ReceiveImage(unsigned char *pixels, GLenum glFormat, bool bInvert, GLuint HostFbo) -{ - // Return if flagged for update - // The update flag is reset when the receiving application calls IsUpdated() - if (m_bUpdated) { - return true; - } - - // Make sure OpenGL and DirectX are initialized - if (!OpenSpout()) - return false; - - // Only RGBA, BGRA, RGB, BGR supported - if (!(glFormat == GL_RGBA || glFormat == GL_BGRA_EXT || glFormat == GL_RGB || glFormat == GL_BGR_EXT)) - return false; - - // Check for BGRA support - GLenum glformat = glFormat; - if (!m_bBGRAavailable) { - // If the bgra extensions are not available and the user - // provided GL_BGR_EXT or GL_BGRA_EXT do not use them - if (glFormat == GL_BGR_EXT) glformat = GL_RGB; // GL_BGR_EXT - if (glFormat == GL_BGRA_EXT) glformat = GL_RGBA; // GL_BGRA_EXT - } - - // Try to receive texture details from a sender - if (ReceiveSenderData()) { - - // The sender name, width, height, format, shared texture handle and pointer have been retrieved. - if (m_bUpdated) { - - // If the sender is new or changed, return to update the receiving texture. - // The application detects the change with IsUpdated(). - if (m_bUseGLDX) { - // Flag "true" for receive - if (!CreateInterop(m_Width, m_Height, m_dwFormat, true)) - return false; - } - - return true; - } - - // The receiving pixel buffer is created after the first update - // So check here instead of at the beginning - if (!pixels) - return false; - - // - // Found a sender - // - // Read the shared texture into the pixel buffer - // Copy functions handle the formats supported - // - - // Was the sender's shared texture handle null ? - if (!m_dxShareHandle) { - // Possible existence of sender memory share map - ReadMemoryPixels(m_SenderName, pixels, m_Width, m_Height, glFormat, bInvert); - } - else if (m_bUseGLDX && m_bPBOavailable) { - // Texture share compatible - // Read pixels using OpenGL via PBO - // PBO (UnloadTexturePixels) - // 1920x1080 RGB 1.4 msec/frame RGBA 1.6 msec/frame - // 3840x2160 RGB 5 msec/frame RGBA 6 msec/frame - // FBO (ReadTextureData) - slower than DirectX method - // 3840x2160 RGB 30-60 msec/frame RGBA 30-60 msec/frame - ReadGLDXpixels(pixels, m_Width, m_Height, glformat, bInvert, HostFbo); - } - else if (m_bAuto) { - // Auto share enabled for DirectX CPU backup - // Read pixels via DX11 staging textures to an rgba or rgb buffer - // 1920x1080 RGB 7 msec/frame RGBA 2 msec/frame - // 3840x2160 RGB 30 msec/frame RGBA 9 msec/frame - ReadDX11pixels(pixels, m_Width, m_Height, glformat, bInvert); - } - m_bConnected = true; - } // sender exists - else { - // There is no sender or the connected sender closed. - ReleaseReceiver(); - // Let the application know. - m_bConnected = false; - } - - // ReceiveImage fails if there is no sender or the connected sender closed. - return m_bConnected; - -} // end ReceiveImage - -//--------------------------------------------------------- -// Function: SelectSenderPanel -// Open dialog for the user to select a sender -// -// Optional message argument -// -// Replaced by SelectSender for 2.007 -bool Spout::SelectSenderPanel(const char *message) -{ - HANDLE hMutex1 = NULL; - HMODULE module = NULL; - char path[MAX_PATH], drive[MAX_PATH], dir[MAX_PATH], fname[MAX_PATH]; - char UserMessage[512]; - - if (message != NULL && message[0] != 0) - strcpy_s(UserMessage, 512, message); // could be an arg or a user message - else - UserMessage[0] = 0; // make sure SpoutPanel does not see an un-initialized string - - // The selected sender is then the "Active" sender and this receiver switches to it. - // If Spout is not installed, SpoutPanel.exe has to be in the same folder - // as this executable. This rather complicated process avoids having to use a dialog - // which causes problems with host GUI messaging. - - // First find if there has been a Spout installation >= 2.002 with an install path for SpoutPanel.exe - if (!ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\SpoutPanel", "InstallPath", path)) { - // Path not registered so find the path of the host program - // where SpoutPanel should have been copied - module = GetModuleHandle(NULL); - GetModuleFileNameA(module, path, MAX_PATH); - _splitpath_s(path, drive, MAX_PATH, dir, MAX_PATH, fname, MAX_PATH, NULL, 0); - _makepath_s(path, MAX_PATH, drive, dir, "SpoutPanel", ".exe"); - // Does SpoutPanel.exe exist in this path ? - if (!PathFileExistsA(path)) { - // Try the current working directory - if (_getcwd(path, MAX_PATH)) { - strcat_s(path, MAX_PATH, "\\SpoutPanel.exe"); - // Does SpoutPanel exist here? - if (!PathFileExistsA(path)) { - SpoutLogWarning("spoutDX::SelectSender - SpoutPanel path not found"); - return false; - } - } - } - } - - // Check whether the panel is already running - // Try to open the application mutex. - hMutex1 = OpenMutexA(MUTEX_ALL_ACCESS, 0, "SpoutPanel"); - if (!hMutex1) { - // No mutex, so not running, so can open it - // Use ShellExecuteEx so we can test its return value later - ZeroMemory(&m_ShExecInfo, sizeof(m_ShExecInfo)); - m_ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); - m_ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; - m_ShExecInfo.hwnd = NULL; - m_ShExecInfo.lpVerb = NULL; - m_ShExecInfo.lpFile = (LPCSTR)path; - m_ShExecInfo.lpParameters = UserMessage; - m_ShExecInfo.lpDirectory = NULL; - m_ShExecInfo.nShow = SW_SHOW; - m_ShExecInfo.hInstApp = NULL; - ShellExecuteExA(&m_ShExecInfo); - - // - // The flag "m_bSpoutPanelOpened" is set here to indicate that the user - // has opened the panel to select a sender. This flag is local to - // this process so will not affect any other receiver instance - // Then when the selection panel closes, sender name is tested - // - m_bSpoutPanelOpened = true; - } - else { - // The mutex exists, so another instance is already running. - // Find the SpoutPanel window and bring it to the top. - // SpoutPanel is opened as topmost anyway but pop it to - // the front in case anything else has stolen topmost. - HWND hWnd = FindWindowA(NULL, (LPCSTR)"SpoutPanel"); - if (hWnd && IsWindow(hWnd)) { - SetForegroundWindow(hWnd); - // prevent other windows from hiding the dialog - // and open the window wherever the user clicked - SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); - } - else if (path[0]) { - // If the window was not found but the mutex exists - // and SpoutPanel is installed, it has crashed. - // Terminate the process and the mutex or the mutex will remain - // and SpoutPanel will not be started again. - PROCESSENTRY32 pEntry; - pEntry.dwSize = sizeof(pEntry); - bool done = false; - // Take a snapshot of all processes and threads in the system - HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); - if (hProcessSnap == INVALID_HANDLE_VALUE) { - SpoutLogError("spoutDX::OpenSpoutPanel - CreateToolhelp32Snapshot error"); - } - else { - // Retrieve information about the first process - BOOL hRes = Process32First(hProcessSnap, &pEntry); - if (!hRes) { - SpoutLogError("spoutDX::OpenSpoutPanel - Process32First error"); - CloseHandle(hProcessSnap); - } - else { - // Look through all processes - while (hRes && !done) { - int value = _tcsicmp(pEntry.szExeFile, _T("SpoutPanel.exe")); - if (value == 0) { - HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, (DWORD)pEntry.th32ProcessID); - if (hProcess != NULL) { - // Terminate SpoutPanel and it's mutex - TerminateProcess(hProcess, 9); - CloseHandle(hProcess); - done = true; - } - } - if (!done) - hRes = Process32Next(hProcessSnap, &pEntry); // Get the next process - else - hRes = NULL; // found SpoutPanel - } - CloseHandle(hProcessSnap); - } - } - // Now SpoutPanel will start the next time the user activates it - } // endif SpoutPanel crashed - } // endif SpoutPanel already open - - // If we opened the mutex, close it now or it is never released - if (hMutex1) CloseHandle(hMutex1); - - return true; - -} // end SelectSenderPanel - - -// Legacy OpenGL Draw function -#ifdef legacyOpenGL -//--------------------------------------------------------- -// Function: DrawSharedTexture -// Render the sender shared OpenGL texture -// -// Legacy OpenGL function -// -// Enabled for build with "legacyOpenGL" defined in SpoutCommon.h -//--------------------------------------------------------- -bool Spout::DrawSharedTexture(float max_x, float max_y, float aspect, bool bInvert, GLuint HostFBO) -{ - UNREFERENCED_PARAMETER(HostFBO); - if (!m_hInteropDevice || !m_hInteropObject) - return false; - - bool bRet = false; - - // Wait for access to the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // go ahead and access the shared texture to draw it - if (LockInteropObject(m_hInteropDevice, &m_hInteropObject) == S_OK) { - SaveOpenGLstate(m_Width, m_Height); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, m_glTexture); // bind shared texture - glColor4f(1.f, 1.f, 1.f, 1.f); - // Tried to convert to vertex array, but Processing crash - glBegin(GL_QUADS); - if (bInvert) { - glTexCoord2f(0.0, max_y); glVertex2f(-aspect, -1.0); // lower left - glTexCoord2f(0.0, 0.0); glVertex2f(-aspect, 1.0); // upper left - glTexCoord2f(max_x, 0.0); glVertex2f(aspect, 1.0); // upper right - glTexCoord2f(max_x, max_y); glVertex2f(aspect, -1.0); // lower right - } - else { - glTexCoord2f(0.0, 0.0); glVertex2f(-aspect, -1.0); // lower left - glTexCoord2f(0.0, max_y); glVertex2f(-aspect, 1.0); // upper left - glTexCoord2f(max_x, max_y); glVertex2f(aspect, 1.0); // upper right - glTexCoord2f(max_x, 0.0); glVertex2f(aspect, -1.0); // lower right - } - glEnd(); - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); - RestoreOpenGLstate(); - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); // unlock dx object - bRet = true; - } // lock failed - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - } // mutex lock failed - - return bRet; - -} // end DrawSharedTexture -#endif - -// -// Protected functions -// - -//--------------------------------------------------------- -// If a sender has not been created yet -// o Make sure Spout has been initialized and OpenGL context is available -// o Perform a compatibility check for GL/DX interop -// o If compatible, create interop for GL/DX transfer -// o If not compatible, create a shared texture for the sender -// o Create a sender using the DX11 shared texture handle -// If the sender exists, test for size change -// o If compatible, update the shared textures and GL/DX interop -// o If not compatible, re-create the class shared texture to the new size -// o Update the sender and class variables -bool Spout::CheckSender(unsigned int width, unsigned int height) -{ - if (width == 0 || height == 0) { - return false; - } - - // The sender needs a name - // Default is the executable name - if (!m_SenderName[0]) { - SetSenderName(); - } - - // If not initialized, create a new sender - if (!m_bInitialized) { - // Make sure that Spout has been initialized and an OpenGL context is available - if (OpenSpout()) { - if (m_bUseGLDX) { - // Create interop for GL/DX transfer - // Flag "false" for sender so that a new shared texture is created - // (for a receiver the shared texture is cretaed from the sender share handle) - if (!CreateInterop(width, height, m_dwFormat, false)) - return false; - } - else { - // Create a shared texture for the sender within this class. - // A sender creates a new texture with a new share handle - m_dxShareHandle = nullptr; - if (!spoutdx.CreateSharedDX11Texture(spoutdx.GetDX11Device(), - width, height, (DXGI_FORMAT)m_dwFormat, &m_pSharedTexture, m_dxShareHandle)) { - return false; - } - } - - // Create a sender using the DX11 shared texture handle (m_dxShareHandle) - if (sendernames.CreateSender(m_SenderName, width, height, m_dxShareHandle, m_dwFormat)) { - - m_Width = width; - m_Height = height; - - // TODO : not optimal - - // SetSenderCPUmode reads and writes to the sender shared texture memory. - // TODO : do when the sender is created and before this is called using a global. - // spoutSenderNames::CreateSender(m_SenderName, width, height, m_dxSharehandle, m_dwFormat, m_bCPU); - // Need m_bCPU = !m_bUseGLDX ? - - // Set CPU sharing mode (i.e. not GL/DX compatible) - // to the top bit of 32 bit partnerID field in sender shared memory - SetSenderCPUmode(m_SenderName, !m_bUseGLDX); - - // Write host path to the sender shared memory Description field - // (Now done in spoutSenderNames::CreateSender) - // SetHostPath(m_SenderName); - - // Get current adapter index and name - m_AdapterIndex = spoutdx.GetAdapter(); - GetAdapterName(m_AdapterIndex, m_AdapterName, 256); - m_Width = width; - m_Height = height; - - // Create a sender mutex for access to the shared texture - frame.CreateAccessMutex(m_SenderName); - - // Enable frame counting so the receiver gets frame number and fps - frame.EnableFrameCount(m_SenderName); - - m_bInitialized = true; - } - else { - ReleaseSender(); - m_SenderName[0] = 0; - m_Width = 0; - m_Height = 0; - m_dwFormat = m_DX11format; - m_AdapterIndex = 0; - m_AdapterName[0] = 0; - return false; - } - } - } - // The sender is initialized but has the sending texture changed size ? - else if (m_Width != width || m_Height != height) { - // Update the shared textures and interop - if (m_bUseGLDX) { - // Flag "false" for sender to create a new shared texture - if (!CreateInterop(width, height, m_dwFormat, false)) - return false; - } - else { - // Re-create the class shared texture to the new size - if (m_pSharedTexture) m_pSharedTexture->Release(); - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - if (!spoutdx.CreateSharedDX11Texture(spoutdx.GetDX11Device(), - width, height, (DXGI_FORMAT)m_dwFormat, &m_pSharedTexture, m_dxShareHandle)) { - return false; - } - } - // Update the sender with the new texture and size - sendernames.UpdateSender(m_SenderName, width, height, m_dxShareHandle, m_dwFormat); - m_Width = width; - m_Height = height; - } - else { - - } - // endif initialization or size checks - - return true; -} - -//--------------------------------------------------------- -void Spout::InitReceiver(const char * SenderName, unsigned int width, unsigned int height, DWORD dwFormat) -{ - SpoutLogNotice("Spout::InitReceiver(%s, %d x %d)", SenderName, width, height); - - // Create a named sender mutex for access to the sender's shared texture - frame.CreateAccessMutex(SenderName); - - // Enable frame counting to get the sender frame number and fps - frame.EnableFrameCount(SenderName); - - // Set class globals - strcpy_s(m_SenderName, 256, SenderName); - m_Width = width; - m_Height = height; - m_dwFormat = dwFormat; - - // Get graphics adapter number, index and name - m_AdapterNumber = GetNumAdapters(); - m_AdapterIndex = spoutdx.GetAdapter(); - GetAdapterName(m_AdapterIndex, m_AdapterName, 256); - - // printf("Spout::CreateReceiver(%s, %d x %d) - format = %d\n", SenderName, width, height, m_dwFormat); - - m_bInitialized = true; - -} - -//--------------------------------------------------------- -// o Connect to a sender and inform the application to update texture dimensions -// o Check for user sender selection -// o Receive texture details from the sender for write to the user texture -// o Retrieve width, height, format, share handle and texture pointer -bool Spout::ReceiveSenderData() -{ - m_bUpdated = false; - - // Initialization is recorded in this class for sender or receiver - // m_Width or m_Height are established when the receiver connects to a sender - char sendername[256]; - strcpy_s(sendername, 256, m_SenderName); - - // Check the entered Sender name to see if it exists - if (sendername[0] == 0) { - // Passed name was null, so find the active sender - if (!GetActiveSender(sendername)) - return false; // No sender - } - - // If SpoutPanel has been opened, the active sender name could be different - if (CheckSpoutPanel(sendername, 256)) { - // Disable the setup name - m_SenderNameSetup[0] = 0; - } - - // Now we have either an existing sender name or the active sender name - // Save current sender name and dimensions to test for change - unsigned int width = m_Width; - unsigned int height = m_Height; - DWORD dwFormat = m_dwFormat; - HANDLE dxShareHandle = m_dxShareHandle; - - // Try to get the sender information - // Retrieve width, height, sharehandle and format. - SharedTextureInfo info; - if (sendernames.getSharedInfo(sendername, &info)) { - - // Received sender share mode - if (info.partnerId & 0x80000000) // CPU mode - top bit of 32 bit partner ID field - m_bSenderCPUmode = true; - else - m_bSenderCPUmode = false; // Texture share default - - width = info.width; - height = info.height; - dxShareHandle = (HANDLE)(LongToHandle((long)info.shareHandle)); - dwFormat = info.format; - - // printf(" info.width = %d\n", info.width); - // printf(" info.height = %d\n", info.height); - // printf(" info.shareHandle = %d\n", info.shareHandle); - // printf(" info.format = %d\n", info.format); - - // Compatible DX9 formats - // 21 = D3DFMT_A8R8G8B8 - // 22 = D3DFMT_X8R8G8B8 - if (dwFormat == 21 || dwFormat == 21) { - // Create a DX11 receiving texture with compatible format - dwFormat = (DWORD)DXGI_FORMAT_B8G8R8A8_UNORM; - } - - // printf(" Found new sender (%dx%d) : dxShareHandle = 0x%.7X\n", width, height, LOWORD(dxShareHandle)); - - // The shared texture handle will be different - // o for texture size or format change - // o for a new sender - if (dxShareHandle != m_dxShareHandle || strcmp(sendername, m_SenderName) != 0) { - - // Release everything and start again - ReleaseReceiver(); - - // Update the sender share handle - m_dxShareHandle = dxShareHandle; - - // We have a valid share handle - if (m_dxShareHandle) { - // Get a new shared texture pointer (m_pSharedTexture) - if (!spoutdx.OpenDX11shareHandle(spoutdx.GetDX11Device(), &m_pSharedTexture, dxShareHandle)) { - // If this fails, something is wrong - // the sender graphics adapter might be different or some other reason - SpoutLogWarning("Spout::ReceiveSenderData - could not retrieve sender texture from share handle"); - // Retain the share handle so we don't query it again. - // m_pSharedTexture is null but will not be used. - // Return true and wait until another sender is selected. - return true; - } - } - - // Now we have a shared texture pointer or a null share handle. - - // For a null share handle from a 2.006 memoryshare sender - // ReceiveTexture and ReceiveImage will look for the shared memory map - - // Initialize again with the newly connected sender values - InitReceiver(sendername, width, height, dwFormat); - - m_bUpdated = true; // Return to update the receiving texture or image - - } - - // Connected and intialized - // Sender name, width, height, format, texture pointer and share handle have been retrieved - - // The application can now access and copy the sender texture - return true; - - } // end find sender - - // There is no sender or the connected sender closed - return false; - -} - -//--------------------------------------------------------- -// Check whether SpoutPanel opened and return the new sender name -bool Spout::CheckSpoutPanel(char *sendername, int maxchars) -{ - // If SpoutPanel has been activated, test if the user has clicked OK - if (m_bSpoutPanelOpened) { // User has activated spout panel - - SharedTextureInfo TextureInfo; - HANDLE hMutex = NULL; - DWORD dwExitCode; - char newname[256]; - bool bRet = false; - - // Must find the mutex to signify that SpoutPanel has opened - // and then wait for the mutex to close - hMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, "SpoutPanel"); - - // Has it been activated - if (!m_bSpoutPanelActive) { - // If the mutex has been found, set the active flag true and quit - // otherwise on the next round it will test for the mutex closed - if (hMutex) m_bSpoutPanelActive = true; - } - else if (!hMutex) { // It has now closed - m_bSpoutPanelOpened = false; // Don't do this part again - m_bSpoutPanelActive = false; - // call GetExitCodeProcess() with the hProcess member of - // global SHELLEXECUTEINFO to get the exit code from SpoutPanel - if (m_ShExecInfo.hProcess) { - GetExitCodeProcess(m_ShExecInfo.hProcess, &dwExitCode); - // Only act if exit code = 0 (OK) - if (dwExitCode == 0) { - // SpoutPanel has been activated and OK clicked - // Test the active sender which should have been set by SpoutPanel - newname[0] = 0; - if (!sendernames.GetActiveSender(newname)) { - // Otherwise the sender might not be registered. - // SpoutPanel always writes the selected sender name to the registry. - if (ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\SpoutPanel", "Sendername", newname)) { - // Register the sender if it exists - if (newname[0] != 0) { - if (sendernames.getSharedInfo(newname, &TextureInfo)) { - // Register in the list of senders and make it the active sender - sendernames.RegisterSenderName(newname); - sendernames.SetActiveSender(newname); - } - } - } - } - // Now do we have a valid sender name ? - if (newname[0] != 0) { - // Pass back the new name - strcpy_s(sendername, maxchars, newname); - bRet = true; - } // endif valid sender name - } // endif SpoutPanel OK - } // got the exit code - } // endif no mutex so SpoutPanel has closed - // If we opened the mutex, close it now or it is never released - if (hMutex) CloseHandle(hMutex); - return bRet; - } // SpoutPanel has not been opened - - return false; - -} diff --git a/Plugin/Spout/SpoutGL/Spout.h b/Plugin/Spout/SpoutGL/Spout.h deleted file mode 100644 index 208e2d2..0000000 --- a/Plugin/Spout/SpoutGL/Spout.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - - Spout.h - - Documentation - https://spoutgl-site.netlify.app/ - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once - -#ifndef __Spout__ -#define __Spout__ - -#include "SpoutGL.h" - -class SPOUT_DLLEXP Spout : public spoutGL { - - public: - - Spout(); - ~Spout(); - - // - // ===================== SENDER ========================= - // - - // Set name for sender creation - // If no name is specified, the executable name is used. - void SetSenderName(const char* sendername = nullptr); - // Set the sender DX11 shared texture format - void SetSenderFormat(DWORD dwFormat); - // Close sender and free resources - // A sender is created or updated by all sending functions - void ReleaseSender(); - // Send texture attached to fbo. - // The fbo must be currently bound. - // The sending texture can be larger than the size that the sender is set up for. - // For example, if the application is using only a portion of the allocated texture space, - // such as for Freeframe plugins. (The 2.006 equivalent is DrawToSharedTexture). - bool SendFbo(GLuint FboID, unsigned int width, unsigned int height, bool bInvert = true); - // Send OpenGL texture - bool SendTexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert = true, GLuint HostFBO = 0); - // Send image pixels - bool SendImage(const unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFBO = 0); - // Sender status - bool IsInitialized(); - // Sender name - const char * GetName(); - // Sender width - unsigned int GetWidth(); - // Sender height - unsigned int GetHeight(); - // Sender frame rate - double GetFps(); - // Sender frame number - long GetFrame(); - // Sender share handle - HANDLE GetHandle(); - - // - // ====================== RECEIVER =========================== - // - - // Specify sender for connection - // The application will not connect to any other unless the user selects one - // If that sender closes, the application will wait for the nominated sender to open - // If no name is specified, the receiver will connect to the active sender - void SetReceiverName(const char * sendername); - // Close receiver and release resources ready to connect to another sender - void ReleaseReceiver(); - // Receive shared texture - // Connect to a sender and retrieve texture details ready for access - // (see BindSharedTexture and UnBindSharedTexture) - bool ReceiveTexture(); - // Receive OpenGL texture - // Connect to a sender and inform the application to update - // the receiving texture if it has changed dimensions - // For no change, copy the sender shared texture to the application texture. - // The texture must be RGBA of dimension (width * height) - bool ReceiveTexture(GLuint TextureID, GLuint TextureTarget, bool bInvert = false, GLuint HostFbo = 0); - // Receive image pixels - // Connect to a sender and inform the application to update - // the receiving buffer if it has changed dimensions - // For no change, copy the sender shared texture to the pixel buffer - // The receiving image can be RGBA, BGRA, RGB or BGR formats of dimension (width * height) - bool ReceiveImage(unsigned char* pixels, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFbo = 0); - // Query whether the sender has changed - // Checked at every cycle before receiving data - bool IsUpdated(); - // Query sender connection - // If the sender closes, receiving functions return false, - bool IsConnected(); - // Query received frame status - // The receiving texture or pixel buffer is only refreshed if the sender has produced a new frame - // This can be queried to process texture data only for new frames - bool IsFrameNew(); - // Received sender name - const char * GetSenderName(); - // Received sender width - unsigned int GetSenderWidth(); - // Received sender height - unsigned int GetSenderHeight(); - // Received sender DX11 texture format - DWORD GetSenderFormat(); - // Received sender frame rate - double GetSenderFps(); - // Received sender frame number - long GetSenderFrame(); - // Received sender share handle - HANDLE GetSenderHandle(); - // Received sender sharing mode - bool GetSenderCPUmode(); - // Open sender selection dialog - void SelectSender(); - - // - // Frame count - // - - // Enable or disable frame counting globally - void SetFrameCount(bool bEnable); - // Disable frame counting specifically for this application - void DisableFrameCount(); - // Return frame count status - bool IsFrameCountEnabled(); - // Frame rate control - void HoldFps(int fps); - - // - // Sender names - // - - // Number of senders - int GetSenderCount(); - // Sender item name - bool GetSender(int index, char* sendername, int MaxSize = 256); - // Sender information - bool GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat); - // Current active sender - bool GetActiveSender(char* sendername); - // Set sender as active - bool SetActiveSender(const char* sendername); - - // - // Adapter functions - // - - // The number of graphics adapters in the system - int GetNumAdapters(); - // Get adapter item name - bool GetAdapterName(int index, char *adaptername, int maxchars = 256); - // Get adapter index - int GetAdapter(); - // Set graphics adapter for output - bool SetAdapter(int index = 0); - // Get the current adapter description - bool GetAdapterInfo(char *renderdescription, char *displaydescription, int maxchars); - // Current adapter - int Adapter(); - // Current adapter name - char * AdapterName(); - - // - // 2.006 compatibility - // - - // Find the index of the NVIDIA adapter in a multi-adapter system - bool FindNVIDIA(int &nAdapter); - // Graphics adapter details - bool GetAdapterInfo(char* renderadapter, - char* renderdescription, char* renderversion, - char* displaydescription, char* displayversion, - int maxsize, bool &bUseDX9); - - // Create a sender - bool CreateSender(const char *Sendername, unsigned int width = 0, unsigned int height = 0, DWORD dwFormat = 0); - // Update a sender - bool UpdateSender(const char* Sendername, unsigned int width, unsigned int height); - - // Legacy OpenGL DrawTo function - // See _SpoutCommon.h_ #define legacyOpenGL -#ifdef legacyOpenGL - // Render a texture to the shared texture. - bool DrawToSharedTexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, float max_x = 1.0, float max_y = 1.0, float aspect = 1.0, bool bInvert = false, GLuint HostFBO = 0); -#endif - - // - // 2.006 compatibility - // - - // Create receiver connection - bool CreateReceiver(char* Sendername, unsigned int &width, unsigned int &height, bool bUseActive = false); - // Check receiver connection - bool CheckReceiver(char* Sendername, unsigned int &width, unsigned int &height, bool &bConnected); - // Receive OpenGL texture - bool ReceiveTexture(char* Sendername, unsigned int &width, unsigned int &height, GLuint TextureID = 0, GLuint TextureTarget = 0, bool bInvert = false, GLuint HostFBO = 0); - // Receive image pixels - bool ReceiveImage(char* Sendername, unsigned int &width, unsigned int &height, unsigned char* pixels, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFBO = 0); - // Open dialog for the user to select a sender - // Optional message argument - bool SelectSenderPanel(const char* message = nullptr); - - // Legacy OpenGL Draw function - // See _SpoutCommon.h_ #define legacyOpenGL -#ifdef legacyOpenGL - // Render the shared texture - bool DrawSharedTexture(float max_x = 1.0, float max_y = 1.0, float aspect = 1.0, bool bInvert = true, GLuint HostFBO = 0); -#endif - -protected: - - // Sender creation and change - bool CheckSender(unsigned int width, unsigned int height); - // Create receiver connection - void InitReceiver(const char * sendername, unsigned int width, unsigned int height, DWORD dwFormat); - // Receiver find sender and retrieve information - bool ReceiveSenderData(); - // Receiver detect sender selection - bool CheckSpoutPanel(char *sendername, int maxchars = 256); - - // - // Class globals - // - - // Graphics adapters - int m_AdapterNumber; - int m_AdapterIndex; - char m_AdapterName[256]; - - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutControls.cpp b/Plugin/Spout/SpoutGL/SpoutControls.cpp deleted file mode 100644 index 4c5a826..0000000 --- a/Plugin/Spout/SpoutGL/SpoutControls.cpp +++ /dev/null @@ -1,1265 +0,0 @@ -// -// SpoutControls -// -// Allows an application to control a Spout sender -// -// ==================================================================================== -// Revisions : -// -// 21.06.15 - project start -// 08.07.15 - project Version 1 -// 16.07.15 - changed CheckControls to return the control index that was changed -// int SpoutControls::CheckControls(vector &controls) -// 17.07.15 - introduced two versions of CheckControls -// introduced Lesser GPL licence -// 22.07.15 - included CreateControl -// - removed clear control file path from the registry -// so that it remains for controllers to find the last sender started -// 27.07.15 - Added "OpenSpoutController" -// 18.08.15 - Cleanup for 1.002 release -// 24.09.15 - re-ordering in cleanup -// 24.12.15 - added executable path to registry "ControlPath" -// 30.12.15 - restored CopyControlFile -// - Moved GetControls public -// 13.01.16 - Changed OpenSpoutController to look for executable host path -// as well as SpoutControls installation path. -// 15.01.16 - Added fixed "NoClose" argument for opening SpoutController from an application -// so that the Close button is hidden. -// 17.01.16 - Added commandline argument to the OpenController function -// "NoClose" is now a key word -// - CloseControls - look for the SpoutController window and close it -// 18.01.16 - added getcwd to OpenSpoutController -// - cleanup on exit confirmed for Processing -// - Instead of closecontrols, close the controller in CleanUp if it has been opened -// 26.01.16 - added default empty string for OpenSpoutController - then needs SpoutControls installation -// 27.01.16 - brought SpoutController.exe topmost before close to prevent freeze if hidden -// 19.02.16 - fixed command line for OpenSpoutController -// 08.05.16 - fixed OpenSpoutController function to detect SpoutController.exe -// 11.05.16 - 1.007 -// 02.09.16 - safety checks for mailslot handle. Code cleanup. -// 17.01.17 - 1.008 release for Spout 2.006 - no code changes -// 27.01.17 - Changes to OpenSpoutController to find a SpoutControls installation -// 02.06.17 - Registry functions called from SpoutUtils -// 13.12.17 - OpenControls - returns false if no controls - no registry write -// 28.12.17 - Added GetFileControls -// 04.12.18 - corrected return value for GetFileControls -// 03.01.19 - Changed to revised registry functions in SpoutUtils -// 28.04.19 - Rebuild VS2017 - 2.007 - /MT -// 27.12.20 - Remove from Spout SDK and use for Processing library -// Rebuild Win32/x64 - /MT : VS2017 - 2.007 -// -// -// ==================================================================================== -// -// Copyright (C) 2015-2021. Lynn Jarvis, Leading Edge. Pty. Ltd. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You will receive a copy of the GNU Lesser General Public License along -// with this program. If not, see http://www.gnu.org/licenses/. -// -#include "SpoutControls.h" - -SpoutControls::SpoutControls() -{ - m_sharedMemoryName = ""; // Memory map name sring - m_hSharedMemory = NULL; // Memory map handle - m_pBuffer = NULL; // Shared memory pointer - m_hAccessMutex = NULL; // Map access mutex - m_hSlot = NULL; // Handle to the mailslot - m_dwSize = 0; // Size of the memory map - -} - - -//--------------------------------------------------------- -SpoutControls::~SpoutControls() -{ - Cleanup(); -} - - -// ====================================================================== -// Public -// ====================================================================== - - -// ===================================================================== // -// CONTROLLER // -// ===================================================================== // - - -//--------------------------------------------------------- -// Find a control map name in the registry -// This will only exist if the sender has created it and is running -// It is erased when the sender closes. -bool SpoutControls::FindControls(std::string &mapname) -{ - char path[MAX_PATH]; - - // Find the if controller map name exists the registry - if(ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "ControlMap", path) ) { - if(path[0] > 0) { - mapname = path; - return true; - } - } - - return false; - -} - - -//--------------------------------------------------------- -// Create a controls memory map, existence mutex and access mutex -// and fill the memory map with the control vector -bool SpoutControls::CreateControls(std::string mapname, std::vector controls) -{ - std::string mutexName; - std::string sharedMemoryName; - - // Create a mutex to control the write / read - mutexName = mapname; - mutexName += "ControlsAccess"; - mutexName += "_mutex"; - m_hAccessMutex = CreateMutexA(NULL, true, mutexName.c_str()); // initial ownership - if (!m_hAccessMutex) { - printf("CreateControls : Mutex creation failed\n"); - return false; - } - - // Create a memory map that will contain the updated control information - m_sharedMemoryName = mapname; // Global shared memory name used throughout - - sharedMemoryName = mapname; - sharedMemoryName += "Controls"; - sharedMemoryName += "_map"; - - // Calculate the size required for the memory map - // First 4 bytes on the first line are the size of the control array - // Next the information for each control - // Type DWORD (4 bytes) Name (16 bytes) Data (256 bytes) - total 276 bytes per control - // Total : 276 + size *(276) - m_dwSize = 276 + (DWORD)(controls.size()*276); - - // Create or open the shared memory map - m_hSharedMemory = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, m_dwSize, (LPCSTR)sharedMemoryName.c_str()); - if (m_hSharedMemory == NULL || m_hSharedMemory == INVALID_HANDLE_VALUE) { - printf("CreateControls : error occured while creating file mapping object : %d\n", GetLastError() ); - CloseHandle(m_hAccessMutex); - return false; - } - - - // Map a view to get a pointer to write to - m_pBuffer = (LPTSTR)MapViewOfFile(m_hSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, m_dwSize); - if (m_pBuffer == NULL) { - printf("CreateControls : error occured while mapping view of the file : %d\n", GetLastError() ); - CloseHandle(m_hSharedMemory); - CloseHandle(m_hAccessMutex); - return false; - } - - WriteControls(m_pBuffer, controls); - - UnmapViewOfFile(m_pBuffer); - - // End of creation so unlock the access mutex - // If the reader tries to access the memory there will be nothing in it - ReleaseMutex(m_hAccessMutex); - - return true; -} - - -//--------------------------------------------------------- -// Set the changed controls to the memory map and inform the sender -bool SpoutControls::SetControls(std::vector controls) -{ - - if(UpdateControls(controls)) { - // Inform the sender that new control data is ready - WriteMail(m_sharedMemoryName, "Ready"); - return true; - } - - return false; -} - - - -//--------------------------------------------------------- -// Find a control map and update it with the controls -bool SpoutControls::UpdateControls(std::vector controls) -{ - std::string mutexName; - std::string memoryMapName; // local name of the shared memory - HANDLE hMemory = NULL; // local handle to shared memory - LPTSTR pBuf = NULL; // local shared memory pointer - HANDLE hAccessMutex = NULL; - DWORD dwWaitResult; - DWORD dwMapSize = 0; - char *buf = NULL; - char temp[256]; - - // - // Controller writes to the memory map to update control data - // - - // Check the access mutex - mutexName = m_sharedMemoryName; // mapname; - mutexName += "ControlsAccess"; - mutexName += "_mutex"; - hAccessMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, mutexName.c_str()); - if(!hAccessMutex) { - printf("UpdateControls - access mutex does not exist\n"); - CloseHandle(hAccessMutex); - return false; - } - - dwWaitResult = WaitForSingleObject(m_hAccessMutex, 67); - if (dwWaitResult != WAIT_OBJECT_0) { // reader is accessing it - CloseHandle(hAccessMutex); - return false; - } - - // The mutex is now locked so that the reader does not read while writing - - // The memory map name is defined by the global mapname - memoryMapName = m_sharedMemoryName; // local name; - memoryMapName += "Controls"; - memoryMapName += "_map"; - - // ==================================== - // At this stage the map size is not known, but it's size - // is the first 4 bytes of the map, so read that first to get the size - hMemory = CreateFileMappingA ( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4, (LPCSTR)memoryMapName.c_str()); - if (hMemory == NULL || hMemory == INVALID_HANDLE_VALUE) { - printf("UpdateControls : Error occured while opening file mapping object : %d\n", GetLastError() ); - CloseHandle(hAccessMutex); - return false; - } - - pBuf = (LPTSTR)MapViewOfFile(hMemory, FILE_MAP_ALL_ACCESS, 0, 0, 4); // only 4 bytes to read - if (pBuf == NULL || pBuf[0] == 0) { - printf("UpdateControls : Error 1 occured while mapping view of the file : %d\n", GetLastError() ); - if(pBuf) UnmapViewOfFile(pBuf); - CloseHandle(hMemory); - CloseHandle(hAccessMutex); - return false; - } - - // Retrieve the map size - the first 4 bytes - buf = (char *)pBuf; // moveable pointer - for(int i = 0; i<4; i++) - temp[i] = *buf++; - temp[4] = 0; - dwMapSize = (DWORD)atoi(temp); - - // Now close the map and re-open it with the known size - UnmapViewOfFile(pBuf); - CloseHandle(hMemory); - - // First check that the map size is correct for the control vector passed - // First 4 bytes on the first line are the size of the control array - // Next the information for each control - // Type DWORD (4 bytes) Name (16 bytes) Data (256 bytes) - total 276 bytes per control - // Total : 276 + size *(276) - if(dwMapSize != (276 + (DWORD)(controls.size()*276)) ) { - CloseHandle(hAccessMutex); - return false; - } - - // Now open the full map and write the control data to it - hMemory = CreateFileMappingA ( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwMapSize, (LPCSTR)memoryMapName.c_str()); - if (hMemory == NULL || hMemory == INVALID_HANDLE_VALUE) { - CloseHandle(hAccessMutex); - return false; - } - - pBuf = (LPTSTR)MapViewOfFile(hMemory, FILE_MAP_ALL_ACCESS, 0, 0, dwMapSize); - if (pBuf == NULL) { - printf("UpdateControls : Error 2 occured while mapping view of the file : %d\n", GetLastError() ); - CloseHandle(hMemory); - CloseHandle(hAccessMutex); - return false; - } - - // - // Write the controls to the memory map - // - WriteControls(pBuf, controls); - - UnmapViewOfFile(pBuf); // Finished with the buffer - CloseHandle(hMemory); // Closes the memory map - ReleaseMutex(hAccessMutex); // Unlock the access mutex so that the reader can read from the memory map - CloseHandle(hAccessMutex);// Close the local handle - - return true; -} - - -//--------------------------------------------------------- -// Get controls from an existing map -bool SpoutControls::GetControls(std::vector &controls) -{ - std::string mutexName; - std::string memoryMapName; // local name of the shared memory - HANDLE hMemory = NULL; // local handle to shared memory - LPTSTR pBuf = NULL; // local shared memory pointer - HANDLE hAccessMutex = NULL; - DWORD dwWaitResult; - DWORD dwMapSize = 0; - // int nControls = 0; - // int ControlType = 0; - // float ControlValue = 0; // Float value of a control - std::string ControlText; // Text data of a control - char *buf = NULL; - char temp[256]; - - // - // Reader reads the memory map to retrieve control data - // - - // Check the access mutex - mutexName = m_sharedMemoryName; // mapname; - mutexName += "ControlsAccess"; - mutexName += "_mutex"; - hAccessMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, mutexName.c_str()); - if(!hAccessMutex) { - printf("GetControls : No access mutex\n"); - CloseHandle(hAccessMutex); - return false; - } - - dwWaitResult = WaitForSingleObject(hAccessMutex, 67); - if (dwWaitResult != WAIT_OBJECT_0) { // writer is accessing it - CloseHandle(hAccessMutex); - return false; - } - - // The mutex is now locked so that the writer does not write while reading - - // The memory map name is defined by the global mapname - memoryMapName = m_sharedMemoryName; - memoryMapName += "Controls"; - memoryMapName += "_map"; - - // ==================================== - // At this stage the map size is not known, but it's size is the - // first 4 bytes of the map so read that first to get the size - hMemory = CreateFileMappingA ( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4, (LPCSTR)memoryMapName.c_str()); - if (hMemory == NULL || hMemory == INVALID_HANDLE_VALUE) { - printf("GetControls - Error occured opening file mapping object : %d\n", GetLastError() ); - ReleaseMutex(hAccessMutex); - CloseHandle(hAccessMutex); - return false; - } - - pBuf = (LPTSTR)MapViewOfFile(hMemory, FILE_MAP_ALL_ACCESS, 0, 0, 4); // only 4 bytes to read - // Did the mapping fail or is there nothing in the map - if (pBuf == NULL || pBuf[0] == 0) { - printf("GetControls - Error 1 occured while mapping view of the file : %d\n", GetLastError() ); - if(pBuf) UnmapViewOfFile(pBuf); - CloseHandle(hMemory); - ReleaseMutex(hAccessMutex); - CloseHandle(hAccessMutex); - return false; - } - - // Retrieve the map size - the first 4 bytes - buf = (char *)pBuf; // moveable pointer - for(int i = 0; i<4; i++) - temp[i] = *buf++; - temp[4] = 0; - dwMapSize = (DWORD)atoi(temp); - - // Now close the map and re-open it with the known size - UnmapViewOfFile(pBuf); - CloseHandle(hMemory); - - hMemory = CreateFileMappingA ( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwMapSize, (LPCSTR)memoryMapName.c_str()); - if (hMemory == NULL || hMemory == INVALID_HANDLE_VALUE) { - printf("GetControls - CreateFileMapping failed\n"); - ReleaseMutex(hAccessMutex); - CloseHandle(hAccessMutex); - return false; - } - - pBuf = (LPTSTR)MapViewOfFile(hMemory, FILE_MAP_ALL_ACCESS, 0, 0, dwMapSize); - if (pBuf == NULL) { - printf("GetControls - Error 2 occured while mapping view of the file : %d\n", GetLastError() ); - CloseHandle(hMemory); - ReleaseMutex(hAccessMutex); - CloseHandle(hAccessMutex); - return false; - } - - // - // Get the controls from the memory map - // - ReadControls(pBuf, controls); - - // Finished with the buffer - UnmapViewOfFile(pBuf); - - // Reader closes the memory map - CloseHandle(hMemory); - - // Unlock the access mutex so that the writer can write to the memory map - ReleaseMutex(hAccessMutex); - - // Close the local mutex handle - // All handles must be closed before the writer finally closes with the creation handle - CloseHandle(hAccessMutex); - - return true; -} - - -//--------------------------------------------------------- -// OpenControls -// A sender creates the controls and then calls OpenControls with a control name -// so that the controller can set up a memory map ans share data with the sender as it changes the controls -// The sender provides the map name, creates the mailslot and writes the map name to the registry -bool SpoutControls::OpenControls(std::string mapname) -{ - char Path[MAX_PATH]; - HRESULT hr; - Path[0] = 0; - - // 13.12.17 - return if no controls - // TODO remove size check below - // printf("SpoutControls::OpenControls(%s) - controls size = %d\n", mapname.c_str(), filecontrols.size()); - if (filecontrols.size() == 0) { - // printf("No controls\n"); - return false; - } - - // Set the global map name - m_sharedMemoryName = mapname; - - // Create the mailslot - // m_hSlot is intitialized to NULL in constructor - CreateMail(m_sharedMemoryName, m_hSlot); - // printf("Created mailslot handle [%x]\n", m_hSlot); - - // Write the executable path to the registry - GetModuleFileNameA(NULL, Path, sizeof(Path)); - // printf("ControlPath(%s)\n", Path); - if (WritePathToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "ControlPath", Path)) { - // printf("registry write OK\n"); - } - - // Write the name path to the registry to identify the memory map - strcpy_s(Path, MAX_PATH, m_sharedMemoryName.c_str()); - PathStripPathA(Path); - PathRemoveExtensionA(Path); - // printf("ControlMap(%s)\n", Path); - if (WritePathToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "ControlMap", Path)) { - // printf("registry write 2 OK\n"); - } - - // If the user has created controls, find the programdata or executable path and write the control file - m_ControlFilePath[0] = 0; - if(filecontrols.size() > 0) { - // Find or create the Spout programdata folder - // Look for "ProgramData" if it exists - hr = SHGetFolderPathA(NULL, CSIDL_COMMON_APPDATA, NULL, 0, Path); - if (SUCCEEDED(hr)) { - sprintf_s(m_ControlFilePath, MAX_PATH, "%s\\Spout", Path); - CreateDirectoryA((LPCSTR)m_ControlFilePath, NULL); // Will create if it does not exist - // RemoveDirectoryA((LPCSTR)SpoutPath); - strcat_s(m_ControlFilePath, MAX_PATH, "\\"); - strcat_s(m_ControlFilePath, mapname.c_str()); - strcat_s(m_ControlFilePath, ".txt"); // The control file name - } - - // If that failed use the executable path - if(!m_ControlFilePath[0]) { - GetModuleFileNameA(NULL, Path, sizeof(Path)); - PathRemoveFileSpecA(Path); - strcat_s(Path, MAX_PATH, "\\"); - strcat_s(Path, mapname.c_str()); - strcat_s(Path, ".txt"); // The control file name - strcpy_s(m_ControlFilePath, MAX_PATH, Path); - } - - CreateControlFile(m_ControlFilePath); - // Write the control file path to the registry - // printf("writing control file [%s]\n", m_ControlFilePath); - WritePathToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "ControlFile", m_ControlFilePath); - - return true; - - } - - return false; -} - - - - -//--------------------------------------------------------- -bool SpoutControls::CloseControls() -{ - // Release all handles etc - Cleanup(); - return true; -} - - -//--------------------------------------------------------- -// Open the SpoutController executable to allow controls to be changed -// Requires SpoutController.exe to be in the path passed -// or in the folder of a host executable -// or a SpoutControls installation -bool SpoutControls::OpenSpoutController(std::string CommandLine) -{ - char Path[MAX_PATH]; - char InstallPath[MAX_PATH]; - // HRESULT hr; - Path[0] = 0; - InstallPath[0] = 0; - - // Look for the SpoutControls installation path in the registry - // This contains the full path including "SpoutController.exe" - if(ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\SpoutControls", "InstallPath", InstallPath)) { - strcpy_s(Path, MAX_PATH, InstallPath); - } - else if(!CommandLine.empty()) { - // A path been passed - add the executable name - strcpy_s(Path, MAX_PATH, CommandLine.c_str()); - strcat_s(Path, MAX_PATH, "\\SpoutController.exe"); - } - else { - // No path can be found - return false; - } - - if(PathFileExistsA(Path) ) { - // Launch SpoutController - SHELLEXECUTEINFOA ShExecInfo; - ZeroMemory(&ShExecInfo, sizeof(ShExecInfo)); - ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); - ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; - ShExecInfo.hwnd = NULL; - ShExecInfo.lpVerb = NULL; - ShExecInfo.lpFile = (LPCSTR)Path; - // If opening the controller from an application, give it an argument - // "NoClose" to remove the Close button - // WinSpoutController is now changed to show/hide or exit on Escape key - if(!CommandLine.empty() && CommandLine.c_str()[0] != 0) { - if(InstallPath[0] == 0) { - // No SpoutContols installation, so use the path passed - ShExecInfo.lpParameters = (LPCSTR)CommandLine.c_str(); // ""; - } - else { - // SpoutContols installation as well as a command line, so use "NOCLOSE" - strcpy_s(InstallPath, MAX_PATH, "NOCLOSE"); - ShExecInfo.lpParameters = InstallPath; - } - } - else { - ShExecInfo.lpParameters = ""; - } - ShExecInfo.lpDirectory = NULL; - ShExecInfo.nShow = SW_SHOW; - ShExecInfo.hInstApp = NULL; - ShellExecuteExA(&ShExecInfo); - Sleep(125); // alow time to open - return true; - } - - return false; -} - - -//--------------------------------------------------------- -// Check the mailslot and return all controls -bool SpoutControls::CheckControls(std::vector &controls) -{ - - // if intialized already, check for a message from the controller - if(CheckMail(m_sharedMemoryName, m_hSlot)) { - // Get the new controls - GetControls(controls); - return true; - } - - return false; - -} - - - -// ====================================================================== -// Sender functions to create a control file -// ====================================================================== -bool SpoutControls::CreateControl(std::string name, std::string type) -{ - return CreateFileControl(name, type, 0.0f, 1.0f, 1.0, ""); -} - -bool SpoutControls::CreateControl(std::string name, std::string type, float value) -{ - return CreateFileControl(name, type, 0.0f, value, value, ""); // Min. max, default -} - -bool SpoutControls::CreateControl(std::string name, std::string type, std::string text) -{ - return CreateFileControl(name, type, 0.0f, 1.0f, 1.0, text); -} - -bool SpoutControls::CreateControl(std::string name, std::string type, float minimum, float maximum, float value) -{ - return CreateFileControl(name, type, minimum, maximum, value, ""); -} - - -//--------------------------------------------------------- -// Used by the controller to find the control file path -// and find the control map name in the registry -bool SpoutControls::FindControlFile(std::string &filepath) -{ - char path[MAX_PATH]; - - // Find if the controller map file name exists the registry - if(ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "ControlFile", path) ) { - if(path[0] > 0) { - - // 24.08.15 - add existence check - if(_access(path, 0) == -1) // Mode 0 - existence check - return false; - - // File found - filepath = path; - return true; - - } - } - - return false; - -} - -//--------------------------------------------------------- -// Used by a multiple controlled senders to copy the control -// file from ProgramData to the local dll directory -bool SpoutControls::CopyControlFile (std::string &filepath, std::string &destpath) -{ - // copy from source to destination - if(CopyFileA((LPCSTR)filepath.c_str(), (LPCSTR)destpath.c_str(), false)) { - return true; - } - return false; -} - -bool SpoutControls::GetFileControls(std::vector &controls) -{ - if (filecontrols.size() > 0) { - controls.clear(); - for (unsigned int i = 0; i < filecontrols.size(); i++) { - controls.push_back(filecontrols.at(i)); - } - return true; - } - return false; -} - - -// ====================================================================== -// Private -// ====================================================================== - - -//--------------------------------------------------------- -// Create a file control and add to the sender's filecontrol vector -bool SpoutControls::CreateFileControl(std::string name, std::string type, float minimum, float maximum, float value, std::string text) -{ - filecontrol fc; - - if(name.empty() || type.empty()) { - return false; - } - - fc.name = name; - fc.desc = type; - fc.min = minimum; - fc.max = maximum; - fc.def = value; - fc.value = value; - fc.text = text.c_str(); - - if(type == "bool") - fc.fftype = 0; // checkbox - if(type == "event") - fc.fftype = 1; // button - if(type == "float") - fc.fftype = 10; // float slider - if(type == "text") - fc.fftype = 100; // text - - filecontrols.push_back(fc); - - return true; -} - - -//--------------------------------------------------------- -// Create a JSON control file from the filecontrols vector -bool SpoutControls::CreateControlFile(const char *filepath) -{ - std::string linestring; - char path[MAX_PATH]; - char temp[256]; - - if(!filepath[0] || filecontrols.empty()) - return false; - - strcpy_s(path, MAX_PATH, filepath); - - // - // Write the contents of the parameter list - // - // Example - // - - /*{ - "CREDIT": "by Lynn Jarvis - spout.zeal.co", - "DESCRIPTION": "SpoutControls", - "CATEGORIES": [ - "Parameter adjustment" - ], - "INPUTS": [ - { - "NAME": "User text", - "TYPE": "text", - "DEFAULT": 0 - }, - { - "NAME": "Rotate", - "TYPE": "bool", - "DEFAULT": 1 - }, - { - "NAME": "Speed", - "TYPE": "float", - "MIN": 0.0, - "MAX": 4.0, - "DEFAULT": 0.5 - }, - ] - }*/ - - // Create the file - std::ofstream sourceFile(path); - - // Source file created OK ? - if(sourceFile.is_open()) { - - // Create the JSON header - linestring = "/*{\n"; - sourceFile.write(linestring.c_str(), linestring.length()); - - sprintf_s(temp, 256, " \"CREDIT\": \"SpoutControls - spout.zeal.co\",\n"); - sourceFile.write(temp, strlen(temp)); - - PathStripPathA(path); - PathRemoveExtensionA(path); - sprintf_s(temp, 256, " \"DESCRIPTION\": \"%s\",\n", path); - sourceFile.write(temp, strlen(temp)); - - sprintf_s(temp, 256, " \"CATEGORIES\": [\n"); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, " \"Parameter adjustment\"\n"); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, " ],\n"); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, " \"INPUTS\": [\n"); - sourceFile.write(temp, strlen(temp)); - - // Write the control data here - // Example - // { - // "NAME": "Speed", - // "TYPE": "float", - // "MIN": 0.0, - // "MAX": 4.0, - // "DEFAULT": 0.5 - // }, - for(unsigned int i = 0; i < filecontrols.size(); i++) { - sprintf_s(temp, 256, " {\n"); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, " \"NAME\": \"%s\",\n", filecontrols.at(i).name.c_str()); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, " \"TYPE\": \"%s\",\n", filecontrols.at(i).desc.c_str()); - sourceFile.write(temp, strlen(temp)); - if(filecontrols.at(i).desc != "text") { - sprintf_s(temp, 256, " \"MIN\": %.2f,\n", filecontrols.at(i).min); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, " \"MAX\": %.2f,\n", filecontrols.at(i).max); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, " \"DEFAULT\": %.2f\n", filecontrols.at(i).def); - sourceFile.write(temp, strlen(temp)); - } - else { - sprintf_s(temp, 256, " \"TEXT\": \"%s\"\n", filecontrols.at(i).text.c_str()); - sourceFile.write(temp, strlen(temp)); - } - sprintf_s(temp, 256, " },\n"); - sourceFile.write(temp, strlen(temp)); - } - - sprintf_s(temp, 256, " ],\n"); - sourceFile.write(temp, strlen(temp)); - sprintf_s(temp, 256, "}*/\n"); - sourceFile.write(temp, strlen(temp)); - - sourceFile.close(); - - // printf("Control file created\n[%s]\n", filepath); - } - else { - sprintf_s(temp, 256, "Control file not created\n[%s]", path); - MessageBoxA(NULL, temp, "Info", MB_OK); - // MessageBoxA(NULL, "File not created", "Info", MB_OK); - } - - return true; -} - - -//--------------------------------------------------------- -// Write control map with updated values -bool SpoutControls::WriteControls(void *pBuffer, std::vector controls) -{ - // - // Write the control data to shared memory - // The writer knows the memory map size to open it (m_dwSize) - // - float fValue = 0; - char desc[256]; - char *buffer = NULL; // the buffer to store in shared memory - char *buf = NULL; // pointer within the buffer - int i, j; - - buffer = (char *)malloc(m_dwSize*sizeof(unsigned char)); - if(!buffer) return false; - - // Clear the buffer to zero so that there is a null for each data line - ZeroMemory(buffer, m_dwSize*sizeof(unsigned char)); - buf = buffer; // pointer within the buffer - - // The first 4 bytes of the first line is the memory map size so the reader knows how big it is - // printf("Writing the memory map size (%d)\n", m_dwSize); - sprintf_s(desc, 256, "%4d", m_dwSize); - for(i = 0 ; i< 4; i++) - *buf++ = desc[i]; - - // The next 4 bytes contains the number of controls - ZeroMemory(desc, 256); - sprintf_s(desc, 256, "%4d", (DWORD)controls.size()); - for(i = 0 ; i< 4; i++) - *buf++ = desc[i]; - - // Move on 268 bytes to the start of the controls (each memory map line is 276 bytes) - buf += 268; - - // Next the controls and their data - // Name (16 bytes) Type (4 bytes) Data (256 bytes) - total 276 bytes per control - for(i = 0; i < (int)controls.size(); i++) { - - // Control name - 16 bytes - ZeroMemory(desc, 256); - if(controls.at(i).name.c_str()[0]) - sprintf_s(desc, 256, "%s", controls.at(i).name.c_str()); - for(j = 0 ; j<16; j++) - *buf++ = desc[j]; - - // Control type - 4 bytes - ZeroMemory(desc, 256); - sprintf_s(desc, 256, "%4d", (DWORD)controls.at(i).type); - for(j = 0 ; j<4; j++) - *buf++ = desc[j]; - - // Control data - 256 bytes - ZeroMemory(desc, 256); - if(controls.at(i).type == 100) { // Text data - if(controls.at(i).text[0]) { - sprintf_s(desc, 256, "%s", controls.at(i).text.c_str()); - } - } - else { - fValue = controls.at(i).value; - sprintf_s(desc, 256, "%f", fValue); // float data - } - - - // copy it with 256 length - for(j = 0 ; j<256; j++) - *buf++ = desc[j]; - - } // end all controls - - // Now transfer to shared memory which will be the same size - memcpy( (void *)pBuffer, (void *)buffer, m_dwSize ); - - free((void *)buffer); - - return true; -} - - -//--------------------------------------------------------- -// Read controls from the memory map -bool SpoutControls::ReadControls(void *pBuffer, std::vector &controls) -{ - char *buf = NULL; - char temp[256]; - int i, j, nControls; - control control; - - // - // Get the controls - // - buf = (char *)pBuffer; // moveable pointer - buf += 4; // The first 4 bytes of the first line is the memory map size, so skip that - - // the next 4 bytes contains the number of controls - for(i = 0; i<4; i++) - temp[i] = *buf++; - temp[4] = 0; - nControls = atoi(temp); - - // Move on 268 bytes to the control data (each line is 276 bytes) - buf += 268; - - // Clear the controls vector - controls.clear(); - - // Fill it again (use previously found size) - for(i = 0; i 0) { - filecontrols.clear(); - } - - // Release all objects - if(m_pBuffer) UnmapViewOfFile(m_pBuffer); - if(m_hSharedMemory) CloseHandle(m_hSharedMemory); - if(m_hAccessMutex) CloseHandle(m_hAccessMutex); - m_pBuffer = NULL; - m_hSharedMemory = NULL; - m_hAccessMutex = NULL; - - if(m_hSlot) { - // printf("Closing mailslot handle\n"); - // For a sender, clear the map name from the registry - RemovePathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "ControlMap"); - CloseHandle(m_hSlot); - m_hSlot = NULL; - } - - // Close the controller if it has been opened - HWND hwnd = FindWindowA(NULL, (LPCSTR)"Spout Controller"); - if(hwnd) { - // ShowWindow(hwnd, SW_SHOWNORMAL); // causes a freeze if the window is hidden - SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); - SendMessageA(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); - } - - return true; -} - diff --git a/Plugin/Spout/SpoutGL/SpoutCopy.cpp b/Plugin/Spout/SpoutGL/SpoutCopy.cpp deleted file mode 100644 index debaf55..0000000 --- a/Plugin/Spout/SpoutGL/SpoutCopy.cpp +++ /dev/null @@ -1,1099 +0,0 @@ -/** - - Functions to manage pixel buffer copying - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copyright (c) 2016-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ======================== - - 20.08.16 - start class - 23.08.16 - finished first version - 10.10.16 - Added SSE3 detection - Optimized SSE2 rgba-bgra function - Revise rgb2rgba etc. - 11.10.16 - Added SSSE detection and rgba-bgra function - 04.01.17 - Added rgb2bgra, bgr2bgra, bgra2rgb, bgra2bgr - 17.10.18 - Change FlipBuffer to void - 13.11.18 - const changes as per Engel (https://github.com/leadedge/Spout2/pull/26) - 27.11.18 - Add RemovePadding - 17.10.19 - Add rgba2bgrResample and bgra2bgrResample for SpoutCam - 02.02.20 - Add rgba2rgbaResample and row pitch to all resamplers - 22.06.20 - Add void rgba2rgba and rgba2rgb with source pitch - Correct const for some functions - 30.06.20 - Use CopyPixels instead of copy loop in rgba2rgba - 09.07.20 - Add rgba2rgb with source stride - 07.09.20 - experimental SSE RGBA to RGB not working - 19.09.20 - Removed experimental SSE RGBA to RGB function - 23.09.20 - CheckSSE - initialize CPUInfo - 06.10.20 - Modifications to rgba2rgb and rgba2rgbResample for SpoutCam mirror and swap red/blue - 24.10.20 - Add rgba2bgra with source pitch - 25.10.20 - Add rgb2rgba with dest pitch - 26.10.20 - Add rgb2bgra with dest pitch - 09.12.20 - Correct movsd line pitch in RemovePadding - -*/ -#include "SpoutCopy.h" - -spoutCopy::spoutCopy() { - m_bSSE2 = false; - m_bSSE3 = false; - m_bSSSE3 = false; - CheckSSE(); // SSE available - sets m_bSSE2, m_bSSE3, m_bSSSE3 -} - - -spoutCopy::~spoutCopy() { - -} - - -void spoutCopy::CopyPixels(const unsigned char *source, unsigned char *dest, - unsigned int width, unsigned int height, - GLenum glFormat, bool bInvert) const -{ - unsigned int Size = width*height * 4; // RGBA default - if (glFormat == GL_RGB || glFormat == GL_BGR_EXT) - Size = width*height * 3; - - if (bInvert) { - FlipBuffer(source, dest, width, height, glFormat); - } - else { - if (width < 320) { // Too small for assembler - memcpy(reinterpret_cast(dest), - reinterpret_cast(source), Size); - } - else if ((Size % 16) == 0 && m_bSSE2) { // 16 byte aligned SSE assembler - memcpy_sse2(reinterpret_cast(dest), - reinterpret_cast(source), Size); - } - else if ((Size % 4) == 0) { // 4 byte aligned assembler - __movsd(reinterpret_cast(dest), - reinterpret_cast(source), Size / 4); - } - else { // Default is standard memcpy - memcpy(reinterpret_cast(dest), - reinterpret_cast(source), Size); - } - } -} - -void spoutCopy::FlipBuffer(const unsigned char *src, - unsigned char *dst, - unsigned int width, - unsigned int height, - GLenum glFormat) const -{ - unsigned int pitch = width * 4; // RGBA default - if (glFormat == GL_RGB || glFormat == GL_BGR_EXT) - pitch = width * 3; // RGB format specified - - unsigned int line_s = 0; - unsigned int line_t = (height - 1)*pitch; - - for (unsigned int y = 0; y(dst + line_t), - reinterpret_cast(src + line_s), pitch); - else if ((pitch % 16) == 0 && m_bSSE2) // use sse assembler function - memcpy_sse2(reinterpret_cast(dst + line_t), - reinterpret_cast(src + line_s), pitch); - else if ((pitch % 4) == 0) // use 4 byte move assembler function - __movsd(reinterpret_cast(dst + line_t), - reinterpret_cast(src + line_s), - pitch / 4); - else - memcpy(reinterpret_cast(dst + line_t), - reinterpret_cast(src + line_s), pitch); - line_s += pitch; - line_t -= pitch; - } - -} - -void spoutCopy::RemovePadding(const unsigned char *source, unsigned char *dest, - unsigned int width, unsigned int height, - unsigned int stride, GLenum glFormat) const -{ - // Actual line pitch - unsigned int pitch = width*4; // default rgba - if (glFormat == GL_RGB || glFormat == GL_BGR_EXT) - pitch = width*3; // rgb - - // Remove the padding (stride-pitch) - for (unsigned int y = 0; y < height; y++) { - - if (pitch < 320 || stride < 320) { // too small for assembler - memcpy(reinterpret_cast(dest), reinterpret_cast(source), pitch); - } - else if ((pitch % 16) == 0 && (stride % 16) == 0 && m_bSSE2) { // use sse - memcpy_sse2(reinterpret_cast(dest), reinterpret_cast(source), pitch); - } - else if ((pitch % 4) == 0 && (stride % 4) == 0) { // 4 byte move - __movsd(reinterpret_cast(dest), reinterpret_cast(source), pitch/4); - } - else { - memcpy(reinterpret_cast(dest), reinterpret_cast(source), pitch); - } - source += stride; - dest += pitch; - } -} - - -// -// Fast memcpy -// -// Approx 1.7 times speed of memcpy (0.84 msec per frame 1920x1080) -// -// Original source - William Chan -// (dead link) http://williamchan.ca/portfolio/assembly/ssememcpy/ -// See also : -// http://stackoverflow.com/questions/1715224/very-fast-memcpy-for-image-processing -// http://www.gamedev.net/topic/502313-special-case---faster-than-memcpy/ -// And a more recent comprehensive study : -// Video : https://level1techs.com/video/level1-diagnostic-fixing-our-memcpy-troubles-looking-glass// -// Source : https://github.com/level1wendell/memcpy_sse and others. -// -void spoutCopy::memcpy_sse2(void* dst, const void* src, size_t Size) const -{ - auto pSrc = static_cast(src); // Source buffer - auto pDst = static_cast(dst); // Destination buffer - unsigned int n = (unsigned int)Size >> 7; // Counter = size divided by 128 (8 * 128bit registers) - - __m128i Reg0, Reg1, Reg2, Reg3, Reg4, Reg5, Reg6, Reg7; - for (unsigned int Index = n; Index > 0; --Index) { - - // SSE2 prefetch - _mm_prefetch(pSrc + 256, _MM_HINT_NTA); - _mm_prefetch(pSrc + 256 + 64, _MM_HINT_NTA); // ??? TODO : why - - // TODO - research and optimize - minor (0.1msec) speed difference noted - // _mm_prefetch(pSrc, _MM_HINT_NTA); - - // move data from src to registers - // 8 x 128 bit (16 bytes each) - // Increment source pointer by 16 bytes each - // for a total of 128 bytes per cycle - Reg0 = _mm_load_si128(reinterpret_cast(pSrc)); - Reg1 = _mm_load_si128(reinterpret_cast(pSrc + 16)); - Reg2 = _mm_load_si128(reinterpret_cast(pSrc + 32)); - Reg3 = _mm_load_si128(reinterpret_cast(pSrc + 48)); - Reg4 = _mm_load_si128(reinterpret_cast(pSrc + 64)); - Reg5 = _mm_load_si128(reinterpret_cast(pSrc + 80)); - Reg6 = _mm_load_si128(reinterpret_cast(pSrc + 96)); - Reg7 = _mm_load_si128(reinterpret_cast(pSrc + 112)); - - // move data from registers to dest - // TODO - // _mm_prefetch((const char*)(pSrc + 256), _MM_HINT_NTA); - - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst), Reg0); - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst + 16), Reg1); - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst + 32), Reg2); - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst + 48), Reg3); - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst + 64), Reg4); - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst + 80), Reg5); - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst + 96), Reg6); - _mm_stream_si128(reinterpret_cast<__m128i *>(pDst + 112), Reg7); - - pSrc += 128; - pDst += 128; - } - -} - - -// -// CheckSSE() -// -// https://msdn.microsoft.com/en-us/library/hskdteyh.aspx -// -// static bool SSE2 (void) { return CPU_Rep.f_1_EDX_[26]; } -// SSE2 | [bit 26] EDX -// SSE2 = (cpuid03 & (0x1 << 26)) -// -// static bool SSE3 (void) { return CPU_Rep.f_1_ECX_[0]; } -// SSE3 | [bit 0] ECX -// SSE3 = (cpuid02 & (0x1) -// -// static bool SSSE3(void) { return CPU_Rep.f_1_ECX_[9]; } -// SSSE3 | [bit 9] ECX -// SSSE3 = (cpuid02 & (0x1 << 9) -// -// SSE4 not currently used : -// -// SSE4.1 and SSE4.2 are extensions of SSE, SSE2, SSE3, and SSSE3. -// To check if the processor supports SSE4.1, execute CPUID with EAX = 1 as input. -// If bit 19 of ECX is set, then the processor supports SSE4.1. -// To check if the processor supports SSE4.2 instructions for string / text processing, -// PCMPGTQ, and CRC32, execute CPUID with EAX = 1 as input. -// If bit 20 of ECX is set, then the processor supports these SSE4.2 in structions. -// -// static bool SSE41(void) { return CPU_Rep.f_1_ECX_[19]; } -// SSE41 | [bit 19] ECX -// SSE41 = (cpuid02 & (0x1 << 19)) -// -// static bool SSE42(void) { return CPU_Rep.f_1_ECX_[20]; } -// SSE42 | [bit 20] ECX -// SSE42 = (cpuid02 & (0x1 << 20)) -// -// EAX - CPUInfo[0] -// EBX - CPUInfo[1] -// ECX - CPUInfo[2] -// EDX - CPUInfo[3] -// -// For intrinsics and SSE : https://software.intel.com/sites/landingpage/IntrinsicsGuide/ -// -void spoutCopy::CheckSSE() -{ - // An array of four integers that contains the information returned - // in EAX (0), EBX (1), ECX (2), and EDX (3) about supported features of the CPU. - int CPUInfo[4] = { -1, -1, -1, -1 }; - - //-- Get number of valid info ids - __cpuid(CPUInfo, 0); - int nIds = CPUInfo[0]; - - //-- Get info for id "1" - if (nIds >= 1) { - // SSE2 | [bit 26] EDX - // SSE2 = (cpuid03 & (0x1 << 26)) - __cpuid(CPUInfo, 1); // EAX = 1 for __cpuid - m_bSSE2 = ((CPUInfo[3] & (0x1 << 26)) || false); - // SSE3 | [bit 0] ECX - // SSE3 = (cpuid02 & (0x1) - m_bSSE3 = ((CPUInfo[2] & (0x1)) || false); - // SSSE3 | [bit 9] ECX - // SSSE3 = (cpuid02 & (0x1 << 9) - m_bSSSE3 = ((CPUInfo[2] & (0x1 << 9)) || false); - } - -} - -// -// rgba2bgra, bgra2rgba -// -void spoutCopy::rgba2bgra(const void *rgba_source, void *bgra_dest, - unsigned int width, unsigned int height, bool bInvert) const -{ - if ((width % 16) == 0) { // 16 byte aligned width - if (m_bSSE2 && m_bSSSE3) // SSE3 available - rgba_bgra_sse3(rgba_source, bgra_dest, width, height, bInvert); - else if (m_bSSE2) // SSE2 available - rgba_bgra_sse2(rgba_source, bgra_dest, width, height, bInvert); - } - else { - rgba_bgra(rgba_source, bgra_dest, width, height, bInvert); - } -} - - -// line by line with source pitch -void spoutCopy::rgba2bgra(const void *rgba_source, void *bgra_dest, - unsigned int width, unsigned int height, unsigned int sourcePitch, bool bInvert) const -{ - for (unsigned int y = 0; y < height; y++) { - // Start of buffer - auto source = static_cast(rgba_source); // unsigned int = 4 bytes - auto dest = static_cast(bgra_dest); - // Increment to current line. - // Pitch is line length in bytes. - // Divide by 4 to get the line width in rgba pixels. - if (bInvert) { - source += (unsigned long)((height - 1 - y)*sourcePitch / 4); - dest += (unsigned long)(y * width); // dest is not inverted - } - else { - source += (unsigned long)(y * sourcePitch / 4); - dest += (unsigned long)(y * width); - } - // Copy the line - if ((width % 16) == 0) { // 16 byte aligned width - if (m_bSSE2 && m_bSSSE3) // SSE3 available - rgba_bgra_sse3(source, dest, width, 1, bInvert); - else if (m_bSSE2) // SSE2 available - rgba_bgra_sse2(source, dest, width, 1, bInvert); - } - else { - rgba_bgra(source, dest, width, 1, bInvert); - } - } - -} - -// line by line with source and dest pitch -void spoutCopy::rgba2bgra(const void* rgba_source, void* bgra_dest, - unsigned int width, unsigned int height, - unsigned int sourcePitch, unsigned int destPitch, bool bInvert) const -{ - for (unsigned int y = 0; y < height; y++) { - // Start of buffer - auto source = static_cast(rgba_source); // unsigned int = 4 bytes - auto dest = static_cast(bgra_dest); - // Increment to current line. - // Pitch is line length in bytes. - // Divide by 4 to get the line width in rgba pixels. - if (bInvert) { - source += (unsigned long)((height - 1 - y)*sourcePitch / 4); - dest += (unsigned long)(y * destPitch / 4); // dest is not inverted - } - else { - source += (unsigned long)(y * sourcePitch / 4); - dest += (unsigned long)(y * destPitch / 4); - } - // Copy the line - if ((width % 16) == 0) { // 16 byte aligned width - if (m_bSSE2 && m_bSSSE3) // SSE3 available - rgba_bgra_sse3(source, dest, width, 1, bInvert); - else if (m_bSSE2) // SSE2 available - rgba_bgra_sse2(source, dest, width, 1, bInvert); - } - else { - rgba_bgra(source, dest, width, 1, bInvert); - } - } -} - - -// Both are swapping red and blue, so use the same function -void spoutCopy::bgra2rgba(const void *bgra_source, void *rgba_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - rgba2bgra(bgra_source, rgba_dest, width, height, bInvert); -} - - -// Without SSE -void spoutCopy::rgba_bgra(const void *rgba_source, void *bgra_dest, - unsigned int width, unsigned int height, bool bInvert) const -{ - for (unsigned int y = 0; y < height; y++) { - - // Start of buffer - auto source = static_cast(rgba_source);; // unsigned int = 4 bytes - auto dest = static_cast(bgra_dest); - - // Increment to current line - if (bInvert) { - // https://docs.microsoft.com/en-us/visualstudio/code-quality/c26451?view=vs-2017 - source += (unsigned long)((height - 1 - y)*width); - dest += (unsigned long)(y * width); // dest is not inverted - } - else { - source += (unsigned long)(y * width); - dest += (unsigned long)(y * width); - } - - for (unsigned int x = 0; x < width; x++) { - auto rgbapix = source[x]; - dest[x] = (_rotl(rgbapix, 16) & 0x00ff00ff) | (rgbapix & 0xff00ff00); - } - } -} // end rgba_bgra - - -// -// Adapted from : https://searchcode.com/codesearch/view/5070982/ -// -// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// https://chromium.googlesource.com/angle/angle/+/master/LICENSE -// -// All instructions SSE2. -// -void spoutCopy::rgba_bgra_sse2(const void *rgba_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - const __m128i brMask = _mm_set1_epi32(0x00ff00ff); // argb - - for (unsigned int y = 0; y < height; y++) { - - // Start of buffer - auto source = static_cast(rgba_source); // unsigned int = 4 bytes - auto dest = static_cast(bgra_dest); - - // Increment to current line - if (bInvert) - source += (unsigned long)((height - 1 - y)*width); - else - source += (unsigned long)(y * width); - - dest += (unsigned long)(y * width); // dest is not inverted - - // Make output writes aligned - unsigned int x; - for (x = 0; ((reinterpret_cast(&dest[x]) & 15) != 0) && x < width; x++) { - auto rgbapix = source[x]; - // rgbapix << 16 : a r g b > g b a r - // & 0x00ff00ff : r g b . > . b . r - // rgbapix & 0xff00ff00 : a r g b > a . g . - // result of or : a b g r - dest[x] = (_rotl(rgbapix, 16) & 0x00ff00ff) | (rgbapix & 0xff00ff00); - } - - for (; x + 3 < width; x += 4) { - __m128i sourceData = _mm_loadu_si128(reinterpret_cast(&source[x])); - // Mask out g and a, which don't change - __m128i gaComponents = _mm_andnot_si128(brMask, sourceData); - // Mask out b and r - __m128i brComponents = _mm_and_si128(sourceData, brMask); - // Swap b and r - __m128i brSwapped = _mm_shufflehi_epi16(_mm_shufflelo_epi16(brComponents, _MM_SHUFFLE(2, 3, 0, 1)), _MM_SHUFFLE(2, 3, 0, 1)); - __m128i result = _mm_or_si128(gaComponents, brSwapped); - _mm_store_si128(reinterpret_cast<__m128i*>(&dest[x]), result); - } - - // Perform leftover writes - for (; x < width; x++) { - auto rgbapix = source[x]; - dest[x] = (_rotl(rgbapix, 16) & 0x00ff00ff) | (rgbapix & 0xff00ff00); - } - } - -} // end rgba_bgra_sse2 - - -// -// Adapted from a Gist snippet by Aurélien Vallée (NewbiZ) http://newbiz.github.io/ -// -// https://gist.github.com/NewbiZ/5541524 -// -// Approximately 15% faster than SSE2 function -// -void spoutCopy::rgba_bgra_sse3(const void* rgba_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - // Shuffling mask (RGBA -> BGRA) x 4, in reverse byte order - static const __m128i m = _mm_set_epi8(15, 12, 13, 14, 11, 8, 9, 10, 7, 4, 5, 6, 3, 0, 1, 2); - - for (unsigned int y = 0; y < height; y++) { - - // Start of buffer - auto source = static_cast(rgba_source); // unsigned int = 4 bytes - auto dest = static_cast(bgra_dest); - - // Increment to current line - if (bInvert) - source += (unsigned long)((height - 1 - y)*width); - else - source += (unsigned long)(y * width); - dest += (unsigned long)(y * width); // dest is not inverted - - // Assert pixels will NOT be aliased here : TODO - // __m128i* __restrict__ pix = (__m128i*)pixels; - auto src = reinterpret_cast(source); - auto dst = reinterpret_cast<__m128i *>(dest); - - // Tile the LHS to match 64B cache line size - const auto srcEnd = reinterpret_cast(source + width); - for (; src < srcEnd; src += 4, dst += 4) { - - __m128i p1 = _mm_load_si128(src); // SSE2 - __m128i p2 = _mm_load_si128(src + 1); - __m128i p3 = _mm_load_si128(src + 2); - __m128i p4 = _mm_load_si128(src + 3); - - p1 = _mm_shuffle_epi8(p1, m); // SSSE3 - p2 = _mm_shuffle_epi8(p2, m); - p3 = _mm_shuffle_epi8(p3, m); - p4 = _mm_shuffle_epi8(p4, m); - - _mm_store_si128(dst, p1); // SSE2 - _mm_store_si128(dst + 1, p2); - _mm_store_si128(dst + 2, p3); - _mm_store_si128(dst + 3, p4); - - } - } - -} // end rgba_bgra_ssse3 - - -// -// rgb2rgba, bgr2rgba, rgba2rgb, rgba2bgr, rgb2bgra -// - -void spoutCopy::rgb2rgba(const void *rgb_source, void *rgba_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - const unsigned long rgbsize = width * height * 3; - const unsigned long rgbpitch = width * 3; - - // Start of buffers - auto rgb = static_cast(rgb_source); // RGB - auto rgba = static_cast(rgba_dest); // RGBA - - if (bInvert) { - rgb += rgbsize; // end of rgb buffer - rgb -= rgbpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - // rgb source - rgba dest - *(rgba + 0) = *(rgb + 0); // red - *(rgba + 1) = *(rgb + 1); // grn - *(rgba + 2) = *(rgb + 2); // blu - *(rgba + 3) = (unsigned char)255; // alpha - rgb += 3; - rgba += 4; - } - if (bInvert) - rgb -= rgbpitch * 2; // move up a line for invert - } - -} // end rgb2rgba - - -void spoutCopy::rgb2rgba(const void *rgb_source, void *rgba_dest, - unsigned int width, unsigned int height, - unsigned int dest_pitch, bool bInvert) const -{ - // RGB dest does not have padding - const unsigned long rgbsize = width * height * 3; - const unsigned long rgbpitch = width * 3; - const unsigned long rgba_padding = dest_pitch - (width * 4); - - // RGBA dest may have padding - // Dest and source must be the same dimensions otherwise - - // Start of buffers - auto rgb = static_cast(rgb_source); // rgb/bgr - auto rgba = static_cast(rgba_dest); // rgba/bgra - if (bInvert) { - rgb += rgbsize; // end of rgb buffer - rgb -= rgbpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - *(rgba + 0) = *(rgb + 0); // red - *(rgba + 1) = *(rgb + 1); // grn - *(rgba + 2) = *(rgb + 2); // blu - rgb += 3; - rgba += 4; - } - rgba += rgba_padding; - - if (bInvert) - rgb -= rgbpitch * 2; // move up a line for invert - } - -} // end rgb2rgba - - -void spoutCopy::bgr2rgba(const void *bgr_source, void *rgba_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - - const unsigned long bgrsize = width * height * 3; - const unsigned long bgrpitch = width * 3; - - // Start of buffers - auto bgr = static_cast(bgr_source); // BGR - auto rgba = static_cast(rgba_dest); // RGBA - - if (bInvert) { - bgr += bgrsize; // end of rgb buffer - bgr -= bgrpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - // bgr source - rgba dest - *(rgba + 0) = *(bgr + 2); // red - *(rgba + 1) = *(bgr + 1); // grn - *(rgba + 2) = *(bgr + 0); // blu - *(rgba + 3) = (unsigned char)255; // alpha - bgr += 3; - rgba += 4; - } - if (bInvert) - bgr -= bgrpitch * 2; // move up a line for invert - } - -} // end bgr2rgba - -void spoutCopy::bgr2rgba(const void *bgr_source, void *rgba_dest, - unsigned int width, unsigned int height, - unsigned int dest_pitch, bool bInvert) const -{ - // BGR buffer dest does not have padding - const unsigned long bgrsize = width * height * 3; - const unsigned long bgrpitch = width * 3; - const unsigned long rgba_padding = dest_pitch - (width * 4); - - // RGBA dest may have padding - // Dest and source must be the same dimensions otherwise - - // Start of buffers - auto bgr = static_cast(bgr_source); // rgb/bgr - auto rgba = static_cast(rgba_dest); // rgba/bgra - if (bInvert) { - bgr += bgrsize; // end of rgb buffer - bgr -= bgrpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - *(rgba + 0) = *(bgr + 0); // blu - *(rgba + 1) = *(bgr + 1); // grn - *(rgba + 2) = *(bgr + 2); // red - bgr += 3; - rgba += 4; - } - rgba += rgba_padding; - - if (bInvert) - bgr -= bgrpitch * 2; // move up a line for invert - } - -} // end bgr2rgba with dest pitch - - -void spoutCopy::rgb2bgra(const void *rgb_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - const unsigned long rgbsize = width * height * 3; - const unsigned long rgbpitch = width * 3; - - // Start of buffers - auto rgb = static_cast(rgb_source); // RGB - auto bgra = static_cast(bgra_dest); // BGRA - if (bInvert) { - rgb += rgbsize; // end of rgb buffer - rgb -= rgbpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - // rgb source - bgra dest - *(bgra + 0) = *(rgb + 2); // blu - *(bgra + 1) = *(rgb + 1); // grn - *(bgra + 2) = *(rgb + 0); // red - *(bgra + 3) = (unsigned char)255; // alpha - rgb += 3; - bgra += 4; - } - if (bInvert) - rgb -= rgbpitch * 2; // move up a line for invert - } - -} // end rgb2bgra - - -void spoutCopy::rgb2bgra(const void *rgb_source, void *bgra_dest, - unsigned int width, unsigned int height, - unsigned int dest_pitch, bool bInvert) const -{ - // RGB source does not have padding - const unsigned long rgbsize = width * height * 3; - const unsigned long rgbpitch = width * 3; - // BGRA dest may have padding - const unsigned long bgra_padding = dest_pitch - (width * 4); - // Dest and source must be the same dimensions otherwise - - // Start of buffers - auto rgb = static_cast(rgb_source); // rgb/bgr - auto bgra = static_cast(bgra_dest); // rgba/bgra - if (bInvert) { - rgb += rgbsize; // end of rgb buffer - rgb -= rgbpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - *(bgra + 0) = *(rgb + 2); // blu - *(bgra + 1) = *(rgb + 1); // grn - *(bgra + 2) = *(rgb + 0); // red - rgb += 3; - bgra += 4; - } - bgra += bgra_padding; - - if (bInvert) - rgb -= rgbpitch * 2; // move up a line for invert - } - -} // end rgb2bgra - - - -void spoutCopy::bgr2bgra(const void *bgr_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - const unsigned long bgrsize = width * height * 3; - const unsigned long bgrpitch = width * 3; - - // Start of buffers - auto bgr = static_cast(bgr_source); // BGR - auto bgra = static_cast(bgra_dest); // BGRA - if (bInvert) { - bgr += bgrsize; // end of rgb buffer - bgr -= bgrpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - // bgr source - bgra dest - *(bgra + 0) = *(bgr + 0); // blu - *(bgra + 1) = *(bgr + 1); // grn - *(bgra + 2) = *(bgr + 2); // red - *(bgra + 3) = (unsigned char)255; // alpha - bgr += 3; - bgra += 4; - } - if (bInvert) - bgr -= bgrpitch * 2; // move up a line for invert - } - -} // end bgr2bgra - - -void spoutCopy::rgba2rgb(const void *rgba_source, void *rgb_dest, - unsigned int width, unsigned int height, - unsigned int rgba_pitch, bool bInvert, bool bMirror, bool bSwapRB) const -{ - // RGB dest does not have padding - const unsigned long rgbsize = width * height * 3; - const unsigned long rgbpitch = width * 3; - const unsigned long rgba_padding = rgba_pitch-(width * 4); - - // RGBA source may have padding - // Dest and source must be the same dimensions otherwise - - // Start of buffers - auto rgba = static_cast(rgba_source); // rgba/bgra - auto rgb = static_cast(rgb_dest); // rgb/bgr - if (bInvert) { - rgb += rgbsize; // end of rgb buffer - rgb -= rgbpitch; // beginning of the last rgb line - } - - // Swap red and blue option - int ir = 0; int ig = 1; int ib = 2; - if(bSwapRB) { - ir = 2; ib = 0; - } - - unsigned int z = 0; - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - if (bMirror) { - z = (width - x - 1)*3; - *(rgb + z + ir) = *(rgba + 0); // red - *(rgb + z + ig) = *(rgba + 1); // grn - *(rgb + z + ib) = *(rgba + 2); // blu - } - else { - z = x * 3; - *(rgb + z + ir) = *(rgba + 0); // red - *(rgb + z + ig) = *(rgba + 1); // grn - *(rgb + z + ib) = *(rgba + 2); // blu - } - rgba += 4; - } - rgb += width * 3; - rgba += rgba_padding; - - if (bInvert) - rgb -= rgbpitch * 2; // move up a line for invert - } - -} // end rgba2rgb - - -void spoutCopy::rgba2bgr(const void *rgba_source, void *bgr_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - const unsigned long bgrsize = width * height * 3; - const unsigned long bgrpitch = width * 3; - - // Start of buffers - auto rgba = static_cast(rgba_source); // RGBA - auto bgr = static_cast(bgr_dest); // BGR - if (bInvert) { - bgr += bgrsize; // end of rgb buffer - bgr -= bgrpitch; // beginning of the last bgr line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - // rgba source - bgr dest - *(bgr + 0) = *(rgba + 2); // blu - *(bgr + 1) = *(rgba + 1); // grn - *(bgr + 2) = *(rgba + 0); // red - bgr += 3; - rgba += 4; - } - if (bInvert) - bgr -= bgrpitch * 2; // move up a line for invert - } - -} // end rgba2bgr - - -void spoutCopy::rgba2bgr(const void *rgba_source, void *bgr_dest, - unsigned int width, unsigned int height, - unsigned int rgba_pitch, bool bInvert) const -{ - // RGB dest does not have padding - const unsigned long rgbsize = width * height * 3; - const unsigned long rgbpitch = width * 3; - const unsigned long rgba_padding = rgba_pitch - (width * 4); - - // RGBA source may have padding - // Dest and source must be the same dimensions otherwise - - // Start of buffers - auto rgba = static_cast(rgba_source); // rgba/bgra - auto bgr = static_cast(bgr_dest); // rgb/bgr - if (bInvert) { - bgr += rgbsize; // end of rgb buffer - bgr -= rgbpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - *(bgr + 2) = *(rgba + 0); // red - *(bgr + 1) = *(rgba + 1); // grn - *(bgr + 0) = *(rgba + 2); // blu - bgr += 3; - rgba += 4; - } - rgba += rgba_padding; - - if (bInvert) - bgr -= rgbpitch * 2; // move up a line for invert - } - -} // end rgba2bgr - - -void spoutCopy::bgra2rgb(const void *bgra_source, void *rgb_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - const unsigned long rgbsize = width * height * 3; - const unsigned long rgbpitch = width * 3; - - // Start of buffers - auto bgra = static_cast(bgra_source); // BGRA - auto rgb = static_cast(rgb_dest); // RGB - if (bInvert) { - rgb += rgbsize; // end of rgb buffer - rgb -= rgbpitch; // beginning of the last rgb line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - // bgra source - rgb dest - *(rgb + 0) = *(bgra + 2); // red - *(rgb + 1) = *(bgra + 1); // grn - *(rgb + 2) = *(bgra + 0); // blu - rgb += 3; - bgra += 4; - } - if (bInvert) - rgb -= rgbpitch * 2; // move up a line for invert - } - -} // end bgra2rgb - - -void spoutCopy::bgra2bgr(const void *bgra_source, void *bgr_dest, unsigned int width, unsigned int height, bool bInvert) const -{ - const unsigned long bgrsize = width * height * 3; - const unsigned long bgrpitch = width * 3; - - // Start of buffers - auto bgra = static_cast(bgra_source); // BGRA - auto bgr = static_cast(bgr_dest); // BGR - if (bInvert) { - bgr += bgrsize; // end of bgr buffer - bgr -= bgrpitch; // beginning of the last bgr line - } - - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - // bgra source - bgr dest - *(bgr + 2) = *(bgra + 2); // red - *(bgr + 1) = *(bgra + 1); // grn - *(bgr + 0) = *(bgra + 0); // blu - bgr += 3; - bgra += 4; - } - if (bInvert) - bgr -= bgrpitch * 2; // move up a line for invert - } -} // end bgra2bgr - - -void spoutCopy::rgba2rgba(const void* rgba_source, void* rgba_dest, - unsigned int width, unsigned int height, unsigned int sourcePitch, bool bInvert) const -{ - for (unsigned int y = 0; y < height; y++) { - // Start of buffer - auto source = static_cast(rgba_source); // unsigned int = 4 bytes - auto dest = static_cast(rgba_dest); - // Increment to current line - // pitch is line length in bytes. Divide by 4 to get the width in rgba pixels. - if (bInvert) { - source += (unsigned long)((height - 1 - y)*sourcePitch/4); - dest += (unsigned long)(y * width); // dest is not inverted - } - else { - source += (unsigned long)(y * sourcePitch/4); - dest += (unsigned long)(y * width); - } - // Copy the line as fast as possible - CopyPixels((const unsigned char *)source, (unsigned char *)dest, width, 1); - } -} - -void spoutCopy::rgba2rgba(const void* rgba_source, void* rgba_dest, - unsigned int width, unsigned int height, - unsigned int sourcePitch, unsigned int destPitch, bool bInvert) const -{ - // For all rows - for (unsigned int y = 0; y < height; y++) { - // Start of buffers - auto source = static_cast(rgba_source); // unsigned int = 4 bytes - auto dest = static_cast(rgba_dest); - // Increment to current line - // Pitch is line length in bytes. Divide by 4 to get the width in rgba pixels. - if (bInvert) { - source += (unsigned long)((height - 1 - y)*sourcePitch / 4); - dest += (unsigned long)(y * destPitch / 4); // dest is not inverted - } - else { - source += (unsigned long)(y * sourcePitch / 4); - dest += (unsigned long)(y * destPitch / 4); - } - // Copy the line as fast as possible - CopyPixels((const unsigned char *)source, (unsigned char *)dest, width, 1); - } -} - -// Adapted from : -// http://tech-algorithm.com/articles/nearest-neighbor-image-scaling/ -// http://www.cplusplus.com/forum/general/2615/#msg10482 -void spoutCopy::rgba2rgbaResample(const void* source, void* dest, - unsigned int sourceWidth, unsigned int sourceHeight, unsigned int sourcePitch, - unsigned int destWidth, unsigned int destHeight, bool bInvert) const -{ - unsigned char *srcBuffer = (unsigned char *)source; // bgra source - unsigned char *dstBuffer = (unsigned char *)dest; // bgr dest - - // horizontal and vertical ratios between the original image and the to be scaled image - float x_ratio = (float)sourceWidth / (float)destWidth; - float y_ratio = (float)sourceHeight / (float)destHeight; - float px, py; - unsigned int i, j; - unsigned int pixel, nearestMatch; - for (i = 0; i < destHeight; i++) { - for (j = 0; j < destWidth; j++) { - px = floor((float)j*x_ratio); - py = floor((float)i*y_ratio); - if (bInvert) - pixel = (destHeight - i - 1)*destWidth * 4 + j * 4; // flip vertically - else - pixel = i * destWidth * 4 + j * 4; - nearestMatch = (unsigned int)(py*sourcePitch + px * 4); - dstBuffer[pixel + 0] = srcBuffer[nearestMatch + 0]; - dstBuffer[pixel + 1] = srcBuffer[nearestMatch + 1]; - dstBuffer[pixel + 2] = srcBuffer[nearestMatch + 2]; - dstBuffer[pixel + 3] = srcBuffer[nearestMatch + 3]; - } - } -} - - -void spoutCopy::rgba2rgbResample(const void* source, void* dest, - unsigned int sourceWidth, unsigned int sourceHeight, unsigned int sourcePitch, - unsigned int destWidth, unsigned int destHeight, bool bInvert, bool bMirror, bool bSwapRB) const -{ - unsigned char *srcBuffer = (unsigned char *)source; // bgra source - unsigned char *dstBuffer = (unsigned char *)dest; // bgr dest - - float x_ratio = (float)sourceWidth / (float)destWidth; - float y_ratio = (float)sourceHeight / (float)destHeight; - - // Swap red and blue option - int ir = 0; int ig = 1; int ib = 2; - if (bSwapRB) { - ir = 2; ib = 0; - } - - float px, py; - unsigned int i, j; - unsigned int pixel, nearestMatch; - for (i = 0; i < destHeight; i++) { - for (j = 0; j < destWidth; j++) { - px = floor((float)j*x_ratio); - py = floor((float)i*y_ratio); - - if (bMirror) { - if (bInvert) - pixel = (destHeight - i - 1)*destWidth * 3 + (destWidth - j - 1) * 3; // flip vertically - else - pixel = i * destWidth * 3 + (destWidth - j - 1) * 3; - } - else { - if (bInvert) - pixel = (destHeight - i - 1)*destWidth * 3 + j * 3; // flip vertically - else - pixel = i * destWidth * 3 + j * 3; - } - - nearestMatch = (unsigned int)(py*sourcePitch + px * 4); - - dstBuffer[pixel + ir] = srcBuffer[nearestMatch + 0]; - dstBuffer[pixel + ig] = srcBuffer[nearestMatch + 1]; - dstBuffer[pixel + ib] = srcBuffer[nearestMatch + 2]; - } - } -} - -void spoutCopy::rgba2bgrResample(const void* source, void* dest, - unsigned int sourceWidth, unsigned int sourceHeight, unsigned int sourcePitch, - unsigned int destWidth, unsigned int destHeight, bool bInvert) const -{ - unsigned char *srcBuffer = (unsigned char *)source; // bgra source - unsigned char *dstBuffer = (unsigned char *)dest; // bgr dest - - float x_ratio = (float)sourceWidth / (float)destWidth; - float y_ratio = (float)sourceHeight / (float)destHeight; - float px, py; - unsigned int i, j; - unsigned int pixel, nearestMatch; - for (i = 0; i < destHeight; i++) { - for (j = 0; j < destWidth; j++) { - px = floor((float)j*x_ratio); - py = floor((float)i*y_ratio); - if (bInvert) - pixel = (destHeight - i - 1)*destWidth * 3 + j * 3; // flip vertically - else - pixel = i * destWidth * 3 + j * 3; - nearestMatch = (unsigned int)(py*sourcePitch + px * 4); - dstBuffer[pixel + 2] = srcBuffer[nearestMatch + 0]; - dstBuffer[pixel + 1] = srcBuffer[nearestMatch + 1]; - dstBuffer[pixel + 0] = srcBuffer[nearestMatch + 2]; - } - } -} - diff --git a/Plugin/Spout/SpoutGL/SpoutCopy.h b/Plugin/Spout/SpoutGL/SpoutCopy.h deleted file mode 100644 index 3a9b7ae..0000000 --- a/Plugin/Spout/SpoutGL/SpoutCopy.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - - SpoutCopy.h - - Functions to manage pixel buffer copying - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copyright (c) 2016-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once -#ifndef __spoutCopy__ // standard way as well -#define __spoutCopy__ - -#include "SpoutCommon.h" -#include -#include // for debug printf -#include // For OpenGL definitions -#include // for cpuid to test for SSE2 -#include // for SSE2 -#include // for SSSE3 - - -class SPOUT_DLLEXP spoutCopy { - - public: - - spoutCopy(); - ~spoutCopy(); - - // Copy image pixels and select fastest method based on image width - void CopyPixels(const unsigned char *src, unsigned char *dst, - unsigned int width, unsigned int height, - GLenum glFormat = GL_RGBA, bool bInvert = false) const; - - // Flip a pixel buffer in place - void FlipBuffer(const unsigned char *src, unsigned char *dst, - unsigned int width, unsigned int height, - GLenum glFormat = GL_RGBA) const; - - // SSE2 version of memcpy - void memcpy_sse2(void* dst, const void* src, size_t size) const; - - // Copy rgba buffers line by line allowing for source pitch using the fastest method - void rgba2rgba(const void* source, void* dest, unsigned int width, unsigned int height, - unsigned int sourcePitch, bool bInvert = false) const; - - // Copy rgba buffers line allowing for source and destination line pitch - void rgba2rgba(const void* source, void* dest, unsigned int width, unsigned int height, - unsigned int sourcePitch, unsigned int destPitch, bool bInvert) const; - - // Copy rgba buffers of differing size - void rgba2rgbaResample(const void* source, void* dest, - unsigned int sourceWidth, unsigned int sourceHeight, unsigned int sourcePitch, - unsigned int destWidth, unsigned int destHeight, bool bInvert = false) const; - - // Copy rgba to bgra - void rgba2bgra(const void* rgba_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - - // Copy rgba to bgra line by line allowing for source pitch using the fastest method - void rgba2bgra(const void* rgba_source, void *bgra_dest, unsigned int width, unsigned int height, - unsigned int sourcePitch, bool bInvert = false) const; - - // Copy rgba to bgra line allowing for source and destination line pitch - void rgba2bgra(const void* source, void* dest, unsigned int width, unsigned int height, - unsigned int sourcePitch, unsigned int destPitch, bool bInvert) const; - - // Copy bgra to rgba - void bgra2rgba(const void* bgra_source, void *rgba_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - - // Correct for image stride - void RemovePadding(const unsigned char *source, unsigned char *dest, - unsigned int width, unsigned int height, - unsigned int source_stride, GLenum glFormat) const; - - // RGBA<>RGB conversion options - // TODO : add RGBA pitch to all functions - // TODO : avoid redundancy - void rgb2rgba (const void* rgb_source, void *rgba_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - - // Copy RGB to RGBA allowing for destination pitch - void rgb2rgba(const void *rgb_source, void *rgba_dest, - unsigned int width, unsigned int height, - unsigned int dest_pitch, bool bInvert) const; - - void bgr2rgba (const void* bgr_source, void *rgba_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - // BGR to RGBA allowing for destination pitch - void bgr2rgba(const void *rgb_source, void *rgba_dest, - unsigned int width, unsigned int height, - unsigned int dest_pitch, bool bInvert) const; - - void rgb2bgra (const void* rgb_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - - void rgb2bgra(const void *rgb_source, void *bgra_dest, - unsigned int width, unsigned int height, - unsigned int dest_pitch, bool bInvert) const; - - void bgr2bgra (const void* bgr_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - void rgba2bgr (const void* rgba_source, void *bgr_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - void bgra2rgb (const void* bgra_source, void *rgb_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - void bgra2bgr (const void* bgra_source, void *bgr_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - - // Copy RGBA to RGB allowing for source line pitch - void rgba2rgb (const void* rgba_source, void *rgb_dest, unsigned int width, unsigned int height, - unsigned int sourcePitch, bool bInvert = false, bool bMirror = false, bool bSwapRB = false) const; - // Copy RGBA to RGB allowing for source and destination pitch - void rgba2rgbResample(const void* source, void* dest, - unsigned int sourceWidth, unsigned int sourceHeight, unsigned int sourcePitch, - unsigned int destWidth, unsigned int destHeight, - bool bInvert = false, bool bMirror = false, bool bSwapRB = false) const; - // Copy RGBA to BGR allowing for source line pitch - void rgba2bgr(const void* rgba_source, void *rgb_dest, unsigned int width, unsigned int height, - unsigned int sourcePitch, bool bInvert = false) const; - // Copy RGBA to BGR allowing for source and destination pitch - void rgba2bgrResample(const void* source, void* dest, - unsigned int sourceWidth, unsigned int sourceHeight, unsigned int sourcePitch, - unsigned int destWidth, unsigned int destHeight, bool bInvert = false) const; - - protected : - - void CheckSSE(); - bool m_bSSE2; - bool m_bSSE3; - bool m_bSSSE3; - - void rgba_bgra(const void *rgba_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - void rgba_bgra_sse2(const void *rgba_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - void rgba_bgra_sse3(const void *rgba_source, void *bgra_dest, unsigned int width, unsigned int height, bool bInvert = false) const; - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutDirectX.cpp b/Plugin/Spout/SpoutGL/SpoutDirectX.cpp deleted file mode 100644 index 1b17897..0000000 --- a/Plugin/Spout/SpoutGL/SpoutDirectX.cpp +++ /dev/null @@ -1,1036 +0,0 @@ -// -// -// spoutDirectX.cpp -// -// Functions to manage DirectX11 texture sharing -// -// ==================================================================================== -// Revisions : -// -// 22.07.14 - added option for DX9 or DX11 -// 21.09.14 - included keyed mutex texture access lock in CreateSharedDX11Texture -// 23.09.14 - moved general mutex texture access lock to this class -// 23.09.14 - added DX11available() to verify operating system support for DirectX 11 -// 15.10.14 - added debugging aid for texture access locks -// 17.10.14 - flush before release immediate context in CloseDX11 -// 21.10.14 - removed keyed mutex lock due to reported driver problems -// TODO - cleanup all functions using it -// 10.02.15 - removed functions relating to DirectX 11 keyed mutex lock -// 14.02.15 - added UNREFERENCED_PARAMETER(pSharedTexture) to CheckAceess and AllowAccess -// 29.05.15 - Included SetAdapter for multiple adapters - Franz Hildgen. -// 02.06.15 - Added GetAdapter, GetNumAdapters, GetAdapterName -// 08.06.15 - removed dx9 flag from setadapter -// 04.08.15 - cleanup -// 11.08.15 - removed GetAdapterName return if Intel. For use with Intel HD4400/5000 graphics -// 22.10.15 - removed DX11available and shifted it to the interop class -// 19.11.15 - fixed return value in CreateDX9device after caps error (was false instead of NULL) -// 20.11.15 - Registry read/write moved from SpoutGLDXinterop class -// 16.02.16 - IDXGIFactory release - from https://github.com/jossgray/Spout2 -// 29.02.16 - cleanup -// 05.04.16 - removed unused texture pointer from mutex access functions -// 16.06.16 - fixed null device release in SetAdapter - https://github.com/leadedge/Spout2/issues/17 -// 01.07.16 - restored hFocusWindow in CreateDX9device (was set to NULL for testing) -// 04.09.16 - Add create DX11 staging texture -// 16.01.17 - Add WriteDX9surface -// 23.01.17 - pEventQuery->Release() for writeDX9surface -// 02.06.17 - Registry functions moved to SpoutUtils -// - Added Spout error log console output -// 17.03.18 - More error log notices -// - protect against an adapter with no outputs for SetAdapter -// 16.06.18 - change all class variable name prefix from g_ to m_ -// Add GetImmediateContext(); -// - Add ReleaseDX11Texture and ReleaseDX11Device -// 13.11.18 - Remove staging texture functons -// 16.12.18 - Move FlushWait from interop class -// 03.01.19 - Changed to revised registry functions in SpoutUtils -// 27.06.19 - Restored release of existing texture in CreateSharedDX11Texture -// 03.07.19 - Added pointer checks in OpenDX11shareHandle -// 18.09.19 - Changed initial log from notice to to verbose -// for CreateSharedDX9Texture and CreateSharedDX11Texture -// 08.11.19 - removed immediate context check from OpenDX11shareHandle -// 15.03.20 - allow for zero or DX9 format passed in to CreateSharedDX11Texture for utility use -// 16.06.20 - Create separate Wait function -// - Update comments -// 02.09.20 - CreateSharedDX11Texture - test for null pointer to the shared texture pointer -// 03.09.20 - ReleaseDX11Texture -// add log warnings for null device and texture -// add DirectX messages to Output window for debug build -// 06.09.20 - Add output test to SetAdapter -// 08.09.20 - Release all pointers in adapter functions -// Remove failures if no adapter output pending testing -// Add immediate context test before flush in ReleaseDX11Texture -// In case the function is used by a different device. -// 12.09.20 - Re-introduced Optimus Enablement to enforce NVidia Optimus -// Incuding AMD Enduro technology -// Credit to https://github.com/Qlex42 -// 13.09.20 - Remove Optimus enablement again due to use of extern "C" -// 15.09.20 - Changed all result !=S_OK and !=D3D_OK to FAILED macro for consistency -// Correct type cast in CreateDX9device and GetAdapterName -// 16.09.20 - ReleaseDX11Texture - removed log notice for no reference count -// 19.09.20 - Add success notice for SetAdapter -// Add DebugLog function -// Set passed pointer to null in ReleaseDX11Texture -// Clean up comments and logs throughtout -// 21.09.20 - Format specifiers for hex print -// SetAdapter - corrected logs -// 23.09.20 - Change warning logs to error in OpenDX11shareHandle -// 24.09.20 - Change all pointer "= NULL to "= nullptr" -// Change hex printf to 0x%8.8llX -// - Introduce try/catch to OpenDX11shareHandle -// for the possibility of different graphics adapters -// - Corrected compare of different enum types in CreateSharedDX11Texture -// 25.09.20 - Made GetAdapterPointer public -// Add SetAdapterPointer -// 08.10.20 - Re-introduced CreateDX11StagingTexture -// 09.10.20 - Moved DX9 functions to a separate class -// SetAdapter - only DX11 test supported -// Add GetDX11device -// Change GetImmediateContext() to GetDX11Context() -// 23.11.20 - Protect against null in GetAdapterName -// 09.12.20 - CloseDirectX11() in destructor -// 27.12.20 - Change all hex printf to 0x%.7X with PtrToUint helper -// -// ==================================================================================== -/* - - Copyright (c) 2014-2021. Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include "SpoutDirectX.h" - -// -// Class: spoutDirectX -// -// Functions to manage DirectX11 texture sharing. -// -// Refer to source code for documentation. -// - -spoutDirectX::spoutDirectX() { - - // DX11 - m_pd3dDevice = nullptr; - m_pImmediateContext = nullptr; - m_driverType = D3D_DRIVER_TYPE_NULL; - m_featureLevel = D3D_FEATURE_LEVEL_11_0; - - // Output graphics adapter - // Programmer can set for an application - m_AdapterIndex = 0; // Adapter index - m_pAdapterDX11 = nullptr; // DX11 adapter pointer -} - -spoutDirectX::~spoutDirectX() { - if (m_pd3dDevice) - CloseDirectX11(); -} - -bool spoutDirectX::OpenDirectX11() -{ - SpoutLogNotice("spoutDirectX::OpenDirectX11()"); - - // Quit if already initialized - if (m_pd3dDevice) { - SpoutLogNotice(" Device already initialized 0x%.7X", PtrToUint(m_pd3dDevice) ); - return true; - } - - // Create a DirectX 11 device - m_pd3dDevice = CreateDX11device(); - if (!m_pd3dDevice) - return false; - - // Retrieve the context pointer - m_pd3dDevice->GetImmediateContext(&m_pImmediateContext); - - return true; -} - -void spoutDirectX::CloseDirectX11() -{ - SpoutLogNotice("spoutDirectX::CloseDirectX11()"); - - // Quit if already initialized - if (!m_pd3dDevice) { - SpoutLogNotice(" Device already released"); - return; - } - - if (m_pImmediateContext) - m_pImmediateContext->Release(); - m_pd3dDevice->Release(); - - m_pd3dDevice = nullptr; - m_pImmediateContext = nullptr; - -} - - -// -// Notes for DX11 : https://www.opengl.org/registry/specs/NV/DX_interop2.txt -// -// Valid device types for the parameter of wglDXOpenDeviceNV and associated restrictions -// DirectX device type ID3D11Device - can only be used on WDDM operating systems; XXX Must be multithreaded -// TEXTURE_2D - ID3D11Texture2D - Usage flags must be D3D11_USAGE_DEFAULT -// wglDXSetResourceShareHandle does not need to be called for DirectX version -// 10 and 11 resources. Calling this function for DirectX 10 and 11 resources -// is not an error but has no effect. - -// Create DX11 device -ID3D11Device* spoutDirectX::CreateDX11device() -{ - ID3D11Device* pd3dDevice = nullptr; - HRESULT hr = S_OK; - UINT createDeviceFlags = 0; - IDXGIAdapter* pAdapterDX11 = m_pAdapterDX11; - - SpoutLogNotice("spoutDirectX::CreateDX11device - pAdapterDX11 (0x%.7X)", PtrToUint(m_pAdapterDX11) ); - - // - // If the project is in a debug build, enable debugging via SDK Layers with this flag. - // https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_create_device_flag - // To use this flag, you must have D3D11_1SDKLayers.dll installed or device creation fails. - // To resolve this you can install the Windows 10 SDK. - // - // Due to this dependency problem, you have to manually remove the comments below to enable it. - // See also : void spoutDirectX::DebugLog - // - -/* -#if defined(_DEBUG) - createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; -#endif -*/ - - // GL/DX interop Spec - // ID3D11Device can only be used on WDDM operating systems : Must be multithreaded - // D3D11_CREATE_DEVICE_FLAG createDeviceFlags - D3D_DRIVER_TYPE driverTypes[] = { - D3D_DRIVER_TYPE_HARDWARE, - D3D_DRIVER_TYPE_WARP, - D3D_DRIVER_TYPE_REFERENCE, - }; - - UINT numDriverTypes = ARRAYSIZE( driverTypes ); - - // These are the feature levels that we will accept. - // m_featureLevel is the feature level used - // 11.0 is the highest level currently supported for Spout - // because 11.1 limits compatibility - // Note from D3D11 Walbourn examples : - // DirectX 11.0 platforms will not recognize D3D_FEATURE_LEVEL_11_1 - // Note from NVIDIA forums : - // Not all DirectX 11.1 features are software features. - // Target Independent Rasterization requires hardware support - // so we can not make DX11 GPUs fully DX11.1 complaint. - D3D_FEATURE_LEVEL featureLevels[] = { - // D3D_FEATURE_LEVEL_11_1, // 0xb001 - D3D_FEATURE_LEVEL_11_0, // 0xb000 - D3D_FEATURE_LEVEL_10_1, // 0xa100 - D3D_FEATURE_LEVEL_10_0, // 0xa000 - }; - - UINT numFeatureLevels = ARRAYSIZE( featureLevels ); - - // To allow for multiple graphics cards we will use m_pAdapterDX11 - // Which is set by SetAdapter before initializing DirectX - if(pAdapterDX11) { - hr = D3D11CreateDevice( pAdapterDX11, - D3D_DRIVER_TYPE_UNKNOWN, - NULL, - createDeviceFlags, - featureLevels, - numFeatureLevels, - D3D11_SDK_VERSION, - &pd3dDevice, - &m_featureLevel, - &m_pImmediateContext ); - - } // endif adapter set - else { - - // Possible Optimus problem : is the default adapter (NULL) always Intel ? - // https://msdn.microsoft.com/en-us/library/windows/desktop/ff476082%28v=vs.85%29.aspx - // pAdapter : a pointer to the video adapter to use when creating a device. - // Pass NULL to use the default adapter, which is the first adapter that is - // enumerated by IDXGIFactory1::EnumAdapters. - // http://www.gamedev.net/topic/645920-d3d11createdevice-returns-wrong-feature-level/ - - for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ ) { - - m_driverType = driverTypes[driverTypeIndex]; - - hr = D3D11CreateDevice( NULL, - m_driverType, - NULL, - createDeviceFlags, - featureLevels, - numFeatureLevels, - D3D11_SDK_VERSION, - &pd3dDevice, - &m_featureLevel, - &m_pImmediateContext); - - // Break as soon as something passes - if(SUCCEEDED(hr)) - break; - } - - } // endif no adapter set - - // Quit if nothing worked - if (FAILED(hr)) { - SpoutLogFatal("spoutDirectX::CreateDX11device NULL device"); - return NULL; - } - - // All OK - return the device pointer to the caller - SpoutLogNotice(" device (0x%.7X)", PtrToUint(pd3dDevice) ); - - return pd3dDevice; - -} // end CreateDX11device - - -bool spoutDirectX::CreateSharedDX11Texture(ID3D11Device* pd3dDevice, - unsigned int width, - unsigned int height, - DXGI_FORMAT format, - ID3D11Texture2D** ppSharedTexture, - HANDLE &dxShareHandle) -{ - if (!pd3dDevice) { - SpoutLogFatal("spoutDirectX::CreateSharedDX11Texture NULL device"); - return false; - } - - if (!ppSharedTexture) { - SpoutLogWarning("spoutDirectX::CreateSharedDX11Texture NULL ppSharedTexture"); - return false; - } - SpoutLogNotice("spoutDirectX::CreateSharedDX11Texture"); - - // - // Create a new shared DX11 texture - // - - // Release the texture if it already exists - if (*ppSharedTexture) { - ReleaseDX11Texture(pd3dDevice, *ppSharedTexture); - } - - ID3D11Texture2D* pTexture = nullptr; // The new texture pointer - - SpoutLogVerbose("spoutDirectX::CreateSharedDX11Texture"); - SpoutLogVerbose(" pDevice = 0x%.7X, width = %d, height = %d, format = %d", PtrToUint(pd3dDevice), width, height, format); - - // Use the format passed in - // If that is zero or DX9 format, use the default format - DXGI_FORMAT texformat = DXGI_FORMAT_B8G8R8A8_UNORM; - if (format != 0 && format != 21) // D3DFMT_A8R8G8B8 = 21 - texformat = format; - - // Textures being shared from D3D9 to D3D11 have the following restrictions (LJ - D3D11 to D3D9 ?). - // Textures must be 2D - // Only 1 mip level is allowed - // Texture must have default usage - // Texture must be write only - ?? LJ ?? - // MSAA textures are not allowed - // Bind flags must have SHADER_RESOURCE and RENDER_TARGET set - // Only R10G10B10A2_UNORM, R16G16B16A16_FLOAT and R8G8B8A8_UNORM formats are allowed - ?? LJ ?? - // If a shared texture is updated on one device ID3D11DeviceContext::Flush must be called on that device ** - - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476903%28v=vs.85%29.aspx - // To share a resource between two Direct3D 11 devices the resource must have been created - // with the D3D11_RESOURCE_MISC_SHARED flag, if it was created using the ID3D11Device interface. - // - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = width; - desc.Height = height; - desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; - desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; // This texture will be shared - // desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; - // Note that a DirectX 11 texture with D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX is not - // compatible with DirectX 9 so a general named mutex is used for all texture types - desc.CPUAccessFlags = 0; - desc.Format = texformat; - desc.Usage = D3D11_USAGE_DEFAULT; - // Multisampling quality and count - // The default sampler mode, with no anti-aliasing, has a count of 1 and a quality level of 0. - desc.SampleDesc.Quality = 0; - desc.SampleDesc.Count = 1; - desc.MipLevels = 1; - desc.ArraySize = 1; - - HRESULT res = pd3dDevice->CreateTexture2D(&desc, NULL, &pTexture); - - if (FAILED(res)) { - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476174%28v=vs.85%29.aspx - char tmp[256]; - // TODO : check for compiler warning with "l" prefix - sprintf_s(tmp, 256, "spoutDirectX::CreateSharedDX11Texture ERROR - [0x%.X] : ", LOWORD(res) ); - switch (LOWORD(res) ) { - case DXGI_ERROR_INVALID_CALL: - strcat_s(tmp, 256, "DXGI_ERROR_INVALID_CALL"); - break; - case E_INVALIDARG: - strcat_s(tmp, 256, "E_INVALIDARG"); - break; - case E_OUTOFMEMORY: - strcat_s(tmp, 256, "E_OUTOFMEMORY"); - break; - default : - strcat_s(tmp, 256, "Unlisted error"); - break; - } - SpoutLogFatal("%s", tmp); - return false; - } - - // The DX11 texture is created OK - // Get the texture share handle so it can be saved in shared memory for receivers to pick up. - // When sharing a resource between two Direct3D 10/11 devices the unique handle - // of the resource can be obtained by querying the resource for the IDXGIResource - // interface and then calling GetSharedHandle. - IDXGIResource* pOtherResource(NULL); - if(FAILED(pTexture->QueryInterface( __uuidof(IDXGIResource), (void**)&pOtherResource))) { - SpoutLogFatal("spoutDirectX::CreateSharedDX11Texture - QueryInterface error"); - return false; - } - - // Return the shared texture handle - pOtherResource->GetSharedHandle(&dxShareHandle); - pOtherResource->Release(); - - *ppSharedTexture = pTexture; - - SpoutLogNotice(" pTexture = 0x%.7X : dxShareHandle = 0x%.7X", PtrToUint(pTexture), LOWORD(dxShareHandle) ); - - return true; - -} - - -// Create a DirectX 11 staging texture for read and write -bool spoutDirectX::CreateDX11StagingTexture(ID3D11Device* pd3dDevice, - unsigned int width, unsigned int height, DXGI_FORMAT format, ID3D11Texture2D** ppStagingTexture) -{ - if (pd3dDevice == NULL) return false; - - SpoutLogNotice("spoutDirectX::CreateDX11StagingTexture"); - - // Release the texture if it already exists - if (*ppStagingTexture) { - ReleaseDX11Texture(pd3dDevice, *ppStagingTexture); - } - - ID3D11Texture2D* pTexture = nullptr; // The new texture pointer - - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = format; - desc.SampleDesc.Count = 1; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; - desc.Usage = D3D11_USAGE_STAGING; - desc.BindFlags = 0; - - HRESULT res = pd3dDevice->CreateTexture2D(&desc, NULL, &pTexture); - - if (res != S_OK) { - // http://msdn.microsoft.com/en-us/library/windows/desktop/ff476174%28v=vs.85%29.aspx - char tmp[256]; - sprintf_s(tmp, 256, "spoutDirectX::CreateDX11StagingTexture ERROR : [0x%.X] : ", LOWORD(res) ); - switch (LOWORD(res) ) { - case DXGI_ERROR_INVALID_CALL: - strcat_s(tmp, 256, "DXGI_ERROR_INVALID_CALL"); - break; - case E_INVALIDARG: - strcat_s(tmp, 256, "E_INVALIDARG"); - break; - case E_OUTOFMEMORY: - strcat_s(tmp, 256, "E_OUTOFMEMORY"); - break; - default: - strcat_s(tmp, 256, "Unlisted error"); - break; - } - SpoutLogFatal("%s", tmp); - return false; - } - - *ppStagingTexture = pTexture; - - SpoutLogNotice(" pTexture = 0x%.7X", PtrToUint(pTexture)); - - return true; - -} - - -bool spoutDirectX::OpenDX11shareHandle(ID3D11Device* pDevice, ID3D11Texture2D** ppSharedTexture, HANDLE dxShareHandle) -{ - - if (!pDevice || !ppSharedTexture || !dxShareHandle) { - SpoutLogError("spoutDirectX::OpenDX11shareHandle - null sources"); - return false; - } - - // To share a resource between a Direct3D 9 device and a Direct3D 11 device - // the texture must have been created using the pSharedHandle argument of CreateTexture. - // The shared Direct3D 9 handle is then passed to OpenSharedResource in the hResource argument. - // - // Note that the resource created for use on this device must be eventually freed or there is a leak. - // - // This can crash if the share handle has been created using a different graphics adapter - try { - HRESULT hr = pDevice->OpenSharedResource(dxShareHandle, __uuidof(ID3D11Resource), (void**)(ppSharedTexture)); - if (FAILED(hr)) { - SpoutLogError("spoutDirectX::OpenDX11shareHandle (0x%.7X) failed", LOWORD(dxShareHandle)); - return false; - } - } - catch (...) { - // Catch any exception - SpoutLogError("spoutDirectX::OpenDX11shareHandle - exception opening share handle"); - return false; - } - - - /* - // Can get sender format here - ID3D11Texture2D * texturePointer = *ppSharedTexture; - D3D11_TEXTURE2D_DESC td; - texturePointer->GetDesc(&td); - printf("td.Format = %d\n", td.Format); // 87 - printf("td.Width = %d\n", td.Width); - printf("td.Height = %d\n", td.Height); - printf("td.MipLevels = %d\n", td.MipLevels); - printf("td.Usage = %d\n", td.Usage); - printf("td.ArraySize = %d\n", td.ArraySize); - printf("td.SampleDesc = %d\n", td.SampleDesc); - printf("td.BindFlags = %d\n", td.BindFlags); - printf("td.MiscFlags = %d\n", td.MiscFlags); // D3D11_RESOURCE_MISC_SHARED - */ - - - return true; - -} - -// Get device -ID3D11Device* spoutDirectX::GetDX11Device() -{ - return m_pd3dDevice; -} - -// Get context -ID3D11DeviceContext* spoutDirectX::GetDX11Context() -{ - return m_pImmediateContext; -} - -// Set required graphics adapter for output -bool spoutDirectX::SetAdapter(int index) -{ - char adaptername[128]; - IDXGIAdapter* pAdapter = nullptr; - - // Reset to default - if (index == -1) - index = 0; - - // Is the requested adapter available - int n = GetNumAdapters(); - if (index > n - 1) { - SpoutLogError("spoutDirectX::SetAdapter - index %d greater than number of adapters %d", index, n); - return false; - } - - // Must be able to get the name - if(!GetAdapterName(index, adaptername, 128)) { - SpoutLogError("spoutDirectX::SetAdapter - could not get name for adapter %d", index); - return false; - } - - SpoutLogNotice("spoutDirectX::SetAdapter(%d) [%s]", index, adaptername); - - // Get the adapter pointer for DX11 CreateDevice to use - if (m_pAdapterDX11) m_pAdapterDX11->Release(); - pAdapter = GetAdapterPointer(index); - if(!pAdapter) { - SpoutLogError("spoutDirectX::SetAdapter - could not get pointer for adapter %d", index); - return false; - } - - // Set the global adapter index (used for DX9 and to retrieve the index) - m_AdapterIndex = index; - - // Set the adapter pointer for DX11 - m_pAdapterDX11 = pAdapter; - - // In case of remaining incompatibility with the selected adapter, test everything here - - // For >= 2.007 only DX11 test is supported - SpoutLogNotice(" creating test device"); - - // Try to create a DirectX 11 device - ID3D11Device* pd3dDevice = CreateDX11device(); - if(!pd3dDevice) { - SpoutLogError("spoutDirectX::SetAdapter - could not create DX11 device for adapter %d", index); - pAdapter->Release(); - m_AdapterIndex = 0; - m_pAdapterDX11 = nullptr; - return false; - } - // Close the device because this is just a test - // See : https://github.com/leadedge/Spout2/issues/17 - ReleaseDX11Device(pd3dDevice); - - // Selected adapter OK - SpoutLogNotice(" successfully set adapter %d [%s]", m_AdapterIndex, adaptername); - - return true; - -} - -// Get the global adapter index -int spoutDirectX::GetAdapter() -{ - return m_AdapterIndex; -} - - -// FOR DEBUGGING -bool spoutDirectX::FindNVIDIA(int &nAdapter) -{ - IDXGIFactory1* _dxgi_factory1; - IDXGIAdapter* adapter1_ptr = nullptr; - DXGI_ADAPTER_DESC desc; - UINT32 i; - bool bFound = false; - - if ( FAILED( CreateDXGIFactory1( __uuidof(IDXGIFactory1), (void**)&_dxgi_factory1 ) ) ) - return false; - - for ( i = 0; _dxgi_factory1->EnumAdapters( i, &adapter1_ptr ) != DXGI_ERROR_NOT_FOUND; i++ ) { - adapter1_ptr->GetDesc( &desc ); - // printf("spoutDirectX::FindNVIDIA - Adapter(%d) : %S\n", i, desc.Description ); - DXGI_OUTPUT_DESC desc_out; - IDXGIOutput* p_output = nullptr; - if(adapter1_ptr->EnumOutputs(0, &p_output ) == DXGI_ERROR_NOT_FOUND) { - // printf(" No outputs\n"); - continue; - } - - for ( UINT32 j = 0; adapter1_ptr->EnumOutputs( j, &p_output ) != DXGI_ERROR_NOT_FOUND; j++ ) { - if (p_output) { - p_output->GetDesc(&desc_out); - // printf( " Output : %d\n", j ); - // printf( " Name %S\n", desc_out.DeviceName ); - // printf( " Attached to desktop : (%d) %s\n", desc_out.AttachedToDesktop, desc_out.AttachedToDesktop ? "yes" : "no" ); - // printf( " Rotation : %d\n", desc_out.Rotation ); - // printf( " Left : %d\n", desc_out.DesktopCoordinates.left ); - // printf( " Top : %d\n", desc_out.DesktopCoordinates.top ); - // printf( " Right : %d\n", desc_out.DesktopCoordinates.right ); - // printf( " Bottom : %d\n", desc_out.DesktopCoordinates.bottom ); - p_output->Release(); - } - } - adapter1_ptr->Release(); - - if(wcsstr(desc.Description, L"NVIDIA")) { - // printf("spoutDirectX::FindNVIDIA - Found NVIDIA adapter %d (%S)\n", i, desc.Description); - bFound = true; - break; - } - - } - - _dxgi_factory1->Release(); - - if(bFound) { - // printf// ("spoutDirectX::FindNVIDIA - Found NVIDIA adapter %d (%S)\n", i, desc.Description); - nAdapter = static_cast(i); - // 0x10DE NVIDIA - // 0x163C intel - // 0x8086 Intel - // 0x8087 Intel - // printf("Vendor = %d [0x%.7X]\n", desc.VendorId, desc.VendorId); - // printf("Revision = %d [0x%.7X]\n", desc.Revision, desc.Revision); - // printf("Device ID = %d [0x%.7X]\n", desc.DeviceId, desc.DeviceId); - // printf("SubSys ID = %d [0x%.7X]\n", desc.SubSysId, desc.SubSysId); - return true; - } - - return false; - -} - - -// Get the number of graphics adapters in the system -int spoutDirectX::GetNumAdapters() -{ - IDXGIFactory1* _dxgi_factory1; - IDXGIAdapter* adapter1_ptr = nullptr; - UINT32 i; - - // Enum Adapters first : multiple video cards - if (FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&_dxgi_factory1))) { - SpoutLogError("spoutDirectX::GetNumAdapters - No adapters found"); - return 0; - } - - for (i = 0; _dxgi_factory1->EnumAdapters( i, &adapter1_ptr ) != DXGI_ERROR_NOT_FOUND; i++ ) { - - DXGI_ADAPTER_DESC desc; - adapter1_ptr->GetDesc( &desc ); - // printf("Adapter(%d) : %S\n", i, desc.Description ); - // printf(" Vendor Id : %d\n", desc.VendorId ); - // printf(" Dedicated System Memory : %.0f MiB\n", (float)desc.DedicatedSystemMemory / (1024.f * 1024.f) ); - // printf(" Dedicated Video Memory : %.0f MiB\n", (float)desc.DedicatedVideoMemory / (1024.f * 1024.f) ); - // printf(" Shared System Memory : %.0f MiB\n", (float)desc.SharedSystemMemory / (1024.f * 1024.f) ); - - IDXGIOutput* p_output = nullptr; - // 24-10-18 change from error to warning - // - if(adapter1_ptr->EnumOutputs(0, &p_output ) == DXGI_ERROR_NOT_FOUND) { - // SpoutLogWarning("spoutDirectX::GetNumAdapters Adapter(%d) : No outputs", i); - } - - DXGI_OUTPUT_DESC desc_out; - for ( UINT32 j = 0; adapter1_ptr->EnumOutputs( j, &p_output ) != DXGI_ERROR_NOT_FOUND; j++ ) { - if (p_output) { - p_output->GetDesc(&desc_out); - // printf(" Output : %d\n", j ); - // printf(" Name %S\n", desc_out.DeviceName ); - // printf(" Attached to desktop : (%d) %s\n", desc_out.AttachedToDesktop, desc_out.AttachedToDesktop ? "yes" : "no" ); - // printf(" Rotation : %d\n", desc_out.Rotation ); - // printf(" Left : %d\n", desc_out.DesktopCoordinates.left ); - // printf(" Top : %d\n", desc_out.DesktopCoordinates.top ); - // printf(" Right : %d\n", desc_out.DesktopCoordinates.right ); - // printf(" Bottom : %d\n", desc_out.DesktopCoordinates.bottom ); - p_output->Release(); - } - } - adapter1_ptr->Release(); - } - - _dxgi_factory1->Release(); - - return (int)i; - -} - -// Get an adapter name -bool spoutDirectX::GetAdapterName(int index, char *adaptername, int maxchars) -{ - if (!adaptername) - return false; - - IDXGIFactory1* _dxgi_factory1; - IDXGIAdapter* adapter1_ptr = nullptr; - - if (FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&_dxgi_factory1))) { - SpoutLogError("spoutDirectX::GetAdapterName - Could not create CreateDXGIFactory1"); - return false; - } - - for (UINT32 i = 0; _dxgi_factory1->EnumAdapters( i, &adapter1_ptr ) != DXGI_ERROR_NOT_FOUND; i++ ) { - if((int)i == index) { - DXGI_ADAPTER_DESC desc; - adapter1_ptr->GetDesc( &desc ); - size_t charsConverted = 0; - size_t maxBytes = static_cast(maxchars); - wcstombs_s(&charsConverted, adaptername, maxBytes, desc.Description, maxBytes - 1); - adapter1_ptr->Release(); - _dxgi_factory1->Release(); - return true; - } - adapter1_ptr->Release(); - } - - _dxgi_factory1->Release(); - - return false; -} - -IDXGIAdapter* spoutDirectX::GetAdapterPointer(int index) -{ - // Return the current pointer for default - if (index < 0) - return m_pAdapterDX11; - - // Enum Adapters first : multiple video cards - IDXGIFactory1* _dxgi_factory1; - if ( FAILED( CreateDXGIFactory1( __uuidof(IDXGIFactory1), (void**)&_dxgi_factory1 ) ) ) { - SpoutLogError("spoutDirectX::GetAdapterPointer - Could not create CreateDXGIFactory1" ); - return nullptr; - } - - IDXGIAdapter* adapter1_ptr = nullptr; - for ( UINT32 i = 0; _dxgi_factory1->EnumAdapters( i, &adapter1_ptr ) != DXGI_ERROR_NOT_FOUND; i++ ) { - if ( index == (int)i ) { - // Break when the requested index is found - - /* - // Removed pending testing - // Now we have the requested adapter (17-03-18) test for an output on the adapter - IDXGIOutput* p_output = nullptr; - if (adapter1_ptr->EnumOutputs(0, &p_output) == DXGI_ERROR_NOT_FOUND) { - SpoutLogError("spoutDirectX::GetAdapterPointer(%d) : No outputs", i); - adapter1_ptr->Release(); - _dxgi_factory1->Release(); - return nullptr; - } - */ - - _dxgi_factory1->Release(); - return adapter1_ptr; - } - adapter1_ptr->Release(); - } - _dxgi_factory1->Release(); - - return nullptr; -} - -bool spoutDirectX::GetAdapterInfo(char *adapter, char *display, int maxchars) -{ - IDXGIFactory1* _dxgi_factory1; - IDXGIAdapter* adapter1_ptr = nullptr; - UINT32 i; - size_t charsConverted = 0; - size_t maxBytes = static_cast(maxchars); - - // Enum Adapters first : multiple video cards - if (FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&_dxgi_factory1))) { - SpoutLogError("spoutDirectX::GetAdapterInfo - Could not create CreateDXGIFactory1"); - return false; - } - - DXGI_ADAPTER_DESC desc; - for ( i = 0; _dxgi_factory1->EnumAdapters( i, &adapter1_ptr ) != DXGI_ERROR_NOT_FOUND; i++ ) { - adapter1_ptr->GetDesc( &desc ); - // Return the current adapter - max of 2 assumed - wcstombs_s(&charsConverted, adapter, maxBytes, desc.Description, maxBytes-1); - IDXGIOutput* p_output = nullptr; - for ( UINT32 j = 0; adapter1_ptr->EnumOutputs( j, &p_output ) != DXGI_ERROR_NOT_FOUND; j++ ) { - DXGI_OUTPUT_DESC desc_out; - if (p_output) { - p_output->GetDesc(&desc_out); - if (desc_out.AttachedToDesktop) - wcstombs_s(&charsConverted, display, maxBytes, desc.Description, maxBytes - 1); - p_output->Release(); - } - } - } - _dxgi_factory1->Release(); - return true; -} - -void spoutDirectX::SetAdapterPointer(IDXGIAdapter* pAdapter) -{ - m_pAdapterDX11 = pAdapter; -} - -unsigned long spoutDirectX::ReleaseDX11Texture(ID3D11Device* pd3dDevice, ID3D11Texture2D* pTexture) -{ - - if (!pd3dDevice || !pTexture) { - if (!pd3dDevice) - SpoutLogWarning("spoutDirectX::ReleaseDX11Texture - no device"); - if (!pTexture) - SpoutLogWarning("spoutDirectX::ReleaseDX11Texture - no texture"); - return 0; - } - - SpoutLogNotice("spoutDirectX::ReleaseDX11Texture (0x%.7X)", PtrToUint(pd3dDevice) ); - - unsigned long refcount = pTexture->Release(); - pTexture = nullptr; - - // Flush to put the release at the top of the queue - if(m_pImmediateContext) - m_pImmediateContext->Flush(); - - // The device will be live, so warn if refcount > 1 - if (refcount > 1) { - SpoutLogWarning("spoutDirectX::ReleaseDX11Texture - refcount = %lu", refcount); - DebugLog(pd3dDevice, "spoutDirectX::ReleaseDX11Texture - refcount = %lu\n", refcount); - } - - // Note that if the texture is registered and linked to OpenGL using the - // GL/DX interop, the interop must be unregistered or the texture is not - // released even though the reference count reported here does not increase. - - return refcount; -} - - -unsigned long spoutDirectX::ReleaseDX11Device(ID3D11Device* pd3dDevice) -{ - if (!pd3dDevice) - return 0; - - SpoutLogNotice("spoutDirectX::ReleaseDX11Device (0x%.7X)", PtrToUint(pd3dDevice)); - - // Release the global context or there is an outstanding ref count - // when the device is released - if (m_pImmediateContext) { - // Clear state and flush context to prevent deferred device release - // From Microsoft docs : - // https://msdn.microsoft.com/en-us/library/windows/desktop/ff476425(v=vs.85).aspx - // Microsoft Direct3D 11 defers the destruction of objects. - // Therefore, an application can't rely upon objects immediately being destroyed. - // By calling Flush, you destroy any objects whose destruction was deferred. - // If an application requires synchronous destruction of an object, we recommend - // that the application release all its references, call - // ID3D11DeviceContext::ClearState, and then call Flush. - m_pImmediateContext->ClearState(); - m_pImmediateContext->Flush(); - m_pImmediateContext->Release(); - m_pImmediateContext = nullptr; - } - - // TODO : Release adapter pointer if there is one ? - // if (m_pAdapterDX11) - // m_pAdapterDX11->Release(); - - unsigned long refcount = pd3dDevice->Release(); - pd3dDevice = nullptr; - - if (refcount > 0) { - SpoutLogWarning("spoutDirectX::ReleaseDX11Device - refcount = %lu", refcount); - DebugLog(pd3dDevice, "spoutDirectX::ReleaseDX11Device - refcount = %lu\n", refcount); - } - - return refcount; -} - -// -// For a DX11 sender : -// If a shared texture is updated on one device ID3D11DeviceContext::Flush must be called on that device. -// https://docs.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11device-opensharedresource -// Only the sender updates the shared texture. It is not required for the receiver. -// The application can either call Flush alone or combine a flush and Wait using this function. -// -// For an OpenGL sender : -// This function is not necessary, the GL/DX interop performs the necessary flushing. -// -void spoutDirectX::FlushWait(ID3D11Device* pd3dDevice, ID3D11DeviceContext* pImmediateContext) -{ - if (!pd3dDevice || !pImmediateContext) - return; - - // (Approx 250 microseconds 0.25 msec) - pImmediateContext->Flush(); - - // CopyResource and Flush are both asynchronous. - // https://msdn.microsoft.com/en-us/library/windows/desktop/bb205132%28v=vs.85%29.aspx#Performance_Considerations - // Here we can wait for the copy and flush to finish before accessing the texture - // (Approx 550 microseconds 0.55 msec) - // Practical testing recommended - Wait(pd3dDevice, pImmediateContext); -} - - -void spoutDirectX::Wait(ID3D11Device* pd3dDevice, ID3D11DeviceContext* pImmediateContext) -{ - // https://msdn.microsoft.com/en-us/library/windows/desktop/ff476578%28v=vs.85%29.aspx - // When the GPU is finished, ID3D11DeviceContext::GetData will return S_OK. - // When using this type of query, ID3D11DeviceContext::Begin is disabled. - D3D11_QUERY_DESC queryDesc; - ID3D11Query * pQuery = nullptr; - ZeroMemory(&queryDesc, sizeof(queryDesc)); - queryDesc.Query = D3D11_QUERY_EVENT; - pd3dDevice->CreateQuery(&queryDesc, &pQuery); - if (pQuery) { - pImmediateContext->End(pQuery); - while (S_OK != pImmediateContext->GetData(pQuery, NULL, 0, 0)); - pQuery->Release(); - } -} - - -void spoutDirectX::DebugLog(ID3D11Device* pd3dDevice, const char* format, ...) -{ - - char dlog[128]; - va_list args; - - // Construct the log - va_start(args, format); - vsprintf_s(dlog, 128, format, args); - va_end(args); - - OutputDebugStringA("\n"); - OutputDebugStringA(dlog); - - // - // Output for debug build - // See comments in : ID3D11Device* spoutDirectX::CreateDX11device() - // -/* -#ifdef _DEBUG - - if (!pd3dDevice) - return; - - ID3D11Debug* DebugDevice = nullptr; - if (pd3dDevice->QueryInterface(__uuidof(ID3D11Debug), (void**)&DebugDevice) == S_OK) { - ID3D11InfoQueue *d3dInfoQueue = nullptr; - if (SUCCEEDED(DebugDevice->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&d3dInfoQueue))) { - d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true); - d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true); - D3D11_MESSAGE_ID hide[] = - { - D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS, - // Add more message IDs here as needed - }; - - D3D11_INFO_QUEUE_FILTER filter; - memset(&filter, 0, sizeof(filter)); - filter.DenyList.NumIDs = _countof(hide); - filter.DenyList.pIDList = hide; - d3dInfoQueue->AddStorageFilterEntries(&filter); - } - - // Print live objects to the debug Output window - DebugDevice->ReportLiveDeviceObjects(D3D11_RLDO_DETAIL); - - DebugDevice->Release(); - } -#else -*/ - - UNREFERENCED_PARAMETER(pd3dDevice); - -// #endif - -} diff --git a/Plugin/Spout/SpoutGL/SpoutDirectX.h b/Plugin/Spout/SpoutGL/SpoutDirectX.h deleted file mode 100644 index 545b1bc..0000000 --- a/Plugin/Spout/SpoutGL/SpoutDirectX.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - - spoutDirectX.h - - Functions to manage DirectX 11 texture sharing - - Copyright (c) 2014 - 2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once -#ifndef __spoutDirectX__ -#define __spoutDirectX__ - -#include "SpoutCommon.h" -#include -#pragma comment (lib, "d3d11.lib")// the Direct3D 11 Library file -#pragma comment (lib, "DXGI.lib") // for CreateDXGIFactory1 - -using namespace spoututils; - -class SPOUT_DLLEXP spoutDirectX { - - public: - - spoutDirectX(); - ~spoutDirectX(); - - // Initialize and prepare DirectX 11 - bool OpenDirectX11(); - // Release DirectX 11 device and context - void CloseDirectX11(); - // Create a DirectX11 device - ID3D11Device* CreateDX11device(); - // Create a DirectX11 shared texture - bool CreateSharedDX11Texture(ID3D11Device* pDevice, unsigned int width, unsigned int height, DXGI_FORMAT format, ID3D11Texture2D** ppSharedTexture, HANDLE &dxShareHandle); - // Create a DirectX11 staging texture - bool CreateDX11StagingTexture(ID3D11Device* pDevice, unsigned int width, unsigned int height, DXGI_FORMAT format, ID3D11Texture2D** pStagingTexture); - // Return the pointer of a DirectX11 shared texture - bool OpenDX11shareHandle(ID3D11Device* pDevice, ID3D11Texture2D** ppSharedTexture, HANDLE dxShareHandle); - - // - // Output graphics adapter - // - - // Get the number of graphics adapters in the system - int GetNumAdapters(); - // Get an adapter name - bool GetAdapterName(int index, char *adaptername, int maxchars); - // Get the current adapter index - int GetAdapter(); - // Set graphics adapter for CreateDX11device from an index - bool SetAdapter(int index); - // Get the current adapter description - bool GetAdapterInfo(char *renderdescription, char *displaydescription, int maxchars); - // Get adapter pointer for a given adapter (-1 means current) - IDXGIAdapter* GetAdapterPointer(int index = -1); - // Set required graphics adapter for CreateDX11device - void SetAdapterPointer(IDXGIAdapter* pAdapter); - // Find the index of the NVIDIA adapter in a multi-adapter system - bool FindNVIDIA(int &nAdapter); - - // - // DirectX11 utiities - // - - // Release a texture resource - unsigned long ReleaseDX11Texture(ID3D11Device* pd3dDevice, ID3D11Texture2D* pTexture); - // Release a device - unsigned long ReleaseDX11Device(ID3D11Device* pd3dDevice); - // Return the class device - ID3D11Device* GetDX11Device(); - // Return the class immediate context - ID3D11DeviceContext* GetDX11Context(); - // Flush immediate context command queue and wait for copleteion - void FlushWait(ID3D11Device* pd3dDevice, ID3D11DeviceContext* pImmediateContext); - // Wait for completion after flush - void Wait(ID3D11Device* pd3dDevice, ID3D11DeviceContext* pImmediateContext); - - protected: - - void DebugLog(ID3D11Device* pd3dDevice, const char* format, ...); - int m_AdapterIndex; // Adapter index - IDXGIAdapter* m_pAdapterDX11; // Adapter pointer - ID3D11Device* m_pd3dDevice; // DX11 device - ID3D11DeviceContext* m_pImmediateContext; - D3D_DRIVER_TYPE m_driverType; - D3D_FEATURE_LEVEL m_featureLevel; - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutFrameCount.cpp b/Plugin/Spout/SpoutGL/SpoutFrameCount.cpp deleted file mode 100644 index ea29089..0000000 --- a/Plugin/Spout/SpoutGL/SpoutFrameCount.cpp +++ /dev/null @@ -1,834 +0,0 @@ -// -// SpoutFrameCount -// -// Semaphore frame counter -// -// ==================================================================================== -// Revisions : -// -// 07.10.18 - project start -// 01.11.18 - Add GetRefreshRate() to set default sender fps to system refresh rate -// 16.11.18 - Profile UpdateSenderFps -// 23.11.18 - Change semaphore access functions to operate within a mutex lock -// 26.11.18 - Add application disable frame counting to avoid variable frame rate problems -// 27.11.18 - Add IsFrameNew -// 02.12.18 - Add sender GetWidth, GetHeight, GetFps and GetFrame -// 23.12.18 - More log warnings -// 26.02.19 - Add IsFrameCountEnabled -// 14.03.19 - CleanupFrameCount - return if no semaphore handle -// - Remove wait warning from CheckAccess() -// 02.04.19 - Profile timing functions -// 24.04.19 - Add HoldFps -// 19.05.19 - Clean up -// 05.06.19 - HoldFps - use std::chrono if VS2015 or greater -// 03.03.20 - Introduce DX11 keyed mutex locks in addition to named mutex -// 11.03.20 - General cleanup -// Result switch for WaitForSingleObject -// 05.05.20 - Mutex access timing tests documented within functions -// 18.06.20 - Update comments -// 06.09.20 - Add more notice logs to EnableFrameCount -// 23.09.20 - Initialize m_lastFrame, m_FrameStart, m_bIsNewFrame -// 24.09.20 - Remove m_FrameStartPtr and m_FrameEndPtr null checks in destructor -// 14.12.10 - independent std::chrono timing for sender frame count and HoldFps -// Testing and code optimization -// 18.12.20 - Add SetFrameCount for registry setting -// 04.02.21 - Reset timers in EnableFrameCount -// -// ==================================================================================== -// -/* - Copyright (c) 2019-2021. Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DICLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "SpoutFrameCount.h" - -// -// Class: spoutFrameCount -// -// Semaphore frame counter. -// -// Refer to source code for documentation. -// - -// ----------------------------------------------- -spoutFrameCount::spoutFrameCount() -{ - m_hAccessMutex = NULL; - m_hCountSemaphore = NULL; - m_SenderName[0] = 0; - m_CountSemaphoreName[0] = 0; - m_FrameCount = 0L; - m_LastFrameCount = 0L; - m_FrameTimeTotal = 0.0; - m_FrameTimeNumber = 0.0; - m_lastFrame = 0.0; - m_FrameStart = 0.0; - m_bIsNewFrame = false; - m_SenderFps = GetRefreshRate(); // Default sender fps is system refresh rate - - // Check the registry setting for frame counting between sender and receiver - m_bFrameCount = false; // default not set - DWORD dwFrame = 0; - if (ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Framecount", &dwFrame)) { - m_bFrameCount = (dwFrame == 1); - } - m_bDisabled = false; // frame counting not application disabled - - // Initialize fps control - m_millisForFrame = 0.0; - -#ifdef USE_CHRONO - // Start std::chrono microsec counting - m_FrameStartPtr = new std::chrono::steady_clock::time_point; - m_FrameEndPtr = new std::chrono::steady_clock::time_point; - m_FramePtr = new std::chrono::steady_clock::time_point; -#else - // Initialize PC msec frequency counter - PCFreq = 0.0; - CounterStart = 0; - StartCounter(); -#endif - -} - -// ----------------------------------------------- -spoutFrameCount::~spoutFrameCount() -{ - -#ifdef USE_CHRONO - delete m_FrameStartPtr; - delete m_FrameEndPtr; - delete m_FramePtr; -#endif - - // Close the frame count semaphore. - if (m_hCountSemaphore) CloseHandle(m_hCountSemaphore); - m_hCountSemaphore = NULL; - - // Close the texture access mutex - if (m_hAccessMutex) CloseHandle(m_hAccessMutex); - m_hAccessMutex = NULL; - -} - - -// ====================================================================== -// Public -// ====================================================================== - -// Enable or disable frame counting globally by registry setting -void spoutFrameCount::SetFrameCount(bool bEnable) -{ - if (bEnable) { - // Frame counting not already set to registry - if (!m_bFrameCount) { - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Framecount", 1); - m_bFrameCount = true; - m_bDisabled = false; // Application disable flag - } - // Do nothing if already set - } - else { - // Frame counting already set to registry - if (m_bFrameCount) { - // Clean up existing objects - if (IsFrameCountEnabled()) - CleanupFrameCount(); - } - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Framecount", 0); - m_bFrameCount = false; - m_bDisabled = false; - } -} - -// ----------------------------------------------- -// -// Create a frame counting semaphore. -// -// Incremented by a sender. -// Tested by a receiver to retrieve the count. -// -void spoutFrameCount::EnableFrameCount(const char* SenderName) -{ - // Return if frame counting not recorded in the registry - // Subsequently SetNewFrame and GetNewFrame return without action - if (!m_bFrameCount) { - SpoutLogNotice("SpoutFrameCount::EnableFrameCount : setting not enabled"); - return; - } - - // Return if application disabled - if (m_bDisabled) { - SpoutLogNotice("SpoutFrameCount::EnableFrameCount : application disabled"); - return; - } - - // A sender name is required - if (SenderName[0] == 0) { - SpoutLogWarning("SpoutFrameCount::EnableFrameCount - no sender name"); - return; - } - - // Reset frame count, comparator and fps variables - m_FrameCount = 0L; - m_LastFrameCount = 0L; - m_FrameTimeTotal = 0.0; - m_FrameTimeNumber = 0.0; - m_SenderFps = GetRefreshRate(); - - // Reset timers - m_millisForFrame = 0.0; -#ifdef USE_CHRONO - // Start std::chrono microsec counting - m_FrameStartPtr = new std::chrono::steady_clock::time_point; - m_FrameEndPtr = new std::chrono::steady_clock::time_point; - m_FramePtr = new std::chrono::steady_clock::time_point; -#else - // Initialize PC msec frequency counter - PCFreq = 0.0; - CounterStart = 0; - StartCounter(); -#endif - - // Return if already enabled for this sender - if (m_hCountSemaphore && strcmp(SenderName, m_SenderName) == 0) { - SpoutLogNotice("SpoutFrameCount::EnableFrameCount already enabled [%s]", SenderName); - return; - } - - SpoutLogNotice("SpoutFrameCount::EnableFrameCount : sender name [%s]", SenderName); - - // Close any existing semaphore - if (m_hCountSemaphore) { - CloseHandle(m_hCountSemaphore); - m_hCountSemaphore = NULL; - m_CountSemaphoreName[0] = 0; - } - - // Set the new name for subsequent checks - strcpy_s(m_SenderName, 256, SenderName); - - // Create or open a semaphore with this sender name - sprintf_s(m_CountSemaphoreName, 256, "%s_Count_Semaphore", SenderName); - HANDLE hSemaphore = CreateSemaphoreA( - NULL, // default security attributes - 1, // initial count - LONG_MAX, // maximum count - LONG_MAX (2147483647) at 60fps = 2071 days - (LPSTR)m_CountSemaphoreName); - - DWORD dwError = GetLastError(); - if (dwError == ERROR_INVALID_HANDLE) { - SpoutLogError(" Invalid semaphore handle"); - return; - } - if (dwError == ERROR_ALREADY_EXISTS) { - SpoutLogNotice(" Semaphore already exists"); - // OK if it already exists - the sender or receiver can create it - } - if (hSemaphore == NULL) { - SpoutLogError(" Unknown error"); - return; - } - - m_hCountSemaphore = hSemaphore; - - SpoutLogNotice(" Semaphore handle [0x%.7X]", LOWORD(m_hCountSemaphore) ); - -} - -// ----------------------------------------------- -void spoutFrameCount::DisableFrameCount() -{ - CleanupFrameCount(); - m_bDisabled = true; -} - -// ----------------------------------------------- -bool spoutFrameCount::IsFrameCountEnabled() -{ - if (!m_bFrameCount || m_bDisabled) - return false; - else - return true; - -} - -// ----------------------------------------------- -// -// Increment the sender frame count. -// Used by a sender for every update of the shared texture. -// -// This function is called within a sender mutex lock so that -// the receiver will not read the semaphore count while the -// sender is incrementing it. -// -// Used internaly to set frame status if frame counting is enabled. -// -void spoutFrameCount::SetNewFrame() -{ - // Return silently if disabled - if (!m_bFrameCount || m_bDisabled) - return; - - // Access the frame count semaphore - // Note: WaitForSingle object will always succeed because - // the lock count (sender frame count) is greater than zero, - // but must be called before ReleaseSemaphore can be called - // or there is an error. - DWORD dwWaitResult = WaitForSingleObject(m_hCountSemaphore, 0); - switch (dwWaitResult) { - case WAIT_OBJECT_0: - // Release the frame counting semaphore to increase it's count. - // so that the receiver can retrieve the new count. - // Increment by 2 because WaitForSingleObject decremented it. - if (ReleaseSemaphore(m_hCountSemaphore, 2, NULL) == false) { - SpoutLogError("spoutFrameCount::SetNewFrame - ReleaseSemaphore failed"); - } - else { - m_FrameCount++; // Increment the sender frame count - // Update the sender fps calculations for the new frame - UpdateSenderFps(1); - } - return; - case WAIT_ABANDONED: - SpoutLogError("SpoutFrameCount::SetNewFrame - WAIT_ABANDONED"); - break; - case WAIT_FAILED: - SpoutLogError("SpoutFrameCount::SetNewFrame - WAIT_FAILED"); - break; - default: - break; - } -} - -// ----------------------------------------------- -// -// Read the semaphore count to determine if the sender -// has produced a new frame and incremented the counter. -// Counts are recorded as class variables for a receiver. -// -// This function is called within a sender mutex lock so that -// the sender will not write a frame and increment the -// count while a receiver is reading it. -// -// Used internally to check frame status if frame counting is enabled. -// -bool spoutFrameCount::GetNewFrame() -{ - long framecount = 0; - - // Return silently if disabled - if (!m_bFrameCount || m_bDisabled) - return true; - - // A receiver creates of opens a named semaphore when it connects to a sender - // Do not block if semaphore creation failed so that ReceiveTexture can still be called - if (!m_hCountSemaphore) { - printf("No count sempaphore\n"); - return true; - } - - // Access the frame count semaphore - DWORD dwWaitResult = WaitForSingleObject(m_hCountSemaphore, 0); - switch (dwWaitResult) { - case WAIT_OBJECT_0: - // Call ReleaseSemaphore with a release count of 1 to return it - // to what it was before the wait and record the previous count. - // The next time round it will either be the same count because - // the receiver released it, or increased because the sender - // released and incremented it. - if (ReleaseSemaphore(m_hCountSemaphore, 1, &framecount) == false) { - SpoutLogError("spoutFrameCount::GetNewFrame - ReleaseSemaphore failed"); - return true; // do not block - } - break; - case WAIT_ABANDONED : - SpoutLogWarning("SpoutFrameCount::GetNewFrame - WAIT_ABANDONED"); - break; - case WAIT_FAILED : - SpoutLogWarning("SpoutFrameCount::GetNewFrame - WAIT_FAILED"); - break; - default : - break; - } - - // Update the global frame count - m_FrameCount = framecount; - - // Count will still be zero for apps that do not set a frame count - if (framecount == 0) - return true; - - // If this count and the last are the same, the sender has not - // produced a new frame and incremented the counter. - // Only return false if this frame and the last are the same. - if (framecount == m_LastFrameCount) { - m_bIsNewFrame = false; - return false; - } - - // Update the sender fps calculations. - // The sender might have produced more than one frame if the receiver is slower. - // Pass the number of frames produced since the last. - UpdateSenderFps(framecount - m_LastFrameCount); - - // Reset the comparator - m_LastFrameCount = framecount; - - // Signal a new frame - m_bIsNewFrame = true; - - return true; -} - - -// ----------------------------------------------- -void spoutFrameCount::CleanupFrameCount() -{ - - // Return if no count semaphore - // i.e. no sender started or cleanup already done - if (!m_hCountSemaphore) - return; - - SpoutLogNotice("SpoutFrameCount::CleanupFrameCount"); - - // Close the frame count semaphore. If another application first - // opened the semaphore it will not be finally closed here. - CloseHandle(m_hCountSemaphore); - m_hCountSemaphore = NULL; - - // Clear the sender name in case the same one opens again - m_SenderName[0] = 0; - - // Reset counters - m_FrameCount = 0L; - m_LastFrameCount = 0L; - m_SenderFps = GetRefreshRate(); - m_FrameTimeTotal = 0.0; - m_FrameTimeNumber = 0.0; - -} - -// ----------------------------------------------- -// -// Is the received frame new ? -// -// This function can be used by a receiver after ReceiveTexture -// to determine whether the frame just received is new. -// -// Used by an application to avoid time consuming processing -// after receiving a texture. -// -// Not usually required because new frame status is always -// checked internally if frame counting is enabled. -// -bool spoutFrameCount::IsFrameNew() -{ - return m_bIsNewFrame; -} - -// ----------------------------------------------- -double spoutFrameCount::GetSenderFps() -{ - return m_SenderFps; -} - -// ----------------------------------------------- -long spoutFrameCount::GetSenderFrame() -{ - return m_FrameCount; -} - -// ----------------------------------------------- -// -// Fps control -// -// Not necessary if the application already has frame rate control. -// Must be called every frame. -// The sender will then signal a new frame at the target rate. -// Purpose is control rather than accuracy. -// Use std::chrono if supported by the compiler VS2015 or greater -// -void spoutFrameCount::HoldFps(int fps) -{ - // Return if incorrect fps entry - if (fps <= 0) - return; - - double framerate = static_cast(fps); - -#ifdef USE_CHRONO - // Initialize frame time at target rate - if (m_millisForFrame < 0.01) { - m_millisForFrame = 1000.0 / framerate; // msec per frame - *m_FrameStartPtr = std::chrono::steady_clock::now(); - SpoutLogNotice("spoutFrameCount::HoldFps(%d)", fps); - } - else { - *m_FrameEndPtr = std::chrono::steady_clock::now(); - // milliseconds elapsed - double elapsedTime = static_cast(std::chrono::duration_cast(*m_FrameEndPtr - *m_FrameStartPtr).count() / 1000.); - // Sleep to reach the target frame time - if (elapsedTime < m_millisForFrame) { // milliseconds - std::this_thread::sleep_for(std::chrono::milliseconds((long)(m_millisForFrame - elapsedTime))); - } - // Set start time for the next frame - *m_FrameStartPtr = std::chrono::steady_clock::now(); - } -#else - if (m_millisForFrame == 0) { - m_millisForFrame = 1000.0 / framerate; - m_FrameStart = GetCounter(); - SpoutLogNotice("spoutFrameCount::HoldFps(%d)", fps); - } - else { - double elapsedTime = GetCounter() - m_FrameStart; // msec - // Sleep to reach the target frame time - if (elapsedTime < m_millisForFrame) - Sleep((DWORD)(m_millisForFrame - elapsedTime)); // can be slighly high - // Set start time for the next frame - m_FrameStart = GetCounter(); - } -#endif - -} - -// ================================================================= -// Texture access mutex -// ================================================================= - -// -// Check access to the shared texture -// -// Use a keyed mutex if the DX11 texture supports it -// otherwise use the sender named mutex. -// The DX11 texture pointer argument should always be null for DX9 mode. -bool spoutFrameCount::CheckTextureAccess(ID3D11Texture2D* D3D11texture) -{ - if (IsKeyedMutex(D3D11texture)) { - return CheckKeyedAccess(D3D11texture); - } - else { - return CheckAccess(); - } -} - -void spoutFrameCount::AllowTextureAccess(ID3D11Texture2D* D3D11texture) -{ - if (IsKeyedMutex(D3D11texture)) - AllowKeyedAccess(D3D11texture); - else - AllowAccess(); -} - -// ----------------------------------------------- -bool spoutFrameCount::CreateAccessMutex(const char *SenderName) -{ - DWORD errnum = 0; - char szMutexName[512]; - HANDLE hMutex = NULL; - - // Create the mutex name to control access to the shared texture - sprintf_s((char*)szMutexName, 512, "%s_SpoutAccessMutex", SenderName); - - // Create or open mutex depending, on whether it already exists or not - // - A sender will create one. - // - A receiver will open for a specific sender. - // A receiver should not open a mutex until a sender is found to connect to. - // If that sender does not have a mutex, one will be created - // and will always be available to the receiver. - // - hMutex = CreateMutexA(NULL, false, (LPCSTR)szMutexName); - - if (hMutex == NULL) { - SpoutLogError("spoutFrameCount::CreateAccessMutex - NULL invalid handle"); - return false; - } - else { - errnum = GetLastError(); - if (errnum == ERROR_INVALID_HANDLE) { - SpoutLogError("spoutFrameCount::CreateAccessMutex - [%s] invalid handle", szMutexName); - return false; - } - // Here we can find if the mutex already exists - else if (errnum == ERROR_ALREADY_EXISTS) { - SpoutLogNotice("spoutFrameCount::CreateAccessMutex - [%s] already exists", szMutexName); - } - else { - SpoutLogNotice("spoutFrameCount::CreateAccessMutex - [%s] created - 0x%.7X", szMutexName, PtrToUint(hMutex) ); - } - } - - m_hAccessMutex = hMutex; - - return true; - -} - -// ----------------------------------------------- -void spoutFrameCount::CloseAccessMutex() -{ - // Close the texture access mutex. If another application first opened - // the mutex it will not be finally closed here. - if (m_hAccessMutex) CloseHandle(m_hAccessMutex); - m_hAccessMutex = NULL; -} - -// ----------------------------------------------- -// Check whether any other process is holding the lock -// and wait for access for up to 4 frames if so. -// For receiving from Version 1 apps with no mutex lock, -// a reader will have created the mutex and will have -// sole access and rely on the interop locks. -bool spoutFrameCount::CheckAccess() -{ - // Don't block if no mutex for Spout1 apps - // or if called when the sender has closed. - // AllowAccess also tests for a null handle. - if (!m_hAccessMutex) - return true; - - // Typically 2-3 microseconds. - // 10 receivers - no increase. - // Note that NVIDIA "Threaded optimization" can cause delay - // for WaitForSingleObject and is set OFF by SpoutSettinngs - - DWORD dwWaitResult = WaitForSingleObject(m_hAccessMutex, 67); // timeout 4 frames at 60fps - switch (dwWaitResult) { - case WAIT_OBJECT_0 : - // The state of the object is signalled. - return true; - case WAIT_ABANDONED: - SpoutLogError("spoutFrameCount::CheckAccess - WAIT_ABANDONED"); - break; - case WAIT_TIMEOUT: // The time-out interval elapsed, and the object's state is nonsignaled. - // This can happen the first time a receiver connects to a sender - // SpoutLogError("CheckAccess - WAIT_TIMEOUT"); - break; - case WAIT_FAILED: // Could use call GetLastError - SpoutLogError("spoutFrameCount::CheckAccess - WAIT_FAILED"); - break; - default: - SpoutLogError("spoutFrameCount::CheckAccess - unknown error"); - break; - } - return false; -} - -// ----------------------------------------------- -// Release named mutex -void spoutFrameCount::AllowAccess() -{ - // < 1 microsecond - // Release ownership of the mutex object. - // The caller must call ReleaseMutex once for each time that the mutex satisfied a wait. - // The ReleaseMutex function fails if the caller does not own the mutex object - if (m_hAccessMutex) - ReleaseMutex(m_hAccessMutex); - -} - - -// =============================================================================== -// Protected -// =============================================================================== - - -// Keyed mutex check -// -// Microsoft docs : -// When a surface is created using the D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX -// value of the D3D10_RESOURCE_MISC_FLAG enumeration, you must call the -// AcquireSync method before rendering to the surface. You must call the -// ReleaseSync method when you are done rendering to a surface. -// -// Tests show that if a DX11 texture has been created with a keyed mutex it must -// be used in place of the sender named mutex or CopyResource fails -// -bool spoutFrameCount::CheckKeyedAccess(ID3D11Texture2D* pTexture) -{ - // 85-90 microseconds - if (pTexture) { - - IDXGIKeyedMutex* pDXGIKeyedMutex = nullptr; - - // Check the keyed mutex - pTexture->QueryInterface(_uuidof(IDXGIKeyedMutex), (void**)&pDXGIKeyedMutex); - if (pDXGIKeyedMutex) { - HRESULT hr = pDXGIKeyedMutex->AcquireSync(0, 67); // TODO - link with SPOUT_WAIT_TIMEOUT - switch (hr) { - case WAIT_OBJECT_0: - // The state of the object is signalled. - pDXGIKeyedMutex->Release(); - return true; - case WAIT_ABANDONED: - SpoutLogError("spoutDirectX::CheckKeyedAccess : WAIT_ABANDONED"); - break; - case WAIT_TIMEOUT: // The time-out interval elapsed, and the object's state is nonsignaled. - SpoutLogError("spoutDirectX::CheckKeyedAccess : WAIT_TIMEOUT"); - break; - default: - break; - } - pDXGIKeyedMutex->ReleaseSync(0); - pDXGIKeyedMutex->Release(); - } - } - return false; -} - -// Release keyed mutex -void spoutFrameCount::AllowKeyedAccess(ID3D11Texture2D* pTexture) -{ - // 22-24 microseconds - if (pTexture) { - IDXGIKeyedMutex* pDXGIKeyedMutex; - pTexture->QueryInterface(_uuidof(IDXGIKeyedMutex), (void**)&pDXGIKeyedMutex); - if (pDXGIKeyedMutex) { - pDXGIKeyedMutex->ReleaseSync(0); - pDXGIKeyedMutex->Release(); - } - } -} - -bool spoutFrameCount::IsKeyedMutex(ID3D11Texture2D* D3D11texture) -{ - // Approximately 1.5 microseconds - if (D3D11texture) { - D3D11_TEXTURE2D_DESC desc; - D3D11texture->GetDesc(&desc); - if (desc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) { - // printf("IsKeyed()\n"); - return true; - } - } - // Return to access by another method if no keyed mutex - return false; -} - - -// ----------------------------------------------- -// Calculate the sender frames per second -// Applications before 2.007 have a frame rate dependent on the system fps -void spoutFrameCount::UpdateSenderFps(long framecount) { - - // 0.0005 msec per frame - - // If framecount is zero, the sender has not produced a new frame yet - if (framecount > 0) { - -#ifdef USE_CHRONO - *m_FrameEndPtr = std::chrono::steady_clock::now(); - // milliseconds elapsed - double frametime = static_cast(std::chrono::duration_cast(*m_FrameEndPtr - *m_FramePtr).count() / 1000.); - // Reset the frame time - *m_FramePtr = std::chrono::steady_clock::now(); -#else - // Msecs between this frame and the last - double thisFrame = GetCounter(); - double frametime = thisFrame-m_lastFrame; - // Set the start time for the next frame - m_lastFrame = thisFrame; -#endif - // Accumulate totals - m_FrameTimeTotal = m_FrameTimeTotal + frametime; - m_FrameTimeNumber += (double)framecount; // Could have been more than one frame - if (m_FrameTimeNumber > 16) { - // Calculate the average frame time every 16 frames - frametime = m_FrameTimeTotal / m_FrameTimeNumber; - m_FrameTimeTotal = 0.0; - m_FrameTimeNumber = 0.0; - // Calculate frames per second (default fps is system refresh rate) - frametime = frametime / 1000.0; // frame time in seconds - if (frametime > 0.0001) { - double fps = (1.0 / frametime); // Fps - m_SenderFps = 0.85*m_SenderFps + 0.15*fps; // damping - } - } - } - -} - -// ----------------------------------------------- -// -// Get system refresh rate for the default fps value -// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumdisplaysettingsa -// -double spoutFrameCount::GetRefreshRate() -{ - double frequency = 60.0; - DEVMODE DevMode; - BOOL bResult = true; - DWORD dwCurrentSettings = 0; - DevMode.dmSize = sizeof(DEVMODE); - // Test all the graphics modes - while (bResult) { - bResult = EnumDisplaySettings(NULL, dwCurrentSettings, &DevMode); - if (bResult) - frequency = static_cast(DevMode.dmDisplayFrequency); - dwCurrentSettings++; - } - return frequency; -} - -// ----------------------------------------------- -// -// Set counter start -// -// Information on using QueryPerformanceFrequency for timing -// https://docs.microsoft.com/en-us/windows/desktop/SysInfo/acquiring-high-resolution-time-stamps -// -// Used instead of std::chrono for Visual Studio before VS2015 -// -void spoutFrameCount::StartCounter() -{ - LARGE_INTEGER li; - if (QueryPerformanceFrequency(&li)) { - // Find the PC frequency if not done yet - if(PCFreq < 0.0001) - PCFreq = static_cast(li.QuadPart) / 1000.0; - // Get the counter start - QueryPerformanceCounter(&li); - CounterStart = li.QuadPart; - } - -} - -// ----------------------------------------------- -// Return msec elapsed since counter start -// -double spoutFrameCount::GetCounter() -{ - LARGE_INTEGER li; - if (QueryPerformanceCounter(&li)) { - return static_cast(li.QuadPart - CounterStart) / PCFreq; - } - else { - return 0.0; - } -} - -// =============================================================================== - - diff --git a/Plugin/Spout/SpoutGL/SpoutFrameCount.h b/Plugin/Spout/SpoutGL/SpoutFrameCount.h deleted file mode 100644 index bc95955..0000000 --- a/Plugin/Spout/SpoutGL/SpoutFrameCount.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - - SpoutFrameCount.h - - Frame counting management - - Copyright (c) 2019-2021. Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#pragma once - -#ifndef __spoutFrameCount__ -#define __spoutFrameCount__ - -#include -#include -#include "SpoutCommon.h" -#include "SpoutSharedMemory.h" -#include // for keyed mutex texture access -#pragma comment (lib, "d3d11.lib") - -using namespace spoututils; - -// USE_CHRONO is defined in SpoutUtils.h -// Note comments about using an early platform toolset -#ifdef USE_CHRONO -#include // c++11 timer -#include -#endif - -class SPOUT_DLLEXP spoutFrameCount { - - public: - - spoutFrameCount(); - ~spoutFrameCount(); - - // Enable or disable frame counting globally - void SetFrameCount(bool bEnable); - // Enable frame counting for this sender - void EnableFrameCount(const char* SenderName); - // Disable frame counting - void DisableFrameCount(); - // Check status of frame counting - bool IsFrameCountEnabled(); - // Is the received frame new - bool IsFrameNew(); - // Received frame rate - double GetSenderFps(); - // Received frame count - long GetSenderFrame(); - // Frame rate control - void HoldFps(int fps); - - // - // Used by other classes - // - - // Sender increment the semaphore count - void SetNewFrame(); - // Receiver read the semaphore count - bool GetNewFrame(); - // For class cleanup functions - void CleanupFrameCount(); - - // - // Mutex locks including DirectX 11 keyed mutex - // - - // Test for texture access using a named sender or keyed texture mutex - bool CheckTextureAccess(ID3D11Texture2D* D3D11texture = nullptr); - // Release mutex and allow textureaccess - void AllowTextureAccess(ID3D11Texture2D* D3D11texture = nullptr); - - // - // Named mutex for shared texture access - // - - // Create named mutex for a sender - bool CreateAccessMutex(const char * SenderName); - // Release the mutex - void CloseAccessMutex(); - // Test access using a named mutex - bool CheckAccess(); - // Allow access after gaining ownership - void AllowAccess(); - -protected : - - // Texture access named mutex - HANDLE m_hAccessMutex; - - // DX11 texture keyed mutex checks - bool CheckKeyedAccess(ID3D11Texture2D* D3D11texture); - void AllowKeyedAccess(ID3D11Texture2D* D3D11texture); - bool IsKeyedMutex(ID3D11Texture2D* D3D11texture); - - // Frame count semaphore - bool m_bFrameCount; // User selection of frame count in SpoutSettings - bool m_bDisabled; // application disable - bool m_bIsNewFrame; // received frame is new - HANDLE m_hCountSemaphore; // semaphore handle - char m_CountSemaphoreName[256]; // semaphore name - char m_SenderName[256]; // sender currently connected to a receiver - long m_FrameCount; // sender frame count - long m_LastFrameCount; // receiver frame comparator - double m_FrameTimeTotal; - double m_FrameTimeNumber; - double m_lastFrame; - - // Sender frame timing - double m_SenderFps; - void UpdateSenderFps(long framecount = 0); - double GetRefreshRate(); - - // Fps control - double m_millisForFrame; - -#ifdef USE_CHRONO - // Avoid C4251 warnings in SpoutLibrary by using pointers - // USE_CHRONO is defined in SpoutUtils.h - std::chrono::steady_clock::time_point * m_FrameStartPtr; - std::chrono::steady_clock::time_point * m_FrameEndPtr; - std::chrono::steady_clock::time_point * m_FramePtr; -#endif - - // PC timer - double PCFreq; - __int64 CounterStart; - double m_FrameStart; - void StartCounter(); - double GetCounter(); - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutGL.cpp b/Plugin/Spout/SpoutGL/SpoutGL.cpp deleted file mode 100644 index fb91f17..0000000 --- a/Plugin/Spout/SpoutGL/SpoutGL.cpp +++ /dev/null @@ -1,2865 +0,0 @@ -// -// SpoutGL -// -// Base class for OpenGL texture sharing using the NVIDIA GL/DX interop extensions -// -// See also - spoutDirectX, spoutSenderNames -// -// ==================================================================================== -// Revisions : -// -// 07.10.20 - Started class based on previous work with SpoutGLDXinterop.cpp -// for 2.006 and 2.007 beta : 15-07-14 - 03-09-20 -// with reference to the SpoutDX class for consolidation of global variables. -// Compatibility with NVIDIA GL/DX interop is tested with fall-back to CPU share -// using DirectX11 staging textures for failure. -// MemoryShare is supported for receive only. -// DX9 support is removed. -// 09.12.20 - Correct ReadDX11texture for staging texture pitch -// 27.12.20 - Functions allocated to SpoutSDK class where appropriate -// 14.01.21 - Add GetDX11Device() and GetDX11Context() -// add bInvert and HostFBO options to WriteTextureReadback -// -// ==================================================================================== -/* - Copyright (c) 2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include "SpoutGL.h" - -// Class: spoutGL -// Base class for OpenGL texture sharing using the NVIDIA GL/DX interop extensions. -// This class should not be used directly because it is the base for the Spout, SpoutSender and SpoutReceiver classes. -// Refer to the SpoutSDK class for documentation and details. -spoutGL::spoutGL() -{ - m_SenderName[0] = 0; - m_SenderNameSetup[0] = 0; - m_Width = 0; - m_Height = 0; - m_dwFormat = (DWORD)DXGI_FORMAT_B8G8R8A8_UNORM; // default sender format - - m_bAuto = true; - m_bUseGLDX = true; - m_bSenderCPUmode = false; - - m_bConnected = false; - m_bNewFrame = false; - m_bInitialized = false; - m_bSpoutPanelOpened = false;; - m_bSpoutPanelActive = false;; - m_bUpdated = false; - m_bMirror = false; - m_bSwapRB = false; - - m_glTexture = 0; - m_TexID = 0; - m_TexWidth = 0; - m_TexHeight = 0; - m_TexFormat = GL_RGBA; - m_fbo = 0; - - m_dxShareHandle = nullptr; // Shared texture handle - m_pSharedTexture = nullptr; // DX11 shared texture - m_DX11format = DXGI_FORMAT_B8G8R8A8_UNORM; // Default compatible with DX9 - m_pStaging[0] = nullptr; // DX11 staging textures - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - - m_hInteropDevice = nullptr; - m_hInteropObject = nullptr; - m_hWnd = nullptr; - - // For CreateOpenGL and CloseOpenGL - m_hdc = nullptr; - m_hwndButton = nullptr; - m_hRc = nullptr; - - // OpenGL extensions - m_caps = 0; // nothing loaded yet - m_bExtensionsLoaded = false; - m_bBGRAavailable = false; - m_bFBOavailable = false; - m_bBLITavailable = false; - m_bSWAPavailable = false; - m_bGLDXavailable = false; - m_bCOPYavailable = false; - m_bPBOavailable = true; // Assume true until tested by LoadGLextensions - m_bCONTEXTavailable = false; - - // PBO support - PboIndex = 0; - NextPboIndex = 0; - m_nBuffers = 2; // number of buffers used - m_pbo[0] = m_pbo[1] = m_pbo[2] = m_pbo[3] = 0; - - // Memoryshare variables - memoryshare.senderMem = nullptr; - memoryshare.m_Width = 0; - memoryshare.m_Height = 0; - - // Check the user selected Auto share mode - DWORD dwValue = 0; - if (ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Auto", &dwValue)) - m_bAuto = (dwValue == 1); - - // Check the user selected buffering mode - if (ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Buffering", &dwValue)) - m_bPBOavailable = (dwValue == 1); - - // Number of PBO buffers user selected - m_nBuffers = 2; - if(ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Buffers", &dwValue)) - m_nBuffers = (int)dwValue; - - // Find version number from the registry if Spout is installed (2005, 2006, etc.) - if (ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "Version", &dwValue)) - m_SpoutVersion = (int)dwValue; // 0 for earlier than 2.005 - else - m_SpoutVersion = -1; // Spout not installed - -} - -spoutGL::~spoutGL() -{ - if (m_bInitialized) { - sendernames.ReleaseSenderName(m_SenderName); - frame.CleanupFrameCount(); - frame.CloseAccessMutex(); - } - - if (m_fbo > 0) { - // Delete the fbo before the texture - // so that any texture attachment is released - glDeleteFramebuffersEXT(1, &m_fbo); - m_fbo = 0; - } - - if (m_glTexture > 0) - glDeleteTextures(1, &m_glTexture); - - if (m_TexID > 0) - glDeleteTextures(1, &m_TexID); - - if (m_pbo[0] > 0) { - glDeleteBuffersEXT(m_nBuffers, m_pbo); - m_pbo[0] = m_pbo[1] = m_pbo[2] = m_pbo[3] = 0; - } - - if (m_pSharedTexture) - m_pSharedTexture->Release(); - - CleanupInterop(); - CloseDirectX(); - - if (memoryshare.senderMem) - delete memoryshare.senderMem; - memoryshare.senderMem = nullptr; - memoryshare.m_Width = 0; - memoryshare.m_Height = 0; - -} - -// -// Group: OpenGL shared texture -// - -//--------------------------------------------------------- -// Function: BindSharedTexture -// Bind OpenGL shared texture -bool spoutGL::BindSharedTexture() -{ - // Only for GL/DX interop mode - if (!m_hInteropDevice || !m_hInteropObject) - return false; - - bool bRet = false; - // Wait for access to the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // lock dx object - if (LockInteropObject(m_hInteropDevice, &m_hInteropObject) == S_OK) { - // Bind our shared OpenGL texture - glBindTexture(GL_TEXTURE_2D, m_glTexture); - // Leave interop and mutex both locked for success - bRet = true; - } - else { - // Release interop lock and allow texture access for fail - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); - bRet = false; - } - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - } - - return bRet; - -} // end BindSharedTexture - -//--------------------------------------------------------- -// Function: UnBindSharedTexture -// Un-bind OpenGL shared texture -bool spoutGL::UnBindSharedTexture() -{ - // Only for GL/DX interop mode - if (!m_hInteropDevice || !m_hInteropObject) - return false; - - // Unbind our shared OpenGL texture - glBindTexture(GL_TEXTURE_2D, 0); - // unlock dx object - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - - return true; - -} // end UnBindSharedTexture - -//--------------------------------------------------------- -// Function: GetSharedTextureID -// OpenGL shared texture ID -GLuint spoutGL::GetSharedTextureID() -{ - return m_glTexture; -} - -// -// Group: Graphics compatibility -// - -//--------------------------------------------------------- -// Function: GetAutoShare -// Get auto GPU/CPU share depending on compatibility -bool spoutGL::GetAutoShare() -{ - return m_bAuto; -} - -//--------------------------------------------------------- -// Function: SetAutoShare -// Set auto GPU/CPU share depending on compatibility -void spoutGL::SetAutoShare(bool bAuto) -{ - m_bAuto = bAuto; -} - -//--------------------------------------------------------- -// Function: IsGLDXready -// OpenGL texture share compatibility -bool spoutGL::IsGLDXready() -{ - return m_bUseGLDX; -} - -// -// Group: For direct access if necessary -// - -//--------------------------------------------------------- -// Function: OpenSpout -// Initialize OpenGL and DX11 -// - Load extensions and check for availability and function -// - Open DirectX and check for availability -// - Compatibility test for use or GL/DX interop -// - Optionally re-test compatibility even if already initialized -bool spoutGL::OpenSpout(bool bRetest) -{ - // Return if already initialized and not re-testing compatibility - if (m_hWnd > 0 && !bRetest) - return true; - - printf("\n"); // This is the start, so make a new line in the log -#ifdef _M_X64 - SpoutLogNotice("spoutGL::OpenSpout - 64bit 2.007 - this 0x%.7X", PtrToUint(this)); -#else - SpoutLogNotice("spoutGL::OpenSpout - 32bit 2.007 - this 0x%.7X", PtrToUint(this)); -#endif - - m_bUseGLDX = false; - - if (!OpenDirectX()) { - SpoutLogFatal("spoutGL::OpenSpout - Could not initialize DirectX 11"); - return false; - } - - // DirectX is OK - // OpenGL device context is needed to go on - HDC hdc = wglGetCurrentDC(); - if (!hdc) { - SpoutLogFatal("spoutGL::OpenSpout - Cannot get GL device context"); - return false; - } - - // Get a window handle - m_hWnd = WindowFromDC(hdc); - - // Load extensions - if (!LoadGLextensions()) { - SpoutLogFatal("spoutGL::OpenSpout - Could not load GL extensions"); - return false; - } - - // If DirectX and OpenGL are both OK - test GLDX compatibility - - // For a re-test, create a new interop device in GLDXReady() - if (bRetest) - CleanupInterop(); - - if(!GLDXready()) { - // Not GL/DX compatible. - SpoutLogWarning("spoutGL::OpenSpout - system is not compatible with GL/DX interop"); - // Use CPU backup if Auto share enabled - if (m_bAuto) - SpoutLogWarning(" Using CPU share mode"); - else - SpoutLogWarning(" Cannot share textures"); - } - else { - // GL/DX compatible. Use GL/DX interop. - SpoutLogNotice(" Using texture share mode"); - } - - return true; - -} - -//--------------------------------------------------------- -// Function: OpenDirectX -// Initialize DirectX -bool spoutGL::OpenDirectX() -{ - SpoutLogNotice("spoutGL::OpenDirectX"); - return spoutdx.OpenDirectX11(); -} - -//--------------------------------------------------------- -// Function: SetDX11format -// Set sender DX11 shared texture format -void spoutGL::SetDX11format(DXGI_FORMAT textureformat) -{ - m_DX11format = textureformat; -} - -//--------------------------------------------------------- -// Function: CloseDirectX -// Close DirectX and free resources -void spoutGL::CloseDirectX() -{ - SpoutLogNotice("spoutGL::CloseDirectX()"); - - if (m_pSharedTexture) - m_pSharedTexture->Release(); - m_pSharedTexture = nullptr; - spoutdx.CloseDirectX11(); - - // Re-set shared texture handle - m_dxShareHandle = nullptr; - -} - -//--------------------------------------------------------- -// Function: CreateOpenGL -// Create an OpenGL window and context for situations where there is none. -// Not used if applications already have an OpenGL context. -// Always call CloseOpenGL afterwards. -bool spoutGL::CreateOpenGL() -{ - m_hdc = nullptr; - m_hwndButton = nullptr; - m_hRc = nullptr; - - SpoutLogNotice("spoutGL::CreateOpenGL()"); - - HGLRC glContext = wglGetCurrentContext(); - - if (!glContext) { - - // We only need an OpenGL context with no render window because we don't draw to it - // so create an invisible dummy button window. This is then independent from the host - // program window (GetForegroundWindow). If SetPixelFormat has been called on the - // host window it cannot be called again. This caused a problem in Mapio. - // https://msdn.microsoft.com/en-us/library/windows/desktop/dd369049%28v=vs.85%29.aspx - // - // CS_OWNDC allocates a unique device context for each window in the class. - // - if (!m_hwndButton || !IsWindow(m_hwndButton)) { - m_hwndButton = CreateWindowA("BUTTON", - "SpoutOpenGL", - WS_OVERLAPPEDWINDOW | CS_OWNDC, - 0, 0, 32, 32, - NULL, NULL, NULL, NULL); - } - - if (!m_hwndButton) { - SpoutLogError("spoutGL::CreateOpenGL - no hwnd"); - return false; - } - - m_hdc = GetDC(m_hwndButton); - if (!m_hdc) { - SpoutLogError("spoutGL::CreateOpenGL - no hdc"); - CloseOpenGL(); - return false; - } - - PIXELFORMATDESCRIPTOR pfd; - ZeroMemory(&pfd, sizeof(pfd)); - pfd.nSize = sizeof(pfd); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 32; - pfd.cDepthBits = 16; - pfd.iLayerType = PFD_MAIN_PLANE; - int iFormat = ChoosePixelFormat(m_hdc, &pfd); - if (!iFormat) { - SpoutLogError("spoutGL::CreateOpenGL - pixel format error"); - CloseOpenGL(); - return false; - } - - if (!SetPixelFormat(m_hdc, iFormat, &pfd)) { - DWORD dwError = GetLastError(); - // 2000 (0x7D0) The pixel format is invalid. - // Caused by repeated call of the SetPixelFormat function - char temp[128]; - sprintf_s(temp, "spoutGL::CreateOpenGL - SetPixelFormat Error %lu (0x%4.4lX)", dwError, dwError); - SpoutLogError("%s", temp); - CloseOpenGL(); - return false; - } - - m_hRc = wglCreateContext(m_hdc); - if (!m_hRc) { - SpoutLogError("spoutGL::CreateOpenGL - could not create OpenGL context"); - CloseOpenGL(); - return false; - } - - wglMakeCurrent(m_hdc, m_hRc); - if (!wglGetCurrentContext()) { - SpoutLogError("spoutGL::CreateOpenGL - no OpenGL context"); - CloseOpenGL(); - return false; - } - SpoutLogNotice(" OpenGL window created OK"); - } - else { - SpoutLogNotice(" OpenGL context exists"); - } - - return true; -} - -//--------------------------------------------------------- -// Function: CloseOpenGL -// Close OpenGL window -bool spoutGL::CloseOpenGL() -{ - - SpoutLogNotice("spoutGL::CloseOpenGL()"); - - // Properly kill the OpenGL window - if (m_hRc) { - if (!wglMakeCurrent(NULL, NULL)) { // Are We Able To Release The DC And RC Contexts? - SpoutLogError("spoutGL::CloseOpenGL - release of DC and RC failed"); - return false; - } - if (!wglDeleteContext(m_hRc)) { // Are We Able To Delete The RC? - SpoutLogError("spoutGL::CloseOpenGL - release rendering context failed"); - return false; - } - m_hRc = NULL; - } - - if (m_hdc && !ReleaseDC(m_hwndButton, m_hdc)) { // Are We Able To Release The DC - SpoutLogError("spoutGL::CloseOpenGL - release device context Failed"); - m_hdc = NULL; - return false; - } - - if (m_hwndButton && !DestroyWindow(m_hwndButton)) { // Are We Able To Destroy The Window? - SpoutLogError("spoutGL::CloseOpenGL - could not release hWnd"); - m_hwndButton = NULL; - return false; - } - - SpoutLogNotice(" closed the OpenGL window OK"); - - return true; -} - -//--------------------------------------------------------- -// Class initialization status -bool spoutGL::IsSpoutInitialized() -{ - return m_bInitialized; -} - -// -// GLDXready -// -// Hardware compatibility test -// -// o Check that extensions for GL/DX interop are available -// -// o GLDXready -// Checks operation of GL/DX interop functions -// and creates an interop device for success -// -// o m_bUseGLDX - true for GL/DX interop availability -// -bool spoutGL::GLDXready() -{ - // === Simulate failure for debugging === - // SpoutLogNotice("spoutGL::GLDXready - simulated compatibility failure"); - // m_bUseGLDX = false; - // return false; - - // Test whether the NVIDIA OpenGL/DirectX interop extensions function correctly. - // Creates dummy textures and uses the interop functions. - // Creates an interop device on success. - // Must be called after OpenDirectX. - // Success means the GLDX interop functions can be used. - // Other errors should not happen if OpenDirectX succeeded - - HANDLE dxShareHandle = nullptr; // Shared texture handle for a sender texture - ID3D11Texture2D* pSharedTexture = nullptr; // the shared DX11 texture - HANDLE hInteropObject = nullptr; // handle to the DX/GL interop object - GLuint glTexture = 0; // the OpenGL texture linked to the shared DX texture - - SpoutLogNotice("spoutGL::GLDXready - testing for GL/DX interop compatibility"); - - // Assume not GLDX interop compatible until all tests pass - m_bUseGLDX = false; - - if (!spoutdx.GetDX11Device()) { - SpoutLogError("spoutGL::GLDXready - No D3D11 device"); - return false; - } - - // DirectX is OK but check for availabilty of the GL/DX extensions. - if (!m_bGLDXavailable) { - // The extensions required for texture access are not available. - SpoutLogError("spoutGL::GLDXready - GL/DX interop extensions not available"); - return false; - } - - SpoutLogNotice(" GL/DX interop extensions available"); - - // Create an opengl texture for the test - glGenTextures(1, &glTexture); - if (glTexture == 0) { - SpoutLogError("spoutGL::GLDXready - glGenTextures failed"); - return false; - } - glDeleteTextures(1, &glTexture); - - // - // Create a directX texture and link using the NVIDIA GLDX interop functions - // - - SpoutLogNotice("spoutGL::GLDXready - testing GL/DX interop functions"); - - // Create a new shared DirectX resource - if (!spoutdx.CreateSharedDX11Texture(spoutdx.GetDX11Device(), - 256, 256, DXGI_FORMAT_B8G8R8A8_UNORM, // default - &pSharedTexture, dxShareHandle)) { - glDeleteTextures(1, &glTexture); - SpoutLogError("spoutGL::GLDXready - CreateSharedDX11Texture failed"); - return false; - } - - SpoutLogNotice(" Linking test - OpenGL texture (0x%.7X) DX11 texture (0x%.7X)", glTexture, PtrToUint(pSharedTexture)); - - // Link the shared DirectX texture to the OpenGL texture - // If sucessful, LinkGLDXtextures initializes a class handle - // to a GL/DirectX interop device - m_hInteropDevice - hInteropObject = LinkGLDXtextures(spoutdx.GetDX11Device(), pSharedTexture, dxShareHandle, glTexture); - if (!hInteropObject) { - spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), pSharedTexture); - glDeleteTextures(1, &glTexture); - // It is possible that extensions for the GL/DX interop load OK - // but that the GL/DX interop functions fail. - // This has been noted on dual graphics machines with the NVIDIA Optimus driver. - SpoutLogWarning("spoutGL::GLDXready - GL/DX interop functions failed"); - } - else { - // All passes, so unregister and release textures - // m_hInteropDevice remains and does not need to be created again - if (m_hInteropDevice) - wglDXUnregisterObjectNV(m_hInteropDevice, hInteropObject); - - spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), pSharedTexture); - glDeleteTextures(1, &glTexture); - - // Set compatibility flag - m_bUseGLDX = true; - - SpoutLogNotice(" Test OpenGL and DX11 textures created and linked OK"); - - } - - // Now GLDXready() has set m_bUseGLDX is set to use the GL/DX interop or not. - - // Use of texture sharing or CPU backup is assessed from - // user settings (retrieved with GetAutoShare) - // and actual GL/DX compatibility (retrieved with GetGLDXready) - - // Texture sharing is used if GL/DX compatible (m_bUseGLDX = true) - // CPU backup is used if : - // 1) Graphics is incompatible (m_bUseGLDX = false) - // 2) The user has selected "Auto" share in SpoutSettings (m_bAuto = false) - // Otherwise no sharing is performed. - - // If not GLDX compatible, LinkGLDXtexture will not be called (see CreateDX11interop) - // ReadDX11Texture and WriteDX11Texture using staging textures will be used instead - - return m_bUseGLDX; - -} - - -// -// Protected functions -// - -// Create shared DirectX texture and OpenGL texture and link with GL/DX interop -bool spoutGL::CreateInterop(unsigned int width, unsigned int height, DWORD dwFormat, bool bReceive) -{ - SpoutLogNotice("spoutGL::CreateInterop"); - - // printf("spoutGL::CreateInterop %dx%d - format = %d\n", width, height, dwFormat); - - // Create or use a shared DirectX texture that will be linked - // to the OpenGL texture and get it's share handle for sharing textures - if (bReceive) { - // A receiver uses a texture already created from the sender share handle - if (!m_pSharedTexture || !m_dxShareHandle) { - SpoutLogError("spoutGL::CreateInterop - no receiver texture : device = 0x%.7X, sharehandle = 0x%.7X", PtrToUint(spoutdx.GetDX11Device()), LOWORD(m_dxShareHandle)); - return false; - } - } - else { - - // A sender creates a new texture with a new share handle - m_dxShareHandle = nullptr; - - // - // Texture format tests - // - // DX9 compatible formats - // DXGI_FORMAT_B8G8R8A8_UNORM; // compatible DX11 format - works with DX9 (87) - // DXGI_FORMAT_B8G8R8X8_UNORM; // compatible DX11 format - works with DX9 (88) - // - // Other formats that work with DX11 but not with DX9 - // DXGI_FORMAT_R16G16B16A16_FLOAT - // DXGI_FORMAT_R16G16B16A16_SNORM - // DXGI_FORMAT_R10G10B10A2_UNORM - // - // A directX 11 receiver accepts DX9 formats - DWORD format = (DWORD)DXGI_FORMAT_B8G8R8A8_UNORM; // (87) default compatible with DX9 - if (dwFormat > 0) { - format = dwFormat; - SetDX11format((DXGI_FORMAT)format); // Set the global texture format - } - else { - format = m_DX11format; - } - - // Create or re-create the linked DX11 texture - if (!spoutdx.CreateSharedDX11Texture(spoutdx.GetDX11Device(), - width, height, (DXGI_FORMAT)format, // default is DXGI_FORMAT_B8G8R8A8_UNORM - &m_pSharedTexture, m_dxShareHandle)) { - SpoutLogError("spoutGL::CreateInterop - CreateSharedDX11Texture failed"); - return false; - } - } - - SpoutLogNotice("spoutGL::CreateInterop - m_pSharedTexture = 0x%.7X : m_dxShareHandle = 0x%.7X", PtrToUint(m_pSharedTexture), LOWORD(m_dxShareHandle)); - - // Link the shared DirectX texture to the OpenGL texture - // This registers for interop and associates the opengl texture with the dx texture - // by calling wglDXRegisterObjectNV which returns a handle to the interop object - // (the shared texture) (m_hInteropObject) - // When a sender size changes, the new texture has to be re-registered - if (m_hInteropDevice && m_hInteropObject) { - SpoutLogNotice(" Unregistering interop"); - wglDXUnregisterObjectNV(m_hInteropDevice, m_hInteropObject); - m_hInteropObject = nullptr; - } - - // Create or re-create the class OpenGL texture - InitTexture(m_glTexture, GL_RGBA, width, height); - m_Width = width; - m_Height = height; - - // Link the texture using the GL/DX interop - m_hInteropObject = LinkGLDXtextures((void *)spoutdx.GetDX11Device(), m_pSharedTexture, m_dxShareHandle, m_glTexture); - if (!m_hInteropObject) { - SpoutLogError("spoutGL::CreateInterop - LinkGLDXtextures failed"); - return false; - } - SpoutLogNotice(" m_hInteropObject = 0x%.7X", LOWORD(m_hInteropObject)); - - // Create an fbo if not already - if (m_fbo == 0) - glGenFramebuffersEXT(1, &m_fbo); - - // Important to reset PBO index - PboIndex = 0; - NextPboIndex = 0; - - // Also reset staging texture index - m_Index = 0; - m_NextIndex = 0; - - return true; - -} - -// -// Link a shared DirectX texture to an OpenGL texture -// and create a GLDX interop object handle -// -// IN pSharedTexture Pointer to shared the DirectX texture -// IN dxShareHandle Handle of the DirectX texture to be shared -// IN glTextureID ID of the OpenGL texture that is to be linked to the shared DirectX texture -// Returns Handle to the GL/DirectX interop object (the shared texture) -// -HANDLE spoutGL::LinkGLDXtextures(void* pDXdevice, - void* pSharedTexture, HANDLE dxShareHandle, GLuint glTexture) -{ - - HANDLE hInteropObject = nullptr; - BOOL bResult = 0; - DWORD dwError = 0; - char tmp[128]; - - // Prepare the DirectX device for interoperability with OpenGL - // The return value is a handle to a GL/DirectX interop device. - if (!m_hInteropDevice) { - try { - m_hInteropDevice = wglDXOpenDeviceNV(pDXdevice); - } - catch (...) { - SpoutLogError("spoutGL::LinkGLDXtextures - wglDXOpenDeviceNV exception"); - return NULL; - } - } - - if (!m_hInteropDevice) { - // wglDXOpenDeviceNV failed to open the Direct3D device - dwError = GetLastError(); - sprintf_s(tmp, 128, "spoutGL::LinkGLDXtextures : wglDXOpenDeviceNV(0x%.7X) - error %lu (0x%.X)\n", - LOWORD(pDXdevice), dwError, LOWORD(dwError)); - // Other errors reported - // 1008, 0x3F0 - ERROR_NO_TOKEN - switch (LOWORD(dwError)) { - case ERROR_OPEN_FAILED: - strcat_s(tmp, 128, " Could not open the Direct3D device."); - break; - case ERROR_NOT_SUPPORTED: - // This can be caused either by passing in a device from an unsupported DirectX - // version, or by passing in a device referencing a display adapter that is - // not accessible to the GL. - strcat_s(tmp, 128, " The dxDevice is not supported."); - break; - default: - strcat_s(tmp, 128, " Unknown error."); - break; - } - SpoutLogError("%s", tmp); - return NULL; - } - - // prepare shared resource - // wglDXSetResourceShareHandle does not need to be called for DirectX - // version 10 and 11 resources. Calling this function for DirectX 10 - // and 11 resources is not an error but has no effect. - // Error when dxShareHandle is NULL - try { - bResult = wglDXSetResourceShareHandleNV(pSharedTexture, dxShareHandle); - } - catch (...) { - SpoutLogError("spoutGL::LinkGLDXtextures - wglDXSetResourceShareHandleNV exception"); - return NULL; - } - - if (!bResult) { - SpoutLogError("spoutGL::LinkGLDXtextures - wglDXSetResourceShareHandleNV error"); - return NULL; - } - - // Prepare the DirectX texture for use by OpenGL - // register for interop and associate the opengl texture with the dx texture - // Returns a handle that can be used for sharing functions - try { - hInteropObject = wglDXRegisterObjectNV(m_hInteropDevice, - pSharedTexture, // DX texture - glTexture, // OpenGL texture - GL_TEXTURE_2D, // Must be TEXTURE_2D - multisampling not supported - WGL_ACCESS_READ_WRITE_NV); // We will write and the receiver will read - } - catch (...) { - SpoutLogError("spoutGL::LinkGLDXtextures - wglDXRegisterObjectNV exception"); - return NULL; - } - - if (!hInteropObject) { - // Noted C007006E returned on failure. - // Error codes are 32-bit values, but expected results are in the low word. - // 006E is ERROR_OPEN_FAILED (110L) - dwError = GetLastError(); - sprintf_s(tmp, 128, "spoutGL::LinkGLDXtextures - wglDXRegisterObjectNV :error %u, (0x%.X)\n", - LOWORD(dwError), LOWORD(dwError)); - switch (LOWORD(dwError)) { - case ERROR_INVALID_HANDLE: - strcat_s(tmp, 128, " No GL context is current."); - break; - case ERROR_INVALID_DATA: - strcat_s(tmp, 128, " Incorrect GL name, type or access parameters."); - break; - case ERROR_OPEN_FAILED: - strcat_s(tmp, 128, " Failed to open the Direct3D resource."); - break; - default: - strcat_s(tmp, 128, " Unknown error."); - break; - } - SpoutLogError("%s", tmp); - - if (m_hInteropDevice) { - wglDXCloseDeviceNV(m_hInteropDevice); - m_hInteropDevice = nullptr; - } - - } - - return hInteropObject; - -} - -HANDLE spoutGL::GetInteropDevice() -{ - return m_hInteropDevice; // Handle to the GL/DX interop device -} - -// -// GL/DX Interop lock -// -// A return value of S_OK indicates that all objects were -// successfully locked. Other return values indicate an -// error. If the function returns false, none of the objects will be locked. -// -// Attempting to access an interop object via GL when the object is -// not locked, or attempting to access the DirectX resource through -// the DirectX API when it is locked by GL, will result in undefined -// behavior and may result in data corruption or program -// termination. Likewise, passing invalid interop device or object -// handles to this function has undefined results, including program -// termination. -// -// Note that only one GL context may hold the lock on the -// resource at any given time --- concurrent access from multiple GL -// contexts is not currently supported. -// -// DISCUSSION: The Lock/Unlock calls serve as synchronization points -// between OpenGL and DirectX. They ensure that any rendering -// operations that affect the resource on one driver are complete -// before the other driver takes ownership of it. -// -// This function assumes only one object -// -// Must return S_OK (0) - otherwise the error can be checked. -// -HRESULT spoutGL::LockInteropObject(HANDLE hDevice, HANDLE *hObject) -{ - DWORD dwError; - HRESULT hr; - - if (!hDevice || !hObject || !*hObject) { - return E_HANDLE; - } - - // lock dx object - if (wglDXLockObjectsNV(hDevice, 1, hObject)) { - return S_OK; - } - else { - dwError = GetLastError(); - switch (LOWORD(dwError)) { - case ERROR_BUSY: // One or more of the objects in was already locked. - hr = E_ACCESSDENIED; // General access denied error - SpoutLogError("spoutGL::LockInteropObject - ERROR_BUSY"); - break; - case ERROR_INVALID_DATA: // One or more of the objects in - // does not belong to the interop device - // specified by . - hr = E_ABORT; // Operation aborted - SpoutLogError("spoutGL::LockInteropObject - ERROR_INVALID_DATA"); - break; - case ERROR_LOCK_FAILED: // One or more of the objects in failed to - hr = E_ABORT; // Operation aborted - SpoutLogError("spoutGL::LockInteropObject - ERROR_LOCK_FAILED"); - break; - default: - hr = E_FAIL; // unspecified error - SpoutLogError("spoutGL::LockInteropObject - UNKNOWN_ERROR"); - break; - } // end switch - } // end false - - return hr; - -} // LockInteropObject - - -// -// Must return S_OK (0) - otherwise the error can be checked. -// -HRESULT spoutGL::UnlockInteropObject(HANDLE hDevice, HANDLE *hObject) -{ - DWORD dwError; - HRESULT hr; - - if (!hDevice || !hObject || !*hObject) { - return E_HANDLE; - } - - if (wglDXUnlockObjectsNV(hDevice, 1, hObject)) { - return S_OK; - } - else { - dwError = GetLastError(); - switch (LOWORD(dwError)) { - case ERROR_NOT_LOCKED: - hr = E_ACCESSDENIED; - SpoutLogError("spoutGL::UnLockInteropObject - ERROR_NOT_LOCKED"); - break; - case ERROR_INVALID_DATA: - SpoutLogError("spoutGL::UnLockInteropObject - ERROR_INVALID_DATA"); - hr = E_ABORT; - break; - case ERROR_LOCK_FAILED: - hr = E_ABORT; - SpoutLogError("spoutGL::UnLockInteropObject - ERROR_LOCK_FAILED"); - break; - default: - hr = E_FAIL; - SpoutLogError("spoutGL::UnLockInteropObject - UNKNOWN_ERROR"); - break; - } // end switch - } // end fail - - return hr; - -} // end UnlockInteropObject - - -// Clean up the gldx interop -void spoutGL::CleanupInterop() -{ - // Release OpenGL objects etc. even if DirectX has been released - if (!m_hInteropDevice && !m_hInteropObject) - return; - - // These things need an opengl context so check - if (wglGetCurrentContext()) { - SpoutLogNotice("spoutGL::CleanupInterop"); - if (m_hInteropDevice && m_hInteropObject) { - if (!wglDXUnregisterObjectNV(m_hInteropDevice, m_hInteropObject)) { - SpoutLogWarning("spoutGL::CleanupInterop - could not un-register interop"); - } - m_hInteropObject = nullptr; - } - - if (m_hInteropDevice) { - if (!wglDXCloseDeviceNV(m_hInteropDevice)) { - SpoutLogWarning("spoutGL::CleanupInterop - could not close interop"); - } - m_hInteropDevice = nullptr; - } - } -} - -//--------------------------------------------------------- -void spoutGL::CleanupGL() -{ - if (m_fbo > 0) { - // Delete the fbo before the texture so that any texture attachment - // is released even though it should have been - glDeleteFramebuffersEXT(1, &m_fbo); - m_fbo = 0; - } - - if (m_glTexture > 0) - glDeleteTextures(1, &m_glTexture); - - if (m_TexID > 0) - glDeleteTextures(1, &m_TexID); - - if (m_pbo[0] > 0) { - glDeleteBuffersEXT(m_nBuffers, m_pbo); - m_pbo[0] = m_pbo[1] = m_pbo[2] = m_pbo[3] = 0; - } - - if (m_pSharedTexture) - m_pSharedTexture->Release(); - - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - m_pSharedTexture = nullptr; - m_dxShareHandle = nullptr; - - m_Width = 0; - m_Height = 0; - m_SenderName[0] = 0; - m_bInitialized = false; - - CleanupInterop(); - - // do not close DirectX - -} - -// If a class OpenGL texture has not been created or it is a different size, create a new one -// Typically used for texture copy and invert -void spoutGL::CheckOpenGLTexture(GLuint &texID, GLenum GLformat, unsigned int width, unsigned int height) -{ - if (texID == 0 || texID != m_TexID || GLformat != m_TexFormat || width != m_TexWidth || height != m_TexHeight) { - InitTexture(texID, GLformat, width, height); - m_TexID = texID; - m_TexWidth = width; - m_TexHeight = height; - m_TexFormat = (DWORD)GLformat; - } -} - -// Initialize OpenGL texture -void spoutGL::InitTexture(GLuint &texID, GLenum GLformat, unsigned int width, unsigned int height) -{ - if (texID != 0) glDeleteTextures(1, &texID); - glGenTextures(1, &texID); - - glBindTexture(GL_TEXTURE_2D, texID); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GLformat, GL_UNSIGNED_BYTE, NULL); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glBindTexture(GL_TEXTURE_2D, 0); - -} - - -// -// COPY AN OPENGL TEXTURE TO THE SHARED OPENGL TEXTURE -// -// Allows for a texture attached to the host fbo -// Where the input texture can be larger than the shared texture -// and Width and height are the used portion. Only the used part is copied. -// For example Freeframe textures. -// -bool spoutGL::WriteGLDXtexture(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - // Only for GL/DX interop mode - if (!m_hInteropDevice || !m_hInteropObject) - return false; - - // Specify greater here because the width/height passed can be smaller - if (width > m_Width || height > m_Height) - return false; - - // Create an fbo if not already - if (m_fbo == 0) - glGenFramebuffersEXT(1, &m_fbo); - - // Wait for access to the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // lock dx interop object - if (LockInteropObject(m_hInteropDevice, &m_hInteropObject) == S_OK) { - // Write to the shared texture - if (SetSharedTextureData(TextureID, TextureTarget, width, height, bInvert, HostFBO)) { - // Increment the sender frame counter for successful write - frame.SetNewFrame(); - } - // unlock dx object - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); - } - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - } - - return true; - -} // end WriteGLDXTexture - - -bool spoutGL::ReadGLDXtexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - // No interop, no copy - if (!m_hInteropDevice || !m_hInteropObject) { - return false; - } - - // width and height must be the same as the shared texture - // m_TextureInfo is established in CreateDX11interop - if (width != m_Width || height != m_Height) { - return false; - } - - bool bRet = true; // Error only if texture read fails - - // Wait for access to the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - - // Read the shared texture if the sender has produced a new frame - // GetNewFrame updates sender frame count and fps - if (frame.GetNewFrame()) { - // No texture read for zero texture - allowed for by ReceiveTexture - if (TextureID > 0 && TextureTarget > 0) { - if (LockInteropObject(m_hInteropDevice, &m_hInteropObject) == S_OK) { - bRet = GetSharedTextureData(TextureID, TextureTarget, width, height, bInvert, HostFBO); - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); - } - } - } - - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - } - - return bRet; - -} // end ReadGLDXTexture - - -bool spoutGL::SetSharedTextureData(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - GLenum status = 0; - bool bRet = false; - - // "TextureID" can be NULL if it is attached to the host fbo - // m_fbo is a local FBO - // "m_glTexture" is destination texture - // width/height are the dimensions of the destination texture - // Because two fbos are used, the input texture can be larger than the shared texture - // Width and height are the used portion and only the used part is copied - - if (TextureID == 0 && HostFBO > 0 && glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) { - - // Enter with the input texture attached to - // attachment point 0 of the currently bound fbo - // and set for read or read/write - - // Bind our local fbo for draw - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo); - // Draw to the first attachment point - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); - // Attach the texture we write into (the shared texture) - glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_glTexture, 0); - // Check fbo for completeness - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { - if (m_bBLITavailable) { - if (bInvert) - // copy one texture buffer to the other while flipping upside down - glBlitFramebufferEXT(0, 0, width, height, 0, height, width, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST); - else - // Do not flip during blit - glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); - } - else { - // No fbo blit extension - // Copy from the host fbo (input texture attached) - // to the shared texture - glBindTexture(GL_TEXTURE_2D, m_glTexture); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width, height); - glBindTexture(GL_TEXTURE_2D, 0); - } - bRet = true; - } - else { - PrintFBOstatus(status); - bRet = false; - } - // restore the host fbo - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - } - else if (TextureID > 0) { - // There is a valid texture passed in. - // Copy the input texture to the destination texture. - // Both textures must be the same size. - bRet = CopyTexture(TextureID, TextureTarget, m_glTexture, GL_TEXTURE_2D, width, height, bInvert, HostFBO); - } - - return bRet; - -} - -// Copy shared texture via fbo blit -bool spoutGL::GetSharedTextureData(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - GLenum status = 0; - bool bRet = false; - - // bind the FBO (for both, READ_FRAMEBUFFER_EXT and DRAW_FRAMEBUFFER_EXT) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - - // Attach the Input texture (the shared texture) to the color buffer in our frame buffer - note texturetarget - glFramebufferTexture2DEXT(READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_glTexture, 0); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - - // Attach target texture (the one we write into and return) to second attachment point - glFramebufferTexture2DEXT(DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, TextureTarget, TextureID, 0); - glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); - - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { - if (m_bBLITavailable) { - // Flip if the user wants that - if (bInvert) { - // copy one texture buffer to the other while flipping upside down - glBlitFramebufferEXT(0, 0, // srcX0, srcY0, - width, height, // srcX1, srcY1 - 0, height, // dstX0, dstY0, - width, 0, // dstX1, dstY1, - GL_COLOR_BUFFER_BIT, GL_LINEAR); - } - else { - // Do not flip during blit - glBlitFramebufferEXT(0, 0, // srcX0, srcY0, - width, height, // srcX1, srcY1 - 0, 0, // dstX0, dstY0, - width, height, // dstX1, dstY1, - GL_COLOR_BUFFER_BIT, GL_LINEAR); - } - } - else { - // No fbo blit extension available - // Copy from the fbo (shared texture attached) to the dest texture - glBindTexture(TextureTarget, TextureID); - glCopyTexSubImage2D(TextureTarget, 0, 0, 0, 0, 0, width, height); - glBindTexture(TextureTarget, 0); - } - bRet = true; - } - else { - PrintFBOstatus(status); - bRet = false; - } - - // restore the previous fbo - default is 0 - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); // 04.01.16 - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - - return bRet; - -} - - -// -// COPY IMAGE PIXELS TO THE OPENGL SHARED TEXTURE -// -bool spoutGL::WriteGLDXpixels(const unsigned char* pixels, - unsigned int width, unsigned int height, GLenum glFormat, bool bInvert, GLuint HostFBO) -{ - if (width != m_Width || height != m_Height || !pixels) - return false; - - // Use a GL texture so that WriteTexture can be used - GLenum glformat = glFormat; - - // Create or resize a local OpenGL texture - CheckOpenGLTexture(m_TexID, glFormat, width, height); - - // Transfer the pixels to the local texture - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // In case of RGB pixel data - glBindTexture(GL_TEXTURE_2D, m_TexID); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, glformat, GL_UNSIGNED_BYTE, (GLvoid *)pixels); - glBindTexture(GL_TEXTURE_2D, 0); - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - - // Write the local texture to the shared texture and invert if necessary - WriteGLDXtexture(m_TexID, GL_TEXTURE_2D, width, height, bInvert, HostFBO); - - return true; - -} // end WriteGLDXpixels - - -// -// COPY OPENGL SHARED TEXTURE TO IMAGE PIXELS -// -bool spoutGL::ReadGLDXpixels(unsigned char* pixels, - unsigned int width, unsigned int height, - GLenum glFormat, bool bInvert, GLuint HostFBO) -{ - if (!m_hInteropDevice || !m_hInteropObject) - return false; - - if (width != m_Width || height != m_Height) - return false; - - // GLenum glformat = glFormat; - bool bRet = true; // Error only if pixel read fails - - // retrieve opengl texture data directly to image pixels - - // Wait for access to the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // read texture for a new frame - if (frame.GetNewFrame()) { - // lock gl/dx interop object - if (LockInteropObject(m_hInteropDevice, &m_hInteropObject) == S_OK) { - // Set single pixel alignment in case of rgb source - glPixelStorei(GL_PACK_ALIGNMENT, 1); - // Always allow for invert here - only consumes 0.1 msec - // Create or resize a local OpenGL texture - CheckOpenGLTexture(m_TexID, glFormat, width, height); - // Copy the shared texture to the local texture, inverting if necessary - CopyTexture(m_glTexture, GL_TEXTURE_2D, m_TexID, GL_TEXTURE_2D, width, height, bInvert, HostFBO); - // Extract the pixels from the local texture - changing to the user passed format - // Use PBO method for maximum speed, otherwise use DirectX staging texture method - // ReadTextureData using glReadPixels is half the speed of using DX11 texture directly - if (m_bPBOavailable) - bRet = UnloadTexturePixels(m_TexID, GL_TEXTURE_2D, width, height, 0, pixels, glFormat, false, HostFBO); - else - bRet = ReadTextureData(m_TexID, GL_TEXTURE_2D, width, height, 0, pixels, glFormat, false, HostFBO); - // default alignment - glPixelStorei(GL_PACK_ALIGNMENT, 4); - } // interop lock failed - // Unlock interop object - UnlockInteropObject(m_hInteropDevice, &m_hInteropObject); - } // no new frame - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - } // mutex access failed - - return bRet; - -} // end ReadGLDXpixels - - -// -// Asynchronous Read-back from an OpenGL texture -// -// Adapted from : http://www.songho.ca/opengl/gl_pbo.html -// -bool spoutGL::UnloadTexturePixels(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, unsigned int rowpitch, - unsigned char* data, GLenum glFormat, - bool bInvert, GLuint HostFBO) -{ - void *pboMemory = nullptr; - int channels = 4; // RGBA or RGB - - if (!data) { - return false; - } - - if (glFormat == GL_RGB || glFormat == GL_BGR_EXT) { - channels = 3; - } - - unsigned int pitch = rowpitch; // row pitch passed in - if (rowpitch == 0) - pitch = width * channels; // RGB or RGBA - - if (m_fbo == 0) { - SpoutLogNotice("spoutGL::UnloadTexturePixels - creating FBO"); - glGenFramebuffersEXT(1, &m_fbo); - } - - // Create pbos if not already - if (m_pbo[0] == 0) { - SpoutLogNotice("spoutGL::UnloadTexturePixels - creating PBO"); - glGenBuffersEXT(m_nBuffers, m_pbo); - PboIndex = 0; - NextPboIndex = 0; - } - - PboIndex = (PboIndex + 1) % m_nBuffers; - NextPboIndex = (PboIndex + 1) % m_nBuffers; - - // If Texture ID is zero, the texture is already attached to the Host Fbo - // and we do nothing. If not we need to create an fbo and attach the user texture - if (TextureID > 0) { - // Attach the texture to point 0 - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, TextureTarget, TextureID, 0); - // Set the target framebuffer to read - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - } - else if (HostFBO == 0) { - // If no texture ID, a Host FBO must be provided - // testing only - error log will repeat - return false; - } - - // Bind the PBO - glBindBufferEXT(GL_PIXEL_PACK_BUFFER, m_pbo[PboIndex]); - - // Check it's size - GLint size = 0; - glGetBufferParameterivEXT(GL_PIXEL_PACK_BUFFER, GL_BUFFER_SIZE_EXT, &size); - if (size > 0 && size != (int)(pitch * height) ) { - // All PBOs must be re-created - glBindBufferEXT(GL_PIXEL_PACK_BUFFER, 0); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - glDeleteBuffersEXT(m_nBuffers, m_pbo); - m_pbo[0] = m_pbo[1] = m_pbo[2] = m_pbo[3] = 0; - return false; - } - - // Null existing PBO data to avoid a stall - // This allocates memory for the PBO pitch*height wide - glBufferDataEXT(GL_PIXEL_PACK_BUFFER, pitch*height, 0, GL_STREAM_READ); - - // Read pixels from framebuffer to PBO - glReadPixels() should return immediately. - glPixelStorei(GL_PACK_ROW_LENGTH, pitch/channels); // row length in pixels - glReadPixels(0, 0, width, height, glFormat, GL_UNSIGNED_BYTE, (GLvoid *)0); - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - - // If there is data in the next pbo from the previous call, read it back - glBindBufferEXT(GL_PIXEL_PACK_BUFFER, m_pbo[NextPboIndex]); - - // Map the PBO to process its data by CPU - pboMemory = glMapBufferEXT(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); - - // glMapBuffer can return NULL when called the first time - // when the next pbo has not been filled with data yet - glGetError(); // remove the last error - - if (pboMemory && data) { - // Update data directly from the mapped buffer (TODO: RGB) - spoutcopy.CopyPixels((const unsigned char*)pboMemory, (unsigned char*)data, pitch/channels, height, glFormat, bInvert); - glUnmapBufferEXT(GL_PIXEL_PACK_BUFFER); - } - // skip the copy rather than return false. - - // Back to conventional pixel operation - glBindBufferEXT(GL_PIXEL_PACK_BUFFER, 0); - - // Restore the previous fbo binding - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - - return true; - -} - - -// -// Copy OpenGL to DirectX 11 texture via CPU where the GL/DX interop is not available -// -// GPU read is from OpenGL. -// Use multiple PBOs instead of glReadPixels for best speed. -// -bool spoutGL::WriteDX11texture(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - D3D11_MAPPED_SUBRESOURCE mappedSubResource; - bool bRet = false; - - // Only for DX11 mode - if (!spoutdx.GetDX11Context()) { - return false; - } - - // If a staging texture has not been created or a different size create a new one - // Only one staging texture is required. Buffering read from GPU is done by OpenGL PBO. - if (!CheckStagingTextures(width, height, 1)) - return false; - - // Map the DX11 staging texture and write the sender OpenGL texture pixels to it - if (SUCCEEDED(spoutdx.GetDX11Context()->Map(m_pStaging[0], 0, D3D11_MAP_WRITE, 0, &mappedSubResource))) { - - // Staging texture width is multiples of 16 and pitch can be greater that width*4 - // Copy OpenGL texture pixelsto the staging texture taking account of the destination row pitch - if (m_bPBOavailable) { - bRet = UnloadTexturePixels(TextureID, TextureTarget, - width, height, - mappedSubResource.RowPitch, - (unsigned char *)mappedSubResource.pData, - GL_BGRA_EXT, bInvert, HostFBO); - } - else { - bRet = ReadTextureData(TextureID, TextureTarget, // OpenGL source texture - width, height, // width and height of OpenGL texture - mappedSubResource.RowPitch, // bytes per line of staging texture - (unsigned char *)mappedSubResource.pData, // staging texture pixels - GL_BGRA_EXT, bInvert, HostFBO); - } - - spoutdx.GetDX11Context()->Unmap(m_pStaging[0], 0); - - // The staging texture is updated with the OpenGL texture data - // Write it to the sender's shared texture - WriteTexture(&m_pStaging[0]); - - return true; - - } - - return false; - -} // end WriteDX11texture - -// -// Copy from the shared DX11 texture to an OpenGL texture via CPU staging texture -// GPU write is to OpenGL -// -bool spoutGL::ReadDX11texture(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - D3D11_MAPPED_SUBRESOURCE mappedSubResource; - - // Quit for zero texture - if (TextureID == 0 || TextureTarget == 0) { - return false; - } - - // Only for DX11 mode - if (!spoutdx.GetDX11Context()) - return false; - - // Only one staging texture is required because GPU write is to OpenGL - if (!CheckStagingTextures(width, height, 1)) { - return false; - } - - // Read from from the sender shared texture to a staging texture - if (!ReadTexture(&m_pStaging[0])) { - return false; - } - - // Update the application receiving OpenGL texture from the DX11 staging texture - // Default format is BGRA. Change if the sender is RGBA. - GLenum glFormat = GL_BGRA_EXT; - if (m_dwFormat == 28) glFormat = GL_RGBA; - - // Make sure the GPU is ready to access the staging texture - spoutdx.GetDX11Context()->Flush(); - - // Map the staging texture to access the sender pixels - if (SUCCEEDED(spoutdx.GetDX11Context()->Map(m_pStaging[0], 0, D3D11_MAP_READ, 0, &mappedSubResource))) { - - // TODO : format testing for invert if m_TexID exists - if (bInvert) { - // Create or resize a local OpenGL texture - CheckOpenGLTexture(m_TexID, glFormat, width, height); - // Copy the DX11 pixels to it - glBindTexture(GL_TEXTURE_2D, m_TexID); - } - else { - // Copy the DX11 pixels to the user texture - glBindTexture(TextureTarget, TextureID); - } - - // Allow for the staging texture for row pitch - glPixelStorei(GL_UNPACK_ROW_LENGTH, mappedSubResource.RowPitch / 4); // row length in pixels - - // Get the pixels from the staging texture - glTexSubImage2D(TextureTarget, 0, 0, 0, width, height, - glFormat, GL_UNSIGNED_BYTE, (const GLvoid *)mappedSubResource.pData); - - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - glBindTexture(GL_TEXTURE_2D, 0); - - // Copy the local texture to the user texture and invert as necessary - if(bInvert) - CopyTexture(m_TexID, GL_TEXTURE_2D, TextureID, TextureTarget, width, height, bInvert, HostFBO); - - spoutdx.GetDX11Context()->Unmap(m_pStaging[0], 0); - - return true; - } - - return false; - -} // end ReadDX11texture - - -// Copy OpenGL texture data to a pixel buffer via fbo -bool spoutGL::ReadTextureData(GLuint SourceID, GLuint SourceTarget, - unsigned int width, unsigned int height, unsigned int pitch, - unsigned char* dest, GLenum GLformat, bool bInvert, GLuint HostFBO) -{ - GLenum status; - - // Create or resize a local OpenGL texture - CheckOpenGLTexture(m_TexID, GL_RGBA, width, height); - - // Create a local fbo if not already - if (m_fbo == 0) glGenFramebuffersEXT(1, &m_fbo); - - // If texture ID is zero, assume the source texture is attached - // to the host fbo which is bound for read and write - if (SourceID == 0 && HostFBO > 0) { - // Bind our local fbo for draw only - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo); - // Source texture is already attached to point 0 for read - } - else { - // bind the local fbo for read and write - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - // Read from attachment point 0 - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - // Attach the Source texture to point 0 for read - glFramebufferTexture2DEXT(READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, SourceTarget, SourceID, 0); - } - - // Draw to attachment point 1 - glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); - - // Attach the texture we write into (the local texture) to attachment point 1 - glFramebufferTexture2DEXT(DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_TexID, 0); - - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { - - if (bInvert && m_bBLITavailable) { - - // copy the source texture (0) to the local texture (1) while flipping upside down - glBlitFramebufferEXT(0, 0, width, height, 0, height, width, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST); - // Bind local fbo for read - glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_fbo); - // Read from attachment point 1 - glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); - - // Read pixels from it - glPixelStorei(GL_PACK_ROW_LENGTH, pitch / 4); // row length in pixels - glReadPixels(0, 0, width, height, GLformat, GL_UNSIGNED_BYTE, (GLvoid *)dest); - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - - } - else { - - // No invert or no fbo blit extension - // Read from the source texture attachment point 0 - // This will be the local fbo if a texture ID was passed in - - // Pitch is destination line length in bytes. Divide by 4 to get the width in rgba pixels. - glPixelStorei(GL_PACK_ROW_LENGTH, pitch/4); // row length in pixels - glReadPixels(0, 0, width, height, GLformat, GL_UNSIGNED_BYTE, (GLvoid *)dest); - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - - } - } - else { - PrintFBOstatus(status); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - return false; - } - - // restore the previous fbo - default is 0 - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - - return true; - -} // end ReadTextureData - -// -// COPY IMAGE PIXELS TO THE SHARED DX11 TEXTURE VIA STAGING TEXTURES -// RGBA/RGB/BGRA/BGR supported -// -// GPU write is to DX11 -// Use staging texture to support RGBA/RGB -// -bool spoutGL::WriteDX11pixels(const unsigned char* pixels, - unsigned int width, unsigned int height, GLenum glFormat, bool bInvert) -{ - if (width != m_Width || height != m_Height || !pixels) - return false; - - // if(!CheckStagingTextures(width, height, 1)) - if (!CheckStagingTextures(width, height, 2)) - return false; - - // 1) pixels (RGBA or RGB) -> staging texture (RGBA) - CPU - // 2) staging texture -> DX11 sender texture (RGBA) CopyResource - GPU - // - // RGBA : - // 6.2 msec @ 3840 x 2160 - // 1.6 msec @ 1920 x 1080 - // RGBA Using UpdateSubresource (pixels > texture) instead of pixels > staging > texture - // 5.8 msec @ 3840 x 2160 - // 1.5 msec @ 1920 x 1080 - // RGB : - // 10 msec @ 3840 x 2160 - // 2.7 msec @ 1920 x 1080 - // - // Access the sender shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // Map the staging texture and write pixels to it (CPU) - WritePixelData(pixels, m_pStaging[0], width, height, glFormat, bInvert); - // Copy from the staging texture to the sender shared texture (GPU) - spoutdx.GetDX11Context()->CopyResource(m_pSharedTexture, m_pStaging[0]); - spoutdx.GetDX11Context()->Flush(); - frame.SetNewFrame(); - frame.AllowTextureAccess(m_pSharedTexture); - return true; - } - return false; - -} // end WriteDX11pixels - - -// Receive from a sender via DX11 staging textures to an rgba or rgb buffer of variable size -// A new shared texture pointer (m_pSharedTexture) is retrieved if the sender changed -bool spoutGL::ReadDX11pixels(unsigned char * pixels, unsigned int width, unsigned int height, GLenum glFormat, bool bInvert) -{ - if (!CheckStagingTextures(width, height, 2)) - return false; - - // Access the sender shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // Check if the sender has produced a new frame. - if (frame.GetNewFrame()) { - // Read from the sender GPU texture to CPU pixels via two staging textures - m_Index = (m_Index + 1) % 2; - m_NextIndex = (m_Index + 1) % 2; - // Copy from the sender's shared texture to the first staging texture - spoutdx.GetDX11Context()->CopyResource(m_pStaging[m_Index], m_pSharedTexture); - // Map and read from the second while the first is occupied - ReadPixelData(m_pStaging[m_NextIndex], pixels, m_Width, m_Height, glFormat, bInvert); - } - // Allow access to the shared texture - frame.AllowTextureAccess(m_pSharedTexture); - return true; - } - - return false; - -} - - -// RGBA/RGB/BGRA/BGR supported -bool spoutGL::WritePixelData(const unsigned char* pixels, ID3D11Texture2D* pStagingTexture, - unsigned int width, unsigned int height, GLenum glFormat, bool bInvert) -{ - if (!spoutdx.GetDX11Context() || !pStagingTexture || !pixels) - return false; - - // glFormat = GL_RGB 0x1907 - // glFormat = GL_RGBA 0x1908 - // glFormat = GL_BGR_EXT 0x80E0 - // glFormat = GL_BGRA_EXT 0x80E1 - // - // m_dwFormat = 28 RGBA staging textures - // m_dwFormat = 87 BGRA staging textures - - // Map the resource so we can access the pixels - D3D11_MAPPED_SUBRESOURCE mappedSubResource; - // Make sure all commands are done before mapping the staging texture - spoutdx.GetDX11Context()->Flush(); - // Map waits for GPU access - HRESULT hr = spoutdx.GetDX11Context()->Map(pStagingTexture, 0, D3D11_MAP_READ, 0, &mappedSubResource); - if (SUCCEEDED(hr)) { - // - // Copy from the pixel buffer to the staging texture - // - // The shared texture format is BGRA or RGBA and the staging textures are the same format. - // If the texture format is BGRA and the receiving pixel buffer is RGBA/RGB or vice-versa, - // the data has to be converted from BGRA to RGBA/RGB or RGBA to BGRA/BGR during the pixel copy. - // - if (glFormat == GL_RGBA) { // RGBA pixel buffer - if (m_dwFormat == 28) // RGBA staging textures - spoutcopy.rgba2rgba((const void *)pixels, mappedSubResource.pData, - width, height, width*4, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgba2bgra((const void *)pixels, mappedSubResource.pData, - width, height, width*4, mappedSubResource.RowPitch, bInvert); - } - else if (glFormat == GL_BGRA_EXT) { // BGRA pixel buffer - if (m_dwFormat == 28) - spoutcopy.rgba2bgra((const void *)pixels, mappedSubResource.pData, - width, height, width * 4, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgba2rgba((const void *)pixels, mappedSubResource.pData, - width, height, width*4, mappedSubResource.RowPitch, bInvert); - } - else if (glFormat == GL_RGB) { // RGB pixel buffer - if (m_dwFormat == 28) - spoutcopy.rgb2rgba((const void *)pixels, mappedSubResource.pData, - width, height, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgb2bgra((const void *)pixels, mappedSubResource.pData, - width, height, mappedSubResource.RowPitch, bInvert); - } - else if (glFormat == GL_BGR_EXT) { // BGR pixel buffer - if (m_dwFormat == 28) - spoutcopy.bgr2rgba((const void *)pixels, mappedSubResource.pData, - width, height, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgb2rgba((const void *)pixels, mappedSubResource.pData, - width, height, mappedSubResource.RowPitch, bInvert); - } - spoutdx.GetDX11Context()->Unmap(pStagingTexture, 0); - - return true; - - } // endif DX11 map OK - - return false; - -} // end WritePixelData - - -// -// COPY FROM A DX11 STAGING TEXTURE TO A USER RGBA/RGB/BGR PIXEL BUFFER -// -bool spoutGL::ReadPixelData(ID3D11Texture2D* pStagingTexture, unsigned char* pixels, - unsigned int width, unsigned int height, GLenum glFormat, bool bInvert) -{ - if (!spoutdx.GetDX11Context() || !pStagingTexture || !pixels) - return false; - - // glFormat = GL_RGB 0x1907 - // glFormat = GL_RGBA 0x1908 - // glFormat = GL_BGR_EXT 0x80E0 - // glFormat = GL_BGRA_EXT 0x80E1 - // - // m_dwFormat = 28 RGBA staging textures - // m_dwFormat = 87 BGRA staging textures - - // Map the resource so we can access the pixels - D3D11_MAPPED_SUBRESOURCE mappedSubResource; - // Make sure all commands are done before mapping the staging texture - spoutdx.GetDX11Context()->Flush(); - // Map waits for GPU access - HRESULT hr = spoutdx.GetDX11Context()->Map(pStagingTexture, 0, D3D11_MAP_READ, 0, &mappedSubResource); - if (SUCCEEDED(hr)) { - // - // Copy from staging texture to the pixel buffer - // - // The shared texture format is BGRA or RGBA and the staging textures are the same format. - // If the texture format is BGRA and the receiving pixel buffer is RGBA/RGB or vice-versa, - // the data has to be converted from BGRA to RGBA/RGB or RGBA to BGRA/BGR during the pixel copy. - // - if (glFormat == GL_RGBA) { // RGBA pixel buffer - if (m_dwFormat == 28) // RGBA staging textures - spoutcopy.rgba2rgba(mappedSubResource.pData, pixels, width, height, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgba2bgra(mappedSubResource.pData, pixels, width, height, mappedSubResource.RowPitch, bInvert); - } - else if (glFormat == GL_BGRA_EXT) { // BGRA pixel buffer - if (m_dwFormat == 28) - spoutcopy.rgba2bgra(mappedSubResource.pData, pixels, width, height, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgba2rgba(mappedSubResource.pData, pixels, width, height, mappedSubResource.RowPitch, bInvert); - } - else if (glFormat == GL_RGB) { // RGB pixel buffer - if (m_dwFormat == 28) - spoutcopy.rgba2rgb(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgba2bgr(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, bInvert); - } - else if (glFormat == GL_BGR_EXT) { // BGR pixel buffer - if (m_dwFormat == 28) - spoutcopy.rgba2bgr(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, bInvert); - else - spoutcopy.rgba2rgb(mappedSubResource.pData, pixels, m_Width, m_Height, mappedSubResource.RowPitch, bInvert); - } - - spoutdx.GetDX11Context()->Unmap(pStagingTexture, 0); - - return true; - } // endif DX11 map OK - - return false; - -} // end ReadPixelData - - -// Create class staging textures for changed size or if they do not exist yet -// Two are available but only one can be allocated to save memory -// Format is the same as the shared texture - m_dwFormat -bool spoutGL::CheckStagingTextures(unsigned int width, unsigned int height, int nTextures) -{ - if (!spoutdx.GetDX11Device()) { - return false; - } - - D3D11_TEXTURE2D_DESC desc = { 0 }; - - if (m_pStaging[0]) { - - // Get the size to test for change - m_pStaging[0]->GetDesc(&desc); - if (desc.Width != width || desc.Height != height) { - // Staging textures must not be mapped before release - if (m_pStaging[0]) spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), m_pStaging[0]); - if (m_pStaging[1]) spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), m_pStaging[1]); - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - // Drop through to create new textures - } - else { - return true; - } - } - - if (!spoutdx.CreateDX11StagingTexture(spoutdx.GetDX11Device(), width, height, (DXGI_FORMAT)m_dwFormat, &m_pStaging[0])) - return false; - - if (nTextures > 1) { - if (!spoutdx.CreateDX11StagingTexture(spoutdx.GetDX11Device(), width, height, (DXGI_FORMAT)m_dwFormat, &m_pStaging[1])) - return false; - } - - // Update class width and height - m_Width = width; - m_Height = height; - - // Reset staging texture index - m_Index = 0; - m_NextIndex = 0; - - // Also reset PBO index - PboIndex = 0; - NextPboIndex = 0; - - // Did something go wrong somehow - if (!m_pStaging[0]) - return false; - if (nTextures > 1 && !m_pStaging[1]) - return false; - - return true; - -} // end CheckStagingTextures - - -// -// Memoryshare functions - receive only -// - -// -// Read rgba shared memory to texture pixel data -// -bool spoutGL::ReadMemory(const char* sendername, GLuint TexID, GLuint TextureTarget, - unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - // Open the sender memory map and close it afterwards for a read, - // so that the receiver does not retain a handle to the shared memory - if (!memoryshare.OpenSenderMemory(sendername)) - return false; - - unsigned char* pBuffer = memoryshare.LockSenderMemory(); - - if (!pBuffer) { - memoryshare.CloseSenderMemory(); - return false; - } - - bool bRet = true; // Error only if pixel read fails - - // Query a new frame and read pixels while the buffer is locked - if (frame.GetNewFrame()) { - if (bInvert) { - // Create or resize a local OpenGL texture - CheckOpenGLTexture(m_TexID, GL_RGBA, width, height); - // Read the memory pixels into it - glBindTexture(GL_TEXTURE_2D, m_TexID); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (GLvoid *)pBuffer); - glBindTexture(GL_TEXTURE_2D, 0); - // Copy to the user texture, inverting at the same time - bRet = CopyTexture(m_TexID, GL_TEXTURE_2D, TexID, TextureTarget, width, height, true, HostFBO); - } - else { - // No invert - copy memory pixels directly to the user texture - glBindTexture(TextureTarget, TexID); - glTexSubImage2D(TextureTarget, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)pBuffer); - glBindTexture(TextureTarget, 0); - } - } // No new frame - - memoryshare.UnlockSenderMemory(); - - // Close the memory map handle so the sender can finally close the map - memoryshare.CloseSenderMemory(); - - return bRet; - -} - -// -// Read rgba shared memory to image pixels -// -bool spoutGL::ReadMemoryPixels(const char* sendername, unsigned char* pixels, - unsigned int width, unsigned int height, GLenum glFormat, bool bInvert) -{ - if (!pixels) - return false; - - // Open the sender memory map and close it afterwards for a read, - // so that the receiver does not retain a handle to the shared memory. - if (!memoryshare.OpenSenderMemory(sendername)) { - SpoutLogWarning("spoutGLDXinterop::ReadMemoryPixels - no buffer"); - return false; - } - - unsigned char* pBuffer = memoryshare.LockSenderMemory(); - if (!pBuffer) { - memoryshare.CloseSenderMemory(); - SpoutLogWarning("spoutGLDXinterop::ReadMemoryPixels - no buffer lock"); - return false; - } - - // Query a new frame and read pixels while the buffer is locked - if (frame.GetNewFrame()) { - // Read pixels from shared memory - if (glFormat == GL_RGBA) { - spoutcopy.CopyPixels(pBuffer, pixels, width, height, GL_RGBA, bInvert); - } - } - memoryshare.UnlockSenderMemory(); - // Close the memory map handle so the sender can close the map - memoryshare.CloseSenderMemory(); - - return true; - -} - -//--------------------------------------------------------- -bool spoutGL::SetHostPath(const char *sendername) -{ - SharedTextureInfo info; - if (!sendernames.getSharedInfo(sendername, &info)) { - SpoutLogWarning("spoutGL::SetHostPath(%s) - could not get sender info", sendername); - return false; - } - char exepath[256]; - GetModuleFileNameA(NULL, exepath, sizeof(exepath)); - // Description is defined as wide chars, but the path is stored as byte chars - strcpy_s((char*)info.description, 256, exepath); - if (!sendernames.setSharedInfo(sendername, &info)) { - SpoutLogWarning("spoutGL::SetHostPath(%s) - could not set sender info", sendername); - } - return true; - -} - - -//--------------------------------------------------------- -// CPU mode is "not GL/DX compatible" -// 2.006 senders will typically not have this bit set -// so GL/DX compatibility is assumed -bool spoutGL::SetSenderCPUmode(const char *sendername, bool bCPU) -{ - SharedTextureInfo info; - - if (sendernames.getSharedInfo(sendername, &info)) { - // CPU mode - set top bit of 32 bit partner ID field - // 1000 0000 0000 0000 0000 0000 0000 0000 - if (bCPU) { - info.partnerId = info.partnerId | 0x80000000; // Set bit - m_bSenderCPUmode = true; - } - else { - info.partnerId = info.partnerId & ~0x80000000; // Clear bit default - m_bSenderCPUmode = false; - } - - // Save the info for this sender in the sender shared memory map - sendernames.setSharedInfo(sendername, &info); - return true; - } - return false; - -} - -//--------------------------------------------------------- -bool spoutGL::OpenDirectX11() -{ - SpoutLogNotice("spoutGL::OpenDirectX11"); - return spoutdx.OpenDirectX11(); -} - -//--------------------------------------------------------- -ID3D11Device* spoutGL::GetDX11Device() -{ - return spoutdx.GetDX11Device(); -} - -//--------------------------------------------------------- -ID3D11DeviceContext* spoutGL::GetDX11Context() -{ - return spoutdx.GetDX11Context(); -} - -//--------------------------------------------------------- -void spoutGL::CleanupDirectX() -{ - // DirectX 9 not supported >= 2.007 - CleanupDX11(); -} - -//--------------------------------------------------------- -void spoutGL::CleanupDX11() -{ - if (spoutdx.GetDX11Device()) { - - SpoutLogNotice("spoutGL::CleanupDX11()"); - - // Reference count warnings are in the SpoutDirectX class - - if (m_pSharedTexture) { - SpoutLogNotice(" Releasing shared texture"); - // Release interop link before releasing the texture - if (m_hInteropDevice && m_hInteropObject) - wglDXUnregisterObjectNV(m_hInteropDevice, m_hInteropObject); - spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), m_pSharedTexture); - } - - // Important to set pointer to NULL or it will crash if released again - m_pSharedTexture = nullptr; - - // Re-set shared texture handle - m_dxShareHandle = nullptr; - - // Release staging texture if they have been used - if (m_pStaging[0]) spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), m_pStaging[0]); - if (m_pStaging[1]) spoutdx.ReleaseDX11Texture(spoutdx.GetDX11Device(), m_pStaging[1]); - m_pStaging[0] = nullptr; - m_pStaging[1] = nullptr; - m_Index = 0; - m_NextIndex = 0; - - // 12.11.18 - To avoid memory leak with dynamic objects - // must always be freed, not only on exit. - // Device recreated for a new sender. - // Releases immediate context and device in the SpoutDirectX class - // spoutdx.GetDX11Context() and spoutdx.GetDX11Device() are copies of these - spoutdx.CloseDirectX11(); - } - -} - -// -// Extensions and availability -// - -//--------------------------------------------------------- -bool spoutGL::LoadGLextensions() -{ - // Return silently if already loaded - if (m_caps > 0) - return true; - - m_caps = loadGLextensions(); // in spoutGLextensions - - if (m_caps == 0) { - SpoutLogError("spoutGL::LoadGLextensions failed"); - return false; - } - - m_bFBOavailable = false; - if (m_caps & GLEXT_SUPPORT_FBO) m_bFBOavailable = true; - // FBO not available is terminal - if (!m_bFBOavailable) { - SpoutLogError("spoutGL::LoadGLextensions - no FBO extensions available"); - return false; - } - - m_bGLDXavailable = false; - m_bBLITavailable = false; - m_bSWAPavailable = false; - m_bBGRAavailable = false; - m_bCOPYavailable = false; - m_bCONTEXTavailable = false; - - if (m_caps & GLEXT_SUPPORT_NVINTEROP) m_bGLDXavailable = true; // Interop needed for texture sharing - if (m_caps & GLEXT_SUPPORT_FBO_BLIT) m_bBLITavailable = true; - if (m_caps & GLEXT_SUPPORT_SWAP) m_bSWAPavailable = true; - if (m_caps & GLEXT_SUPPORT_BGRA) m_bBGRAavailable = true; - if (m_caps & GLEXT_SUPPORT_COPY) m_bCOPYavailable = true; - if (m_caps & GLEXT_SUPPORT_CONTEXT) m_bCONTEXTavailable = true; - - // Test PBO availability unless user has selected buffering off - // m_bPBOavailable also set by SetBufferMode() - if (m_bPBOavailable) - if (!(m_caps && GLEXT_SUPPORT_PBO)) m_bPBOavailable = false; - - if (!m_bGLDXavailable) - SpoutLogWarning("spoutGL::LoadGLextensions - interop extensions not available"); - if (!m_bBLITavailable) - SpoutLogWarning("spoutGL::LoadGLextensions - fbo blit extension not available"); - if (!m_bSWAPavailable) - SpoutLogWarning("spoutGL::LoadGLextensions - sync control extensions not available"); - if (!m_bBGRAavailable) - SpoutLogWarning("spoutGL::LoadGLextensions - bgra extension not available"); - if (!m_bCOPYavailable) - SpoutLogWarning("spoutGL::LoadGLextensions - copy extensions not available"); - if (!m_bPBOavailable) - SpoutLogWarning("spoutGL::LoadGLextensions - pbo extensions not available"); - if (!m_bCONTEXTavailable) - SpoutLogWarning("spoutGL::LoadGLextensions - context extension not available"); - m_bExtensionsLoaded = true; - - return true; -} - -//--------------------------------------------------------- -bool spoutGL::IsGLDXavailable() -{ - return m_bGLDXavailable; -} - -//--------------------------------------------------------- -bool spoutGL::IsBLITavailable() -{ - return m_bBLITavailable; -} - -//--------------------------------------------------------- -bool spoutGL::IsSWAPavailable() -{ - return m_bSWAPavailable; -} - -//--------------------------------------------------------- -bool spoutGL::IsBGRAavailable() -{ - return m_bBGRAavailable; -} - -//--------------------------------------------------------- -bool spoutGL::IsCOPYavailable() -{ - return m_bCOPYavailable; -} - -//--------------------------------------------------------- -bool spoutGL::IsPBOavailable() -{ - return m_bPBOavailable; -} - -//--------------------------------------------------------- -bool spoutGL::IsCONTEXTavailable() -{ - return m_bCONTEXTavailable; -} - -// -// Legacy OpenGL functions -// - -#ifdef legacyOpenGL - -//--------------------------------------------------------- -void spoutGL::SaveOpenGLstate(unsigned int width, unsigned int height, bool bFitWindow) -{ - float dim[4]; - float vpScaleX, vpScaleY, vpWidth, vpHeight; - int vpx, vpy; - - // save texture state, client state, etc. - glPushAttrib(GL_ALL_ATTRIB_BITS); - glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); - - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glLoadIdentity(); - - glPushAttrib(GL_TRANSFORM_BIT); - - // find the current viewport dimensions in order to scale to the aspect ratio required - glGetFloatv(GL_VIEWPORT, dim); - - // Fit to window - if (bFitWindow) { - // Scale both width and height to the current viewport size - vpScaleX = dim[2] / (float)width; - vpScaleY = dim[3] / (float)height; - vpWidth = (float)width * vpScaleX; - vpHeight = (float)height * vpScaleY; - vpx = vpy = 0; - } - else { - // Preserve aspect ratio of the sender - // and fit to the width or the height - vpWidth = dim[2]; - vpHeight = ((float)height / (float)width)*vpWidth; - if (vpHeight > dim[3]) { - vpHeight = dim[3]; - vpWidth = ((float)width / (float)height)*vpHeight; - } - vpx = (int)(dim[2] - vpWidth) / 2;; - vpy = (int)(dim[3] - vpHeight) / 2; - } - - glViewport((int)vpx, (int)vpy, (int)vpWidth, (int)vpHeight); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); // reset the current matrix back to its default state - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0f, 1.0f); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); -} - - -void spoutGL::RestoreOpenGLstate() -{ - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - - glPopAttrib(); - - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - - glPopClientAttrib(); - glPopAttrib(); - -} - -#endif - -// -// Utility -// - -//--------------------------------------------------------- -// Given a DeviceKey string from a DisplayDevice -// read all the information about the adapter. -// Only used by this class. -bool spoutGL::OpenDeviceKey(const char* key, int maxsize, char* description, char* version) -{ - if (!key) - return false; - - // Extract the subkey from the DeviceKey string - HKEY hRegKey = nullptr; - DWORD dwSize = 0; - DWORD dwKey = 0; - - char output[256]; - strcpy_s(output, 256, key); - char *found = strstr(output, "System"); - if (!found) - return false; - std::string SubKey = found; - - // Convert all slash to double slash using a C++ string function - // to get subkey string required to extract registry information - for (unsigned int i = 0; i < SubKey.length(); i++) { - if (SubKey[i] == '\\') { - SubKey.insert(i, 1, '\\'); - ++i; // Skip inserted char - } - } - - // Open the key to find the adapter details - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, SubKey.c_str(), NULL, KEY_READ, &hRegKey) == 0) { - dwSize = MAX_PATH; - // Adapter name - if (RegQueryValueExA(hRegKey, "DriverDesc", NULL, &dwKey, (BYTE*)output, &dwSize) == 0) { - strcpy_s(description, (rsize_t)maxsize, output); - } - if (RegQueryValueExA(hRegKey, "DriverVersion", NULL, &dwKey, (BYTE*)output, &dwSize) == 0) { - // Find the last 6 characters of the version string then - // convert to a float and multiply to get decimal in the right place - sprintf_s(output, 256, "%5.2f", atof(output + strlen(output) - 6)*100.0); - strcpy_s(version, (rsize_t)maxsize, output); - } // endif DriverVersion - RegCloseKey(hRegKey); - } // endif RegOpenKey - - return true; -} - -//--------------------------------------------------------- -void spoutGL::trim(char* s) { - char* p = s; - int l = (int)strlen(p); - - while (isspace(p[l - 1])) p[--l] = 0; - while (*p && isspace(*p)) ++p, --l; - - memmove(s, p, (size_t)(l + 1)); -} - -// -// Errors -// - -void spoutGL::PrintFBOstatus(GLenum status) -{ - char tmp[256]; - sprintf_s(tmp, 256, "FBO status error %u (0x%.7X) - ", status, status); - if (status == GL_FRAMEBUFFER_UNSUPPORTED_EXT) - strcat_s(tmp, 256, "GL_FRAMEBUFFER_UNSUPPORTED_EXT"); - else if (status == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT) - strcat_s(tmp, 256, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT"); - else if (status == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT) - strcat_s(tmp, 256, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT"); - else if (status == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT) - strcat_s(tmp, 256, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT - width-height problems?"); - else if (status == GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT) - strcat_s(tmp, 256, "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT"); - else if (status == GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT) - strcat_s(tmp, 256, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT"); - else if (status == GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT) - strcat_s(tmp, 256, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT"); - // else if (status == GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT) - // strcat_s(tmp, 256, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT\n"); - else - strcat_s(tmp, 256, "Unknown Code"); - SpoutLogError("%s", tmp); - GLerror(); -} - -bool spoutGL::GLerror() { - GLenum err = GL_NO_ERROR; - bool bError = false; - while ((err = glGetError()) != GL_NO_ERROR) { - SpoutLogError(" GLerror - OpenGL error = %u (0x%.7X)", err, err); - bError = true; - // gluErrorString needs glu32.lib - // printf("GL error = %d (0x%.7X) %s\n", err, err, gluErrorString(err)); - } - return bError; -} - -// -// Group: User registry settings recorded by "SpoutSettings" -// -// User settings are retrieved in constructor and can be -// set for the application (except max senders which must be global) -// - -//--------------------------------------------------------- -// Function: GetBufferMode -// Get user buffering mode -// -bool spoutGL::GetBufferMode() -{ - return m_bPBOavailable; -} - -//--------------------------------------------------------- -// Function: SetBufferMode -// Set application buffering mode -void spoutGL::SetBufferMode(bool bActive) -{ - if (m_bExtensionsLoaded) { - if (bActive) { - if (m_caps & GLEXT_SUPPORT_PBO) { - m_bPBOavailable = true; - } - } - else { - m_bPBOavailable = false; - } - } - else { - m_bPBOavailable = false; - } -} - -//--------------------------------------------------------- -// Function: GetBuffers -// Get user number of pixel buffers -int spoutGL::GetBuffers() -{ - return m_nBuffers; -} - -//--------------------------------------------------------- -// Function: SetBuffers -// Set application number of pixel buffers -void spoutGL::SetBuffers(int nBuffers) -{ - m_nBuffers = nBuffers; -} - -//--------------------------------------------------------- -// Function: GetMaxSenders -// Get user Maximum senders allowed -int spoutGL::GetMaxSenders() -{ - return sendernames.GetMaxSenders(); -} - -//--------------------------------------------------------- -// Function: SetMaxSenders -// Set user Maximum senders allowed -void spoutGL::SetMaxSenders(int maxSenders) -{ - // Setting must be global for all applications - sendernames.SetMaxSenders(maxSenders); -} - -// -// Group: Retained for 2.006 compatibility -// - -//--------------------------------------------------------- -// Function: GetDX9 -// Get user DX9 mode -bool spoutGL::GetDX9() -{ - DWORD dwDX9 = 0; - ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "DX9", &dwDX9); - return (dwDX9 == 1); -} - -//--------------------------------------------------------- -// Function: SetDX9 -// Set user DX9 mode -bool spoutGL::SetDX9(bool bDX9) -{ - return WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "DX9", (DWORD)bDX9); -} - -//--------------------------------------------------------- -// Function: GetMemoryShareMode -// Get user memory share mode -bool spoutGL::GetMemoryShareMode() -{ - DWORD dwMem = 0; - ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "MemoryShare", &dwMem); - return (dwMem == 1); -} - -//--------------------------------------------------------- -// Function: SetMemoryShareMode -// Set user memory share mode -bool spoutGL::SetMemoryShareMode(bool bMem) -{ - return WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "MemoryShare", (DWORD)bMem); -} - -//--------------------------------------------------------- -// Function: GetCPUmode -// Get user CPU mode -bool spoutGL::GetCPUmode() -{ - DWORD dwCpu = 0; - ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "CPU", &dwCpu); - return (dwCpu == 1); -} - -//--------------------------------------------------------- -// Function: SetCPUmode -// Set user CPU mode -bool spoutGL::SetCPUmode(bool bCPU) -{ - return WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "CPU", (DWORD)bCPU); -} - -// Function: GetShareMode -// Get user share mode -// 0 - texture, 1 - memory, 2 - CPU -int spoutGL::GetShareMode() -{ - DWORD dwMem = 0; - DWORD dwCPU = 0; - ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "MemoryShare", &dwMem); - ReadDwordFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "CPU", &dwCPU); - - if (dwCPU > 0) { - return 2; - } - if (dwMem > 0) { - return 1; - } - - // 0 : Texture share default - return 0; - -} - -//--------------------------------------------------------- -// Function: SetShareMode -// Set user share mode -// 0 - texture, 1 - memory, 2 - CPU -void spoutGL::SetShareMode(int mode) -{ - switch (mode) { - - case 1: // Memory - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "MemoryShare", 1); - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "CPU", 0); - break; - case 2: // CPU - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "MemoryShare", 0); - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "CPU", 1); - break; - default: // 0 - Texture - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "MemoryShare", 0); - WriteDwordToRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "CPU", 0); - break; - } -} - -// -// Group: Information -// - -//--------------------------------------------------------- -// Function: GetHostPath -// The path of the host that produced the sender -// -// Retrieved from the description string in the sender info memory map -bool spoutGL::GetHostPath(const char* sendername, char* hostpath, int maxchars) -{ - SharedTextureInfo info; - int n; - - if (!sendernames.getSharedInfo(sendername, &info)) { - // Just quit if the key does not exist - SpoutLogWarning("spoutGL::GetHostPath - could not get sender info [%s]", sendername); - return false; - } - - n = maxchars; - if (n > 256) n = 256; // maximum field width in shared memory - - strcpy_s(hostpath, n, (char*)info.description); - - return true; -} - -//--------------------------------------------------------- -// Function: GetVerticalSync -// Vertical sync status -int spoutGL::GetVerticalSync() -{ - // Needs OpenGL context - if (wglGetCurrentContext()) { - // needed for both sender and receiver - if (m_bSWAPavailable) { - return(wglGetSwapIntervalEXT()); - } - } - return 0; -} - -//--------------------------------------------------------- -// Function: SetVerticalSync -// Lock to monitor vertical sync -bool spoutGL::SetVerticalSync(bool bSync) -{ - // wglSwapIntervalEXT specifies the minimum number - // of video frame periods per buffer swap - if (wglGetCurrentContext()) { - if (m_bSWAPavailable) { - if (bSync) { - wglSwapIntervalEXT(1); // lock to monitor vsync - } - else { - // buffer swaps are not synchronized to a video frame. - wglSwapIntervalEXT(0); // unlock from monitor vsync - } - return true; - } - } - return false; -} - -//--------------------------------------------------------- -// Function: GetSpoutVersion -// Get Spout version -int spoutGL::GetSpoutVersion() -{ - // Version number is retrieved from the registry at class initialization - // Integer number 2005, 2006, 2007 etc. - // 0 for earlier than 2.005 - // Set by the Spout installer for 2.005/2.006, or by SpoutSettings - return m_SpoutVersion; -} - -// -// Group: Utilities -// - -//--------------------------------------------------------- -// Function: CopyTexture -// Copy OpenGL texture with optional invert -// Textures must be the same size -bool spoutGL::CopyTexture(GLuint SourceID, GLuint SourceTarget, - GLuint DestID, GLuint DestTarget, unsigned int width, unsigned int height, - bool bInvert, GLuint HostFBO) -{ - GLenum status; - - // Create an fbo if not already - if (m_fbo == 0) - glGenFramebuffersEXT(1, &m_fbo); - - // bind the FBO (for both, READ_FRAMEBUFFER_EXT and DRAW_FRAMEBUFFER_EXT) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - - // Attach the Source texture to the color buffer in our frame buffer - glFramebufferTexture2DEXT(READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, SourceTarget, SourceID, 0); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - - // Attach destination texture (the texture we write into) to second attachment point - glFramebufferTexture2DEXT(DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, DestTarget, DestID, 0); - glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); - - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { - - if (m_bBLITavailable) { - if (bInvert) { - // Blit method with checks - 0.75 - 0.85 msec - // copy one texture buffer to the other while flipping upside down - // (OpenGL and DirectX have different texture origins) - glBlitFramebufferEXT(0, 0, // srcX0, srcY0, - width, height, // srcX1, srcY1 - 0, height, // dstX0, dstY0, - width, 0, // dstX1, dstY1, - GL_COLOR_BUFFER_BIT, GL_NEAREST); - } - else { - // Do not flip during blit - glBlitFramebufferEXT(0, 0, // srcX0, srcY0, - width, height, // srcX1, srcY1 - 0, 0, // dstX0, dstY0, - width, height, // dstX1, dstY1, - GL_COLOR_BUFFER_BIT, GL_NEAREST); - } - } - else { - // No fbo blit extension - // Copy from the fbo (source texture attached) to the dest texture - glBindTexture(DestTarget, DestID); - glCopyTexSubImage2D(DestTarget, 0, 0, 0, 0, 0, width, height); - glBindTexture(DestTarget, 0); - } - } - else { - PrintFBOstatus(status); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - return false; - } - - // restore the previous fbo - default is 0 - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HostFBO); - - return true; - -} // end CopyTexture - -//--------------------------------------------------------- -// Function: RemovePadding -// Remove line padding from a source image and crerate a destination image without padding -void spoutGL::RemovePadding(const unsigned char *source, unsigned char *dest, - unsigned int width, unsigned int height, unsigned int stride, GLenum glFormat) -{ - spoutcopy.RemovePadding(source, dest, width, height, stride, glFormat); -} - - -// -// Group : DX11 texture copy versions -// -// - https://github.com/DashW/Spout2 -// - -//--------------------------------------------------------- -// Function: ReadTexture -// Copy the sender DirectX shared texture -bool spoutGL::ReadTexture(ID3D11Texture2D** texture) -{ - // Only for DX11 mode - if (!texture || !*texture || !spoutdx.GetDX11Context()) { - return false; - } - - D3D11_TEXTURE2D_DESC desc = { 0 }; - (*texture)->GetDesc(&desc); - if (desc.Width != m_Width || desc.Height != m_Height) { - return false; - } - if (frame.CheckTextureAccess(m_pSharedTexture)) { - // Copy the shared texture if the sender has produced a new frame - if (frame.GetNewFrame()) { - spoutdx.GetDX11Context()->CopyResource(*texture, m_pSharedTexture); - } - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - } - - return true; - -} // end ReadTexture - -//--------------------------------------------------------- -// Function: WriteTexture -// Copy to the sender DirectX shared texture -bool spoutGL::WriteTexture(ID3D11Texture2D** texture) -{ - // Only for DX11 mode - if (!texture || !spoutdx.GetDX11Context()) { - SpoutLogWarning("spoutGL::WriteTexture(ID3D11Texture2D** texture) failed"); - if (!texture) - SpoutLogWarning(" ID3D11Texture2D** NULL"); - if (!spoutdx.GetDX11Context()) - SpoutLogVerbose(" pImmediateContext NULL"); - return false; - } - - bool bRet = false; - D3D11_TEXTURE2D_DESC desc = { 0 }; - - (*texture)->GetDesc(&desc); - if (desc.Width != m_Width || desc.Height != m_Height) { - SpoutLogWarning("spoutGL::WriteTexture(ID3D11Texture2D** texture) sizes do not match"); - SpoutLogWarning(" texture (%dx%d) : sender (%dx%d)", desc.Width, desc.Height, m_Width, m_Height); - return false; - } - - // Wait for access to the shared texture - if (frame.CheckTextureAccess(m_pSharedTexture)) { - spoutdx.GetDX11Context()->CopyResource(m_pSharedTexture, *texture); - // Flush after update of the shared texture on this device - spoutdx.GetDX11Context()->Flush(); - // Increment the sender frame counter - frame.SetNewFrame(); - // Release mutex and allow access to the texture - frame.AllowTextureAccess(m_pSharedTexture); - bRet = true; - } - - return bRet; -} diff --git a/Plugin/Spout/SpoutGL/SpoutGL.h b/Plugin/Spout/SpoutGL/SpoutGL.h deleted file mode 100644 index e3aea8a..0000000 --- a/Plugin/Spout/SpoutGL/SpoutGL.h +++ /dev/null @@ -1,414 +0,0 @@ -/* - - SpoutGL.h - - Base class for OpenGL SpoutSDK - See also Sender and Receiver wrapper classes. - - Copyright (c) 2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once - -#ifndef __spoutGL__ -#define __spoutGL__ - -// Change the path as required -#include "SpoutCommon.h" // for dll build and utilities -#include "SpoutSenderNames.h" // for sender creation and update -#include "SpoutDirectX.h" // for DX11 shared textures -#include "SpoutFrameCount.h" // for mutex lock and new frame signal -#include "SpoutCopy.h" // for pixel copy -#include "SpoutUtils.h" // Registry utiities -#include "SpoutGLextensions.h" // include last due to redefinition problems with OpenCL - -#include // for _getcwd -#include // for PROCESSENTRY32 -#include // for _tcsicmp - -using namespace spoututils; - -class SPOUT_DLLEXP spoutGL { - - public: - - spoutGL(); - ~spoutGL(); - - // - // OpenGL shared texture access - // - - // Bind OpenGL shared texture - bool BindSharedTexture(); - // Un-bind OpenGL shared texture - bool UnBindSharedTexture(); - // OpenGL shared texture ID - GLuint GetSharedTextureID(); - - // - // Graphics compatibility - // - - // Get auto GPU/CPU share depending on compatibility - bool GetAutoShare(); - // Set auto GPU/CPU share depending on compatibility - void SetAutoShare(bool bAuto = true); - // OpenGL texture share compatibility - bool IsGLDXready(); - - // - // User settings recorded by "SpoutSettings" - // - - // Get user buffering mode - bool GetBufferMode(); - // Set application buffering mode - void SetBufferMode(bool bActive = true); - // Get user number of pixel buffers - int GetBuffers(); - // Set application number of pixel buffers - void SetBuffers(int nBuffers); - // Get user Maximum senders allowed - int GetMaxSenders(); - // Set user Maximum senders allowed - void SetMaxSenders(int maxSenders); - - // - // 2.006 compatibility - // - - // Get user DX9 mode - bool GetDX9(); - // Set user DX9 mode - bool SetDX9(bool bDX9 = true); - // Get user memory share mode - bool GetMemoryShareMode(); - // Set user memory share mode - bool SetMemoryShareMode(bool bMem = true); - // Get user CPU mode - bool GetCPUmode(); - // Set user CPU mode - bool SetCPUmode(bool bCPU); - // Get user share mode - // 0 - texture, 1 - memory, 2 - CPU - int GetShareMode(); - // Set user share mode - // 0 - texture, 1 - memory, 2 - CPU - void SetShareMode(int mode); - - // - // Information - // - - // The path of the host that produced the sender - bool GetHostPath(const char *sendername, char *hostpath, int maxchars); - // Vertical sync status - int GetVerticalSync(); - // Lock to monitor vertical sync - bool SetVerticalSync(bool bSync = true); - // Get Spout version - int GetSpoutVersion(); - - // - // Utility - // - - // Copy OpenGL texture with optional invert - // Textures must be the same size - bool CopyTexture(GLuint SourceID, GLuint SourceTarget, GLuint DestID, GLuint DestTarget, - unsigned int width, unsigned int height, bool bInvert = false, GLuint HostFBO = 0); - // Correct for image stride - void RemovePadding(const unsigned char *source, unsigned char *dest, - unsigned int width, unsigned int height, unsigned int stride, GLenum glFormat = GL_RGBA); - - // DX11 texture read - // o Copy from the shared DX11 texture to a DX11 texture - bool ReadTexture(ID3D11Texture2D** texture); - // DX11 texture write - // o Copy a DX11 texture to the shared DX11 texture - bool WriteTexture(ID3D11Texture2D** texture); - - // Initialize OpenGL and DX11 - // o Load extensions and check for availability and function - // o Open DirectX and check for availability - // o Compatibility test for use or GL/DX interop - // o Optionally re-test compatibility even if already initialized - bool OpenSpout(bool bRetest = false); - // Initialize DirectX - bool OpenDirectX(); - // Set sender DX11 shared texture format - void SetDX11format(DXGI_FORMAT textureformat); - // Close DirectX and free resources - void CloseDirectX(); - // Create an OpenGL window and context for situations where there is none. - // Not used if applications already have an OpenGL context. - // Always call CloseOpenGL afterwards. - bool CreateOpenGL(); - // Close OpenGL window - bool CloseOpenGL(); - // Class initialization status - bool IsSpoutInitialized(); - - // Perform tests for GL/DX interop availability and compatibility - bool GLDXready(); - - - // 2.006 compatibility - bool OpenDirectX11(); - ID3D11Device* GetDX11Device(); - ID3D11DeviceContext* GetDX11Context(); - void CleanupDirectX(); - void CleanupDX11(); - void CleanupInterop(); - - // OpenGL extensions - bool LoadGLextensions(); - bool IsGLDXavailable(); // GL/DX interop extensions supported - bool IsBLITavailable(); // fbo blit extensions available - bool IsSWAPavailable(); // swap extensions available - bool IsBGRAavailable(); // bgra extensions available - bool IsCOPYavailable(); // copy extensions available - bool IsPBOavailable(); // pbo extensions supported - bool IsCONTEXTavailable(); // Context extension supported - - // Legacy OpenGL functions - // See _SpoutCommon.h_ #define legacyOpenGL -#ifdef legacyOpenGL - void SaveOpenGLstate(unsigned int width, unsigned int height, bool bFitWindow = true); - void RestoreOpenGLstate(); -#endif - - - // Public for special use - - // Link a shared DirectX texture to an OpenGL texture - HANDLE LinkGLDXtextures(void* pDXdevice, void* pSharedTexture, HANDLE dxShareHandle, GLuint glTextureID); - // Return a handle to the the DX/GL interop device - HANDLE GetInteropDevice(); - - // For external access - - // DirectX 11 texture sharing - spoutDirectX spoutdx; - // Pixel buffer copying - spoutCopy spoutcopy; - // Spout sender management - spoutSenderNames sendernames; - // Frame counting management - spoutFrameCount frame; - - // - // Memory sharing - receive only - // - // Used if a receiver detects a zero share handle for an existing 2.006 sender. - // Retained for 2.006 compatibility but may be removed for future release. - // - - struct { - - SpoutSharedMemory *senderMem; - unsigned int m_Width; - unsigned int m_Height; - - // Open an existing named shared memory map - bool OpenSenderMemory(const char *sendername) - { - std::string namestring = sendername; - // Create a name for the map from the sender name - namestring += "_map"; - // Create a new shared memory class object for this receiver - if (!senderMem) - senderMem = new SpoutSharedMemory(); - // Open the sender's shared memory map. - // This also creates a mutex for the receiver - // to lock and unlock the map for reads. - if (!senderMem->Open(namestring.c_str())) { - SpoutLogWarning("spoutGL.memoryshare::OpenSenderMemory - open shared memory failed"); - return false; - } - return true; - } // end OpenSenderMemory - - // Close the sender shared memory map - void CloseSenderMemory() - { - if (senderMem) senderMem->Close(); - senderMem = nullptr; - m_Width = 0; - m_Height = 0; - } // end CloseSenderMemory - - // Lock and unlock memory and retrieve buffer pointer - no size checks - unsigned char * LockSenderMemory() - { - if (!senderMem) return nullptr; - char *pBuf = senderMem->Lock(); - if (!pBuf) { - // https://github.com/leadedge/Spout2/issues/15 - // senderMem->Unlock(); - return nullptr; - } - return (unsigned char *)pBuf; - } - - void UnlockSenderMemory() - { - if (!senderMem) return; - senderMem->Unlock(); - } - - } memoryshare; - - -protected : - - // GL/DX functions - bool CreateInterop(unsigned int width, unsigned int height, DWORD dwFormat, bool bReceive); - HRESULT LockInteropObject(HANDLE hDevice, HANDLE *hObject); - HRESULT UnlockInteropObject(HANDLE hDevice, HANDLE *hObject); - void CleanupGL(); // Free OpenGL resources - - // OpenGL texture create - void CheckOpenGLTexture(GLuint &texID, GLenum GLformat, unsigned int width, unsigned int height); - void InitTexture(GLuint &texID, GLenum GLformat, unsigned int width, unsigned int height); - - // OpenGL texture copy - bool WriteGLDXtexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert = true, GLuint HostFBO = 0); - bool ReadGLDXtexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert = false, GLuint HostFBO = 0); - bool SetSharedTextureData(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO); - bool GetSharedTextureData(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO); - - // OpenGL pixel copy - bool WriteGLDXpixels(const unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFBO = 0); - bool ReadGLDXpixels(unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFBO = 0); - - // PBOs for OpenGL pixel copy - GLuint m_pbo[4]; - int PboIndex; - int NextPboIndex; - int m_nBuffers; - bool UnloadTexturePixels(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, unsigned int pitch, - unsigned char* data, GLenum glFormat = GL_RGBA, - bool bInvert = false, GLuint HostFBO = 0); - - // OpenGL <-> DX11 - bool WriteDX11texture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO); - bool ReadDX11texture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO); - bool ReadTextureData(GLuint SourceID, GLuint SourceTarget, unsigned int width, unsigned int height, unsigned int pitch, unsigned char* dest, GLenum GLformat, bool bInvert, GLuint HostFBO); - - // Pixels <-> DX11 - bool WriteDX11pixels(const unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat = GL_RGBA, bool bInvert = false); - bool ReadDX11pixels(unsigned char * pixels, unsigned int width, unsigned int height, GLenum glFormat = GL_RGBA, bool bInvert = false); - bool WritePixelData(const unsigned char* pixels, ID3D11Texture2D* pStagingTexture, unsigned int width, unsigned int height, GLenum glFormat, bool bInvert); - bool ReadPixelData(ID3D11Texture2D* pStagingTexture, unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat, bool bInvert); - - // Staging textures for DX11 CPU copy - ID3D11Texture2D* m_pStaging[2]; - int m_Index; - int m_NextIndex; - bool CheckStagingTextures(unsigned int width, unsigned int height, int nTextures); - - // Shared memory - receive only - bool ReadMemory(const char* sendername, GLuint TexID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert = false, GLuint HostFBO = 0); - bool ReadMemoryPixels(const char* sendername, unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat = GL_RGBA, bool bInvert = false); - - // Set host path to sender information - bool SetHostPath(const char *sendername); - // Set GL/DX compatibility to sender information - bool SetSenderCPUmode(const char *sendername, bool bCPU); - - // Utility - bool OpenDeviceKey(const char* key, int maxsize, char* description, char* version); - void trim(char* s); - - // Errors - void PrintFBOstatus(GLenum status); - bool GLerror(); - - // - // Class globals - // - - // Sender/Receiver - char m_SenderName[256]; - char m_SenderNameSetup[256]; - unsigned int m_Width; - unsigned int m_Height; - - // General - GLuint m_fbo; // Fbo used for OpenGL functions - GLuint m_TexID; // Class texture used for invert copy - unsigned int m_TexWidth; - unsigned int m_TexHeight; - DWORD m_TexFormat; - GLuint m_glTexture; // OpenGL shared texture - ID3D11Texture2D* m_pSharedTexture; // DirectX shared texture - HANDLE m_dxShareHandle; // DirectX shared texture handle - DWORD m_dwFormat; // DirectX shared texture format - DXGI_FORMAT m_DX11format; // DirectX 11 texture format - - // GL/DX interop - HANDLE m_hInteropDevice; // Handle to the DX/GL interop device - HANDLE m_hInteropObject; // Handle to the DX/GL interop object (the shared texture) - HWND m_hWnd; // OpenGL window - int m_SpoutVersion; // Spout version - - // For CreateOpenGL and CloseOpenGL - HDC m_hdc = NULL; - HWND m_hwndButton = NULL; - HGLRC m_hRc = NULL; - - // Status flags - bool m_bConnected; - bool m_bNewFrame; - bool m_bUpdated; - bool m_bInitialized; - bool m_bMirror; // Mirror image (used for SpoutCam) - bool m_bSwapRB; // RGB <> BGR (used for SpoutCam) - - // Sharing modes - bool m_bAuto; // Auto share mode - bool m_bUseGLDX; // GL/DX interop compatibility - bool m_bSenderCPUmode; // Sender GL/DX compatibility - - bool m_bSpoutPanelOpened; - bool m_bSpoutPanelActive; - SHELLEXECUTEINFOA m_ShExecInfo; - - // OpenGL extensions - unsigned int m_caps; - bool m_bGLDXavailable; - bool m_bFBOavailable; - bool m_bBLITavailable; - bool m_bPBOavailable; - bool m_bSWAPavailable; - bool m_bBGRAavailable; - bool m_bCOPYavailable; - bool m_bCONTEXTavailable; - bool m_bExtensionsLoaded; - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutGLextensions.cpp b/Plugin/Spout/SpoutGL/SpoutGLextensions.cpp deleted file mode 100644 index 1342dee..0000000 --- a/Plugin/Spout/SpoutGL/SpoutGLextensions.cpp +++ /dev/null @@ -1,573 +0,0 @@ -/* -// -// -// spoutGLextensions.cpp -// -// Used for load of openGL extensions with option -// to use Glew or disable dynamic load of specific extensions -// See spoutGLextions.h -// -// 01.09.15 - added MessageBox error warning in LoadGLextensions -// 11.11.15 - removed (unsigned) cast from GetProcAddress in FBO extensions -// 17.03.16 - added bgra extensions to find out if they are supported at compile and runtime -// 28.03.16 - caps is returned instead of fail for interop extensions -// 29.03.16 - Fixed loadInteropExtensions flag test in loadGLextensions -// 12.08.16 - Removed "isExtensionSupported" (https://github.com/leadedge/Spout2/issues/19) -// 13.01.17 - Removed try/catch from wglDXRegisterObjectNV calls -// - Clean up #ifdefs in all functions - return true if FBO of PBO are defined elsewhere -// 27.10.18 - Test for opengl context in loadglextensions -// 21.11.18 - Add copy extensions for future use -// 23.11.18 - Fix test for wglDXCloseDeviceNV in loadInteropExtensions -// 14.09.20 - Add legacyOpenGL define test in "isExtensionSupported" to avoid glGetString -// Thanks to Alexandre Buge (https://github.com/Qlex42) for the notice and fix -// 23.09.20 - Correct isExtensionSupported -// Include SpoutCommon.h for legacyOpenGL -// 11.12.20 - Add glGetBufferParameterivEXT -// - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "SpoutGLextensions.h" - -#ifndef USE_GLEW - -// GL/DX extensions -PFNWGLDXOPENDEVICENVPROC wglDXOpenDeviceNV = NULL; -PFNWGLDXREGISTEROBJECTNVPROC wglDXRegisterObjectNV = NULL; -PFNWGLDXSETRESOURCESHAREHANDLENVPROC wglDXSetResourceShareHandleNV = NULL; -PFNWGLDXLOCKOBJECTSNVPROC wglDXLockObjectsNV = NULL; -PFNWGLDXUNLOCKOBJECTSNVPROC wglDXUnlockObjectsNV = NULL; -PFNWGLDXCLOSEDEVICENVPROC wglDXCloseDeviceNV = NULL; -PFNWGLDXUNREGISTEROBJECTNVPROC wglDXUnregisterObjectNV = NULL; - -// FBO extensions -#ifdef USE_FBO_EXTENSIONS -glBindFramebufferEXTPROC glBindFramebufferEXT = NULL; -glBindRenderbufferEXTPROC glBindRenderbufferEXT = NULL; -glCheckFramebufferStatusEXTPROC glCheckFramebufferStatusEXT = NULL; -glDeleteFramebuffersEXTPROC glDeleteFramebuffersEXT = NULL; -glDeleteRenderBuffersEXTPROC glDeleteRenderBuffersEXT = NULL; -glFramebufferRenderbufferEXTPROC glFramebufferRenderbufferEXT = NULL; -glFramebufferTexture1DEXTPROC glFramebufferTexture1DEXT = NULL; -glFramebufferTexture2DEXTPROC glFramebufferTexture2DEXT = NULL; -glFramebufferTexture3DEXTPROC glFramebufferTexture3DEXT = NULL; -glGenFramebuffersEXTPROC glGenFramebuffersEXT = NULL; -glGenRenderbuffersEXTPROC glGenRenderbuffersEXT = NULL; -glGenerateMipmapEXTPROC glGenerateMipmapEXT = NULL; -glGetFramebufferAttachmentParameterivEXTPROC glGetFramebufferAttachmentParameterivEXT = NULL; -glGetRenderbufferParameterivEXTPROC glGetRenderbufferParameterivEXT = NULL; -glIsFramebufferEXTPROC glIsFramebufferEXT = NULL; -glIsRenderbufferEXTPROC glIsRenderbufferEXT = NULL; -glRenderbufferStorageEXTPROC glRenderbufferStorageEXT = NULL; -#endif - -// FBO blit extensions -glBlitFramebufferEXTPROC glBlitFramebufferEXT = NULL; - -#ifdef USE_FBO_EXTENSIONS -// OpenGL sync control extensions -PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL; -PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL; -#endif - -// PBO extensions -#ifdef USE_PBO_EXTENSIONS -glGenBuffersPROC glGenBuffersEXT = NULL; -glDeleteBuffersPROC glDeleteBuffersEXT = NULL; -glBindBufferPROC glBindBufferEXT = NULL; -glBufferDataPROC glBufferDataEXT = NULL; -glMapBufferPROC glMapBufferEXT = NULL; -glUnmapBufferPROC glUnmapBufferEXT = NULL; -glGetBufferParameterivPROC glGetBufferParameterivEXT = NULL; -#endif - -//------------------- -// Copy extensions -// (for future use) -//------------------- -#ifdef USE_COPY_EXTENSIONS -PFNGLCOPYIMAGESUBDATAPROC glCopyImageSubData = NULL; -#endif - -//--------------------------- -// Context creation extension -//--------------------------- -PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL; - -#endif - -// -// Load the Nvidia-Extensions dynamically -// -bool loadInteropExtensions() { - -#ifdef USE_GLEW - if(WGLEW_NV_DX_interop) - return true; - else - return false; -#else - - // Here we provide warnings for individual extensions - - wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)wglGetProcAddress("wglDXOpenDeviceNV"); - if(!wglDXOpenDeviceNV) { - SpoutLogWarning("loadInteropExtensions : wglDXOpenDeviceNV NULL"); - return false; - } - wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)wglGetProcAddress("wglDXRegisterObjectNV"); - if(!wglDXRegisterObjectNV) { - SpoutLogWarning("loadInteropExtensions : wglDXRegisterObjectNV NULL"); - return false; - } - wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)wglGetProcAddress("wglDXUnregisterObjectNV"); - if(!wglDXUnregisterObjectNV) { - SpoutLogWarning("loadInteropExtensions : wglDXUnregisterObjectNV NULL"); - return false; - } - wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)wglGetProcAddress("wglDXSetResourceShareHandleNV"); - if(!wglDXSetResourceShareHandleNV) { - SpoutLogWarning("loadInteropExtensions : wglDXSetResourceShareHandleNV NULL"); - return false; - } - wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)wglGetProcAddress("wglDXLockObjectsNV"); - if(!wglDXLockObjectsNV) { - SpoutLogWarning("loadInteropExtensions : wglDXLockObjectsNV NULL"); - return false; - } - wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)wglGetProcAddress("wglDXUnlockObjectsNV"); - if(!wglDXUnlockObjectsNV) { - SpoutLogWarning("loadInteropExtensions : wglDXUnlockObjectsNV NULL"); - return false; - } - wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)wglGetProcAddress("wglDXCloseDeviceNV"); - if(!wglDXCloseDeviceNV) { - SpoutLogWarning("loadInteropExtensions : wglDXCloseDeviceNV NULL"); - return false; - } - - return true; -#endif - -} - -bool loadFBOextensions() { - - // Here we use 'EXT_framebuffer_object' - // But for OpenGL version >= 3, framebuffer objects are core. - // Control this using the "legacyOpenGL" define in SpoutCommon.h - - // Thanks and credit to Menno Vink of Resolume for sharing the POSTFIX code - -#ifdef legacyOpenGL - #define FBO_EXTENSION_POSTFIX "EXT" -#else - #define FBO_EXTENSION_POSTFIX -#endif - -#ifdef USE_FBO_EXTENSIONS - - #ifdef USE_GLEW - if(GLEW_EXT_framebuffer_object) - return true; - else - return false; - #else - - glBindFramebufferEXT = (glBindFramebufferEXTPROC)wglGetProcAddress("glBindFramebuffer" FBO_EXTENSION_POSTFIX); - glBindRenderbufferEXT = (glBindRenderbufferEXTPROC)wglGetProcAddress("glBindRenderbuffer" FBO_EXTENSION_POSTFIX); - glCheckFramebufferStatusEXT = (glCheckFramebufferStatusEXTPROC)wglGetProcAddress("glCheckFramebufferStatus" FBO_EXTENSION_POSTFIX); - glDeleteFramebuffersEXT = (glDeleteFramebuffersEXTPROC)wglGetProcAddress("glDeleteFramebuffers" FBO_EXTENSION_POSTFIX); - glDeleteRenderBuffersEXT = (glDeleteRenderBuffersEXTPROC)wglGetProcAddress("glDeleteRenderbuffers" FBO_EXTENSION_POSTFIX); - glFramebufferRenderbufferEXT = (glFramebufferRenderbufferEXTPROC)wglGetProcAddress("glFramebufferRenderbuffer" FBO_EXTENSION_POSTFIX); - glFramebufferTexture1DEXT = (glFramebufferTexture1DEXTPROC)wglGetProcAddress("glFramebufferTexture1D" FBO_EXTENSION_POSTFIX); - glFramebufferTexture2DEXT = (glFramebufferTexture2DEXTPROC)wglGetProcAddress("glFramebufferTexture2D" FBO_EXTENSION_POSTFIX); - glFramebufferTexture3DEXT = (glFramebufferTexture3DEXTPROC)wglGetProcAddress("glFramebufferTexture3D" FBO_EXTENSION_POSTFIX); - glGenFramebuffersEXT = (glGenFramebuffersEXTPROC)wglGetProcAddress("glGenFramebuffers" FBO_EXTENSION_POSTFIX); - glGenRenderbuffersEXT = (glGenRenderbuffersEXTPROC)wglGetProcAddress("glGenRenderbuffers" FBO_EXTENSION_POSTFIX); - glGenerateMipmapEXT = (glGenerateMipmapEXTPROC)wglGetProcAddress("glGenerateMipmap" FBO_EXTENSION_POSTFIX); - glGetFramebufferAttachmentParameterivEXT = (glGetFramebufferAttachmentParameterivEXTPROC)wglGetProcAddress("glGetFramebufferAttachmentParameteriv" FBO_EXTENSION_POSTFIX); - glGetRenderbufferParameterivEXT = (glGetRenderbufferParameterivEXTPROC)wglGetProcAddress("glGetRenderbufferParameteriv" FBO_EXTENSION_POSTFIX); - glIsFramebufferEXT = (glIsFramebufferEXTPROC)wglGetProcAddress("glIsFramebuffer" FBO_EXTENSION_POSTFIX); - glIsRenderbufferEXT = (glIsRenderbufferEXTPROC)wglGetProcAddress("glIsRenderbuffer" FBO_EXTENSION_POSTFIX); - glRenderbufferStorageEXT = (glRenderbufferStorageEXTPROC)wglGetProcAddress("glRenderbufferStorage" FBO_EXTENSION_POSTFIX); - - if ( glBindFramebufferEXT != NULL && - glBindRenderbufferEXT != NULL && - glCheckFramebufferStatusEXT != NULL && - glDeleteFramebuffersEXT != NULL && - glDeleteRenderBuffersEXT != NULL && - glFramebufferRenderbufferEXT != NULL && - glFramebufferTexture1DEXT != NULL && - glFramebufferTexture2DEXT != NULL && - glFramebufferTexture3DEXT != NULL && - glGenFramebuffersEXT != NULL && - glGenRenderbuffersEXT != NULL && - glGenerateMipmapEXT != NULL && - glGetFramebufferAttachmentParameterivEXT != NULL && - glGetRenderbufferParameterivEXT != NULL && - glIsFramebufferEXT != NULL && - glIsRenderbufferEXT != NULL && - glRenderbufferStorageEXT != NULL) { - return true; - } - else { - return false; - } - #endif -#else - // FBO extensions defined elsewhere - return true; -#endif -} - - -bool loadBLITextension() { - -#ifdef USE_GLEW - if(GLEW_EXT_framebuffer_blit) - return true; - else - return false; -#else - glBlitFramebufferEXT = (glBlitFramebufferEXTPROC) wglGetProcAddress("glBlitFramebufferEXT"); - return glBlitFramebufferEXT!=NULL; -#endif - -} - -bool loadSwapExtensions() -{ - wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT"); - wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)wglGetProcAddress("wglGetSwapIntervalEXT"); - if(wglSwapIntervalEXT == NULL || wglGetSwapIntervalEXT == NULL) { - return false; - } - - return true; - -} - - -// =================== PBO support 18.01.14 ================== -bool loadPBOextensions() -{ - -#ifdef USE_PBO_EXTENSIONS - - #ifdef USE_GLEW - if(glGenBuffersARB) - return true; - else - return false; - #else - glGenBuffersEXT = (glGenBuffersPROC)wglGetProcAddress("glGenBuffers"); - glDeleteBuffersEXT = (glDeleteBuffersPROC)wglGetProcAddress("glDeleteBuffers"); - glBindBufferEXT = (glBindBufferPROC)wglGetProcAddress("glBindBuffer"); - glBufferDataEXT = (glBufferDataPROC)wglGetProcAddress("glBufferData"); - glMapBufferEXT = (glMapBufferPROC)wglGetProcAddress("glMapBuffer"); - glUnmapBufferEXT = (glUnmapBufferPROC)wglGetProcAddress("glUnmapBuffer"); - glGetBufferParameterivEXT = (glGetBufferParameterivPROC)wglGetProcAddress("glGetBufferParameteriv"); - - if(glGenBuffersEXT != NULL && glDeleteBuffersEXT != NULL - && glBindBufferEXT != NULL && glBufferDataEXT != NULL - && glMapBufferEXT != NULL && glUnmapBufferEXT != NULL - && glGetBufferParameterivEXT != NULL) { - return true; - } - else { - return false; - } - #endif - -#else - // PBO extensions defined elsewhere - return true; -#endif -} - - - -bool loadCopyExtensions() -{ - -#ifdef USE_COPY_EXTENSIONS - -#ifdef USE_GLEW - if (glCopyImageSubData) - return true; - else - return false; -#else - - // Copy extensions - glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)wglGetProcAddress("glCopyImageSubData"); - - if (glCopyImageSubData != NULL) { - return true; - } - else { - return false; - } -#endif - -#else - // COPY extensions defined elsewhere - return true; -#endif - -} - - -bool loadContextExtension() -{ - -#ifdef USE_CONTEXT_EXTENSION - - // Return if loadContextExtension() has been called before loading all the extensions - if (wglCreateContextAttribsARB) { - return true; - } - -#ifdef USE_GLEW - if (wglCreateContextAttribsARB) - return true; - else - return false; -#else - - // Context creation extension - wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB"); - - if (wglCreateContextAttribsARB != NULL) { - return true; - } - else { - return false; - } -#endif - -#else - // Context creation extension defined elsewhere - return true; -#endif - -} - - -bool InitializeGlew() -{ -#ifdef USE_GLEW - HGLRC glContext; - GLenum glew_error; - - // Opengl context is necessary - glContext = wglGetCurrentContext(); - if(glContext == NULL) { - return false; - } - // - // Note from Glew : GLEW obtains information on the supported extensions from the graphics driver. - // Experimental or pre-release drivers, however, might not report every available extension through - // the standard mechanism, in which case GLEW will report it unsupported. To circumvent this situation, - // the glewExperimental global switch can be turned on by setting it to GL_TRUE before calling glewInit(), - // which ensures that all extensions with valid entry points will be exposed. - // - glewExperimental = GL_TRUE; - glew_error = glewInit(); - if (glew_error != GLEW_OK) { - return false; - } - // - // Glew should have loaded all the extensions and we can check for them - // - // http://glew.sourceforge.net/basic.html - // - return true; -#else - // Glew usage not defined so cannot initialize - return false; -#endif -} - - -// -// Load GL extensions -// -unsigned int loadGLextensions() { - - unsigned int caps = 0; // as per elio glextensions - - // wglGetProcAddress requires an OpenGL rendering context - HGLRC glContext = wglGetCurrentContext(); - if (glContext == NULL) { - spoututils::SpoutLogError("loadGLextensions : no OpenGL context"); - return 0; - } - -#ifdef USE_GLEW - InitializeGlew(); // probably needs failure check -#endif - - // Check for FBO extensions - no use continuing without them - if (loadFBOextensions()) { - caps |= GLEXT_SUPPORT_FBO; - } - else { - spoututils::SpoutLogError("loadGLextensions : loadFBOextensions fail"); - return 0; - } - - // Load other extensions - if(loadBLITextension()) { - caps |= GLEXT_SUPPORT_FBO_BLIT; - } - else { - spoututils::SpoutLogWarning("loadGLextensions : loadBLITextensions fail"); - } - - if(loadSwapExtensions()) { - caps |= GLEXT_SUPPORT_SWAP; - } - else { - spoututils::SpoutLogWarning("loadGLextensions : loadSwapExtensions fail"); - } - - if(loadPBOextensions()) { - caps |= GLEXT_SUPPORT_PBO; - } - else { - spoututils::SpoutLogWarning("loadGLextensions : loadPBOextensions fail"); - } - - if (loadCopyExtensions()) { - caps |= GLEXT_SUPPORT_COPY; - } - else { - spoututils::SpoutLogWarning("loadGLextensions : loadCopyExtensions fail"); - } - - if (loadContextExtension()) { - caps |= GLEXT_SUPPORT_CONTEXT; - } - else { - spoututils::SpoutLogWarning("loadGLextensions : loadContextExtension fail"); - } - - // Load wgl interop extensions - if (loadInteropExtensions()) { - caps |= GLEXT_SUPPORT_NVINTEROP; - } - else { - spoututils::SpoutLogWarning("loadGLextensions : loadInteropExtensions fail"); - } - - // spoututils::SpoutLogNotice("loadGLextensions : extensions loaded successfully"); - - // Find out whether bgra extensions are supported at compile and runtime -#ifdef GL_EXT_bgra - // - // "isExtensionSupported" code yet to be fully tested for - // various compilers, operating systems and environments. - // De-activate this function if you have problems. - // - if (isExtensionSupported("GL_EXT_bgra")) { - caps |= GLEXT_SUPPORT_BGRA; - } -#endif - - return caps; - -} - - -// -// Used to determine support for GL_EXT_bgra extensions -// -bool isExtensionSupported(const char *extension) -{ - if (!extension || *extension == '\0') - return false; - - // Extension names should not have spaces. - if(strchr(extension, ' ')) - return false; - -// glGetString can cause problems for core OpenGL context -#ifdef legacyOpenGL - const char * extensionsstr = (const char *)glGetString(GL_EXTENSIONS); - if (extensionsstr) { - std::string extensions = extensionsstr; - std::size_t found = extensions.find(extension); - if (found != std::string::npos) { - return true; - } - SpoutLogWarning("isExtensionSupported : extension [%s] not found", extension); - return false; - } -#else - // - // glGetstring not supported - // for a core GL context - // - // Code adapted from : https://bitbucket.org/Coin3D/coin/issues/54/support-for-opengl-3x-specifically - // Also : http://www.opengl.org/resources/features/OGLextensions/ - // - int n = 0; - int i = 0; - typedef GLubyte* (APIENTRY * COIN_PFNGLGETSTRINGIPROC)(GLenum enm, GLuint idx); - COIN_PFNGLGETSTRINGIPROC glGetStringi = 0; - glGetStringi = (COIN_PFNGLGETSTRINGIPROC)wglGetProcAddress("glGetStringi"); - if(glGetStringi != NULL) { - glGetIntegerv(GL_NUM_EXTENSIONS, &n); - if(n > 0) { - const char * exc = nullptr; - for (i = 0; i < n; i++) { - exc = (const char *)glGetStringi(GL_EXTENSIONS, (GLuint)i); - if(exc) { - if(strcmp(exc, extension) == 0) - break; - } - } - if(exc && i < n) { - return true; - } - SpoutLogWarning("isExtensionSupported : extension [%s] not found", extension); - return false; - } - else { - SpoutLogWarning("isExtensionSupported : glGetIntegerv(GL_NUM_EXTENSIONS) did not return a value"); - } - } - else { - SpoutLogWarning("isExtensionSupported : glGetStringi not found"); - } -#endif - - SpoutLogNotice("isExtensionSupported : unable to find extension [%s]", extension); - - return false; - -} - diff --git a/Plugin/Spout/SpoutGL/SpoutGLextensions.h b/Plugin/Spout/SpoutGL/SpoutGLextensions.h deleted file mode 100644 index 03b344f..0000000 --- a/Plugin/Spout/SpoutGL/SpoutGLextensions.h +++ /dev/null @@ -1,432 +0,0 @@ -// -// -// spoutGLextensions.h -// -// Used for load of openGL extensions with options to -// use Glew or disable dynamic load of specific extension types -// -// If Glew is used, none of the extensions are loaded dynamically. -// Individual extension types can be disabled if they conflict -// with extensions already managed by particular applications. -// -// NVIDIA GL/DX interop extensions -// Fbo extensions -// Fbo blit extensions -// Pbo extensions -// wglSwapInterval extensions -// -// -// 03.11.14 - added additional defines for framebuffer status checks -// 02.01.15 - added GL_BGR for SpoutCam -// 21.11.18 - added preprocessor define for Jitter externals -// https://github.com/robtherich/Spout2 -// -/* - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#pragma once -#ifndef __spoutGLextensions__ // standard way as well -#define __spoutGLextensions__ - -// -// Header: spoutGLextensions -// -// Used for load of openGL extensions with options to use Glew -// or disable dynamic load of specific extension types. -// If Glew is used, none of the extensions are loaded dynamically. -// Individual extension types can be disabled if they conflict -// with extensions already managed by particular applications. -// -// Refer to source code for documentation. -// - - -// ====================== COMPILE OPTIONS ================================ -// -// set this to use GLEW instead of dynamic load of extensions -// #define USE_GLEW -// set this to use glew32s.lib instead of glew32.lib -// #define GLEW_STATIC - -// If load of FBO extensions conflicts with FFGL or Jitter, disable them here -#ifndef UNDEF_USE_FBO_EXTENSIONS -#define USE_FBO_EXTENSIONS // don't use for jitter -#endif - -// If load of PBO extensions conflicts, disable them here - OK for Jitter -#define USE_PBO_EXTENSIONS - -// If load of COPY extensions conflicts, disable them here -// Only used for testing -#define USE_COPY_EXTENSIONS - -// If load of context creation extension conflicts, disable it here -// Only used for testing -#define USE_CONTEXT_EXTENSION -// ========================================================================== - - -#include -#include // for debug print -#include "SpoutCommon.h" // for legacyOpenGL define -#include "SpoutUtils.h" - -using namespace spoututils; - -#ifdef USE_GLEW - #include - #include // wglew.h and glxew.h, which define the available WGL and GLX extensions -#else - #include - #ifndef USE_FBO_EXTENSIONS - // For Max/Msp Jitter - #include "jit.gl.h" - #define glDeleteFramebuffersEXT (_jit_gl_get_proctable()->DeleteFramebuffersEXT) - #endif -#endif - -#ifndef GL_CLAMP_TO_EDGE -#define GL_CLAMP_TO_EDGE 0x812F -#endif - -#ifndef GL_READ_FRAMEBUFFER_EXT -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#endif - -#ifndef GL_DRAW_FRAMEBUFFER_EXT -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#endif - -#ifndef GL_DRAW_FRAMEBUFFER_BINDING_EXT -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#endif - -#ifndef GL_READ_FRAMEBUFFER_BINDING_EXT -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA -#endif - -#ifndef GL_INVALID_FRAMEBUFFER_OPERATION_EXT -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#endif - - -//------------------------------------ -// EXTENSION SUPPORT FLAGS -//------------------------------------ -#define GLEXT_SUPPORT_NVINTEROP 1 -#define GLEXT_SUPPORT_FBO 2 -#define GLEXT_SUPPORT_FBO_BLIT 4 -#define GLEXT_SUPPORT_PBO 8 -#define GLEXT_SUPPORT_SWAP 16 -#define GLEXT_SUPPORT_BGRA 32 -#define GLEXT_SUPPORT_COPY 64 -#define GLEXT_SUPPORT_CONTEXT 128 - -//----------------------------------------------------- -// GL consts that are needed and aren't present in GL.h -//----------------------------------------------------- -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define WGL_ACCESS_READ_ONLY_NV 0x0000 -#define WGL_ACCESS_READ_WRITE_NV 0x0001 -#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 - -#define GL_CLAMP_TO_EDGE 0x812F - -// Other -#ifndef GL_MAJOR_VERSION -#define GL_MAJOR_VERSION 0x821B -#endif -#ifndef GL_MINOR_VERSION -#define GL_MINOR_VERSION 0x821C -#endif -#ifndef GL_NUM_EXTENSIONS -#define GL_NUM_EXTENSIONS 0x821D -#endif -#ifndef GL_CONTEXT_FLAGS // The flags with which the context was created. -#define GL_CONTEXT_FLAGS 0x821E -#endif - -#ifndef GL_CONTEXT_FLAGS -#define GL_CONTEXT_FLAGS 0x821E -#endif -#ifndef GL_CONTEXT_PROFILE_MASK -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#endif - -// TODO clean up -#ifndef GL_CONTEXT_CORE_PROFILE_BIT -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#endif -#ifndef GL_CONTEXT_COMPATIBILITY_PROFILE_BIT -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#endif -#ifndef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 -#endif -#ifndef GL_CONTEXT_FLAG_DEBUG_BIT -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#endif -#ifndef GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 -#endif -#ifndef GL_CONTEXT_FLAG_NO_ERROR_BIT -#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 -#endif - -#ifndef USE_GLEW - -// ---------------------------- -// Memory management extensions -// ---------------------------- -#define GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX 0x9048 -#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049 - - -//---------------------- -// GL interop extensions -//---------------------- -typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); -typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); -typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); -typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); -typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void *dxResource, HANDLE shareHandle); -typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects); -typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects); - -extern PFNWGLDXOPENDEVICENVPROC wglDXOpenDeviceNV; -extern PFNWGLDXCLOSEDEVICENVPROC wglDXCloseDeviceNV; -extern PFNWGLDXREGISTEROBJECTNVPROC wglDXRegisterObjectNV; -extern PFNWGLDXUNREGISTEROBJECTNVPROC wglDXUnregisterObjectNV; -extern PFNWGLDXSETRESOURCESHAREHANDLENVPROC wglDXSetResourceShareHandleNV; -extern PFNWGLDXLOCKOBJECTSNVPROC wglDXLockObjectsNV; -extern PFNWGLDXUNLOCKOBJECTSNVPROC wglDXUnlockObjectsNV; - - -//--------------- -// FBO extensions -//--------------- -#ifdef USE_FBO_EXTENSIONS -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_FRAMEBUFFER_UNDEFINED_EXT 0x8219 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_FRAMEBUFFER_STATUS_ERROR_EXT 0x8CDE -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX_EXT 0x8D45 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 - -typedef void (APIENTRY *glBindFramebufferEXTPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRY *glBindRenderbufferEXTPROC) (GLenum target, GLuint renderbuffer); -typedef GLenum (APIENTRY *glCheckFramebufferStatusEXTPROC) (GLenum target); -typedef void (APIENTRY *glDeleteFramebuffersEXTPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (APIENTRY *glDeleteRenderBuffersEXTPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (APIENTRY *glFramebufferRenderbufferEXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRY *glFramebufferTexture1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRY *glFramebufferTexture2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRY *glFramebufferTexture3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRY *glGenFramebuffersEXTPROC) (GLsizei n, GLuint* framebuffers); -typedef void (APIENTRY *glGenRenderbuffersEXTPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (APIENTRY *glGenerateMipmapEXTPROC) (GLenum target); -typedef void (APIENTRY *glGetFramebufferAttachmentParameterivEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (APIENTRY *glGetRenderbufferParameterivEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (APIENTRY *glIsFramebufferEXTPROC) (GLuint framebuffer); -typedef GLboolean (APIENTRY *glIsRenderbufferEXTPROC) (GLuint renderbuffer); -typedef void (APIENTRY *glRenderbufferStorageEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - -extern glBindFramebufferEXTPROC glBindFramebufferEXT; -extern glBindRenderbufferEXTPROC glBindRenderbufferEXT; -extern glCheckFramebufferStatusEXTPROC glCheckFramebufferStatusEXT; -extern glDeleteFramebuffersEXTPROC glDeleteFramebuffersEXT; -extern glDeleteRenderBuffersEXTPROC glDeleteRenderBuffersEXT; -extern glFramebufferRenderbufferEXTPROC glFramebufferRenderbufferEXT; -extern glFramebufferTexture1DEXTPROC glFramebufferTexture1DEXT; -extern glFramebufferTexture2DEXTPROC glFramebufferTexture2DEXT; -extern glFramebufferTexture3DEXTPROC glFramebufferTexture3DEXT; -extern glGenFramebuffersEXTPROC glGenFramebuffersEXT; -extern glGenRenderbuffersEXTPROC glGenRenderbuffersEXT; -extern glGenerateMipmapEXTPROC glGenerateMipmapEXT; -extern glGetFramebufferAttachmentParameterivEXTPROC glGetFramebufferAttachmentParameterivEXT; -extern glGetRenderbufferParameterivEXTPROC glGetRenderbufferParameterivEXT; -extern glIsFramebufferEXTPROC glIsFramebufferEXT; -extern glIsRenderbufferEXTPROC glIsRenderbufferEXT; -extern glRenderbufferStorageEXTPROC glRenderbufferStorageEXT; -#endif - -//------------------- -// Blit FBO extension -//------------------- -#define READ_FRAMEBUFFER_EXT 0x8CA8 -#define DRAW_FRAMEBUFFER_EXT 0x8CA9 - -typedef void (APIENTRY *glBlitFramebufferEXTPROC) (GLint srcX0,GLint srcY0,GLint srcX1,GLint srcY1,GLint dstX0,GLint dstY0,GLint dstX1,GLint dstY1,GLbitfield mask,GLenum filter); -extern glBlitFramebufferEXTPROC glBlitFramebufferEXT; - -//------------------- -// Blit FBO extension -//------------------- -#define READ_FRAMEBUFFER_EXT 0x8CA8 -#define DRAW_FRAMEBUFFER_EXT 0x8CA9 - -typedef void (APIENTRY *glBlitFramebufferEXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -extern glBlitFramebufferEXTPROC glBlitFramebufferEXT; - -// ------------------------------ -// OpenGL sync control extensions -// ------------------------------ -#ifdef USE_FBO_EXTENSIONS -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); -typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); -extern PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; -extern PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT; -#endif - -//---------------- -// PBO extensions -//---------------- -#ifdef USE_PBO_EXTENSIONS -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_BUFFER_SIZE_EXT 0x8764 - - -// PBO functions -typedef ptrdiff_t GLsizeiptr; -typedef void (APIENTRY *glGenBuffersPROC) (GLsizei n, const GLuint* buffers); -typedef void (APIENTRY *glDeleteBuffersPROC) (GLsizei n, const GLuint* buffers); -typedef void (APIENTRY *glBindBufferPROC) (GLenum target, const GLuint buffer); -typedef void (APIENTRY *glBufferDataPROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); -typedef void * (APIENTRY *glMapBufferPROC) (GLenum target, GLenum access); -typedef void (APIENTRY *glUnmapBufferPROC) (GLenum target); -typedef void (APIENTRY *glGetBufferParameterivPROC) (GLenum target, GLenum value, GLint * data); - -extern glGenBuffersPROC glGenBuffersEXT; -extern glDeleteBuffersPROC glDeleteBuffersEXT; -extern glBindBufferPROC glBindBufferEXT; -extern glBufferDataPROC glBufferDataEXT; -extern glMapBufferPROC glMapBufferEXT; -extern glUnmapBufferPROC glUnmapBufferEXT; -extern glGetBufferParameterivPROC glGetBufferParameterivEXT; - -#endif // USE_PBO_EXTENSIONS - -//------------------- -// Copy extensions -//------------------- -#ifdef USE_COPY_EXTENSIONS -typedef void (APIENTRY * PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -extern PFNGLCOPYIMAGESUBDATAPROC glCopyImageSubData; -#endif // USE_COPY_EXTENSIONS - -//--------------------------- -// Context creation extension -//--------------------------- -typedef HGLRC (APIENTRY * PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int *attribList); -extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; - -// Tokens accepted as an attribute name in <*attribList>: -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 - -// Accepted as bits in the attribute value for WGL_CONTEXT_FLAGS in <*attribList>: -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 - -// Accepted as bits in the attribute value for -// WGL_CONTEXT_PROFILE_MASK_ARB in <*attribList>: -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 - -// New errors returned by GetLastError: -#define ERROR_INVALID_VERSION_ARB 0x2095 -#define ERROR_INVALID_PROFILE_ARB 0x2096 - -#endif // end GLEW - -//---------------- -// Local functions -//---------------- -bool InitializeGlew(); -unsigned int loadGLextensions(); -bool loadInteropExtensions(); -bool loadFBOextensions(); -bool loadBLITextension(); -bool loadSwapExtensions(); -bool loadPBOextensions(); -bool loadCopyExtensions(); -bool loadContextExtension(); -bool isExtensionSupported(const char *extension); - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutReceiver.cpp b/Plugin/Spout/SpoutGL/SpoutReceiver.cpp deleted file mode 100644 index 780c8aa..0000000 --- a/Plugin/Spout/SpoutGL/SpoutReceiver.cpp +++ /dev/null @@ -1,545 +0,0 @@ -// -// SpoutReceiver -// -// ==================================================================================== -// Revisions : -// -// 27-07-14 - CreateReceiver - bUseActive flag instead of null name -// 03.09.14 - Cleanup -// 23.09.14 - return DirectX 11 capability in SetDX9 -// 28.09.14 - Added Host FBO for ReceiveTexture -// 12.10.14 - changed SelectSenderPanel arg to const char -// 23.12.14 - added host fbo arg to ReceiveImage -// 08.02.15 - Changed default texture format for ReceiveImage in header to GL_RGBA -// 29.05.15 - Included SetAdapter for multiple adapters - Franz Hildgen. -// 02.06.15 - Added GetAdapter, GetNumAdapters, GetAdapterName -// 24.08.15 - Added GetHostPath to retrieve the path of the host that produced the sender -// 15.09.15 - Removed SetMemoryShareMode for 2.005 - now done globally by SpoutDirectX.exe -// 10.10.15 - Added transition flag to set invert true for 2.004 rather than default false for 2.005 -// - currently not used - see SpoutSDK.cpp CreateSender -// 14.11.15 - changed functions to "const char *" where required -// 18.11.15 - added CheckReceiver so that DrawSharedTexture can be used by a receiver -// 18.06.16 - Add invert to ReceiveImage -// 17.09.16 - removed CheckSpout2004() from constructor -// 13.01.17 - Add SetCPUmode, GetCPUmode, SetBufferMode, GetBufferMode -// - Add HostFBO arg to DrawSharedTexture -// 15.01.17 - Add GetShareMode, SetShareMode -// 06.06.17 - Add OpenSpout -// 05.11.18 - Add IsSpoutInitialized -// 11.11.18 - Add 2.007 high level application functions -// 13.11.18 - Remove SetCPUmode, GetCPUmode -// 24.11.18 - Remove redundant GetImageSize -// 28.11.18 - Add IsFrameNew -// 11.12.18 - Add utility functions -// 05.01.19 - Make names for 2.007 functions compatible with SpoutLibrary -// 16.01.19 - Initialize class variables -// 16.03.19 - Add IsFrameCountEnabled -// 19.03.19 - Change IsInitialized to IsConnected -// 05.04.19 - Change GetSenderName(index, ..) to GetSender -// Create const char * GetSenderName for receiver class -// 18.09.19 - Remove UseDX9 from GetDX9 to avoid registry change -// - Remove reset of m_SenderNameSetup from SetupReceiver -// - Add connected test to IsUpdated -// - Remove redundant CloseReceiver -// 28.11.19 - Remove SetupReceiver -// Add invert option to ReceiveTextureData and ReceiveImageData -// 13.01.20 - Add null texture option for ReceiveTextureData -// Add ReceiveTextureData option with no args and GetSenderTextureID() -// Updated receiver example -// 18.01.20 - Add CopyTexture. Update receiver example -// 20.01.20 - Changed GetSenderTextureID() to GetSharedTextureID -// 25.01.20 - Remove GetDX9compatible and SetDX9compatible -// 25.01.20 - Change ReceiveTextureData and ReceiveImageData to overloads -// 26.04.20 - Reset the update flag in IsUpdated -// 30.04.20 - Add ReceiveTexture() -// 17.06.20 - Add GetSenderFormat() -// 17.09.20 - Change GetMemoryShare(const char* sendername) to -// GetSenderMemoryShare(const char* sendername) for compatibility with SpoutLibrary -// Add GetSenderAdapter -// 25.09.20 - Remove GetSenderAdapter - not reliable -// 17.10.20 - Change SetDX9format from D3D_FORMAT to DWORD -// -// 27.12.20 - Multiple changes for SpoutGL base class - see SpoutSDK.cpp -// -// ==================================================================================== -// -// Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - -#include "SpoutReceiver.h" - -// -// Class: SpoutReceiver -// -// Convenience wrapper class for developing receiver applications. -// -// Insulates the programmer from sender functions. -// -// --- Code -// #include "SpoutReceiver.h" -// --- -// -// The main Spout class can be used but will expose both Sender and Receiver functions -// which cannot be used within the same object. -// A Receiver can still access lower level common functions for example : -// --- Code -// SpoutReceiver receiver; -// receiver.spout.GLDXready(); -// --- -// -// Refer to the Spout class for function documentation. -// - -//--------------------------------------------------------- -SpoutReceiver::SpoutReceiver() -{ - -} - -//--------------------------------------------------------- -SpoutReceiver::~SpoutReceiver() -{ - spout.ReleaseReceiver(); -} - - -//--------------------------------------------------------- -void SpoutReceiver::SetReceiverName(const char * SenderName) -{ - spout.SetReceiverName(SenderName); -} - - -//--------------------------------------------------------- -// Release receiver and resources -// ready to connect to another sender -void SpoutReceiver::ReleaseReceiver() -{ - spout.ReleaseReceiver(); -} - - - -//--------------------------------------------------------- -bool SpoutReceiver::ReceiveTexture() -{ - return spout.ReceiveTexture(0, 0); -} - -//--------------------------------------------------------- -bool SpoutReceiver::ReceiveTexture(GLuint TextureID, GLuint TextureTarget, bool bInvert, GLuint HostFbo) -{ - return spout.ReceiveTexture(TextureID, TextureTarget, bInvert, HostFbo); -} - -//--------------------------------------------------------- -bool SpoutReceiver::ReceiveImage(char* Sendername, unsigned int &width, unsigned int &height, - unsigned char* pixels, GLenum glFormat, bool bInvert, GLuint HostFBO) -{ - return spout.ReceiveImage(Sendername, width, height, pixels, glFormat, bInvert, HostFBO); -} - -//--------------------------------------------------------- -bool SpoutReceiver::IsUpdated() -{ - return spout.IsUpdated(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::IsConnected() -{ - return spout.IsConnected(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::IsFrameNew() -{ - return spout.IsFrameNew(); -} - -//--------------------------------------------------------- -DWORD SpoutReceiver::GetSenderFormat() -{ - return spout.GetSenderFormat(); -} - -//--------------------------------------------------------- -const char * SpoutReceiver::GetSenderName() -{ - return spout.GetSenderName(); -} - -//--------------------------------------------------------- -unsigned int SpoutReceiver::GetSenderWidth() -{ - return spout.GetSenderWidth(); -} - -//--------------------------------------------------------- -unsigned int SpoutReceiver::GetSenderHeight() -{ - return spout.GetSenderHeight(); -} - -//--------------------------------------------------------- -double SpoutReceiver::GetSenderFps() -{ - return spout.GetSenderFps(); -} - -//--------------------------------------------------------- -long SpoutReceiver::GetSenderFrame() -{ - return spout.GetSenderFrame(); -} - -//--------------------------------------------------------- -HANDLE SpoutReceiver::GetSenderHandle() -{ - return spout.GetSenderHandle(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::GetSenderCPUmode() -{ - return spout.GetSenderCPUmode(); -} - -//--------------------------------------------------------- -void SpoutReceiver::SelectSender() -{ - spout.SelectSenderPanel(); -} - - -// -// Frame count -// - -//--------------------------------------------------------- -void SpoutReceiver::SetFrameCount(bool bEnable) -{ - return spout.SetFrameCount(bEnable); -} - -//--------------------------------------------------------- -void SpoutReceiver::DisableFrameCount() -{ - spout.DisableFrameCount(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::IsFrameCountEnabled() -{ - return spout.IsFrameCountEnabled(); -} - -//--------------------------------------------------------- -void SpoutReceiver::HoldFps(int fps) -{ - spout.HoldFps(fps); -} - -//--------------------------------------------------------- -bool SpoutReceiver::GetAutoShare() -{ - return spout.GetAutoShare(); -} - -//--------------------------------------------------------- -void SpoutReceiver::SetAutoShare(bool bAuto) -{ - spout.SetAutoShare(bAuto); -} - -//--------------------------------------------------------- -bool SpoutReceiver::IsGLDXready() -{ - return spout.IsGLDXready(); -} - -// -// Sender names -// - -//--------------------------------------------------------- -int SpoutReceiver::GetSenderCount() -{ - return spout.GetSenderCount(); -} - -//--------------------------------------------------------- -// Get a sender name given an index into the sender names set -bool SpoutReceiver::GetSender(int index, char* sendername, int sendernameMaxSize) -{ - return spout.GetSender(index, sendername, sendernameMaxSize); -} - -//--------------------------------------------------------- -bool SpoutReceiver::GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat) -{ - return spout.GetSenderInfo(sendername, width, height, dxShareHandle, dwFormat); -} - -//--------------------------------------------------------- -bool SpoutReceiver::GetActiveSender(char* Sendername) -{ - return spout.GetActiveSender(Sendername); -} - -//--------------------------------------------------------- -bool SpoutReceiver::SetActiveSender(const char* Sendername) -{ - return spout.SetActiveSender(Sendername); -} - -// -// Adapter functions -// - -//--------------------------------------------------------- -int SpoutReceiver::GetNumAdapters() -{ - return spout.GetNumAdapters(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::GetAdapterName(int index, char *adaptername, int maxchars) -{ - return spout.GetAdapterName(index, adaptername, maxchars); -} - -//--------------------------------------------------------- -int SpoutReceiver::GetAdapter() -{ - return spout.GetAdapter(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::SetAdapter(int index) -{ - return spout.SetAdapter(index); -} - -//--------------------------------------------------------- -bool SpoutReceiver::GetAdapterInfo(char *renderdescription, char *displaydescription, int maxchars) -{ - return spout.GetAdapterInfo(renderdescription, displaydescription, maxchars); -} - -//--------------------------------------------------------- -int SpoutReceiver::Adapter() -{ - return spout.Adapter(); -} - -//--------------------------------------------------------- -char * SpoutReceiver::AdapterName() -{ - return spout.AdapterName(); -} - -// -// User settings recorded by "SpoutSettings" -// - -//--------------------------------------------------------- -bool SpoutReceiver::GetBufferMode() -{ - return spout.GetBufferMode(); -} - -//--------------------------------------------------------- -void SpoutReceiver::SetBufferMode(bool bActive) -{ - spout.SetBufferMode(bActive); -} - -//--------------------------------------------------------- -int SpoutReceiver::GetBuffers() -{ - return spout.GetBuffers(); -} - -//--------------------------------------------------------- -void SpoutReceiver::SetBuffers(int nBuffers) -{ - spout.SetBuffers(nBuffers); -} - -//--------------------------------------------------------- -int SpoutReceiver::GetMaxSenders() -{ - return spout.GetMaxSenders(); -} - -//--------------------------------------------------------- -void SpoutReceiver::SetMaxSenders(int maxSenders) -{ - spout.SetMaxSenders(maxSenders); -} - -// -// For 2.006 compatibility -// - -bool SpoutReceiver::GetDX9() -{ - return spout.GetDX9(); -} - -bool SpoutReceiver::SetDX9(bool bDX9) -{ - return spout.SetDX9(bDX9); -} - -bool SpoutReceiver::GetMemoryShareMode() -{ - return spout.GetMemoryShareMode(); -} - -bool SpoutReceiver::SetMemoryShareMode(bool bMem) -{ - return spout.SetMemoryShareMode(bMem); -} - - -bool SpoutReceiver::GetCPUmode() -{ - return spout.GetCPUmode(); -} - -bool SpoutReceiver::SetCPUmode(bool bCPU) -{ - return spout.SetCPUmode(bCPU); -} - -int SpoutReceiver::GetShareMode() -{ - return spout.GetShareMode(); -} - -void SpoutReceiver::SetShareMode(int mode) -{ - spout.SetShareMode(mode); -} - -// -// Information -// - -//--------------------------------------------------------- -bool SpoutReceiver::GetHostPath(const char *sendername, char *hostpath, int maxchars) -{ - return spout.GetHostPath(sendername, hostpath, maxchars); -} - -//--------------------------------------------------------- -int SpoutReceiver::GetVerticalSync() -{ - return spout.GetVerticalSync(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::SetVerticalSync(bool bSync) -{ - return spout.SetVerticalSync(bSync); -} - -//--------------------------------------------------------- -int SpoutReceiver::GetSpoutVersion() -{ - return spout.GetSpoutVersion(); -} - -// -// OpenGL utilities -// - -//--------------------------------------------------------- -bool SpoutReceiver::CreateOpenGL() -{ - return spout.CreateOpenGL(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::CloseOpenGL() -{ - return spout.CloseOpenGL(); -} - -//--------------------------------------------------------- -bool SpoutReceiver::CopyTexture(GLuint SourceID, GLuint SourceTarget, - GLuint DestID, GLuint DestTarget, - unsigned int width, unsigned int height, - bool bInvert, GLuint HostFBO) -{ - return spout.CopyTexture(SourceID, SourceTarget, DestID, DestTarget, - width, height, bInvert, HostFBO); -} - -// -// 2.006 compatibility -// - -//--------------------------------------------------------- -bool SpoutReceiver::CreateReceiver(char* sendername, unsigned int &width, unsigned int &height, bool bUseActive) -{ - return spout.CreateReceiver(sendername, width, height, bUseActive); -} - -//--------------------------------------------------------- -bool SpoutReceiver::CheckReceiver(char* name, unsigned int &width, unsigned int &height, bool &bConnected) -{ - return spout.CheckReceiver(name, width, height, bConnected); -} - -//--------------------------------------------------------- -bool SpoutReceiver::ReceiveTexture(char* name, unsigned int &width, unsigned int &height, - GLuint TextureID, GLuint TextureTarget, bool bInvert, GLuint HostFBO) -{ - return spout.ReceiveTexture(name, width, height, TextureID, TextureTarget, bInvert, HostFBO); -} - -//--------------------------------------------------------- -bool SpoutReceiver::ReceiveImage(unsigned char *pixels, GLenum glFormat, bool bInvert, GLuint HostFbo) -{ - return spout.ReceiveImage(pixels, glFormat, bInvert, HostFbo); -} - -//--------------------------------------------------------- -bool SpoutReceiver::SelectSenderPanel(const char *message) -{ - return spout.SelectSenderPanel(message); -} - - -// Legacy OpenGL Draw function -#ifdef legacyOpenGL - -//--------------------------------------------------------- -bool SpoutReceiver::DrawSharedTexture(float max_x, float max_y, float aspect, bool bInvert, GLuint HostFBO) -{ - return spout.DrawSharedTexture(max_x, max_y, aspect, bInvert, HostFBO); -} -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutReceiver.h b/Plugin/Spout/SpoutGL/SpoutReceiver.h deleted file mode 100644 index 366240a..0000000 --- a/Plugin/Spout/SpoutGL/SpoutReceiver.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - - SpoutReceiver.h - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once - -#ifndef __SpoutReceiver__ -#define __SpoutReceiver__ - -#include "Spout.h" - -class SPOUT_DLLEXP SpoutReceiver { - - public: - - SpoutReceiver(); - ~SpoutReceiver(); - - // Specify sender for connection - // The application will not connect to any other unless the user selects one - // If that sender closes, the application will wait for the nominated sender to open - // If no name is specified, the receiver will connect to the active sender - void SetReceiverName(const char * sendername); - // Close receiver and release resources ready to connect to another sender - void ReleaseReceiver(); - // Receive shared texture - // Connect to a sender and retrieve texture details ready for access - // (see BindSharedTexture and UnBindSharedTexture) - bool ReceiveTexture(); - // Receive OpenGL texture - // Connect to a sender and inform the application to update - // the receiving texture if it has changed dimensions - // For no change, copy the sender shared texture to the application texture - bool ReceiveTexture(GLuint TextureID, GLuint TextureTarget, bool bInvert = false, GLuint HostFbo = 0); - // Receive image pixels - // Connect to a sender and inform the application to update - // the receiving buffer if it has changed dimensions - // For no change, copy the sender shared texture to the pixel buffer - bool ReceiveImage(unsigned char* pixels, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFbo = 0); - // Query whether the sender has changed - // Checked at every cycle before receiving data - bool IsUpdated(); - // Query sender connection - // If the sender closes, receiving functions return false, - bool IsConnected(); - // Query received frame status - // The receiving texture or pixel buffer is only refreshed if the sender has produced a new frame - // This can be queried to process texture data only for new frames - bool IsFrameNew(); - // Received sender name - const char * GetSenderName(); - // Received sender width - unsigned int GetSenderWidth(); - // Received sender height - unsigned int GetSenderHeight(); - // Received sender DX11 texture format - DWORD GetSenderFormat(); - // Received sender frame rate - double GetSenderFps(); - // Received sender frame number - long GetSenderFrame(); - // Received sender share handle - HANDLE GetSenderHandle(); - // Received sender sharing mode - bool GetSenderCPUmode(); - // Open sender selection dialog - void SelectSender(); - - // - // Frame count - // - - // Enable or disable frame counting globally - void SetFrameCount(bool bEnable); - // Disable frame counting specifically for this application - void DisableFrameCount(); - // Return frame count status - bool IsFrameCountEnabled(); - // Frame rate control - void HoldFps(int fps); - - // - // Graphics compatibility - // - - // Get auto GPU/CPU share depending on compatibility - bool GetAutoShare(); - // Set auto GPU/CPU share depending on compatibility - void SetAutoShare(bool bAuto = true); - // OpenGL texture share compatibility - bool IsGLDXready(); - - // - // Sender names - // - - // Number of senders - int GetSenderCount(); - // Sender item name - bool GetSender(int index, char* sendername, int MaxSize = 256); - // Sender information - bool GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat); - // Current active sender - bool GetActiveSender(char* sendername); - // Set sender as active - bool SetActiveSender(const char* sendername); - - // - // Adapter functions - // - - // The number of graphics adapters in the system - int GetNumAdapters(); - // Get adapter item name - bool GetAdapterName(int index, char *adaptername, int maxchars = 256); - // Get adapter index - int GetAdapter(); - // Set graphics adapter for output - bool SetAdapter(int index = 0); - // Get the current adapter description - bool GetAdapterInfo(char *renderdescription, char *displaydescription, int maxchars); - // Current adapter - int Adapter(); - // Current adapter name - char * AdapterName(); - - // - // User settings recorded by "SpoutSettings" - // - - // Get user buffering mode - bool GetBufferMode(); - // Set application buffering mode - void SetBufferMode(bool bActive = true); - // Get user number of pixel buffers - int GetBuffers(); - // Set application number of pixel buffers - void SetBuffers(int nBuffers); - // Get user Maximum senders allowed - int GetMaxSenders(); - // Set user Maximum senders allowed - void SetMaxSenders(int maxSenders); - - // - // 2.006 compatibility - // - - // Get user DX9 mode - bool GetDX9(); - // Set user DX9 mode - bool SetDX9(bool bDX9 = true); - // Get user memory share mode - bool GetMemoryShareMode(); - // Set user memory share mode - bool SetMemoryShareMode(bool bMem = true); - // Get user CPU mode - bool GetCPUmode(); - // Set user CPU mode - bool SetCPUmode(bool bCPU); - // Get user share mode - // 0 - texture, 1 - memory, 2 - CPU - int GetShareMode(); - // Set user share mode - // 0 - texture, 1 - memory, 2 - CPU - void SetShareMode(int mode); - - // - // Information - // - - // The path of the host that produced the sender - bool GetHostPath(const char *sendername, char *hostpath, int maxchars); - // Vertical sync status - int GetVerticalSync(); - // Lock to monitor vertical sync - bool SetVerticalSync(bool bSync = true); - // Get Spout version - int GetSpoutVersion(); - - // - // OpenGL utilities - // - - // Create an OpenGL window and context for situations where there is none. - // Not used if applications already have an OpenGL context. - // Always call CloseOpenGL afterwards. - bool CreateOpenGL(); - // Close OpenGL window - bool CloseOpenGL(); - // Copy OpenGL texture with optional invert - // Textures must be the same size - bool CopyTexture(GLuint SourceID, GLuint SourceTarget, - GLuint DestID, GLuint DestTarget, - unsigned int width, unsigned int height, - bool bInvert = false, GLuint HostFBO = 0); - - - // - // 2.006 compatibility - // - - // Create receiver connection - bool CreateReceiver(char* Sendername, unsigned int &width, unsigned int &height, bool bUseActive = false); - // Check receiver connection - bool CheckReceiver(char* Sendername, unsigned int &width, unsigned int &height, bool &bConnected); - // Receive OpenGL texture - bool ReceiveTexture(char* Sendername, unsigned int &width, unsigned int &height, GLuint TextureID = 0, GLuint TextureTarget = 0, bool bInvert = false, GLuint HostFBO = 0); - // Receive image pixels - bool ReceiveImage(char* Sendername, unsigned int &width, unsigned int &height, unsigned char* pixels, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFBO = 0); - // Open dialog for the user to select a sender - // Optional message argument - bool SelectSenderPanel(const char* message = nullptr); - - // Legacy OpenGL Draw function - // See _SpoutCommon.h_ #define legacyOpenGL -#ifdef legacyOpenGL - // Render the shared texture - bool DrawSharedTexture(float max_x = 1.0, float max_y = 1.0, float aspect = 1.0, bool bInvert = true, GLuint HostFBO = 0); -#endif - - // For access to all functions - Spout spout; - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutSender.cpp b/Plugin/Spout/SpoutGL/SpoutSender.cpp deleted file mode 100644 index dabeb65..0000000 --- a/Plugin/Spout/SpoutGL/SpoutSender.cpp +++ /dev/null @@ -1,506 +0,0 @@ -// -// SpoutSender -// -// ==================================================================================== -// Revisions : -// 23.09.14 - return DirectX 11 capability in SetDX9 -// 28.09.14 - Added GL format for SendImage -// - Added bAlignment (4 byte alignment) flag for SendImage -// - Added Host FBO for SendTexture, DrawToSharedTexture -// 08.02.15 - Changed default texture format for SendImage in header to GL_RGBA -// 29.05.15 - Included SetAdapter for multiple adapters - Franz Hildgen. -// 02.06.15 - Added GetAdapter, GetNumAdapters, GetAdapterName -// 08.06.15 - Added SelectSenderPanel for user adapter output selection -// 24.08.15 - Added GetHostPath to retrieve the path of the host that produced the sender -// 25.09.15 - Changed SetMemoryShareMode for 2.005 - now will only set true for 2.005 and above -// 09.10.15 - DrawToSharedTexture - invert default false instead of true -// 10.10.15 - Added transition flag to set invert true for 2.004 rather than default false for 2.005 -// - currently not used - see SpoutSDK.cpp CreateSender -// 14.11.15 - changed functions to "const char *" where required -// 17.03.16 - changed to const unsigned char for Sendimage buffer -// 17.09.16 - removed CheckSpout2004() from constructor -// 13.01.17 - Add SetCPUmode, GetCPUmode, SetBufferMode, GetBufferMode -// 15.01.17 - Add GetShareMode, SetShareMode -// 06.06.17 - Add OpenSpout -// 10.06.17 - Add SetFrameReady -// - Changed CreateSender from (const char* sendername) -// to (char* sendername) to return the sender name if changed -// 18.08.18 - Changed CreateSender, InitSender back to const char -// 23.08.18 - Added SendFboTexture -// 05.11.18 - Add IsInitialized -// 11.11.18 - Add high level application functions -// 13.11.18 - Remove CPU mode functions -// 27.11.18 - Add RemovePadding -// 01.12.18 - Add GetFps and GetFrame -// 11.12.18 - Add utility functions -// 14.12.18 - Clean up -// 16.01.19 - Initialize class variables -// 21.01.19 - Add Bind and UnBindSharedTexture -// 26.02.19 - Add IsFrameCountEnabled -// 07.05.19 - Add HoldFps -// 18.06.19 - Change sender Update to include sender name -// 26.06.19 - Changes to Update and spout.UpdateSender -// 13.09.19 - UpdateSender - update class variables for 2.007 methods -// 18.09.19 - Remove UseDX9 from GetDX9 to avoid registry change -// 18.09.19 - Remove redundant 2.007 functions SetupSender and Update -// - Add invert argument to CreateSender -// 15.10.19 - Check zero width and height for SendData functions -// 13.01.20 - Remove send data functions and replace with overloads of 2.006 functions -// 19.01.20 - Remove send data functions entirely to simplify -// - Change SendFboTexture to SendFbo -// 21.01.20 - Remove auto sender update in send functions -// 24.01.20 - Add GetSharedTextureID and CopyTexture for sender as well as receiver -// - Removed SelectSenderPanel -// 25.01.20 - Remove GetDX9compatible and SetDX9compatible -// 28.04.20 - Add GetName() - get sender name -// 19.06.20 - Remove delay argument from ReleaseSender -// - Remove SenderDebug function - retain in SpoutSenderNames -// 06.07.20 - Add SetSenderName and private CheckSender -// 14.07.20 - CheckSender add zero dimension check -// 04.08.20 - Document header file functions -// 17.09.20 - Change GetMemoryShare(const char* sendername) to -// GetSenderMemoryShare(const char* sendername) for compatibility with SpoutLibrary -// 17.10.20 - Change SetDX9format from D3D_FORMAT to DWORD -// 27.12.20 - Multiple changes for SpoutGL base class - see SpoutSDK.cpp -// -// ==================================================================================== -/* - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#include "SpoutSender.h" - -// -// Class: SpoutSender -// -// Convenience wrapper class for developing sender applications. -// -// Insulates the programmer from receiver functions. -// -// --- Code -// #include "SpoutSender.h" -// --- -// -// The main Spout class can be used but will expose both Sender and Receiver functions -// which cannot be used within the same object. -// A Sender can still access lower level common functions for example : -// --- Code -// SpoutSender sender; -// sender.spout.GLDXready(); -// --- -// -// Refer to the Spout class for function documentation. -// - -//--------------------------------------------------------- -SpoutSender::SpoutSender() -{ - -} - -//--------------------------------------------------------- -SpoutSender::~SpoutSender() -{ - ReleaseSender(); -} - -//--------------------------------------------------------- -void SpoutSender::SetSenderName(const char* sendername) -{ - spout.SetSenderName(sendername); -} - -//--------------------------------------------------------- -void SpoutSender::SetSenderFormat(DWORD dwFormat) -{ - spout.SetSenderFormat(dwFormat); -} - -//--------------------------------------------------------- -void SpoutSender::ReleaseSender() -{ - spout.ReleaseSender(); -} - -//--------------------------------------------------------- -bool SpoutSender::SendFbo(GLuint FboID, unsigned int width, unsigned int height, bool bInvert) -{ - return spout.SendFbo(FboID, width, height, bInvert); -} - -//--------------------------------------------------------- -bool SpoutSender::SendTexture(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, bool bInvert, GLuint HostFBO) -{ - return spout.SendTexture(TextureID, TextureTarget, width, height, bInvert, HostFBO); -} - -//--------------------------------------------------------- -bool SpoutSender::SendImage(const unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat, bool bInvert, GLuint HostFBO) -{ - return spout.SendImage(pixels, width, height, glFormat, bInvert, HostFBO); -} - -//--------------------------------------------------------- -bool SpoutSender::IsInitialized() -{ - return spout.IsInitialized(); -} - -//--------------------------------------------------------- -const char * SpoutSender::GetName() -{ - return spout.GetName(); -} - -//--------------------------------------------------------- -unsigned int SpoutSender::GetWidth() -{ - return spout.GetWidth(); -} - -//--------------------------------------------------------- -unsigned int SpoutSender::GetHeight() -{ - return spout.GetHeight(); -} - -//--------------------------------------------------------- -double SpoutSender::GetFps() -{ - return spout.GetFps(); -} - -//--------------------------------------------------------- -long SpoutSender::GetFrame() -{ - return spout.GetFrame(); -} - -//--------------------------------------------------------- -HANDLE SpoutSender::GetHandle() -{ - return spout.GetHandle(); -} - -// -// Frame count -// - -//--------------------------------------------------------- -void SpoutSender::SetFrameCount(bool bEnable) -{ - return spout.SetFrameCount(bEnable); -} - -//--------------------------------------------------------- -void SpoutSender::DisableFrameCount() -{ - spout.DisableFrameCount(); -} - -//--------------------------------------------------------- -bool SpoutSender::IsFrameCountEnabled() -{ - return spout.IsFrameCountEnabled(); -} - -//--------------------------------------------------------- -void SpoutSender::HoldFps(int fps) -{ - spout.HoldFps(fps); -} - -// -// Graphics compatibility -// - -//--------------------------------------------------------- -bool SpoutSender::GetAutoShare() -{ - return spout.GetAutoShare(); -} - -//--------------------------------------------------------- -void SpoutSender::SetAutoShare(bool bAuto) -{ - spout.SetAutoShare(bAuto); -} - -//--------------------------------------------------------- -bool SpoutSender::IsGLDXready() -{ - return spout.IsGLDXready(); -} - -// -// Sender names -// - -//--------------------------------------------------------- -int SpoutSender::GetSenderCount() -{ - return spout.GetSenderCount(); -} - -//--------------------------------------------------------- -// Get a sender name given an index into the sender names set -bool SpoutSender::GetSender(int index, char* sendername, int sendernameMaxSize) -{ - return spout.GetSender(index, sendername, sendernameMaxSize); -} - -//--------------------------------------------------------- -bool SpoutSender::GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat) -{ - return spout.GetSenderInfo(sendername, width, height, dxShareHandle, dwFormat); -} - -//--------------------------------------------------------- -bool SpoutSender::GetActiveSender(char* Sendername) -{ - return spout.GetActiveSender(Sendername); -} - -//--------------------------------------------------------- -bool SpoutSender::SetActiveSender(const char* Sendername) -{ - return spout.SetActiveSender(Sendername); -} - -// -// Adapter functions -// - -//--------------------------------------------------------- -int SpoutSender::SpoutSender::GetNumAdapters() -{ - return spout.GetNumAdapters(); -} - -//--------------------------------------------------------- -bool SpoutSender::GetAdapterName(int index, char *adaptername, int maxchars) -{ - return spout.GetAdapterName(index, adaptername, maxchars); -} - -//--------------------------------------------------------- -int SpoutSender::GetAdapter() -{ - return spout.GetAdapter(); -} - -//--------------------------------------------------------- -bool SpoutSender::SetAdapter(int index) -{ - return spout.SetAdapter(index); -} - -//--------------------------------------------------------- -bool SpoutSender::GetAdapterInfo(char *renderdescription, char *displaydescription, int maxchars) -{ - return spout.GetAdapterInfo(renderdescription, displaydescription, maxchars); -} - -//--------------------------------------------------------- -int SpoutSender::Adapter() -{ - return spout.Adapter(); -} - -//--------------------------------------------------------- -char * SpoutSender::AdapterName() -{ - return spout.AdapterName(); -} - -// -// User settings recorded by "SpoutSettings" -// - -//--------------------------------------------------------- -bool SpoutSender::GetBufferMode() -{ - return spout.GetBufferMode(); -} - -//--------------------------------------------------------- -void SpoutSender::SetBufferMode(bool bActive) -{ - spout.SetBufferMode(bActive); -} - -//--------------------------------------------------------- -int SpoutSender::GetBuffers() -{ - return spout.GetBuffers(); -} - -//--------------------------------------------------------- -void SpoutSender::SetBuffers(int nBuffers) -{ - spout.SetBuffers(nBuffers); -} - -//--------------------------------------------------------- -int SpoutSender::GetMaxSenders() -{ - return spout.GetMaxSenders(); -} - -//--------------------------------------------------------- -void SpoutSender::SetMaxSenders(int maxSenders) -{ - spout.SetMaxSenders(maxSenders); -} - -// -// For 2.006 compatibility -// - -bool SpoutSender::GetDX9() -{ - return spout.GetDX9(); -} - -bool SpoutSender::SetDX9(bool bDX9) -{ - return spout.SetDX9(bDX9); -} - -bool SpoutSender::GetMemoryShareMode() -{ - return spout.GetMemoryShareMode(); -} - -bool SpoutSender::SetMemoryShareMode(bool bMem) -{ - return spout.SetMemoryShareMode(bMem); -} - - -bool SpoutSender::GetCPUmode() -{ - return spout.GetCPUmode(); -} - -bool SpoutSender::SetCPUmode(bool bCPU) -{ - return spout.SetCPUmode(bCPU); -} - -int SpoutSender::GetShareMode() -{ - return spout.GetShareMode(); -} - -void SpoutSender::SetShareMode(int mode) -{ - spout.SetShareMode(mode); -} - -// -// Information -// - -//--------------------------------------------------------- -bool SpoutSender::GetHostPath(const char *sendername, char *hostpath, int maxchars) -{ - return spout.GetHostPath(sendername, hostpath, maxchars); -} - -//--------------------------------------------------------- -int SpoutSender::GetVerticalSync() -{ - return spout.GetVerticalSync(); -} - -//--------------------------------------------------------- -bool SpoutSender::SetVerticalSync(bool bSync) -{ - return spout.SetVerticalSync(bSync); -} - -//--------------------------------------------------------- -int SpoutSender::GetSpoutVersion() -{ - return spout.GetSpoutVersion(); -} - -// -// OpenGL utilities -// - -//--------------------------------------------------------- -bool SpoutSender::CreateOpenGL() -{ - return spout.CreateOpenGL(); -} - -//--------------------------------------------------------- -bool SpoutSender::CloseOpenGL() -{ - return spout.CloseOpenGL(); -} - -//--------------------------------------------------------- -bool SpoutSender::CopyTexture(GLuint SourceID, GLuint SourceTarget, - GLuint DestID, GLuint DestTarget, - unsigned int width, unsigned int height, - bool bInvert, GLuint HostFBO) -{ - return spout.CopyTexture(SourceID, SourceTarget, DestID, DestTarget, - width, height, bInvert, HostFBO); -} - -// -// 2.006 compatibility -// - -//--------------------------------------------------------- -bool SpoutSender::CreateSender(const char* name, unsigned int width, unsigned int height, DWORD dwFormat) -{ - return spout.CreateSender(name, width, height, dwFormat); -} - -//--------------------------------------------------------- -bool SpoutSender::UpdateSender(const char* name, unsigned int width, unsigned int height) -{ - return spout.UpdateSender(name, width, height); -} - -// Legacy OpenGL DrawTo function -#ifdef legacyOpenGL - -//--------------------------------------------------------- -bool SpoutSender::DrawToSharedTexture(GLuint TextureID, GLuint TextureTarget, - unsigned int width, unsigned int height, - float max_x, float max_y, float aspect, - bool bInvert, GLuint HostFBO) -{ - return spout.DrawToSharedTexture(TextureID, TextureTarget, - width, height, max_x, max_y, aspect, bInvert, HostFBO); - -} -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutSender.h b/Plugin/Spout/SpoutGL/SpoutSender.h deleted file mode 100644 index 5481800..0000000 --- a/Plugin/Spout/SpoutGL/SpoutSender.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - - SpoutSender.h - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#pragma once - -#ifndef __SpoutSender__ -#define __SpoutSender__ - -#include "Spout.h" - -class SPOUT_DLLEXP SpoutSender { - - public: - - SpoutSender(); - ~SpoutSender(); - - // Set name for sender creation - // If no name is specified, the executable name is used. - void SetSenderName(const char* sendername = nullptr); - // Set the sender DX11 shared texture format - void SetSenderFormat(DWORD dwFormat); - // Close sender and free resources - // A sender is created or updated by all sending functions - void ReleaseSender(); - // Send texture attached to fbo. - // The fbo must be currently bound. - // The sending texture can be larger than the size that the sender is set up for. - // For example, if the application is using only a portion of the allocated texture space, - // such as for Freeframe plugins. (The 2.006 equivalent is DrawToSharedTexture). - bool SendFbo(GLuint FboID, unsigned int width, unsigned int height, bool bInvert = true); - // Send OpenGL texture - bool SendTexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, bool bInvert = true, GLuint HostFBO = 0); - // Send image pixels - bool SendImage(const unsigned char* pixels, unsigned int width, unsigned int height, GLenum glFormat = GL_RGBA, bool bInvert = false, GLuint HostFBO = 0); - // Sender status - bool IsInitialized(); - // Sender name - const char * GetName(); - // Sender width - unsigned int GetWidth(); - // Sender height - unsigned int GetHeight(); - // Sender frame rate - double GetFps(); - // Sender frame number - long GetFrame(); - // Sender share handle - HANDLE GetHandle(); - - // - // Frame count - // - - // Enable or disable frame counting globally - void SetFrameCount(bool bEnable); - // Disable frame counting specifically for this application - void DisableFrameCount(); - // Return frame count status - bool IsFrameCountEnabled(); - // Frame rate control - void HoldFps(int fps); - - // - // Graphics compatibility - // - - // Get auto GPU/CPU share depending on compatibility - bool GetAutoShare(); - // Set auto GPU/CPU share depending on compatibility - void SetAutoShare(bool bAuto = true); - // OpenGL texture share compatibility - bool IsGLDXready(); - - // - // Sender names - // - - // Number of senders - int GetSenderCount(); - // Sender item name - bool GetSender(int index, char* sendername, int MaxSize = 256); - // Sender information - bool GetSenderInfo(const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat); - // Current active sender - bool GetActiveSender(char* sendername); - // Set sender as active - bool SetActiveSender(const char* sendername); - - // - // Adapter functions - // - - // The number of graphics adapters in the system - int GetNumAdapters(); - // Get adapter item name - bool GetAdapterName(int index, char *adaptername, int maxchars = 256); - // Get adapter index - int GetAdapter(); - // Set graphics adapter for output - bool SetAdapter(int index = 0); - // Get the current adapter description - bool GetAdapterInfo(char *renderdescription, char *displaydescription, int maxchars); - // Current adapter - int Adapter(); - // Current adapter name - char * AdapterName(); - - // - // User settings recorded by "SpoutSettings" - // - - // Get user buffering mode - bool GetBufferMode(); - // Set application buffering mode - void SetBufferMode(bool bActive = true); - // Get user number of pixel buffers - int GetBuffers(); - // Set application number of pixel buffers - void SetBuffers(int nBuffers); - // Get user Maximum senders allowed - int GetMaxSenders(); - // Set user Maximum senders allowed - void SetMaxSenders(int maxSenders); - - // - // 2.006 compatibility - // - - // Get user DX9 mode - bool GetDX9(); - // Set user DX9 mode - bool SetDX9(bool bDX9 = true); - // Get user memory share mode - bool GetMemoryShareMode(); - // Set user memory share mode - bool SetMemoryShareMode(bool bMem = true); - // Get user CPU mode - bool GetCPUmode(); - // Set user CPU mode - bool SetCPUmode(bool bCPU); - // Get user share mode - // 0 - texture, 1 - memory, 2 - CPU - int GetShareMode(); - // Set user share mode - // 0 - texture, 1 - memory, 2 - CPU - void SetShareMode(int mode); - - // - // Information - // - - // The path of the host that produced the sender - bool GetHostPath(const char *sendername, char *hostpath, int maxchars); - // Vertical sync status - int GetVerticalSync(); - // Lock to monitor vertical sync - bool SetVerticalSync(bool bSync = true); - // Get Spout version - int GetSpoutVersion(); - - // - // OpenGL utilities - // - - // Create an OpenGL window and context for situations where there is none. - // Not used if applications already have an OpenGL context. - // Always call CloseOpenGL afterwards. - bool CreateOpenGL(); - // Close OpenGL window - bool CloseOpenGL(); - // Copy OpenGL texture with optional invert - // Textures must be the same size - bool CopyTexture(GLuint SourceID, GLuint SourceTarget, - GLuint DestID, GLuint DestTarget, - unsigned int width, unsigned int height, - bool bInvert = false, GLuint HostFBO = 0); - - - // - // 2.006 compatibility - // - - // Create a sender - bool CreateSender(const char *Sendername, unsigned int width = 0, unsigned int height = 0, DWORD dwFormat = 0); - // Update a sender - bool UpdateSender(const char* Sendername, unsigned int width, unsigned int height); - - // Legacy OpenGL DrawTo function - // See _SpoutCommon.h_ #define legacyOpenGL -#ifdef legacyOpenGL - // Render a texture to the shared texture. - bool DrawToSharedTexture(GLuint TextureID, GLuint TextureTarget, unsigned int width, unsigned int height, float max_x = 1.0, float max_y = 1.0, float aspect = 1.0, bool bInvert = false, GLuint HostFBO = 0); -#endif - - // For access to all functions - Spout spout; - -protected : - - -}; - -#endif diff --git a/Plugin/Spout/SpoutGL/SpoutSenderNames.cpp b/Plugin/Spout/SpoutSenderNames.cpp similarity index 90% rename from Plugin/Spout/SpoutGL/SpoutSenderNames.cpp rename to Plugin/Spout/SpoutSenderNames.cpp index 5382f6c..be4c7bb 100644 --- a/Plugin/Spout/SpoutGL/SpoutSenderNames.cpp +++ b/Plugin/Spout/SpoutSenderNames.cpp @@ -66,6 +66,12 @@ Write host path to the sender shared memory Description field in CreateSender 13.01.21 - Remove CleanSenders until sender registration investigations are completed Fix typo in host path write. To be tested. + 10.02.21 - GetActiveSender - erase the active sender memory map if the sender info is closed + 15.02.21 - Rebuild Win32 /MD for GitHub 2.007b release + 26.02.21 - Change SetSenderCPUmode to include CPU sharing mode and GLDX compatibility + 27.02.21 - Change SetSenderCPUmode name to SetSenderID + 09.04.21 - Add GetSender to retrieve class sender. + Remove SenderDebug - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copyright (c) 2014-2021, Lynn Jarvis. All rights reserved. @@ -200,6 +206,7 @@ bool spoutSenderNames::ReleaseSenderName(const char* Sendername) // Create the shared memory for the sender name set if it does not exist if(!CreateSenderSet()) return false; + // Get the current map into a buffer char *pBuf = m_senderNames.Lock(); if (!pBuf) return false; @@ -210,6 +217,7 @@ bool spoutSenderNames::ReleaseSenderName(const char* Sendername) m_senders->erase(namestring); } + // Read the buffer to a set to iterate through the names readSenderSetFromBuffer(pBuf, SenderNames, m_MaxSenders); // Discovered that the project properties had been set to CLI @@ -217,16 +225,16 @@ bool spoutSenderNames::ReleaseSenderName(const char* Sendername) // and this caused the set "find" function not to work. // It also disabled intellisense. - // Get the current map to update the list + // If the sender exists if(SenderNames.find(Sendername) != SenderNames.end() ) { - SenderNames.erase(Sendername); // erase the matching Sender + SenderNames.erase(Sendername); + // Write the sender names back to the buffer writeBufferFromSenderSet(SenderNames, pBuf, m_MaxSenders); // Is there a set left ? if(SenderNames.size() > 0) { - // This should be OK because the user selects the active sender // Was it the active sender ? if( (getActiveSenderName(name) && strcmp(name, Sendername) == 0) || SenderNames.size() == 1) { - // It was, so choose the first in the list + // It was, so choose the first in the list and make it active instead std::set::iterator iter = SenderNames.begin(); namestring = *iter; strcpy_s(name, namestring.c_str()); @@ -481,7 +489,7 @@ bool spoutSenderNames::SetSenderInfo(const char* sendername, unsigned int width, { return false; } - + info.width = (unsigned __int32)width; info.height = (unsigned __int32)height; #ifdef _M_X64 @@ -498,13 +506,14 @@ bool spoutSenderNames::SetSenderInfo(const char* sendername, unsigned int width, // Texture usage info.usage = 0; - // Partner ID : Sender CPU mode - // TODO - // info.partnerId = 0; - // Description : Host path char exepath[256]; GetModuleFileNameA(NULL, exepath, sizeof(exepath)); + + // Partner ID : Sender CPU sharing mode + // Set by SetSenderID + // TODO : combine here + // Description is defined as wide chars, but the path is stored as byte chars memcpy((void *)info.description, (void *)exepath, 256); // wchar 128 @@ -518,6 +527,47 @@ bool spoutSenderNames::SetSenderInfo(const char* sendername, unsigned int width, } // end SetSenderInfo +// +// Set sender CPU sharing mode and hardware compatibility with GL/DX linkage +// to the two top bits of the 32 bit partnerID field in sender shared memory +// +// bCPU - means "using CPU sharing methods" +// 1000 0000 0000 0000 0000 0000 0000 0000 = 0x80000000 +// bGLDX - means "compatible with OpenGL/DirectX interop" +// 0100 0000 0000 0000 0000 0000 0000 0000 = 0x40000000 +// Both set - means "GL/DX compatible but using CPU sharing methods" +// 1100 0000 0000 0000 0000 0000 0000 0000 = 0xC0000000 +// +// 2.006 senders may or may not have these bits set but will rarely have the exact values. +// +bool spoutSenderNames::SetSenderID(const char *sendername, bool bCPU, bool bGLDX) +{ + SharedTextureInfo info; + + SpoutLogNotice("spoutSenderNames::SetSenderID(%s, %d, %d)", sendername, bCPU, bGLDX); + + if (getSharedInfo(sendername, &info)) { + + // Using CPU sharing methods - set top bit + // 1000 0000 0000 0000 0000 0000 0000 0000 + // GL/DX compatible hardware - set next to top bit + // 0100 0000 0000 0000 0000 0000 0000 0000 + + info.partnerId = 0x00000000; // Default both bits clear + if (bCPU) + info.partnerId = 0x80000000; + if (bGLDX) + info.partnerId |= 0x40000000; + + // Save the info for this sender in the sender shared memory map + setSharedInfo(sendername, &info); + + return true; + } + + return false; +} + // Functions to set or get the active Sender name // The "active" Sender is the one of the multiple Senders // that is top of the list or is the one selected by the user from this list. @@ -560,7 +610,6 @@ bool spoutSenderNames::SetActiveSender(const char *Sendername) } // end SetActiveSender - // Retrieve the current active Sender name bool spoutSenderNames::GetActiveSender(char Sendername[SpoutMaxSenderNameLen]) { @@ -574,7 +623,8 @@ bool spoutSenderNames::GetActiveSender(char Sendername[SpoutMaxSenderNameLen]) return true; } else { - // Erase the active sender name ? + // Erase the active sender memory map + m_activeSender.Close(); } } @@ -625,11 +675,10 @@ bool spoutSenderNames::FindActiveSender(char sendername[SpoutMaxSenderNameLen], } // end FindActiveSender - -///////////////////////////////////////////////////////////////////////////////////// -// Functions to Create, Update and Close a sender and retrieve sender texture info // -// without initializing DirectX or the GL/DX interop functions // -///////////////////////////////////////////////////////////////////////////////////// +// =============================================================================== +// Functions to Create, Update and Close a sender and retrieve sender texture info +// without initializing DirectX or the GL/DX interop functions +// =============================================================================== // Create a sender bool spoutSenderNames::CreateSender(const char *sendername, unsigned int width, unsigned int height, HANDLE hSharehandle, DWORD dwFormat) @@ -655,25 +704,24 @@ bool spoutSenderNames::UpdateSender(const char *sendername, unsigned int width, { std::string namestring = sendername; - if (m_senders->find(namestring) == m_senders->end()) { + if (m_senders->find(namestring) == m_senders->end()) { // New sender + // Create or open a shared memory map for this sender - allocate enough for the texture info SpoutSharedMemory *senderInfoMem = new SpoutSharedMemory(); SpoutCreateResult result = senderInfoMem->Create(sendername, sizeof(SharedTextureInfo)); - if(result == SPOUT_CREATE_FAILED) { + + if (result == SPOUT_CREATE_FAILED) { delete senderInfoMem; m_senderNames.Unlock(); return false; } + (*m_senders)[namestring] = senderInfoMem; - } - // Save the info for this sender in the sender shared memory map - if(!SetSenderInfo(sendername, width, height, hSharehandle, dwFormat)) { - return false; } - - - return true; + + // Save the info for this sender in the sender shared memory map + return SetSenderInfo(sendername, width, height, hSharehandle, dwFormat); } // end UpdateSender @@ -688,47 +736,6 @@ bool spoutSenderNames::UpdateSender(const char *sendername, unsigned int width, // DX11 - D3D11_USAGE_DEFAULT // =============================================================================== -// Find a sender and return the name, width and height, sharhandle and format -bool spoutSenderNames::FindSender(char *sendername, unsigned int &width, unsigned int &height, HANDLE &hSharehandle, DWORD &dwFormat) -{ - SharedTextureInfo info; - - // Check the user entered Sender name to see if it exists - if(sendername[0] == 0) { - // Passed name was null, so find the active sender - if(!GetActiveSender(sendername)) - return false; - } - // now we have either an existing sender name or the active sender name - - // 01.08.15 - Is the given sender registered ? - // 09.03.18 - change to logic so that the sendernames map is not - // accessed every frame by a receiver when looking for a named sender - // getSharedInfo fails if the sender is not there and ReleaseSenderName - // is not necessary. A sender will release it's name from the list when it closes - // and will only not do so if the sender crashes. - // Then SpoutPanel will clean the sender set and remove senders that do not exist - // This is also done by RegisterSenderName for every sender that is registered - - // Try to get the sender information - if(getSharedInfo(sendername, &info)) { - width = (unsigned int)info.width; // pass back sender size - height = (unsigned int)info.height; -#ifdef _M_X64 - hSharehandle = (HANDLE)(LongToHandle((long)info.shareHandle)); -#else - hSharehandle = (HANDLE)info.shareHandle; -#endif - dwFormat = (DWORD)info.format; - return true; - } - - // Not there - could have closed or crashed - return false; - -} // end FindSender - - // // Check the details of an existing sender // @@ -749,8 +756,8 @@ bool spoutSenderNames::CheckSender(const char *sendername, unsigned int &theWidt { SharedTextureInfo info; - //// Is the given sender registered ? - // if(FindSenderName(sendername)) { + // Is the given sender registered ? + if(FindSenderName(sendername)) { // Does it still exist ? if(getSharedInfo(sendername, &info)) { // Return the texture info @@ -764,11 +771,11 @@ bool spoutSenderNames::CheckSender(const char *sendername, unsigned int &theWidt dwFormat = (DWORD)info.format; return true; - // } - // else { + } + else { // Sender is registered but does not exist so close it - // ReleaseSenderName(sendername); - // } + ReleaseSenderName(sendername); + } } @@ -780,6 +787,55 @@ bool spoutSenderNames::CheckSender(const char *sendername, unsigned int &theWidt } // end CheckSender +// Find a sender and return the name, width and height, sharhandle and format +bool spoutSenderNames::FindSender(char *sendername, unsigned int &width, unsigned int &height, HANDLE &hSharehandle, DWORD &dwFormat) +{ + SharedTextureInfo info; + + // Check the user entered Sender name to see if it exists + if (sendername[0] == 0) { + // Passed name was null, so find the active sender + if (!GetActiveSender(sendername)) + return false; + } + // now we have either an existing sender name or the active sender name + + // 01.08.15 - Is the given sender registered ? + // 09.03.18 - change to logic so that the sendernames map is not + // accessed every frame by a receiver when looking for a named sender + // getSharedInfo fails if the sender is not there and ReleaseSenderName + // is not necessary. A sender will release it's name from the list when it closes + // and will only not do so if the sender crashes. + // Then SpoutPanel will clean the sender set and remove senders that do not exist + // This is also done by RegisterSenderName for every sender that is registered + + // Try to get the sender information + if (getSharedInfo(sendername, &info)) { + width = (unsigned int)info.width; // pass back sender size + height = (unsigned int)info.height; +#ifdef _M_X64 + hSharehandle = (HANDLE)(LongToHandle((long)info.shareHandle)); +#else + hSharehandle = (HANDLE)info.shareHandle; +#endif + dwFormat = (DWORD)info.format; + return true; + } + + // Not there - could have closed or crashed + return false; + +} // end FindSender + +// Get sender in this class +bool spoutSenderNames::GetSender(const char* sendername) +{ + std::string namestring = sendername; + if (m_senders->find(namestring) != m_senders->end()) + return true; + + return false; +} // Release any orphaned senders if the name exists // in the sender list but the shared memory info does not @@ -805,7 +861,6 @@ void spoutSenderNames::CleanSenders() // we have the name already, so look for it's info if (!getSharedInfo(name, &info)) { // Sender does not exist any more so release from the name list - // printf("[%s] does not exist any more\n", name); ReleaseSenderName(name); } } @@ -895,7 +950,6 @@ bool spoutSenderNames::CreateSenderSet() SpoutLogError("spoutSenderNames::CreateSenderSet() : SPOUT_CREATE_FAILED"); return false; } - return true; } // end CreateSenderSet @@ -1041,82 +1095,3 @@ bool spoutSenderNames::hasSharedInfo(const char* sharedMemoryName) } // end hasSharedInfo - - -//--------------------------------------------------------- -bool spoutSenderNames::SenderDebug(const char *Sendername, int size) -{ - // HANDLE hMap1 = NULL; - // HANDLE hMap2 = NULL; - // HANDLE hMap3 = NULL; - std::set SenderNames; - std::set::iterator iter; - std::string namestring; - - UNREFERENCED_PARAMETER(Sendername); - UNREFERENCED_PARAMETER(size); - - // printf("**** SENDER DEBUG ****\n"); - - // m_senderNames.Debug(); - - // Check the sender names - /* - // printf(" GetSenderSet\n"); - if(GetSenderSet(SenderNames)) { - // printf(" SenderNames size = [%d]\n", SenderNames.size()); - if (SenderNames.size() > 0) { - for(iter = SenderNames.begin(); iter != SenderNames.end(); iter++) { - namestring = *iter; - // printf(" Sender : [%s]\n", namestring.c_str()); - } - } - } - else { - // printf(" GetSenderSet failed\n"); - } - */ - - /* - printf(" GetSenderNames\n"); - if(GetSenderNames(&SenderNames)) { - printf(" SenderNames size = [%d]\n", SenderNames.size()); - if (SenderNames.size() > 0) { - for(iter = SenderNames.begin(); iter != SenderNames.end(); iter++) { - namestring = *iter; - printf(" Sender : [%s]\n", namestring.c_str()); - } - } - else { - printf(" SenderNames size = 0\n"); - } - } - else { - printf(" GetSenderSet failed\n"); - } - */ - - // MessageBoxA(NULL,"spoutSenderNames::SenderDebug()", "Info", MB_OK); - - /* - // printf("2) Closing - hSenderNamesMap = [%x], pSenderNamesMap = [%x]\n", m_hSenderNamesMap, m_pSenderNamesMap); - - // Close and try to reopen - CloseMap(m_pSenderNamesMap, m_hSenderNamesMap); - - hMap2 = OpenFileMappingA (FILE_MAP_ALL_ACCESS, false, "SpoutSenderNames"); - if(hMap2) { - // printf(" Sendernames map [%x] did not close\n", hMap2); - CloseHandle(hMap2); - } - else { - // printf(" Closed sendernames map OK\n"); - } - - CloseMap(m_pActiveSenderMap, m_hActiveSenderMap); - */ - - // m_activeSender.Debug(); - - return true; -} diff --git a/Plugin/Spout/SpoutGL/SpoutSenderNames.h b/Plugin/Spout/SpoutSenderNames.h similarity index 96% rename from Plugin/Spout/SpoutGL/SpoutSenderNames.h rename to Plugin/Spout/SpoutSenderNames.h index 20652a0..b9e6711 100644 --- a/Plugin/Spout/SpoutGL/SpoutSenderNames.h +++ b/Plugin/Spout/SpoutSenderNames.h @@ -98,7 +98,7 @@ class SPOUT_DLLEXP spoutSenderNames { // Register a sender name in the list of senders bool RegisterSenderName(const char* sendername); - // Remove a name fromn the list + // Remove a name from the list bool ReleaseSenderName(const char* sendername); // Find a name in the list bool FindSenderName(const char* sendername); @@ -132,6 +132,8 @@ class SPOUT_DLLEXP spoutSenderNames { bool GetSenderInfo (const char* sendername, unsigned int &width, unsigned int &height, HANDLE &dxShareHandle, DWORD &dwFormat); // Set sender information bool SetSenderInfo (const char* sendername, unsigned int width, unsigned int height, HANDLE dxShareHandle, DWORD dwFormat); + // Set sender PartnerID field with "CPU" sharing method and GL/DX compatibility + bool SetSenderID(const char *sendername, bool bCPU, bool bGLDX); // Generic sender map info read (returned in a shared texture information structure) bool getSharedInfo (const char* sendername, SharedTextureInfo* info); // Generic sender map info write @@ -165,11 +167,11 @@ class SPOUT_DLLEXP spoutSenderNames { bool CheckSender (const char* sendername, unsigned int &width, unsigned int &height, HANDLE &hSharehandle, DWORD &dwFormat); // Find a sender and return details bool FindSender (char* sendername, unsigned int &width, unsigned int &height, HANDLE &hSharehandle, DWORD &dwFormat); + // Get sender in this class + bool GetSender(const char* sendername); // Release orphaned senders void CleanSenders(); - // Debuging function - bool SenderDebug (const char* sendername, int size); protected: diff --git a/Plugin/Spout/SpoutGL/SpoutSharedMemory.cpp b/Plugin/Spout/SpoutSharedMemory.cpp similarity index 93% rename from Plugin/Spout/SpoutGL/SpoutSharedMemory.cpp rename to Plugin/Spout/SpoutSharedMemory.cpp index 4c28b41..c9d83ae 100644 --- a/Plugin/Spout/SpoutGL/SpoutSharedMemory.cpp +++ b/Plugin/Spout/SpoutSharedMemory.cpp @@ -32,7 +32,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + */ #include "SpoutSharedMemory.h" @@ -113,6 +113,9 @@ SpoutCreateResult SpoutSharedMemory::Create(const char* name, int size) } } + // We can depend on the mapping object to be initially zeros. + // https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createfilemappinga + m_pBuffer = (char*)MapViewOfFile(m_hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (!m_pBuffer) { @@ -173,6 +176,8 @@ bool SpoutSharedMemory::Open(const char* name) } m_pName = _strdup(name); + // OpenFileMapping/MapViewOfFile do not return the map size + // Only the process that creates the shared memory can save it's size. m_size = 0; return true; @@ -201,6 +206,8 @@ void SpoutSharedMemory::Close() m_pName = NULL; } + m_size = 0; + } @@ -240,7 +247,6 @@ char* SpoutSharedMemory::Lock() void SpoutSharedMemory::Unlock() { - assert(m_hMutex); m_lockCount--; @@ -251,6 +257,16 @@ void SpoutSharedMemory::Unlock() } } +const char* SpoutSharedMemory::Name() +{ + return m_pName; +} + +int SpoutSharedMemory::Size() +{ + return m_size; +} + void SpoutSharedMemory::Debug() { if (m_pName) { diff --git a/Plugin/Spout/SpoutGL/SpoutSharedMemory.h b/Plugin/Spout/SpoutSharedMemory.h similarity index 96% rename from Plugin/Spout/SpoutGL/SpoutSharedMemory.h rename to Plugin/Spout/SpoutSharedMemory.h index fcf5d41..0e97b84 100644 --- a/Plugin/Spout/SpoutGL/SpoutSharedMemory.h +++ b/Plugin/Spout/SpoutSharedMemory.h @@ -73,6 +73,12 @@ class SPOUT_DLLEXP SpoutSharedMemory { // Unlock a map void Unlock(); + // Name of an existing map + const char* Name(); + + // Size of an existing map + int Size(); + // Print map information for debugging void Debug(); diff --git a/Plugin/Spout/SpoutGL/SpoutUtils.cpp b/Plugin/Spout/SpoutUtils.cpp similarity index 95% rename from Plugin/Spout/SpoutGL/SpoutUtils.cpp rename to Plugin/Spout/SpoutUtils.cpp index 55bd3ee..9124792 100644 --- a/Plugin/Spout/SpoutGL/SpoutUtils.cpp +++ b/Plugin/Spout/SpoutUtils.cpp @@ -65,6 +65,12 @@ 23.09.20 - _doLog : always prevent multiple logs by comparing with the last instead of reserving for > warnings 16.10.20 - Add bool WriteBinaryToRegistry + 04.03.21 - Add std::string GetSDKversion() + 09.03.21 - Fix code if USE_CHRONO not defined + 17.04.21 - Disable close button on console + Bring the main window to the top again + 07.05.21 - Remove noisy warning from ReadPathFromRegistry + 09.06.21 - Update Version to "2.007.002" */ #include "SpoutUtils.h" @@ -96,15 +102,17 @@ namespace spoututils { std::string logFileName = ""; // file name for the logfile std::string LastSpoutLog = ""; bool bConsole = false; -#if _MSC_VER >= 1900 +#ifdef USE_CHRONO std::chrono::steady_clock::time_point start; std::chrono::steady_clock::time_point end; #endif + std::string SDKversion = "2.007.002"; // Spout SDK version number string // // Console management // +#ifndef MINI_SPOUTUTILS void OpenSpoutConsole() { // AllocConsole fails if the process already has a console @@ -113,11 +121,18 @@ namespace spoututils { bConsole = true; } else { + // Get calling process window + HWND hwndFgnd = GetForegroundWindow(); if (AllocConsole()) { errno_t err = freopen_s(&pCout, "CONOUT$", "w", stdout); if (err == 0) { SetConsoleTitleA("Spout Log"); bConsole = true; + // Disable close button + HMENU hmenu = GetSystemMenu(GetConsoleWindow(), FALSE); + EnableMenuItem(hmenu, SC_CLOSE, MF_GRAYED); + // Bring the main window to the top again + SetWindowPos(hwndFgnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } else { pCout = NULL; @@ -125,7 +140,6 @@ namespace spoututils { } } } - } void CloseSpoutConsole(bool bWarning) @@ -286,6 +300,7 @@ namespace spoututils { { CurrentLogLevel = level; } +#endif // MINI_SPOUTUTILS void SpoutLog(const char* format, ...) @@ -336,6 +351,7 @@ namespace spoututils { va_end(args); } +#ifndef MINI_SPOUTUTILS // // MessageBox // @@ -395,6 +411,7 @@ namespace spoututils { return iRet; } +#endif // MINI_SPOUTUTILS // // Registry utilities @@ -422,7 +439,7 @@ namespace spoututils { if (regres == ERROR_SUCCESS) return true; } - + // Just quit if the key does not exist return false; @@ -487,8 +504,6 @@ namespace spoututils { return true; } // Quit if the key does not exist - SpoutLogWarning("ReadPathFromRegistry - could not open subkey [%s] Error (%ld)", subkey, regres); - return false; } @@ -550,11 +565,6 @@ namespace spoututils { } if (regres == ERROR_SUCCESS && hRegKey != NULL) { - - // Write the binary string - // printf("\nhexdata size = %d\n", (int)sizeof(hexdata)); - - regres = RegSetValueExA(hRegKey, valuename, 0, REG_BINARY, (BYTE *)hexdata, nChars); RegCloseKey(hRegKey); } @@ -621,20 +631,32 @@ namespace spoututils { } +#ifndef MINI_SPOUTUTILS // Timing utility functions -#ifdef USE_CHRONO void StartTiming() { +#ifdef USE_CHRONO start = std::chrono::steady_clock::now(); +#endif } double EndTiming() { +#ifdef USE_CHRONO end = std::chrono::steady_clock::now(); double elapsed = static_cast(std::chrono::duration_cast(end - start).count()); - // printf("elapsed [%.3f] msec\n", elapsed / 1000.0); + // printf(" elapsed [%.4f] msec\n", elapsed / 1000.0); // printf("elapsed [%.3f] u/sec\n", elapsed); return elapsed; - } +#else + return 0.0; #endif + } +#endif // MINI_SPOUTUTILS + + // Get SDK version number string e.g. "2.007.000" + std::string GetSDKversion() + { + return SDKversion; + } // Perform the log void _doLog(SpoutLogLevel level, const char* format, va_list args) @@ -660,6 +682,7 @@ namespace spoututils { // Prevent multiple logs by comparing with the last if (logString == LastSpoutLog) return; + LastSpoutLog = logString; // update the last log // Console logging @@ -699,6 +722,7 @@ namespace spoututils { namespace { +#ifndef MINI_SPOUTUTILS // Get the default log file path std::string _getLogPath() { @@ -712,7 +736,7 @@ namespace spoututils { if (SUCCEEDED(hr) && appdatapath) { wcscpy_s(wpath, MAX_PATH, appdatapath); wcscat_s(wpath, MAX_PATH, L"\\Spout"); - wcstombs_s(NULL, logpath, wpath, MAX_PATH); + wcstombs_s(NULL, logpath, MAX_PATH, wpath, MAX_PATH); if (_access(logpath, 0) == -1) { if (!CreateDirectoryA(logpath, NULL)) { hr = S_FALSE; @@ -730,6 +754,7 @@ namespace spoututils { return logpath; } +#endif // MINI_SPOUTUTILS // Get the name for the current log level std::string _levelName(SpoutLogLevel level) { @@ -751,6 +776,7 @@ namespace spoututils { } } +#ifndef MINI_SPOUTUTILS // Log to file with optional append void _logtofile(bool append) { @@ -858,13 +884,11 @@ namespace spoututils { // Find SpoutSettings path char exePath[MAX_PATH]; if (!ReadPathFromRegistry(HKEY_CURRENT_USER, "Software\\Leading Edge\\Spout", "SpoutSettings", exePath)) { - printf("Spout::SetNVIDIAmode - SpoutSettings path not found\n"); SpoutLogError("Spout::SetNVIDIAmode - SpoutSettings path not found"); return false; } if (!PathFileExistsA(exePath)) { - printf("Spout::SetNVIDIAmode - SpoutSettings.exe not found\n[%s]\n", exePath); SpoutLogError("Spout::SetNVIDIAmode - SpoutSettings.exe not found"); return false; } @@ -919,6 +943,7 @@ namespace spoututils { return bRet; } +#endif // MINI_SPOUTUTILS } // end private namespace diff --git a/Plugin/Spout/SpoutGL/SpoutUtils.h b/Plugin/Spout/SpoutUtils.h similarity index 95% rename from Plugin/Spout/SpoutGL/SpoutUtils.h rename to Plugin/Spout/SpoutUtils.h index 3408d7f..8210932 100644 --- a/Plugin/Spout/SpoutGL/SpoutUtils.h +++ b/Plugin/Spout/SpoutUtils.h @@ -41,7 +41,7 @@ #include // for _access #include #include -#include // for shellexecute +#include // for shellexecute #include // for path functions #include // to find the AppData folder @@ -97,6 +97,7 @@ namespace spoututils { // Console management // +#ifndef MINI_SPOUTUTILS // Open console window. // A console window opens without logs. // Useful for debugging with console output. @@ -142,6 +143,7 @@ namespace spoututils { // Set the current log level void SetSpoutLogLevel(SpoutLogLevel level); +#endif // MINI_SPOUTUTILS // General purpose log void SpoutLog(const char* format, ...); @@ -161,6 +163,7 @@ namespace spoututils { // Fatal - always show log void SpoutLogFatal(const char* format, ...); +#ifndef MINI_SPOUTUTILS // // MessageBox dialog // @@ -173,6 +176,7 @@ namespace spoututils { // MessageBox dialog with standard arguments. // Replaces an existing MessageBox call. int SpoutMessageBox(HWND hwnd, LPCSTR message, LPCSTR caption, UINT uType, DWORD dwMilliseconds = 0); +#endif // MINI_SPOUTUTILS // // Registry utilities @@ -204,6 +208,22 @@ namespace spoututils { // Find subkey bool FindSubKey(HKEY hKey, const char *subkey); +#ifndef MINI_SPOUTUTILS + // + // Timing functions + // +#ifdef USE_CHRONO + // Start timing period + void StartTiming(); + // Stop timing and return microseconds elapsed. + // Code console output can be enabled for quick timing tests. + double EndTiming(); +#endif +#endif // MINI_SPOUTUTILS + + // Get SDK version number string e.g. "2.007.000" + std::string GetSDKversion(); + // Logging function. // Used internally to perform logging. // The function code can be changed to produce logs as required @@ -216,28 +236,21 @@ namespace spoututils { { // Local functions +#ifndef MINI_SPOUTUTILS std::string _getLogPath(); +#endif // MINI_SPOUTUTILS std::string _levelName(SpoutLogLevel level); +#ifndef MINI_SPOUTUTILS void _logtofile(bool append = false); // Used internally for NVIDIA profile functions bool GetNVIDIAmode(const char *command, int * mode); bool SetNVIDIAmode(const char *command, int mode); bool ExecuteProcess(char *path); +#endif // MINI_SPOUTUTILS } - // - // Timing functions - // -#ifdef USE_CHRONO - // Start timing period - void StartTiming(); - // Stop timing and return microseconds elapsed. - // Code console output can be enabled for quick timing tests. - double EndTiming(); -#endif - } diff --git a/Plugin/System.h b/Plugin/System.h new file mode 100644 index 0000000..c8be3bf --- /dev/null +++ b/Plugin/System.h @@ -0,0 +1,101 @@ +#pragma once + +#include "Common.h" + +namespace KlakSpout { + +// Singleton system class that manages DX11/12 device/context objects +class System final +{ +public: + + System(IUnityInterfaces* unity) + : _unity(unity), + isD3D12(getGraphics()->GetRenderer() == kUnityGfxRendererD3D12) {} + + void shutdown() + { + _d3d11on12 = nullptr; + _d3d11_device = nullptr; + _d3d11_context = nullptr; + } + + IUnityGraphics* getGraphics() const + { + return _unity->Get(); + } + + WRL::ComPtr getD3D12Device() const + { + return _unity->Get()->GetDevice(); + } + + WRL::ComPtr getD3D11On12Device() + { + if (!_d3d11_device) PrepareD3D11On12(); + WRL::ComPtr d3d11on12; + _d3d11_device.As(&d3d11on12); + return d3d11on12; + } + + WRL::ComPtr getD3D11Device() + { + if (isD3D12) + { + if (!_d3d11_device) PrepareD3D11On12(); + return _d3d11_device; + } + else + { + return _unity->Get()->GetDevice(); + } + } + + WRL::ComPtr getD3D11Context() + { + if (isD3D12) + { + if (!_d3d11_context) PrepareD3D11On12(); + return _d3d11_context; + } + else + { + WRL::ComPtr ctx; + _unity->Get() + ->GetDevice()->GetImmediateContext(&ctx); + return ctx; + } + } + +private: + + IUnityInterfaces* _unity; + +public: + + spoutSenderNames spout; + const bool isD3D12; + +public: + + WRL::ComPtr _d3d11on12; + WRL::ComPtr _d3d11_device; + WRL::ComPtr _d3d11_context; + + void PrepareD3D11On12() + { + // Command queue array + IUnknown* queues[] + = { _unity->Get()->GetCommandQueue() }; + + // Create a D3D11-on-12 device. + D3D11On12CreateDevice + (getD3D12Device().Get(), 0, nullptr, 0, + queues, 1, 0, &_d3d11_device, &_d3d11_context, nullptr); + } +}; + +// Singleton instance +inline std::unique_ptr _system; + +} // namespace KlakSpout diff --git a/Plugin/Unity/IUnityGraphics.h b/Plugin/Unity/IUnityGraphics.h index 3759921..71dea56 100644 --- a/Plugin/Unity/IUnityGraphics.h +++ b/Plugin/Unity/IUnityGraphics.h @@ -1,6 +1,13 @@ +// Unity Native Plugin API copyright © 2015 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see[Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS†BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + #pragma once #include "IUnityInterface.h" +// Has to match the GfxDeviceRenderer enum typedef enum UnityGfxRenderer { //kUnityGfxRendererOpenGL = 0, // Legacy OpenGL, removed @@ -9,7 +16,7 @@ typedef enum UnityGfxRenderer kUnityGfxRendererNull = 4, // "null" device (used in batch mode) kUnityGfxRendererOpenGLES20 = 8, // OpenGL ES 2.0 kUnityGfxRendererOpenGLES30 = 11, // OpenGL ES 3.0 - kUnityGfxRendererGXM = 12, // PlayStation Vita + //kUnityGfxRendererGXM = 12, // PlayStation Vita, removed kUnityGfxRendererPS4 = 13, // PlayStation 4 kUnityGfxRendererXboxOne = 14, // Xbox One kUnityGfxRendererMetal = 16, // iOS Metal @@ -17,7 +24,11 @@ typedef enum UnityGfxRenderer kUnityGfxRendererD3D12 = 18, // Direct3D 12 kUnityGfxRendererVulkan = 21, // Vulkan kUnityGfxRendererNvn = 22, // Nintendo Switch NVN API - kUnityGfxRendererXboxOneD3D12 = 23 // MS XboxOne Direct3D 12 + kUnityGfxRendererXboxOneD3D12 = 23, // MS XboxOne Direct3D 12 + kUnityGfxRendererGameCoreXboxOne = 24, // GameCore Xbox One + kUnityGfxRendererGameCoreXboxSeries = 25, // GameCore XboxSeries + kUnityGfxRendererPS5 = 26, // PS5 + kUnityGfxRendererPS5NGGC = 27 // PS5 NGGC } UnityGfxRenderer; typedef enum UnityGfxDeviceEventType diff --git a/Plugin/Unity/IUnityGraphicsD3D11.h b/Plugin/Unity/IUnityGraphicsD3D11.h index e018003..612318c 100644 --- a/Plugin/Unity/IUnityGraphicsD3D11.h +++ b/Plugin/Unity/IUnityGraphicsD3D11.h @@ -1,3 +1,9 @@ +// Unity Native Plugin API copyright © 2015 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see[Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS†BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + #pragma once #include "IUnityInterface.h" diff --git a/Plugin/Unity/IUnityGraphicsD3D12.h b/Plugin/Unity/IUnityGraphicsD3D12.h index 692116a..19f839f 100644 --- a/Plugin/Unity/IUnityGraphicsD3D12.h +++ b/Plugin/Unity/IUnityGraphicsD3D12.h @@ -77,7 +77,7 @@ UNITY_DECLARE_INTERFACE(IUnityGraphicsD3D12v6) ID3D12CommandQueue* (UNITY_INTERFACE_API * GetCommandQueue)(); - ID3D12Resource* (UNITY_INTERFACE_API * TextureFromRenderBuffer)(UnityRenderBuffer * rb); + ID3D12Resource* (UNITY_INTERFACE_API * TextureFromRenderBuffer)(UnityRenderBuffer rb); ID3D12Resource* (UNITY_INTERFACE_API * TextureFromNativeTexture)(UnityTextureID texture); // Change the precondition for a specific user-defined event @@ -106,7 +106,7 @@ UNITY_DECLARE_INTERFACE(IUnityGraphicsD3D12v5) ID3D12CommandQueue* (UNITY_INTERFACE_API * GetCommandQueue)(); - ID3D12Resource* (UNITY_INTERFACE_API * TextureFromRenderBuffer)(UnityRenderBuffer * rb); + ID3D12Resource* (UNITY_INTERFACE_API * TextureFromRenderBuffer)(UnityRenderBuffer rb); }; UNITY_REGISTER_INTERFACE_GUID(0xF5C8D8A37D37BC42ULL, 0xB02DFE93B5064A27ULL, IUnityGraphicsD3D12v5) diff --git a/Plugin/Unity/IUnityInterface.h b/Plugin/Unity/IUnityInterface.h index 190c5a0..ab713ec 100644 --- a/Plugin/Unity/IUnityInterface.h +++ b/Plugin/Unity/IUnityInterface.h @@ -1,3 +1,9 @@ +// Unity Native Plugin API copyright © 2015 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see[Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS†BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + #pragma once // Unity native plugin API @@ -9,9 +15,9 @@ #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WINAPI_FAMILY) #define UNITY_INTERFACE_API __stdcall #define UNITY_INTERFACE_EXPORT __declspec(dllexport) -#elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) +#elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) || defined(LUMIN) #define UNITY_INTERFACE_API - #define UNITY_INTERFACE_EXPORT + #define UNITY_INTERFACE_EXPORT __attribute__ ((visibility ("default"))) #else #define UNITY_INTERFACE_API #define UNITY_INTERFACE_EXPORT diff --git a/Plugin/Unity/IUnityProfiler.h b/Plugin/Unity/IUnityProfiler.h deleted file mode 100644 index 07811b8..0000000 --- a/Plugin/Unity/IUnityProfiler.h +++ /dev/null @@ -1,272 +0,0 @@ -// Unity Native Plugin API copyright © 2015 Unity Technologies ApS -// -// Licensed under the Unity Companion License for Unity - dependent projects--see[Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). -// -// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS†BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. - -#pragma once -#include "IUnityInterface.h" - -#include - -// Unity Profiler Native plugin API provides an ability to register callbacks for Unity Profiler events. -// The basic functionality includes: -// 1. Ability to create a Unity Profiler Marker. -// 2. Begin and end sample. -// 3. Register a thread for profiling. -// 4. Obtain an information if profiler is available and enabled. -// -// Usage example: -// -// #include -// #include -// -// static IUnityProfiler* s_UnityProfiler = NULL; -// static const UnityProfilerMarkerDesc* s_MyPluginMarker = NULL; -// static bool s_IsDevelopmentBuild = false; -// -// static void MyPluginWorkMethod() -// { -// if (s_IsDevelopmentBuild) -// s_UnityProfiler->BeginSample(s_MyPluginMarker); -// -// // Code I want to see in Unity Profiler as "MyPluginMethod". -// // ... -// -// if (s_IsDevelopmentBuild) -// s_UnityProfiler->EndSample(s_MyPluginMarker); -// } -// -// extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) -// { -// s_UnityProfiler = unityInterfaces->Get(); -// if (s_UnityProfiler == NULL) -// return; -// s_IsDevelopmentBuild = s_UnityProfiler->IsAvailable() != 0; -// s_UnityProfiler->CreateMarker(&s_MyPluginMarker, "MyPluginMethod", kUnityProfilerCategoryOther, kUnityProfilerMarkerFlagDefault, 0); -// } -// -// extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload() -// { -// } - - -typedef uint32_t UnityProfilerMarkerId; - -enum UnityBuiltinProfilerCategory_ -{ - kUnityProfilerCategoryRender = 0, - kUnityProfilerCategoryScripts = 1, - kUnityProfilerCategoryManagedJobs = 2, - kUnityProfilerCategoryBurstJobs = 3, - kUnityProfilerCategoryGUI = 4, - kUnityProfilerCategoryPhysics = 5, - kUnityProfilerCategoryAnimation = 6, - kUnityProfilerCategoryAI = 7, - kUnityProfilerCategoryAudio = 8, - kUnityProfilerCategoryAudioJob = 9, - kUnityProfilerCategoryAudioUpdateJob = 10, - kUnityProfilerCategoryVideo = 11, - kUnityProfilerCategoryParticles = 12, - kUnityProfilerCategoryGi = 13, - kUnityProfilerCategoryNetwork = 14, - kUnityProfilerCategoryLoading = 15, - kUnityProfilerCategoryOther = 16, - kUnityProfilerCategoryGC = 17, - kUnityProfilerCategoryVSync = 18, - kUnityProfilerCategoryOverhead = 19, - kUnityProfilerCategoryPlayerLoop = 20, - kUnityProfilerCategoryDirector = 21, - kUnityProfilerCategoryVR = 22, - kUnityProfilerCategoryAllocation = 23, kUnityProfilerCategoryMemory = 23, - kUnityProfilerCategoryInternal = 24, - kUnityProfilerCategoryFileIO = 25, - kUnityProfilerCategoryUISystemLayout = 26, - kUnityProfilerCategoryUISystemRender = 27, - kUnityProfilerCategoryVFX = 28, - kUnityProfilerCategoryBuildInterface = 29, - kUnityProfilerCategoryInput = 30, - kUnityProfilerCategoryVirtualTexturing = 31, -}; -typedef uint16_t UnityProfilerCategoryId; - -typedef struct UnityProfilerCategoryDesc -{ - // Incremental category index. - UnityProfilerCategoryId id; - // Reserved. - uint16_t reserved0; - // Internally associated category color which is in 0xRRGGBBAA format. - uint32_t rgbaColor; - // NULL-terminated string which is associated with the category. - const char* name; -} UnityProfilerCategoryDesc; - -enum UnityProfilerMarkerFlag_ -{ - kUnityProfilerMarkerFlagDefault = 0, - - kUnityProfilerMarkerFlagScriptUser = 1 << 1, // Markers created with C# API. - kUnityProfilerMarkerFlagScriptInvoke = 1 << 5, // Runtime invocations with ScriptingInvocation::Invoke. - kUnityProfilerMarkerFlagScriptEnterLeave = 1 << 6, // Deep profiler. - - kUnityProfilerMarkerFlagAvailabilityEditor = 1 << 2, // Editor-only marker, doesn't present in dev and non-dev players. - kUnityProfilerMarkerFlagAvailabilityNonDev = 1 << 3, // Non-development marker, is present everywhere including release builds. - - kUnityProfilerMarkerFlagWarning = 1 << 4, // Indicates undesirable, performance-wise suboptimal code path. - - kCounter = 1 << 7, // Marker is also used as a counter. - - kUnityProfilerMarkerFlagVerbosityDebug = 1 << 10, // Internal debug markers - e.g. JobSystem Idle. - kUnityProfilerMarkerFlagVerbosityInternal = 1 << 11, // Internal markers - e.g. Mutex/semaphore waits. - kUnityProfilerMarkerFlagVerbosityAdvanced = 1 << 12 // Markers which are useful for advanced users - e.g. Loading. -}; -typedef uint16_t UnityProfilerMarkerFlags; - -enum UnityProfilerMarkerEventType_ -{ - kUnityProfilerMarkerEventTypeBegin = 0, - kUnityProfilerMarkerEventTypeEnd = 1, - kUnityProfilerMarkerEventTypeSingle = 2 -}; -typedef uint16_t UnityProfilerMarkerEventType; - -typedef struct UnityProfilerMarkerDesc -{ - // Per-marker callback chain pointer. Don't use. - const void* callback; - // Event id. - UnityProfilerMarkerId id; - // UnityProfilerMarkerFlag_ value. - UnityProfilerMarkerFlags flags; - // Category index the marker belongs to. - UnityProfilerCategoryId categoryId; - // NULL-terminated string which is associated with the marker. - const char* name; - // Metadata descriptions chain. Don't use. - const void* metaDataDesc; -} UnityProfilerMarkerDesc; - -enum UnityProfilerMarkerDataType_ -{ - kUnityProfilerMarkerDataTypeNone = 0, - kUnityProfilerMarkerDataTypeInstanceId = 1, - kUnityProfilerMarkerDataTypeInt32 = 2, - kUnityProfilerMarkerDataTypeUInt32 = 3, - kUnityProfilerMarkerDataTypeInt64 = 4, - kUnityProfilerMarkerDataTypeUInt64 = 5, - kUnityProfilerMarkerDataTypeFloat = 6, - kUnityProfilerMarkerDataTypeDouble = 7, - kUnityProfilerMarkerDataTypeString = 8, - kUnityProfilerMarkerDataTypeString16 = 9, - kUnityProfilerMarkerDataTypeBlob8 = 11, - kUnityProfilerMarkerDataTypeCount // Total count of data types -}; -typedef uint8_t UnityProfilerMarkerDataType; - -enum UnityProfilerMarkerDataUnit_ -{ - kUnityProfilerMarkerDataUnitUndefined = 0, - kUnityProfilerMarkerDataUnitTimeNanoseconds = 1, - kUnityProfilerMarkerDataUnitBytes = 2, - kUnityProfilerMarkerDataUnitCount = 3, - kUnityProfilerMarkerDataUnitPercent = 4, - kUnityProfilerMarkerDataUnitFrequencyHz = 5, -}; -typedef uint8_t UnityProfilerMarkerDataUnit; - -typedef struct UnityProfilerMarkerData -{ - UnityProfilerMarkerDataType type; - uint8_t reserved0; - uint16_t reserved1; - uint32_t size; - const void* ptr; -} UnityProfilerMarkerData; - -enum UnityProfilerFlowEventType_ -{ - // Starts flow chain for a current profiler marker scope (__enclosing__ scope). - // Mark the scheduler function with "begin" flow to connect it later to execution function on another thread. - kUnityProfilerFlowEventTypeBegin = 0, - // The flow continues with the next sample. - // Marks the __next__ profiler sample connected to the sample which started the flow (kUnityProfilerFlowEventTypeBegin) or previous (in time) kUnityProfilerFlowEventTypeNext flow event. - // All parallel flow instances are equivalent and connected to the same previous in time kUnityProfilerFlowEventTypeBegin or kUnityProfilerFlowEventTypeNext events and next (also in time) kUnityProfilerFlowEventTypeNext event. - kUnityProfilerFlowEventTypeParallelNext = 1, - // Ends flow started by kUnityProfilerFlowEventTypeBegin. Usually represents a sync point (SyncFence) - // Marks the __enclosing__ sample as endpoint. - kUnityProfilerFlowEventTypeEnd = 2, - // The flow continues with the next sample. - // Marks the __next__ profiler sample connected to the sample which started the flow (kUnityProfilerFlowEventTypeBegin). - kUnityProfilerFlowEventTypeNext = 3, -}; -typedef uint8_t UnityProfilerFlowEventType; - -typedef uint64_t UnityProfilerThreadId; - -// Available since 2020.1 -UNITY_DECLARE_INTERFACE(IUnityProfiler) -{ - void BeginSample(const UnityProfilerMarkerDesc* markerDesc) - { - (this->EmitEvent)(markerDesc, kUnityProfilerMarkerEventTypeBegin, 0, NULL); - } - - void BeginSample(const UnityProfilerMarkerDesc* markerDesc, uint16_t eventDataCount, const UnityProfilerMarkerData* eventData) - { - (this->EmitEvent)(markerDesc, kUnityProfilerMarkerEventTypeBegin, eventDataCount, eventData); - } - - void EndSample(const UnityProfilerMarkerDesc* markerDesc) - { - (this->EmitEvent)(markerDesc, kUnityProfilerMarkerEventTypeEnd, 0, NULL); - } - - // Create instrumentation event. - // \param markerDesc is a pointer to marker description struct. - // \param eventType is an event type - UnityProfilerMarkerEventType_. - // \param eventDataCount is an event metadata count passed in eventData. Must be less than eventDataCount specified in CreateMarker. - // \param eventData is a metadata array of eventDataCount elements. - void(UNITY_INTERFACE_API * EmitEvent)(const UnityProfilerMarkerDesc* markerDesc, UnityProfilerMarkerEventType eventType, uint16_t eventDataCount, const UnityProfilerMarkerData* eventData); - - // Returns 1 if Unity Profiler is enabled, 0 overwise. - int(UNITY_INTERFACE_API * IsEnabled)(); - - // Returns 1 if Unity Profiler is available, 0 overwise. - // Profiler is available only in Development builds. Release builds have Unity Profiler compiled out. - // However individual markers can be available even in Release builds (e.g. GC.Collect) and be collected with - // Recorder API or forwarded to platform and other profilers (via IUnityProfilerCallbacks::RegisterMarkerEventCallback API). - // You can choose whenever you want or not emit profiler event in Development and Release builds using the cached result of this method. - int(UNITY_INTERFACE_API * IsAvailable)(); - - // Creates a new Unity Profiler marker. - // \param desc Pointer to the const UnityProfilerMarkerDesc* which is set to the created marker in a case of a succesful execution. - // \param name Marker name to be displayed in Unity Profiler. - // \param flags Marker flags. One of UnityProfilerMarkerFlag_ enum. Use kUnityProfilerMarkerFlagDefault if not sure. - // \param eventDataCount Maximum count of potential metadata parameters count. - // \return 0 on success and non-zero in case of error. - int(UNITY_INTERFACE_API * CreateMarker)(const UnityProfilerMarkerDesc** desc, const char* name, UnityProfilerCategoryId category, UnityProfilerMarkerFlags flags, int eventDataCount); - - // Set a metadata description for the Unity Profiler marker. - // \param markerDesc is a pointer to marker description struct. - // \param index metadata index to set name for. - // \param metadataType Data type. Must be of UnityProfilerMarkerDataType_ enum. - // \param name Metadata name. - // \return 0 on success and non-zero in case of error. - int(UNITY_INTERFACE_API * SetMarkerMetadataName)(const UnityProfilerMarkerDesc* desc, int index, const char* metadataName, UnityProfilerMarkerDataType metadataType, UnityProfilerMarkerDataUnit metadataUnit); - - // Registers current thread with Unity Profiler. - // Has no effect in Release Players. - // \param threadId Optional Unity Profiler thread identifier which it written on successful method call. Can be used with UnregisterThread. - // \param groupName Thread group name. Unity Profiler aggregates threads with the same group. - // \param name Thread name. - // \return 0 on success and non-zero in case of error. - int(UNITY_INTERFACE_API * RegisterThread)(UnityProfilerThreadId* threadId, const char* groupName, const char* name); - - // Unregisters current thread from Unity Profiler and cleans up all associated memory. - // Has no effect in Release Players. - // \param threadId Unity Profiler thread identifier obtained with RegisterThread call. Use 0 to cleanup the current thread. - // \return 0 on success and non-zero in case of error. - int(UNITY_INTERFACE_API * UnregisterThread)(UnityProfilerThreadId threadId); -}; -UNITY_REGISTER_INTERFACE_GUID(0x2CE79ED8316A4833ULL, 0x87076B2013E1571FULL, IUnityProfiler) diff --git a/Plugin/Unity/IUnityRenderingExtensions.h b/Plugin/Unity/IUnityRenderingExtensions.h deleted file mode 100644 index 88efccb..0000000 --- a/Plugin/Unity/IUnityRenderingExtensions.h +++ /dev/null @@ -1,340 +0,0 @@ -#pragma once - - -#include "IUnityGraphics.h" - -/* - Low-level Native Plugin Rendering Extensions - ============================================ - - On top of the Low-level native plugin interface, Unity also supports low level rendering extensions that can receive callbacks when certain events happen. - This is mostly used to implement and control low-level rendering in your plugin and enable it to work with Unity’s multithreaded rendering. - - Due to the low-level nature of this extension the plugin might need to be preloaded before the devices get created. - Currently the convention is name-based namely the plugin name must be prefixed by “GfxPluginâ€. Example: GfxPluginMyFancyNativePlugin. - - - // Native plugin code example - - enum PluginCustomCommands - { - kPluginCustomCommandDownscale = kUnityRenderingExtUserEventsStart, - kPluginCustomCommandUpscale, - - // insert your own events here - - kPluginCustomCommandCount - }; - - static IUnityInterfaces* s_UnityInterfaces = NULL; - - extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API - UnityPluginLoad(IUnityInterfaces* unityInterfaces) - { - // initialization code here... - } - - extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API - UnityRenderingExtEvent(UnityRenderingExtEventType event, void* data) - { - switch (event) - { - case kUnityRenderingExtEventBeforeDrawCall: - // do some stuff - break; - case kUnityRenderingExtEventAfterDrawCall: - // undo some stuff - break; - case kPluginCustomCommandDownscale: - // downscale some stuff - break; - case kPluginCustomCommandUpscale: - // upscale some stuff - break; - } - } - -*/ - - -// These events will be propagated to all plugins that implement void UnityRenderingExtEvent(UnityRenderingExtEventType event, void* data); - -enum UnityRenderingExtEventType -{ - kUnityRenderingExtEventSetStereoTarget, // issued during SetStereoTarget and carrying the current 'eye' index as parameter - kUnityRenderingExtEventSetStereoEye, // issued during stereo rendering at the beginning of each eye's rendering loop. It carries the current 'eye' index as parameter - kUnityRenderingExtEventStereoRenderingDone, // issued after the rendering has finished - kUnityRenderingExtEventBeforeDrawCall, // issued during BeforeDrawCall and carrying UnityRenderingExtBeforeDrawCallParams as parameter - kUnityRenderingExtEventAfterDrawCall, // issued during AfterDrawCall. This event doesn't carry any parameters - kUnityRenderingExtEventCustomGrab, // issued during GrabIntoRenderTexture since we can't simply copy the resources - // when custom rendering is used - we need to let plugin handle this. It carries over - // a UnityRenderingExtCustomBlitParams params = { X, source, dest, 0, 0 } ( X means it's irrelevant ) - kUnityRenderingExtEventCustomBlit, // issued by plugin to insert custom blits. It carries over UnityRenderingExtCustomBlitParams as param. - kUnityRenderingExtEventUpdateTextureBegin, // issued to update a texture. It carries over UnityRenderingExtTextureUpdateParams - kUnityRenderingExtEventUpdateTextureEnd, // issued to signal the plugin that the texture update has finished. It carries over the same UnityRenderingExtTextureUpdateParams as kUnityRenderingExtEventUpdateTextureBegin - - // keep this last - kUnityRenderingExtEventCount, - kUnityRenderingExtUserEventsStart = kUnityRenderingExtEventCount -}; - - -enum UnityRenderingExtCustomBlitCommands -{ - kUnityRenderingExtCustomBlitVRFlush, // This event is mostly used in multi GPU configurations ( SLI, etc ) in order to allow the plugin to flush all GPU's targets - - // keep this last - kUnityRenderingExtCustomBlitCount, - kUnityRenderingExtUserCustomBlitStart = kUnityRenderingExtCustomBlitCount -}; - -/* - This will be propagated to all plugins implementing UnityRenderingExtQuery. -*/ -enum UnityRenderingExtQueryType -{ - kUnityRenderingExtQueryOverrideViewport = 1 << 0, // The plugin handles setting up the viewport rects. Unity will skip its internal SetViewport calls - kUnityRenderingExtQueryOverrideScissor = 1 << 1, // The plugin handles setting up the scissor rects. Unity will skip its internal SetScissor calls - kUnityRenderingExtQueryOverrideVROcclussionMesh = 1 << 2, // The plugin handles its own VR occlusion mesh rendering. Unity will skip rendering its internal VR occlusion mask - kUnityRenderingExtQueryOverrideVRSinglePass = 1 << 3, // The plugin uses its own single pass stereo technique. Unity will only traverse and render the render node graph once. - // and it will clear the whole render target not just per-eye on demand. - kUnityRenderingExtQueryKeepOriginalDoubleWideWidth_DEPRECATED = 1 << 4, // Instructs unity to keep the original double wide width. By default unity will try and have a power-of-two width for mip-mapping requirements. - kUnityRenderingExtQueryRequestVRFlushCallback = 1 << 5, // Instructs unity to provide callbacks when the VR eye textures need flushing. Useful for multi GPU synchronization. -}; - - -enum UnityRenderingExtTextureFormat -{ - kUnityRenderingExtFormatNone = 0, kUnityRenderingExtFormatFirst = kUnityRenderingExtFormatNone, - - // sRGB formats - kUnityRenderingExtFormatR8_SRGB, - kUnityRenderingExtFormatR8G8_SRGB, - kUnityRenderingExtFormatR8G8B8_SRGB, - kUnityRenderingExtFormatR8G8B8A8_SRGB, - - // 8 bit integer formats - kUnityRenderingExtFormatR8_UNorm, - kUnityRenderingExtFormatR8G8_UNorm, - kUnityRenderingExtFormatR8G8B8_UNorm, - kUnityRenderingExtFormatR8G8B8A8_UNorm, - kUnityRenderingExtFormatR8_SNorm, - kUnityRenderingExtFormatR8G8_SNorm, - kUnityRenderingExtFormatR8G8B8_SNorm, - kUnityRenderingExtFormatR8G8B8A8_SNorm, - kUnityRenderingExtFormatR8_UInt, - kUnityRenderingExtFormatR8G8_UInt, - kUnityRenderingExtFormatR8G8B8_UInt, - kUnityRenderingExtFormatR8G8B8A8_UInt, - kUnityRenderingExtFormatR8_SInt, - kUnityRenderingExtFormatR8G8_SInt, - kUnityRenderingExtFormatR8G8B8_SInt, - kUnityRenderingExtFormatR8G8B8A8_SInt, - - // 16 bit integer formats - kUnityRenderingExtFormatR16_UNorm, - kUnityRenderingExtFormatR16G16_UNorm, - kUnityRenderingExtFormatR16G16B16_UNorm, - kUnityRenderingExtFormatR16G16B16A16_UNorm, - kUnityRenderingExtFormatR16_SNorm, - kUnityRenderingExtFormatR16G16_SNorm, - kUnityRenderingExtFormatR16G16B16_SNorm, - kUnityRenderingExtFormatR16G16B16A16_SNorm, - kUnityRenderingExtFormatR16_UInt, - kUnityRenderingExtFormatR16G16_UInt, - kUnityRenderingExtFormatR16G16B16_UInt, - kUnityRenderingExtFormatR16G16B16A16_UInt, - kUnityRenderingExtFormatR16_SInt, - kUnityRenderingExtFormatR16G16_SInt, - kUnityRenderingExtFormatR16G16B16_SInt, - kUnityRenderingExtFormatR16G16B16A16_SInt, - - // 32 bit integer formats - kUnityRenderingExtFormatR32_UInt, - kUnityRenderingExtFormatR32G32_UInt, - kUnityRenderingExtFormatR32G32B32_UInt, - kUnityRenderingExtFormatR32G32B32A32_UInt, - kUnityRenderingExtFormatR32_SInt, - kUnityRenderingExtFormatR32G32_SInt, - kUnityRenderingExtFormatR32G32B32_SInt, - kUnityRenderingExtFormatR32G32B32A32_SInt, - - // HDR formats - kUnityRenderingExtFormatR16_SFloat, - kUnityRenderingExtFormatR16G16_SFloat, - kUnityRenderingExtFormatR16G16B16_SFloat, - kUnityRenderingExtFormatR16G16B16A16_SFloat, - kUnityRenderingExtFormatR32_SFloat, - kUnityRenderingExtFormatR32G32_SFloat, - kUnityRenderingExtFormatR32G32B32_SFloat, - kUnityRenderingExtFormatR32G32B32A32_SFloat, - - // Luminance and Alpha format - kUnityRenderingExtFormatL8_UNorm, - kUnityRenderingExtFormatA8_UNorm, - kUnityRenderingExtFormatA16_UNorm, - - // BGR formats - kUnityRenderingExtFormatB8G8R8_SRGB, - kUnityRenderingExtFormatB8G8R8A8_SRGB, - kUnityRenderingExtFormatB8G8R8_UNorm, - kUnityRenderingExtFormatB8G8R8A8_UNorm, - kUnityRenderingExtFormatB8G8R8_SNorm, - kUnityRenderingExtFormatB8G8R8A8_SNorm, - kUnityRenderingExtFormatB8G8R8_UInt, - kUnityRenderingExtFormatB8G8R8A8_UInt, - kUnityRenderingExtFormatB8G8R8_SInt, - kUnityRenderingExtFormatB8G8R8A8_SInt, - - // 16 bit packed formats - kUnityRenderingExtFormatR4G4B4A4_UNormPack16, - kUnityRenderingExtFormatB4G4R4A4_UNormPack16, - kUnityRenderingExtFormatR5G6B5_UNormPack16, - kUnityRenderingExtFormatB5G6R5_UNormPack16, - kUnityRenderingExtFormatR5G5B5A1_UNormPack16, - kUnityRenderingExtFormatB5G5R5A1_UNormPack16, - kUnityRenderingExtFormatA1R5G5B5_UNormPack16, - - // Packed formats - kUnityRenderingExtFormatE5B9G9R9_UFloatPack32, - kUnityRenderingExtFormatB10G11R11_UFloatPack32, - - kUnityRenderingExtFormatA2B10G10R10_UNormPack32, - kUnityRenderingExtFormatA2B10G10R10_UIntPack32, - kUnityRenderingExtFormatA2B10G10R10_SIntPack32, - kUnityRenderingExtFormatA2R10G10B10_UNormPack32, - kUnityRenderingExtFormatA2R10G10B10_UIntPack32, - kUnityRenderingExtFormatA2R10G10B10_SIntPack32, - kUnityRenderingExtFormatA2R10G10B10_XRSRGBPack32, - kUnityRenderingExtFormatA2R10G10B10_XRUNormPack32, - kUnityRenderingExtFormatR10G10B10_XRSRGBPack32, - kUnityRenderingExtFormatR10G10B10_XRUNormPack32, - kUnityRenderingExtFormatA10R10G10B10_XRSRGBPack32, - kUnityRenderingExtFormatA10R10G10B10_XRUNormPack32, - - // ARGB formats... TextureFormat legacy - kUnityRenderingExtFormatA8R8G8B8_SRGB, - kUnityRenderingExtFormatA8R8G8B8_UNorm, - kUnityRenderingExtFormatA32R32G32B32_SFloat, - - // Depth Stencil for formats - kUnityRenderingExtFormatD16_UNorm, - kUnityRenderingExtFormatD24_UNorm, - kUnityRenderingExtFormatD24_UNorm_S8_UInt, - kUnityRenderingExtFormatD32_SFloat, - kUnityRenderingExtFormatD32_SFloat_S8_Uint, - kUnityRenderingExtFormatS8_Uint, - - // Compression formats - kUnityRenderingExtFormatRGB_DXT1_SRGB, - kUnityRenderingExtFormatRGB_DXT1_UNorm, - kUnityRenderingExtFormatRGBA_DXT3_SRGB, - kUnityRenderingExtFormatRGBA_DXT3_UNorm, - kUnityRenderingExtFormatRGBA_DXT5_SRGB, - kUnityRenderingExtFormatRGBA_DXT5_UNorm, - kUnityRenderingExtFormatR_BC4_UNorm, - kUnityRenderingExtFormatR_BC4_SNorm, - kUnityRenderingExtFormatRG_BC5_UNorm, - kUnityRenderingExtFormatRG_BC5_SNorm, - kUnityRenderingExtFormatRGB_BC6H_UFloat, - kUnityRenderingExtFormatRGB_BC6H_SFloat, - kUnityRenderingExtFormatRGBA_BC7_SRGB, - kUnityRenderingExtFormatRGBA_BC7_UNorm, - - kUnityRenderingExtFormatRGB_PVRTC_2Bpp_SRGB, - kUnityRenderingExtFormatRGB_PVRTC_2Bpp_UNorm, - kUnityRenderingExtFormatRGB_PVRTC_4Bpp_SRGB, - kUnityRenderingExtFormatRGB_PVRTC_4Bpp_UNorm, - kUnityRenderingExtFormatRGBA_PVRTC_2Bpp_SRGB, - kUnityRenderingExtFormatRGBA_PVRTC_2Bpp_UNorm, - kUnityRenderingExtFormatRGBA_PVRTC_4Bpp_SRGB, - kUnityRenderingExtFormatRGBA_PVRTC_4Bpp_UNorm, - - kUnityRenderingExtFormatRGB_ETC_UNorm, - kUnityRenderingExtFormatRGB_ETC2_SRGB, - kUnityRenderingExtFormatRGB_ETC2_UNorm, - kUnityRenderingExtFormatRGB_A1_ETC2_SRGB, - kUnityRenderingExtFormatRGB_A1_ETC2_UNorm, - kUnityRenderingExtFormatRGBA_ETC2_SRGB, - kUnityRenderingExtFormatRGBA_ETC2_UNorm, - - kUnityRenderingExtFormatR_EAC_UNorm, - kUnityRenderingExtFormatR_EAC_SNorm, - kUnityRenderingExtFormatRG_EAC_UNorm, - kUnityRenderingExtFormatRG_EAC_SNorm, - - kUnityRenderingExtFormatRGBA_ASTC4X4_SRGB, - kUnityRenderingExtFormatRGBA_ASTC4X4_UNorm, - kUnityRenderingExtFormatRGBA_ASTC5X5_SRGB, - kUnityRenderingExtFormatRGBA_ASTC5X5_UNorm, - kUnityRenderingExtFormatRGBA_ASTC6X6_SRGB, - kUnityRenderingExtFormatRGBA_ASTC6X6_UNorm, - kUnityRenderingExtFormatRGBA_ASTC8X8_SRGB, - kUnityRenderingExtFormatRGBA_ASTC8X8_UNorm, - kUnityRenderingExtFormatRGBA_ASTC10X10_SRGB, - kUnityRenderingExtFormatRGBA_ASTC10X10_UNorm, - kUnityRenderingExtFormatRGBA_ASTC12X12_SRGB, - kUnityRenderingExtFormatRGBA_ASTC12X12_UNorm, - - // Video formats - kUnityRenderingExtFormatYUV2, - - // Automatic formats, back-end decides - kUnityRenderingExtFormatLDRAuto, - kUnityRenderingExtFormatHDRAuto, - kUnityRenderingExtFormatDepthAuto, - kUnityRenderingExtFormatShadowAuto, - kUnityRenderingExtFormatVideoAuto, kUnityRenderingExtFormatLast = kUnityRenderingExtFormatVideoAuto, // Remove? -}; - - -struct UnityRenderingExtBeforeDrawCallParams -{ - void* vertexShader; // bound vertex shader (platform dependent) - void* fragmentShader; // bound fragment shader (platform dependent) - void* geometryShader; // bound geometry shader (platform dependent) - void* hullShader; // bound hull shader (platform dependent) - void* domainShader; // bound domain shader (platform dependent) - int eyeIndex; // the index of the current stereo "eye" being currently rendered. -}; - - -struct UnityRenderingExtCustomBlitParams -{ - UnityTextureID source; // source texture - UnityRenderBuffer destination; // destination surface - unsigned int command; // command for the custom blit - could be any UnityRenderingExtCustomBlitCommands command or custom ones. - unsigned int commandParam; // custom parameters for the command - unsigned int commandFlags; // custom flags for the command -}; - -struct UnityRenderingExtTextureUpdateParams -{ - void* texData; // source data for the texture update. Must be set by the plugin - unsigned int userData; // user defined data. Set by the plugin - - unsigned int textureID; // texture ID of the texture to be updated. - UnityRenderingExtTextureFormat format; // format of the texture to be updated - unsigned int width; // width of the texture - unsigned int height; // height of the texture - unsigned int bpp; // texture bytes per pixel. -}; - - -// Certain Unity APIs (GL.IssuePluginEventAndData, CommandBuffer.IssuePluginEventAndData) can callback into native plugins. -// Provide them with an address to a function of this signature. -typedef void (UNITY_INTERFACE_API * UnityRenderingEventAndData)(int eventId, void* data); - - -#ifdef __cplusplus -extern "C" { -#endif - -// If exported by a plugin, this function will be called for all the events in UnityRenderingExtEventType -void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityRenderingExtEvent(UnityRenderingExtEventType event, void* data); -// If exported by a plugin, this function will be called to query the plugin for the queries in UnityRenderingExtQueryType -bool UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityRenderingExtQuery(UnityRenderingExtQueryType query); - -#ifdef __cplusplus -} -#endif diff --git a/Plugin/Util.h b/Plugin/Util.h new file mode 100644 index 0000000..75d294b --- /dev/null +++ b/Plugin/Util.h @@ -0,0 +1,36 @@ +#pragma once + +#include "Common.h" + +namespace KlakSpout { + +// +// Marshaling utility: std::set -> IntPtr[] +// Returns an array of strings as IntPtr[]. +// +// We prefer IntPtr[] over string[] because we don't know how the C# marshaler +// handles LPArray of LPStr... It's safe to marshal them manually. +// +// Although the marshaler will automatically free the array itself, the caller +// must free each string manually. +// +std::pair MarshalStringSet(const std::set& source) +{ + // Output array + auto array = static_cast + (CoTaskMemAlloc(sizeof(char*) * source.size())); + + // Copy the source strings into the output array. + auto i = 0u; + for (const auto& s : source) + { + auto str = static_cast(CoTaskMemAlloc(s.size() + 1)); + s.copy(str, s.size()); + str[s.size()] = 0; + array[i++] = str; + } + + return std::make_pair(array, source.size()); +} + +} // namespace KlakSpout diff --git a/Plugin/d3d11on12.h b/Plugin/d3d11on12.h new file mode 100644 index 0000000..6dc8adf --- /dev/null +++ b/Plugin/d3d11on12.h @@ -0,0 +1,171 @@ +/*** Autogenerated by WIDL 6.4 from include/d3d11on12.idl - Do not edit ***/ + +#ifdef _WIN32 +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif +#include +#include +#endif + +#ifndef COM_NO_WINDOWS_H +#include +#include +#endif + +#ifndef __d3d11on12_h__ +#define __d3d11on12_h__ + +/* Forward declarations */ + +#ifndef __ID3D11On12Device_FWD_DEFINED__ +#define __ID3D11On12Device_FWD_DEFINED__ +typedef interface ID3D11On12Device ID3D11On12Device; +#ifdef __cplusplus +interface ID3D11On12Device; +#endif /* __cplusplus */ +#endif + +/* Headers for imported files */ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct D3D11_RESOURCE_FLAGS { + UINT BindFlags; + UINT MiscFlags; + UINT CPUAccessFlags; + UINT StructureByteStride; +} D3D11_RESOURCE_FLAGS; +/***************************************************************************** + * ID3D11On12Device interface + */ +#ifndef __ID3D11On12Device_INTERFACE_DEFINED__ +#define __ID3D11On12Device_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_ID3D11On12Device, 0x85611e73, 0x70a9, 0x490e, 0x96,0x14, 0xa9,0xe3,0x02,0x77,0x79,0x04); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("85611e73-70a9-490e-9614-a9e302777904") +ID3D11On12Device : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE CreateWrappedResource( + IUnknown *d3d12_resource, + const D3D11_RESOURCE_FLAGS *flags, + D3D12_RESOURCE_STATES input_state, + D3D12_RESOURCE_STATES output_state, + REFIID iid, + void **d3d11_resource) = 0; + + virtual void STDMETHODCALLTYPE ReleaseWrappedResources( + ID3D11Resource *const *resources, + UINT count) = 0; + + virtual void STDMETHODCALLTYPE AcquireWrappedResources( + ID3D11Resource *const *resources, + UINT count) = 0; + +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(ID3D11On12Device, 0x85611e73, 0x70a9, 0x490e, 0x96,0x14, 0xa9,0xe3,0x02,0x77,0x79,0x04) +#endif +#else +typedef struct ID3D11On12DeviceVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + ID3D11On12Device *This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + ID3D11On12Device *This); + + ULONG (STDMETHODCALLTYPE *Release)( + ID3D11On12Device *This); + + /*** ID3D11On12Device methods ***/ + HRESULT (STDMETHODCALLTYPE *CreateWrappedResource)( + ID3D11On12Device *This, + IUnknown *d3d12_resource, + const D3D11_RESOURCE_FLAGS *flags, + D3D12_RESOURCE_STATES input_state, + D3D12_RESOURCE_STATES output_state, + REFIID iid, + void **d3d11_resource); + + void (STDMETHODCALLTYPE *ReleaseWrappedResources)( + ID3D11On12Device *This, + ID3D11Resource *const *resources, + UINT count); + + void (STDMETHODCALLTYPE *AcquireWrappedResources)( + ID3D11On12Device *This, + ID3D11Resource *const *resources, + UINT count); + + END_INTERFACE +} ID3D11On12DeviceVtbl; + +interface ID3D11On12Device { + CONST_VTBL ID3D11On12DeviceVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +#ifndef WIDL_C_INLINE_WRAPPERS +/*** IUnknown methods ***/ +#define ID3D11On12Device_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define ID3D11On12Device_AddRef(This) (This)->lpVtbl->AddRef(This) +#define ID3D11On12Device_Release(This) (This)->lpVtbl->Release(This) +/*** ID3D11On12Device methods ***/ +#define ID3D11On12Device_CreateWrappedResource(This,d3d12_resource,flags,input_state,output_state,iid,d3d11_resource) (This)->lpVtbl->CreateWrappedResource(This,d3d12_resource,flags,input_state,output_state,iid,d3d11_resource) +#define ID3D11On12Device_ReleaseWrappedResources(This,resources,count) (This)->lpVtbl->ReleaseWrappedResources(This,resources,count) +#define ID3D11On12Device_AcquireWrappedResources(This,resources,count) (This)->lpVtbl->AcquireWrappedResources(This,resources,count) +#else +/*** IUnknown methods ***/ +static FORCEINLINE HRESULT ID3D11On12Device_QueryInterface(ID3D11On12Device* This,REFIID riid,void **ppvObject) { + return This->lpVtbl->QueryInterface(This,riid,ppvObject); +} +static FORCEINLINE ULONG ID3D11On12Device_AddRef(ID3D11On12Device* This) { + return This->lpVtbl->AddRef(This); +} +static FORCEINLINE ULONG ID3D11On12Device_Release(ID3D11On12Device* This) { + return This->lpVtbl->Release(This); +} +/*** ID3D11On12Device methods ***/ +static FORCEINLINE HRESULT ID3D11On12Device_CreateWrappedResource(ID3D11On12Device* This,IUnknown *d3d12_resource,const D3D11_RESOURCE_FLAGS *flags,D3D12_RESOURCE_STATES input_state,D3D12_RESOURCE_STATES output_state,REFIID iid,void **d3d11_resource) { + return This->lpVtbl->CreateWrappedResource(This,d3d12_resource,flags,input_state,output_state,iid,d3d11_resource); +} +static FORCEINLINE void ID3D11On12Device_ReleaseWrappedResources(ID3D11On12Device* This,ID3D11Resource *const *resources,UINT count) { + This->lpVtbl->ReleaseWrappedResources(This,resources,count); +} +static FORCEINLINE void ID3D11On12Device_AcquireWrappedResources(ID3D11On12Device* This,ID3D11Resource *const *resources,UINT count) { + This->lpVtbl->AcquireWrappedResources(This,resources,count); +} +#endif +#endif + +#endif + + +#endif /* __ID3D11On12Device_INTERFACE_DEFINED__ */ + +HRESULT __stdcall D3D11On12CreateDevice(IUnknown *device,UINT flags,const D3D_FEATURE_LEVEL *feature_levels,UINT feature_level_count,IUnknown *const *queues,UINT queue_count,UINT node_mask,ID3D11Device **d3d11_device,ID3D11DeviceContext **d3d11_immediate_context,D3D_FEATURE_LEVEL *obtained_feature_level); + +typedef HRESULT (__stdcall *PFN_D3D11ON12_CREATE_DEVICE)(IUnknown *device,UINT flags,const D3D_FEATURE_LEVEL *feature_levels,UINT feature_level_count,IUnknown *const *queues,UINT queue_count,UINT node_mask,ID3D11Device **d3d11_device,ID3D11DeviceContext **d3d11_immediate_context,D3D_FEATURE_LEVEL *obtained_feature_level); +/* Begin additional prototypes for all interfaces */ + + +/* End additional prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __d3d11on12_h__ */ diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset index 27287fe..07ebfb0 100644 --- a/ProjectSettings/AudioManager.asset +++ b/ProjectSettings/AudioManager.asset @@ -16,4 +16,4 @@ AudioManager: m_AmbisonicDecoderPlugin: m_DisableAudio: 0 m_VirtualizeEffects: 1 - m_RequestedDSPBufferSize: 0 + m_RequestedDSPBufferSize: 1024 diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset index 6be6910..cdc1f3e 100644 --- a/ProjectSettings/DynamicsManager.asset +++ b/ProjectSettings/DynamicsManager.asset @@ -3,7 +3,7 @@ --- !u!55 &1 PhysicsManager: m_ObjectHideFlags: 0 - serializedVersion: 3 + serializedVersion: 11 m_Gravity: {x: 0, y: -9.81, z: 0} m_DefaultMaterial: {fileID: 0} m_BounceThreshold: 2 @@ -14,5 +14,21 @@ PhysicsManager: m_QueriesHitBackfaces: 0 m_QueriesHitTriggers: 1 m_EnableAdaptiveForce: 0 - m_EnablePCM: 1 + m_ClothInterCollisionDistance: 0 + m_ClothInterCollisionStiffness: 0 + m_ContactsGeneration: 1 m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_DefaultMaxAngluarSpeed: 7 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 1129522..8f98123 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -6,9 +6,6 @@ EditorBuildSettings: serializedVersion: 2 m_Scenes: - enabled: 1 - path: Assets/Quad.unity - guid: c102c4b7108b0844f89cbc73fd8a8fb6 - - enabled: 1 - path: Assets/Stress.unity - guid: 7b522f2feebfbc049b1711f4c5f20e92 + path: Assets/Benchmark.unity + guid: 58dcdb08bb9105547ba4115762d0ef21 m_configObjects: {} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset index 9ccec94..6e03238 100644 --- a/ProjectSettings/EditorSettings.asset +++ b/ProjectSettings/EditorSettings.asset @@ -3,8 +3,7 @@ --- !u!159 &1 EditorSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 - m_ExternalVersionControlSupport: Visible Meta Files + serializedVersion: 11 m_SerializationMode: 2 m_LineEndingsForNewScripts: 1 m_DefaultBehaviorMode: 0 @@ -12,24 +11,30 @@ EditorSettings: m_PrefabUIEnvironment: {fileID: 0} m_SpritePackerMode: 0 m_SpritePackerPaddingPower: 1 - m_EtcTextureCompressorBehavior: 0 - m_EtcTextureFastCompressor: 2 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 m_EtcTextureNormalCompressor: 2 - m_EtcTextureBestCompressor: 5 - m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmref + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref m_ProjectGenerationRootNamespace: - m_CollabEditorSettings: - inProgressEnabled: 1 m_EnableTextureStreamingInEditMode: 1 m_EnableTextureStreamingInPlayMode: 1 m_AsyncShaderCompilation: 1 - m_EnterPlayModeOptionsEnabled: 0 + m_CachingShaderPreprocessor: 1 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 1 m_EnterPlayModeOptions: 3 - m_ShowLightmapResolutionOverlay: 1 - m_UseLegacyProbeSampleCount: 1 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 0 m_AssetPipelineMode: 1 m_CacheServerMode: 0 m_CacheServerEndpoint: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset index 79eba95..9bc289a 100644 --- a/ProjectSettings/GraphicsSettings.asset +++ b/ProjectSettings/GraphicsSettings.asset @@ -28,6 +28,7 @@ GraphicsSettings: m_LensFlare: m_Mode: 1 m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 m_AlwaysIncludedShaders: - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} @@ -35,13 +36,9 @@ GraphicsSettings: - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0} m_PreloadedShaders: [] - m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, - type: 0} - m_CustomRenderPipeline: {fileID: 0} + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 11400000, guid: a817dc55f0eb8dc468415b739ceae0d2, type: 2} m_TransparencySortMode: 0 m_TransparencySortAxis: {x: 0, y: 0, z: 1} m_DefaultRenderingPath: 1 @@ -62,5 +59,5 @@ GraphicsSettings: m_AlbedoSwatchInfos: [] m_LightsUseLinearIntensity: 0 m_LightsUseColorTemperature: 0 + m_DefaultRenderingLayerMask: 1 m_LogWhenShaderIsCompiled: 0 - m_AllowEnlightenSupportForUpgradedProject: 1 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset index 17c8f53..b16147e 100644 --- a/ProjectSettings/InputManager.asset +++ b/ProjectSettings/InputManager.asset @@ -293,3 +293,195 @@ InputManager: type: 0 axis: 0 joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset index 6dd520f..3b0b7c3 100644 --- a/ProjectSettings/NavMeshAreas.asset +++ b/ProjectSettings/NavMeshAreas.asset @@ -85,5 +85,7 @@ NavMeshProjectSettings: manualTileSize: 0 tileSize: 256 accuratePlacement: 0 + debug: + m_Flags: 0 m_SettingNames: - Humanoid diff --git a/ProjectSettings/NetworkManager.asset b/ProjectSettings/NetworkManager.asset deleted file mode 100644 index 5dc6a83..0000000 --- a/ProjectSettings/NetworkManager.asset +++ /dev/null @@ -1,8 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!149 &1 -NetworkManager: - m_ObjectHideFlags: 0 - m_DebugLevel: 0 - m_Sendrate: 15 - m_AssetToPrefab: {} diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..be4a797 --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreviewPackages: 0 + m_EnablePackageDependencies: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_ErrorMessage: + m_Original: + m_Id: + m_Name: + m_Url: + m_Scopes: [] + m_IsDefault: 0 + m_Capabilities: 0 + m_Modified: 0 + m_Name: + m_Url: + m_Scopes: + - + m_SelectedScopeIndex: 0 diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset index 4e4b30d..47880b1 100644 --- a/ProjectSettings/Physics2DSettings.asset +++ b/ProjectSettings/Physics2DSettings.asset @@ -3,7 +3,7 @@ --- !u!19 &1 Physics2DSettings: m_ObjectHideFlags: 0 - serializedVersion: 3 + serializedVersion: 4 m_Gravity: {x: 0, y: -9.81} m_DefaultMaterial: {fileID: 0} m_VelocityIterations: 8 @@ -19,9 +19,31 @@ Physics2DSettings: m_LinearSleepTolerance: 0.01 m_AngularSleepTolerance: 2 m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 m_QueriesHitTriggers: 1 m_QueriesStartInColliders: 1 - m_ChangeStopsCallbacks: 0 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 m_AlwaysShowColliders: 0 m_ShowColliderSleep: 1 m_ShowColliderContacts: 0 diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset index 636a595..67a94da 100644 --- a/ProjectSettings/PresetManager.asset +++ b/ProjectSettings/PresetManager.asset @@ -3,4 +3,5 @@ --- !u!1386491679 &1 PresetManager: m_ObjectHideFlags: 0 - m_DefaultList: [] + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index b4a4ef7..e74c7b4 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,8 +3,8 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 20 - productGUID: 3899458a6bef4a947bf6da1f7535b68e + serializedVersion: 22 + productGUID: 72aeda38d28d16447bd9843257ba2cf4 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 AndroidEnableSustainedPerformanceMode: 0 @@ -42,13 +42,15 @@ PlayerSettings: m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} m_HolographicTrackingLossScreen: {fileID: 0} - defaultScreenWidth: 1280 - defaultScreenHeight: 720 + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 defaultScreenHeightWeb: 600 m_StereoRenderingPath: 0 - m_ActiveColorSpace: 1 + m_ActiveColorSpace: 0 m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 @@ -64,7 +66,7 @@ PlayerSettings: disableDepthAndStencilBuffers: 0 androidStartInFullscreen: 1 androidRenderOutsideSafeArea: 1 - androidUseSwappy: 0 + androidUseSwappy: 1 androidBlitType: 0 defaultIsNativeResolution: 1 macRetinaSupport: 1 @@ -83,13 +85,13 @@ PlayerSettings: resizableWindow: 0 useMacAppStoreValidation: 0 macAppStoreCategory: public.app-category.games - gpuSkinning: 0 + gpuSkinning: 1 xboxPIXTextureCapture: 0 xboxEnableAvatar: 0 xboxEnableKinect: 0 xboxEnableKinectAutoTracking: 0 xboxEnableFitness: 0 - visibleInBackground: 0 + visibleInBackground: 1 allowFullscreenSwitch: 1 fullscreenMode: 3 xboxSpeechDB: 0 @@ -111,47 +113,28 @@ PlayerSettings: switchNVNShaderPoolsGranularity: 33554432 switchNVNDefaultPoolsGranularity: 16777216 switchNVNOtherPoolsGranularity: 16777216 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 vulkanNumSwapchainBuffers: 3 vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 0 + vulkanEnableLateAcquireNextImage: 0 m_SupportedAspectRatios: 4:3: 1 5:4: 1 16:10: 1 16:9: 1 Others: 1 - bundleVersion: 1.0 + bundleVersion: 0.1 preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1 - xboxOneDisableKinectGpuReservation: 0 - xboxOneEnable7thCore: 0 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 vrSettings: - cardboard: - depthFormat: 0 - enableTransitionView: 0 - daydream: - depthFormat: 0 - useSustainedPerformanceMode: 0 - enableVideoLayer: 0 - useProtectedVideoMemory: 0 - minimumSupportedHeadTracking: 0 - maximumSupportedHeadTracking: 1 - hololens: - depthFormat: 1 - depthBufferSharingEnabled: 0 - lumin: - depthFormat: 0 - frameTiming: 2 - enableGLCache: 0 - glCacheMaxBlobSize: 524288 - glCacheMaxFileSize: 8388608 - oculus: - sharedDepthBuffer: 0 - dashSupport: 0 - lowOverheadMode: 0 - protectedContext: 0 - v2Signing: 1 enable360StereoCapture: 0 isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 @@ -162,8 +145,13 @@ PlayerSettings: resolutionScalingMode: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 - applicationIdentifier: {} - buildNumber: {} + applicationIdentifier: + Standalone: com.DefaultCompany.KlakSpout + buildNumber: + Standalone: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 19 AndroidTargetSdkVersion: 0 @@ -177,35 +165,19 @@ PlayerSettings: CreateWallpaper: 0 APKExpansionFiles: 0 keepLoadedShadersAlive: 0 - StripUnusedMeshComponents: 0 - VertexChannelCompressionMask: 214 + StripUnusedMeshComponents: 1 + VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: 10.0 + iOSTargetOSVersionString: 11.0 tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 10.0 + tvOSTargetOSVersionString: 11.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 uIStatusBarHidden: 1 uIExitOnSuspend: 0 uIStatusBarStyle: 0 - iPhoneSplashScreen: {fileID: 0} - iPhoneHighResSplashScreen: {fileID: 0} - iPhoneTallHighResSplashScreen: {fileID: 0} - iPhone47inSplashScreen: {fileID: 0} - iPhone55inPortraitSplashScreen: {fileID: 0} - iPhone55inLandscapeSplashScreen: {fileID: 0} - iPhone58inPortraitSplashScreen: {fileID: 0} - iPhone58inLandscapeSplashScreen: {fileID: 0} - iPadPortraitSplashScreen: {fileID: 0} - iPadHighResPortraitSplashScreen: {fileID: 0} - iPadLandscapeSplashScreen: {fileID: 0} - iPadHighResLandscapeSplashScreen: {fileID: 0} - iPhone65inPortraitSplashScreen: {fileID: 0} - iPhone65inLandscapeSplashScreen: {fileID: 0} - iPhone61inPortraitSplashScreen: {fileID: 0} - iPhone61inLandscapeSplashScreen: {fileID: 0} appleTVSplashScreen: {fileID: 0} appleTVSplashScreen2x: {fileID: 0} tvOSSmallIconLayers: [] @@ -233,15 +205,16 @@ PlayerSettings: iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 iOSLaunchScreeniPadCustomXibPath: - iOSUseLaunchScreenStoryboard: 0 iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] iOSBackgroundModes: 0 iOSMetalForceHardShadows: 0 metalEditorSupport: 1 metalAPIValidation: 1 - iOSRenderExtraFrameOnPause: 1 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 appleDeveloperTeamID: iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: @@ -251,16 +224,24 @@ PlayerSettings: iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 appleEnableProMotion: 0 - clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: - AndroidTargetArchitectures: 5 + shaderPrecisionModel: 0 + clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea + templatePackageId: com.unity.template.3d@5.0.4 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 1 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: '{inproject}: ' + AndroidKeystoreName: AndroidKeyaliasName: AndroidBuildApkPerCpuArchitecture: 0 - AndroidTVCompatibility: 1 + AndroidTVCompatibility: 0 AndroidIsGame: 1 AndroidEnableTango: 0 androidEnableBanner: 1 @@ -271,6 +252,9 @@ PlayerSettings: height: 180 banner: {fileID: 0} androidGamepadSupportLevel: 0 + AndroidMinifyWithR8: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 AndroidAppBundleSizeToValidate: 150 m_BuildTargetIcons: [] @@ -278,28 +262,40 @@ PlayerSettings: m_BuildTargetBatching: - m_BuildTarget: Standalone m_StaticBatching: 1 - m_DynamicBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: tvOS + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: Android + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: iPhone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: WebGL + m_StaticBatching: 0 + m_DynamicBatching: 0 m_BuildTargetGraphicsJobs: - m_BuildTarget: MacStandaloneSupport m_GraphicsJobs: 0 - m_BuildTarget: Switch - m_GraphicsJobs: 0 + m_GraphicsJobs: 1 - m_BuildTarget: MetroSupport - m_GraphicsJobs: 0 + m_GraphicsJobs: 1 - m_BuildTarget: AppleTVSupport m_GraphicsJobs: 0 - m_BuildTarget: BJMSupport - m_GraphicsJobs: 0 + m_GraphicsJobs: 1 - m_BuildTarget: LinuxStandaloneSupport - m_GraphicsJobs: 0 + m_GraphicsJobs: 1 - m_BuildTarget: PS4Player - m_GraphicsJobs: 0 + m_GraphicsJobs: 1 - m_BuildTarget: iOSSupport m_GraphicsJobs: 0 - m_BuildTarget: WindowsStandaloneSupport - m_GraphicsJobs: 0 + m_GraphicsJobs: 1 - m_BuildTarget: XboxOnePlayer - m_GraphicsJobs: 0 + m_GraphicsJobs: 1 - m_BuildTarget: LuminSupport m_GraphicsJobs: 0 - m_BuildTarget: AndroidPlayer @@ -311,23 +307,39 @@ PlayerSettings: m_GraphicsJobMode: 0 - m_BuildTarget: XboxOnePlayer m_GraphicsJobMode: 0 - m_BuildTargetGraphicsAPIs: [] - m_BuildTargetVRSettings: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 0 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AppleTVSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: WebGLSupport + m_APIs: 0b000000 + m_Automatic: 1 + - m_BuildTarget: WindowsStandaloneSupport + m_APIs: 0200000012000000 + m_Automatic: 0 + m_BuildTargetVRSettings: + - m_BuildTarget: Standalone + m_Enabled: 0 + m_Devices: + - Oculus + - OpenVR openGLRequireES31: 0 openGLRequireES31AEP: 0 openGLRequireES32: 0 m_TemplateCustomTags: {} mobileMTRendering: + Android: 1 iPhone: 1 tvOS: 1 - m_BuildTargetGroupLightmapEncodingQuality: - - m_BuildTarget: Standalone - m_EncodingQuality: 1 - - m_BuildTarget: XboxOne - m_EncodingQuality: 1 - - m_BuildTarget: PS4 - m_EncodingQuality: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetNormalMapEncoding: [] playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 @@ -337,13 +349,15 @@ PlayerSettings: cameraUsageDescription: locationUsageDescription: microphoneUsageDescription: + switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 - switchApplicationID: 0x0005000C10000001 + switchUseGOLDLinker: 0 + switchApplicationID: 0x01004b9000490000 switchNSODependencies: switchTitleNames_0: switchTitleNames_1: @@ -360,6 +374,7 @@ PlayerSettings: switchTitleNames_12: switchTitleNames_13: switchTitleNames_14: + switchTitleNames_15: switchPublisherNames_0: switchPublisherNames_1: switchPublisherNames_2: @@ -375,6 +390,7 @@ PlayerSettings: switchPublisherNames_12: switchPublisherNames_13: switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -390,6 +406,7 @@ PlayerSettings: switchIcons_12: {fileID: 0} switchIcons_13: {fileID: 0} switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} switchSmallIcons_0: {fileID: 0} switchSmallIcons_1: {fileID: 0} switchSmallIcons_2: {fileID: 0} @@ -405,11 +422,12 @@ PlayerSettings: switchSmallIcons_12: {fileID: 0} switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} switchManualHTML: switchAccessibleURLs: switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: 0x0005000C10000001 + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -421,8 +439,8 @@ PlayerSettings: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 - switchCardSpecSize: 4 - switchCardSpecClock: 25 + switchCardSpecSize: -1 + switchCardSpecClock: -1 switchRatingsMask: 0 switchRatingsInt_0: 0 switchRatingsInt_1: 0 @@ -437,7 +455,7 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: 0x0005000C10000001 + switchLocalCommunicationIds_0: switchLocalCommunicationIds_1: switchLocalCommunicationIds_2: switchLocalCommunicationIds_3: @@ -452,7 +470,7 @@ PlayerSettings: switchDataLossConfirmation: 0 switchUserAccountLockEnabled: 0 switchSystemResourceMemory: 16777216 - switchSupportedNpadStyles: 3 + switchSupportedNpadStyles: 22 switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 switchSupportedNpadCount: 8 @@ -467,10 +485,13 @@ PlayerSettings: switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 switchPlayerConnectionEnabled: 1 + switchUseNewStyleFilepaths: 0 + switchUseMicroSleepForYield: 1 + switchMicroSleepForYieldTime: 25 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: - ps4ParentalLevel: 1 + ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 @@ -480,7 +501,7 @@ PlayerSettings: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 - ps4VideoOutReprojectionRate: 120 + ps4VideoOutReprojectionRate: 60 ps4PronunciationXMLPath: ps4PronunciationSIGPath: ps4BackgroundImagePath: @@ -493,6 +514,7 @@ PlayerSettings: ps4ShareFilePath: ps4ShareOverlayImagePath: ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 ps4RemotePlayKeyMappingDir: @@ -520,7 +542,7 @@ PlayerSettings: ps4UseAudio3dBackend: 0 ps4UseLowGarlicFragmentationMode: 1 ps4SocialScreenEnabled: 0 - ps4ScriptOptimizationLevel: 3 + ps4ScriptOptimizationLevel: 0 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 ps4PatchPkgPath: @@ -535,30 +557,20 @@ PlayerSettings: ps4disableAutoHideSplash: 0 ps4videoRecordingFeaturesUsed: 0 ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4GPU800MHz: 1 ps4attribEyeToEyeDistanceSettingVR: 0 - ps4IncludedModules: - - libc.prx - - libSceAudioLatencyEstimation.prx - - libSceFace.prx - - libSceFaceTracker.prx - - libSceFios2.prx - - libSceHand.prx - - libSceHandTracker.prx - - libSceHeadTracker.prx - - libSceJobManager.prx - - libSceNpToolkit.prx - - libSceS3DConversion.prx - - libSceSmart.prx + ps4IncludedModules: [] ps4attribVROutputEnabled: 0 monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 spritePackerPolicy: - webGLMemorySize: 256 + webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 - webGLDataCaching: 0 + webGLDataCaching: 1 webGLDebugSymbols: 0 webGLEmscriptenArgs: webGLModulesDirectory: @@ -566,31 +578,38 @@ PlayerSettings: webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 webGLCompressionFormat: 1 + webGLWasmArithmeticExceptions: 0 webGLLinkerTarget: 1 webGLThreadsSupport: 0 - webGLWasmStreaming: 0 + webGLDecompressionFallback: 0 scriptingDefineSymbols: {} + additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} il2cppCompilerConfiguration: {} managedStrippingLevel: {} incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 allowUnsafeCode: 0 + useDeterministicCompilation: 1 + useReferenceAssemblies: 1 + enableRoslynAnalyzers: 1 additionalIl2CppArgs: scriptingRuntimeVersion: 1 - gcIncremental: 0 + gcIncremental: 1 + assemblyVersionValidation: 1 gcWBarrierValidation: 0 apiCompatibilityLevelPerPlatform: {} m_RenderingPath: 1 m_MobileRenderingPath: 1 - metroPackageName: KlakSpout + metroPackageName: Template_3D metroPackageVersion: metroCertificatePath: metroCertificatePassword: metroCertificateSubject: metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 - metroApplicationDescription: KlakSpout + metroApplicationDescription: Template_3D wsaImages: {} metroTileShortName: metroTileShowName: 0 @@ -602,8 +621,7 @@ PlayerSettings: metroDefaultTileSize: 1 metroTileForegroundText: 2 metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} - metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, - a: 1} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} @@ -628,7 +646,8 @@ PlayerSettings: XboxOneCapability: [] XboxOneGameRating: {} XboxOneIsContentPackage: 0 - XboxOneEnableGPUVariability: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 XboxOneSockets: {} XboxOneSplashScreen: {fileID: 0} XboxOneAllowedProductIds: [] @@ -636,11 +655,9 @@ PlayerSettings: XboxOneXTitleMemory: 8 XboxOneOverrideIdentityName: XboxOneOverrideIdentityPublisher: - vrEditorSettings: - daydream: - daydreamIconForeground: {fileID: 0} - daydreamIconBackground: {fileID: 0} - cloudServicesEnabled: {} + vrEditorSettings: {} + cloudServicesEnabled: + UNet: 1 luminIcon: m_Name: m_ModelFolderPath: @@ -653,11 +670,12 @@ PlayerSettings: m_VersionCode: 1 m_VersionName: apiCompatibilityLevel: 6 + activeInputHandler: 0 cloudProjectId: framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] projectName: organizationId: cloudEnabled: 0 - enableNativePlatformBackendsForNewInputSystem: 0 - disableOldInputManagerSupport: 0 - legacyClampBlendShapeWeights: 1 + legacyClampBlendShapeWeights: 0 + virtualTexturingSupportEnabled: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 1c8f32f..79c71bc 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2019.3.10f1 -m_EditorVersionWithRevision: 2019.3.10f1 (5968d7f82152) +m_EditorVersion: 2020.3.12f1 +m_EditorVersionWithRevision: 2020.3.12f1 (b3b2c6512326) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset index 06e8c63..324fd39 100644 --- a/ProjectSettings/QualitySettings.asset +++ b/ProjectSettings/QualitySettings.asset @@ -7,27 +7,27 @@ QualitySettings: m_CurrentQuality: 0 m_QualitySettings: - serializedVersion: 2 - name: Good - pixelLightCount: 2 - shadows: 2 - shadowResolution: 1 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 40 + shadowCascades: 1 + shadowDistance: 20 shadowNearPlaneOffset: 3 shadowCascade2Split: 0.33333334 shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 + shadowmaskMode: 0 skinWeights: 2 textureQuality: 0 anisotropicTextures: 1 - antiAliasing: 8 + antiAliasing: 0 softParticles: 0 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 vSyncCount: 1 - lodBias: 1 + lodBias: 0.7 maximumLODLevel: 0 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 @@ -35,25 +35,23 @@ QualitySettings: streamingMipmapsRenderersPerFrame: 512 streamingMipmapsMaxLevelReduction: 2 streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 256 + particleRaycastBudget: 64 asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 + asyncUploadBufferSize: 16 asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 customRenderPipeline: {fileID: 0} excludedTargetPlatforms: [] m_PerPlatformDefaultQuality: Android: 0 + Lumin: 0 Nintendo 3DS: 0 + Nintendo Switch: 0 PS4: 0 - PSM: 0 PSP2: 0 - Samsung TV: 0 + Stadia: 0 Standalone: 0 - Tizen: 0 - Web: 0 WebGL: 0 - WiiU: 0 Windows Store Apps: 0 XboxOne: 0 iPhone: 0 diff --git a/ProjectSettings/SceneTemplateSettings.json b/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000..6f3e60f --- /dev/null +++ b/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,167 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "ignore": false, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/ProjectSettings/URPProjectSettings.asset b/ProjectSettings/URPProjectSettings.asset new file mode 100644 index 0000000..3077404 --- /dev/null +++ b/ProjectSettings/URPProjectSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LastMaterialVersion: 4 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset index fa0b146..6125b30 100644 --- a/ProjectSettings/UnityConnectSettings.asset +++ b/ProjectSettings/UnityConnectSettings.asset @@ -9,6 +9,7 @@ UnityConnectSettings: m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events m_EventUrl: https://cdp.cloud.unity3d.com/v1/events m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com m_TestInitMode: 0 CrashReportingSettings: m_EventUrl: https://perf-events.cloud.unity3d.com diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset index 6e0eaca..3a95c98 100644 --- a/ProjectSettings/VFXManager.asset +++ b/ProjectSettings/VFXManager.asset @@ -6,6 +6,7 @@ VFXManager: m_IndirectShader: {fileID: 0} m_CopyBufferShader: {fileID: 0} m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} m_RenderPipeSettingsPath: m_FixedTimeStep: 0.016666668 m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/README.md b/README.md index 0782072..68fbfd1 100644 --- a/README.md +++ b/README.md @@ -9,20 +9,11 @@ applications using the [Spout] system. [Spout]: http://spout.zeal.co/ -Spout is a video sharing system for Windows that allows applications to share -frames in real time without incurring significant performance overhead. It's -supported by several applications (MadMapper, Resolume, etc.) and frameworks -(Processing, openFrameworks, etc.). It works in a similar way to [Syphon] for -Mac, and it's similarly useful for projection mapping and VJing. - -[Syphon]: http://syphon.v002.info/ - System requirements ------------------- -- Unity 2019.3 -- KlakSpout only supports Direct3D 11 (DX11) graphics API mode. Other APIs - (DX12, OpenGL, Vulkan) are not supported at the moment. +- Unity 2020.3 or later +- Direct3D 11 and 12 How to install -------------- @@ -45,7 +36,7 @@ To the `scopedRegistries` section: To the `dependencies` section: ``` -"jp.keijiro.klak.spout": "1.0.0" +"jp.keijiro.klak.spout": "2.0.0" ``` After changes, the manifest file should look like below: @@ -60,124 +51,6 @@ After changes, the manifest file should look like below: } ], "dependencies": { - "jp.keijiro.klak.spout": "1.0.0", + "jp.keijiro.klak.spout": "2.0.0", ... ``` - -Spout Sender component ----------------------- - -The **Spout Sender component** (`SpoutSender`) is used to send frames to other -Spout compatible applications. - -There are two modes in Spout Sender: - -### Camera capture mode - -![inspector](https://i.imgur.com/2QL6G8P.png) - -The Spout Sender component runs in the **camera capture mode** when attached to -a camera object. It automatically captures frames rendered by the camera and -publishes them via Spout. The dimensions of the frames are dependent on the -screen/game view size. - -Note that the camera capture mode is not compatible with [scriptable render -pipelines]. The render texture mode should be applied in case of using SRP. - -[scriptable render pipelines]: https://docs.unity3d.com/Manual/ScriptableRenderPipeline.html - -### Render texture mode - -![inspector](https://i.imgur.com/ZnqC6jr.png) - -The Spout Sender component runs in the **render texture mode** when it's -independent from any camera. In this mode, the sender publishes content of a -render texture that is specified in the **Source Texture** property. This -render texture should be updated in some way -- by attaching to a camera as a -target texture, by [custom render texture], etc. - -[render texture]: https://docs.unity3d.com/Manual/class-RenderTexture.html -[custom render texture]: https://docs.unity3d.com/Manual/CustomRenderTextures.html - -### Alpha channel support - -This controls if the sender includes alpha channel to published frames. In most -use-cases of Unity, the alpha channel in rendered frames is not used and only -contains garbage data. It's generally recommended to turn off the **Alpha -Channel Support** option to prevent causing wrong effects on a receiver side. - -Spout Receiver component ------------------------- - -![inspector](https://i.imgur.com/C3O1RDy.png) - -The **Spout Receiver component** (`SpoutReceiver`) is used to receive frames -published by other Spout compatible applications. - -### Source Name property - -The Spout Receiver tries to connect to a sender which has a name specified in -the **Source Name** property. Note that the search is done with exact match -(case-sensitive). It can be manually edited with the text field, or selected -from the drop-down labelled "Select" that shows currently available Spout -senders. - -### Target Texture property - -The Spout Receiver updates a render texture specified in the **Target Texture** -property every frame. Note that the Spout Receiver doesn't care about aspect -ratio; the dimensions of the render texture should be manually adjusted to -avoid stretching. - -### Target Renderer property - -When a renderer component (in most cases it may be a mesh renderer component) -is specified in the **Target Renderer** property, the Spout Receiver sets the -received frames to one of the texture properties of the material used in the -renderer. This is a convenient way to display received frames when they're only -used in a single renderer instance. - -### Script interface - -The received frames are also accessible via the `receivedTexture` property of -the `SpoutReceiver` class. Note that the `receivedTexture` object is -destroyed/recreated when the settings (e.g. screen size) are changed. It's -recommended to update the reference every frame. - -Spout Manager class -------------------- - -The **Spout Manager class** (`SpoutManager`) only has one function: getting the -list of sender names that are currently available in the system -(`GetSourceNames`). This is useful for implementing a sender selection UI -for run time use. - -![gif](https://i.imgur.com/C4XUzLk.gif) - -Please check the [Source Selector example] for detailed use of this function. - -[Source Selector example]: Assets/Script/SourceSelector.cs - -Frequently Asked Questions --------------------------- - -### Can't send/receive more than 10 sources - -See [issue #33] in the Spout SDK. You can download the SpoutSettings app from -the thread that allows changing the maximum number of Spout senders. - -[issue #33]: https://github.com/leadedge/Spout2/issues/33 - -### Spout vs NDI: Which one is better? - -The answer is simple: If you're going to use a single computer, use Spout. If -you need connecting multiple computers, use NDI. - -Spout is a superior solution for local interoperation. It's faster, low latency, -more memory efficient and better quality. It's recommended using Spout unless -multiple computers are involved. - -License -------- - -[MIT](LICENSE.md)