From 73d14974e1d208ad79c39936c17542020356a8ff Mon Sep 17 00:00:00 2001 From: felixngfender Date: Thu, 16 Jan 2025 22:17:06 -0500 Subject: [PATCH 01/21] fix(client): race condition when clearing buffer after sending frames --- .../New Android\342\204\242 Profile.asset" | 2 +- .../LiberationSans SDF - Fallback.asset | 45 +-- .../Runtime/ColorFrameAccess.cs | 11 +- .../Runtime/DataBuffers/AudioBuffer.cs | 29 +- .../Runtime/DataBuffers/ColorBuffer.cs | 29 +- .../Runtime/DataBuffers/DepthBuffer.cs | 30 +- .../Runtime/DataBuffers/GyroscopeBuffer.cs | 29 +- .../Runtime/DataBuffers/IDataBuffer.cs | 13 +- .../DataBuffers/MeshDetectionBuffer.cs | 78 +++-- .../DataBuffers/PlaneDetectionBuffer.cs | 51 ++-- .../DataBuffers/PointCloudDetectionBuffer.cs | 54 ++-- .../Runtime/DataBuffers/SynchronizedBuffer.cs | 267 +++++++++--------- .../Runtime/DataBuffers/TransformBuffer.cs | 21 +- .../Runtime/DataModalityUI/AudioUIConfig.cs | 8 +- .../Runtime/DataModalityUI/ColorUIConfig.cs | 8 +- .../DataModalityUIConfigDefaults.cs | 2 - .../Runtime/DataModalityUI/DepthUIConfig.cs | 8 +- .../DataModalityUI/GyroscopeUIConfig.cs | 9 +- .../DataModalityUI/MeshDetectionUIConfig.cs | 8 +- .../DataModalityUI/PlaneDetectionUIConfig.cs | 8 +- .../PointCloudDetectionUIConfig.cs | 8 +- .../DataModalityUI/TransformUIConfig.cs | 8 +- .../DeviceSample/ARFlowDeviceSample.cs | 3 +- unity/ProjectSettings/ProjectSettings.asset | 4 +- 24 files changed, 327 insertions(+), 406 deletions(-) diff --git "a/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" "b/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" index 0b24570..8c41142 100644 --- "a/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" +++ "b/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" @@ -45,7 +45,7 @@ MonoBehaviour: m_ExportAsGoogleAndroidProject: 0 m_DebugSymbolLevel: 1 m_DebugSymbolFormat: 5 - m_CurrentDeploymentTargetId: R52M80N930K + m_CurrentDeploymentTargetId: 26201FDF6004AE m_BuildType: 2 m_BuildAppBundle: 0 m_IPAddressToConnect: diff --git a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset index fc749ac..f12c5b8 100644 --- a/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset +++ b/unity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset @@ -215,27 +215,8 @@ MonoBehaviour: m_SourceFontFilePath: m_AtlasPopulationMode: 1 InternalDynamicOS: 0 - m_GlyphTable: - - m_Index: 1676 - m_Metrics: - m_Width: 57 - m_Height: 77 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 77 - m_HorizontalAdvance: 57 - m_GlyphRect: - m_X: 10 - m_Y: 10 - m_Width: 57 - m_Height: 77 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - m_CharacterTable: - - m_ElementType: 1 - m_Unicode: 7842 - m_GlyphIndex: 1676 - m_Scale: 1 + m_GlyphTable: [] + m_CharacterTable: [] m_AtlasTextures: - {fileID: 28268798066460806} m_AtlasTextureIndex: 0 @@ -246,19 +227,11 @@ MonoBehaviour: m_AtlasHeight: 512 m_AtlasPadding: 9 m_AtlasRenderMode: 4169 - m_UsedGlyphRects: - - m_X: 0 - m_Y: 0 - m_Width: 76 - m_Height: 96 + m_UsedGlyphRects: [] m_FreeGlyphRects: - m_X: 0 - m_Y: 96 - m_Width: 511 - m_Height: 415 - - m_X: 76 m_Y: 0 - m_Width: 435 + m_Width: 511 m_Height: 511 m_FontFeatureTable: m_MultipleSubstitutionRecords: [] @@ -505,9 +478,9 @@ Texture2D: Hash: 00000000000000000000000000000000 m_IsAlphaChannelOptional: 0 serializedVersion: 3 - m_Width: 512 - m_Height: 512 - m_CompleteImageSize: 262144 + m_Width: 1 + m_Height: 1 + m_CompleteImageSize: 1 m_MipsStripped: 0 m_TextureFormat: 1 m_MipCount: 1 @@ -532,8 +505,8 @@ Texture2D: m_LightmapFormat: 0 m_ColorSpace: 0 m_PlatformBlob: - image data: 262144 - _typelessdata: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c08030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f090100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f221509000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f13070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f24190700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca3988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d3220170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414c565e616c6c6c6c6c6c6c6c6c65625b514636302920170f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1925303b444c5254616b7079797979726d6255534d46413b322921170d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e29323b414a5663707d868686867f7266625f57524d443b33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d172029303d4a5663707d8993938b7f75726e69615e564d453b30251a0e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d141a23303d4a5663707d89969e9185827f7b756e685e574d42362a21160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171f262a303d4a5663707d89969897918f8c88827a6e695e52463d32271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d17212931363a3d4a5663707d88898b90959b99938f847b6e61594f44382c1f130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29333b4246484a53606d787b7c7f838f949f9e969082766b6054483b2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b454d535556535c666d6e6f7278828f9ca89f94897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d575f6163605d5c60616366717e8b98a4a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535f696e706d67686766676a737f8c99a6a79a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b7d797675737273767c85929eaba99a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d5766738089868381807f8082879297a1aaa1978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6977849192908e8d8c8d8f939aa1a69f989184796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895999b9b9a999a9c9e9d9b99948f867d70675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e878a8c8f909192929292908f8c88827c706b60554b4035291d1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4955616c717a7d808283858586858584827f7c766f6a60594f43392f24180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212d3945505a61676d7073757778797979787775726f6a625f584f473d31281d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d28333e4850555d606366686a6b6c6c6c6b6a6866625f58534e463d352b1f160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222c363e434b515357595c5d5e5f5f5f5f5d5c5955534e47433c342b23190d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101a242c313a4045474a4d4f505252535252514f4c4847433c37312a2219110700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a1f282f35393a3d404244454646464544423f3c3a37312b26201810070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080d161d24292c2d3033353738393939383735332f2e2b26201b150e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13181d20202426292a2b2c2c2c2c2a292622211f1b150f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d111314171a1c1d1f1f201f1f1e1c191515120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d0f111213131312110f0c09080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + image data: 1 + _typelessdata: 00 m_StreamData: serializedVersion: 2 offset: 0 diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs index ce2f138..92667de 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs @@ -57,7 +57,7 @@ public ARCameraManager CameraManager /// void Awake() { - m_CameraBuffer = new ColorBuffer(64, m_CameraManager, m_Clock); + m_CameraBuffer = new ColorBuffer(m_CameraManager, m_Clock); // Initialize default values (if they aren't dynamic or coming from other scripts) m_Address = new("http://192.168.1.50:8500"); @@ -119,8 +119,7 @@ private void OnStartButtonClicked() private void OnStopButtonClicked() { m_Cts.Cancel(); - m_CameraBuffer.StopCapture(); - m_CameraBuffer.ClearBuffer(); + m_CameraBuffer.Dispose(); m_GrpcClient?.Dispose(); m_GrpcClient = null; // to reconnect if needed @@ -141,10 +140,7 @@ private async void SendFramesAsync() await Awaitable.WaitForSecondsAsync(m_DelayInS, m_Cts.Token); ARFrame[] arFrames = m_CameraBuffer - .Buffer - // This works because we have an explicit conversion operator defined for RawCameraFrame - .Select(frame => (ARFrame)frame) - .ToArray(); + .TakeARFrames(); if (arFrames.Length == 0) { @@ -158,7 +154,6 @@ private async void SendFramesAsync() m_Device, m_Cts.Token ); - m_CameraBuffer.ClearBuffer(); } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs index 1d1873a..bb920b3 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.Linq; using Google.Protobuf.WellKnownTypes; @@ -33,7 +33,7 @@ public static explicit operator Grpc.V1.ARFrame(RawAudioFrame rawFrame) public class AudioBuffer : IARFrameBuffer { - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; private readonly int m_SampleRate; private readonly int m_FrameLength; @@ -45,16 +45,15 @@ public IClock Clock set => m_Clock = value; } - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; public AudioBuffer( - int initialBufferSize, IClock clock, int sampleRate = 16000, int frameLength = 512 ) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_Clock = clock; m_SampleRate = sampleRate; m_FrameLength = frameLength; @@ -76,12 +75,7 @@ public void StopCapture() private void OnFrameCaptured(float[] frame) { - m_Buffer.Add(new RawAudioFrame { DeviceTimestamp = m_Clock.UtcNow, Data = frame }); - } - - public void ClearBuffer() - { - m_Buffer.Clear(); + m_Buffer.Enqueue(new RawAudioFrame { DeviceTimestamp = m_Clock.UtcNow, Data = frame }); } public RawAudioFrame TryAcquireLatestFrame() @@ -89,16 +83,21 @@ public RawAudioFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame).ToArray(); } - public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs index f022386..4c51acb 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.Linq; using Google.Protobuf.WellKnownTypes; using UnityEngine.XR.ARFoundation; @@ -97,9 +97,9 @@ public IClock Clock set => m_Clock = value; } - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; /// /// Typically this should be called at Awake of the MonoBehaviour that contains the ARCameraManager. @@ -107,9 +107,9 @@ public IClock Clock /// /// See ToggleCameraFacingDirectionOnAction.cs for an example of how to use this class. /// - public ColorBuffer(int initialBufferSize, ARCameraManager cameraManager, IClock clock) + public ColorBuffer(ARCameraManager cameraManager, IClock clock) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_CameraManager = cameraManager; m_Clock = clock; } @@ -161,7 +161,7 @@ DateTime deviceTimestampAtCapture .ToArray(), Intrinsics = intrinsics, }; - m_Buffer.Add(newFrame); + m_Buffer.Enqueue(newFrame); InternalDebug.Log( $"Device time: {newFrame.DeviceTimestamp}\nImage timestamp: {newFrame.ImageTimestamp}\nImage format: {newFrame.Format}\nImage plane count: {image.planeCount}" @@ -169,25 +169,26 @@ DateTime deviceTimestampAtCapture } } - public void ClearBuffer() - { - m_Buffer.Clear(); - } - public RawColorFrame TryAcquireLatestFrame() { return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame).ToArray(); } public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } /// diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs index 3aefeed..e2af378 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs @@ -1,8 +1,7 @@ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.Linq; using Google.Protobuf.WellKnownTypes; -using Unity.Collections; using UnityEngine.XR.ARFoundation; namespace CakeLab.ARFlow.DataBuffers @@ -75,13 +74,13 @@ public IClock Clock set => m_Clock = value; } - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; - public DepthBuffer(int initialBufferSize, AROcclusionManager occlusionManager, IClock clock) + public DepthBuffer(AROcclusionManager occlusionManager, IClock clock) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_OcclusionManager = occlusionManager; m_Clock = clock; } @@ -123,12 +122,7 @@ private void AddToBuffer(UnityXRCpuImage image, DateTime deviceTimestampAtCaptur .Select(i => (RawARPlane)image.GetPlane(i)) .ToArray(), }; - m_Buffer.Add(newFrame); - } - - public void ClearBuffer() - { - m_Buffer.Clear(); + m_Buffer.Enqueue(newFrame); } public RawDepthFrame TryAcquireLatestFrame() @@ -136,15 +130,21 @@ public RawDepthFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame).ToArray(); } public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs index a819600..5719f92 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.Linq; using Google.Protobuf.WellKnownTypes; using UnityEngine; @@ -62,7 +62,7 @@ public static explicit operator Grpc.V1.ARFrame(RawGyroscopeFrame rawFrame) public class GyroscopeBuffer : IARFrameBuffer { - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; private float m_SamplingIntervalMs; private bool m_IsCapturing; @@ -94,11 +94,11 @@ public IClock Clock } */ - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; - public GyroscopeBuffer(int initialBufferSize, IClock clock, float samplingIntervalMs = 50) + public GyroscopeBuffer(IClock clock, float samplingIntervalMs = 50) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_Clock = clock; m_SamplingIntervalMs = samplingIntervalMs; } @@ -142,12 +142,7 @@ private void AddToBuffer(DateTime deviceTimestampAtCapture) Gravity = GravitySensor.current.gravity.ReadValue(), Acceleration = Accelerometer.current.acceleration.ReadValue(), }; - m_Buffer.Add(newFrame); - } - - public void ClearBuffer() - { - m_Buffer.Clear(); + m_Buffer.Enqueue(newFrame); } public RawGyroscopeFrame TryAcquireLatestFrame() @@ -155,15 +150,21 @@ public RawGyroscopeFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame).ToArray(); } public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs index a169657..cde7eb1 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using CakeLab.ARFlow.Grpc.V1; namespace CakeLab.ARFlow.DataBuffers @@ -11,15 +11,14 @@ public interface IDataBuffer : IDisposable { void StartCapture(); void StopCapture(); - void ClearBuffer(); - } + /// /// Interface for a data buffer that stores data of type T. Read-only, ordered access to the buffer is provided. /// public interface IDataBuffer : IDataBuffer { - IReadOnlyList Buffer { get; } + ConcurrentQueue Buffer { get; } /// /// Tries to acquire the latest frame from the buffer. If the buffer is empty, returns the default. /// @@ -33,10 +32,10 @@ public interface IDataBuffer : IDataBuffer public interface IARFrameBuffer : IDataBuffer { /// - /// Get ARFrames from the buffer. This is a helper method to manage sending ARFrames more easily. + /// Atomically take and clear all frames in the buffer. This is a helper method to manage sending ARFrames more easily. /// - /// - ARFrame[] GetARFramesFromBuffer(); + /// See https://stackoverflow.com/a/75331708 + ARFrame[] TakeARFrames(); } /// diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs index 1530438..b819e60 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -82,13 +83,13 @@ public IClock Clock set => m_Clock = value; } - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; - public MeshDetectionBuffer(int initialBufferSize, ARMeshManager meshManager, IClock clock) + public MeshDetectionBuffer(ARMeshManager meshManager, IClock clock) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_MeshManager = meshManager; m_Clock = clock; } @@ -129,32 +130,23 @@ MeshDetectionState state using var meshDataArray = Mesh.AcquireReadOnlyMeshData( meshFilters.Select(mf => mf.sharedMesh).ToArray() ); - var encodeTasks = new List>(); + var encodeTasks = new List(); for (int i = 0; i < meshFilters.Count; i++) { var encodeTask = Task.Run(async () => { - return await DracoEncoder.EncodeMesh( + var results = await DracoEncoder.EncodeMesh( meshFilters[i].sharedMesh, meshDataArray[i] ); - }); - encodeTasks.Add(encodeTask); - } - var encodeResults = await Task.WhenAll(encodeTasks); - - for (int i = 0; i < meshFilters.Count; i++) - { - var results = encodeResults[i]; - if (results == null) - { - InternalDebug.LogWarning( - $"Encoding failed for mesh filter with ID {meshFilters[i].GetInstanceID()}" - ); - continue; - } - m_Buffer.AddRange( - results.Select(result => new RawMeshDetectionFrame + if (results == null) + { + InternalDebug.LogWarning( + $"Encoding failed for mesh filter with ID {meshFilters[i].GetInstanceID()}" + ); + return; + } + m_Buffer.Enqueue(new RawMeshDetectionFrame { State = state, // TODO: How does the transform/pose for MeshFilter look like? @@ -162,13 +154,15 @@ MeshDetectionState state MeshFilterId = meshFilters[i].GetInstanceID(), DeviceTimestamp = deviceTimestampAtCapture, EncodedSubMeshes = results.Select(r => r.data.ToArray()).ToList(), - }) - ); - foreach (var result in results) - { - result.Dispose(); - } + }); + foreach (var result in results) + { + result.Dispose(); + } + }); + encodeTasks.Add(encodeTask); } + await Task.WhenAll(encodeTasks); } private void AddToBuffer( @@ -176,21 +170,17 @@ private void AddToBuffer( DateTime deviceTimestampAtCapture ) { - m_Buffer.AddRange( - meshFilters?.Select(meshFilter => new RawMeshDetectionFrame + foreach (var meshFilter in meshFilters) + { + m_Buffer.Enqueue(new RawMeshDetectionFrame { State = MeshDetectionState.Removed, // TODO: How does the transform/pose for MeshFilter look like? // Pose = meshFilter.Value.pose, MeshFilterId = meshFilter.GetInstanceID(), DeviceTimestamp = deviceTimestampAtCapture, - }) - ); - } - - public void ClearBuffer() - { - m_Buffer.Clear(); + }); + } } public RawMeshDetectionFrame TryAcquireLatestFrame() @@ -198,15 +188,21 @@ public RawMeshDetectionFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame).ToArray(); } public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs index ede4440..27a41c8 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using Google.Protobuf.WellKnownTypes; @@ -165,17 +166,16 @@ public IClock Clock set => m_Clock = value; } - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; public PlaneDetectionBuffer( - int initialBufferSize, ARPlaneManager planeManager, IClock clock ) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_PlaneManager = planeManager; m_Clock = clock; } @@ -204,8 +204,13 @@ private void AddToBuffer( PlaneDetectionState state ) { - m_Buffer.AddRange( - planes?.Select(plane => new RawPlaneDetectionFrame + if (planes == null) + { + return; + } + foreach (var plane in planes) + { + m_Buffer.Enqueue(new RawPlaneDetectionFrame { State = state, Pose = plane.pose, @@ -216,8 +221,8 @@ PlaneDetectionState state Center = plane.center, Normal = plane.normal, Size = plane.size, - }) - ); + }); + } } private void AddToBuffer( @@ -225,8 +230,13 @@ private void AddToBuffer( DateTime deviceTimestampAtCapture ) { - m_Buffer.AddRange( - planes?.Select(plane => new RawPlaneDetectionFrame + if (planes == null) + { + return; + } + foreach (var plane in planes) + { + m_Buffer.Enqueue(new RawPlaneDetectionFrame { State = PlaneDetectionState.Removed, Pose = plane.Value.pose, @@ -234,13 +244,8 @@ DateTime deviceTimestampAtCapture TrackingState = plane.Value.trackingState, DeviceTimestamp = deviceTimestampAtCapture, SubsumedById = plane.Value.subsumedBy.trackableId, - }) - ); - } - - public void ClearBuffer() - { - m_Buffer.Clear(); + }); + } } public RawPlaneDetectionFrame TryAcquireLatestFrame() @@ -248,15 +253,21 @@ public RawPlaneDetectionFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame).ToArray(); } public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs index ebf086a..db485f5 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using Google.Protobuf.WellKnownTypes; @@ -136,17 +137,16 @@ public IClock Clock set => m_Clock = value; } - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; public PointCloudDetectionBuffer( - int initialBufferSize, ARPointCloudManager pointCloudManager, IClock clock ) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_PointCloudManager = pointCloudManager; m_Clock = clock; } @@ -177,20 +177,24 @@ private void AddToBuffer( PointCloudDetectionState state ) { - m_Buffer.AddRange( - pointClouds?.Select(pointCloud => new RawPointCloudDetectionFrame + if (pointClouds == null) + { + return; + } + foreach (var pointCloud in pointClouds) + { + m_Buffer.Enqueue(new RawPointCloudDetectionFrame { State = state, Pose = pointCloud.pose, TrackableId = pointCloud.trackableId, TrackingState = pointCloud.trackingState, DeviceTimestamp = deviceTimestampAtCapture, - ConfidenceValues = - pointCloud.confidenceValues?.ToArray() ?? Array.Empty(), + ConfidenceValues = pointCloud.confidenceValues?.ToArray() ?? Array.Empty(), Identifiers = pointCloud.identifiers?.ToArray() ?? Array.Empty(), Positions = pointCloud.positions?.ToArray() ?? Array.Empty(), - }) - ); + }); + } } private void AddToBuffer( @@ -198,8 +202,13 @@ private void AddToBuffer( DateTime deviceTimestampAtCapture ) { - m_Buffer.AddRange( - pointClouds?.Select(pointCloud => new RawPointCloudDetectionFrame + if (pointClouds == null) + { + return; + } + foreach (var pointCloud in pointClouds) + { + m_Buffer.Enqueue(new RawPointCloudDetectionFrame { State = PointCloudDetectionState.Removed, Pose = pointCloud.Value.pose, @@ -209,13 +218,8 @@ DateTime deviceTimestampAtCapture ConfidenceValues = Array.Empty(), Identifiers = Array.Empty(), Positions = Array.Empty(), - }) - ); - } - - public void ClearBuffer() - { - m_Buffer.Clear(); + }); + } } public RawPointCloudDetectionFrame TryAcquireLatestFrame() @@ -223,15 +227,21 @@ public RawPointCloudDetectionFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame).ToArray(); } public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/SynchronizedBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/SynchronizedBuffer.cs index a037812..60cab31 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/SynchronizedBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/SynchronizedBuffer.cs @@ -1,148 +1,143 @@ -using System; -using System.Collections.Generic; -using Google.Protobuf.WellKnownTypes; +// using System; +// using System.Collections.Generic; +// using Google.Protobuf.WellKnownTypes; -namespace CakeLab.ARFlow.DataBuffers -{ - using Clock; +// namespace CakeLab.ARFlow.DataBuffers +// { +// using Clock; - public struct RawSynchronizedBufferFrame - { - public DateTime DeviceTimestamp; - public RawTransformFrame TransformFrame; - public RawColorFrame ColorFrame; - public RawDepthFrame DepthFrame; - public RawGyroscopeFrame GyroscopeFrame; - public RawAudioFrame AudioFrame; - public RawPlaneDetectionFrame PlaneDetectionFrame; - public RawPointCloudDetectionFrame PointCloudDetectionFrame; - public RawMeshDetectionFrame MeshDetectionFrame; +// public struct RawSynchronizedBufferFrame +// { +// public DateTime DeviceTimestamp; +// public RawTransformFrame TransformFrame; +// public RawColorFrame ColorFrame; +// public RawDepthFrame DepthFrame; +// public RawGyroscopeFrame GyroscopeFrame; +// public RawAudioFrame AudioFrame; +// public RawPlaneDetectionFrame PlaneDetectionFrame; +// public RawPointCloudDetectionFrame PointCloudDetectionFrame; +// public RawMeshDetectionFrame MeshDetectionFrame; - public static explicit operator Grpc.V1.SynchronizedARFrame( - RawSynchronizedBufferFrame rawFrame - ) - { - var synchronizedFrameGrpc = new Grpc.V1.SynchronizedARFrame - { - DeviceTimestamp = Timestamp.FromDateTime(rawFrame.DeviceTimestamp), - TransformFrame = (Grpc.V1.TransformFrame)rawFrame.TransformFrame, - ColorFrame = (Grpc.V1.ColorFrame)rawFrame.ColorFrame, - DepthFrame = (Grpc.V1.DepthFrame)rawFrame.DepthFrame, - GyroscopeFrame = (Grpc.V1.GyroscopeFrame)rawFrame.GyroscopeFrame, - AudioFrame = (Grpc.V1.AudioFrame)rawFrame.AudioFrame, - PlaneDetectionFrame = (Grpc.V1.PlaneDetectionFrame)rawFrame.PlaneDetectionFrame, - PointCloudDetectionFrame = (Grpc.V1.PointCloudDetectionFrame) - rawFrame.PointCloudDetectionFrame, - MeshDetectionFrame = (Grpc.V1.MeshDetectionFrame)rawFrame.MeshDetectionFrame, - }; - return synchronizedFrameGrpc; - } - } +// public static explicit operator Grpc.V1.SynchronizedARFrame( +// RawSynchronizedBufferFrame rawFrame +// ) +// { +// var synchronizedFrameGrpc = new Grpc.V1.SynchronizedARFrame +// { +// DeviceTimestamp = Timestamp.FromDateTime(rawFrame.DeviceTimestamp), +// TransformFrame = (Grpc.V1.TransformFrame)rawFrame.TransformFrame, +// ColorFrame = (Grpc.V1.ColorFrame)rawFrame.ColorFrame, +// DepthFrame = (Grpc.V1.DepthFrame)rawFrame.DepthFrame, +// GyroscopeFrame = (Grpc.V1.GyroscopeFrame)rawFrame.GyroscopeFrame, +// AudioFrame = (Grpc.V1.AudioFrame)rawFrame.AudioFrame, +// PlaneDetectionFrame = (Grpc.V1.PlaneDetectionFrame)rawFrame.PlaneDetectionFrame, +// PointCloudDetectionFrame = (Grpc.V1.PointCloudDetectionFrame) +// rawFrame.PointCloudDetectionFrame, +// MeshDetectionFrame = (Grpc.V1.MeshDetectionFrame)rawFrame.MeshDetectionFrame, +// }; +// return synchronizedFrameGrpc; +// } +// } - public class SynchronizedBuffer : IDataBuffer - { - private readonly TransformBuffer m_TransformBuffer; - private readonly ColorBuffer m_ColorBuffer; - private readonly DepthBuffer m_DepthBuffer; - private readonly GyroscopeBuffer m_GyroscopeBuffer; - private readonly AudioBuffer m_AudioBuffer; - private readonly PlaneDetectionBuffer m_PlaneDetectionBuffer; - private readonly PointCloudDetectionBuffer m_PointCloudDetectionBuffer; - private readonly MeshDetectionBuffer m_MeshDetectionBuffer; - IClock m_Clock; +// public class SynchronizedBuffer : IDataBuffer +// { +// private readonly TransformBuffer m_TransformBuffer; +// private readonly ColorBuffer m_ColorBuffer; +// private readonly DepthBuffer m_DepthBuffer; +// private readonly GyroscopeBuffer m_GyroscopeBuffer; +// private readonly AudioBuffer m_AudioBuffer; +// private readonly PlaneDetectionBuffer m_PlaneDetectionBuffer; +// private readonly PointCloudDetectionBuffer m_PointCloudDetectionBuffer; +// private readonly MeshDetectionBuffer m_MeshDetectionBuffer; +// IClock m_Clock; - public IClock Clock - { - get => m_Clock; - set => m_Clock = value; - } +// public IClock Clock +// { +// get => m_Clock; +// set => m_Clock = value; +// } - private readonly List m_Buffer; +// private readonly List m_Buffer; - public IReadOnlyList Buffer => m_Buffer; +// public IReadOnlyList Buffer => m_Buffer; - public SynchronizedBuffer( - int initialBufferSize, - TransformBuffer transformBuffer, - ColorBuffer colorBuffer, - DepthBuffer depthBuffer, - GyroscopeBuffer gyroscopeBuffer, - AudioBuffer audioBuffer, - PlaneDetectionBuffer planeDetectionBuffer, - PointCloudDetectionBuffer pointCloudDetectionBuffer, - MeshDetectionBuffer meshDetectionBuffer, - IClock clock - ) - { - m_Buffer = new List(initialBufferSize); - m_TransformBuffer = transformBuffer; - m_ColorBuffer = colorBuffer; - m_DepthBuffer = depthBuffer; - m_GyroscopeBuffer = gyroscopeBuffer; - m_AudioBuffer = audioBuffer; - m_PlaneDetectionBuffer = planeDetectionBuffer; - m_PointCloudDetectionBuffer = pointCloudDetectionBuffer; - m_MeshDetectionBuffer = meshDetectionBuffer; - m_Clock = clock; - } +// public SynchronizedBuffer( +// int initialBufferSize, +// TransformBuffer transformBuffer, +// ColorBuffer colorBuffer, +// DepthBuffer depthBuffer, +// GyroscopeBuffer gyroscopeBuffer, +// AudioBuffer audioBuffer, +// PlaneDetectionBuffer planeDetectionBuffer, +// PointCloudDetectionBuffer pointCloudDetectionBuffer, +// MeshDetectionBuffer meshDetectionBuffer, +// IClock clock +// ) +// { +// m_Buffer = new List(initialBufferSize); +// m_TransformBuffer = transformBuffer; +// m_ColorBuffer = colorBuffer; +// m_DepthBuffer = depthBuffer; +// m_GyroscopeBuffer = gyroscopeBuffer; +// m_AudioBuffer = audioBuffer; +// m_PlaneDetectionBuffer = planeDetectionBuffer; +// m_PointCloudDetectionBuffer = pointCloudDetectionBuffer; +// m_MeshDetectionBuffer = meshDetectionBuffer; +// m_Clock = clock; +// } - public void StartCapture() - { - m_TransformBuffer.StartCapture(); - m_ColorBuffer.StartCapture(); - m_DepthBuffer.StartCapture(); - m_GyroscopeBuffer.StartCapture(); - m_AudioBuffer.StartCapture(); - m_PlaneDetectionBuffer.StartCapture(); - m_PointCloudDetectionBuffer.StartCapture(); - m_MeshDetectionBuffer.StartCapture(); - } +// public void StartCapture() +// { +// m_TransformBuffer.StartCapture(); +// m_ColorBuffer.StartCapture(); +// m_DepthBuffer.StartCapture(); +// m_GyroscopeBuffer.StartCapture(); +// m_AudioBuffer.StartCapture(); +// m_PlaneDetectionBuffer.StartCapture(); +// m_PointCloudDetectionBuffer.StartCapture(); +// m_MeshDetectionBuffer.StartCapture(); +// } - public void StopCapture() - { - m_TransformBuffer.StopCapture(); - m_ColorBuffer.StopCapture(); - m_DepthBuffer.StopCapture(); - m_GyroscopeBuffer.StopCapture(); - m_AudioBuffer.StopCapture(); - m_PlaneDetectionBuffer.StopCapture(); - m_PointCloudDetectionBuffer.StopCapture(); - m_MeshDetectionBuffer.StopCapture(); - } +// public void StopCapture() +// { +// m_TransformBuffer.StopCapture(); +// m_ColorBuffer.StopCapture(); +// m_DepthBuffer.StopCapture(); +// m_GyroscopeBuffer.StopCapture(); +// m_AudioBuffer.StopCapture(); +// m_PlaneDetectionBuffer.StopCapture(); +// m_PointCloudDetectionBuffer.StopCapture(); +// m_MeshDetectionBuffer.StopCapture(); +// } - public void ClearBuffer() - { - m_Buffer.Clear(); - } +// public RawSynchronizedBufferFrame TryAcquireLatestFrame() +// { +// var transformFrame = m_TransformBuffer.TryAcquireLatestFrame(); +// var colorFrame = m_ColorBuffer.TryAcquireLatestFrame(); +// var depthFrame = m_DepthBuffer.TryAcquireLatestFrame(); +// var gyroscopeFrame = m_GyroscopeBuffer.TryAcquireLatestFrame(); +// var audioFrame = m_AudioBuffer.TryAcquireLatestFrame(); +// var planeDetectionFrame = m_PlaneDetectionBuffer.TryAcquireLatestFrame(); +// var pointCloudDetectionFrame = m_PointCloudDetectionBuffer.TryAcquireLatestFrame(); +// var meshDetectionFrame = m_MeshDetectionBuffer.TryAcquireLatestFrame(); +// return new RawSynchronizedBufferFrame +// { +// DeviceTimestamp = m_Clock.UtcNow, +// TransformFrame = transformFrame, +// ColorFrame = colorFrame, +// DepthFrame = depthFrame, +// GyroscopeFrame = gyroscopeFrame, +// AudioFrame = audioFrame, +// PlaneDetectionFrame = planeDetectionFrame, +// PointCloudDetectionFrame = pointCloudDetectionFrame, +// MeshDetectionFrame = meshDetectionFrame, +// }; +// } - public RawSynchronizedBufferFrame TryAcquireLatestFrame() - { - var transformFrame = m_TransformBuffer.TryAcquireLatestFrame(); - var colorFrame = m_ColorBuffer.TryAcquireLatestFrame(); - var depthFrame = m_DepthBuffer.TryAcquireLatestFrame(); - var gyroscopeFrame = m_GyroscopeBuffer.TryAcquireLatestFrame(); - var audioFrame = m_AudioBuffer.TryAcquireLatestFrame(); - var planeDetectionFrame = m_PlaneDetectionBuffer.TryAcquireLatestFrame(); - var pointCloudDetectionFrame = m_PointCloudDetectionBuffer.TryAcquireLatestFrame(); - var meshDetectionFrame = m_MeshDetectionBuffer.TryAcquireLatestFrame(); - return new RawSynchronizedBufferFrame - { - DeviceTimestamp = m_Clock.UtcNow, - TransformFrame = transformFrame, - ColorFrame = colorFrame, - DepthFrame = depthFrame, - GyroscopeFrame = gyroscopeFrame, - AudioFrame = audioFrame, - PlaneDetectionFrame = planeDetectionFrame, - PointCloudDetectionFrame = pointCloudDetectionFrame, - MeshDetectionFrame = meshDetectionFrame, - }; - } - - public void Dispose() - { - StopCapture(); - ClearBuffer(); - } - } -} +// public void Dispose() +// { +// StopCapture(); +// m_Buffer.Clear(); +// } +// } +// } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs index 2760b68..160853b 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs @@ -1,7 +1,6 @@ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.Linq; -using System.Timers; using Google.Protobuf.WellKnownTypes; using UnityEngine; @@ -54,18 +53,17 @@ public IClock Clock private const int m_TransformDataSize = 3 * 4 * sizeof(float); private float m_SamplingIntervalMs; private bool m_IsCapturing; - private readonly List m_Buffer; + private ConcurrentQueue m_Buffer; - public IReadOnlyList Buffer => m_Buffer; + public ConcurrentQueue Buffer => m_Buffer; public TransformBuffer( - int initialBufferSize, Camera mainCamera, IClock clock, float samplingIntervalMs = 50 ) { - m_Buffer = new List(initialBufferSize); + m_Buffer = new ConcurrentQueue(); m_MainCamera = mainCamera; m_Clock = clock; m_SamplingIntervalMs = samplingIntervalMs; @@ -130,12 +128,7 @@ private void AddToBuffer(DateTime deviceTimestampAtCapture) DeviceTimestamp = deviceTimestampAtCapture, Data = cameraTransformBytes, }; - m_Buffer.Add(newFrame); - } - - public void ClearBuffer() - { - m_Buffer.Clear(); + m_Buffer.Enqueue(newFrame); } public RawTransformFrame TryAcquireLatestFrame() @@ -143,7 +136,7 @@ public RawTransformFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] GetARFramesFromBuffer() + public ARFrame[] TakeARFrames() { return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); } @@ -151,7 +144,7 @@ public ARFrame[] GetARFramesFromBuffer() public void Dispose() { StopCapture(); - ClearBuffer(); + m_Buffer.Clear(); } } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs index 45595b9..1ae3aff 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs @@ -24,7 +24,6 @@ public class AudioUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Audio"; - private TMP_InputField bufferSizeField; private const string SAMPLE_RATE_NAME = "Sample Rate"; private TMP_InputField sampleRateField; @@ -62,11 +61,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Sample Rate InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, SAMPLE_RATE_NAME, DEFAULT_SAMPLE_RATE, out var sampleRateObject, out sampleRateField); sampleRateField.contentType = TMP_InputField.ContentType.IntegerNumber; @@ -135,7 +129,7 @@ public override float GetDelay() } public AudioBuffer GetBufferFromConfig() { - return new AudioBuffer(int.Parse(bufferSizeField.text), m_Clock, int.Parse(sampleRateField.text), int.Parse(frameLengthField.text)); + return new AudioBuffer(m_Clock, int.Parse(sampleRateField.text), int.Parse(frameLengthField.text)); } public override IARFrameBuffer GetGenericBuffer() { diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs index 1ab648e..67cb86b 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs @@ -25,7 +25,6 @@ public class ColorUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Camera Color"; - private TMP_InputField bufferSizeField; private TMP_InputField delayField; private ARCameraManager m_Manager; @@ -55,11 +54,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Delay InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); delayField.contentType = TMP_InputField.ContentType.DecimalNumber; @@ -102,7 +96,7 @@ public override float GetDelay() public ColorBuffer GetBufferFromConfig() { //TODO: validate - return new ColorBuffer(int.Parse(bufferSizeField.text), m_Manager, m_Clock); + return new ColorBuffer(m_Manager, m_Clock); } public override IARFrameBuffer GetGenericBuffer() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs index 633fde4..3cdce50 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs @@ -3,8 +3,6 @@ namespace CakeLab.ARFlow.DataModalityUIConfig public static class DefaultValues { public const string ENABLE_NAME = "Enable"; - public const string BUFFER_SIZE_NAME = "Buffer Size"; - public const string DEFAULT_BUFFER_SIZE = "60"; public const string DELAY_NAME = "Delay (s)"; public const string DELAY_DEFAULT = "0.5"; diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs index f49d395..61eae3a 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs @@ -25,7 +25,6 @@ public class DepthUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Camera Depth"; - private TMP_InputField bufferSizeField; private TMP_InputField delayField; private AROcclusionManager m_Manager; @@ -55,11 +54,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Delay InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); delayField.contentType = TMP_InputField.ContentType.DecimalNumber; @@ -104,7 +98,7 @@ public override float GetDelay() } public DepthBuffer GetBufferFromConfig() { - return new DepthBuffer(int.Parse(bufferSizeField.text), m_Manager, m_Clock); + return new DepthBuffer(m_Manager, m_Clock); } public override IARFrameBuffer GetGenericBuffer() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs index a5f91e9..3b9a9b8 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs @@ -26,8 +26,6 @@ public class GyroscopeUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Gyroscope"; - private TMP_InputField bufferSizeField; - private const string SAMPLING_INTERVAL_NAME = "Sampling Interval (ms)"; private TMP_InputField samplingIntervalField; private const string DEFAULT_SAMPLING_INTERVAL = "50"; @@ -59,11 +57,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Sampling Interval InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, SAMPLING_INTERVAL_NAME, DEFAULT_SAMPLING_INTERVAL, out var samplingIntervalObj, out samplingIntervalField); samplingIntervalField.contentType = TMP_InputField.ContentType.IntegerNumber; @@ -110,7 +103,7 @@ public override float GetDelay() public GyroscopeBuffer GetBufferFromConfig() { InternalDebug.Log("Gyroscope buffer created"); - return new GyroscopeBuffer(int.Parse(bufferSizeField.text), m_Clock, int.Parse(samplingIntervalField.text)); + return new GyroscopeBuffer(m_Clock, int.Parse(samplingIntervalField.text)); } public override IARFrameBuffer GetGenericBuffer() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs index 00b800c..bf635e4 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs @@ -26,7 +26,6 @@ public class MeshDetectionUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Mesh Detection"; - private TMP_InputField bufferSizeField; private TMP_InputField delayField; @@ -57,11 +56,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Delay InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); delayField.contentType = TMP_InputField.ContentType.DecimalNumber; @@ -106,7 +100,7 @@ public override float GetDelay() } public MeshDetectionBuffer GetBufferFromConfig() { - return new MeshDetectionBuffer(int.Parse(bufferSizeField.text), m_Manager, m_Clock); + return new MeshDetectionBuffer(m_Manager, m_Clock); } public override IARFrameBuffer GetGenericBuffer() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs index 402a8fb..300692d 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs @@ -26,7 +26,6 @@ public class PlaneDetectionUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Plane Detection"; - private TMP_InputField bufferSizeField; private TMP_InputField delayField; @@ -56,11 +55,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Delay InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); delayField.contentType = TMP_InputField.ContentType.DecimalNumber; @@ -104,7 +98,7 @@ public override float GetDelay() } public PlaneDetectionBuffer GetBufferFromConfig() { - return new PlaneDetectionBuffer(int.Parse(bufferSizeField.text), m_Manager, m_Clock); + return new PlaneDetectionBuffer(m_Manager, m_Clock); } public override IARFrameBuffer GetGenericBuffer() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs index e3b835b..382c669 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs @@ -25,7 +25,6 @@ public class PointCloudDetectionUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Point Cloud Detection"; - private TMP_InputField bufferSizeField; private TMP_InputField delayField; private ARPointCloudManager m_Manager; @@ -55,11 +54,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Delay InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); delayField.contentType = TMP_InputField.ContentType.DecimalNumber; @@ -104,7 +98,7 @@ public override float GetDelay() public PointCloudDetectionBuffer GetBufferFromConfig() { //TODO: validate - return new PointCloudDetectionBuffer(int.Parse(bufferSizeField.text), m_Manager, m_Clock); + return new PointCloudDetectionBuffer(m_Manager, m_Clock); } public override IARFrameBuffer GetGenericBuffer() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs index 28e799a..5ec9314 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs @@ -27,7 +27,6 @@ public class TransformUIConfig : BaseDataModalityUIConfig private List m_UIConfigElements = new(); // Configs private const string MODALITY_NAME = "Transform"; - private TMP_InputField bufferSizeField; private const string SAMPLING_INTERVAL_NAME = "Sampling Interval (ms)"; private TMP_InputField samplingIntervalField; @@ -64,11 +63,6 @@ public override void InitializeConfig(GameObject parent, DataModalityUIConfigPre //Buffer toggle (on or off) InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - //Buffer Size - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, BUFFER_SIZE_NAME, DEFAULT_BUFFER_SIZE, out var bufferSizeObject, out bufferSizeField); - bufferSizeField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(bufferSizeObject); - //Sampling Interval InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, SAMPLING_INTERVAL_NAME, DEFAULT_SAMPLING_INTERVAL, out var samplingIntervalObj, out samplingIntervalField); samplingIntervalField.contentType = TMP_InputField.ContentType.IntegerNumber; @@ -113,7 +107,7 @@ public override float GetDelay() } public TransformBuffer GetBufferFromConfig() { - return new TransformBuffer(int.Parse(bufferSizeField.text), m_camera, m_Clock, int.Parse(samplingIntervalField.text)); + return new TransformBuffer(m_camera, m_Clock, int.Parse(samplingIntervalField.text)); } public override IARFrameBuffer GetGenericBuffer() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs index 0b48799..7aa452e 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs @@ -123,7 +123,7 @@ public async void SendFrame(BufferControl control) // For more details, see https://blog.stephencleary.com/2022/02/cancellation-1-overview.html await Awaitable.WaitForSecondsAsync(currentDelay, control.cts.Token); - ARFrame[] arFrames = control.buffer.GetARFramesFromBuffer(); + ARFrame[] arFrames = control.buffer.TakeARFrames(); if (arFrames.Length == 0) { @@ -138,7 +138,6 @@ public async void SendFrame(BufferControl control) m_Device, control.cts.Token ); - control.buffer.ClearBuffer(); } } catch (OperationCanceledException e) diff --git a/unity/ProjectSettings/ProjectSettings.asset b/unity/ProjectSettings/ProjectSettings.asset index a42201f..768c37a 100644 --- a/unity/ProjectSettings/ProjectSettings.asset +++ b/unity/ProjectSettings/ProjectSettings.asset @@ -142,11 +142,11 @@ PlayerSettings: tvOSBundleVersion: 1.0 bundleVersion: 0.0.3 preloadedAssets: + - {fileID: 4800000, guid: c9f956787b1d945e7b36e0516201fc76, type: 3} + - {fileID: 4800000, guid: 0945859e5a1034c2cb6dce53cb4fb899, type: 3} - {fileID: 11400000, guid: c199e683398494f32b4cde18e73ab731, type: 2} - {fileID: 7409956309476867576, guid: 3fd4fc0127790db4bae83f7b77da8d45, type: 2} - {fileID: 4754762928077386648, guid: b07c4ba7650be4c25b3d0c497e7e2bb8, type: 2} - - {fileID: 4800000, guid: c9f956787b1d945e7b36e0516201fc76, type: 3} - - {fileID: 4800000, guid: 0945859e5a1034c2cb6dce53cb4fb899, type: 3} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1 From 8c931c2e48407c42fe1de6846f23cf14ffcc650b Mon Sep 17 00:00:00 2001 From: felixngfender Date: Thu, 16 Jan 2025 22:22:25 -0500 Subject: [PATCH 02/21] feat(server): widen typings in public API for easier usage --- python/arflow/__init__.py | 20 +++ python/arflow/_core.py | 236 +++++++++++++------------------ python/arflow/_session_stream.py | 47 +++--- python/arflow/_utils.py | 5 +- 4 files changed, 149 insertions(+), 159 deletions(-) diff --git a/python/arflow/__init__.py b/python/arflow/__init__.py index 2092d6a..315f6ec 100644 --- a/python/arflow/__init__.py +++ b/python/arflow/__init__.py @@ -7,7 +7,20 @@ SessionStream as SessionStream, ) from cakelab.arflow_grpc.v1.ar_frame_pb2 import ARFrame as ARFrame +from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame as AudioFrame +from cakelab.arflow_grpc.v1.color_frame_pb2 import ColorFrame as ColorFrame +from cakelab.arflow_grpc.v1.depth_frame_pb2 import DepthFrame as DepthFrame from cakelab.arflow_grpc.v1.device_pb2 import Device as Device +from cakelab.arflow_grpc.v1.gyroscope_frame_pb2 import GyroscopeFrame as GyroscopeFrame +from cakelab.arflow_grpc.v1.mesh_detection_frame_pb2 import ( + MeshDetectionFrame as MeshDetectionFrame, +) +from cakelab.arflow_grpc.v1.plane_detection_frame_pb2 import ( + PlaneDetectionFrame as PlaneDetectionFrame, +) +from cakelab.arflow_grpc.v1.point_cloud_detection_frame_pb2 import ( + PointCloudDetectionFrame as PointCloudDetectionFrame, +) from cakelab.arflow_grpc.v1.session_pb2 import Session as Session from cakelab.arflow_grpc.v1.transform_frame_pb2 import TransformFrame as TransformFrame @@ -19,6 +32,13 @@ "ARFlowServicer", "ARFrame", "TransformFrame", + "ColorFrame", + "DepthFrame", + "GyroscopeFrame", + "AudioFrame", + "PlaneDetectionFrame", + "PointCloudDetectionFrame", + "MeshDetectionFrame", "SessionStream", "Session", "Device", diff --git a/python/arflow/_core.py b/python/arflow/_core.py index a31bde0..7718a2b 100644 --- a/python/arflow/_core.py +++ b/python/arflow/_core.py @@ -2,10 +2,11 @@ import logging import uuid +from collections.abc import Sequence from concurrent import futures from pathlib import Path from signal import SIGINT, SIGTERM, signal -from typing import Any, Iterable, Type +from typing import Any, Type import grpc import rerun as rr @@ -72,6 +73,7 @@ def __init__( Args: spawn_viewer: Whether to spawn the Rerun Viewer in another process. save_dir: The path to save the data to. Assumed to be an existing directory. + application_id: The application ID to store recordings under. Raises: ValueError: If neither or both operational modes are selected. @@ -82,19 +84,20 @@ def __init__( raise ValueError( "Either spawn the viewer or save the data, but not both, and neither can be disabled." ) - self._spawn_viewer = spawn_viewer - self._save_dir = save_dir - self._application_id = application_id - self._client_sessions: dict[str, SessionStream] = {} + self.spawn_viewer = spawn_viewer + self.save_dir = save_dir + self.application_id = application_id + self.client_sessions: dict[str, SessionStream] = {} + """Active session streams, indexed by their ID.""" # Initializes SDK with an "empty" global recording. We don't want to log anything into the global recording. - rr.init(application_id=application_id, spawn=self._spawn_viewer) + rr.init(application_id=self.application_id, spawn=self.spawn_viewer) # TODO: This here is right? https://rerun.io/docs/concepts/spaces-and-transforms#view-coordinates # rr.log("/", rr.ViewCoordinates.RIGHT_HAND_Z_UP, static=True) super().__init__() def _get_session_stream(self, session_id: str) -> SessionStream: try: - return self._client_sessions[session_id] + return self.client_sessions[session_id] except KeyError: raise NotFound("Session not found") @@ -103,9 +106,9 @@ def CreateSession( ) -> CreateSessionResponse: new_session_id = str(uuid.uuid4()) new_rr_stream = rr.new_recording( - application_id=self._application_id, + application_id=self.application_id, recording_id=new_session_id, # recording_id identifies streams - spawn=self._spawn_viewer, + spawn=self.spawn_viewer, ) new_session = Session( id=SessionUuid(value=new_session_id), @@ -116,11 +119,11 @@ def CreateSession( info=new_session, stream=new_rr_stream, ) - self._client_sessions[new_session_id] = new_session_stream + self.client_sessions[new_session_id] = new_session_stream logger.info("Created new session: %s", new_session_stream.info) - if self._save_dir is not None: - save_path = self._save_dir / Path(f"{new_session_stream.info.id.value}.rrd") + if self.save_dir is not None: + save_path = self.save_dir / Path(f"{new_session_stream.info.id.value}.rrd") # Overriding the save path if provided in session metadata if len(request.session_metadata.save_path) != 0: @@ -152,7 +155,7 @@ def DeleteSession( self, request: DeleteSessionRequest, context: grpc.ServicerContext | None = None ) -> DeleteSessionResponse: try: - session_stream = self._client_sessions.pop(request.session_id.value) + session_stream = self.client_sessions.pop(request.session_id.value) except KeyError: raise NotFound("Session not found") @@ -181,42 +184,19 @@ def GetSession( logger.info("Retrieved session: %s", session_stream.info) - self.on_get_session(session_stream=session_stream) - return GetSessionResponse(session=session_stream.info) - def on_get_session(self, session_stream: SessionStream) -> None: - """Hook for user-defined procedures when a session is retrieved. - - Args: - session_stream: The session stream. - """ - pass - def ListSessions( self, request: ListSessionsRequest, context: grpc.ServicerContext | None = None ) -> ListSessionsResponse: - current_session_streams = [ - session_stream for session_stream in self._client_sessions.values() - ] current_sessions = [ - session_stream.info for session_stream in current_session_streams + session_stream.info for session_stream in self.client_sessions.values() ] - logger.info("Listed %s current sessions", len(current_session_streams)) - - self.on_list_sessions(session_streams=current_session_streams) + logger.info("Listed %s current sessions", len(current_sessions)) return ListSessionsResponse(sessions=current_sessions) - def on_list_sessions(self, session_streams: Iterable[SessionStream]) -> None: - """Hook for user-defined procedures when all sessions are requested. - - Args: - session_streams: The session streams. - """ - pass - def JoinSession( self, request: JoinSessionRequest, context: grpc.ServicerContext | None = None ) -> JoinSessionResponse: @@ -262,7 +242,7 @@ def LeaveSession( try: session_stream.info.devices.remove(request.device) except ValueError: - raise InvalidArgument("Device not in session") + raise NotFound("Device not in session") logger.info( "Client %s left session %s", request.device, request.session_id.value @@ -296,9 +276,8 @@ def SaveARFrames( session_stream = self._get_session_stream(request.session_id.value) if request.device not in session_stream.info.devices: - raise InvalidArgument("Device not in session") + raise NotFound("Device not in session") - ar_frames = [] frames_grouped_by_type = { type: [ frame for frame in request.frames if frame.WhichOneof("data") == type @@ -310,19 +289,19 @@ def SaveARFrames( continue if frame_type == ARFrameType.TRANSFORM_FRAME and frames[0].transform_frame: - ar_frames = self._process_transform_frames( + self._process_transform_frames( frames=[f.transform_frame for f in frames], session_stream=session_stream, device=request.device, ) elif frame_type == ARFrameType.COLOR_FRAME and frames[0].color_frame: - ar_frames = self._process_color_frames( + self._process_color_frames( frames=[f.color_frame for f in frames], session_stream=session_stream, device=request.device, ) elif frame_type == ARFrameType.DEPTH_FRAME and frames[0].depth_frame: - ar_frames = self._process_depth_frames( + self._process_depth_frames( frames=[f.depth_frame for f in frames], session_stream=session_stream, device=request.device, @@ -330,13 +309,13 @@ def SaveARFrames( elif ( frame_type == ARFrameType.GYROSCOPE_FRAME and frames[0].gyroscope_frame ): - ar_frames = self._process_gyroscope_frames( + self._process_gyroscope_frames( frames=[f.gyroscope_frame for f in frames], session_stream=session_stream, device=request.device, ) elif frame_type == ARFrameType.AUDIO_FRAME and frames[0].audio_frame: - ar_frames = self._process_audio_frames( + self._process_audio_frames( frames=[f.audio_frame for f in frames], session_stream=session_stream, device=request.device, @@ -345,7 +324,7 @@ def SaveARFrames( frame_type == ARFrameType.PLANE_DETECTION_FRAME and frames[0].plane_detection_frame ): - ar_frames = self._process_plane_detection_frames( + self._process_plane_detection_frames( frames=[f.plane_detection_frame for f in frames], session_stream=session_stream, device=request.device, @@ -354,7 +333,7 @@ def SaveARFrames( frame_type == ARFrameType.POINT_CLOUD_DETECTION_FRAME and frames[0].point_cloud_detection_frame ): - ar_frames = self._process_point_cloud_detection_frames( + self._process_point_cloud_detection_frames( frames=[f.point_cloud_detection_frame for f in frames], session_stream=session_stream, device=request.device, @@ -363,7 +342,7 @@ def SaveARFrames( frame_type == ARFrameType.MESH_DETECTION_FRAME and frames[0].mesh_detection_frame ): - ar_frames = self._process_mesh_detection_frames( + self._process_mesh_detection_frames( frames=[f.mesh_detection_frame for f in frames], session_stream=session_stream, device=request.device, @@ -376,7 +355,7 @@ def SaveARFrames( ) self.on_save_ar_frames( - frames=ar_frames, + frames=request.frames, session_stream=session_stream, device=request.device, ) @@ -385,10 +364,10 @@ def SaveARFrames( def _process_transform_frames( self, - frames: list[TransformFrame], + frames: Sequence[TransformFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_transform_frames( frames=frames, device=device, @@ -398,14 +377,13 @@ def _process_transform_frames( session_stream=session_stream, device=device, ) - return [ARFrame(transform_frame=f) for f in frames] def _process_color_frames( self, - frames: list[ColorFrame], + frames: Sequence[ColorFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_color_frames( frames=frames, device=device, @@ -415,14 +393,13 @@ def _process_color_frames( session_stream=session_stream, device=device, ) - return [ARFrame(color_frame=f) for f in frames] def _process_depth_frames( self, - frames: list[DepthFrame], + frames: Sequence[DepthFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_depth_frames( frames=frames, device=device, @@ -432,14 +409,13 @@ def _process_depth_frames( session_stream=session_stream, device=device, ) - return [ARFrame(depth_frame=f) for f in frames] def _process_gyroscope_frames( self, - frames: list[GyroscopeFrame], + frames: Sequence[GyroscopeFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_gyroscope_frames( frames=frames, device=device, @@ -449,14 +425,13 @@ def _process_gyroscope_frames( session_stream=session_stream, device=device, ) - return [ARFrame(gyroscope_frame=f) for f in frames] def _process_audio_frames( self, - frames: list[AudioFrame], + frames: Sequence[AudioFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_audio_frames( frames=frames, device=device, @@ -466,14 +441,13 @@ def _process_audio_frames( session_stream=session_stream, device=device, ) - return [ARFrame(audio_frame=f) for f in frames] def _process_plane_detection_frames( self, - frames: list[PlaneDetectionFrame], + frames: Sequence[PlaneDetectionFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_plane_detection_frames( frames=frames, device=device, @@ -483,14 +457,13 @@ def _process_plane_detection_frames( session_stream=session_stream, device=device, ) - return [ARFrame(plane_detection_frame=f) for f in frames] def _process_point_cloud_detection_frames( self, - frames: list[PointCloudDetectionFrame], + frames: Sequence[PointCloudDetectionFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_point_cloud_detection_frames( frames=frames, device=device, @@ -500,14 +473,13 @@ def _process_point_cloud_detection_frames( session_stream=session_stream, device=device, ) - return [ARFrame(point_cloud_detection_frame=f) for f in frames] def _process_mesh_detection_frames( self, - frames: list[MeshDetectionFrame], + frames: Sequence[MeshDetectionFrame], session_stream: SessionStream, device: Device, - ) -> list[ARFrame]: + ) -> None: session_stream.save_mesh_detection_frames( frames=frames, device=device, @@ -517,11 +489,10 @@ def _process_mesh_detection_frames( session_stream=session_stream, device=device, ) - return [ARFrame(mesh_detection_frame=f) for f in frames] def on_save_ar_frames( self, - frames: list[ARFrame], + frames: Sequence[ARFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -536,7 +507,7 @@ def on_save_ar_frames( def on_save_transform_frames( self, - frames: list[TransformFrame], + frames: Sequence[TransformFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -551,7 +522,7 @@ def on_save_transform_frames( def on_save_color_frames( self, - frames: list[ColorFrame], + frames: Sequence[ColorFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -566,7 +537,7 @@ def on_save_color_frames( def on_save_depth_frames( self, - frames: list[DepthFrame], + frames: Sequence[DepthFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -581,7 +552,7 @@ def on_save_depth_frames( def on_save_gyroscope_frames( self, - frames: list[GyroscopeFrame], + frames: Sequence[GyroscopeFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -596,7 +567,7 @@ def on_save_gyroscope_frames( def on_save_audio_frames( self, - frames: list[AudioFrame], + frames: Sequence[AudioFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -611,7 +582,7 @@ def on_save_audio_frames( def on_save_plane_detection_frames( self, - frames: list[PlaneDetectionFrame], + frames: Sequence[PlaneDetectionFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -626,7 +597,7 @@ def on_save_plane_detection_frames( def on_save_point_cloud_detection_frames( self, - frames: list[PointCloudDetectionFrame], + frames: Sequence[PointCloudDetectionFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -641,7 +612,7 @@ def on_save_point_cloud_detection_frames( def on_save_mesh_detection_frames( self, - frames: list[MeshDetectionFrame], + frames: Sequence[MeshDetectionFrame], session_stream: SessionStream, device: Device, ) -> None: @@ -662,53 +633,48 @@ def SaveSynchronizedARFrame( session_stream = self._get_session_stream(request.session_id.value) if request.device not in session_stream.info.devices: - raise InvalidArgument("Device not in session") + raise NotFound("Device not in session") - try: - decoded_transform_frame = self._process_transform_frames( - frames=[request.frame.transform_frame], - session_stream=session_stream, - device=request.device, - )[0] - decoded_depth_frame = self._process_depth_frames( - frames=[request.frame.depth_frame], - session_stream=session_stream, - device=request.device, - )[0] - decoded_color_frame = self._process_color_frames( - frames=[request.frame.color_frame], - session_stream=session_stream, - device=request.device, - )[0] - decoded_gyroscope_frame = self._process_gyroscope_frames( - frames=[request.frame.gyroscope_frame], - session_stream=session_stream, - device=request.device, - )[0] - decoded_audio_frame = self._process_audio_frames( - frames=[request.frame.audio_frame], - session_stream=session_stream, - device=request.device, - )[0] - decoded_plane_detection_frame = self._process_plane_detection_frames( - frames=[request.frame.plane_detection_frame], - session_stream=session_stream, - device=request.device, - )[0] - decoded_point_cloud_detection_frame = ( - self._process_point_cloud_detection_frames( - frames=[request.frame.point_cloud_detection_frame], - session_stream=session_stream, - device=request.device, - )[0] - ) - decoded_mesh_detection_frame = self._process_mesh_detection_frames( - frames=[request.frame.mesh_detection_frame], - session_stream=session_stream, - device=request.device, - )[0] - except IndexError as e: - raise InvalidArgument(f"Error processing synchronized AR frame: {e}") + self._process_transform_frames( + frames=[request.frame.transform_frame], + session_stream=session_stream, + device=request.device, + ) + self._process_depth_frames( + frames=[request.frame.depth_frame], + session_stream=session_stream, + device=request.device, + ) + self._process_color_frames( + frames=[request.frame.color_frame], + session_stream=session_stream, + device=request.device, + ) + self._process_gyroscope_frames( + frames=[request.frame.gyroscope_frame], + session_stream=session_stream, + device=request.device, + ) + self._process_audio_frames( + frames=[request.frame.audio_frame], + session_stream=session_stream, + device=request.device, + ) + self._process_plane_detection_frames( + frames=[request.frame.plane_detection_frame], + session_stream=session_stream, + device=request.device, + ) + self._process_point_cloud_detection_frames( + frames=[request.frame.point_cloud_detection_frame], + session_stream=session_stream, + device=request.device, + ) + self._process_mesh_detection_frames( + frames=[request.frame.mesh_detection_frame], + session_stream=session_stream, + device=request.device, + ) logger.info( "Saved synchronized AR frame of device %s to session %s", @@ -716,15 +682,9 @@ def SaveSynchronizedARFrame( session_stream.info.id.value, ) - # self.on_save_ar_frames( - # frames=decoded_ar_frames, - # session_stream=session_stream, - # device=request.device, - # ) - return SaveSynchronizedARFrameResponse() - def on_program_exit(self) -> None: + def on_server_exit(self) -> None: """Closes all TCP connections, servers, and files. @private @@ -732,7 +692,7 @@ def on_program_exit(self) -> None: logger.debug("Closing all TCP connections, servers, and files...") # Disconnects the global recording. Without this, this function will hang indefinitely. rr.disconnect() - for id, session in self._client_sessions.items(): + for id, session in self.client_sessions.items(): rr.disconnect(session.stream) logger.debug("Disconnected session: %s", id) logger.debug("All clients disconnected") @@ -799,7 +759,7 @@ def handle_shutdown(*_: Any) -> None: all_rpcs_done_event = server.stop(30) all_rpcs_done_event.wait(30) - servicer.on_program_exit() + servicer.on_server_exit() # TODO: Discuss hook for user-defined cleanup procedures. diff --git a/python/arflow/_session_stream.py b/python/arflow/_session_stream.py index 66970cb..173d18b 100644 --- a/python/arflow/_session_stream.py +++ b/python/arflow/_session_stream.py @@ -1,6 +1,7 @@ """Session helps participating devices stream to the same Rerun recording.""" import logging +from collections.abc import Sequence import DracoPy import numpy as np @@ -15,7 +16,6 @@ group_color_frames_by_format_and_dims, group_depth_frames_by_format_dims_and_smoothness, ) -from cakelab.arflow_grpc.v1.ar_plane_pb2 import ARPlane from cakelab.arflow_grpc.v1.ar_trackable_pb2 import ARTrackable from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame from cakelab.arflow_grpc.v1.color_frame_pb2 import ColorFrame @@ -29,6 +29,8 @@ ) from cakelab.arflow_grpc.v1.session_pb2 import Session from cakelab.arflow_grpc.v1.transform_frame_pb2 import TransformFrame +from cakelab.arflow_grpc.v1.vector2_pb2 import Vector2 +from cakelab.arflow_grpc.v1.vector3_pb2 import Vector3 from cakelab.arflow_grpc.v1.xr_cpu_image_pb2 import XRCpuImage logger = logging.getLogger(__name__) @@ -54,7 +56,7 @@ def __init__(self, info: Session, stream: rr.RecordingStream): def save_transform_frames( self, - frames: list[TransformFrame], + frames: Sequence[TransformFrame], device: Device, ): if len(frames) == 0: @@ -103,7 +105,7 @@ def save_transform_frames( def save_color_frames( self, - frames: list[ColorFrame], + frames: Sequence[ColorFrame], device: Device, ): """Assumes that the device is in the session and all frames have the same format, width, height, and originating device. @@ -226,7 +228,7 @@ def save_color_frames( def save_depth_frames( self, - frames: list[DepthFrame], + frames: Sequence[DepthFrame], device: Device, ): """Assumes that the device is in the session and all frames have the same format, width, height, smoothness, and and originating device.""" @@ -303,7 +305,7 @@ def save_depth_frames( def save_gyroscope_frames( self, - frames: list[GyroscopeFrame], + frames: Sequence[GyroscopeFrame], device: Device, ): if len(frames) == 0: @@ -443,7 +445,7 @@ def save_gyroscope_frames( def save_audio_frames( self, - frames: list[AudioFrame], + frames: Sequence[AudioFrame], device: Device, ): if len(frames) == 0: @@ -484,7 +486,7 @@ def save_audio_frames( def save_plane_detection_frames( self, - frames: list[PlaneDetectionFrame], + frames: Sequence[PlaneDetectionFrame], device: Device, ): if len(frames) == 0: @@ -507,7 +509,9 @@ def save_plane_detection_frames( positively_changed_frames = list( filter( lambda f: f.state == PlaneDetectionFrame.STATE_ADDED - or f.state == PlaneDetectionFrame.STATE_UPDATED, + or f.state == PlaneDetectionFrame.STATE_UPDATED + and len(f.plane.boundary) + > 0, # boundary can sometimes 0 points for some reason frames, ) ) @@ -526,7 +530,11 @@ def save_plane_detection_frames( # TODO: notice ARTrackable.Pose rr.components.LineStrip3DBatch( data=[ - _to_boundary_points_3d(f.plane) + _convert_2d_to_3d_boundary_points( + boundary=f.plane.boundary, + normal=f.plane.normal, + center=f.plane.center, + ) for f in positively_changed_frames ] ), @@ -590,7 +598,7 @@ def save_plane_detection_frames( def save_point_cloud_detection_frames( self, - frames: list[PointCloudDetectionFrame], + frames: Sequence[PointCloudDetectionFrame], device: Device, ): if len(frames) == 0: @@ -740,7 +748,7 @@ def save_point_cloud_detection_frames( def save_mesh_detection_frames( self, - frames: list[MeshDetectionFrame], + frames: Sequence[MeshDetectionFrame], device: Device, ): if len(frames) == 0: @@ -857,15 +865,16 @@ def _to_i420_format(image: XRCpuImage) -> npt.NDArray[np.uint8]: return np.concatenate([y_data, u_data, v_data]) -# TODO: Happy path programming. Please add error handling -def _to_boundary_points_3d( - plane: ARPlane, +def _convert_2d_to_3d_boundary_points( + boundary: Sequence[Vector2], + normal: Vector3, + center: Vector3, ) -> npt.NDArray[np.float32]: - if len(plane.boundary) == 0: + if len(boundary) == 0: logger.warning("Skipping plane with no boundary points.") return np.array([], dtype=np.float32) - normal_as_np = np.array([plane.normal.x, plane.normal.y, plane.normal.z]) + normal_as_np = np.array([normal.x, normal.y, normal.z]) normalized_normal_as_np = normal_as_np / np.linalg.norm(normal_as_np) arbitary_vector = ( np.array([1, 0, 0]) @@ -875,11 +884,11 @@ def _to_boundary_points_3d( u = np.cross(normalized_normal_as_np, arbitary_vector) u = u / np.linalg.norm(u) v = np.cross(normalized_normal_as_np, u) - center_as_np = np.array([plane.center.x, plane.center.y, plane.center.z]) + center_as_np = np.array([center.x, center.y, center.z]) boundary_points_3d = np.array( - [center_as_np + point_2d.x * u + point_2d.y * v for point_2d in plane.boundary] + [center_as_np + point_2d.x * u + point_2d.y * v for point_2d in boundary] # close off boundary - + [center_as_np + plane.boundary[0].x * u + plane.boundary[0].y * v], + + [center_as_np + boundary[0].x * u + boundary[0].y * v], dtype=np.float32, ) return boundary_points_3d diff --git a/python/arflow/_utils.py b/python/arflow/_utils.py index 3dfd2f4..56691da 100644 --- a/python/arflow/_utils.py +++ b/python/arflow/_utils.py @@ -1,4 +1,5 @@ from collections import defaultdict +from collections.abc import Sequence from typing import DefaultDict, Tuple from cakelab.arflow_grpc.v1.color_frame_pb2 import ColorFrame @@ -7,7 +8,7 @@ def group_color_frames_by_format_and_dims( - frames: list[ColorFrame], + frames: Sequence[ColorFrame], ) -> DefaultDict[Tuple[XRCpuImage.Format, int, int], list[ColorFrame]]: """Group color frames by format and dimensions (width x height).""" color_frames_grouped_by_format_and_dims: DefaultDict[ @@ -25,7 +26,7 @@ def group_color_frames_by_format_and_dims( def group_depth_frames_by_format_dims_and_smoothness( - frames: list[DepthFrame], + frames: Sequence[DepthFrame], ) -> DefaultDict[Tuple[XRCpuImage.Format, int, int, bool], list[DepthFrame]]: """Group depth frames by format, dimensions (width x height), and smoothness.""" depth_frames_grouped_by_format_dims_and_smoothness: DefaultDict[ From 1530ff527e437b71fb970541c8859253e09a3ccb Mon Sep 17 00:00:00 2001 From: felixngfender Date: Tue, 21 Jan 2025 13:12:07 -0500 Subject: [PATCH 03/21] test(server): tests for new API Incomplete, still need fixing for image YUV420 conversion, add back in test for that and missing test for point cloud detection in `test_service.py` and `test_server.py`. All of these have been marked with TODO marks. --- python/arflow/_core.py | 2 +- python/arflow/_session_stream.py | 1 + python/tests/conftest.py | 54 ++- python/tests/test_cli.py | 36 +- python/tests/test_decoding.py | 301 ++---------- python/tests/test_hooks.py | 131 ++++-- python/tests/test_server.py | 674 +++++++++++++++++---------- python/tests/test_service.py | 765 +++++++++++++++++++------------ 8 files changed, 1120 insertions(+), 844 deletions(-) diff --git a/python/arflow/_core.py b/python/arflow/_core.py index 7718a2b..0abb54c 100644 --- a/python/arflow/_core.py +++ b/python/arflow/_core.py @@ -133,7 +133,7 @@ def CreateSession( path=save_path, recording=new_rr_stream, ) - logger.debug("Session data path: %s", save_path) + logger.info("Session data path: %s", save_path) self.on_create_session( session_stream=new_session_stream, diff --git a/python/arflow/_session_stream.py b/python/arflow/_session_stream.py index 173d18b..fc98568 100644 --- a/python/arflow/_session_stream.py +++ b/python/arflow/_session_stream.py @@ -847,6 +847,7 @@ def _to_i420_format(image: XRCpuImage) -> npt.NDArray[np.uint8]: ) # Downsample and pack U and V planes u_data = ( + # TODO: Fix this workaround np.frombuffer(u_plane.data + b"\x00", dtype=np.uint8) # pad an extra byte .reshape((uv_height, u_plane.row_stride))[ diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 7779f45..bcc0982 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -4,47 +4,73 @@ # ruff:noqa: D101,D102,D103,D107 # pyright: reportPrivateUsage=false +from collections import defaultdict +from collections.abc import Sequence from pathlib import Path +from typing import DefaultDict import pytest from arflow import ( ARFlowServicer, - DecodedDataFrame, - JoinSessionRequest, - RegisterClientRequest, + ARFrame, + Device, ) +from arflow._session_stream import SessionStream + +TEST_APP_ID = "arflow-test" @pytest.fixture def default_service_fixture(): """A default ARFlow service fixture that can be shared across tests.""" - return ARFlowServicer() + return ARFlowServicer(application_id=TEST_APP_ID) @pytest.fixture def service_fixture_with_save_dir(tmp_path: Path): """A ARFlow service fixture with a configured save path that can be shared across tests.""" - return ARFlowServicer(spawn_viewer=False, save_dir=tmp_path) + return ARFlowServicer( + spawn_viewer=False, save_dir=tmp_path, application_id=TEST_APP_ID + ) + + +@pytest.fixture +def device_fixture(): + """A ARFlow device fixture that can be shared across tests.""" + return Device( + model="ARPhone 12 Pro Max", + name="ARFlow test device", + type=Device.Type.TYPE_HANDHELD, + uid="test-device", + ) class UserExtendedService(ARFlowServicer): def __init__(self): - super().__init__() - self.num_clients = 0 - self.num_frames = 0 + super().__init__(spawn_viewer=True, application_id=TEST_APP_ID) self.num_sessions = 0 + self.num_clients = 0 + self.num_frames_by_client: DefaultDict[str, int] = defaultdict(int) + """Key is device UID, which is unique across all devices""" - def on_register(self, request: RegisterClientRequest) -> None: - self.num_clients += 1 + def on_create_session(self, session_stream: SessionStream, device: Device) -> None: + self.num_sessions += 1 - def on_frame_received(self, decoded_data_frame: DecodedDataFrame) -> None: - self.num_frames += 1 + def on_delete_session(self, session_stream: SessionStream) -> None: + self.num_sessions -= 1 - def on_join_session(self, request: JoinSessionRequest) -> None: - self.num_sessions += 1 + def on_join_session(self, session_stream: SessionStream, device: Device) -> None: self.num_clients += 1 + def on_leave_session(self, session_stream: SessionStream, device: Device) -> None: + self.num_clients -= 1 + + def on_save_ar_frames( + self, frames: Sequence[ARFrame], session_stream: SessionStream, device: Device + ) -> None: + self.num_frames_by_client[device.uid] += len(frames) + @pytest.fixture def user_service_fixture(): diff --git a/python/tests/test_cli.py b/python/tests/test_cli.py index 7e840da..e13d3a6 100644 --- a/python/tests/test_cli.py +++ b/python/tests/test_cli.py @@ -53,11 +53,13 @@ def test_provide_alternate_directory(tmp_path: Path): def test_view(): - with patch("arflow._cli.run_server") as mock_run_server, patch( - "arflow._cli.ARFlowServicer" - ) as mock_servicer: + with ( + patch("arflow._cli.run_server") as mock_run_server, + patch("arflow._cli.ARFlowServicer") as mock_servicer, + ): args = MagicMock() args.port = 1234 + args.application_id = "test-id" view(args) @@ -66,16 +68,19 @@ def test_view(): spawn_viewer=True, save_dir=None, port=1234, + application_id="test-id", ) def test_save(): - with patch("arflow._cli.run_server") as mock_run_server, patch( - "arflow._cli.ARFlowServicer" - ) as mock_servicer: + with ( + patch("arflow._cli.run_server") as mock_run_server, + patch("arflow._cli.ARFlowServicer") as mock_servicer, + ): args = MagicMock() args.port = 1234 args.save_dir = "/tmp/save_path" + args.application_id = "test-id" save(args) @@ -84,6 +89,7 @@ def test_save(): spawn_viewer=False, save_dir=Path("/tmp/save_path"), port=1234, + application_id="test-id", ) @@ -96,7 +102,7 @@ def test_rerun(): @pytest.mark.parametrize( - "command, subcommand, debug, quiet, port, save_dir", + "command, subcommand, debug, quiet, port, save_dir, application_id", [ ( "", @@ -105,6 +111,7 @@ def test_rerun(): False, None, None, + "arflow", ), ( "-d", @@ -113,6 +120,7 @@ def test_rerun(): False, None, None, + "arflow", ), ( "-q", @@ -121,6 +129,7 @@ def test_rerun(): True, None, None, + "arflow", ), ( "view", @@ -129,6 +138,7 @@ def test_rerun(): False, 8500, None, + "arflow", ), ( "-d save", @@ -137,6 +147,7 @@ def test_rerun(): False, 8500, None, + "arflow", ), ( "-d save -p 1234", @@ -145,6 +156,7 @@ def test_rerun(): False, 1234, None, + "arflow", ), ( "-d save -s /tmp/save_path", @@ -153,14 +165,16 @@ def test_rerun(): False, 8500, "/tmp/save_path", + "arflow", ), ( - "-d save -p 1234 -s /tmp/save_path", + "-d save -p 1234 -s /tmp/save_path -a test-id", "save", True, False, 1234, "/tmp/save_path", + "test-id", ), ( "rerun /path/to/data.file", @@ -169,6 +183,7 @@ def test_rerun(): False, None, None, + None, ), ( "-d rerun /path/to/data.file", @@ -177,6 +192,7 @@ def test_rerun(): False, None, None, + None, ), ], ) @@ -187,6 +203,7 @@ def test_parse_args( quiet: bool, port: int | None, save_dir: str | None, + application_id: str | None, tmp_path: Path, ): if save_dir is None: @@ -204,13 +221,16 @@ def test_parse_args( if subcommand == "view": assert args.func == view assert args.port == port + assert args.application_id == application_id elif subcommand == "save": assert args.func == save assert args.port == port assert args.save_dir == save_dir + assert args.application_id == application_id elif subcommand == "rerun": assert args.func == rerun else: assert not hasattr(args, "func") assert not hasattr(args, "port") assert not hasattr(args, "save_dir") + assert not hasattr(args, "application_id") diff --git a/python/tests/test_decoding.py b/python/tests/test_decoding.py index 204c2a4..fff3872 100644 --- a/python/tests/test_decoding.py +++ b/python/tests/test_decoding.py @@ -2,284 +2,53 @@ # ruff:noqa: D103,D107 # pyright: reportPrivateUsage=false - -from typing import Literal +from collections.abc import Sequence import numpy as np import pytest -from arflow._decoding import ( - convert_2d_to_3d_boundary_points, - decode_color_frames, - decode_depth_image, - decode_intrinsic, - decode_point_cloud, - decode_transform, -) -from arflow._types import ( - PlaneBoundaryPoints2D, - PlaneCenter, - PlaneNormal, -) - - -@pytest.mark.parametrize( - "resolution_y,resolution_x,resize_factor_y,resize_factor_x,data_type,buffer_length,should_pass", - [ - (4, 4, 1.0, 1.0, "RGB24", 4 * 4 * 3, True), # Valid RGB24 case - (4, 4, 1.0, 1.0, "YCbCr420", 4 * 4 * 3 // 2, True), # Valid YCbCr420 case - (4, 4, 1.0, 1.0, "Invalid", 4 * 4 * 3, False), # Invalid data type - (4, 4, 1.0, 1.0, "RGB24", 1, False), # Buffer too small - ], -) -def test_decode_rgb_image( - resolution_y: int, - resolution_x: int, - resize_factor_y: float, - resize_factor_x: float, - data_type: Literal["RGB24", "YCbCr420"], - buffer_length: int, - should_pass: bool, -): - buffer = np.random.randint(0, 255, buffer_length, dtype=np.uint8).tobytes() # pyright: ignore [reportUnknownMemberType] - if should_pass: - assert decode_color_frames( - resolution_y, - resolution_x, - resize_factor_y, - resize_factor_x, - data_type, - buffer, - ).shape == ( - resolution_y, - resolution_x, - 3, - ) - assert ( - decode_color_frames( - resolution_y, - resolution_x, - resize_factor_y, - resize_factor_x, - data_type, - buffer, - ).dtype - == np.uint8 - ) - else: - with pytest.raises(ValueError): - decode_color_frames( - resolution_y, - resolution_x, - resize_factor_y, - resize_factor_x, - data_type, - buffer, - ) - - -@pytest.mark.parametrize( - "resolution_y,resolution_x,data_type,buffer_dtype,should_pass", - [ - (4, 4, "f32", np.float32, True), # Valid float32 depth case - (4, 4, "u16", np.uint16, True), # Valid uint16 depth case - (4, 4, "Invalid", np.uint16, False), # Invalid data type - (4, 4, "f32", np.float32, False), # Buffer too small - ], -) -def test_decode_depth_image( - resolution_y: int, - resolution_x: int, - data_type: Literal["f32", "u16"], - buffer_dtype: np.float32 | np.uint16, - should_pass: bool, -): - buffer = np.random.rand(resolution_y * resolution_x).astype(buffer_dtype).tobytes() - - if should_pass: - result = decode_depth_image(resolution_y, resolution_x, data_type, buffer) - assert result.shape == (resolution_y, resolution_x) - assert result.dtype == np.float32 - else: - with pytest.raises(ValueError): - decode_depth_image(resolution_y, resolution_x, data_type, buffer[:1]) - - -@pytest.mark.parametrize( - "buffer_length,should_pass", - [ - (12 * 4, True), # Correct size for 3x4 matrix - (8, False), # Incorrect buffer size - ], -) -def test_decode_transform(buffer_length: int, should_pass: bool): - buffer = np.random.rand(buffer_length // 4).astype(np.float32).tobytes() - - if should_pass: - result = decode_transform(buffer) - assert result.shape == (4, 4) - assert result.dtype == np.float32 - else: - with pytest.raises(ValueError): - decode_transform(buffer) +from arflow._session_stream import _convert_2d_to_3d_boundary_points +from cakelab.arflow_grpc.v1.vector2_pb2 import Vector2 +from cakelab.arflow_grpc.v1.vector3_pb2 import Vector3 @pytest.mark.parametrize( - "resize_factor_y,resize_factor_x,focal_length_y,focal_length_x,principal_point_y,principal_point_x,should_pass", - [ - (1.0, 1.0, 2.0, 2.0, 1.0, 1.0, True), # Valid intrinsic matrix - # TODO: Really no error cases? - ], -) -def test_decode_intrinsic( - resize_factor_y: float, - resize_factor_x: float, - focal_length_y: float, - focal_length_x: float, - principal_point_y: float, - principal_point_x: float, - should_pass: bool, -): - if should_pass: - result = decode_intrinsic( - resize_factor_y, - resize_factor_x, - focal_length_y, - focal_length_x, - principal_point_y, - principal_point_x, - ) - assert result.shape == (3, 3) - assert result.dtype == np.float32 - else: - with pytest.raises(ValueError): - decode_intrinsic( - resize_factor_y, - resize_factor_x, - focal_length_y, - focal_length_x, - principal_point_y, - principal_point_x, - ) - - -@pytest.mark.parametrize( - "resolution_y,resolution_x,resize_factor_y,resize_factor_x,should_pass", - [ - (4, 4, 1.0, 1.0, True), # Valid point cloud case - # TODO: Really no error cases? Because we can assume color_rgb, depth_img, and k are valid - ], -) -def test_decode_point_cloud( - resolution_y: int, - resolution_x: int, - resize_factor_y: float, - resize_factor_x: float, - should_pass: bool, -): - color_rgb = np.random.randint( # pyright: ignore [reportUnknownMemberType] - 0, 255, (resolution_y, resolution_x, 3), dtype=np.uint8 - ) - depth_img = np.random.rand(resolution_y, resolution_x).astype(np.float32) - k = np.array([[2.0, 0, 1.0], [0, 2.0, 1.0], [0, 0, 1.0]], dtype=np.float32) - transform = np.eye(4, dtype=np.float32) - - if should_pass: - pcd, clr = decode_point_cloud( - resolution_y, - resolution_x, - resize_factor_y, - resize_factor_x, - k, - color_rgb, - depth_img, - transform, - ) - assert pcd.shape == (resolution_y * resolution_x, 3) - assert pcd.dtype == np.float32 - assert clr.shape == (resolution_y * resolution_x, 3) - assert clr.dtype == np.uint8 - else: - with pytest.raises(ValueError): - decode_point_cloud( - resolution_y, - resolution_x, - resize_factor_y, - resize_factor_x, - k, - color_rgb, - depth_img, - transform, - ) - - -@pytest.mark.parametrize( - "boundary_points_2d,normal,center,should_pass", + "boundary,normal,center", [ ( - np.array([[1, 2], [2, 3], [1, 3]]), - np.array([4, 5, 6]), - np.array([2, 3, 4]), - True, + [ + Vector2(x=1, y=2), + Vector2(x=2, y=3), + Vector2(x=1, y=3), + ], + Vector3(x=4, y=5, z=6), + Vector3(x=2, y=3, z=4), ), # Valid 2D points, normal, and center ( - np.array([[1, 2, 3], [2, 3, 4], [1, 3, 4]]), - np.array([4, 5, 6]), - np.array([2, 3, 4]), - False, - ), # Boundary points not in 2D - ( - np.array([[1, 2], [2, 3]]), - np.array([4, 5, 6]), - np.array([2, 3, 4]), - False, - ), # Only 2 boundary points - ( - np.array([[1, 2], [2, 3], [1, 3]]), - np.array([[2, 3, 4], [4, 5, 6]]), - np.array([2, 3, 4]), - False, - ), # More than 1 normal - ( - np.array([[1, 2], [2, 3], [1, 3]]), - np.array([2, 3]), - np.array([2, 3, 4]), - False, - ), # Normal not in 3D - ( - np.array([[1, 2], [2, 3], [1, 3]]), - np.array([0, 0, 0]), - np.array([2, 3, 4]), - False, - ), # Normal is zero - ( - np.array([[1, 2], [2, 3], [1, 3]]), - np.array([4, 5, 6]), - np.array([[2, 3, 4], [2, 3, 4]]), - False, - ), # More than 1 center - ( - np.array([[1, 2], [2, 3], [1, 3]]), - np.array([4, 5, 6]), - np.array([2, 3, 4, 5]), - False, - ), # Center not in 3D + [], + Vector3(x=4, y=5, z=6), + Vector3(x=2, y=3, z=4), + ), # Empty boundary ], ) def test_convert_2d_to_3d_boundary_points( - boundary_points_2d: PlaneBoundaryPoints2D, - normal: PlaneNormal, - center: PlaneCenter, - should_pass: bool, + boundary: Sequence[Vector2], + normal: Vector3, + center: Vector3, ): - if should_pass: - result = convert_2d_to_3d_boundary_points(boundary_points_2d, normal, center) - assert result.shape[0] == (boundary_points_2d.shape[0]) - assert result.shape[1] == 3 - assert result.dtype == np.float32 - - else: - with pytest.raises(ValueError): - result = convert_2d_to_3d_boundary_points( - boundary_points_2d, normal, center - ) + result = _convert_2d_to_3d_boundary_points(boundary, normal, center) + if len(boundary) == 0: + np.testing.assert_array_equal(result, np.array([], dtype=np.float32)) + return + np.testing.assert_array_equal( + result, + np.array( + [ + [0.21987888, 4.3518677, 4.060191], + [-0.6701817, 5.411912, 3.7701945], + [-0.6701817, 4.6436906, 4.410379], + [0.21987888, 4.3518677, 4.060191], # Closing the boundary + ], + dtype=np.float32, + ), + ) diff --git a/python/tests/test_hooks.py b/python/tests/test_hooks.py index 2809193..f8229f5 100644 --- a/python/tests/test_hooks.py +++ b/python/tests/test_hooks.py @@ -5,49 +5,122 @@ from unittest.mock import MagicMock, patch -from arflow_grpc.service_pb2 import JoinSessionRequest, ProcessFrameRequest +import rerun as rr +from google.protobuf.timestamp_pb2 import Timestamp -from arflow import RegisterClientRequest -from arflow._types import HashableClientIdentifier -from tests.conftest import UserExtendedService +from arflow import Device +from arflow._session_stream import SessionStream +from cakelab.arflow_grpc.v1.ar_frame_pb2 import ARFrame +from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame +from cakelab.arflow_grpc.v1.create_session_request_pb2 import CreateSessionRequest +from cakelab.arflow_grpc.v1.delete_session_request_pb2 import DeleteSessionRequest +from cakelab.arflow_grpc.v1.join_session_request_pb2 import JoinSessionRequest +from cakelab.arflow_grpc.v1.save_ar_frames_request_pb2 import SaveARFramesRequest +from cakelab.arflow_grpc.v1.session_pb2 import Session, SessionUuid +from tests.conftest import TEST_APP_ID, UserExtendedService -def test_on_register(user_service_fixture: UserExtendedService): - request = RegisterClientRequest() - for i in range(3): - assert user_service_fixture.num_clients == i - user_service_fixture.RegisterClient(request) +def test_on_create_session(user_service_fixture: UserExtendedService): + request = CreateSessionRequest() + response1 = user_service_fixture.CreateSession(request) + assert user_service_fixture.num_sessions == 1 + request = CreateSessionRequest() + response2 = user_service_fixture.CreateSession(request) + assert user_service_fixture.num_sessions == 2 + # can have multiple sessions with same name (their ID will be different) + assert response1.session.metadata.name == response2.session.metadata.name + assert response1.session.id != response2.session.id -def test_on_frame_received(user_service_fixture: UserExtendedService): - config = RegisterClientRequest() - response = user_service_fixture.RegisterClient(config) - request = ProcessFrameRequest(uid=response.uid) - for i in range(3): - assert user_service_fixture.num_frames == i - user_service_fixture.ProcessFrame(request) + +def test_on_delete_session(user_service_fixture: UserExtendedService): + with patch("rerun.disconnect"): + user_service_fixture.num_sessions = 2 + user_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1")), stream=MagicMock() + ), + "session2": SessionStream( + info=Session(id=SessionUuid(value="session2")), stream=MagicMock() + ), + } + request = DeleteSessionRequest(session_id=SessionUuid(value="session1")) + user_service_fixture.DeleteSession(request) + assert user_service_fixture.num_sessions == 1 + request = DeleteSessionRequest(session_id=SessionUuid(value="session2")) + user_service_fixture.DeleteSession(request) + assert user_service_fixture.num_sessions == 0 def test_on_join_session(user_service_fixture: UserExtendedService): - request = RegisterClientRequest() - response = user_service_fixture.RegisterClient(request) - assert user_service_fixture.num_sessions == 0 - assert user_service_fixture.num_clients == 1 - join_request = JoinSessionRequest(session_uid=response.uid) - user_service_fixture.JoinSession(join_request) - assert user_service_fixture.num_sessions == 1 - assert user_service_fixture.num_clients == 2 + user_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1")), stream=MagicMock() + ), + } + for i in range(3): + device = Device( + model=f"ARPhone 12 Pro Max {i}", + name=f"ARFlow test device {i}", + type=Device.Type.TYPE_HANDHELD, + uid=f"test-device-{i}", + ) + user_service_fixture.JoinSession( + JoinSessionRequest(session_id=SessionUuid(value="session1"), device=device) + ) + assert user_service_fixture.num_clients == i + 1 + + +def test_on_save_ar_frames( + user_service_fixture: UserExtendedService, device_fixture: Device +): + recording_stream = rr.new_recording( + application_id=TEST_APP_ID, recording_id="session1", spawn=True + ) + user_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session( + id=SessionUuid(value="session1"), + devices=[device_fixture], + ), + stream=recording_stream, + ), + } + for i in range(3): + user_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=[ + ARFrame( + audio_frame=AudioFrame( + device_timestamp=Timestamp(seconds=1234, nanos=1234), + data=[1, 2, 3], + ), + ), + ARFrame( + audio_frame=AudioFrame( + device_timestamp=Timestamp(seconds=1234, nanos=1235), + data=[1, 2, 3], + ), + ), + ], + ) + ) + assert ( + user_service_fixture.num_frames_by_client[device_fixture.uid] == (i + 1) * 2 + ) -def test_on_program_exit(user_service_fixture: UserExtendedService): +def test_on_server_exit(user_service_fixture: UserExtendedService): with patch("rerun.disconnect") as mock_disconnect: mock_stream1 = MagicMock() mock_stream2 = MagicMock() - user_service_fixture._client_sessions = { - HashableClientIdentifier("client1"): MagicMock(rerun_stream=mock_stream1), - HashableClientIdentifier("client2"): MagicMock(rerun_stream=mock_stream2), + user_service_fixture.client_sessions = { + "client1": MagicMock(stream=mock_stream1), + "client2": MagicMock(stream=mock_stream2), } - user_service_fixture._on_program_exit() + user_service_fixture.on_server_exit() # Verify global disconnect was called mock_disconnect.assert_any_call() diff --git a/python/tests/test_server.py b/python/tests/test_server.py index 267b91b..432f2c0 100644 --- a/python/tests/test_server.py +++ b/python/tests/test_server.py @@ -2,41 +2,66 @@ # ruff:noqa: D103 # pyright: reportUnknownMemberType=false, reportUnknownVariableType=false, reportUnknownArgumentType=false -# We have to do the above because of the typelessness of the grpc stub +# We have to do the above because the grpc stub has no type hints from concurrent import futures +from pathlib import Path from typing import Any, Generator +from unittest.mock import ANY, patch +import DracoPy import grpc import numpy as np import pytest -from arflow_grpc import service_pb2, service_pb2_grpc -from arflow_grpc.service_pb2 import ( - JoinSessionRequest, - ProcessFrameRequest, - RegisterClientRequest, - RegisterClientResponse, -) -from arflow_grpc.service_pb2_grpc import ARFlowServiceStub +from google.protobuf.timestamp_pb2 import Timestamp from arflow import ARFlowServicer from arflow._error_interceptor import ErrorInterceptor +from cakelab.arflow_grpc.v1 import arflow_service_pb2_grpc +from cakelab.arflow_grpc.v1.ar_frame_pb2 import ARFrame +from cakelab.arflow_grpc.v1.ar_plane_pb2 import ARPlane +from cakelab.arflow_grpc.v1.arflow_service_pb2_grpc import ARFlowServiceStub +from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame +from cakelab.arflow_grpc.v1.create_session_request_pb2 import CreateSessionRequest +from cakelab.arflow_grpc.v1.create_session_response_pb2 import CreateSessionResponse +from cakelab.arflow_grpc.v1.delete_session_request_pb2 import DeleteSessionRequest +from cakelab.arflow_grpc.v1.depth_frame_pb2 import DepthFrame +from cakelab.arflow_grpc.v1.device_pb2 import Device +from cakelab.arflow_grpc.v1.get_session_request_pb2 import GetSessionRequest +from cakelab.arflow_grpc.v1.gyroscope_frame_pb2 import GyroscopeFrame +from cakelab.arflow_grpc.v1.join_session_request_pb2 import JoinSessionRequest +from cakelab.arflow_grpc.v1.join_session_response_pb2 import JoinSessionResponse +from cakelab.arflow_grpc.v1.leave_session_request_pb2 import LeaveSessionRequest +from cakelab.arflow_grpc.v1.list_sessions_request_pb2 import ListSessionsRequest +from cakelab.arflow_grpc.v1.list_sessions_response_pb2 import ListSessionsResponse +from cakelab.arflow_grpc.v1.mesh_detection_frame_pb2 import MeshDetectionFrame +from cakelab.arflow_grpc.v1.mesh_filter_pb2 import MeshFilter +from cakelab.arflow_grpc.v1.plane_detection_frame_pb2 import PlaneDetectionFrame +from cakelab.arflow_grpc.v1.quaternion_pb2 import Quaternion +from cakelab.arflow_grpc.v1.save_ar_frames_request_pb2 import SaveARFramesRequest +from cakelab.arflow_grpc.v1.session_pb2 import SessionUuid +from cakelab.arflow_grpc.v1.transform_frame_pb2 import TransformFrame +from cakelab.arflow_grpc.v1.vector2_int_pb2 import Vector2Int +from cakelab.arflow_grpc.v1.vector2_pb2 import Vector2 +from cakelab.arflow_grpc.v1.vector3_pb2 import Vector3 +from cakelab.arflow_grpc.v1.xr_cpu_image_pb2 import XRCpuImage +from tests.conftest import TEST_APP_ID @pytest.fixture(scope="function") def stub() -> Generator[ARFlowServiceStub, Any, None]: - servicer = ARFlowServicer() + servicer = ARFlowServicer(spawn_viewer=True, application_id=TEST_APP_ID) interceptors = [ErrorInterceptor()] server = grpc.server( futures.ThreadPoolExecutor( max_workers=10, ), + compression=grpc.Compression.Gzip, interceptors=interceptors, # pyright: ignore [reportArgumentType] options=[ - ("grpc.max_send_message_length", -1), ("grpc.max_receive_message_length", -1), ], ) - service_pb2_grpc.add_ARFlowServiceServicer_to_server(servicer, server) + arflow_service_pb2_grpc.add_ARFlowServiceServicer_to_server(servicer, server) port = server.add_insecure_port("[::]:0") server.start() @@ -47,258 +72,445 @@ def stub() -> Generator[ARFlowServiceStub, Any, None]: server.stop(None) -def test_register_client(stub: ARFlowServiceStub): - request = RegisterClientRequest() +def test_create_session(stub: ARFlowServiceStub): + response: CreateSessionResponse = stub.CreateSession(CreateSessionRequest()) + assert len(response.session.id.value) == 36 + assert len(stub.ListSessions(ListSessionsRequest()).sessions) == 1 - response: RegisterClientResponse = stub.RegisterClient(request) - assert len(response.uid) == 32 - - -def test_register_client_with_init_uid(stub: ARFlowServiceStub): - request = RegisterClientRequest(init_uid="1234") - - response: RegisterClientResponse = stub.RegisterClient(request) - assert response.uid == "1234" +def test_delete_session(stub: ARFlowServiceStub): + response: CreateSessionResponse = stub.CreateSession(CreateSessionRequest()) + assert len(stub.ListSessions(ListSessionsRequest()).sessions) == 1 + stub.DeleteSession(DeleteSessionRequest(session_id=response.session.id)) + assert len(stub.ListSessions(ListSessionsRequest()).sessions) == 0 + with pytest.raises(grpc.RpcError) as excinfo: + stub.DeleteSession( + DeleteSessionRequest(session_id=SessionUuid(value="nonexistent")) + ) + assert excinfo.value.code() == grpc.StatusCode.NOT_FOUND -def test_multiple_clients(stub: ARFlowServiceStub): - """Flaky since UUIDs might collide.""" - uids = [] - for _ in range(3): - request = RegisterClientRequest() - response = stub.RegisterClient(request) - assert len(response.uid) == 32 - assert response.uid not in uids - uids.append(response.uid) - assert len(uids) == 3 +def test_get_session(stub: ARFlowServiceStub): + response1: CreateSessionResponse = stub.CreateSession(CreateSessionRequest()) + response2 = stub.GetSession(GetSessionRequest(session_id=response1.session.id)) + assert response2.session == response1.session + with pytest.raises(grpc.RpcError) as excinfo: + stub.GetSession(GetSessionRequest(session_id=SessionUuid(value="nonexistent"))) + assert excinfo.value.code() == grpc.StatusCode.NOT_FOUND -def test_register_same_client_twice(stub: ARFlowServiceStub): - request = RegisterClientRequest() - response = stub.RegisterClient(request) - request.init_uid = response.uid - response = stub.RegisterClient(request) - assert response.uid == request.init_uid +def test_list_sessions(stub: ARFlowServiceStub, device_fixture: Device): + sessions = [] + for i in range(3): + response1: CreateSessionResponse = stub.CreateSession( + CreateSessionRequest( + device=Device( + model=device_fixture.model, + name=f"{device_fixture.name}_{i}", + type=device_fixture.type, + uid=f"{device_fixture.uid}_{i}", + ) + ) + ) + sessions.append(response1.session) + response2: ListSessionsResponse = stub.ListSessions(ListSessionsRequest()) + assert response2.sessions == sessions def test_join_session(stub: ARFlowServiceStub): - request = RegisterClientRequest() - register_response = stub.RegisterClient(request) - join_request = JoinSessionRequest(session_uid=register_response.uid) - join_response = stub.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != register_response.uid + response1: CreateSessionResponse = stub.CreateSession( + CreateSessionRequest(device=Device(uid="1")) + ) + assert len(response1.session.devices) == 1 + response2: JoinSessionResponse = stub.JoinSession( + JoinSessionRequest(session_id=response1.session.id, device=Device(uid="2")) + ) + assert response2.session.id == response1.session.id + assert len(response2.session.devices) == 2 def test_join_nonexistent_session(stub: ARFlowServiceStub): - request = JoinSessionRequest(session_uid="nonexistent") with pytest.raises(grpc.RpcError) as excinfo: - stub.JoinSession(request) + stub.JoinSession( + JoinSessionRequest(session_id=SessionUuid(value="nonexistent")) + ) assert excinfo.value.code() == grpc.StatusCode.NOT_FOUND -def test_join_session_multiple_clients(stub: ARFlowServiceStub): - request = RegisterClientRequest() - register_response = stub.RegisterClient(request) - for _ in range(3): - join_request = JoinSessionRequest(session_uid=register_response.uid) - join_response = stub.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != register_response.uid +def test_join_session_multiple_devices(stub: ARFlowServiceStub, device_fixture: Device): + response1: CreateSessionResponse = stub.CreateSession( + CreateSessionRequest(device=device_fixture) + ) + assert ( + len( + stub.GetSession( + GetSessionRequest(session_id=response1.session.id) + ).session.devices + ) + == 1 + ) + for i in range(3): + response2: JoinSessionResponse = stub.JoinSession( + JoinSessionRequest( + session_id=response1.session.id, device=Device(uid=f"{i}") + ) + ) + assert response2.session.id == response1.session.id + assert ( + len( + stub.GetSession( + GetSessionRequest(session_id=response2.session.id) + ).session.devices + ) + == i + 2 + ) -def test_join_session_chaining_multiple_clients( - stub: ARFlowServiceStub, -): - """Client A starts session, B joins A using A's ID, C joins B using C's ID.""" - request = RegisterClientRequest() - register_response = stub.RegisterClient(request) - join_request = JoinSessionRequest(session_uid=register_response.uid) - join_response = stub.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != register_response.uid - for _ in range(3): - previous_join_response = join_response - join_request = JoinSessionRequest(session_uid=join_response.uid) - join_response = stub.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != previous_join_response.uid - assert join_response.uid != register_response.uid - - -def test_process_frame(stub: ARFlowServiceStub): - client_config = RegisterClientRequest( - camera_color=RegisterClientRequest.CameraColor( - enabled=True, data_type="RGB24", resize_factor_x=1.0, resize_factor_y=1.0 - ), - camera_depth=RegisterClientRequest.CameraDepth( - enabled=True, data_type="f32", resolution_x=4, resolution_y=4 - ), - camera_transform=RegisterClientRequest.CameraTransform(enabled=True), - camera_point_cloud=RegisterClientRequest.CameraPointCloud(enabled=True), - camera_intrinsics=RegisterClientRequest.CameraIntrinsics( - resolution_x=4, - resolution_y=4, - focal_length_x=1.0, - focal_length_y=1.0, - principal_point_x=1.0, - principal_point_y=1.0, - ), +def test_leave_session(stub: ARFlowServiceStub): + response1 = stub.CreateSession(CreateSessionRequest(device=Device(uid="1"))) + response2: JoinSessionResponse = stub.JoinSession( + JoinSessionRequest(session_id=response1.session.id, device=Device(uid="2")) + ) + stub.LeaveSession( + LeaveSessionRequest(session_id=response2.session.id, device=Device(uid="2")) ) - response = stub.RegisterClient(client_config) - client_id = response.uid - - frame = ProcessFrameRequest( - uid=client_id, - color=np.random.randint(0, 255, 4 * 4 * 3, dtype=np.uint8).tobytes(), # pyright: ignore [reportUnknownMemberType] - depth=np.random.rand(4, 4).astype(np.float32).tobytes(), - transform=np.random.rand(12).astype(np.float32).tobytes(), + assert stub.GetSession( + GetSessionRequest(session_id=response2.session.id) + ).session.devices == [Device(uid="1")] + stub.LeaveSession( + LeaveSessionRequest(session_id=response2.session.id, device=Device(uid="1")) ) + assert ( + stub.GetSession( + GetSessionRequest(session_id=response2.session.id) + ).session.devices + == [] + ) + with pytest.raises(grpc.RpcError) as excinfo: + stub.LeaveSession( + LeaveSessionRequest(session_id=SessionUuid(value="nonexistent")) + ) + assert excinfo.value.code() == grpc.StatusCode.NOT_FOUND - response = stub.ProcessFrame(frame) - assert response.message == "OK" +def test_save_ar_frames( + stub: ARFlowServiceStub, + device_fixture: Device, +): + response1: CreateSessionResponse = stub.CreateSession( + CreateSessionRequest(device=device_fixture) + ) + with ( + patch.object( + ARFlowServicer, "on_save_transform_frames" + ) as mock_on_save_transform_frames, + patch.object( + ARFlowServicer, "on_save_color_frames" + ) as mock_on_save_color_frames, + patch.object( + ARFlowServicer, "on_save_depth_frames" + ) as mock_on_save_depth_frames, + patch.object( + ARFlowServicer, "on_save_gyroscope_frames" + ) as mock_on_save_gyroscope_frames, + patch.object( + ARFlowServicer, "on_save_audio_frames" + ) as mock_on_save_audio_frames, + patch.object( + ARFlowServicer, "on_save_plane_detection_frames" + ) as mock_on_save_plane_detection_frames, + (Path(__file__).parent / "bunny.drc").open("rb") as draco_file, + patch.object( + ARFlowServicer, "on_save_mesh_detection_frames" + ) as mock_on_save_mesh_detection_frames, + patch.object(ARFlowServicer, "on_save_ar_frames") as mock_on_save_ar_frames, + ): + transform_frames = [ + TransformFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + data=np.random.rand(12).astype(np.float32).tobytes(), + ) + ] + ar_frames = [ + ARFrame( + transform_frame=transform_frames[0], + ) + ] + stub.SaveARFrames( + SaveARFramesRequest( + session_id=response1.session.id, + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_transform_frames.assert_called_once_with( + frames=transform_frames, + # Only the session_stream key needs to be there, can be anything + # since the actual Rerun stream is in-memory and internal in the + # server and so hard to mock correctly + session_stream=ANY, + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=ANY, + device=device_fixture, + ) -def test_process_frame_with_unregistered_client(stub: ARFlowServiceStub): - invalid_frame = ProcessFrameRequest(uid="invalid_id") + # TODO: Re-enable test when workaround in YUV 420 extra padding + # workaround is fixed + # color_frames = [ + # ColorFrame( + # device_timestamp=Timestamp(seconds=0, nanos=0), + # image=XRCpuImage( + # dimensions=Vector2Int(x=4, y=4), + # format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, + # timestamp=0, + # planes=[ + # XRCpuImage.Plane( + # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + # 0, 255, (4, 4), dtype=np.uint8 + # ).tobytes(), + # pixel_stride=1, + # row_stride=4, + # ), + # XRCpuImage.Plane( + # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + # 0, 255, (2, 4), dtype=np.uint8 + # ).tobytes(), + # pixel_stride=2, + # row_stride=4, + # ), + # XRCpuImage.Plane( + # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + # 0, 255, (2, 4), dtype=np.uint8 + # ).tobytes(), + # pixel_stride=2, + # row_stride=4, + # ), + # ], + # ), + # intrinsics=Intrinsics( + # focal_length=Vector2( + # x=1.0, + # y=1.0, + # ), + # principal_point=Vector2( + # x=1.0, + # y=1.0, + # ), + # resolution=Vector2Int( + # x=4, + # y=4, + # ), + # ), + # ) + # ] + # ar_frames = [ + # ARFrame( + # color_frame=color_frames[0], + # ) + # ] + # default_service_fixture.SaveARFrames( + # SaveARFramesRequest( + # session_id=SessionUuid(value="session1"), + # device=device_fixture, + # frames=ar_frames, + # ) + # ) + # mock_on_save_color_frames.assert_called_once_with( + # frames=color_frames, + # session_stream=default_service_fixture.client_sessions["session1"], + # device=device_fixture, + # ) + # mock_on_save_ar_frames.assert_called_with( + # frames=ar_frames, + # session_stream=default_service_fixture.client_sessions["session1"], + # device=device_fixture, + # ) + + depth_frames = [ + DepthFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + environment_depth_temporal_smoothing_enabled=True, + image=XRCpuImage( + dimensions=Vector2Int(x=4, y=4), + format=XRCpuImage.FORMAT_DEPTHUINT16, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 255, (4, 4), dtype=np.uint16 + ).tobytes(), + ) + ], + ), + ) + ] + ar_frames = [ARFrame(depth_frame=depth_frames[0])] + stub.SaveARFrames( + SaveARFramesRequest( + session_id=response1.session.id, + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_depth_frames.assert_called_once_with( + frames=depth_frames, + session_stream=ANY, + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=ANY, + device=device_fixture, + ) - with pytest.raises(grpc.RpcError) as excinfo: - stub.ProcessFrame(invalid_frame) - assert excinfo.value.code() == grpc.StatusCode.NOT_FOUND + gyroscope_frames = [ + GyroscopeFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + attitude=Quaternion(x=1.0, y=2.0, z=3.0, w=4.0), + rotation_rate=Vector3(x=1.0, y=2.0, z=3.0), + gravity=Vector3(x=1.0, y=2.0, z=3.0), + acceleration=Vector3(x=1.0, y=2.0, z=3.0), + ) + ] + ar_frames = [ARFrame(gyroscope_frame=gyroscope_frames[0])] + stub.SaveARFrames( + SaveARFramesRequest( + session_id=response1.session.id, + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_gyroscope_frames.assert_called_once_with( + frames=gyroscope_frames, + session_stream=ANY, + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=ANY, + device=device_fixture, + ) + audio_frames = [ + AudioFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + data=np.random.rand(4).astype(np.float32).tobytes(), + ) + ] + ar_frames = [ARFrame(audio_frame=audio_frames[0])] + stub.SaveARFrames( + SaveARFramesRequest( + session_id=response1.session.id, + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_audio_frames.assert_called_once_with( + frames=audio_frames, + session_stream=ANY, + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=ANY, + device=device_fixture, + ) -@pytest.mark.parametrize( - "client_config", - [ - RegisterClientRequest( - camera_color=( - RegisterClientRequest.CameraColor( - enabled=True, - data_type="unknown", - ) + plane_detection_frames = [ + PlaneDetectionFrame( + state=PlaneDetectionFrame.STATE_ADDED, + device_timestamp=Timestamp(seconds=0, nanos=0), + plane=ARPlane( + center=Vector3(x=1.0, y=2.0, z=3.0), + normal=Vector3(x=1.0, y=2.0, z=3.0), + size=Vector2(x=1.0, y=2.0), + boundary=[ + Vector2(x=1.0, y=2.0), + Vector2(x=2.0, y=3.0), + Vector2(x=1.0, y=3.0), + ], + ), ) - ), - RegisterClientRequest( - camera_depth=( - RegisterClientRequest.CameraDepth( - enabled=True, - data_type="unknown", - ) + ] + ar_frames = [ARFrame(plane_detection_frame=plane_detection_frames[0])] + stub.SaveARFrames( + SaveARFramesRequest( + session_id=response1.session.id, + device=device_fixture, + frames=ar_frames, ) - ), - ], -) -def test_process_frame_with_invalid_data_types( - client_config: RegisterClientRequest, stub: ARFlowServiceStub + ) + mock_on_save_plane_detection_frames.assert_called_once_with( + frames=plane_detection_frames, + session_stream=ANY, + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=ANY, + device=device_fixture, + ) + + # TODO: point cloud detection + + mesh = DracoPy.decode(draco_file.read()) # pyright: ignore [reportUnknownMemberType, reportUnknownVariableType] + mesh_detection_frames = [ + MeshDetectionFrame( + state=MeshDetectionFrame.STATE_ADDED, + device_timestamp=Timestamp(seconds=0, nanos=0), + mesh_filter=MeshFilter( + instance_id=1234, + mesh=MeshFilter.EncodedMesh( + sub_meshes=[ + MeshFilter.EncodedMesh.EncodedSubMesh( + data=DracoPy.encode( # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType] + mesh.points, # pyright: ignore [reportUnknownMemberType] + faces=mesh.faces, # pyright: ignore [reportUnknownMemberType] + colors=mesh.colors, # pyright: ignore [reportUnknownMemberType] + ), + ) + ], + ), + ), + ) + ] + ar_frames = [ARFrame(mesh_detection_frame=mesh_detection_frames[0])] + stub.SaveARFrames( + SaveARFramesRequest( + session_id=response1.session.id, + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_mesh_detection_frames.assert_called_once_with( + frames=mesh_detection_frames, + session_stream=ANY, + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=ANY, + device=device_fixture, + ) + + +def test_save_ar_frames_with_nonexistent_session( + stub: ARFlowServiceStub, ): - response = stub.RegisterClient(client_config) - client_id = response.uid - invalid_frame = ProcessFrameRequest( - uid=client_id, - ) with pytest.raises(grpc.RpcError) as excinfo: - stub.ProcessFrame(invalid_frame) + stub.SaveARFrames( + SaveARFramesRequest(session_id=SessionUuid(value="invalid_id")) + ) assert excinfo.value.code() == grpc.StatusCode.INVALID_ARGUMENT -@pytest.mark.parametrize( - "client_config, corrupted_frame", - [ - ( - RegisterClientRequest( - camera_color=RegisterClientRequest.CameraColor( - enabled=True, - data_type="RGB24", - resize_factor_x=1.0, - resize_factor_y=1.0, - ), - camera_intrinsics=RegisterClientRequest.CameraIntrinsics( - resolution_x=4, - resolution_y=4, - ), - ), - ProcessFrameRequest( - color=np.random.randint( # pyright: ignore [reportUnknownMemberType] - 0, 255, (4, 4, 2), dtype=np.uint8 - ).tobytes(), # Incorrect size - ), - ), - ( - RegisterClientRequest( - camera_color=RegisterClientRequest.CameraColor( - enabled=False, - ), - camera_depth=RegisterClientRequest.CameraDepth( - enabled=True, resolution_x=4, resolution_y=4, data_type="f32" - ), - ), - ProcessFrameRequest( - depth=np.random.rand(4 * 4) - .astype(np.float32) - .tobytes()[:1], # Incorrect size - ), - ), - ( - RegisterClientRequest( - camera_color=RegisterClientRequest.CameraColor( - enabled=False, - resize_factor_x=1.0, - resize_factor_y=1.0, - ), - camera_transform=RegisterClientRequest.CameraTransform(enabled=True), - camera_intrinsics=RegisterClientRequest.CameraIntrinsics( - focal_length_x=1.0, - focal_length_y=1.0, - principal_point_x=1.0, - principal_point_y=1.0, - ), - ), - ProcessFrameRequest( - transform=np.random.rand(8 // 4) - .astype(np.float32) - .tobytes(), # Incorrect size - ), - ), - ( - RegisterClientRequest( - camera_plane_detection=RegisterClientRequest.CameraPlaneDetection( - enabled=True - ), - ), - ProcessFrameRequest( - plane_detection=[ - service_pb2.ProcessFrameRequest.Plane( - center=service_pb2.ProcessFrameRequest.Vector3( - x=1.0, y=2.0, z=3.0 - ), - normal=service_pb2.ProcessFrameRequest.Vector3( - x=1.0, y=2.0, z=3.0 - ), - size=service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0), - boundary_points=[ - service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0), - service_pb2.ProcessFrameRequest.Vector2(x=2.0, y=3.0), - # Missing one point - ], - ) - ], - ), - ), - ], -) -def test_process_frame_with_corrupted_data( - client_config: RegisterClientRequest, - corrupted_frame: ProcessFrameRequest, - stub: ARFlowServiceStub, +def test_save_ar_frames_with_nonexistent_device_in_existing_session( + stub: ARFlowServiceStub, device_fixture: Device ): - response = stub.RegisterClient( - client_config, - ) - corrupted_frame.uid = response.uid - + stub.CreateSession(CreateSessionRequest(device=device_fixture)) with pytest.raises(grpc.RpcError) as excinfo: - stub.ProcessFrame( - corrupted_frame, - ) + stub.SaveARFrames(SaveARFramesRequest(device=device_fixture)) assert excinfo.value.code() == grpc.StatusCode.INVALID_ARGUMENT diff --git a/python/tests/test_service.py b/python/tests/test_service.py index 137ef1b..aa2fdef 100644 --- a/python/tests/test_service.py +++ b/python/tests/test_service.py @@ -4,7 +4,7 @@ # pyright: reportPrivateUsage=false from pathlib import Path -from unittest.mock import patch +from unittest.mock import MagicMock, patch import DracoPy import grpc @@ -12,11 +12,35 @@ import grpc_interceptor.exceptions import numpy as np import pytest -from arflow_grpc import service_pb2 -from arflow_grpc.service_pb2 import JoinSessionRequest, ProcessFrameRequest - -from arflow import ARFlowServicer, DecodedDataFrame, RegisterClientRequest -from arflow._types import HashableClientIdentifier +import rerun as rr +from google.protobuf.timestamp_pb2 import Timestamp + +from arflow import ARFlowServicer +from arflow._session_stream import SessionStream +from cakelab.arflow_grpc.v1.ar_frame_pb2 import ARFrame +from cakelab.arflow_grpc.v1.ar_plane_pb2 import ARPlane +from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame +from cakelab.arflow_grpc.v1.create_session_request_pb2 import CreateSessionRequest +from cakelab.arflow_grpc.v1.delete_session_request_pb2 import DeleteSessionRequest +from cakelab.arflow_grpc.v1.depth_frame_pb2 import DepthFrame +from cakelab.arflow_grpc.v1.device_pb2 import Device +from cakelab.arflow_grpc.v1.get_session_request_pb2 import GetSessionRequest +from cakelab.arflow_grpc.v1.gyroscope_frame_pb2 import GyroscopeFrame +from cakelab.arflow_grpc.v1.join_session_request_pb2 import JoinSessionRequest +from cakelab.arflow_grpc.v1.leave_session_request_pb2 import LeaveSessionRequest +from cakelab.arflow_grpc.v1.list_sessions_request_pb2 import ListSessionsRequest +from cakelab.arflow_grpc.v1.mesh_detection_frame_pb2 import MeshDetectionFrame +from cakelab.arflow_grpc.v1.mesh_filter_pb2 import MeshFilter +from cakelab.arflow_grpc.v1.plane_detection_frame_pb2 import PlaneDetectionFrame +from cakelab.arflow_grpc.v1.quaternion_pb2 import Quaternion +from cakelab.arflow_grpc.v1.save_ar_frames_request_pb2 import SaveARFramesRequest +from cakelab.arflow_grpc.v1.session_pb2 import Session, SessionUuid +from cakelab.arflow_grpc.v1.transform_frame_pb2 import TransformFrame +from cakelab.arflow_grpc.v1.vector2_int_pb2 import Vector2Int +from cakelab.arflow_grpc.v1.vector2_pb2 import Vector2 +from cakelab.arflow_grpc.v1.vector3_pb2 import Vector3 +from cakelab.arflow_grpc.v1.xr_cpu_image_pb2 import XRCpuImage +from tests.conftest import TEST_APP_ID @pytest.mark.parametrize( @@ -28,343 +52,494 @@ def test_invalid_servicer_init(spawn_viewer: bool, save_dir: Path | None): ARFlowServicer(spawn_viewer=spawn_viewer, save_dir=save_dir) -def test_register_client(default_service_fixture: ARFlowServicer): - request = RegisterClientRequest() - response = default_service_fixture.RegisterClient(request) - assert len(response.uid) == 32 - +def test_create_session(default_service_fixture: ARFlowServicer): + request = CreateSessionRequest() + response = default_service_fixture.CreateSession(request) + assert len(response.session.id.value) == 36 -def test_register_client_with_init_uid(default_service_fixture: ARFlowServicer): - request = RegisterClientRequest(init_uid="1234") - response = default_service_fixture.RegisterClient(request) - assert response.uid == "1234" - -def test_register_client_with_save_dir( - service_fixture_with_save_dir: ARFlowServicer, tmp_path: Path +def test_create_session_with_save_dir( + service_fixture_with_save_dir: ARFlowServicer, ): - request = RegisterClientRequest() - assert service_fixture_with_save_dir._save_dir == tmp_path - + request = CreateSessionRequest() with patch("rerun.save") as mock_save: - service_fixture_with_save_dir.RegisterClient(request) + service_fixture_with_save_dir.CreateSession(request) mock_save.assert_called_once() -def test_multiple_clients(default_service_fixture: ARFlowServicer): - """Flaky since UUIDs might collide.""" - # Register multiple clients - for _ in range(3): - request = RegisterClientRequest() - response = default_service_fixture.RegisterClient(request) - assert len(response.uid) == 32 +def test_delete_session(default_service_fixture: ARFlowServicer): + with patch("rerun.disconnect"): + default_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1")), stream=MagicMock() + ), + } + request = DeleteSessionRequest(session_id=SessionUuid(value="session1")) + default_service_fixture.DeleteSession(request) + assert default_service_fixture.client_sessions == {} + with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo: + default_service_fixture.DeleteSession( + DeleteSessionRequest(session_id=SessionUuid(value="nonexistent")) + ) + assert excinfo.value.status_code == grpc.StatusCode.NOT_FOUND - assert len(default_service_fixture._client_sessions) == 3 +def test_get_session(default_service_fixture: ARFlowServicer): + default_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1")), stream=MagicMock() + ), + } + request = GetSessionRequest(session_id=SessionUuid(value="session1")) + response = default_service_fixture.GetSession(request) + assert response.session.id.value == "session1" + with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo: + default_service_fixture.GetSession( + GetSessionRequest(session_id=SessionUuid(value="nonexistent")) + ) + assert excinfo.value.status_code == grpc.StatusCode.NOT_FOUND -def test_register_same_client_twice(default_service_fixture: ARFlowServicer): - request = RegisterClientRequest() - response1 = default_service_fixture.RegisterClient(request) - request.init_uid = response1.uid - response2 = default_service_fixture.RegisterClient(request) - assert response1.uid == response2.uid +def test_list_sessions(default_service_fixture: ARFlowServicer): + sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1")), stream=MagicMock() + ), + "session2": SessionStream( + info=Session(id=SessionUuid(value="session2")), stream=MagicMock() + ), + "session3": SessionStream( + info=Session(id=SessionUuid(value="session3")), stream=MagicMock() + ), + } + default_service_fixture.client_sessions = sessions + request = ListSessionsRequest() + response = default_service_fixture.ListSessions(request) + assert response.sessions == [s.info for s in sessions.values()] def test_join_session(default_service_fixture: ARFlowServicer): - request = RegisterClientRequest() - register_response = default_service_fixture.RegisterClient(request) - join_request = JoinSessionRequest(session_uid=register_response.uid) - join_response = default_service_fixture.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != register_response.uid + default_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1")), stream=MagicMock() + ), + } + request = JoinSessionRequest(session_id=SessionUuid(value="session1")) + response = default_service_fixture.JoinSession(request) + assert response.session.id.value == "session1" def test_join_nonexistent_session(default_service_fixture: ARFlowServicer): - request = JoinSessionRequest(session_uid="nonexistent") + request = JoinSessionRequest(session_id=SessionUuid(value="nonexistent")) with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo: default_service_fixture.JoinSession(request) assert excinfo.value.status_code == grpc.StatusCode.NOT_FOUND -def test_join_session_multiple_clients(default_service_fixture: ARFlowServicer): - request = RegisterClientRequest() - register_response = default_service_fixture.RegisterClient(request) - for _ in range(3): - join_request = JoinSessionRequest(session_uid=register_response.uid) - join_response = default_service_fixture.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != register_response.uid +def test_join_session_multiple_devices(default_service_fixture: ARFlowServicer): + default_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1")), stream=MagicMock() + ), + } + for i in range(3): + join_request = JoinSessionRequest( + session_id=SessionUuid(value="session1"), + device=Device(name=f"name_{i}"), + ) + default_service_fixture.JoinSession(join_request) + assert ( + len(default_service_fixture.client_sessions["session1"].info.devices) + == i + 1 + ) -def test_join_session_chaining_multiple_clients( - default_service_fixture: ARFlowServicer, +def test_leave_session(default_service_fixture: ARFlowServicer, device_fixture: Device): + default_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session(id=SessionUuid(value="session1"), devices=[device_fixture]), + stream=MagicMock(), + ), + } + request = LeaveSessionRequest( + session_id=SessionUuid(value="session1"), device=device_fixture + ) + default_service_fixture.LeaveSession(request) + assert default_service_fixture.client_sessions["session1"].info.devices == [] + + +def test_leave_nonexistent_session( + default_service_fixture: ARFlowServicer, device_fixture: Device ): - """Client A starts session, B joins A using A's ID, C joins B using C's ID.""" - request = RegisterClientRequest() - register_response = default_service_fixture.RegisterClient(request) - join_request = JoinSessionRequest(session_uid=register_response.uid) - join_response = default_service_fixture.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != register_response.uid - for _ in range(3): - previous_join_response = join_response - join_request = JoinSessionRequest(session_uid=join_response.uid) - join_response = default_service_fixture.JoinSession(join_request) - assert len(join_response.uid) == 32 - assert join_response.uid != previous_join_response.uid - assert join_response.uid != register_response.uid + request = LeaveSessionRequest( + session_id=SessionUuid(value="nonexistent"), device=device_fixture + ) + with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo: + default_service_fixture.LeaveSession(request) + assert excinfo.value.status_code == grpc.StatusCode.NOT_FOUND -@pytest.mark.parametrize( - "client_config,expected_enabled", - [ - ( - RegisterClientRequest( - camera_color=RegisterClientRequest.CameraColor(enabled=True) - ), - True, - ), - ( - RegisterClientRequest( - camera_color=RegisterClientRequest.CameraColor(enabled=False) +def test_leave_session_multiple_devices( + default_service_fixture: ARFlowServicer, device_fixture: Device +): + devices = [ + Device( + model=device_fixture.model, + name=f"{device_fixture.name}_{i}", + type=device_fixture.type, + uid=f"{device_fixture.uid}_{i}", + ) + for i in range(3) + ] + default_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session( + id=SessionUuid(value="session1"), + devices=devices, ), - False, + stream=MagicMock(), ), - ], -) -def test_ensure_correct_config( + } + for i, device in enumerate(devices): + request = LeaveSessionRequest( + session_id=SessionUuid(value="session1"), device=device + ) + default_service_fixture.LeaveSession(request) + assert ( + len(default_service_fixture.client_sessions["session1"].info.devices) + == len(devices) - 1 - i + ) + + +def test_save_ar_frames( default_service_fixture: ARFlowServicer, - client_config: RegisterClientRequest, - expected_enabled: bool, + device_fixture: Device, ): - response = default_service_fixture.RegisterClient(client_config) - client_id = HashableClientIdentifier(response.uid) - assert ( - default_service_fixture._client_sessions[client_id].config.camera_color.enabled - == expected_enabled + recording_stream = rr.new_recording( + application_id=TEST_APP_ID, recording_id="session1", spawn=True ) - - -def test_process_frame(default_service_fixture: ARFlowServicer): - client_config = RegisterClientRequest( - camera_color=RegisterClientRequest.CameraColor( - enabled=True, data_type="RGB24", resize_factor_x=1.0, resize_factor_y=1.0 - ), - camera_depth=RegisterClientRequest.CameraDepth( - enabled=True, data_type="f32", resolution_x=4, resolution_y=4 - ), - camera_transform=RegisterClientRequest.CameraTransform(enabled=True), - camera_point_cloud=RegisterClientRequest.CameraPointCloud(enabled=True), - camera_intrinsics=RegisterClientRequest.CameraIntrinsics( - resolution_x=4, - resolution_y=4, - focal_length_x=1.0, - focal_length_y=1.0, - principal_point_x=1.0, - principal_point_y=1.0, + default_service_fixture.client_sessions = { + "session1": SessionStream( + info=Session( + id=SessionUuid(value="session1"), + devices=[device_fixture], + ), + stream=recording_stream, ), - camera_plane_detection=RegisterClientRequest.CameraPlaneDetection(enabled=True), - gyroscope=RegisterClientRequest.Gyroscope(enabled=True), - audio=RegisterClientRequest.Audio(enabled=True), - meshing=RegisterClientRequest.Meshing(enabled=True), - ) - response = default_service_fixture.RegisterClient(client_config) - client_id = response.uid + } + + with ( + patch.object( + default_service_fixture, "on_save_transform_frames" + ) as mock_on_save_transform_frames, + patch.object( + default_service_fixture, "on_save_color_frames" + ) as mock_on_save_color_frames, + patch.object( + default_service_fixture, "on_save_depth_frames" + ) as mock_on_save_depth_frames, + patch.object( + default_service_fixture, "on_save_gyroscope_frames" + ) as mock_on_save_gyroscope_frames, + patch.object( + default_service_fixture, "on_save_audio_frames" + ) as mock_on_save_audio_frames, + patch.object( + default_service_fixture, "on_save_plane_detection_frames" + ) as mock_on_save_plane_detection_frames, + (Path(__file__).parent / "bunny.drc").open("rb") as draco_file, + patch.object( + default_service_fixture, "on_save_mesh_detection_frames" + ) as mock_on_save_mesh_detection_frames, + patch.object( + default_service_fixture, "on_save_ar_frames" + ) as mock_on_save_ar_frames, + ): + transform_frames = [ + TransformFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + data=np.random.rand(12).astype(np.float32).tobytes(), + ) + ] + ar_frames = [ + ARFrame( + transform_frame=transform_frames[0], + ) + ] + default_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_transform_frames.assert_called_once_with( + frames=transform_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) - with (Path(__file__).parent / "bunny.drc").open("rb") as draco_file: - mesh = DracoPy.decode(draco_file.read()) # pyright: ignore [reportUnknownMemberType, reportUnknownVariableType] - mock_frame = ProcessFrameRequest( - uid=client_id, - color=np.random.randint(0, 255, 4 * 4 * 3, dtype=np.uint8).tobytes(), # pyright: ignore [reportUnknownMemberType] - depth=np.random.rand(4, 4).astype(np.float32).tobytes(), - transform=np.random.rand(12).astype(np.float32).tobytes(), - plane_detection=[ - service_pb2.ProcessFrameRequest.Plane( - center=service_pb2.ProcessFrameRequest.Vector3(x=1.0, y=2.0, z=3.0), - normal=service_pb2.ProcessFrameRequest.Vector3(x=1.0, y=2.0, z=3.0), - size=service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0), - boundary_points=[ - service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0), - service_pb2.ProcessFrameRequest.Vector2(x=2.0, y=3.0), - service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=3.0), + # TODO: Re-enable test when workaround in YUV 420 extra padding + # workaround is fixed + # color_frames = [ + # ColorFrame( + # device_timestamp=Timestamp(seconds=0, nanos=0), + # image=XRCpuImage( + # dimensions=Vector2Int(x=4, y=4), + # format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, + # timestamp=0, + # planes=[ + # XRCpuImage.Plane( + # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + # 0, 255, (4, 4), dtype=np.uint8 + # ).tobytes(), + # pixel_stride=1, + # row_stride=4, + # ), + # XRCpuImage.Plane( + # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + # 0, 255, (2, 4), dtype=np.uint8 + # ).tobytes(), + # pixel_stride=2, + # row_stride=4, + # ), + # XRCpuImage.Plane( + # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + # 0, 255, (2, 4), dtype=np.uint8 + # ).tobytes(), + # pixel_stride=2, + # row_stride=4, + # ), + # ], + # ), + # intrinsics=Intrinsics( + # focal_length=Vector2( + # x=1.0, + # y=1.0, + # ), + # principal_point=Vector2( + # x=1.0, + # y=1.0, + # ), + # resolution=Vector2Int( + # x=4, + # y=4, + # ), + # ), + # ) + # ] + # ar_frames = [ + # ARFrame( + # color_frame=color_frames[0], + # ) + # ] + # default_service_fixture.SaveARFrames( + # SaveARFramesRequest( + # session_id=SessionUuid(value="session1"), + # device=device_fixture, + # frames=ar_frames, + # ) + # ) + # mock_on_save_color_frames.assert_called_once_with( + # frames=color_frames, + # session_stream=default_service_fixture.client_sessions["session1"], + # device=device_fixture, + # ) + # mock_on_save_ar_frames.assert_called_with( + # frames=ar_frames, + # session_stream=default_service_fixture.client_sessions["session1"], + # device=device_fixture, + # ) + + depth_frames = [ + DepthFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + environment_depth_temporal_smoothing_enabled=True, + image=XRCpuImage( + dimensions=Vector2Int(x=4, y=4), + format=XRCpuImage.FORMAT_DEPTHUINT16, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 255, (4, 4), dtype=np.uint16 + ).tobytes(), + ) ], - ) - ], - gyroscope=service_pb2.ProcessFrameRequest.GyroscopeData( - attitude=service_pb2.ProcessFrameRequest.Quaternion( - x=1.0, y=2.0, z=3.0, w=4.0 ), - rotation_rate=service_pb2.ProcessFrameRequest.Vector3( - x=1.0, y=2.0, z=3.0 - ), - gravity=service_pb2.ProcessFrameRequest.Vector3(x=1.0, y=2.0, z=3.0), - acceleration=service_pb2.ProcessFrameRequest.Vector3( - x=1.0, y=2.0, z=3.0 - ), - ), - audio_data=np.random.rand(4).astype(np.float32), - meshes=[ - service_pb2.ProcessFrameRequest.Mesh( - data=DracoPy.encode( # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType] - mesh.points, # pyright: ignore [reportUnknownMemberType] - faces=mesh.faces, # pyright: ignore [reportUnknownMemberType] - colors=mesh.colors, # pyright: ignore [reportUnknownMemberType] - ) - ) - ], + ) + ] + ar_frames = [ARFrame(depth_frame=depth_frames[0])] + default_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_depth_frames.assert_called_once_with( + frames=depth_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, ) - with patch.object(default_service_fixture, "on_frame_received") as mock_on_frame: - response = default_service_fixture.ProcessFrame(mock_frame) - assert response.message == "OK" - mock_on_frame.assert_called_once() - assert isinstance(mock_on_frame.call_args[0][0], DecodedDataFrame) + gyroscope_frames = [ + GyroscopeFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + attitude=Quaternion(x=1.0, y=2.0, z=3.0, w=4.0), + rotation_rate=Vector3(x=1.0, y=2.0, z=3.0), + gravity=Vector3(x=1.0, y=2.0, z=3.0), + acceleration=Vector3(x=1.0, y=2.0, z=3.0), + ) + ] + ar_frames = [ARFrame(gyroscope_frame=gyroscope_frames[0])] + default_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_gyroscope_frames.assert_called_once_with( + frames=gyroscope_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + audio_frames = [ + AudioFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + data=np.random.rand(4).astype(np.float32).tobytes(), + ) + ] + ar_frames = [ARFrame(audio_frame=audio_frames[0])] + default_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_audio_frames.assert_called_once_with( + frames=audio_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) -def test_process_frame_with_unregistered_client( - default_service_fixture: ARFlowServicer, -): - invalid_frame = ProcessFrameRequest(uid="invalid_id") - with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo: - default_service_fixture.ProcessFrame(invalid_frame) - assert excinfo.value.status_code == grpc.StatusCode.NOT_FOUND + plane_detection_frames = [ + PlaneDetectionFrame( + state=PlaneDetectionFrame.STATE_ADDED, + device_timestamp=Timestamp(seconds=0, nanos=0), + plane=ARPlane( + center=Vector3(x=1.0, y=2.0, z=3.0), + normal=Vector3(x=1.0, y=2.0, z=3.0), + size=Vector2(x=1.0, y=2.0), + boundary=[ + Vector2(x=1.0, y=2.0), + Vector2(x=2.0, y=3.0), + Vector2(x=1.0, y=3.0), + ], + ), + ) + ] + ar_frames = [ARFrame(plane_detection_frame=plane_detection_frames[0])] + default_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_plane_detection_frames.assert_called_once_with( + frames=plane_detection_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + # TODO: point cloud detection -@pytest.mark.parametrize( - "client_config", - [ - RegisterClientRequest( - camera_color=( - RegisterClientRequest.CameraColor( - enabled=True, - data_type="unknown", - ) + mesh = DracoPy.decode(draco_file.read()) # pyright: ignore [reportUnknownMemberType, reportUnknownVariableType] + mesh_detection_frames = [ + MeshDetectionFrame( + state=MeshDetectionFrame.STATE_ADDED, + device_timestamp=Timestamp(seconds=0, nanos=0), + mesh_filter=MeshFilter( + instance_id=1234, + mesh=MeshFilter.EncodedMesh( + sub_meshes=[ + MeshFilter.EncodedMesh.EncodedSubMesh( + data=DracoPy.encode( # pyright: ignore [reportUnknownMemberType, reportUnknownArgumentType] + mesh.points, # pyright: ignore [reportUnknownMemberType] + faces=mesh.faces, # pyright: ignore [reportUnknownMemberType] + colors=mesh.colors, # pyright: ignore [reportUnknownMemberType] + ), + ) + ], + ), + ), ) - ), - RegisterClientRequest( - camera_depth=( - RegisterClientRequest.CameraDepth( - enabled=True, - data_type="unknown", - ) + ] + ar_frames = [ARFrame(mesh_detection_frame=mesh_detection_frames[0])] + default_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=ar_frames, ) - ), - ], -) -def test_process_frame_with_invalid_data_types( - client_config: RegisterClientRequest, default_service_fixture: ARFlowServicer + ) + mock_on_save_mesh_detection_frames.assert_called_once_with( + frames=mesh_detection_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + + +def test_save_ar_frames_with_nonexistent_session( + default_service_fixture: ARFlowServicer, ): - response = default_service_fixture.RegisterClient(client_config) - client_id = response.uid - invalid_frame = ProcessFrameRequest( - uid=client_id, - ) + invalid_frame = SaveARFramesRequest(session_id=SessionUuid(value="invalid_id")) with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo: - default_service_fixture.ProcessFrame(invalid_frame) + default_service_fixture.SaveARFrames(invalid_frame) assert excinfo.value.status_code == grpc.StatusCode.INVALID_ARGUMENT -@pytest.mark.parametrize( - "client_config, corrupted_frame", - [ - ( - RegisterClientRequest( - init_uid="1234", - camera_color=RegisterClientRequest.CameraColor( - enabled=True, - data_type="RGB24", - resize_factor_x=1.0, - resize_factor_y=1.0, - ), - camera_intrinsics=RegisterClientRequest.CameraIntrinsics( - resolution_x=4, - resolution_y=4, - ), - ), - ProcessFrameRequest( - uid="1234", - color=np.random.randint( # pyright: ignore [reportUnknownMemberType] - 0, 255, (4, 4, 2), dtype=np.uint8 - ).tobytes(), # Incorrect size - ), - ), - ( - RegisterClientRequest( - init_uid="1234", - camera_depth=RegisterClientRequest.CameraDepth( - enabled=True, resolution_x=4, resolution_y=4, data_type="f32" - ), - ), - ProcessFrameRequest( - uid="1234", - depth=np.random.rand(4 * 4) - .astype(np.float32) - .tobytes()[:1], # Incorrect size - ), - ), - ( - RegisterClientRequest( - init_uid="1234", - camera_color=RegisterClientRequest.CameraColor( - resize_factor_x=1.0, - resize_factor_y=1.0, - ), - camera_transform=RegisterClientRequest.CameraTransform(enabled=True), - camera_intrinsics=RegisterClientRequest.CameraIntrinsics( - focal_length_x=1.0, - focal_length_y=1.0, - principal_point_x=1.0, - principal_point_y=1.0, - ), - ), - ProcessFrameRequest( - uid="1234", - transform=np.random.rand(8 // 4) - .astype(np.float32) - .tobytes(), # Incorrect size - ), - ), - ( - RegisterClientRequest( - init_uid="1234", - camera_plane_detection=RegisterClientRequest.CameraPlaneDetection( - enabled=True - ), - ), - ProcessFrameRequest( - uid="1234", - plane_detection=[ - service_pb2.ProcessFrameRequest.Plane( - center=service_pb2.ProcessFrameRequest.Vector3( - x=1.0, y=2.0, z=3.0 - ), - normal=service_pb2.ProcessFrameRequest.Vector3( - x=1.0, y=2.0, z=3.0 - ), - size=service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0), - boundary_points=[ - service_pb2.ProcessFrameRequest.Vector2(x=1.0, y=2.0), - service_pb2.ProcessFrameRequest.Vector2(x=2.0, y=3.0), - # Missing one point - ], - ) - ], - ), - ), - ], -) -def test_process_frame_with_corrupted_data( - client_config: RegisterClientRequest, - corrupted_frame: ProcessFrameRequest, - default_service_fixture: ARFlowServicer, +def test_save_ar_frames_with_nonexistent_device_in_existing_session( + default_service_fixture: ARFlowServicer, device_fixture: Device ): - default_service_fixture.RegisterClient( - client_config, - ) - - with pytest.raises(grpc_interceptor.exceptions.InvalidArgument) as excinfo: - default_service_fixture.ProcessFrame( - corrupted_frame, - ) + default_service_fixture.client_sessions = { + "session1": MagicMock(), + } + invalid_frame = SaveARFramesRequest(device=device_fixture) + with pytest.raises(grpc_interceptor.exceptions.GrpcException) as excinfo: + default_service_fixture.SaveARFrames(invalid_frame) assert excinfo.value.status_code == grpc.StatusCode.INVALID_ARGUMENT From a85765bd9b7b32758a24326ba3b3fb9e28f3847a Mon Sep 17 00:00:00 2001 From: Khang Luu Date: Fri, 24 Jan 2025 13:26:50 -0500 Subject: [PATCH 04/21] chore: Move transform into seperate entity path (origin pairing is done on client), and add cmt for byte pad --- python/arflow/_session_stream.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/arflow/_session_stream.py b/python/arflow/_session_stream.py index fc98568..d5342dc 100644 --- a/python/arflow/_session_stream.py +++ b/python/arflow/_session_stream.py @@ -67,6 +67,7 @@ def save_transform_frames( [ f"{self.info.metadata.name}_{self.info.id.value}", f"{device.model}_{device.name}_{device.uid}", + ARFrameType.TRANSFORM_FRAME, ] ) rr.log( @@ -78,7 +79,8 @@ def save_transform_frames( t = np.array([np.frombuffer(frame.data, dtype=np.float32) for frame in frames]) transforms = np.array([np.eye(4, dtype=np.float32) for _ in range(len(frames))]) transforms[:, :3, :] = t.reshape((len(frames), 3, 4)) - # transforms[:, :3, 3] = 0 + + # TODO: Do we need to flip Y? transforms = y_down_to_y_up @ transforms rr.send_columns( entity_path, @@ -847,7 +849,8 @@ def _to_i420_format(image: XRCpuImage) -> npt.NDArray[np.uint8]: ) # Downsample and pack U and V planes u_data = ( - # TODO: Fix this workaround + # Have to pad an extra byte due to how the Android image format was captured. Check: + # https://stackoverflow.com/questions/51399908/yuv-420-888-byte-format/62090742 np.frombuffer(u_plane.data + b"\x00", dtype=np.uint8) # pad an extra byte .reshape((uv_height, u_plane.row_stride))[ From 73374325b36b8b5b819a9020c2bd0bb528f14ef5 Mon Sep 17 00:00:00 2001 From: felixngfender Date: Wed, 29 Jan 2025 00:02:32 -0500 Subject: [PATCH 05/21] chore(server): benchmarks scaffolding --- python/.gitignore | 4 + python/Dockerfile | 56 ++++++ python/arflow/_cli.py | 2 +- python/benchmarks/BENCHMARKING.md | 6 + python/benchmarks/analyze.sh | 26 +++ python/benchmarks/analyze/results_analyze.rb | 75 ++++++++ python/benchmarks/bench.sh | 162 ++++++++++++++++++ python/benchmarks/build.sh | 42 +++++ python/benchmarks/clean.sh | 12 ++ python/benchmarks/collect_stats.sh | 16 ++ python/benchmarks/example_benchmark.sh | 19 ++ python/benchmarks/generate_ci.sh | 114 ++++++++++++ python/benchmarks/generate_payload.py | 51 ++++++ .../scenarios/complex_proto/payload | 1 + python/benchmarks/setup_scenario.sh | 13 ++ 15 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 python/Dockerfile create mode 100644 python/benchmarks/BENCHMARKING.md create mode 100755 python/benchmarks/analyze.sh create mode 100644 python/benchmarks/analyze/results_analyze.rb create mode 100755 python/benchmarks/bench.sh create mode 100755 python/benchmarks/build.sh create mode 100755 python/benchmarks/clean.sh create mode 100755 python/benchmarks/collect_stats.sh create mode 100755 python/benchmarks/example_benchmark.sh create mode 100755 python/benchmarks/generate_ci.sh create mode 100755 python/benchmarks/generate_payload.py create mode 100644 python/benchmarks/scenarios/complex_proto/payload create mode 100755 python/benchmarks/setup_scenario.sh diff --git a/python/.gitignore b/python/.gitignore index 5796384..4e75a16 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -181,3 +181,7 @@ pyrightconfig.json # data files *.rrd + +# benchmark artifacts +benchmarks/payload +benchmarks/results diff --git a/python/Dockerfile b/python/Dockerfile new file mode 100644 index 0000000..1943a56 --- /dev/null +++ b/python/Dockerfile @@ -0,0 +1,56 @@ +# TODO: remove +# FROm python:3.12-slim-bookworm +# +# WORKDIR /app +# COPY python_grpc_bench /app +# COPY proto /app/proto +# +# RUN python -m pip install grpcio grpcio-tools +# RUN python -m grpc_tools.protoc -I/app/proto/helloworld --python_out=. --grpc_python_out=. helloworld.proto +# +# ENTRYPOINT [ "python", "/app/server.py" ] + +# FROM python:3.12-alpine AS base +FROM python:3.12-slim-bookworm AS base + +ENV VIRTUAL_ENV=/app/.venv \ + PATH="/app/.venv/bin:$PATH" + +# RUN apk update && \ +# apk add libpq + + +FROM base AS builder + +ENV POETRY_NO_INTERACTION=1 \ + POETRY_VIRTUALENVS_IN_PROJECT=1 \ + POETRY_VIRTUALENVS_CREATE=1 \ + POETRY_CACHE_DIR=/tmp/poetry_cache + +# RUN apk update && \ +# apk add musl-dev build-base gcc gfortran openblas-dev + +WORKDIR /app + +RUN pip install --no-cache-dir poetry==1.8.4 + +COPY pyproject.toml poetry.lock ./ +RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR; + + +FROM base AS runtime + +COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} + + +WORKDIR /app + +COPY arflow ./arflow +COPY cakelab ./cakelab + +EXPOSE 8500 + +ENV PORT=8500 + +# TODO: Vary entrypoint to include save mode +ENTRYPOINT ["python", "-m", "arflow._cli", "view"] diff --git a/python/arflow/_cli.py b/python/arflow/_cli.py index 045cbd3..e561325 100644 --- a/python/arflow/_cli.py +++ b/python/arflow/_cli.py @@ -100,7 +100,7 @@ def parse_args( "-p", "--port", type=int, - default=8500, + default=int(os.getenv("PORT", 8500)), help=f"Port to run the server on (default: %(default)s).", ) view_parser.add_argument( diff --git a/python/benchmarks/BENCHMARKING.md b/python/benchmarks/BENCHMARKING.md new file mode 100644 index 0000000..719c1f2 --- /dev/null +++ b/python/benchmarks/BENCHMARKING.md @@ -0,0 +1,6 @@ +Taken from . Instructions to run are +in their README. + +```shell +poetry run ./generate_payload.py +``` diff --git a/python/benchmarks/analyze.sh b/python/benchmarks/analyze.sh new file mode 100755 index 0000000..e3d7404 --- /dev/null +++ b/python/benchmarks/analyze.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env sh +RESULTS_DIR=${RESULTS_DIR:-"${@}"} + +echo "-----" +echo "Benchmark finished. Detailed results are located in: ${RESULTS_DIR}" + +docker run --name analyzer --rm \ + -v "${PWD}/analyze:/analyze:ro" \ + -v "${PWD}/${RESULTS_DIR}:/reports:ro" \ + ruby:3-slim-buster ruby /analyze/results_analyze.rb reports || + exit 1 + +cat >${RESULTS_DIR}/bench.params < { puts '-' * 137 } +make_data_line = lambda do |*args| + puts "| #{args[0].to_s.ljust(27)} |" \ + "#{args[1].to_s.rjust(8)} |" \ + "#{args[2].to_s.rjust(15)} |" \ + "#{args[3].to_s.rjust(15)} |" \ + "#{args[4].to_s.rjust(15)} |" \ + "#{args[5].to_s.rjust(15)} |" \ + "#{args[6].to_s.rjust(9)} |" \ + "#{args[7].to_s.rjust(14)} |" +end +make_horizontal_line[] +make_data_line['name', 'req/s', 'avg. latency', '90 % in', '95 % in', '99 % in', 'avg. cpu', 'avg. memory'] +make_horizontal_line[] +results.sort_by { |_k, v| v[:req_per_s] }.reverse_each do |name, result| + make_data_line[name, + result[:req_per_s].round(0), + result[:avg_resp_time], + result[:_90pct], + result[:_95pct], + result[:_99pct], + "#{result[:avg_cpu].round(2)}%", + "#{result[:avg_mem].round(2)} #{result[:avg_mem_unit]}"] +end +make_horizontal_line[] diff --git a/python/benchmarks/bench.sh b/python/benchmarks/bench.sh new file mode 100755 index 0000000..fb998b0 --- /dev/null +++ b/python/benchmarks/bench.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash + +RESULTS_DIR="results/$(date '+%y%m%dT%H%M%S')" +export GRPC_BENCHMARK_DURATION=${GRPC_BENCHMARK_DURATION:-"20s"} +export GRPC_BENCHMARK_WARMUP=${GRPC_BENCHMARK_WARMUP:-"5s"} +export GRPC_SERVER_CPUS=${GRPC_SERVER_CPUS:-"1"} +export GRPC_SERVER_RAM=${GRPC_SERVER_RAM:-"512m"} +export GRPC_CLIENT_CONNECTIONS=${GRPC_CLIENT_CONNECTIONS:-"50"} +export GRPC_CLIENT_CONCURRENCY=${GRPC_CLIENT_CONCURRENCY:-"1000"} +export GRPC_CLIENT_QPS=${GRPC_CLIENT_QPS:-"0"} +export GRPC_CLIENT_QPS=$((GRPC_CLIENT_QPS / GRPC_CLIENT_CONCURRENCY)) +export GRPC_CLIENT_CPUS=${GRPC_CLIENT_CPUS:-"1"} +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"complex_proto"} +export GRPC_IMAGE_NAME="${GRPC_IMAGE_NAME:-grpc_bench}" +export GRPC_GHZ_TAG="${GRPC_GHZ_TAG:-0.114.0}" + +# Let containers know how many CPUs they will be running on +# Additionally export other vars for further analysis script. +# export GRPC_SERVER_CPUS +# export GRPC_CLIENT_CPUS +# export GRPC_BENCHMARK_DURATION +# export GRPC_BENCHMARK_WARMUP +# export GRPC_CLIENT_CONNECTIONS +# export GRPC_CLIENT_CONCURRENCY +# export GRPC_CLIENT_QPS + +wait_on_tcp50051() { + for ((i = 1; i <= 10 * 30; i++)); do + nc -z localhost 50051 && return 0 + sleep .1 + done + return 1 +} + +benchmark="arflow_server_bench" +echo "==> Running benchmark for ${benchmark}..." + +mkdir -p "${RESULTS_DIR}" + +# Start the local Rerun Viewer TODO: if view mode +poetry run rerun & + +# Start the gRPC Server container +docker run \ + --name "${benchmark}" \ + --rm \ + --cpus "${GRPC_SERVER_CPUS}" \ + --memory "${GRPC_SERVER_RAM}" \ + -e GRPC_SERVER_CPUS \ + -e GRPC_SERVER_RAM \ + -e PORT=50051 \ + --network=host \ + --detach \ + --tty \ + "$GRPC_IMAGE_NAME:${benchmark}-$GRPC_REQUEST_SCENARIO" >/dev/null + +printf 'Waiting for server to come up... ' +if ! wait_on_tcp50051; then + echo 'server unresponsive!' + exit 1 +fi +echo 'ready.' + +# Set up ARFlow session +# Data must match with what's in `generate_payload.py` +docker run --name ghz --rm --network=host -v "${PWD}/../../protos:/protos:ro" \ + ghcr.io/bojand/ghz:"${GRPC_GHZ_TAG}" \ + --proto=/protos/cakelab/arflow_grpc/v1/arflow_service.proto \ + --import-paths=/protos \ + --call=cakelab.arflow_grpc.v1.ARFlowService.CreateSession \ + --disable-template-functions \ + --disable-template-data \ + --insecure \ + --total=1 \ + --data "{\"device\": {\"model\": \"iPhone 12\", \"name\": \"iPhone 12\", \"type\": \"TYPE_HANDHELD\", \"uid\": \"f3131490-dddd-419a-8504-fa8bb55282b2\"}}" \ + 127.0.0.1:50051 >/dev/null + +# Setup the chosen scenario +session_id=$(docker logs ${benchmark} | grep -m 1 "value:" | cut -d'"' -f2) + +if ! sh setup_scenario.sh $GRPC_REQUEST_SCENARIO true "${session_id}"; then + echo "Scenario setup fiascoed." + exit 1 +fi + +echo "Sending frames to session: ${session_id}" + +# replace SESSION_ID_PLACEHOLDER in payload + +# Warm up the service +if [[ "${GRPC_BENCHMARK_WARMUP}" != "0s" ]]; then + echo -n "Warming up the service for ${GRPC_BENCHMARK_WARMUP}... " + docker run --name ghz --rm --network=host -v "${PWD}/../../protos:/protos:ro" \ + -v "${PWD}/payload:/payload:ro" \ + --cpus $GRPC_CLIENT_CPUS \ + ghcr.io/bojand/ghz:"${GRPC_GHZ_TAG}" \ + --proto=/protos/cakelab/arflow_grpc/v1/arflow_service.proto \ + --import-paths=/protos \ + --call=cakelab.arflow_grpc.v1.ARFlowService.SaveARFrames \ + --disable-template-functions \ + --disable-template-data \ + --insecure \ + --concurrency="${GRPC_CLIENT_CONCURRENCY}" \ + --connections="${GRPC_CLIENT_CONNECTIONS}" \ + --rps="${GRPC_CLIENT_QPS}" \ + --duration "${GRPC_BENCHMARK_WARMUP}" \ + --data-file /payload/payload \ + 127.0.0.1:50051 >/dev/null + + echo "done." +else + echo "gRPC Server Warmup skipped." +fi + +# Actual benchmark +echo "Benchmarking now... " + +# Start collecting stats +./collect_stats.sh "${benchmark}" "${RESULTS_DIR}" & + +# Start the gRPC Client +docker run --name ghz --rm --network=host -v "${PWD}/../../protos:/protos:ro" \ + -v "${PWD}/payload:/payload:ro" \ + --cpus $GRPC_CLIENT_CPUS \ + ghcr.io/bojand/ghz:"${GRPC_GHZ_TAG}" \ + --proto=/protos/cakelab/arflow_grpc/v1/arflow_service.proto \ + --import-paths=/protos \ + --call=cakelab.arflow_grpc.v1.ARFlowService.SaveARFrames \ + --disable-template-functions \ + --disable-template-data \ + --insecure \ + --concurrency="${GRPC_CLIENT_CONCURRENCY}" \ + --connections="${GRPC_CLIENT_CONNECTIONS}" \ + --rps="${GRPC_CLIENT_QPS}" \ + --duration "${GRPC_BENCHMARK_DURATION}" \ + --data-file /payload/payload \ + 127.0.0.1:50051 >"${RESULTS_DIR}/${benchmark}".report + +# Show quick summary (reqs/sec) +cat </dev/null +docker container stop "${benchmark}" >/dev/null + +if sh analyze.sh $RESULTS_DIR; then + cat ${RESULTS_DIR}/bench.params + echo "All done." +else + echo "Analysis fiascoed." + ls -lha $RESULTS_DIR + for f in $RESULTS_DIR/*; do + echo + echo + echo "$f" + cat "$f" + done + exit 1 +fi diff --git a/python/benchmarks/build.sh b/python/benchmarks/build.sh new file mode 100755 index 0000000..745c42d --- /dev/null +++ b/python/benchmarks/build.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# TODO: use this ./generate_ci.sh >.github/workflows/build.yml + +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"complex_proto"} +export GRPC_IMAGE_NAME="${GRPC_IMAGE_NAME:-grpc_bench}" + +# Setup the chosen scenario +if ! sh setup_scenario.sh "$GRPC_REQUEST_SCENARIO" false; then + echo "Scenario setup fiascoed." + exit 1 +fi + +benchmark="arflow_server_bench" +builds="" +echo "==> Building Docker image..." +cd .. +( ( + docker image build \ + --pull \ + --file Dockerfile \ + --tag "$GRPC_IMAGE_NAME:${benchmark}-$GRPC_REQUEST_SCENARIO" \ + . >"${benchmark}.tmp" 2>&1 && + rm -f "${benchmark}.tmp" && + echo "==> Done building ${benchmark}" +) || ( + cat "${benchmark}.tmp" + rm -f "${benchmark}.tmp" + echo "==> Error building ${benchmark}" + exit 1 +)) & +builds="${builds} ${!}" + +echo "==> Waiting for the builds to finish..." +for job in ${builds}; do + if ! wait "${job}"; then + wait + echo "Error building Docker image(s)" + exit 1 + fi +done +echo "All done." diff --git a/python/benchmarks/clean.sh b/python/benchmarks/clean.sh new file mode 100755 index 0000000..01462f0 --- /dev/null +++ b/python/benchmarks/clean.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh + +export GRPC_IMAGE_NAME="${GRPC_IMAGE_NAME:-grpc_bench}" + +benchmark="arflow_server_bench" + +for scenario in $(find scenarios/ -maxdepth 1 -type d | tail -n+2 | sort); do + scenario=${scenario##scenarios/} + IMAGES_TO_CLEAN="${IMAGES_TO_CLEAN} ${GRPC_IMAGE_NAME}:${benchmark}-${scenario}" +done + +docker image remove ${IMAGES_TO_CLEAN} diff --git a/python/benchmarks/collect_stats.sh b/python/benchmarks/collect_stats.sh new file mode 100755 index 0000000..2ba2b16 --- /dev/null +++ b/python/benchmarks/collect_stats.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env sh + +NAME=$1 +REPORT_DIR=${2:-"results"} + +rm -f "${REPORT_DIR}"/"${NAME}".stats + +sleep 1 + +while true; do + (docker stats \ + --no-stream \ + --format "table {{.CPUPerc}}\t{{.MemUsage}}" \ + "${NAME}" | grep -v CPU) >>"${REPORT_DIR}"/"${NAME}".stats 2>/dev/null || break + sleep 5 || break +done diff --git a/python/benchmarks/example_benchmark.sh b/python/benchmarks/example_benchmark.sh new file mode 100755 index 0000000..953760c --- /dev/null +++ b/python/benchmarks/example_benchmark.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env sh +# This is a sample benchmarking script which will test the implementations with increasing number of available CPUs. + +bash build.sh || exit 1 + +export GRPC_BENCHMARK_DURATION=120s +export GRPC_BENCHMARK_WARMUP=30s +export GRPC_SERVER_RAM=4096m +export GRPC_CLIENT_CPUS=11 + +cpus=0 +while [ $cpus -ne 4 ]; do + cpus=$(($cpus + 1)) + echo "Benchmarking for $cpus CPU(s)" + GRPC_SERVER_CPUS=$cpus bash bench.sh || exit 2 + sleep 60 +done + +echo "Benchmarking finished" diff --git a/python/benchmarks/generate_ci.sh b/python/benchmarks/generate_ci.sh new file mode 100755 index 0000000..0fedbb8 --- /dev/null +++ b/python/benchmarks/generate_ci.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash + +set -eu +set -o pipefail + +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"complex_proto"} + +cat <- + \${{ + contains(steps.finder.outputs.all_changed_and_modified_files, '.dockerignore') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'analyze.sh') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'bench.sh') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'build.sh') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'clean.sh') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'collect_stats.sh') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'generate_ci.sh') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'proto/') || + contains(steps.finder.outputs.all_changed_and_modified_files, 'setup_scenario.sh') }} + +EOF + +while read -r bench; do + bench=${bench##./} + + cat < None: + device = Device( + model="iPhone 12", + name="iPhone 12", + type=Device.TYPE_HANDHELD, + uid="f3131490-dddd-419a-8504-fa8bb55282b2", + ) + message = SaveARFramesRequest( + session_id=SessionUuid(value="SESSION_ID_PLACEHOLDER"), + device=device, + frames=[ARFrame(), ARFrame()], + ) + message_as_json = MessageToJson( + message=message, preserving_proto_field_name=True, indent=None + ) + with open(Path(SCENARIOS_DIR, "complex_proto", "payload"), "w") as f: + f.write(message_as_json) + + # message = CreateSessionRequest( + # device=device, + # ) + # message_as_json = MessageToJson( + # message=message, preserving_proto_field_name=True, indent=None + # ) + # with open(Path(SCENARIOS_DIR, "session"), "w") as f: + # f.write(message_as_json) + + # message_as_bin = message.SerializeToString() + # with open("bing.bin", "wb") as f: + # f.write(message_as_bin) + + +if __name__ == "__main__": + main() diff --git a/python/benchmarks/scenarios/complex_proto/payload b/python/benchmarks/scenarios/complex_proto/payload new file mode 100644 index 0000000..d2038d0 --- /dev/null +++ b/python/benchmarks/scenarios/complex_proto/payload @@ -0,0 +1 @@ +{"session_id": {"value": "SESSION_ID_PLACEHOLDER"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{}, {}]} \ No newline at end of file diff --git a/python/benchmarks/setup_scenario.sh b/python/benchmarks/setup_scenario.sh new file mode 100755 index 0000000..2a55e09 --- /dev/null +++ b/python/benchmarks/setup_scenario.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env sh + +SCENARIO=$1 +COPY_PAYLOAD=$2 +SESSION_ID=$3 + +if ${COPY_PAYLOAD}; then + rm -rf payload + mkdir -p payload + cp scenarios/"${SCENARIO}"/payload payload/payload + # replace SESSION_ID_PLACEHOLDER in payload + sed -i "s/SESSION_ID_PLACEHOLDER/${SESSION_ID}/g" payload/payload +fi From d61bb7f7b91fdc0206346331314df9469570803c Mon Sep 17 00:00:00 2001 From: felixngfender Date: Sun, 2 Feb 2025 22:10:53 -0500 Subject: [PATCH 06/21] fix(client): properly fallback to system clock if no NTP server specified --- .../SceneScripts/DeviceSample/ARFlowDeviceSample.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs index 7aa452e..0b8ca82 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs @@ -197,8 +197,8 @@ public class FindServerWindow public string serverIP => ipServerField.text; - public string serverHost => portServerField.text; - public string serverAddress => $"http://{serverIP}:{serverHost}"; + public string serverPort => portServerField.text; + public string serverAddress => $"http://{serverIP}:{serverPort}"; public bool isToggleOn => NTPSameServerToggle.isOn; @@ -254,8 +254,10 @@ public async void OnConnectToServer() InitUIConfig(); findServerWindow.windowGameObject.SetActive(false); sessionsWindow.windowGameObject.SetActive(true); - await ntpClock.SynchronizeAsync(); - + // If "NTP server same as server" is not checked and field is left empty, do not sync. NTP clock will fallback to system clock + if (ntpURL.Length > 0) { + await ntpClock.SynchronizeAsync(); + } } catch (Exception e) { From c09c1ac9d72ea651e09823b641fa884bc875c38e Mon Sep 17 00:00:00 2001 From: felixngfender Date: Mon, 3 Feb 2025 00:13:55 -0500 Subject: [PATCH 07/21] style(client): formatting --- .../Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs index 0b8ca82..ec9270c 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs @@ -1,11 +1,8 @@ using System; using System.Collections.Generic; -using System.Data; -using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; -using CakeLab.ARFlow; using CakeLab.ARFlow.ArUcoTracking; using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; @@ -255,7 +252,8 @@ public async void OnConnectToServer() findServerWindow.windowGameObject.SetActive(false); sessionsWindow.windowGameObject.SetActive(true); // If "NTP server same as server" is not checked and field is left empty, do not sync. NTP clock will fallback to system clock - if (ntpURL.Length > 0) { + if (ntpURL.Length > 0) + { await ntpClock.SynchronizeAsync(); } } From b53f298cda38c774058c23be9359ae86b5b0b364 Mon Sep 17 00:00:00 2001 From: felixngfender Date: Wed, 5 Feb 2025 23:48:51 -0500 Subject: [PATCH 08/21] perf(client): sending AR frames directly consumes the iterator instead of copying --- ...niversalRenderPipelineGlobalSettings.asset | 44 ++--- .../ARFoundationCamera2MatHelper.cs | 3 +- .../Runtime/ColorFrameAccess.cs | 183 ------------------ .../Runtime/ColorFrameAccess.cs.meta | 2 - .../Runtime/DataBuffers/AudioBuffer.cs | 5 +- .../Runtime/DataBuffers/ColorBuffer.cs | 5 +- .../Runtime/DataBuffers/DepthBuffer.cs | 5 +- .../Runtime/DataBuffers/GyroscopeBuffer.cs | 5 +- .../Runtime/DataBuffers/IDataBuffer.cs | 3 +- .../DataBuffers/MeshDetectionBuffer.cs | 4 +- .../DataBuffers/PlaneDetectionBuffer.cs | 4 +- .../DataBuffers/PointCloudDetectionBuffer.cs | 4 +- .../Runtime/DataBuffers/TransformBuffer.cs | 11 +- .../DeviceSample/ARFlowDeviceSample.cs | 33 +++- unity/ProjectSettings/ProjectSettings.asset | 4 +- 15 files changed, 84 insertions(+), 231 deletions(-) delete mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs delete mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs.meta diff --git a/unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset b/unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset index 2ff8d96..73039c4 100644 --- a/unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset +++ b/unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset @@ -36,21 +36,21 @@ MonoBehaviour: - rid: 9145189647983312896 - rid: 9145189647983312897 - rid: 9145189647983312898 - - rid: 6058210412369805407 + - rid: 8695028251395883269 - rid: 9145189647983312900 - rid: 9145189647983312901 - - rid: 6058210412369805408 - - rid: 6058210412369805409 + - rid: 8695028251395883270 + - rid: 8695028251395883271 - rid: 9145189647983312904 - - rid: 6058210412369805410 + - rid: 8695028251395883272 - rid: 9145189647983312906 - - rid: 6058210412369805411 - - rid: 6058210412369805412 - - rid: 6058210412369805413 - - rid: 6058210412369805414 - - rid: 6058210412369805415 - - rid: 6058210412369805416 - - rid: 6058210412369805417 + - rid: 8695028251395883273 + - rid: 8695028251395883274 + - rid: 8695028251395883275 + - rid: 8695028251395883276 + - rid: 8695028251395883277 + - rid: 8695028251395883278 + - rid: 8695028251395883279 - rid: 9145189647983312914 - rid: 9145189647983312915 - rid: 9145189647983312916 @@ -89,7 +89,7 @@ MonoBehaviour: references: version: 2 RefIds: - - rid: 6058210412369805407 + - rid: 8695028251395883269 type: {class: Renderer2DResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_Version: 0 @@ -113,7 +113,7 @@ MonoBehaviour: type: 2} m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} - - rid: 6058210412369805408 + - rid: 8695028251395883270 type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: @@ -121,7 +121,7 @@ MonoBehaviour: m_StripUnusedPostProcessingVariants: 1 m_StripUnusedVariants: 1 m_StripScreenCoordOverrideVariants: 1 - - rid: 6058210412369805409 + - rid: 8695028251395883271 type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: @@ -135,7 +135,7 @@ MonoBehaviour: type: 2} m_DefaultDecalMaterial: {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2} - - rid: 6058210412369805410 + - rid: 8695028251395883272 type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: @@ -157,7 +157,7 @@ MonoBehaviour: type: 3} m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3} - - rid: 6058210412369805411 + - rid: 8695028251395883273 type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime} data: m_Version: 0 @@ -179,13 +179,13 @@ MonoBehaviour: type: 3} m_DebugOccluderPS: {fileID: 4800000, guid: b3c92426a88625841ab15ca6a7917248, type: 3} - - rid: 6058210412369805412 + - rid: 8695028251395883274 type: {class: STP/RuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_setupCS: {fileID: 7200000, guid: 33be2e9a5506b2843bdb2bdff9cad5e1, type: 3} m_preTaaCS: {fileID: 7200000, guid: a679dba8ec4d9ce45884a270b0e22dda, type: 3} m_taaCS: {fileID: 7200000, guid: 3923900e2b41b5e47bc25bfdcbcdc9e6, type: 3} - - rid: 6058210412369805413 + - rid: 8695028251395883275 type: {class: ProbeVolumeBakingResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 @@ -207,12 +207,12 @@ MonoBehaviour: type: 3} renderingLayerRT: {fileID: -5126288278712620388, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} - - rid: 6058210412369805414 + - rid: 8695028251395883276 type: {class: ProbeVolumeGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 m_ProbeVolumeDisableStreamingAssets: 0 - - rid: 6058210412369805415 + - rid: 8695028251395883277 type: {class: ProbeVolumeDebugResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 @@ -228,14 +228,14 @@ MonoBehaviour: type: 3} numbersDisplayTex: {fileID: 2800000, guid: 73fe53b428c5b3440b7e87ee830b608a, type: 3} - - rid: 6058210412369805416 + - rid: 8695028251395883278 type: {class: IncludeAdditionalRPAssets, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_version: 0 m_IncludeReferencedInScenes: 0 m_IncludeAssetsByLabel: 0 m_LabelToInclude: - - rid: 6058210412369805417 + - rid: 8695028251395883279 type: {class: ProbeVolumeRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/ARFoundationCamera2MatHelper.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/ARFoundationCamera2MatHelper.cs index 379fb78..a7bffd4 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/ARFoundationCamera2MatHelper.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/ARFoundationCamera2MatHelper.cs @@ -532,7 +532,6 @@ private void OnCameraFrameReceived(ARCameraFrameEventArgs eventArgs) protected virtual void ProcessImage(XRCpuImage.AsyncConversionStatus status, XRCpuImage.ConversionParams conversionParams, NativeArray data) { - Debug.Log("ProcessImage"); if (status != XRCpuImage.AsyncConversionStatus.Ready) { Debug.LogErrorFormat("Async request failed with status {0}", status); @@ -1188,4 +1187,4 @@ public override void Dispose() #endif // (UNITY_IOS || UNITY_ANDROID) && !UNITY_EDITOR && !DISABLE_ARFOUNDATION_API } -} \ No newline at end of file +} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs deleted file mode 100644 index 92667de..0000000 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using TMPro; -using UnityEngine; -using UnityEngine.UI; -using UnityEngine.XR.ARFoundation; - -namespace CakeLab.ARFlow.Samples -{ - using Clock; - using DataBuffers; - using Grpc; - using Grpc.V1; - using Utilities; - - public class ColorFrameAccess : MonoBehaviour - { - public Button CreateSessionButton; - public Button DeleteSessionButton; - public Button RefreshSessionsButton; // ListSessions - public Button JoinSessionButton; - public Button LeaveSessionButton; - public Button StartButton; - public Button StopButton; - public TMP_InputField AddressInputField; - public TMP_InputField DelayInputField; - public TMP_Text StatusText; - - ColorBuffer m_CameraBuffer; - - private Device m_Device; - private List m_Sessions; - private Session m_ActiveSession; - private Uri m_Address; - private IGrpcClient m_GrpcClient; - private float m_DelayInS; - private CancellationTokenSource m_Cts; - - [SerializeField] - [Tooltip("The AR camera manager that is used to produce frame events")] - ARCameraManager m_CameraManager; - - [SerializeField] - IClock m_Clock; - - public ARCameraManager CameraManager - { - // Proxy to underlying ARCameraManager - get => m_CameraBuffer.CameraManager; - set => m_CameraBuffer.CameraManager = value; - } - - /// - /// Awake is called when the script instance is being loaded, before any Start. - /// - void Awake() - { - m_CameraBuffer = new ColorBuffer(m_CameraManager, m_Clock); - - // Initialize default values (if they aren't dynamic or coming from other scripts) - m_Address = new("http://192.168.1.50:8500"); - m_DelayInS = 0.5f; - - // Set initial state for UI components (safe to assign references) - StartButton.interactable = false; - StopButton.interactable = false; - AddressInputField.interactable = false; - DelayInputField.interactable = false; - } - - /// - /// Start is called before the first frame update - /// - void Start() - { - m_Device = new() - { - Model = SystemInfo.deviceModel, - Name = SystemInfo.deviceName, - Type = (Device.Types.Type)SystemInfo.deviceType, - Uid = SystemInfo.deviceUniqueIdentifier, - }; - - // Set up initial state of UI (now interactable) - StartButton.interactable = true; - StopButton.interactable = false; - AddressInputField.interactable = true; - DelayInputField.interactable = true; - - // Populate text fields with initial values - AddressInputField.text = m_Address.ToString(); - DelayInputField.text = m_DelayInS.ToString(); - StatusText.text = "Disconnected"; - - // Add UI listeners - StartButton.onClick.AddListener(OnStartButtonClicked); - StopButton.onClick.AddListener(OnStopButtonClicked); - AddressInputField.onValueChanged.AddListener(OnAddressChange); - DelayInputField.onValueChanged.AddListener(OnDelayChange); - } - - private void OnStartButtonClicked() - { - m_GrpcClient = new GrpcClient(m_Address.ToString()); - m_CameraBuffer.StartCapture(); - m_Cts = new CancellationTokenSource(); - SendFramesAsync(); - - StartButton.interactable = false; - StopButton.interactable = true; - AddressInputField.interactable = false; - DelayInputField.interactable = false; - - StatusText.text = $"Sending frames every {m_DelayInS}s to {m_Address}"; - } - - private void OnStopButtonClicked() - { - m_Cts.Cancel(); - m_CameraBuffer.Dispose(); - m_GrpcClient?.Dispose(); - m_GrpcClient = null; // to reconnect if needed - - StartButton.interactable = true; - StopButton.interactable = false; - AddressInputField.interactable = true; - DelayInputField.interactable = true; - - StatusText.text = "Disconnected"; - } - - private async void SendFramesAsync() - { - while (!m_Cts.IsCancellationRequested) - { - // OperationCanceledException is thrown when the token is cancelled, this is expected - // For more details, see https://blog.stephencleary.com/2022/02/cancellation-1-overview.html - await Awaitable.WaitForSecondsAsync(m_DelayInS, m_Cts.Token); - - ARFrame[] arFrames = m_CameraBuffer - .TakeARFrames(); - - if (arFrames.Length == 0) - { - InternalDebug.Log("No frames to send."); - continue; - } - - var _ = await m_GrpcClient.SaveARFramesAsync( - m_ActiveSession.Id, - arFrames, - m_Device, - m_Cts.Token - ); - } - } - - private void OnAddressChange(string value) - { - if (Uri.TryCreate(value, UriKind.Absolute, out Uri newAddress)) - { - m_Address = newAddress; - } - } - - private void OnDelayChange(string value) - { - if (float.TryParse(value, out float newDelay)) - { - m_DelayInS = newDelay; - } - } - - private void OnDestroy() - { - m_Cts?.Cancel(); - m_Cts?.Dispose(); - m_GrpcClient?.Dispose(); - } - } -} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs.meta deleted file mode 100644 index 468f26b..0000000 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/ColorFrameAccess.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 2fdc9851eceeec8efb26e3ad2c728ef5 \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs index bb920b3..8cf6657 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/AudioBuffer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Linq; using Google.Protobuf.WellKnownTypes; @@ -83,7 +84,7 @@ public RawAudioFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { ConcurrentQueue oldFrames; lock (m_Buffer) @@ -91,7 +92,7 @@ public ARFrame[] TakeARFrames() oldFrames = m_Buffer; m_Buffer = new(); } - return oldFrames.Select(frame => (ARFrame)frame).ToArray(); + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs index 4c51acb..59dbc08 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/ColorBuffer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Linq; using Google.Protobuf.WellKnownTypes; using UnityEngine.XR.ARFoundation; @@ -174,7 +175,7 @@ public RawColorFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { ConcurrentQueue oldFrames; lock (m_Buffer) @@ -182,7 +183,7 @@ public ARFrame[] TakeARFrames() oldFrames = m_Buffer; m_Buffer = new(); } - return oldFrames.Select(frame => (ARFrame)frame).ToArray(); + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs index e2af378..888b5fe 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/DepthBuffer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Linq; +using System.Collections.Generic; using Google.Protobuf.WellKnownTypes; using UnityEngine.XR.ARFoundation; @@ -130,7 +131,7 @@ public RawDepthFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { ConcurrentQueue oldFrames; lock (m_Buffer) @@ -138,7 +139,7 @@ public ARFrame[] TakeARFrames() oldFrames = m_Buffer; m_Buffer = new(); } - return oldFrames.Select(frame => (ARFrame)frame).ToArray(); + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs index 5719f92..cc871c1 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Linq; using Google.Protobuf.WellKnownTypes; using UnityEngine; @@ -150,7 +151,7 @@ public RawGyroscopeFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { ConcurrentQueue oldFrames; lock (m_Buffer) @@ -158,7 +159,7 @@ public ARFrame[] TakeARFrames() oldFrames = m_Buffer; m_Buffer = new(); } - return oldFrames.Select(frame => (ARFrame)frame).ToArray(); + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs index cde7eb1..8b80d87 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/IDataBuffer.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Collections.Concurrent; using CakeLab.ARFlow.Grpc.V1; @@ -35,7 +36,7 @@ public interface IARFrameBuffer : IDataBuffer /// Atomically take and clear all frames in the buffer. This is a helper method to manage sending ARFrames more easily. /// /// See https://stackoverflow.com/a/75331708 - ARFrame[] TakeARFrames(); + IEnumerable TakeARFrames(); } /// diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs index b819e60..9f635c8 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/MeshDetectionBuffer.cs @@ -188,7 +188,7 @@ public RawMeshDetectionFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { ConcurrentQueue oldFrames; lock (m_Buffer) @@ -196,7 +196,7 @@ public ARFrame[] TakeARFrames() oldFrames = m_Buffer; m_Buffer = new(); } - return oldFrames.Select(frame => (ARFrame)frame).ToArray(); + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs index 27a41c8..828454f 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PlaneDetectionBuffer.cs @@ -253,7 +253,7 @@ public RawPlaneDetectionFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { ConcurrentQueue oldFrames; lock (m_Buffer) @@ -261,7 +261,7 @@ public ARFrame[] TakeARFrames() oldFrames = m_Buffer; m_Buffer = new(); } - return oldFrames.Select(frame => (ARFrame)frame).ToArray(); + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs index db485f5..e216615 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/PointCloudDetectionBuffer.cs @@ -227,7 +227,7 @@ public RawPointCloudDetectionFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { ConcurrentQueue oldFrames; lock (m_Buffer) @@ -235,7 +235,7 @@ public ARFrame[] TakeARFrames() oldFrames = m_Buffer; m_Buffer = new(); } - return oldFrames.Select(frame => (ARFrame)frame).ToArray(); + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs index 160853b..0453eef 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Linq; using Google.Protobuf.WellKnownTypes; using UnityEngine; @@ -136,9 +137,15 @@ public RawTransformFrame TryAcquireLatestFrame() return m_Buffer.LastOrDefault(); } - public ARFrame[] TakeARFrames() + public IEnumerable TakeARFrames() { - return m_Buffer.Select(frame => (ARFrame)frame).ToArray(); + ConcurrentQueue oldFrames; + lock (m_Buffer) + { + oldFrames = m_Buffer; + m_Buffer = new(); + } + return oldFrames.Select(frame => (ARFrame)frame); } public void Dispose() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs index ec9270c..450c2b2 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs @@ -120,14 +120,16 @@ public async void SendFrame(BufferControl control) // For more details, see https://blog.stephencleary.com/2022/02/cancellation-1-overview.html await Awaitable.WaitForSecondsAsync(currentDelay, control.cts.Token); - ARFrame[] arFrames = control.buffer.TakeARFrames(); + IEnumerable arFrames = control.buffer.TakeARFrames(); - if (arFrames.Length == 0) + if (arFrames == null || !arFrames.Any()) { InternalDebug.Log("No frames to send."); continue; } - InternalDebug.Log($"Sending {arFrames.Length} frames"); + // NOTE: Count() is expensive so only uncomment for debugging, the compiler not smart enough to + // strip out unecessary call during production build + // InternalDebug.Log($"Sending {arFrames.Count()} frames"); var _ = await grpcClient.SaveARFramesAsync( m_ActiveSession.Id, @@ -256,6 +258,8 @@ public async void OnConnectToServer() { await ntpClock.SynchronizeAsync(); } + // NOTE: enable if want to evaluate temporal sync + // CaptureTimeMetrics(); } catch (Exception e) { @@ -267,6 +271,29 @@ public async void OnConnectToServer() } } + [Serializable] + public class TimeLogEntry + { + public string ntp_time; + public string device_time; + } + + private async void CaptureTimeMetrics() + { + while (true) + { + var ntpTime = clock.UtcNow; + var deviceTime = DateTime.UtcNow; + var logEntry = new TimeLogEntry + { + ntp_time = ntpTime.ToString("o"), + device_time = deviceTime.ToString("o"), + }; + Debug.LogWarning($"TimeLog: {JsonUtility.ToJson(logEntry)}"); + await Awaitable.WaitForSecondsAsync(5f); + } + } + [Serializable] public class CreateSessionWindow { diff --git a/unity/ProjectSettings/ProjectSettings.asset b/unity/ProjectSettings/ProjectSettings.asset index 768c37a..a42201f 100644 --- a/unity/ProjectSettings/ProjectSettings.asset +++ b/unity/ProjectSettings/ProjectSettings.asset @@ -142,11 +142,11 @@ PlayerSettings: tvOSBundleVersion: 1.0 bundleVersion: 0.0.3 preloadedAssets: - - {fileID: 4800000, guid: c9f956787b1d945e7b36e0516201fc76, type: 3} - - {fileID: 4800000, guid: 0945859e5a1034c2cb6dce53cb4fb899, type: 3} - {fileID: 11400000, guid: c199e683398494f32b4cde18e73ab731, type: 2} - {fileID: 7409956309476867576, guid: 3fd4fc0127790db4bae83f7b77da8d45, type: 2} - {fileID: 4754762928077386648, guid: b07c4ba7650be4c25b3d0c497e7e2bb8, type: 2} + - {fileID: 4800000, guid: c9f956787b1d945e7b36e0516201fc76, type: 3} + - {fileID: 4800000, guid: 0945859e5a1034c2cb6dce53cb4fb899, type: 3} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1 From a40397becaf6a14e1e8c2e1b0197a07b2b35164a Mon Sep 17 00:00:00 2001 From: Khang Luu Date: Fri, 7 Feb 2025 11:35:20 -0500 Subject: [PATCH 09/21] chore(wip): evaluations for spacial/coordinates syncronization --- .../Assets/Materials/4x4_1000-0.png | 3 + .../Assets/Materials/4x4_1000-0.png.meta | 130 ++ .../Assets/Materials/aruco.mat | 137 ++ .../Assets/Materials/aruco.mat.meta | 8 + .../Assets/Prefabs/SpacialEval.meta | 8 + .../Assets/Prefabs/SpacialEval/ArUco.prefab | 111 + .../Prefabs/SpacialEval/ArUco.prefab.meta | 7 + .../Assets/Scenes/SpacialEval.unity | 2058 +++++++++++++++++ .../Assets/Scenes/SpacialEval.unity.meta | 7 + .../Runtime/Evaluation.meta | 8 + .../Runtime/Evaluation/SpacialEvaluation.cs | 37 + .../Evaluation/SpacialEvaluation.cs.meta | 2 + .../Evaluation/SpacialEvaluationManager.cs | 324 +++ .../SpacialEvaluationManager.cs.meta | 2 + .../edu.wpi.cake.arflow.evaluation.asmdef | 22 + ...edu.wpi.cake.arflow.evaluation.asmdef.meta | 7 + .../Runtime/Evaluation/license.txt | 36 + .../Runtime/Evaluation/license.txt.meta | 7 + 18 files changed, 2914 insertions(+) create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt.meta diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png new file mode 100644 index 0000000..16b7200 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0523d70a813e0a65d1a07d0ae22a1f83ac441ed5b30676e25b20908109d1d622 +size 194 diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png.meta new file mode 100644 index 0000000..de83c62 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 99ba8abd78d0afd41811151cf809f5b7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat new file mode 100644 index 0000000..bb5d79f --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-5602789791772390472 +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: 9 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: aruco + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _METALLICSPECGLOSSMAP + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + 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: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + 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_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 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 + - _SrcBlendAlpha: 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.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat.meta new file mode 100644 index 0000000..b235caa --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6e0e55779a835e84485c62cb72f5cc9d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval.meta new file mode 100644 index 0000000..baa95b2 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d5bb327da843df34f85e47ea7def5185 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab b/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab new file mode 100644 index 0000000..d6b912d --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab @@ -0,0 +1,111 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7893538066097599192 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 563518184931968753} + - component: {fileID: 230413983317256512} + - component: {fileID: 2129059941638524338} + - component: {fileID: 74265253548657875} + m_Layer: 0 + m_Name: ArUco + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &563518184931968753 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7893538066097599192} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.10000001, z: 0.1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!33 &230413983317256512 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7893538066097599192} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2129059941638524338 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7893538066097599192} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 6e0e55779a835e84485c62cb72f5cc9d, 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!64 &74265253548657875 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7893538066097599192} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab.meta new file mode 100644 index 0000000..202e493 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Prefabs/SpacialEval/ArUco.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7ec731a7f785a824bb357b690e4e7bfb +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity new file mode 100644 index 0000000..a1f396f --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity @@ -0,0 +1,2058 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_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: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &35366667 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 35366668} + - component: {fileID: 35366670} + - component: {fileID: 35366669} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &35366668 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35366667} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 481637006} + 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 &35366669 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35366667} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: "100\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 3 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &35366670 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35366667} + m_CullTransparentMesh: 1 +--- !u!1 &253401065 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 253401066} + - component: {fileID: 253401069} + - component: {fileID: 253401068} + - component: {fileID: 253401067} + m_Layer: 5 + m_Name: InputField (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &253401066 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 253401065} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 481637006} + m_Father: {fileID: 1263916034} + 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: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &253401067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 253401065} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, 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: 253401068} + m_TextViewport: {fileID: 481637006} + m_TextComponent: {fileID: 35366669} + m_Placeholder: {fileID: 1770931410} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 2 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 4 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 2 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: 100 + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_KeepTextSelectionVisible: 0 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + isAlert: 0 + m_InputValidator: {fileID: 0} + m_ShouldActivateOnSelect: 1 +--- !u!114 &253401068 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 253401065} + 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: 10911, 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 &253401069 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 253401065} + m_CullTransparentMesh: 1 +--- !u!1 &279801539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 279801541} + - component: {fileID: 279801540} + - component: {fileID: 279801542} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &279801540 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279801539} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &279801541 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279801539} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &279801542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279801539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 0 +--- !u!1 &481637005 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 481637006} + - component: {fileID: 481637007} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &481637006 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 481637005} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1770931408} + - {fileID: 35366668} + m_Father: {fileID: 253401066} + 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.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &481637007 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 481637005} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &1006815206 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1006815207} + - component: {fileID: 1006815209} + - component: {fileID: 1006815208} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1006815207 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1006815206} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1034274602} + 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 &1006815208 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1006815206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Start + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1006815209 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1006815206} + m_CullTransparentMesh: 1 +--- !u!1 &1034274601 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1034274602} + - component: {fileID: 1034274605} + - component: {fileID: 1034274604} + - component: {fileID: 1034274603} + m_Layer: 5 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1034274602 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034274601} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.41, y: 1.41, z: 1.41} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 1006815207} + m_Father: {fileID: 1969231322} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 482, y: -279} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1034274603 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034274601} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, 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: 1034274604} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1034274604 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034274601} + 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 &1034274605 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034274601} + m_CullTransparentMesh: 1 +--- !u!1 &1263916033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1263916034} + - component: {fileID: 1263916038} + - component: {fileID: 1263916037} + - component: {fileID: 1263916036} + - component: {fileID: 1263916035} + m_Layer: 5 + m_Name: Box + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1263916034 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263916033} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1348885247} + - {fileID: 253401066} + - {fileID: 1844435561} + m_Father: {fileID: 1969231322} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 21.325073, y: -21.400042} + m_SizeDelta: {x: -42.649887, y: -42.799915} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1263916035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263916033} + 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: -491.6 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1263916036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263916033} + 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 &1263916037 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263916033} + 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 &1263916038 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263916033} + 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_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &1348885246 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1348885247} + - component: {fileID: 1348885249} + - component: {fileID: 1348885248} + m_Layer: 5 + m_Name: Iterations + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1348885247 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348885246} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1263916034} + 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: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1348885248 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348885246} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Iterations + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1348885249 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348885246} + m_CullTransparentMesh: 1 +--- !u!1 &1493587408 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1493587412} + - component: {fileID: 1493587411} + - component: {fileID: 1493587409} + m_Layer: 0 + m_Name: Eval Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1493587409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493587408} + 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_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 +--- !u!20 &1493587411 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493587408} + 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_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + 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: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1493587412 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493587408} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1540106671 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 7893538066097599192, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + m_PrefabInstance: {fileID: 1767675539} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1767675539 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 2126620349} + m_Modifications: + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7893538066097599192, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_Name + value: ArUco + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} +--- !u!4 &1767675540 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + m_PrefabInstance: {fileID: 1767675539} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1770931407 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1770931408} + - component: {fileID: 1770931411} + - component: {fileID: 1770931410} + - component: {fileID: 1770931409} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1770931408 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770931407} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 481637006} + 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 &1770931409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770931407} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1770931410 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770931407} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1770931411 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770931407} + m_CullTransparentMesh: 1 +--- !u!1 &1819979425 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1819979426} + m_Layer: 0 + m_Name: Parent + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1819979426 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1819979425} + serializedVersion: 2 + m_LocalRotation: {x: -0.6708778, y: -0.20510794, z: -0.20835538, w: 0.68149966} + m_LocalPosition: {x: 2.2392783, y: 0.29, z: -4.1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2126620349} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: -89.1, y: 0, z: -34} +--- !u!1 &1822936294 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1822936297} + - component: {fileID: 1822936296} + - component: {fileID: 1822936295} + - component: {fileID: 1822936298} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1822936295 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822936294} + m_Enabled: 1 +--- !u!20 &1822936296 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822936294} + 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_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + 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: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1822936297 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822936294} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1822936298 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822936294} + 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_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 +--- !u!1 &1844435560 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1844435561} + - component: {fileID: 1844435563} + - component: {fileID: 1844435562} + m_Layer: 5 + m_Name: Info + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1844435561 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1844435560} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1263916034} + 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: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1844435562 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1844435560} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: "MSE: \nsomething" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1844435563 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1844435560} + m_CullTransparentMesh: 1 +--- !u!1 &1969231318 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1969231322} + - component: {fileID: 1969231321} + - component: {fileID: 1969231320} + - component: {fileID: 1969231319} + - component: {fileID: 1969231323} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1969231319 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1969231318} + 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 &1969231320 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1969231318} + 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 &1969231321 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1969231318} + 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_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1969231322 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1969231318} + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1263916034} + - {fileID: 1034274602} + m_Father: {fileID: 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 &1969231323 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1969231318} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7ddcab23e564e1449ac442ecfd45709, type: 3} + m_Name: + m_EditorClassIdentifier: + texturedPlane: {fileID: 1540106671} + arucoObj: {fileID: 2126620348} + arucoParent: {fileID: 1819979425} + activeCamera: {fileID: 1493587411} + infoText: {fileID: 1844435562} + toggleButton: {fileID: 1034274603} + buttonText: {fileID: 1348885248} + iterationsInput: {fileID: 253401067} +--- !u!1 &2031246730 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2031246733} + - component: {fileID: 2031246732} + - component: {fileID: 2031246731} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2031246731 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2031246730} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_MoveRepeatDelay: 0.5 + m_MoveRepeatRate: 0.1 + m_XRTrackingOrigin: {fileID: 0} + m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, + type: 3} + m_DeselectOnBackgroundClick: 1 + m_PointerBehavior: 0 + m_CursorLockBehavior: 0 + m_ScrollDeltaPerTick: 6 +--- !u!114 &2031246732 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2031246730} + 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 &2031246733 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2031246730} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2126620348 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2126620349} + m_Layer: 0 + m_Name: ArUco Window + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2126620349 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2126620348} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1767675540} + m_Father: {fileID: 1819979426} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1822936297} + - {fileID: 1493587412} + - {fileID: 279801541} + - {fileID: 1819979426} + - {fileID: 1969231322} + - {fileID: 2031246733} diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity.meta new file mode 100644 index 0000000..d0787ec --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1c6dc5a24a79bfc488ba7aa44988fa8f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation.meta new file mode 100644 index 0000000..2ca5ec8 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c373c40f51d482d4f92aa69106411bf4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs new file mode 100644 index 0000000..e3e8195 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +namespace CakeLab.ARFlow.Evaluation +{ + using Codice.Client.Common.FsNodeReaders; + using PlasticGui.WorkspaceWindow; + + /// + /// Class to evaluate the spacial accuracy of the ARFlow system. + /// + + public class SpacialEvaluation + { + /// + /// Calculate the Frobenius norm of the difference between the ground truth and the obtained pose + /// Matrix4x4 does not have a built-in matrix operation for adding, so we will manually calculate the Frobenius norm + /// + /// Ground truth pose data in transformation matrix + /// Predicted pose data from the current method + /// + // public abstract Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics); + public static float GetErrorScore(Matrix4x4 groundTruth, Matrix4x4 obtainedPose) + { + float errorScore = 0; + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + float difference = groundTruth[i, j] - obtainedPose[i, j]; + errorScore += difference * difference; + } + } + + return Mathf.Sqrt(errorScore); + } + } +} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs.meta new file mode 100644 index 0000000..3368fb4 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9babd461e5acc8b46a6008e4aaca774b \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs new file mode 100644 index 0000000..23cec04 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs @@ -0,0 +1,324 @@ +using UnityEngine; +using OpenCVForUnity.ObjdetectModule; +using OpenCVForUnity.Calib3dModule; +using OpenCVForUnity.CoreModule; +using OpenCVForUnity.ImgprocModule; +using OpenCVForUnity.UnityUtils; +using OpenCVForUnity.UnityUtils.Helper; + +// using CakeLab.ARFlow.; + +namespace CakeLab.ARFlow.Evaluation +{ + using System.Collections.Generic; + using OpenCVForUnityExample; + using TMPro; + using UnityEngine.UI; + + + + /// + /// Class to evaluate the spacial accuracy of the ARFlow system. + /// + + public class ArUcoSpacialEvaluation : SpacialEvaluation + { + List _corners; + List _rejectedCorners; + + + Mat _rgbMat; + + + Mat _camIntrinsics; + Mat ids; + MatOfDouble _distCoeffs; + Dictionary _dictionary; + ArucoDetector _arucoDetector; + + //TODO: configure. For now the default (and used ArUco marker) is 4x4 50 + public int dictionaryId = Objdetect.DICT_4X4_50; + + public ArUcoSpacialEvaluation() + { + + ids = new Mat(); + _corners = new List(); + _rejectedCorners = new List(); + _rgbMat = new Mat(); // Initialize _rgbMat + _distCoeffs = new MatOfDouble(0, 0, 0, 0); + + DetectorParameters detectorParams = new DetectorParameters(); + detectorParams.set_useAruco3Detection(true); + RefineParameters refineParameters = new RefineParameters(10f, 3f, true); + _dictionary = Objdetect.getPredefinedDictionary((int)dictionaryId); + _arucoDetector = new ArucoDetector(_dictionary, detectorParams, refineParameters); + + } + + + /// + /// Obtain the pose of the camera from the captured image. + /// Pose is displayed as the localToWorldMatrix. + /// + /// + /// + // public abstract Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics); + public Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics) + { + if (camIntrinsics != null) + { + _camIntrinsics = camIntrinsics; + } + + // Initialize _rgbMat with the dimensions of the captured image + if (_rgbMat.empty()) + { + _rgbMat = new Mat(capturedImage.height, capturedImage.width, CvType.CV_8UC3); + } + + Utils.texture2DToMat(capturedImage, _rgbMat); + _arucoDetector.detectMarkers(_rgbMat, _corners, ids, _rejectedCorners); + + return EstimatePoseCanonicalMarker(_rgbMat, markerLength); + } + + private Matrix4x4 EstimatePoseCanonicalMarker(Mat rgbMat, float markerLength) + { + using (MatOfPoint3f objPoints = new MatOfPoint3f( + new Point3(-markerLength / 2f, markerLength / 2f, 0), + new Point3(markerLength / 2f, markerLength / 2f, 0), + new Point3(markerLength / 2f, -markerLength / 2f, 0), + new Point3(-markerLength / 2f, -markerLength / 2f, 0) + )) + { + if (ids.total() > 0) + { + using (Mat rvec = new Mat(1, 1, CvType.CV_64FC3)) + using (Mat tvec = new Mat(1, 1, CvType.CV_64FC3)) + using (Mat corner_4x1 = _corners[0].reshape(2, 4)) // 1*4*CV_32FC2 => 4*1*CV_32FC2 + using (MatOfPoint2f imagePoints = new MatOfPoint2f(corner_4x1)) + { + // Calculate pose marker + Calib3d.solvePnP(objPoints, imagePoints, _camIntrinsics, _distCoeffs, rvec, tvec); + + // In this example we are processing with RGB color image, so Axis-color correspondences are X: blue, Y: green, Z: red. (Usually X: red, Y: green, Z: blue) + Calib3d.drawFrameAxes(rgbMat, _camIntrinsics, _distCoeffs, rvec, tvec, markerLength * 0.5f); + + return GetpositionAndQuaternion(rvec, tvec); + } + } + } + + + return Matrix4x4.identity; + } + + private Matrix4x4 GetpositionAndQuaternion(Mat rvec, Mat tvec) + { + // Convert to unity pose data. + double[] rvecArr = new double[3]; + rvec.get(0, 0, rvecArr); + double[] tvecArr = new double[3]; + tvec.get(0, 0, tvecArr); + Debug.Log(rvecArr); + Debug.Log(tvecArr); + PoseData poseData = ARUtils.ConvertRvecTvecToPoseData(rvecArr, tvecArr); + + // Convert to transform matrix. + return ARUtils.ConvertPoseDataToMatrix(ref poseData, true); + } + + public void dispose() + { + _camIntrinsics.Dispose(); + _distCoeffs.Dispose(); + ids.Dispose(); + foreach (var corner in _corners) + { + corner.Dispose(); + } + foreach (var corner in _rejectedCorners) + { + corner.Dispose(); + } + } + } + + public class SpacialEvaluationManager : MonoBehaviour + { + + //The textured plane, child to the arucoObj. + //In the current implementation, this plane is rotated by 90 degrees along the y axis. + // This is to make sure that the initial state (unrotated) + public GameObject texturedPlane; + + // The ARPlane object that will be moved, child of the arucoParent + public GameObject arucoObj; + // The parent object of the ARPlane object. These two objects are for rotation purposes. + public GameObject arucoParent; + + public Camera activeCamera; + + public TMP_Text infoText; + public Button toggleButton; + public TMP_Text buttonText; + + public TMP_InputField iterationsInput; + + + ArUcoSpacialEvaluation spacialEvaluation = new ArUcoSpacialEvaluation(); + + bool isRunning = false; + + bool isCancelled = false; + + + + void Start() + { + toggleButton.onClick.AddListener(OnButtonClicked); + } + + Mat GetCameraIntrinsics() + { + float f = activeCamera.focalLength; + float fx = f; + float fy = f; + + float cx = activeCamera.sensorSize.x / 2; + float cy = activeCamera.sensorSize.y / 2; + + Mat camMatrix = new Mat(3, 3, CvType.CV_64FC1); + camMatrix.put(0, 0, fx); + camMatrix.put(0, 1, 0); + camMatrix.put(0, 2, cx); + camMatrix.put(1, 0, 0); + camMatrix.put(1, 1, fy); + camMatrix.put(1, 2, cy); + camMatrix.put(2, 0, 0); + camMatrix.put(2, 1, 0); + camMatrix.put(2, 2, 1.0f); + + return camMatrix; + } + + void OnButtonClicked() + { + int iterations = iterationsInput.text == "" ? 1 : int.Parse(iterationsInput.text); + if (!isRunning) + { + isCancelled = false; + isRunning = true; + StartEvaluation(iterations); + buttonText.text = "Stop"; + } + else + { + isCancelled = true; + isRunning = false; + buttonText.text = "Start"; + } + } + + void StartEvaluation(int iterations) + { + //Potentially randomize camera intrinsics + Mat intrinsics = GetCameraIntrinsics(); + + float errorScore = 0; + int validCount = 0; + + int mHeight = activeCamera.pixelHeight; + int mWidth = activeCamera.pixelWidth; + + var rect = new UnityEngine.Rect(0, 0, mWidth, mHeight); + RenderTexture renderTexture = new RenderTexture(mWidth, mHeight, 24); + Texture2D screenShot = new Texture2D(mWidth, mHeight, TextureFormat.RGBA32, false); + + activeCamera.targetTexture = renderTexture; + + // Assuming marker is scaled proportionally in all directions, and units are in meters. + var markerLength = texturedPlane.transform.localScale.x; + + for (int i = 0; i < iterations; i++) + { + if (isCancelled) return; + randomizePosition(); + randomizeRotation(); + + activeCamera.Render(); + + RenderTexture.active = renderTexture; + screenShot.ReadPixels(rect, 0, 0); + + Matrix4x4 evalRes = spacialEvaluation.ObtainPoseFromImage(screenShot, markerLength, intrinsics); + Matrix4x4 truth = GetGroundTruth(); + + if (evalRes != Matrix4x4.identity) + { + errorScore += SpacialEvaluation.GetErrorScore(truth, evalRes); + validCount++; + } + Debug.Log(errorScore); + Debug.Log(evalRes); + Debug.Log(truth); + Debug.Log("---------------------"); + + + infoText.text = errorScore.ToString(); + } + + buttonText.text = "Start"; + infoText.text = $"{errorScore.ToString()}/{validCount}"; + isRunning = false; + + } + + Matrix4x4 GetGroundTruth() + { + Transform t = arucoObj.transform; + // Vector3 relativePosition = activeCamera.transform.InverseTransformDirection(t.position - activeCamera.transform.position); + + + // return Matrix4x4.TRS(relativePosition, t.rotation, Vector3.one); + return Matrix4x4.TRS(t.position, t.rotation, Vector3.one); + + + } + + void randomizePosition() + { + // Randomize the position of the object + // ranges are set to be of adequate size to fit the camera viewport. + Vector3 viewportPos = new Vector3(); + + viewportPos.x = Random.Range(0.1f, 0.9f); + viewportPos.y = Random.Range(0.1f, 0.9f); + viewportPos.z = Random.Range(3, 6); + + Vector3 pos = activeCamera.ViewportToWorldPoint(viewportPos); + Debug.Log(pos); + arucoParent.transform.position = activeCamera.ViewportToWorldPoint(viewportPos); + } + + void randomizeRotation() + { + // Randomize x and z of parent + // Values are tested relative to camera's viewport, so that it is visible + Vector3 parentRotation = new Vector3(); + parentRotation.x = Random.Range(-100, -50); + parentRotation.z = Random.Range(-30, 30); + arucoParent.transform.rotation = Quaternion.Euler(parentRotation); + + //randomize y of plane + Vector3 planeRotation = new Vector3(); + planeRotation.y = Random.Range(0, 360); + planeRotation.x = 0; + planeRotation.z = 0; + arucoObj.transform.localRotation = Quaternion.Euler(planeRotation); + } + } + + +} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs.meta new file mode 100644 index 0000000..a3839e1 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c7ddcab23e564e1449ac442ecfd45709 \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef new file mode 100644 index 0000000..2262c8e --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef @@ -0,0 +1,22 @@ +{ + "name": "CakeLab.ARFlow.Evaluation", + "rootNamespace": "", + "references": [ + "GUID:cef0e9dabbfe59a4790acbf31c21f33e", + "GUID:a9420e37d7990b54abdef6688edbe313", + "GUID:92703082f92b41ba80f0d6912de66115", + "GUID:c536cb714a8a9e84cb16ecf0330eea40", + "GUID:e40ba710768534012815d3193fa296cb", + "GUID:dc960734dc080426fa6612f1c5fe95f3", + "GUID:6055be8ebefd69e48b49212b09b47b2f" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta new file mode 100644 index 0000000..46b36c5 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: aaf6de717c7063d47bd9791dc7f03091 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt new file mode 100644 index 0000000..f3c281a --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt @@ -0,0 +1,36 @@ +License Agreement + For Open Source Computer Vision Library + + +Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved. +Third party copyrights are property of their respective owners. + + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + + * 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. + + + * The name of the copyright holders may not be used to endorse or promote products + derived from this software without specific prior written permission. + + +This software is provided by the copyright holders and contributors "as is" and +any express or implied warranties, including, but not limited to, the implied +warranties of merchantability and fitness for a particular purpose are disclaimed. +In no event shall the Intel Corporation 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. \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt.meta new file mode 100644 index 0000000..5f39c28 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/license.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 553448df715ca4b4584427b02eb04cdb +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From fe517e267ceed69cc9f2ba81adfe955d3dfd42bb Mon Sep 17 00:00:00 2001 From: felixngfender Date: Thu, 6 Feb 2025 03:18:36 -0500 Subject: [PATCH 10/21] chore(evaluations): precious experiment data for temporal sync evals --- .vscode/settings.json | 2 + python/.gitignore | 3 + .../data/multi_device/ntp_clock/run1.rrd | Bin 0 -> 24448 bytes .../data/multi_device/ntp_clock/run2.rrd | Bin 0 -> 22856 bytes .../data/multi_device/ntp_clock/run3.rrd | Bin 0 -> 23331 bytes .../data/multi_device/ntp_clock/run4.rrd | Bin 0 -> 22922 bytes .../data/multi_device/ntp_clock/run5.rrd | Bin 0 -> 25946 bytes .../data/multi_device/system_clock/run1.rrd | Bin 0 -> 29614 bytes .../data/multi_device/system_clock/run2.rrd | Bin 0 -> 26794 bytes .../data/multi_device/system_clock/run3.rrd | Bin 0 -> 26694 bytes .../data/multi_device/system_clock/run4.rrd | Bin 0 -> 26723 bytes .../data/multi_device/system_clock/run5.rrd | Bin 0 -> 24775 bytes .../ntp_clock/pixel_6/run1-logcat.txt | 294 +++++++++++++++++ .../ntp_clock/pixel_6/run2-logcat.txt | 307 ++++++++++++++++++ .../ntp_clock/pixel_6/run3-logcat.txt | 294 +++++++++++++++++ .../ntp_clock/tab_s6/run1-logcat.txt | 301 +++++++++++++++++ .../ntp_clock/tab_s6/run2-logcat.txt | 295 +++++++++++++++++ .../ntp_clock/tab_s6/run3-logcat.txt | 307 ++++++++++++++++++ .../system_clock/pixel_6/run1-logcat.txt | 295 +++++++++++++++++ .../system_clock/pixel_6/run2-logcat.txt | 290 +++++++++++++++++ .../system_clock/pixel_6/run3-logcat.txt | 291 +++++++++++++++++ .../system_clock/tab_s6/run1-logcat.txt | 252 ++++++++++++++ .../system_clock/tab_s6/run2-logcat.txt | 296 +++++++++++++++++ .../system_clock/tab_s6/run3-logcat.txt | 292 +++++++++++++++++ .../DeviceSample/ARFlowDeviceSample.cs | 10 +- 25 files changed, 3524 insertions(+), 5 deletions(-) create mode 100644 python/evaluations/data/multi_device/ntp_clock/run1.rrd create mode 100644 python/evaluations/data/multi_device/ntp_clock/run2.rrd create mode 100644 python/evaluations/data/multi_device/ntp_clock/run3.rrd create mode 100644 python/evaluations/data/multi_device/ntp_clock/run4.rrd create mode 100644 python/evaluations/data/multi_device/ntp_clock/run5.rrd create mode 100644 python/evaluations/data/multi_device/system_clock/run1.rrd create mode 100644 python/evaluations/data/multi_device/system_clock/run2.rrd create mode 100644 python/evaluations/data/multi_device/system_clock/run3.rrd create mode 100644 python/evaluations/data/multi_device/system_clock/run4.rrd create mode 100644 python/evaluations/data/multi_device/system_clock/run5.rrd create mode 100644 python/evaluations/data/single_device/ntp_clock/pixel_6/run1-logcat.txt create mode 100644 python/evaluations/data/single_device/ntp_clock/pixel_6/run2-logcat.txt create mode 100644 python/evaluations/data/single_device/ntp_clock/pixel_6/run3-logcat.txt create mode 100644 python/evaluations/data/single_device/ntp_clock/tab_s6/run1-logcat.txt create mode 100644 python/evaluations/data/single_device/ntp_clock/tab_s6/run2-logcat.txt create mode 100644 python/evaluations/data/single_device/ntp_clock/tab_s6/run3-logcat.txt create mode 100644 python/evaluations/data/single_device/system_clock/pixel_6/run1-logcat.txt create mode 100644 python/evaluations/data/single_device/system_clock/pixel_6/run2-logcat.txt create mode 100644 python/evaluations/data/single_device/system_clock/pixel_6/run3-logcat.txt create mode 100644 python/evaluations/data/single_device/system_clock/tab_s6/run1-logcat.txt create mode 100644 python/evaluations/data/single_device/system_clock/tab_s6/run2-logcat.txt create mode 100644 python/evaluations/data/single_device/system_clock/tab_s6/run3-logcat.txt diff --git a/.vscode/settings.json b/.vscode/settings.json index 64bec6c..62e3502 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -62,6 +62,8 @@ "cli", "client", "examples", + "evaluations", + "benchmarks", "others" ] } diff --git a/python/.gitignore b/python/.gitignore index 4e75a16..8ce1e4b 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -185,3 +185,6 @@ pyrightconfig.json # benchmark artifacts benchmarks/payload benchmarks/results + +# evaluation artifacts +!evaluations/**/*.rrd diff --git a/python/evaluations/data/multi_device/ntp_clock/run1.rrd b/python/evaluations/data/multi_device/ntp_clock/run1.rrd new file mode 100644 index 0000000000000000000000000000000000000000..985ec27a7edd9035b2b22a7c76d89cb1245308cc GIT binary patch literal 24448 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 literal 0 HcmV?d00001 diff --git a/python/evaluations/data/multi_device/ntp_clock/run2.rrd b/python/evaluations/data/multi_device/ntp_clock/run2.rrd new file mode 100644 index 0000000000000000000000000000000000000000..8ddaf5b3e7d51cb3ccab7037b626485e2b03c72c GIT binary patch literal 22856 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 CzJja( literal 0 HcmV?d00001 diff --git a/python/evaluations/data/multi_device/ntp_clock/run3.rrd b/python/evaluations/data/multi_device/ntp_clock/run3.rrd new file mode 100644 index 0000000000000000000000000000000000000000..51cf206458e71f153f392ce4f870de84c175b65b GIT binary patch literal 23331 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 literal 0 HcmV?d00001 diff --git a/python/evaluations/data/multi_device/ntp_clock/run5.rrd b/python/evaluations/data/multi_device/ntp_clock/run5.rrd new file mode 100644 index 0000000000000000000000000000000000000000..2349d13e42f763149175d9921a42508e27751672 GIT binary patch literal 25946 zcmeI42|!d;_rTAa8JJN=85mFy6f{&cml<|=!_2T~xRj_=Rwg10imbwrfEs9;=8_1M zm`emMxMW(Gj_QOmX=E{SmRRRQvA=Gg=P>0OzQi8U)H(Y`{u28-kkHh z=bU@TjveL;&U_#UfL{UNE{Y*)&em}n?Ko{lmS%W*QpVg3Ss63pk`w1{)F!8C;?lDZ zyY^c8<(^&jzg8xvCmhZxz8<)}jTA z4iE)5#;r?9PEXu4R+EsCm6)79r6M`;gm;2G!Ozb((QlAkJ~?2Jzg+G=XtH0BY*2iF z-{e3|ye2^|(`-pd%}CcI#wBHCq}9BaoE?{ul$4y19G@De$&F9TOx5h$n5~V^(rOad zg6|76w&sArD?1}6D?u}7Q%s(AYDW6F#FTmK)8eOPWbxOhC8uX(iPvYwYZImlH)QAF zxpK?nI{@@|z{gLVQx%?tkNkM{l;XJ$dc!3)y>+Zs^^wBZTV1bizxMh&D~8OOyDmLG zO|v~w^FnfhCT<{nhxebBS*gv-To;So90b?gE3U`Efi7kB_^(a?fd9jFtUKdh0pJ$~ z9ibD5uoSq$q$RjPf?MSsLF^5VB7azZ5O-OK66_4i0dC@) zkfq7WNgs^8nw`OQp$tF)5DNks7+k#Yb9u0@JUA*UXlSJ0u*eXMi4uTW;O;RCpcK@;zJW3?aB(Sw8!%N9pBa~(oUe(SoTt@fE5N-- z0R_2u@*z{=N(slG9~+V#pO&4IK4pT}xW@;@1_#RGQl`eIPl-#C1qKBMCHaR0#QXaB zC5C8xgA)7`LV|*W5+)~vB>4`Rl9!c{osf~K!M6jubV$5bo2<=A)Zn?naXT0~Xwq>* zUL1biQ*jd?R)i6s(4z`&h!Qf= zGV!;NuFW1iHbZOtp^eFj*Lo1@a=iOf1XS^035@9oPT-ObQs+fLN`SYY=Mc>!U<4nE zLF`393<2W-z5s`tJV*RxLLEr?bpYe};r4BkFp=|DLgyV;Kd5@3JDqM z+N_LJ8hGwLb-ZrU@dObFnc0J5pBx?q9s&aqK6dQrr$aTlT1|R3YJt#c0@w@H-ofu-9T9+P#+!%T#q$=}9fF9l88e2@ zC-B7tu#+x~=0h$Jjy$3}4-WFi@UfGm=Xmh3V9W)s>w1D8z!`7g@wjeq20=6r1Uv^G zxJV`q;z!~+3Prd91QHN<0db8l;^9x95PE^6um@jg{6Jdm43DVoIsl&s4id1F)NCTK z3Zn=?Eq5$#3v=H74B+0&o*g+p{Mgc7t|I86<`>yz1%rbKhN}BN<54-uRIS*4^q{%= zR$qDTBoL+$ct5<7XQIS0w=bRT_N)k`&!J2}c^+jVN*qc&%4C!TltdH_N)pNxl&L7m zDAQ0_Q31KIri8VqKHsBpmap(gd#@ijM4=KZ&E4|frA%xmOA=?)Ct>C z6lW9{l&&b%IfR6YdD?l*j~d=G-K zjQTtj%keczEO+0Dz;aB7$FO{!8iD2F_|aIdkdDLh{L!bdeDQniL;3oV*lY5QHP~nJ z;hm;ndEzAYk38#AI+jH)*;smAcmYe@jeIPl_rHkc_n*(jGXM0;SeA8KjHTRd8J2r5 z6=Rv;zXHo0Kfi&c`h&Gt#$B%vfhd*x3I(vt4m#Pv6gzm%4peqhduKZs)xoht&rbLf zb_y1b>x}PPmopvVkZ`&qR-FK%g%E9D;)0E?DBV_fsBy!;-BH|8@M}FN8rKtRp8i5Z z=U!Opjq(Tz{w|>p3aSw3hq6`pW`F!M0OiqAJGee_XK4iWcGg1bcfEtoyS_jrPgPN$ zyUn9soGjGIu)St*6!q1*`P9FCgu4FNj`%8qIx}HDl|c%1k7E11Q7Y>0#Cg}Ue$Tic$!53T%scBsEJ~ zNa0(gBeDI>)DWsNsDL^=SEviaw&3e9N|!Q|de=*+Q(`;kEt1mr%A>ya73w0e{c|Nr zm0iuJj;Vw?HMYI}6-s$*&82?B^G9Oa-JPVuZ{||FLu619)`z49FV3Sf!X$9LQ_`2g z)S8cGQcq+Fb>X<{r1K=T|41J7zMljtX6i`_`p>2oJW&W0d(%m3(}X;#JV*`KJjj*7 z)M%G%YKy;6Hv*3fm=H>J3dy1tNrk%M*gm#JL2b>;pvq6#d*NkxP9&xHC5@VK$zJz3 zempf@K`pz=?*H}xc`1pjGN&rj`jG5B?KbPS`2O;f1gwf4F(_<6TWq159aOrzqCa_2r(9!i}W zl|pGw+3QB*r(JoW)ab`ks0HV}pdz|7giH#L#U&Z z(x_cLp&AS!zjO(uGQP^7QtXAgQFxX!eR@*YehQ)vRN3p6V*74#KWff}$<#!NI5-j8 z-;2~#?6C#Zs88*8`(PVYb3MMPkR}4y)TO;ZD{ES~HE79O4_dC=4YmwgMQ9S+AGCse z1H%!8Z9vOU-W+Jjg8ezrk~Ilhr3hNHvER+0HS(c>R+bq*;;&9i~6fkxQ++6Y?%&9F7l1X~-7uvN&x76*;fO|<1|OX5k3n1~C%lUm{) z;__;ixS}}Xk`xXF4!QQ5k?TzBkgNZ_$aU2kx!jsVE{O@bgx1J4&xBl~ddD>&m%Of% z1-Wj!`&61at1AAa1-Vl6N-N}g&Wv1*QEL*S4u@N);}7zd+9>G+$sFK2PMSOLrCJjA*p?;L%$eu zVUHK&U{g1zpI!`VtnD5`fIrBD?sF%AB*Y(hV({_`^?(Tdpb4QeSnj36tDzXgAWQAz z?+U~`<38m&RDB4EXePD-PXS)#A-D(L1**(R5UzWz|3S39RiMU$_5^doT{Ujv4jKiV zN)q8v%sBR+1u@)BQZnG<=6QG%cs>IT%wUW`H~x{$I8Nq)8Xt+A%8h1uB7zqS^4os5 zaUVPeN4du#JOp=i1)dKOhd`ne0~|8m84qMK&)4ye1UTj;;0VAH9J2y}kB(0jG7tn+ z+@0W6@gzJgUNHps$9wbv^H-Ugv>ZA!pO^yM=G?jBm9YbiA~yAM%-}mvGM3wFhlB&=k@ppHy!{t zy4rYn{u11{R^PcIM?}wBw2v&kTfi>!5YWdbvt$j{D>vHF{rc=DH(WUxMHkAUuTnj!UAA6RWi-`-e5zJvAinF5->zJ}Ccy z9;W^4Kf6P{a%eYckK2`B-J)JQMUeumYX|>EE#FCzx9~hYC*PuOX((^F=Ch~!4eH&Z z-J}oh@{;m8_1?HWWIwD27yLw}SJLDFth0BnQdJ!&G63t{c?RmXhL*v#QAZ#Bk-EH( zCWqkW#ZS~yhhL(}AguG8u26Rl(_{$NFNa*Fvb$1b1lHf!_5*cW#E`?V{>3MksS{`R zkSeTC7<+|UUABh|!}@1fKXwZV>zaUi{R(BjL`R0>X6aX#sg1Ag5kvi;=%lOEg-$v$ z6gOWy`4hF+eh(?b`sX)yQA<77lK#IJu#3)pPc2BhO70n{HRJ@g9&-M(JS)LNWpckpkQ4Yoki&UaFw|v%oQLOGiBCw-q-xNu zg7FhP|397;+YnYG*lF6cB9X)polL>3*3k|Z%(9`K7K2%Brk$pOS^sISl~PyU;O4$4eWTV zs(_tyr6Ya!ERzcAV_)B)44mgfUjE&u=mrvF9QM==JkkIHye)K!hzR+o-ycxG^sF;q zQsXbYy&7NwG5zHq){{M;um}X$t^vXuoc2!w`M2kG;UR^DeEV6}6@#azPa4mFBQq%C z&Up=<|2~=?d1)od?#yAUFRnQb@{=FTN#)Kt`UmZtd+-D!n{Wxkq3x4l6Mpo7HJ->? zgC}LDE8sxq@thB)<-iZRss4h%kH0+1KQf>Zp2(WP6HLsJ-9N)-Cenl12g4uoSVqQ_ zRLumhnB-hd>IARAxDN31z(h^3EGa1#( zE|@=`T;oHSlWQ8{J%4|8O+(11^|>|ogna)0CE4_%EnwCV=0TZ~Y{qg)HoZMD zBjHSwIX03(d>OuV=Lk#}K|hOtOREVdOimZBQ4?ZrNS8R{M`2v}hfA^P<~7wezXpQs z#h6|b8<+mLDZR!;{q2dAEcEP(AV5t#+pjW)tM*ZAmc09+nyU^{2k-Z-jpj0(aA4HA zb;r|t-4&@fgZIs_oen+VnVSdGmXpj=v;GytQ1SobWm`78RY^EB_BeCS! zG)F8_%rB8@QF2f)%S1W@C07LQc^LGO5uH0@0?p73H;f51U%r5MB>!w1-iy3nZ(b20 zf8i`%QvT*%Owf@JF2-1qTrR{!9C^>R7!#6@sX{l6T&e1X<$L43v0Usp0Ly3B`eT{C zG#Ja@pI2b%vM&12Sf)MwB$kU_dIrnOdQ3BtOMK7`C7*Z+olx@l ziI_|zPy9Eg5y_v~&85f))HAW{m0Eyh^p`JTx%8O@Sbn%;8I~2N%S6z*7uV4aa7+Lr z1+YQ@GX;)z-`nwG1<)NMG7~#;NiezgrX-kwLJ$j~P9(=1n1%LGWA{f6%qfvg4osC0 zMCKeAt-WWjtpd)O?}D$L^i^Fi<&c%jX+K}7a#81e)n=uq^2V!6=$N_A$|v0ORa-NA zDf115^p($DlwaP;Q>`5DsZ2Y+n4T~1rYwhi)syddDtG=;NS7S$rrc1Mr-}{hsr+!} zOnQUTRk@g-uevzMQ~A~IJo=cYt1|jdp31SjhjKQ57Cn5OtMY_hzG}u=ccu1hA#D(M zSN^M0zN+k8cjc)Q^XTYd-IXdyzUq^8-IY6@oJZG=?XDc=k{=vyp$=2qnir;oq zPVyJbHw;7C%o{doCcDAK zaW`D+cyCUxDa{0fi3Xx^O7B9Oz>mxr`1ux-FbLGirj*`XFsAfwwhjE`m;yf@)`6c0 ztH96EmI6PAz&fYblx6Z+8v{REn+p6K%`bO$3)bT{%aHI~QJ7)}?N`5s{hc#{7K@hl$Vxo=UW@*EcwOf*6rVcd6ZKVw< z(uOo2sRPZoLjd7~9QNNu9U>2|qn+U~0le2h9p4(MqiX|oXwB5&gDfEggONJs*#m7w z9Y;lA5H_TNtP}o`1~OIDKplpq#|{h$TfTjsGJ4v6Md7xk%omr3F|W##!iE&Ogw;ql zggy7XC`?<^H7se!Df-cYkJC$53+UfJ3<=BMRHL|Edqgq(+BwA-uda$y{X!I{wmqY8 zeRry&U)lmj)61Ry>8&1$;`xJ_ZjVMQGE<)jyKv5R;-5xy{nhVz?ugWh_OE(Xt*-LwAgO8GWYs<&@ zz^~)Y{EITYGtn6gcH;&gqp;6t+(ds9kWcC-_X^X38oP!*2=%@4W#3Uw5j`2~BCh-J z77FQ|TMyGy-k(K(syDg0qeIitH?s8dTkfFhH$Yl^YQIw=4a$5Tbp_R)|>ew zoSAPqwd1dGD+C1vg$IT-GV}fqWahbvJNYe``3G<-SQ0y$o3mrG?|){_PTSlHTpH=2 zmJEDM6PX=2X{SwTr0be8@HIS#D74_i?lJH+76WgvG4Qc`@uoHy_?wLlylWE%KB>XL zW3CpO_Ovz{crR-MUnh_*Y{tOv`&$hBg88!=4E$4)nHB@@B#N>a_)QAE#lZW2G|tMv z-!dC`&W&I(>}GdDZ(@b4NjHMUuv@0%l%$yrd^(;a0|k>iEP;>a+z1xKE=9vGorMN| z_W!1Vf6C}qcvuF$zJ5_~zjaLIlvVl{`)0GV6Dyc#ua)}E3$oeBORJfpz&SWgRNsWP&~^*8jFZ%d*PV%op{=`r`|=Z1mS_ znDcKJ>-o#I?9!`i8OO?E{fT8-_Q`kNVlK}p*1KSR$JDo&!<&osGTeV}ze?t_F2(wD zZ)n;2!xhZO!;1COOSG(a**fOf%3^)kTrImRu97)>v{=7kmX_@;S;m{I2lc;6GJ8xoMoL8d% zV62uc@3oc5&Fji$cY#0DJBTL%!%G(Vh=#%O_gIN!fb0fdmo!+D!Iy5`~h z1h5FLX(GUN>Gn~JF5aDK1L4@NXxcSF$zRGGipZdpe9+n^~Gy975A+xgBT^&|1 z6Dx}KKU8YjUwl?Gvp-(0f39pg`}6$m%#7R1_4_vFutnb93f z^uj~gZ1DV@%ugS`s{e7Omd%>7fk}-h*57$V%RVRE$hc*d>X&krP% zVc+PxmC<%A)}KD9Ws5tMG325WJyDm2yd;Ygi|6gjR>yIYLC@8hGs4_TKlYn z7q18Py=qr@Kv>6())wfxyqY2jgj6 zT?2@6!rcRd%)1HW`WjKDSr|Ds>uWSI2}6*`Ev~_h)2(M#)vH~Jm~I1W!IALccXTD-V-V~HheJSk_QK)@5s{Ir z$@YsHo}S1pfRm9`OO&XwC%82<%4>-+ow*e`l!VmzS%OPvEaHm|1cOj(Sy974KosBI z#|ww%<$!ByTyrols^N_LG+tB#7mqeC);|09XJxgjV zA$Y%YPFN{y<>N6t0by^6_IE9G2RyGS^zT^H6&gMvzU1b83J!1!Xz(QYh_yqmiSAA@wt<{I{KTmyx4~>Xyq&|YIM**!>ALjHSPJKN5^r2JG9-0Had?wA& zkUaFir#cLh`>PI(ftz31jPAe%dHySO$F<%AtaQf=Gk~|OJM2++)S+H(C-hiSVXZst zQFjz^8n_0pivPE5g|Gd1z(Yrm;K*>_M!LghdW4nkkTr)MrHCHpH77XT@$hCw*dzns z)1wE$R*4*iaof@09@m=TV>|A&4h0in5lC#8_8Mn|4;fA^M*hH`1a0DvXcK?r8Tn&6 zx8#IBT5w}70MBN9FSTi{E?iO#*Xnu}^IlEiey4^NB)TTTb;1fMA~RAmvW|d>CXPUi z>%b#Goa1#l0)lFAIEWT{xJU)E1g?RFpRBWH2}WRM2?O5}!@tX) z&b`LDn3Og9{0#PL7-{cY;Yqn1EKn#48+3 z@DFhF$B`Kzm}rJ15F;wz2;@{jHxov<*kFW18E_!uh8)pfRS)$k;D%{>4J5(mew6Ju z5b3+pS{n#Z8;#5{PDE-)ts&9>16>rA@9X7!ne zqYEzHqYK!Ubis%QU4XN@{{~&K*P;t2V;q*M;33G)Pdw4b+F_Qb&%M2 zYylGl+z7&$RqR^R1BAvJvDBgpij1m2aUWICYpse?1@0zQkY_^$EvSOuaJ+43KQK5V zuvP^kR0Rt;Rj|87RWJ|jU85DL+C>#a$z=YGR6%fz)#4DXQ3Xp-6`0qB;8a1otP5eQ z1P+;%Kxz|8AlC*6yod%R;Dt)yA}-fyQUYod5KOmG0%ay8Ahu2pd^k$r)ICbzy_S@K zvOx(%{Vhshr$q@|Y)}F>TLgkde-99#Z(`ECC@UW5)|dylFoY||14HWTld*<$(ZB=s zs07+?bWn42x3v=J)cVoE!oNfbM9QN4BN{sPA!uHh!V`Hp=pu>NjCJ68ikTuc-ArGPnX8qwHczEtYn`|Sz kz(4N7zr#iF|IJ;@&0G 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 YmC<&*A25X)#@yErG{-9d(i;Bze_gV>bN~PV literal 0 HcmV?d00001 diff --git a/python/evaluations/data/multi_device/system_clock/run2.rrd b/python/evaluations/data/multi_device/system_clock/run2.rrd new file mode 100644 index 0000000000000000000000000000000000000000..51909c8f9b6a1bb3807802f63879a16bebb9bbe0 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/python/evaluations/data/multi_device/system_clock/run3.rrd b/python/evaluations/data/multi_device/system_clock/run3.rrd new file mode 100644 index 0000000000000000000000000000000000000000..643c1c79be62113886c50ca659ab970f50e6b230 GIT binary patch literal 26694 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 literal 0 HcmV?d00001 diff --git a/python/evaluations/data/multi_device/system_clock/run5.rrd b/python/evaluations/data/multi_device/system_clock/run5.rrd new file mode 100644 index 0000000000000000000000000000000000000000..e23ee1e118e2d6a5d1b8e2a2db30aaaba446cebe GIT binary patch literal 24775 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 DlPiHU literal 0 HcmV?d00001 diff --git a/python/evaluations/data/single_device/ntp_clock/pixel_6/run1-logcat.txt b/python/evaluations/data/single_device/ntp_clock/pixel_6/run1-logcat.txt new file mode 100644 index 0000000..ac5b77f --- /dev/null +++ b/python/evaluations/data/single_device/ntp_clock/pixel_6/run1-logcat.txt @@ -0,0 +1,294 @@ +2025/02/06 01:36:52.118 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:49.5500000Z","device_time":"2025-02-06T06:36:52.1093140Z"} +2025/02/06 01:36:53.119 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:50.5590000Z","device_time":"2025-02-06T06:36:53.1191340Z"} +2025/02/06 01:36:54.142 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:51.5820000Z","device_time":"2025-02-06T06:36:54.1419140Z"} +2025/02/06 01:36:55.140 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:52.5800000Z","device_time":"2025-02-06T06:36:55.1396320Z"} +2025/02/06 01:36:56.160 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:53.6000000Z","device_time":"2025-02-06T06:36:56.1601440Z"} +2025/02/06 01:36:57.179 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:54.6190000Z","device_time":"2025-02-06T06:36:57.1789070Z"} +2025/02/06 01:36:58.225 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:55.6640000Z","device_time":"2025-02-06T06:36:58.2240060Z"} +2025/02/06 01:36:59.235 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:56.6760000Z","device_time":"2025-02-06T06:36:59.2352750Z"} +2025/02/06 01:37:00.290 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:57.7300000Z","device_time":"2025-02-06T06:37:00.2898040Z"} +2025/02/06 01:37:01.320 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:58.7600000Z","device_time":"2025-02-06T06:37:01.3195510Z"} +2025/02/06 01:37:02.330 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:36:59.7710000Z","device_time":"2025-02-06T06:37:02.3302980Z"} +2025/02/06 01:37:03.331 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:00.7720000Z","device_time":"2025-02-06T06:37:03.3313330Z"} +2025/02/06 01:37:04.338 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:01.7790000Z","device_time":"2025-02-06T06:37:04.3383680Z"} +2025/02/06 01:37:05.339 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:02.7790000Z","device_time":"2025-02-06T06:37:05.3387220Z"} +2025/02/06 01:37:06.390 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:03.8300000Z","device_time":"2025-02-06T06:37:06.3900800Z"} +2025/02/06 01:37:07.372 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:04.8120000Z","device_time":"2025-02-06T06:37:07.3717640Z"} +2025/02/06 01:37:08.355 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:05.7950000Z","device_time":"2025-02-06T06:37:08.3550720Z"} +2025/02/06 01:37:09.354 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:06.7940000Z","device_time":"2025-02-06T06:37:09.3542590Z"} +2025/02/06 01:37:10.385 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:07.8250000Z","device_time":"2025-02-06T06:37:10.3850160Z"} +2025/02/06 01:37:11.395 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:08.8350000Z","device_time":"2025-02-06T06:37:11.3952310Z"} +2025/02/06 01:37:12.413 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:09.8510000Z","device_time":"2025-02-06T06:37:12.4110550Z"} +2025/02/06 01:37:13.435 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:10.8750000Z","device_time":"2025-02-06T06:37:13.4346950Z"} +2025/02/06 01:37:14.442 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:11.8820000Z","device_time":"2025-02-06T06:37:14.4422240Z"} +2025/02/06 01:37:15.478 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:12.9180000Z","device_time":"2025-02-06T06:37:15.4780730Z"} +2025/02/06 01:37:16.488 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:13.9280000Z","device_time":"2025-02-06T06:37:16.4880570Z"} +2025/02/06 01:37:17.517 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:14.9580000Z","device_time":"2025-02-06T06:37:17.5173350Z"} +2025/02/06 01:37:18.539 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:15.9790000Z","device_time":"2025-02-06T06:37:18.5388410Z"} +2025/02/06 01:37:19.541 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:16.9800000Z","device_time":"2025-02-06T06:37:19.5395380Z"} +2025/02/06 01:37:20.562 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:18.0020000Z","device_time":"2025-02-06T06:37:20.5618940Z"} +2025/02/06 01:37:21.591 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:19.0310000Z","device_time":"2025-02-06T06:37:21.5907570Z"} +2025/02/06 01:37:22.570 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:20.0110000Z","device_time":"2025-02-06T06:37:22.5702840Z"} +2025/02/06 01:37:23.584 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:21.0240000Z","device_time":"2025-02-06T06:37:23.5841940Z"} +2025/02/06 01:37:24.628 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:22.0680000Z","device_time":"2025-02-06T06:37:24.6277190Z"} +2025/02/06 01:37:25.650 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:23.0900000Z","device_time":"2025-02-06T06:37:25.6497360Z"} +2025/02/06 01:37:26.660 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:24.1000000Z","device_time":"2025-02-06T06:37:26.6601940Z"} +2025/02/06 01:37:27.700 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:25.1400000Z","device_time":"2025-02-06T06:37:27.7000220Z"} +2025/02/06 01:37:28.736 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:26.1750000Z","device_time":"2025-02-06T06:37:28.7346370Z"} +2025/02/06 01:37:29.743 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:27.1820000Z","device_time":"2025-02-06T06:37:29.7413860Z"} +2025/02/06 01:37:30.745 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:28.1850000Z","device_time":"2025-02-06T06:37:30.7452520Z"} +2025/02/06 01:37:31.752 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:29.1930000Z","device_time":"2025-02-06T06:37:31.7523690Z"} +2025/02/06 01:37:32.761 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:30.2010000Z","device_time":"2025-02-06T06:37:32.7604850Z"} +2025/02/06 01:37:33.768 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:31.2080000Z","device_time":"2025-02-06T06:37:33.7678130Z"} +2025/02/06 01:37:34.776 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:32.2150000Z","device_time":"2025-02-06T06:37:34.7749050Z"} +2025/02/06 01:37:35.770 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:33.2100000Z","device_time":"2025-02-06T06:37:35.7701130Z"} +2025/02/06 01:37:36.805 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:34.2430000Z","device_time":"2025-02-06T06:37:36.8031350Z"} +2025/02/06 01:37:37.824 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:35.2640000Z","device_time":"2025-02-06T06:37:37.8237190Z"} +2025/02/06 01:37:38.838 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:36.2780000Z","device_time":"2025-02-06T06:37:38.8375430Z"} +2025/02/06 01:37:39.833 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:37.2730000Z","device_time":"2025-02-06T06:37:39.8331840Z"} +2025/02/06 01:37:40.854 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:38.2940000Z","device_time":"2025-02-06T06:37:40.8542010Z"} +2025/02/06 01:37:41.866 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:39.3070000Z","device_time":"2025-02-06T06:37:41.8663190Z"} +2025/02/06 01:37:42.913 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:40.3530000Z","device_time":"2025-02-06T06:37:42.9131850Z"} +2025/02/06 01:37:43.943 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:41.3830000Z","device_time":"2025-02-06T06:37:43.9430190Z"} +2025/02/06 01:37:44.958 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:42.3980000Z","device_time":"2025-02-06T06:37:44.9578960Z"} +2025/02/06 01:37:46.019 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:43.4600000Z","device_time":"2025-02-06T06:37:46.0194400Z"} +2025/02/06 01:37:47.006 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:44.4440000Z","device_time":"2025-02-06T06:37:47.0040570Z"} +2025/02/06 01:37:48.065 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:45.5050000Z","device_time":"2025-02-06T06:37:48.0651390Z"} +2025/02/06 01:37:49.074 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:46.5140000Z","device_time":"2025-02-06T06:37:49.0738380Z"} +2025/02/06 01:37:50.094 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:47.5340000Z","device_time":"2025-02-06T06:37:50.0939450Z"} +2025/02/06 01:37:51.101 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:48.5410000Z","device_time":"2025-02-06T06:37:51.1007000Z"} +2025/02/06 01:37:52.156 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:49.5960000Z","device_time":"2025-02-06T06:37:52.1560390Z"} +2025/02/06 01:37:53.172 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:50.6130000Z","device_time":"2025-02-06T06:37:53.1722930Z"} +2025/02/06 01:37:54.188 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:51.6280000Z","device_time":"2025-02-06T06:37:54.1879640Z"} +2025/02/06 01:37:55.218 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:52.6590000Z","device_time":"2025-02-06T06:37:55.2182980Z"} +2025/02/06 01:37:56.228 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:53.6680000Z","device_time":"2025-02-06T06:37:56.2276130Z"} +2025/02/06 01:37:57.254 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:54.6940000Z","device_time":"2025-02-06T06:37:57.2535970Z"} +2025/02/06 01:37:58.269 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:55.7090000Z","device_time":"2025-02-06T06:37:58.2690570Z"} +2025/02/06 01:37:59.283 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:56.7240000Z","device_time":"2025-02-06T06:37:59.2833310Z"} +2025/02/06 01:38:00.333 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:57.7730000Z","device_time":"2025-02-06T06:38:00.3331700Z"} +2025/02/06 01:38:01.355 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:58.7950000Z","device_time":"2025-02-06T06:38:01.3545210Z"} +2025/02/06 01:38:02.386 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:37:59.8260000Z","device_time":"2025-02-06T06:38:02.3858910Z"} +2025/02/06 01:38:03.393 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:00.8330000Z","device_time":"2025-02-06T06:38:03.3926250Z"} +2025/02/06 01:38:04.413 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:01.8540000Z","device_time":"2025-02-06T06:38:04.4133100Z"} +2025/02/06 01:38:05.426 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:02.8660000Z","device_time":"2025-02-06T06:38:05.4260320Z"} +2025/02/06 01:38:06.456 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:03.8970000Z","device_time":"2025-02-06T06:38:06.4563230Z"} +2025/02/06 01:38:07.480 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:04.9200000Z","device_time":"2025-02-06T06:38:07.4802750Z"} +2025/02/06 01:38:08.514 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:05.9520000Z","device_time":"2025-02-06T06:38:08.5114320Z"} +2025/02/06 01:38:09.547 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:06.9870000Z","device_time":"2025-02-06T06:38:09.5471000Z"} +2025/02/06 01:38:10.574 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:08.0150000Z","device_time":"2025-02-06T06:38:10.5744140Z"} +2025/02/06 01:38:11.612 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:09.0520000Z","device_time":"2025-02-06T06:38:11.6116590Z"} +2025/02/06 01:38:12.650 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:10.0900000Z","device_time":"2025-02-06T06:38:12.6495540Z"} +2025/02/06 01:38:13.660 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:11.1000000Z","device_time":"2025-02-06T06:38:13.6601890Z"} +2025/02/06 01:38:14.674 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:12.1140000Z","device_time":"2025-02-06T06:38:14.6738710Z"} +2025/02/06 01:38:15.710 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:13.1500000Z","device_time":"2025-02-06T06:38:15.7097780Z"} +2025/02/06 01:38:16.742 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:14.1820000Z","device_time":"2025-02-06T06:38:16.7421550Z"} +2025/02/06 01:38:17.781 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:15.2220000Z","device_time":"2025-02-06T06:38:17.7812740Z"} +2025/02/06 01:38:18.816 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:16.2560000Z","device_time":"2025-02-06T06:38:18.8161890Z"} +2025/02/06 01:38:19.836 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:17.2760000Z","device_time":"2025-02-06T06:38:19.8361350Z"} +2025/02/06 01:38:20.860 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:18.3000000Z","device_time":"2025-02-06T06:38:20.8600910Z"} +2025/02/06 01:38:21.888 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:19.3290000Z","device_time":"2025-02-06T06:38:21.8882670Z"} +2025/02/06 01:38:22.950 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:20.3900000Z","device_time":"2025-02-06T06:38:22.9494530Z"} +2025/02/06 01:38:23.960 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:21.4000000Z","device_time":"2025-02-06T06:38:23.9596090Z"} +2025/02/06 01:38:24.998 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:22.4380000Z","device_time":"2025-02-06T06:38:24.9981990Z"} +2025/02/06 01:38:26.025 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:23.4660000Z","device_time":"2025-02-06T06:38:26.0253390Z"} +2025/02/06 01:38:27.038 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:24.4790000Z","device_time":"2025-02-06T06:38:27.0382870Z"} +2025/02/06 01:38:28.052 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:25.4920000Z","device_time":"2025-02-06T06:38:28.0518150Z"} +2025/02/06 01:38:29.086 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:26.5260000Z","device_time":"2025-02-06T06:38:29.0854720Z"} +2025/02/06 01:38:30.115 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:27.5540000Z","device_time":"2025-02-06T06:38:30.1140420Z"} +2025/02/06 01:38:31.150 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:28.5900000Z","device_time":"2025-02-06T06:38:31.1496620Z"} +2025/02/06 01:38:32.179 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:29.6190000Z","device_time":"2025-02-06T06:38:32.1791460Z"} +2025/02/06 01:38:33.212 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:30.6530000Z","device_time":"2025-02-06T06:38:33.2122940Z"} +2025/02/06 01:38:34.221 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:31.6620000Z","device_time":"2025-02-06T06:38:34.2214170Z"} +2025/02/06 01:38:35.252 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:32.6920000Z","device_time":"2025-02-06T06:38:35.2520840Z"} +2025/02/06 01:38:36.268 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:33.7090000Z","device_time":"2025-02-06T06:38:36.2684210Z"} +2025/02/06 01:38:37.299 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:34.7390000Z","device_time":"2025-02-06T06:38:37.2991940Z"} +2025/02/06 01:38:38.314 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:35.7550000Z","device_time":"2025-02-06T06:38:38.3143700Z"} +2025/02/06 01:38:39.346 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:36.7860000Z","device_time":"2025-02-06T06:38:39.3461640Z"} +2025/02/06 01:38:40.368 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:37.8090000Z","device_time":"2025-02-06T06:38:40.3683540Z"} +2025/02/06 01:38:41.400 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:38.8400000Z","device_time":"2025-02-06T06:38:41.3999980Z"} +2025/02/06 01:38:42.424 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:39.8650000Z","device_time":"2025-02-06T06:38:42.4243240Z"} +2025/02/06 01:38:43.464 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:40.9040000Z","device_time":"2025-02-06T06:38:43.4639790Z"} +2025/02/06 01:38:44.474 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:41.9140000Z","device_time":"2025-02-06T06:38:44.4737630Z"} +2025/02/06 01:38:45.502 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:42.9420000Z","device_time":"2025-02-06T06:38:45.5020670Z"} +2025/02/06 01:38:46.530 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:43.9700000Z","device_time":"2025-02-06T06:38:46.5301380Z"} +2025/02/06 01:38:47.544 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:44.9840000Z","device_time":"2025-02-06T06:38:47.5441960Z"} +2025/02/06 01:38:48.559 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:45.9990000Z","device_time":"2025-02-06T06:38:48.5589740Z"} +2025/02/06 01:38:49.582 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:47.0220000Z","device_time":"2025-02-06T06:38:49.5820510Z"} +2025/02/06 01:38:50.627 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:48.0670000Z","device_time":"2025-02-06T06:38:50.6266890Z"} +2025/02/06 01:38:51.627 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:49.0670000Z","device_time":"2025-02-06T06:38:51.6268630Z"} +2025/02/06 01:38:52.662 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:50.1020000Z","device_time":"2025-02-06T06:38:52.6614760Z"} +2025/02/06 01:38:53.672 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:51.1120000Z","device_time":"2025-02-06T06:38:53.6717320Z"} +2025/02/06 01:38:54.710 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:52.1500000Z","device_time":"2025-02-06T06:38:54.7098100Z"} +2025/02/06 01:38:55.721 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:53.1610000Z","device_time":"2025-02-06T06:38:55.7209340Z"} +2025/02/06 01:38:56.755 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:54.1940000Z","device_time":"2025-02-06T06:38:56.7539650Z"} +2025/02/06 01:38:57.787 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:55.2270000Z","device_time":"2025-02-06T06:38:57.7867680Z"} +2025/02/06 01:38:58.817 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:56.2570000Z","device_time":"2025-02-06T06:38:58.8164620Z"} +2025/02/06 01:38:59.846 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:57.2860000Z","device_time":"2025-02-06T06:38:59.8458130Z"} +2025/02/06 01:39:00.880 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:58.3200000Z","device_time":"2025-02-06T06:39:00.8798810Z"} +2025/02/06 01:39:01.906 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:38:59.3470000Z","device_time":"2025-02-06T06:39:01.9063220Z"} +2025/02/06 01:39:02.899 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:00.3390000Z","device_time":"2025-02-06T06:39:02.8988260Z"} +2025/02/06 01:39:03.942 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:01.3810000Z","device_time":"2025-02-06T06:39:03.9403730Z"} +2025/02/06 01:39:04.986 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:02.4260000Z","device_time":"2025-02-06T06:39:04.9859500Z"} +2025/02/06 01:39:06.005 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:03.4450000Z","device_time":"2025-02-06T06:39:06.0049320Z"} +2025/02/06 01:39:07.031 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:04.4710000Z","device_time":"2025-02-06T06:39:07.0312260Z"} +2025/02/06 01:39:08.066 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:05.5060000Z","device_time":"2025-02-06T06:39:08.0653660Z"} +2025/02/06 01:39:09.122 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:06.5600000Z","device_time":"2025-02-06T06:39:09.1201630Z"} +2025/02/06 01:39:10.139 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:07.5790000Z","device_time":"2025-02-06T06:39:10.1387560Z"} +2025/02/06 01:39:11.174 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:08.6140000Z","device_time":"2025-02-06T06:39:11.1734950Z"} +2025/02/06 01:39:12.259 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:09.6990000Z","device_time":"2025-02-06T06:39:12.2584860Z"} +2025/02/06 01:39:13.266 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:10.7020000Z","device_time":"2025-02-06T06:39:13.2621940Z"} +2025/02/06 01:39:14.279 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:11.7190000Z","device_time":"2025-02-06T06:39:14.2785940Z"} +2025/02/06 01:39:15.288 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:12.7280000Z","device_time":"2025-02-06T06:39:15.2877070Z"} +2025/02/06 01:39:16.310 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:13.7500000Z","device_time":"2025-02-06T06:39:16.3100620Z"} +2025/02/06 01:39:17.332 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:14.7720000Z","device_time":"2025-02-06T06:39:17.3316590Z"} +2025/02/06 01:39:18.370 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:15.8100000Z","device_time":"2025-02-06T06:39:18.3694530Z"} +2025/02/06 01:39:19.398 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:16.8390000Z","device_time":"2025-02-06T06:39:19.3984630Z"} +2025/02/06 01:39:20.438 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:17.8780000Z","device_time":"2025-02-06T06:39:20.4378800Z"} +2025/02/06 01:39:21.450 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:18.8900000Z","device_time":"2025-02-06T06:39:21.4495160Z"} +2025/02/06 01:39:22.491 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:19.9310000Z","device_time":"2025-02-06T06:39:22.4911860Z"} +2025/02/06 01:39:23.508 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:20.9480000Z","device_time":"2025-02-06T06:39:23.5074650Z"} +2025/02/06 01:39:24.529 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:21.9700000Z","device_time":"2025-02-06T06:39:24.5293890Z"} +2025/02/06 01:39:25.563 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:23.0030000Z","device_time":"2025-02-06T06:39:25.5626190Z"} +2025/02/06 01:39:26.582 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:24.0220000Z","device_time":"2025-02-06T06:39:26.5818470Z"} +2025/02/06 01:39:27.589 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:25.0290000Z","device_time":"2025-02-06T06:39:27.5891830Z"} +2025/02/06 01:39:28.609 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:26.0490000Z","device_time":"2025-02-06T06:39:28.6085870Z"} +2025/02/06 01:39:29.629 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:27.0700000Z","device_time":"2025-02-06T06:39:29.6293750Z"} +2025/02/06 01:39:30.651 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:28.0910000Z","device_time":"2025-02-06T06:39:30.6509740Z"} +2025/02/06 01:39:31.679 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:29.1190000Z","device_time":"2025-02-06T06:39:31.6787940Z"} +2025/02/06 01:39:32.711 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:30.1510000Z","device_time":"2025-02-06T06:39:32.7107900Z"} +2025/02/06 01:39:33.738 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:31.1780000Z","device_time":"2025-02-06T06:39:33.7377580Z"} +2025/02/06 01:39:34.775 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:32.2150000Z","device_time":"2025-02-06T06:39:34.7746660Z"} +2025/02/06 01:39:35.804 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:33.2440000Z","device_time":"2025-02-06T06:39:35.8035710Z"} +2025/02/06 01:39:36.826 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:34.2660000Z","device_time":"2025-02-06T06:39:36.8256520Z"} +2025/02/06 01:39:37.830 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:35.2700000Z","device_time":"2025-02-06T06:39:37.8298310Z"} +2025/02/06 01:39:38.885 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:36.3240000Z","device_time":"2025-02-06T06:39:38.8840670Z"} +2025/02/06 01:39:39.905 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:37.3460000Z","device_time":"2025-02-06T06:39:39.9052810Z"} +2025/02/06 01:39:40.924 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:38.3640000Z","device_time":"2025-02-06T06:39:40.9234640Z"} +2025/02/06 01:39:41.931 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:39.3710000Z","device_time":"2025-02-06T06:39:41.9311210Z"} +2025/02/06 01:39:42.950 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:40.3900000Z","device_time":"2025-02-06T06:39:42.9502180Z"} +2025/02/06 01:39:43.987 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:41.4270000Z","device_time":"2025-02-06T06:39:43.9869900Z"} +2025/02/06 01:39:44.998 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:42.4380000Z","device_time":"2025-02-06T06:39:44.9980080Z"} +2025/02/06 01:39:46.032 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:43.4720000Z","device_time":"2025-02-06T06:39:46.0322200Z"} +2025/02/06 01:39:47.051 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:44.4910000Z","device_time":"2025-02-06T06:39:47.0506430Z"} +2025/02/06 01:39:48.085 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:45.5250000Z","device_time":"2025-02-06T06:39:48.0851990Z"} +2025/02/06 01:39:49.112 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:46.5520000Z","device_time":"2025-02-06T06:39:49.1114480Z"} +2025/02/06 01:39:50.141 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:47.5820000Z","device_time":"2025-02-06T06:39:50.1414440Z"} +2025/02/06 01:39:51.169 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:48.6090000Z","device_time":"2025-02-06T06:39:51.1684180Z"} +2025/02/06 01:39:52.189 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:49.6290000Z","device_time":"2025-02-06T06:39:52.1891250Z"} +2025/02/06 01:39:53.217 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:50.6570000Z","device_time":"2025-02-06T06:39:53.2163380Z"} +2025/02/06 01:39:54.237 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:51.6780000Z","device_time":"2025-02-06T06:39:54.2372820Z"} +2025/02/06 01:39:55.261 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:52.7010000Z","device_time":"2025-02-06T06:39:55.2609670Z"} +2025/02/06 01:39:56.300 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:53.7400000Z","device_time":"2025-02-06T06:39:56.3000420Z"} +2025/02/06 01:39:57.332 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:54.7720000Z","device_time":"2025-02-06T06:39:57.3319400Z"} +2025/02/06 01:39:58.349 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:55.7890000Z","device_time":"2025-02-06T06:39:58.3491740Z"} +2025/02/06 01:39:59.375 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:56.8160000Z","device_time":"2025-02-06T06:39:59.3754080Z"} +2025/02/06 01:40:00.413 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:57.8530000Z","device_time":"2025-02-06T06:40:00.4130800Z"} +2025/02/06 01:40:01.453 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:58.8930000Z","device_time":"2025-02-06T06:40:01.4527240Z"} +2025/02/06 01:40:02.463 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:39:59.9030000Z","device_time":"2025-02-06T06:40:02.4624190Z"} +2025/02/06 01:40:03.475 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:00.9150000Z","device_time":"2025-02-06T06:40:03.4751250Z"} +2025/02/06 01:40:04.495 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:01.9350000Z","device_time":"2025-02-06T06:40:04.4945850Z"} +2025/02/06 01:40:05.538 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:02.9780000Z","device_time":"2025-02-06T06:40:05.5379630Z"} +2025/02/06 01:40:06.569 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:04.0090000Z","device_time":"2025-02-06T06:40:06.5687380Z"} +2025/02/06 01:40:07.580 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:05.0200000Z","device_time":"2025-02-06T06:40:07.5796490Z"} +2025/02/06 01:40:08.612 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:06.0520000Z","device_time":"2025-02-06T06:40:08.6115530Z"} +2025/02/06 01:40:09.621 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:07.0610000Z","device_time":"2025-02-06T06:40:09.6205290Z"} +2025/02/06 01:40:10.660 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:08.1000000Z","device_time":"2025-02-06T06:40:10.6602390Z"} +2025/02/06 01:40:11.671 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:09.1110000Z","device_time":"2025-02-06T06:40:11.6706970Z"} +2025/02/06 01:40:12.688 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:10.1280000Z","device_time":"2025-02-06T06:40:12.6881960Z"} +2025/02/06 01:40:13.723 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:11.1630000Z","device_time":"2025-02-06T06:40:13.7229460Z"} +2025/02/06 01:40:14.748 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:12.1880000Z","device_time":"2025-02-06T06:40:14.7478050Z"} +2025/02/06 01:40:15.778 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:13.2180000Z","device_time":"2025-02-06T06:40:15.7779730Z"} +2025/02/06 01:40:16.812 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:14.2530000Z","device_time":"2025-02-06T06:40:16.8124210Z"} +2025/02/06 01:40:17.833 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:15.2730000Z","device_time":"2025-02-06T06:40:17.8325730Z"} +2025/02/06 01:40:18.857 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:16.2960000Z","device_time":"2025-02-06T06:40:18.8559230Z"} +2025/02/06 01:40:19.879 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:17.3200000Z","device_time":"2025-02-06T06:40:19.8792880Z"} +2025/02/06 01:40:20.936 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:18.3760000Z","device_time":"2025-02-06T06:40:20.9360440Z"} +2025/02/06 01:40:21.945 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:19.3850000Z","device_time":"2025-02-06T06:40:21.9452570Z"} +2025/02/06 01:40:22.968 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:20.4080000Z","device_time":"2025-02-06T06:40:22.9681630Z"} +2025/02/06 01:40:23.980 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:21.4200000Z","device_time":"2025-02-06T06:40:23.9798940Z"} +2025/02/06 01:40:25.003 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:22.4430000Z","device_time":"2025-02-06T06:40:25.0029010Z"} +2025/02/06 01:40:26.029 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:23.4690000Z","device_time":"2025-02-06T06:40:26.0289880Z"} +2025/02/06 01:40:27.044 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:24.4840000Z","device_time":"2025-02-06T06:40:27.0436810Z"} +2025/02/06 01:40:28.058 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:25.4980000Z","device_time":"2025-02-06T06:40:28.0581570Z"} +2025/02/06 01:40:29.095 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:26.5350000Z","device_time":"2025-02-06T06:40:29.0944610Z"} +2025/02/06 01:40:30.144 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:27.5850000Z","device_time":"2025-02-06T06:40:30.1443210Z"} +2025/02/06 01:40:31.159 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:28.5990000Z","device_time":"2025-02-06T06:40:31.1585200Z"} +2025/02/06 01:40:32.192 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:29.6320000Z","device_time":"2025-02-06T06:40:32.1920550Z"} +2025/02/06 01:40:33.227 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:30.6670000Z","device_time":"2025-02-06T06:40:33.2264530Z"} +2025/02/06 01:40:34.261 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:31.7010000Z","device_time":"2025-02-06T06:40:34.2605710Z"} +2025/02/06 01:40:35.269 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:32.7090000Z","device_time":"2025-02-06T06:40:35.2689670Z"} +2025/02/06 01:40:36.284 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:33.7230000Z","device_time":"2025-02-06T06:40:36.2832600Z"} +2025/02/06 01:40:37.332 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:34.7730000Z","device_time":"2025-02-06T06:40:37.3322990Z"} +2025/02/06 01:40:38.339 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:35.7790000Z","device_time":"2025-02-06T06:40:38.3385290Z"} +2025/02/06 01:40:39.377 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:36.8170000Z","device_time":"2025-02-06T06:40:39.3770360Z"} +2025/02/06 01:40:40.405 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:37.8450000Z","device_time":"2025-02-06T06:40:40.4050370Z"} +2025/02/06 01:40:41.415 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:38.8550000Z","device_time":"2025-02-06T06:40:41.4148550Z"} +2025/02/06 01:40:42.491 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:39.9310000Z","device_time":"2025-02-06T06:40:42.4905360Z"} +2025/02/06 01:40:43.500 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:40.9410000Z","device_time":"2025-02-06T06:40:43.5003600Z"} +2025/02/06 01:40:44.505 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:41.9450000Z","device_time":"2025-02-06T06:40:44.5046190Z"} +2025/02/06 01:40:45.562 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:43.0020000Z","device_time":"2025-02-06T06:40:45.5617800Z"} +2025/02/06 01:40:46.564 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:44.0040000Z","device_time":"2025-02-06T06:40:46.5641480Z"} +2025/02/06 01:40:47.627 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:45.0670000Z","device_time":"2025-02-06T06:40:47.6271780Z"} +2025/02/06 01:40:48.643 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:46.0830000Z","device_time":"2025-02-06T06:40:48.6428150Z"} +2025/02/06 01:40:49.642 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:47.0830000Z","device_time":"2025-02-06T06:40:49.6423520Z"} +2025/02/06 01:40:50.685 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:48.1250000Z","device_time":"2025-02-06T06:40:50.6848650Z"} +2025/02/06 01:40:51.695 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:49.1350000Z","device_time":"2025-02-06T06:40:51.6943540Z"} +2025/02/06 01:40:52.708 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:50.1480000Z","device_time":"2025-02-06T06:40:52.7078450Z"} +2025/02/06 01:40:53.752 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:51.1920000Z","device_time":"2025-02-06T06:40:53.7518960Z"} +2025/02/06 01:40:54.767 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:52.2060000Z","device_time":"2025-02-06T06:40:54.7658710Z"} +2025/02/06 01:40:55.807 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:53.2460000Z","device_time":"2025-02-06T06:40:55.8061630Z"} +2025/02/06 01:40:56.811 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:54.2510000Z","device_time":"2025-02-06T06:40:56.8110990Z"} +2025/02/06 01:40:57.840 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:55.2800000Z","device_time":"2025-02-06T06:40:57.8398330Z"} +2025/02/06 01:40:58.885 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:56.3250000Z","device_time":"2025-02-06T06:40:58.8845880Z"} +2025/02/06 01:40:59.950 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:57.3900000Z","device_time":"2025-02-06T06:40:59.9497260Z"} +2025/02/06 01:41:00.976 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:58.4160000Z","device_time":"2025-02-06T06:41:00.9760810Z"} +2025/02/06 01:41:01.986 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:40:59.4260000Z","device_time":"2025-02-06T06:41:01.9857880Z"} +2025/02/06 01:41:03.048 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:00.4870000Z","device_time":"2025-02-06T06:41:03.0465680Z"} +2025/02/06 01:41:04.064 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:01.5040000Z","device_time":"2025-02-06T06:41:04.0636800Z"} +2025/02/06 01:41:05.089 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:02.5290000Z","device_time":"2025-02-06T06:41:05.0885830Z"} +2025/02/06 01:41:06.126 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:03.5660000Z","device_time":"2025-02-06T06:41:06.1258840Z"} +2025/02/06 01:41:07.117 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:04.5570000Z","device_time":"2025-02-06T06:41:07.1170820Z"} +2025/02/06 01:41:08.186 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:05.6260000Z","device_time":"2025-02-06T06:41:08.1855960Z"} +2025/02/06 01:41:09.221 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:06.6610000Z","device_time":"2025-02-06T06:41:09.2204350Z"} +2025/02/06 01:41:10.263 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:07.7030000Z","device_time":"2025-02-06T06:41:10.2624350Z"} +2025/02/06 01:41:11.286 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:08.7260000Z","device_time":"2025-02-06T06:41:11.2854460Z"} +2025/02/06 01:41:12.315 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:09.7550000Z","device_time":"2025-02-06T06:41:12.3149750Z"} +2025/02/06 01:41:13.329 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:10.7690000Z","device_time":"2025-02-06T06:41:13.3285390Z"} +2025/02/06 01:41:14.398 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:11.8380000Z","device_time":"2025-02-06T06:41:14.3974440Z"} +2025/02/06 01:41:15.412 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:12.8520000Z","device_time":"2025-02-06T06:41:15.4114310Z"} +2025/02/06 01:41:16.453 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:13.8940000Z","device_time":"2025-02-06T06:41:16.4534160Z"} +2025/02/06 01:41:17.502 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:14.9420000Z","device_time":"2025-02-06T06:41:17.5019480Z"} +2025/02/06 01:41:18.526 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:15.9660000Z","device_time":"2025-02-06T06:41:18.5253980Z"} +2025/02/06 01:41:19.565 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:17.0050000Z","device_time":"2025-02-06T06:41:19.5645420Z"} +2025/02/06 01:41:20.584 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:18.0240000Z","device_time":"2025-02-06T06:41:20.5836000Z"} +2025/02/06 01:41:21.593 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:19.0340000Z","device_time":"2025-02-06T06:41:21.5933020Z"} +2025/02/06 01:41:22.616 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:20.0560000Z","device_time":"2025-02-06T06:41:22.6158920Z"} +2025/02/06 01:41:23.657 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:21.0970000Z","device_time":"2025-02-06T06:41:23.6565900Z"} +2025/02/06 01:41:24.691 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:22.1310000Z","device_time":"2025-02-06T06:41:24.6904350Z"} +2025/02/06 01:41:25.695 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:23.1350000Z","device_time":"2025-02-06T06:41:25.6943280Z"} +2025/02/06 01:41:26.719 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:24.1580000Z","device_time":"2025-02-06T06:41:26.7182640Z"} +2025/02/06 01:41:27.755 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:25.1950000Z","device_time":"2025-02-06T06:41:27.7548560Z"} +2025/02/06 01:41:28.797 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:26.2310000Z","device_time":"2025-02-06T06:41:28.7909820Z"} +2025/02/06 01:41:29.842 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:27.2790000Z","device_time":"2025-02-06T06:41:29.8383220Z"} +2025/02/06 01:41:30.878 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:28.3180000Z","device_time":"2025-02-06T06:41:30.8778290Z"} +2025/02/06 01:41:31.920 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:29.3600000Z","device_time":"2025-02-06T06:41:31.9197240Z"} +2025/02/06 01:41:32.925 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:30.3650000Z","device_time":"2025-02-06T06:41:32.9247520Z"} +2025/02/06 01:41:33.973 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:31.4120000Z","device_time":"2025-02-06T06:41:33.9722170Z"} +2025/02/06 01:41:35.027 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:32.4640000Z","device_time":"2025-02-06T06:41:35.0241760Z"} +2025/02/06 01:41:36.089 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:33.5290000Z","device_time":"2025-02-06T06:41:36.0885030Z"} +2025/02/06 01:41:37.143 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:34.5830000Z","device_time":"2025-02-06T06:41:37.1428190Z"} +2025/02/06 01:41:38.131 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:35.5710000Z","device_time":"2025-02-06T06:41:38.1309590Z"} +2025/02/06 01:41:39.154 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:36.5940000Z","device_time":"2025-02-06T06:41:39.1538870Z"} +2025/02/06 01:41:40.155 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:37.5950000Z","device_time":"2025-02-06T06:41:40.1544890Z"} +2025/02/06 01:41:41.166 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:38.6060000Z","device_time":"2025-02-06T06:41:41.1656700Z"} +2025/02/06 01:41:42.201 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:39.6410000Z","device_time":"2025-02-06T06:41:42.2011050Z"} +2025/02/06 01:41:43.251 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:40.6910000Z","device_time":"2025-02-06T06:41:43.2512200Z"} +2025/02/06 01:41:44.304 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:41.7440000Z","device_time":"2025-02-06T06:41:44.3039950Z"} +2025/02/06 01:41:45.308 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:42.7480000Z","device_time":"2025-02-06T06:41:45.3081040Z"} +2025/02/06 01:41:46.353 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:43.7930000Z","device_time":"2025-02-06T06:41:46.3526860Z"} +2025/02/06 01:41:47.343 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:44.7830000Z","device_time":"2025-02-06T06:41:47.3427620Z"} +2025/02/06 01:41:48.395 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:45.8350000Z","device_time":"2025-02-06T06:41:48.3945360Z"} +2025/02/06 01:41:49.415 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:46.8550000Z","device_time":"2025-02-06T06:41:49.4144400Z"} +2025/02/06 01:41:50.478 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:47.9180000Z","device_time":"2025-02-06T06:41:50.4777310Z"} +2025/02/06 01:41:51.509 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:48.9490000Z","device_time":"2025-02-06T06:41:51.5088200Z"} +2025/02/06 01:41:52.539 25707 25760 Info Unity {"ntp_time":"2025-02-06T06:41:49.9780000Z","device_time":"2025-02-06T06:41:52.5382190Z"} diff --git a/python/evaluations/data/single_device/ntp_clock/pixel_6/run2-logcat.txt b/python/evaluations/data/single_device/ntp_clock/pixel_6/run2-logcat.txt new file mode 100644 index 0000000..b663b38 --- /dev/null +++ b/python/evaluations/data/single_device/ntp_clock/pixel_6/run2-logcat.txt @@ -0,0 +1,307 @@ +2025/02/06 01:43:02.095 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:42:59.6030000Z","device_time":"2025-02-06T06:43:02.0904740Z"} +2025/02/06 01:43:03.103 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:00.6160000Z","device_time":"2025-02-06T06:43:03.1031130Z"} +2025/02/06 01:43:04.131 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:01.6430000Z","device_time":"2025-02-06T06:43:04.1304530Z"} +2025/02/06 01:43:05.167 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:02.6800000Z","device_time":"2025-02-06T06:43:05.1670670Z"} +2025/02/06 01:43:06.191 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:03.7030000Z","device_time":"2025-02-06T06:43:06.1903100Z"} +2025/02/06 01:43:07.240 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:04.7530000Z","device_time":"2025-02-06T06:43:07.2398420Z"} +2025/02/06 01:43:08.266 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:05.7780000Z","device_time":"2025-02-06T06:43:08.2656870Z"} +2025/02/06 01:43:09.266 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:06.7780000Z","device_time":"2025-02-06T06:43:09.2653110Z"} +2025/02/06 01:43:10.313 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:07.8260000Z","device_time":"2025-02-06T06:43:10.3128210Z"} +2025/02/06 01:43:11.306 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:08.8190000Z","device_time":"2025-02-06T06:43:11.3062150Z"} +2025/02/06 01:43:12.371 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:09.8830000Z","device_time":"2025-02-06T06:43:12.3706810Z"} +2025/02/06 01:43:13.386 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:10.8990000Z","device_time":"2025-02-06T06:43:13.3862960Z"} +2025/02/06 01:43:14.447 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:11.9600000Z","device_time":"2025-02-06T06:43:14.4471220Z"} +2025/02/06 01:43:15.473 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:12.9860000Z","device_time":"2025-02-06T06:43:15.4729860Z"} +2025/02/06 01:43:16.505 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:14.0170000Z","device_time":"2025-02-06T06:43:16.5044360Z"} +2025/02/06 01:43:17.515 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:15.0270000Z","device_time":"2025-02-06T06:43:17.5145640Z"} +2025/02/06 01:43:18.550 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:16.0620000Z","device_time":"2025-02-06T06:43:18.5496170Z"} +2025/02/06 01:43:19.575 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:17.0870000Z","device_time":"2025-02-06T06:43:19.5744100Z"} +2025/02/06 01:43:20.613 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:18.1250000Z","device_time":"2025-02-06T06:43:20.6119180Z"} +2025/02/06 01:43:21.619 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:19.1320000Z","device_time":"2025-02-06T06:43:21.6192850Z"} +2025/02/06 01:43:22.668 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:20.1810000Z","device_time":"2025-02-06T06:43:22.6679710Z"} +2025/02/06 01:43:23.681 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:21.1940000Z","device_time":"2025-02-06T06:43:23.6813460Z"} +2025/02/06 01:43:24.711 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:22.2230000Z","device_time":"2025-02-06T06:43:24.7103880Z"} +2025/02/06 01:43:25.744 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:23.2560000Z","device_time":"2025-02-06T06:43:25.7435280Z"} +2025/02/06 01:43:26.778 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:24.2900000Z","device_time":"2025-02-06T06:43:26.7776650Z"} +2025/02/06 01:43:27.780 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:25.2930000Z","device_time":"2025-02-06T06:43:27.7799250Z"} +2025/02/06 01:43:28.825 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:26.3370000Z","device_time":"2025-02-06T06:43:28.8246650Z"} +2025/02/06 01:43:29.838 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:27.3510000Z","device_time":"2025-02-06T06:43:29.8382080Z"} +2025/02/06 01:43:30.867 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:28.3800000Z","device_time":"2025-02-06T06:43:30.8667670Z"} +2025/02/06 01:43:31.893 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:29.4050000Z","device_time":"2025-02-06T06:43:31.8924460Z"} +2025/02/06 01:43:32.956 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:30.4690000Z","device_time":"2025-02-06T06:43:32.9559550Z"} +2025/02/06 01:43:33.982 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:31.4940000Z","device_time":"2025-02-06T06:43:33.9813870Z"} +2025/02/06 01:43:35.012 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:32.5250000Z","device_time":"2025-02-06T06:43:35.0117460Z"} +2025/02/06 01:43:36.051 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:33.5630000Z","device_time":"2025-02-06T06:43:36.0505130Z"} +2025/02/06 01:43:37.089 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:34.6010000Z","device_time":"2025-02-06T06:43:37.0884920Z"} +2025/02/06 01:43:38.096 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:35.6080000Z","device_time":"2025-02-06T06:43:38.0955200Z"} +2025/02/06 01:43:39.123 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:36.6350000Z","device_time":"2025-02-06T06:43:39.1225980Z"} +2025/02/06 01:43:40.136 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:37.6480000Z","device_time":"2025-02-06T06:43:40.1356540Z"} +2025/02/06 01:43:41.170 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:38.6830000Z","device_time":"2025-02-06T06:43:41.1702420Z"} +2025/02/06 01:43:42.204 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:39.7170000Z","device_time":"2025-02-06T06:43:42.2041070Z"} +2025/02/06 01:43:43.241 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:40.7540000Z","device_time":"2025-02-06T06:43:43.2408600Z"} +2025/02/06 01:43:44.287 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:41.8000000Z","device_time":"2025-02-06T06:43:44.2872360Z"} +2025/02/06 01:43:45.291 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:42.8040000Z","device_time":"2025-02-06T06:43:45.2908160Z"} +2025/02/06 01:43:46.297 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:43.8100000Z","device_time":"2025-02-06T06:43:46.2971900Z"} +2025/02/06 01:43:47.345 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:44.8530000Z","device_time":"2025-02-06T06:43:47.3398710Z"} +2025/02/06 01:43:48.348 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:45.8610000Z","device_time":"2025-02-06T06:43:48.3482680Z"} +2025/02/06 01:43:49.375 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:46.8870000Z","device_time":"2025-02-06T06:43:49.3738340Z"} +2025/02/06 01:43:50.390 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:47.9020000Z","device_time":"2025-02-06T06:43:50.3894960Z"} +2025/02/06 01:43:51.398 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:48.9110000Z","device_time":"2025-02-06T06:43:51.3981250Z"} +2025/02/06 01:43:52.430 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:49.9430000Z","device_time":"2025-02-06T06:43:52.4300000Z"} +2025/02/06 01:43:53.470 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:50.9820000Z","device_time":"2025-02-06T06:43:53.4696250Z"} +2025/02/06 01:43:54.493 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:52.0050000Z","device_time":"2025-02-06T06:43:54.4925530Z"} +2025/02/06 01:43:55.509 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:53.0210000Z","device_time":"2025-02-06T06:43:55.5085360Z"} +2025/02/06 01:43:56.521 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:54.0330000Z","device_time":"2025-02-06T06:43:56.5206030Z"} +2025/02/06 01:43:57.574 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:55.0870000Z","device_time":"2025-02-06T06:43:57.5742890Z"} +2025/02/06 01:43:58.610 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:56.1230000Z","device_time":"2025-02-06T06:43:58.6102740Z"} +2025/02/06 01:43:59.641 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:57.1540000Z","device_time":"2025-02-06T06:43:59.6410340Z"} +2025/02/06 01:44:00.650 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:58.1620000Z","device_time":"2025-02-06T06:44:00.6496880Z"} +2025/02/06 01:44:01.682 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:43:59.1940000Z","device_time":"2025-02-06T06:44:01.6815220Z"} +2025/02/06 01:44:02.729 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:00.2410000Z","device_time":"2025-02-06T06:44:02.7285620Z"} +2025/02/06 01:44:03.718 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:01.2310000Z","device_time":"2025-02-06T06:44:03.7182240Z"} +2025/02/06 01:44:04.747 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:02.2600000Z","device_time":"2025-02-06T06:44:04.7474700Z"} +2025/02/06 01:44:05.775 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:03.2880000Z","device_time":"2025-02-06T06:44:05.7750190Z"} +2025/02/06 01:44:06.807 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:04.3190000Z","device_time":"2025-02-06T06:44:06.8066970Z"} +2025/02/06 01:44:07.827 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:05.3390000Z","device_time":"2025-02-06T06:44:07.8266730Z"} +2025/02/06 01:44:08.860 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:06.3720000Z","device_time":"2025-02-06T06:44:08.8593240Z"} +2025/02/06 01:44:09.870 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:07.3830000Z","device_time":"2025-02-06T06:44:09.8701340Z"} +2025/02/06 01:44:10.900 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:08.4130000Z","device_time":"2025-02-06T06:44:10.9003390Z"} +2025/02/06 01:44:11.916 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:09.4290000Z","device_time":"2025-02-06T06:44:11.9162710Z"} +2025/02/06 01:44:12.937 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:10.4500000Z","device_time":"2025-02-06T06:44:12.9370880Z"} +2025/02/06 01:44:13.967 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:11.4800000Z","device_time":"2025-02-06T06:44:13.9669140Z"} +2025/02/06 01:44:14.968 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:12.4800000Z","device_time":"2025-02-06T06:44:14.9672720Z"} +2025/02/06 01:44:16.004 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:13.5160000Z","device_time":"2025-02-06T06:44:16.0034110Z"} +2025/02/06 01:44:17.046 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:14.5580000Z","device_time":"2025-02-06T06:44:17.0453280Z"} +2025/02/06 01:44:18.081 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:15.5940000Z","device_time":"2025-02-06T06:44:18.0807500Z"} +2025/02/06 01:44:19.145 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:16.6580000Z","device_time":"2025-02-06T06:44:19.1447830Z"} +2025/02/06 01:44:20.157 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:17.6700000Z","device_time":"2025-02-06T06:44:20.1569130Z"} +2025/02/06 01:44:21.187 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:18.7000000Z","device_time":"2025-02-06T06:44:21.1872910Z"} +2025/02/06 01:44:22.199 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:19.7110000Z","device_time":"2025-02-06T06:44:22.1985430Z"} +2025/02/06 01:44:23.206 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:20.7170000Z","device_time":"2025-02-06T06:44:23.2046790Z"} +2025/02/06 01:44:24.216 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:21.7290000Z","device_time":"2025-02-06T06:44:24.2158260Z"} +2025/02/06 01:44:25.261 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:22.7730000Z","device_time":"2025-02-06T06:44:25.2605790Z"} +2025/02/06 01:44:26.276 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:23.7890000Z","device_time":"2025-02-06T06:44:26.2757970Z"} +2025/02/06 01:44:27.310 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:24.8230000Z","device_time":"2025-02-06T06:44:27.3099220Z"} +2025/02/06 01:44:28.311 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:25.8230000Z","device_time":"2025-02-06T06:44:28.3106250Z"} +2025/02/06 01:44:29.339 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:26.8510000Z","device_time":"2025-02-06T06:44:29.3385180Z"} +2025/02/06 01:44:30.365 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:27.8780000Z","device_time":"2025-02-06T06:44:30.3651250Z"} +2025/02/06 01:44:31.427 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:28.9390000Z","device_time":"2025-02-06T06:44:31.4266240Z"} +2025/02/06 01:44:32.430 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:29.9420000Z","device_time":"2025-02-06T06:44:32.4295870Z"} +2025/02/06 01:44:33.440 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:30.9520000Z","device_time":"2025-02-06T06:44:33.4396420Z"} +2025/02/06 01:44:34.461 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:31.9730000Z","device_time":"2025-02-06T06:44:34.4605690Z"} +2025/02/06 01:44:35.494 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:33.0070000Z","device_time":"2025-02-06T06:44:35.4938590Z"} +2025/02/06 01:44:36.515 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:34.0280000Z","device_time":"2025-02-06T06:44:36.5150520Z"} +2025/02/06 01:44:37.529 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:35.0420000Z","device_time":"2025-02-06T06:44:37.5289600Z"} +2025/02/06 01:44:38.567 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:36.0790000Z","device_time":"2025-02-06T06:44:38.5666010Z"} +2025/02/06 01:44:39.614 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:37.1260000Z","device_time":"2025-02-06T06:44:39.6134720Z"} +2025/02/06 01:44:40.654 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:38.1660000Z","device_time":"2025-02-06T06:44:40.6533140Z"} +2025/02/06 01:44:41.659 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:39.1720000Z","device_time":"2025-02-06T06:44:41.6591840Z"} +2025/02/06 01:44:42.682 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:40.1940000Z","device_time":"2025-02-06T06:44:42.6814440Z"} +2025/02/06 01:44:43.691 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:41.2040000Z","device_time":"2025-02-06T06:44:43.6909320Z"} +2025/02/06 01:44:44.715 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:42.2270000Z","device_time":"2025-02-06T06:44:44.7143680Z"} +2025/02/06 01:44:45.773 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:43.2860000Z","device_time":"2025-02-06T06:44:45.7731930Z"} +2025/02/06 01:44:46.779 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:44.2910000Z","device_time":"2025-02-06T06:44:46.7784400Z"} +2025/02/06 01:44:47.858 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:45.3710000Z","device_time":"2025-02-06T06:44:47.8580530Z"} +2025/02/06 01:44:48.908 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:46.4200000Z","device_time":"2025-02-06T06:44:48.9073230Z"} +2025/02/06 01:44:49.904 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:47.4160000Z","device_time":"2025-02-06T06:44:49.9035210Z"} +2025/02/06 01:44:50.986 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:48.4960000Z","device_time":"2025-02-06T06:44:50.9836320Z"} +2025/02/06 01:44:51.965 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:49.4780000Z","device_time":"2025-02-06T06:44:51.9652240Z"} +2025/02/06 01:44:52.981 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:50.4930000Z","device_time":"2025-02-06T06:44:52.9806580Z"} +2025/02/06 01:44:54.022 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:51.5340000Z","device_time":"2025-02-06T06:44:54.0216840Z"} +2025/02/06 01:44:55.033 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:52.5450000Z","device_time":"2025-02-06T06:44:55.0324110Z"} +2025/02/06 01:44:56.072 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:53.5840000Z","device_time":"2025-02-06T06:44:56.0716240Z"} +2025/02/06 01:44:57.081 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:54.5930000Z","device_time":"2025-02-06T06:44:57.0805570Z"} +2025/02/06 01:44:58.097 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:55.6090000Z","device_time":"2025-02-06T06:44:58.0964000Z"} +2025/02/06 01:44:59.146 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:56.6580000Z","device_time":"2025-02-06T06:44:59.1454800Z"} +2025/02/06 01:45:00.129 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:57.6420000Z","device_time":"2025-02-06T06:45:00.1291140Z"} +2025/02/06 01:45:01.162 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:58.6750000Z","device_time":"2025-02-06T06:45:01.1619170Z"} +2025/02/06 01:45:02.173 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:44:59.6850000Z","device_time":"2025-02-06T06:45:02.1726860Z"} +2025/02/06 01:45:03.188 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:00.7010000Z","device_time":"2025-02-06T06:45:03.1878130Z"} +2025/02/06 01:45:04.240 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:01.7400000Z","device_time":"2025-02-06T06:45:04.2276230Z"} +2025/02/06 01:45:05.219 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:02.7320000Z","device_time":"2025-02-06T06:45:05.2187580Z"} +2025/02/06 01:45:06.234 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:03.7470000Z","device_time":"2025-02-06T06:45:06.2337790Z"} +2025/02/06 01:45:07.249 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:04.7610000Z","device_time":"2025-02-06T06:45:07.2486350Z"} +2025/02/06 01:45:08.277 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:05.7890000Z","device_time":"2025-02-06T06:45:08.2763050Z"} +2025/02/06 01:45:09.340 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:06.8530000Z","device_time":"2025-02-06T06:45:09.3401000Z"} +2025/02/06 01:45:10.347 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:07.8590000Z","device_time":"2025-02-06T06:45:10.3466510Z"} +2025/02/06 01:45:11.366 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:08.8790000Z","device_time":"2025-02-06T06:45:11.3661240Z"} +2025/02/06 01:45:12.385 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:09.8970000Z","device_time":"2025-02-06T06:45:12.3842640Z"} +2025/02/06 01:45:13.411 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:10.9230000Z","device_time":"2025-02-06T06:45:13.4106760Z"} +2025/02/06 01:45:14.429 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:11.9410000Z","device_time":"2025-02-06T06:45:14.4283030Z"} +2025/02/06 01:45:15.454 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:12.9660000Z","device_time":"2025-02-06T06:45:15.4533400Z"} +2025/02/06 01:45:16.454 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:13.9670000Z","device_time":"2025-02-06T06:45:16.4541720Z"} +2025/02/06 01:45:17.486 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:14.9970000Z","device_time":"2025-02-06T06:45:17.4846110Z"} +2025/02/06 01:45:18.494 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:16.0060000Z","device_time":"2025-02-06T06:45:18.4935670Z"} +2025/02/06 01:45:19.542 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:17.0550000Z","device_time":"2025-02-06T06:45:19.5419380Z"} +2025/02/06 01:45:20.570 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:18.0830000Z","device_time":"2025-02-06T06:45:20.5698190Z"} +2025/02/06 01:45:21.623 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:19.1350000Z","device_time":"2025-02-06T06:45:21.6226500Z"} +2025/02/06 01:45:22.671 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:20.1810000Z","device_time":"2025-02-06T06:45:22.6684950Z"} +2025/02/06 01:45:23.705 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:21.2180000Z","device_time":"2025-02-06T06:45:23.7050950Z"} +2025/02/06 01:45:24.745 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:22.2580000Z","device_time":"2025-02-06T06:45:24.7449950Z"} +2025/02/06 01:45:25.768 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:23.2810000Z","device_time":"2025-02-06T06:45:25.7677310Z"} +2025/02/06 01:45:26.790 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:24.3030000Z","device_time":"2025-02-06T06:45:26.7900720Z"} +2025/02/06 01:45:27.819 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:25.3310000Z","device_time":"2025-02-06T06:45:27.8181810Z"} +2025/02/06 01:45:28.822 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:26.3340000Z","device_time":"2025-02-06T06:45:28.8216980Z"} +2025/02/06 01:45:29.875 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:27.3880000Z","device_time":"2025-02-06T06:45:29.8749440Z"} +2025/02/06 01:45:30.894 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:28.4060000Z","device_time":"2025-02-06T06:45:30.8936110Z"} +2025/02/06 01:45:31.915 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:29.4270000Z","device_time":"2025-02-06T06:45:31.9144350Z"} +2025/02/06 01:45:32.938 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:30.4510000Z","device_time":"2025-02-06T06:45:32.9380360Z"} +2025/02/06 01:45:33.976 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:31.4860000Z","device_time":"2025-02-06T06:45:33.9735420Z"} +2025/02/06 01:45:34.964 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:32.4770000Z","device_time":"2025-02-06T06:45:34.9640400Z"} +2025/02/06 01:45:36.034 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:33.5470000Z","device_time":"2025-02-06T06:45:36.0340860Z"} +2025/02/06 01:45:37.055 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:34.5680000Z","device_time":"2025-02-06T06:45:37.0550950Z"} +2025/02/06 01:45:38.113 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:35.6250000Z","device_time":"2025-02-06T06:45:38.1121480Z"} +2025/02/06 01:45:39.145 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:36.6580000Z","device_time":"2025-02-06T06:45:39.1452220Z"} +2025/02/06 01:45:40.182 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:37.6950000Z","device_time":"2025-02-06T06:45:40.1820650Z"} +2025/02/06 01:45:41.193 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:38.6990000Z","device_time":"2025-02-06T06:45:41.1863880Z"} +2025/02/06 01:45:42.205 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:39.7180000Z","device_time":"2025-02-06T06:45:42.2053060Z"} +2025/02/06 01:45:43.219 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:40.7310000Z","device_time":"2025-02-06T06:45:43.2184400Z"} +2025/02/06 01:45:44.227 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:41.7390000Z","device_time":"2025-02-06T06:45:44.2265810Z"} +2025/02/06 01:45:45.253 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:42.7650000Z","device_time":"2025-02-06T06:45:45.2523310Z"} +2025/02/06 01:45:46.292 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:43.8050000Z","device_time":"2025-02-06T06:45:46.2919770Z"} +2025/02/06 01:45:47.313 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:44.8260000Z","device_time":"2025-02-06T06:45:47.3132930Z"} +2025/02/06 01:45:48.356 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:45.8680000Z","device_time":"2025-02-06T06:45:48.3555600Z"} +2025/02/06 01:45:49.378 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:46.8900000Z","device_time":"2025-02-06T06:45:49.3772430Z"} +2025/02/06 01:45:50.391 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:47.9040000Z","device_time":"2025-02-06T06:45:50.3910230Z"} +2025/02/06 01:45:51.443 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:48.9560000Z","device_time":"2025-02-06T06:45:51.4432060Z"} +2025/02/06 01:45:52.456 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:49.9690000Z","device_time":"2025-02-06T06:45:52.4560010Z"} +2025/02/06 01:45:53.486 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:50.9990000Z","device_time":"2025-02-06T06:45:53.4857720Z"} +2025/02/06 01:45:54.538 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:52.0500000Z","device_time":"2025-02-06T06:45:54.5375650Z"} +2025/02/06 01:45:55.549 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:53.0610000Z","device_time":"2025-02-06T06:45:55.5484000Z"} +2025/02/06 01:45:56.546 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:54.0580000Z","device_time":"2025-02-06T06:45:56.5454210Z"} +2025/02/06 01:45:57.592 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:55.1040000Z","device_time":"2025-02-06T06:45:57.5915290Z"} +2025/02/06 01:45:58.705 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:56.2180000Z","device_time":"2025-02-06T06:45:58.7054090Z"} +2025/02/06 01:45:59.699 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:57.2120000Z","device_time":"2025-02-06T06:45:59.6991320Z"} +2025/02/06 01:46:00.716 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:58.2290000Z","device_time":"2025-02-06T06:46:00.7159040Z"} +2025/02/06 01:46:01.760 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:45:59.2720000Z","device_time":"2025-02-06T06:46:01.7594710Z"} +2025/02/06 01:46:02.745 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:00.2580000Z","device_time":"2025-02-06T06:46:02.7450940Z"} +2025/02/06 01:46:03.774 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:01.2860000Z","device_time":"2025-02-06T06:46:03.7736380Z"} +2025/02/06 01:46:04.807 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:02.3200000Z","device_time":"2025-02-06T06:46:04.8072270Z"} +2025/02/06 01:46:05.808 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:03.3200000Z","device_time":"2025-02-06T06:46:05.8074970Z"} +2025/02/06 01:46:06.818 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:04.3310000Z","device_time":"2025-02-06T06:46:06.8182130Z"} +2025/02/06 01:46:07.840 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:05.3530000Z","device_time":"2025-02-06T06:46:07.8397760Z"} +2025/02/06 01:46:08.856 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:06.3680000Z","device_time":"2025-02-06T06:46:08.8556850Z"} +2025/02/06 01:46:09.876 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:07.3880000Z","device_time":"2025-02-06T06:46:09.8756220Z"} +2025/02/06 01:46:10.882 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:08.3950000Z","device_time":"2025-02-06T06:46:10.8821870Z"} +2025/02/06 01:46:11.924 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:09.4370000Z","device_time":"2025-02-06T06:46:11.9243310Z"} +2025/02/06 01:46:12.940 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:10.4530000Z","device_time":"2025-02-06T06:46:12.9399630Z"} +2025/02/06 01:46:13.969 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:11.4820000Z","device_time":"2025-02-06T06:46:13.9692440Z"} +2025/02/06 01:46:14.988 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:12.5010000Z","device_time":"2025-02-06T06:46:14.9877910Z"} +2025/02/06 01:46:16.036 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:13.5370000Z","device_time":"2025-02-06T06:46:16.0245610Z"} +2025/02/06 01:46:17.068 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:14.5790000Z","device_time":"2025-02-06T06:46:17.0664270Z"} +2025/02/06 01:46:18.070 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:15.5820000Z","device_time":"2025-02-06T06:46:18.0697050Z"} +2025/02/06 01:46:19.086 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:16.5970000Z","device_time":"2025-02-06T06:46:19.0845060Z"} +2025/02/06 01:46:20.122 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:17.6350000Z","device_time":"2025-02-06T06:46:20.1220870Z"} +2025/02/06 01:46:21.219 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:18.7310000Z","device_time":"2025-02-06T06:46:21.2184730Z"} +2025/02/06 01:46:22.227 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:19.7380000Z","device_time":"2025-02-06T06:46:22.2252120Z"} +2025/02/06 01:46:23.242 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:20.7540000Z","device_time":"2025-02-06T06:46:23.2416130Z"} +2025/02/06 01:46:24.292 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:21.7910000Z","device_time":"2025-02-06T06:46:24.2777930Z"} +2025/02/06 01:46:25.304 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:22.8170000Z","device_time":"2025-02-06T06:46:25.3039050Z"} +2025/02/06 01:46:26.311 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:23.8240000Z","device_time":"2025-02-06T06:46:26.3108320Z"} +2025/02/06 01:46:27.333 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:24.8460000Z","device_time":"2025-02-06T06:46:27.3331690Z"} +2025/02/06 01:46:28.392 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:25.9040000Z","device_time":"2025-02-06T06:46:28.3909860Z"} +2025/02/06 01:46:29.386 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:26.8990000Z","device_time":"2025-02-06T06:46:29.3858830Z"} +2025/02/06 01:46:30.401 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:27.9140000Z","device_time":"2025-02-06T06:46:30.4009420Z"} +2025/02/06 01:46:31.426 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:28.9390000Z","device_time":"2025-02-06T06:46:31.4259310Z"} +2025/02/06 01:46:32.479 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:29.9920000Z","device_time":"2025-02-06T06:46:32.4788840Z"} +2025/02/06 01:46:33.499 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:31.0120000Z","device_time":"2025-02-06T06:46:33.4991730Z"} +2025/02/06 01:46:34.557 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:32.0690000Z","device_time":"2025-02-06T06:46:34.5565340Z"} +2025/02/06 01:46:35.576 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:33.0890000Z","device_time":"2025-02-06T06:46:35.5757590Z"} +2025/02/06 01:46:36.610 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:34.1230000Z","device_time":"2025-02-06T06:46:36.6099310Z"} +2025/02/06 01:46:37.632 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:35.1450000Z","device_time":"2025-02-06T06:46:37.6319560Z"} +2025/02/06 01:46:38.659 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:36.1720000Z","device_time":"2025-02-06T06:46:38.6590890Z"} +2025/02/06 01:46:39.665 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:37.1780000Z","device_time":"2025-02-06T06:46:39.6649860Z"} +2025/02/06 01:46:40.706 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:38.2180000Z","device_time":"2025-02-06T06:46:40.7053770Z"} +2025/02/06 01:46:41.713 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:39.2260000Z","device_time":"2025-02-06T06:46:41.7133590Z"} +2025/02/06 01:46:42.742 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:40.2540000Z","device_time":"2025-02-06T06:46:42.7414880Z"} +2025/02/06 01:46:43.742 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:41.2530000Z","device_time":"2025-02-06T06:46:43.7402530Z"} +2025/02/06 01:46:44.755 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:42.2640000Z","device_time":"2025-02-06T06:46:44.7514970Z"} +2025/02/06 01:46:45.787 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:43.2990000Z","device_time":"2025-02-06T06:46:45.7861760Z"} +2025/02/06 01:46:46.831 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:44.3430000Z","device_time":"2025-02-06T06:46:46.8302900Z"} +2025/02/06 01:46:47.858 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:45.3700000Z","device_time":"2025-02-06T06:46:47.8573790Z"} +2025/02/06 01:46:48.853 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:46.3640000Z","device_time":"2025-02-06T06:46:48.8511790Z"} +2025/02/06 01:46:49.873 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:47.3850000Z","device_time":"2025-02-06T06:46:49.8723530Z"} +2025/02/06 01:46:50.928 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:48.4400000Z","device_time":"2025-02-06T06:46:50.9274290Z"} +2025/02/06 01:46:51.932 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:49.4450000Z","device_time":"2025-02-06T06:46:51.9322300Z"} +2025/02/06 01:46:52.965 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:50.4770000Z","device_time":"2025-02-06T06:46:52.9642440Z"} +2025/02/06 01:46:53.993 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:51.5050000Z","device_time":"2025-02-06T06:46:53.9926120Z"} +2025/02/06 01:46:55.034 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:52.5470000Z","device_time":"2025-02-06T06:46:55.0337530Z"} +2025/02/06 01:46:56.062 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:53.5750000Z","device_time":"2025-02-06T06:46:56.0622510Z"} +2025/02/06 01:46:57.095 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:54.6080000Z","device_time":"2025-02-06T06:46:57.0949330Z"} +2025/02/06 01:46:58.089 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:55.6020000Z","device_time":"2025-02-06T06:46:58.0888650Z"} +2025/02/06 01:46:59.142 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:56.6550000Z","device_time":"2025-02-06T06:46:59.1421700Z"} +2025/02/06 01:47:00.155 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:57.6670000Z","device_time":"2025-02-06T06:47:00.1546840Z"} +2025/02/06 01:47:01.169 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:58.6760000Z","device_time":"2025-02-06T06:47:01.1631220Z"} +2025/02/06 01:47:02.214 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:46:59.7260000Z","device_time":"2025-02-06T06:47:02.2136780Z"} +2025/02/06 01:47:03.238 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:00.7500000Z","device_time":"2025-02-06T06:47:03.2374410Z"} +2025/02/06 01:47:04.329 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:01.8380000Z","device_time":"2025-02-06T06:47:04.3248960Z"} +2025/02/06 01:47:05.342 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:02.8550000Z","device_time":"2025-02-06T06:47:05.3422300Z"} +2025/02/06 01:47:06.348 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:03.8510000Z","device_time":"2025-02-06T06:47:06.3385550Z"} +2025/02/06 01:47:07.441 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:04.9530000Z","device_time":"2025-02-06T06:47:07.4405640Z"} +2025/02/06 01:47:08.411 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:05.9230000Z","device_time":"2025-02-06T06:47:08.4101230Z"} +2025/02/06 01:47:09.440 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:06.9520000Z","device_time":"2025-02-06T06:47:09.4393790Z"} +2025/02/06 01:47:10.462 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:07.9740000Z","device_time":"2025-02-06T06:47:10.4616030Z"} +2025/02/06 01:47:11.508 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:09.0210000Z","device_time":"2025-02-06T06:47:11.5079060Z"} +2025/02/06 01:47:12.509 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:10.0220000Z","device_time":"2025-02-06T06:47:12.5091150Z"} +2025/02/06 01:47:13.521 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:11.0340000Z","device_time":"2025-02-06T06:47:13.5211430Z"} +2025/02/06 01:47:14.551 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:12.0630000Z","device_time":"2025-02-06T06:47:14.5506070Z"} +2025/02/06 01:47:15.650 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:13.1620000Z","device_time":"2025-02-06T06:47:15.6496430Z"} +2025/02/06 01:47:16.651 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:14.1640000Z","device_time":"2025-02-06T06:47:16.6510890Z"} +2025/02/06 01:47:17.659 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:15.1710000Z","device_time":"2025-02-06T06:47:17.6586350Z"} +2025/02/06 01:47:18.756 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:16.2690000Z","device_time":"2025-02-06T06:47:18.7562760Z"} +2025/02/06 01:47:19.774 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:17.2860000Z","device_time":"2025-02-06T06:47:19.7732920Z"} +2025/02/06 01:47:20.799 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:18.3120000Z","device_time":"2025-02-06T06:47:20.7993920Z"} +2025/02/06 01:47:21.836 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:19.3480000Z","device_time":"2025-02-06T06:47:21.8354800Z"} +2025/02/06 01:47:22.868 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:20.3810000Z","device_time":"2025-02-06T06:47:22.8677630Z"} +2025/02/06 01:47:23.910 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:21.4220000Z","device_time":"2025-02-06T06:47:23.9094250Z"} +2025/02/06 01:47:24.937 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:22.4490000Z","device_time":"2025-02-06T06:47:24.9366590Z"} +2025/02/06 01:47:25.962 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:23.4740000Z","device_time":"2025-02-06T06:47:25.9615040Z"} +2025/02/06 01:47:26.988 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:24.5000000Z","device_time":"2025-02-06T06:47:26.9875230Z"} +2025/02/06 01:47:27.989 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:25.5020000Z","device_time":"2025-02-06T06:47:27.9889970Z"} +2025/02/06 01:47:29.045 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:26.5520000Z","device_time":"2025-02-06T06:47:29.0389370Z"} +2025/02/06 01:47:30.058 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:27.5710000Z","device_time":"2025-02-06T06:47:30.0577910Z"} +2025/02/06 01:47:31.086 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:28.5960000Z","device_time":"2025-02-06T06:47:31.0832920Z"} +2025/02/06 01:47:32.120 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:29.6330000Z","device_time":"2025-02-06T06:47:32.1203470Z"} +2025/02/06 01:47:33.137 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:30.6500000Z","device_time":"2025-02-06T06:47:33.1372390Z"} +2025/02/06 01:47:34.138 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:31.6510000Z","device_time":"2025-02-06T06:47:34.1380280Z"} +2025/02/06 01:47:35.172 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:32.6840000Z","device_time":"2025-02-06T06:47:35.1717040Z"} +2025/02/06 01:47:36.213 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:33.7250000Z","device_time":"2025-02-06T06:47:36.2123410Z"} +2025/02/06 01:47:37.209 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:34.7220000Z","device_time":"2025-02-06T06:47:37.2089100Z"} +2025/02/06 01:47:38.241 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:35.7540000Z","device_time":"2025-02-06T06:47:38.2411380Z"} +2025/02/06 01:47:39.255 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:36.7670000Z","device_time":"2025-02-06T06:47:39.2542280Z"} +2025/02/06 01:47:40.307 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:37.8190000Z","device_time":"2025-02-06T06:47:40.3063730Z"} +2025/02/06 01:47:41.297 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:38.8100000Z","device_time":"2025-02-06T06:47:41.2971430Z"} +2025/02/06 01:47:42.338 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:39.8500000Z","device_time":"2025-02-06T06:47:42.3373770Z"} +2025/02/06 01:47:43.362 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:40.8750000Z","device_time":"2025-02-06T06:47:43.3622320Z"} +2025/02/06 01:47:44.372 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:41.8840000Z","device_time":"2025-02-06T06:47:44.3712270Z"} +2025/02/06 01:47:45.386 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:42.8990000Z","device_time":"2025-02-06T06:47:45.3862230Z"} +2025/02/06 01:47:46.419 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:43.9310000Z","device_time":"2025-02-06T06:47:46.4183920Z"} +2025/02/06 01:47:47.455 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:44.9660000Z","device_time":"2025-02-06T06:47:47.4535820Z"} +2025/02/06 01:47:48.468 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:45.9810000Z","device_time":"2025-02-06T06:47:48.4679230Z"} +2025/02/06 01:47:49.493 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:47.0050000Z","device_time":"2025-02-06T06:47:49.4926970Z"} +2025/02/06 01:47:50.536 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:48.0490000Z","device_time":"2025-02-06T06:47:50.5358420Z"} +2025/02/06 01:47:51.543 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:49.0550000Z","device_time":"2025-02-06T06:47:51.5424500Z"} +2025/02/06 01:47:52.601 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:50.1140000Z","device_time":"2025-02-06T06:47:52.6007190Z"} +2025/02/06 01:47:53.616 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:51.1280000Z","device_time":"2025-02-06T06:47:53.6155550Z"} +2025/02/06 01:47:54.628 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:52.1410000Z","device_time":"2025-02-06T06:47:54.6280260Z"} +2025/02/06 01:47:55.635 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:53.1470000Z","device_time":"2025-02-06T06:47:55.6344470Z"} +2025/02/06 01:47:56.655 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:54.1680000Z","device_time":"2025-02-06T06:47:56.6548090Z"} +2025/02/06 01:47:57.692 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:55.2040000Z","device_time":"2025-02-06T06:47:57.6914970Z"} +2025/02/06 01:47:58.703 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:56.2160000Z","device_time":"2025-02-06T06:47:58.7030000Z"} +2025/02/06 01:47:59.743 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:57.2550000Z","device_time":"2025-02-06T06:47:59.7422740Z"} +2025/02/06 01:48:00.752 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:58.2650000Z","device_time":"2025-02-06T06:48:00.7517660Z"} +2025/02/06 01:48:01.821 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:47:59.3340000Z","device_time":"2025-02-06T06:48:01.8209210Z"} +2025/02/06 01:48:02.840 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:00.3500000Z","device_time":"2025-02-06T06:48:02.8376920Z"} +2025/02/06 01:48:03.820 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:01.3310000Z","device_time":"2025-02-06T06:48:03.8179570Z"} +2025/02/06 01:48:04.838 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:02.3510000Z","device_time":"2025-02-06T06:48:04.8382380Z"} +2025/02/06 01:48:05.838 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:03.3500000Z","device_time":"2025-02-06T06:48:05.8376640Z"} +2025/02/06 01:48:06.880 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:04.3930000Z","device_time":"2025-02-06T06:48:06.8797180Z"} +2025/02/06 01:48:07.900 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:05.4130000Z","device_time":"2025-02-06T06:48:07.9000870Z"} +2025/02/06 01:48:08.906 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:06.4190000Z","device_time":"2025-02-06T06:48:08.9057410Z"} +2025/02/06 01:48:09.949 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:07.4620000Z","device_time":"2025-02-06T06:48:09.9490390Z"} +2025/02/06 01:48:10.958 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:08.4700000Z","device_time":"2025-02-06T06:48:10.9574230Z"} +2025/02/06 01:48:11.969 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:09.4820000Z","device_time":"2025-02-06T06:48:11.9687500Z"} +2025/02/06 01:48:13.077 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:10.5890000Z","device_time":"2025-02-06T06:48:13.0765620Z"} +2025/02/06 01:48:14.071 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:11.5840000Z","device_time":"2025-02-06T06:48:14.0709830Z"} +2025/02/06 01:48:15.088 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:12.6000000Z","device_time":"2025-02-06T06:48:15.0871370Z"} +2025/02/06 01:48:16.157 30443 30456 Info Unity {"ntp_time":"2025-02-06T06:48:13.6690000Z","device_time":"2025-02-06T06:48:16.1566350Z"} diff --git a/python/evaluations/data/single_device/ntp_clock/pixel_6/run3-logcat.txt b/python/evaluations/data/single_device/ntp_clock/pixel_6/run3-logcat.txt new file mode 100644 index 0000000..d559d99 --- /dev/null +++ b/python/evaluations/data/single_device/ntp_clock/pixel_6/run3-logcat.txt @@ -0,0 +1,294 @@ +2025/02/06 01:49:27.216 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:24.6890000Z","device_time":"2025-02-06T06:49:27.2121880Z"} +2025/02/06 01:49:28.258 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:25.7340000Z","device_time":"2025-02-06T06:49:28.2571180Z"} +2025/02/06 01:49:29.281 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:26.7580000Z","device_time":"2025-02-06T06:49:29.2808990Z"} +2025/02/06 01:49:30.294 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:27.7710000Z","device_time":"2025-02-06T06:49:30.2939300Z"} +2025/02/06 01:49:31.304 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:28.7810000Z","device_time":"2025-02-06T06:49:31.3038080Z"} +2025/02/06 01:49:32.344 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:29.8210000Z","device_time":"2025-02-06T06:49:32.3436840Z"} +2025/02/06 01:49:33.344 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:30.8200000Z","device_time":"2025-02-06T06:49:33.3435960Z"} +2025/02/06 01:49:34.376 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:31.8530000Z","device_time":"2025-02-06T06:49:34.3760970Z"} +2025/02/06 01:49:35.407 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:32.8840000Z","device_time":"2025-02-06T06:49:35.4070080Z"} +2025/02/06 01:49:36.458 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:33.9350000Z","device_time":"2025-02-06T06:49:36.4581770Z"} +2025/02/06 01:49:37.465 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:34.9420000Z","device_time":"2025-02-06T06:49:37.4647870Z"} +2025/02/06 01:49:38.570 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:36.0430000Z","device_time":"2025-02-06T06:49:38.5661830Z"} +2025/02/06 01:49:39.576 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:37.0490000Z","device_time":"2025-02-06T06:49:39.5717720Z"} +2025/02/06 01:49:40.598 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:38.0740000Z","device_time":"2025-02-06T06:49:40.5975340Z"} +2025/02/06 01:49:41.611 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:39.0880000Z","device_time":"2025-02-06T06:49:41.6110470Z"} +2025/02/06 01:49:42.640 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:40.1150000Z","device_time":"2025-02-06T06:49:42.6385800Z"} +2025/02/06 01:49:43.676 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:41.1520000Z","device_time":"2025-02-06T06:49:43.6755500Z"} +2025/02/06 01:49:44.678 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:42.1550000Z","device_time":"2025-02-06T06:49:44.6777050Z"} +2025/02/06 01:49:45.696 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:43.1730000Z","device_time":"2025-02-06T06:49:45.6957360Z"} +2025/02/06 01:49:46.735 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:44.2120000Z","device_time":"2025-02-06T06:49:46.7347960Z"} +2025/02/06 01:49:47.756 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:45.2320000Z","device_time":"2025-02-06T06:49:47.7551620Z"} +2025/02/06 01:49:48.767 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:46.2440000Z","device_time":"2025-02-06T06:49:48.7672420Z"} +2025/02/06 01:49:49.796 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:47.2730000Z","device_time":"2025-02-06T06:49:49.7959750Z"} +2025/02/06 01:49:50.826 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:48.3020000Z","device_time":"2025-02-06T06:49:50.8255160Z"} +2025/02/06 01:49:51.886 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:49.3630000Z","device_time":"2025-02-06T06:49:51.8857440Z"} +2025/02/06 01:49:52.912 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:50.3880000Z","device_time":"2025-02-06T06:49:52.9114330Z"} +2025/02/06 01:49:53.939 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:51.4140000Z","device_time":"2025-02-06T06:49:53.9371420Z"} +2025/02/06 01:49:54.998 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:52.4720000Z","device_time":"2025-02-06T06:49:54.9946500Z"} +2025/02/06 01:49:56.030 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:53.5060000Z","device_time":"2025-02-06T06:49:56.0295110Z"} +2025/02/06 01:49:57.055 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:54.5320000Z","device_time":"2025-02-06T06:49:57.0550020Z"} +2025/02/06 01:49:58.062 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:55.5380000Z","device_time":"2025-02-06T06:49:58.0615010Z"} +2025/02/06 01:49:59.072 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:56.5480000Z","device_time":"2025-02-06T06:49:59.0708720Z"} +2025/02/06 01:50:00.130 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:57.6060000Z","device_time":"2025-02-06T06:50:00.1288990Z"} +2025/02/06 01:50:01.152 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:58.6280000Z","device_time":"2025-02-06T06:50:01.1510580Z"} +2025/02/06 01:50:02.173 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:49:59.6500000Z","device_time":"2025-02-06T06:50:02.1727190Z"} +2025/02/06 01:50:03.203 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:00.6790000Z","device_time":"2025-02-06T06:50:03.2025840Z"} +2025/02/06 01:50:04.208 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:01.6840000Z","device_time":"2025-02-06T06:50:04.2075840Z"} +2025/02/06 01:50:05.234 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:02.7110000Z","device_time":"2025-02-06T06:50:05.2340180Z"} +2025/02/06 01:50:06.312 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:03.7880000Z","device_time":"2025-02-06T06:50:06.3115320Z"} +2025/02/06 01:50:07.323 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:04.8000000Z","device_time":"2025-02-06T06:50:07.3227670Z"} +2025/02/06 01:50:08.341 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:05.8170000Z","device_time":"2025-02-06T06:50:08.3404090Z"} +2025/02/06 01:50:09.364 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:06.8410000Z","device_time":"2025-02-06T06:50:09.3637420Z"} +2025/02/06 01:50:10.376 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:07.8520000Z","device_time":"2025-02-06T06:50:10.3752920Z"} +2025/02/06 01:50:11.397 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:08.8740000Z","device_time":"2025-02-06T06:50:11.3972120Z"} +2025/02/06 01:50:12.438 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:09.9150000Z","device_time":"2025-02-06T06:50:12.4379430Z"} +2025/02/06 01:50:13.495 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:10.9720000Z","device_time":"2025-02-06T06:50:13.4946860Z"} +2025/02/06 01:50:14.488 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:11.9640000Z","device_time":"2025-02-06T06:50:14.4875620Z"} +2025/02/06 01:50:15.549 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:13.0260000Z","device_time":"2025-02-06T06:50:15.5487370Z"} +2025/02/06 01:50:16.583 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:14.0590000Z","device_time":"2025-02-06T06:50:16.5824110Z"} +2025/02/06 01:50:17.577 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:15.0530000Z","device_time":"2025-02-06T06:50:17.5763490Z"} +2025/02/06 01:50:18.613 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:16.0880000Z","device_time":"2025-02-06T06:50:18.6113770Z"} +2025/02/06 01:50:19.624 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:17.1000000Z","device_time":"2025-02-06T06:50:19.6235930Z"} +2025/02/06 01:50:20.647 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:18.1220000Z","device_time":"2025-02-06T06:50:20.6447590Z"} +2025/02/06 01:50:21.673 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:19.1490000Z","device_time":"2025-02-06T06:50:21.6724940Z"} +2025/02/06 01:50:22.723 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:20.1960000Z","device_time":"2025-02-06T06:50:22.7187870Z"} +2025/02/06 01:50:23.753 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:21.2290000Z","device_time":"2025-02-06T06:50:23.7523150Z"} +2025/02/06 01:50:24.759 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:22.2260000Z","device_time":"2025-02-06T06:50:24.7487690Z"} +2025/02/06 01:50:25.802 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:23.2790000Z","device_time":"2025-02-06T06:50:25.8021230Z"} +2025/02/06 01:50:26.815 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:24.2910000Z","device_time":"2025-02-06T06:50:26.8146000Z"} +2025/02/06 01:50:27.860 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:25.3370000Z","device_time":"2025-02-06T06:50:27.8603440Z"} +2025/02/06 01:50:28.864 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:26.3400000Z","device_time":"2025-02-06T06:50:28.8631390Z"} +2025/02/06 01:50:29.883 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:27.3590000Z","device_time":"2025-02-06T06:50:29.8823940Z"} +2025/02/06 01:50:30.903 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:28.3800000Z","device_time":"2025-02-06T06:50:30.9030320Z"} +2025/02/06 01:50:31.903 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:29.3790000Z","device_time":"2025-02-06T06:50:31.9023730Z"} +2025/02/06 01:50:32.916 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:30.3920000Z","device_time":"2025-02-06T06:50:32.9156140Z"} +2025/02/06 01:50:33.943 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:31.4190000Z","device_time":"2025-02-06T06:50:33.9424300Z"} +2025/02/06 01:50:35.000 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:32.4650000Z","device_time":"2025-02-06T06:50:34.9882590Z"} +2025/02/06 01:50:35.985 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:33.4620000Z","device_time":"2025-02-06T06:50:35.9853050Z"} +2025/02/06 01:50:37.018 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:34.4940000Z","device_time":"2025-02-06T06:50:37.0172910Z"} +2025/02/06 01:50:38.067 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:35.5430000Z","device_time":"2025-02-06T06:50:38.0664050Z"} +2025/02/06 01:50:39.079 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:36.5550000Z","device_time":"2025-02-06T06:50:39.0785300Z"} +2025/02/06 01:50:40.078 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:37.5550000Z","device_time":"2025-02-06T06:50:40.0783680Z"} +2025/02/06 01:50:41.106 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:38.5830000Z","device_time":"2025-02-06T06:50:41.1063990Z"} +2025/02/06 01:50:42.176 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:39.6520000Z","device_time":"2025-02-06T06:50:42.1755880Z"} +2025/02/06 01:50:43.166 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:40.6420000Z","device_time":"2025-02-06T06:50:43.1652130Z"} +2025/02/06 01:50:44.232 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:41.7080000Z","device_time":"2025-02-06T06:50:44.2312560Z"} +2025/02/06 01:50:45.214 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:42.6900000Z","device_time":"2025-02-06T06:50:45.2134810Z"} +2025/02/06 01:50:46.219 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:43.6960000Z","device_time":"2025-02-06T06:50:46.2186910Z"} +2025/02/06 01:50:47.230 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:44.7070000Z","device_time":"2025-02-06T06:50:47.2301970Z"} +2025/02/06 01:50:48.251 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:45.7270000Z","device_time":"2025-02-06T06:50:48.2504280Z"} +2025/02/06 01:50:49.295 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:46.7700000Z","device_time":"2025-02-06T06:50:49.2935080Z"} +2025/02/06 01:50:50.308 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:47.7850000Z","device_time":"2025-02-06T06:50:50.3080680Z"} +2025/02/06 01:50:51.359 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:48.8360000Z","device_time":"2025-02-06T06:50:51.3587460Z"} +2025/02/06 01:50:52.392 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:49.8680000Z","device_time":"2025-02-06T06:50:52.3885040Z"} +2025/02/06 01:50:53.398 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:50.8780000Z","device_time":"2025-02-06T06:50:53.3981990Z"} +2025/02/06 01:50:54.420 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:51.8990000Z","device_time":"2025-02-06T06:50:54.4194960Z"} +2025/02/06 01:50:55.467 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:52.9470000Z","device_time":"2025-02-06T06:50:55.4670590Z"} +2025/02/06 01:50:56.471 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:53.9500000Z","device_time":"2025-02-06T06:50:56.4708000Z"} +2025/02/06 01:50:57.538 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:55.0170000Z","device_time":"2025-02-06T06:50:57.5372460Z"} +2025/02/06 01:50:58.578 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:56.0570000Z","device_time":"2025-02-06T06:50:58.5774270Z"} +2025/02/06 01:50:59.586 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:57.0650000Z","device_time":"2025-02-06T06:50:59.5856320Z"} +2025/02/06 01:51:00.593 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:58.0730000Z","device_time":"2025-02-06T06:51:00.5930500Z"} +2025/02/06 01:51:01.636 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:50:59.1080000Z","device_time":"2025-02-06T06:51:01.6284170Z"} +2025/02/06 01:51:02.647 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:00.1230000Z","device_time":"2025-02-06T06:51:02.6435320Z"} +2025/02/06 01:51:03.673 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:01.1520000Z","device_time":"2025-02-06T06:51:03.6727620Z"} +2025/02/06 01:51:04.681 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:02.1610000Z","device_time":"2025-02-06T06:51:04.6810050Z"} +2025/02/06 01:51:05.707 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:03.1860000Z","device_time":"2025-02-06T06:51:05.7062470Z"} +2025/02/06 01:51:06.718 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:04.1970000Z","device_time":"2025-02-06T06:51:06.7173130Z"} +2025/02/06 01:51:07.750 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:05.2300000Z","device_time":"2025-02-06T06:51:07.7501570Z"} +2025/02/06 01:51:08.756 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:06.2350000Z","device_time":"2025-02-06T06:51:08.7557870Z"} +2025/02/06 01:51:09.782 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:07.2610000Z","device_time":"2025-02-06T06:51:09.7817620Z"} +2025/02/06 01:51:10.803 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:08.2820000Z","device_time":"2025-02-06T06:51:10.8024900Z"} +2025/02/06 01:51:11.797 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:09.2760000Z","device_time":"2025-02-06T06:51:11.7966460Z"} +2025/02/06 01:51:12.855 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:10.3340000Z","device_time":"2025-02-06T06:51:12.8547100Z"} +2025/02/06 01:51:13.877 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:11.3570000Z","device_time":"2025-02-06T06:51:13.8770890Z"} +2025/02/06 01:51:14.885 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:12.3640000Z","device_time":"2025-02-06T06:51:14.8847260Z"} +2025/02/06 01:51:15.919 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:13.3990000Z","device_time":"2025-02-06T06:51:15.9190970Z"} +2025/02/06 01:51:16.937 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:14.4160000Z","device_time":"2025-02-06T06:51:16.9368510Z"} +2025/02/06 01:51:17.941 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:15.4200000Z","device_time":"2025-02-06T06:51:17.9406180Z"} +2025/02/06 01:51:18.974 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:16.4540000Z","device_time":"2025-02-06T06:51:18.9740230Z"} +2025/02/06 01:51:20.016 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:17.4950000Z","device_time":"2025-02-06T06:51:20.0159060Z"} +2025/02/06 01:51:21.046 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:18.5260000Z","device_time":"2025-02-06T06:51:21.0459790Z"} +2025/02/06 01:51:22.086 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:19.5650000Z","device_time":"2025-02-06T06:51:22.0854060Z"} +2025/02/06 01:51:23.097 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:20.5760000Z","device_time":"2025-02-06T06:51:23.0965070Z"} +2025/02/06 01:51:24.127 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:21.6060000Z","device_time":"2025-02-06T06:51:24.1268620Z"} +2025/02/06 01:51:25.166 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:22.6450000Z","device_time":"2025-02-06T06:51:25.1656130Z"} +2025/02/06 01:51:26.167 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:23.6460000Z","device_time":"2025-02-06T06:51:26.1669620Z"} +2025/02/06 01:51:27.190 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:24.6690000Z","device_time":"2025-02-06T06:51:27.1894430Z"} +2025/02/06 01:51:28.217 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:25.6910000Z","device_time":"2025-02-06T06:51:28.2110310Z"} +2025/02/06 01:51:29.256 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:26.7350000Z","device_time":"2025-02-06T06:51:29.2554920Z"} +2025/02/06 01:51:30.249 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:27.7280000Z","device_time":"2025-02-06T06:51:30.2487430Z"} +2025/02/06 01:51:31.266 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:28.7450000Z","device_time":"2025-02-06T06:51:31.2651150Z"} +2025/02/06 01:51:32.274 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:29.7540000Z","device_time":"2025-02-06T06:51:32.2741980Z"} +2025/02/06 01:51:33.290 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:30.7690000Z","device_time":"2025-02-06T06:51:33.2894390Z"} +2025/02/06 01:51:34.324 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:31.8030000Z","device_time":"2025-02-06T06:51:34.3236310Z"} +2025/02/06 01:51:35.370 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:32.8490000Z","device_time":"2025-02-06T06:51:35.3697080Z"} +2025/02/06 01:51:36.385 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:33.8640000Z","device_time":"2025-02-06T06:51:36.3848130Z"} +2025/02/06 01:51:37.468 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:34.9470000Z","device_time":"2025-02-06T06:51:37.4670510Z"} +2025/02/06 01:51:38.555 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:36.0340000Z","device_time":"2025-02-06T06:51:38.5539770Z"} +2025/02/06 01:51:39.478 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:36.9570000Z","device_time":"2025-02-06T06:51:39.4773870Z"} +2025/02/06 01:51:40.499 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:37.9770000Z","device_time":"2025-02-06T06:51:40.4977210Z"} +2025/02/06 01:51:41.519 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:38.9990000Z","device_time":"2025-02-06T06:51:41.5191690Z"} +2025/02/06 01:51:42.556 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:40.0300000Z","device_time":"2025-02-06T06:51:42.5503360Z"} +2025/02/06 01:51:43.581 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:41.0600000Z","device_time":"2025-02-06T06:51:43.5809510Z"} +2025/02/06 01:51:44.640 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:42.1190000Z","device_time":"2025-02-06T06:51:44.6392830Z"} +2025/02/06 01:51:45.657 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:43.1370000Z","device_time":"2025-02-06T06:51:45.6572420Z"} +2025/02/06 01:51:46.698 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:44.1770000Z","device_time":"2025-02-06T06:51:46.6973140Z"} +2025/02/06 01:51:47.721 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:45.2000000Z","device_time":"2025-02-06T06:51:47.7209080Z"} +2025/02/06 01:51:48.831 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:46.3100000Z","device_time":"2025-02-06T06:51:48.8307510Z"} +2025/02/06 01:51:49.856 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:47.3360000Z","device_time":"2025-02-06T06:51:49.8559520Z"} +2025/02/06 01:51:50.886 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:48.3660000Z","device_time":"2025-02-06T06:51:50.8860100Z"} +2025/02/06 01:51:51.924 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:49.4040000Z","device_time":"2025-02-06T06:51:51.9240830Z"} +2025/02/06 01:51:53.011 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:50.4910000Z","device_time":"2025-02-06T06:51:53.0110340Z"} +2025/02/06 01:51:54.108 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:51.5870000Z","device_time":"2025-02-06T06:51:54.1075650Z"} +2025/02/06 01:51:55.081 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:52.5610000Z","device_time":"2025-02-06T06:51:55.0809810Z"} +2025/02/06 01:51:56.146 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:53.6250000Z","device_time":"2025-02-06T06:51:56.1457290Z"} +2025/02/06 01:51:57.168 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:54.6480000Z","device_time":"2025-02-06T06:51:57.1679660Z"} +2025/02/06 01:51:58.193 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:55.6720000Z","device_time":"2025-02-06T06:51:58.1923940Z"} +2025/02/06 01:51:59.224 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:56.7040000Z","device_time":"2025-02-06T06:51:59.2242640Z"} +2025/02/06 01:52:00.286 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:57.7650000Z","device_time":"2025-02-06T06:52:00.2854370Z"} +2025/02/06 01:52:01.332 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:58.8120000Z","device_time":"2025-02-06T06:52:01.3320070Z"} +2025/02/06 01:52:02.346 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:51:59.8260000Z","device_time":"2025-02-06T06:52:02.3462310Z"} +2025/02/06 01:52:03.392 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:00.8700000Z","device_time":"2025-02-06T06:52:03.3907960Z"} +2025/02/06 01:52:04.423 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:01.9030000Z","device_time":"2025-02-06T06:52:04.4230330Z"} +2025/02/06 01:52:05.434 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:02.9130000Z","device_time":"2025-02-06T06:52:05.4335290Z"} +2025/02/06 01:52:06.509 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:03.9890000Z","device_time":"2025-02-06T06:52:06.5089810Z"} +2025/02/06 01:52:07.514 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:04.9930000Z","device_time":"2025-02-06T06:52:07.5135290Z"} +2025/02/06 01:52:08.519 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:05.9980000Z","device_time":"2025-02-06T06:52:08.5181140Z"} +2025/02/06 01:52:09.572 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:07.0470000Z","device_time":"2025-02-06T06:52:09.5673120Z"} +2025/02/06 01:52:10.615 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:08.0940000Z","device_time":"2025-02-06T06:52:10.6145120Z"} +2025/02/06 01:52:11.653 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:09.1310000Z","device_time":"2025-02-06T06:52:11.6516360Z"} +2025/02/06 01:52:12.642 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:10.1210000Z","device_time":"2025-02-06T06:52:12.6413820Z"} +2025/02/06 01:52:13.726 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:11.1970000Z","device_time":"2025-02-06T06:52:13.7176560Z"} +2025/02/06 01:52:14.718 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:12.1970000Z","device_time":"2025-02-06T06:52:14.7174430Z"} +2025/02/06 01:52:15.814 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:13.2940000Z","device_time":"2025-02-06T06:52:15.8140090Z"} +2025/02/06 01:52:16.834 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:14.3120000Z","device_time":"2025-02-06T06:52:16.8329020Z"} +2025/02/06 01:52:17.873 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:15.3480000Z","device_time":"2025-02-06T06:52:17.8689370Z"} +2025/02/06 01:52:18.888 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:16.3680000Z","device_time":"2025-02-06T06:52:18.8881210Z"} +2025/02/06 01:52:19.913 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:17.3920000Z","device_time":"2025-02-06T06:52:19.9124170Z"} +2025/02/06 01:52:20.959 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:18.4260000Z","device_time":"2025-02-06T06:52:20.9468220Z"} +2025/02/06 01:52:22.017 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:19.4960000Z","device_time":"2025-02-06T06:52:22.0167270Z"} +2025/02/06 01:52:22.982 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:20.4600000Z","device_time":"2025-02-06T06:52:22.9807930Z"} +2025/02/06 01:52:24.005 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:21.4840000Z","device_time":"2025-02-06T06:52:24.0045890Z"} +2025/02/06 01:52:25.085 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:22.5640000Z","device_time":"2025-02-06T06:52:25.0840330Z"} +2025/02/06 01:52:26.114 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:23.5910000Z","device_time":"2025-02-06T06:52:26.1119320Z"} +2025/02/06 01:52:27.148 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:24.6270000Z","device_time":"2025-02-06T06:52:27.1477220Z"} +2025/02/06 01:52:28.154 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:25.6330000Z","device_time":"2025-02-06T06:52:28.1534760Z"} +2025/02/06 01:52:29.167 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:26.6460000Z","device_time":"2025-02-06T06:52:29.1661610Z"} +2025/02/06 01:52:30.202 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:27.6820000Z","device_time":"2025-02-06T06:52:30.2020020Z"} +2025/02/06 01:52:31.210 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:28.6890000Z","device_time":"2025-02-06T06:52:31.2097790Z"} +2025/02/06 01:52:32.238 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:29.7160000Z","device_time":"2025-02-06T06:52:32.2364950Z"} +2025/02/06 01:52:33.320 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:30.7990000Z","device_time":"2025-02-06T06:52:33.3198170Z"} +2025/02/06 01:52:34.326 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:31.8060000Z","device_time":"2025-02-06T06:52:34.3260080Z"} +2025/02/06 01:52:35.409 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:32.8890000Z","device_time":"2025-02-06T06:52:35.4092280Z"} +2025/02/06 01:52:36.404 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:33.8830000Z","device_time":"2025-02-06T06:52:36.4032380Z"} +2025/02/06 01:52:37.485 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:34.9610000Z","device_time":"2025-02-06T06:52:37.4813040Z"} +2025/02/06 01:52:38.499 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:35.9690000Z","device_time":"2025-02-06T06:52:38.4897540Z"} +2025/02/06 01:52:39.488 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:36.9670000Z","device_time":"2025-02-06T06:52:39.4873910Z"} +2025/02/06 01:52:40.518 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:37.9970000Z","device_time":"2025-02-06T06:52:40.5170990Z"} +2025/02/06 01:52:41.564 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:39.0430000Z","device_time":"2025-02-06T06:52:41.5634040Z"} +2025/02/06 01:52:42.563 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:40.0420000Z","device_time":"2025-02-06T06:52:42.5626040Z"} +2025/02/06 01:52:43.579 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:41.0580000Z","device_time":"2025-02-06T06:52:43.5787130Z"} +2025/02/06 01:52:44.622 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:42.1010000Z","device_time":"2025-02-06T06:52:44.6218900Z"} +2025/02/06 01:52:45.642 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:43.1220000Z","device_time":"2025-02-06T06:52:45.6421790Z"} +2025/02/06 01:52:46.661 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:44.1410000Z","device_time":"2025-02-06T06:52:46.6611320Z"} +2025/02/06 01:52:47.733 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:45.2120000Z","device_time":"2025-02-06T06:52:47.7319560Z"} +2025/02/06 01:52:48.743 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:46.2220000Z","device_time":"2025-02-06T06:52:48.7427660Z"} +2025/02/06 01:52:49.749 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:47.2280000Z","device_time":"2025-02-06T06:52:49.7488500Z"} +2025/02/06 01:52:50.886 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:48.3650000Z","device_time":"2025-02-06T06:52:50.8852760Z"} +2025/02/06 01:52:51.875 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:49.3530000Z","device_time":"2025-02-06T06:52:51.8739260Z"} +2025/02/06 01:52:52.933 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:50.4120000Z","device_time":"2025-02-06T06:52:52.9326920Z"} +2025/02/06 01:52:53.958 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:51.4370000Z","device_time":"2025-02-06T06:52:53.9574620Z"} +2025/02/06 01:52:54.996 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:52.4750000Z","device_time":"2025-02-06T06:52:54.9958810Z"} +2025/02/06 01:52:56.025 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:53.5050000Z","device_time":"2025-02-06T06:52:56.0250550Z"} +2025/02/06 01:52:57.073 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:54.5530000Z","device_time":"2025-02-06T06:52:57.0731560Z"} +2025/02/06 01:52:58.082 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:55.5610000Z","device_time":"2025-02-06T06:52:58.0817340Z"} +2025/02/06 01:52:59.168 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:56.6450000Z","device_time":"2025-02-06T06:52:59.1654790Z"} +2025/02/06 01:53:00.126 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:57.6040000Z","device_time":"2025-02-06T06:53:00.1249000Z"} +2025/02/06 01:53:01.152 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:58.6230000Z","device_time":"2025-02-06T06:53:01.1431810Z"} +2025/02/06 01:53:02.157 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:52:59.6360000Z","device_time":"2025-02-06T06:53:02.1565280Z"} +2025/02/06 01:53:03.201 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:00.6800000Z","device_time":"2025-02-06T06:53:03.2006770Z"} +2025/02/06 01:53:04.216 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:01.6960000Z","device_time":"2025-02-06T06:53:04.2160000Z"} +2025/02/06 01:53:05.262 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:02.7420000Z","device_time":"2025-02-06T06:53:05.2621090Z"} +2025/02/06 01:53:06.329 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:03.8080000Z","device_time":"2025-02-06T06:53:06.3283190Z"} +2025/02/06 01:53:07.347 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:04.8260000Z","device_time":"2025-02-06T06:53:07.3464450Z"} +2025/02/06 01:53:08.374 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:05.8530000Z","device_time":"2025-02-06T06:53:08.3734030Z"} +2025/02/06 01:53:09.450 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:06.9180000Z","device_time":"2025-02-06T06:53:09.4386810Z"} +2025/02/06 01:53:10.443 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:07.9220000Z","device_time":"2025-02-06T06:53:10.4424380Z"} +2025/02/06 01:53:11.431 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:08.8980000Z","device_time":"2025-02-06T06:53:11.4184540Z"} +2025/02/06 01:53:12.478 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:09.9570000Z","device_time":"2025-02-06T06:53:12.4775540Z"} +2025/02/06 01:53:13.516 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:10.9920000Z","device_time":"2025-02-06T06:53:13.5121350Z"} +2025/02/06 01:53:14.574 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:12.0540000Z","device_time":"2025-02-06T06:53:14.5742200Z"} +2025/02/06 01:53:15.614 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:13.0940000Z","device_time":"2025-02-06T06:53:15.6140270Z"} +2025/02/06 01:53:16.626 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:14.1050000Z","device_time":"2025-02-06T06:53:16.6256850Z"} +2025/02/06 01:53:17.645 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:15.1240000Z","device_time":"2025-02-06T06:53:17.6448830Z"} +2025/02/06 01:53:18.712 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:16.1900000Z","device_time":"2025-02-06T06:53:18.7104520Z"} +2025/02/06 01:53:19.739 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:17.2180000Z","device_time":"2025-02-06T06:53:19.7387350Z"} +2025/02/06 01:53:20.754 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:18.2340000Z","device_time":"2025-02-06T06:53:20.7539750Z"} +2025/02/06 01:53:21.792 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:19.2710000Z","device_time":"2025-02-06T06:53:21.7917580Z"} +2025/02/06 01:53:22.839 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:20.3180000Z","device_time":"2025-02-06T06:53:22.8383940Z"} +2025/02/06 01:53:23.843 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:21.3220000Z","device_time":"2025-02-06T06:53:23.8422310Z"} +2025/02/06 01:53:24.844 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:22.3230000Z","device_time":"2025-02-06T06:53:24.8438860Z"} +2025/02/06 01:53:25.875 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:23.3530000Z","device_time":"2025-02-06T06:53:25.8734560Z"} +2025/02/06 01:53:26.869 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:24.3480000Z","device_time":"2025-02-06T06:53:26.8684950Z"} +2025/02/06 01:53:27.870 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:25.3500000Z","device_time":"2025-02-06T06:53:27.8701500Z"} +2025/02/06 01:53:28.946 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:26.4250000Z","device_time":"2025-02-06T06:53:28.9457530Z"} +2025/02/06 01:53:30.010 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:27.4890000Z","device_time":"2025-02-06T06:53:30.0096340Z"} +2025/02/06 01:53:30.988 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:28.4680000Z","device_time":"2025-02-06T06:53:30.9879780Z"} +2025/02/06 01:53:32.011 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:29.4900000Z","device_time":"2025-02-06T06:53:32.0106650Z"} +2025/02/06 01:53:33.053 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:30.5270000Z","device_time":"2025-02-06T06:53:33.0476960Z"} +2025/02/06 01:53:34.051 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:31.5300000Z","device_time":"2025-02-06T06:53:34.0506520Z"} +2025/02/06 01:53:35.091 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:32.5700000Z","device_time":"2025-02-06T06:53:35.0900800Z"} +2025/02/06 01:53:36.119 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:33.5980000Z","device_time":"2025-02-06T06:53:36.1183260Z"} +2025/02/06 01:53:37.160 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:34.6390000Z","device_time":"2025-02-06T06:53:37.1590480Z"} +2025/02/06 01:53:38.175 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:35.6540000Z","device_time":"2025-02-06T06:53:38.1740250Z"} +2025/02/06 01:53:39.229 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:36.7080000Z","device_time":"2025-02-06T06:53:39.2285310Z"} +2025/02/06 01:53:40.249 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:37.7280000Z","device_time":"2025-02-06T06:53:40.2484110Z"} +2025/02/06 01:53:41.268 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:38.7470000Z","device_time":"2025-02-06T06:53:41.2671340Z"} +2025/02/06 01:53:42.302 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:39.7810000Z","device_time":"2025-02-06T06:53:42.3013460Z"} +2025/02/06 01:53:43.383 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:40.8630000Z","device_time":"2025-02-06T06:53:43.3829500Z"} +2025/02/06 01:53:44.362 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:41.8410000Z","device_time":"2025-02-06T06:53:44.3615380Z"} +2025/02/06 01:53:45.410 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:42.8890000Z","device_time":"2025-02-06T06:53:45.4093150Z"} +2025/02/06 01:53:46.429 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:43.9080000Z","device_time":"2025-02-06T06:53:46.4285870Z"} +2025/02/06 01:53:47.469 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:44.9480000Z","device_time":"2025-02-06T06:53:47.4685550Z"} +2025/02/06 01:53:48.500 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:45.9790000Z","device_time":"2025-02-06T06:53:48.4999050Z"} +2025/02/06 01:53:49.536 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:47.0150000Z","device_time":"2025-02-06T06:53:49.5358200Z"} +2025/02/06 01:53:50.521 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:48.0000000Z","device_time":"2025-02-06T06:53:50.5207200Z"} +2025/02/06 01:53:51.541 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:49.0200000Z","device_time":"2025-02-06T06:53:51.5400770Z"} +2025/02/06 01:53:52.580 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:50.0590000Z","device_time":"2025-02-06T06:53:52.5791860Z"} +2025/02/06 01:53:53.590 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:51.0700000Z","device_time":"2025-02-06T06:53:53.5900320Z"} +2025/02/06 01:53:54.641 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:52.1190000Z","device_time":"2025-02-06T06:53:54.6392890Z"} +2025/02/06 01:53:55.690 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:53.1690000Z","device_time":"2025-02-06T06:53:55.6893700Z"} +2025/02/06 01:53:56.722 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:54.2000000Z","device_time":"2025-02-06T06:53:56.7205820Z"} +2025/02/06 01:53:57.768 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:55.2470000Z","device_time":"2025-02-06T06:53:57.7673910Z"} +2025/02/06 01:53:58.788 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:56.2670000Z","device_time":"2025-02-06T06:53:58.7872990Z"} +2025/02/06 01:53:59.792 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:57.2710000Z","device_time":"2025-02-06T06:53:59.7914110Z"} +2025/02/06 01:54:00.832 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:58.3110000Z","device_time":"2025-02-06T06:54:00.8318950Z"} +2025/02/06 01:54:01.956 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:53:59.4310000Z","device_time":"2025-02-06T06:54:01.9518780Z"} +2025/02/06 01:54:02.948 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:00.4270000Z","device_time":"2025-02-06T06:54:02.9477330Z"} +2025/02/06 01:54:03.963 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:01.4430000Z","device_time":"2025-02-06T06:54:03.9630490Z"} +2025/02/06 01:54:05.046 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:02.5200000Z","device_time":"2025-02-06T06:54:05.0402210Z"} +2025/02/06 01:54:06.032 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:03.5080000Z","device_time":"2025-02-06T06:54:06.0282670Z"} +2025/02/06 01:54:07.052 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:04.5310000Z","device_time":"2025-02-06T06:54:07.0510660Z"} +2025/02/06 01:54:08.185 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:05.6640000Z","device_time":"2025-02-06T06:54:08.1848640Z"} +2025/02/06 01:54:09.223 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:06.7020000Z","device_time":"2025-02-06T06:54:09.2227400Z"} +2025/02/06 01:54:10.254 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:07.7330000Z","device_time":"2025-02-06T06:54:10.2537880Z"} +2025/02/06 01:54:11.264 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:08.7430000Z","device_time":"2025-02-06T06:54:11.2634700Z"} +2025/02/06 01:54:12.296 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:09.7760000Z","device_time":"2025-02-06T06:54:12.2960900Z"} +2025/02/06 01:54:13.316 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:10.7950000Z","device_time":"2025-02-06T06:54:13.3154700Z"} +2025/02/06 01:54:14.368 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:11.8440000Z","device_time":"2025-02-06T06:54:14.3642320Z"} +2025/02/06 01:54:15.380 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:12.8590000Z","device_time":"2025-02-06T06:54:15.3798700Z"} +2025/02/06 01:54:16.417 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:13.8970000Z","device_time":"2025-02-06T06:54:16.4171650Z"} +2025/02/06 01:54:17.420 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:14.8990000Z","device_time":"2025-02-06T06:54:17.4199310Z"} +2025/02/06 01:54:18.457 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:15.9370000Z","device_time":"2025-02-06T06:54:18.4570740Z"} +2025/02/06 01:54:19.491 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:16.9700000Z","device_time":"2025-02-06T06:54:19.4901730Z"} +2025/02/06 01:54:20.499 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:17.9780000Z","device_time":"2025-02-06T06:54:20.4988450Z"} +2025/02/06 01:54:21.519 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:18.9980000Z","device_time":"2025-02-06T06:54:21.5183560Z"} +2025/02/06 01:54:22.555 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:20.0340000Z","device_time":"2025-02-06T06:54:22.5547290Z"} +2025/02/06 01:54:23.622 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:21.1010000Z","device_time":"2025-02-06T06:54:23.6217930Z"} +2025/02/06 01:54:24.630 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:22.1090000Z","device_time":"2025-02-06T06:54:24.6297870Z"} +2025/02/06 01:54:25.663 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:23.1420000Z","device_time":"2025-02-06T06:54:25.6627420Z"} +2025/02/06 01:54:26.735 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:24.2140000Z","device_time":"2025-02-06T06:54:26.7343420Z"} +2025/02/06 01:54:27.768 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:25.2470000Z","device_time":"2025-02-06T06:54:27.7671610Z"} +2025/02/06 01:54:28.872 4137 4152 Info Unity {"ntp_time":"2025-02-06T06:54:26.3470000Z","device_time":"2025-02-06T06:54:28.8678000Z"} diff --git a/python/evaluations/data/single_device/ntp_clock/tab_s6/run1-logcat.txt b/python/evaluations/data/single_device/ntp_clock/tab_s6/run1-logcat.txt new file mode 100644 index 0000000..dc89689 --- /dev/null +++ b/python/evaluations/data/single_device/ntp_clock/tab_s6/run1-logcat.txt @@ -0,0 +1,301 @@ +2025/02/06 01:16:05.289 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:03.3610000Z","device_time":"2025-02-06T06:16:05.2816880Z"} +2025/02/06 01:16:06.302 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:04.3810000Z","device_time":"2025-02-06T06:16:06.3018450Z"} +2025/02/06 01:16:07.353 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:05.4320000Z","device_time":"2025-02-06T06:16:07.3526140Z"} +2025/02/06 01:16:08.373 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:06.4520000Z","device_time":"2025-02-06T06:16:08.3731790Z"} +2025/02/06 01:16:09.387 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:07.4660000Z","device_time":"2025-02-06T06:16:09.3870650Z"} +2025/02/06 01:16:10.423 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:08.5020000Z","device_time":"2025-02-06T06:16:10.4231960Z"} +2025/02/06 01:16:11.434 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:09.5130000Z","device_time":"2025-02-06T06:16:11.4340160Z"} +2025/02/06 01:16:12.442 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:10.5210000Z","device_time":"2025-02-06T06:16:12.4417860Z"} +2025/02/06 01:16:13.451 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:11.5300000Z","device_time":"2025-02-06T06:16:13.4507710Z"} +2025/02/06 01:16:14.462 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:12.5410000Z","device_time":"2025-02-06T06:16:14.4619580Z"} +2025/02/06 01:16:15.471 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:13.5510000Z","device_time":"2025-02-06T06:16:15.4715430Z"} +2025/02/06 01:16:16.493 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:14.5720000Z","device_time":"2025-02-06T06:16:16.4929080Z"} +2025/02/06 01:16:17.519 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:15.5980000Z","device_time":"2025-02-06T06:16:17.5186680Z"} +2025/02/06 01:16:18.541 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:16.6200000Z","device_time":"2025-02-06T06:16:18.5407620Z"} +2025/02/06 01:16:19.567 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:17.6460000Z","device_time":"2025-02-06T06:16:19.5670840Z"} +2025/02/06 01:16:20.627 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:18.7070000Z","device_time":"2025-02-06T06:16:20.6273970Z"} +2025/02/06 01:16:21.619 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:19.6980000Z","device_time":"2025-02-06T06:16:21.6192210Z"} +2025/02/06 01:16:22.630 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:20.7100000Z","device_time":"2025-02-06T06:16:22.6304840Z"} +2025/02/06 01:16:23.634 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:21.7130000Z","device_time":"2025-02-06T06:16:23.6338290Z"} +2025/02/06 01:16:24.669 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:22.7480000Z","device_time":"2025-02-06T06:16:24.6693500Z"} +2025/02/06 01:16:25.692 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:23.7710000Z","device_time":"2025-02-06T06:16:25.6917750Z"} +2025/02/06 01:16:26.681 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:24.7600000Z","device_time":"2025-02-06T06:16:26.6813540Z"} +2025/02/06 01:16:27.704 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:25.7830000Z","device_time":"2025-02-06T06:16:27.7037780Z"} +2025/02/06 01:16:28.722 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:26.8010000Z","device_time":"2025-02-06T06:16:28.7217510Z"} +2025/02/06 01:16:29.770 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:27.8490000Z","device_time":"2025-02-06T06:16:29.7703400Z"} +2025/02/06 01:16:30.796 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:28.8750000Z","device_time":"2025-02-06T06:16:30.7957220Z"} +2025/02/06 01:16:31.819 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:29.8980000Z","device_time":"2025-02-06T06:16:31.8184250Z"} +2025/02/06 01:16:32.832 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:30.9110000Z","device_time":"2025-02-06T06:16:32.8319490Z"} +2025/02/06 01:16:33.853 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:31.9320000Z","device_time":"2025-02-06T06:16:33.8526050Z"} +2025/02/06 01:16:34.860 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:32.9390000Z","device_time":"2025-02-06T06:16:34.8596370Z"} +2025/02/06 01:16:35.960 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:34.0390000Z","device_time":"2025-02-06T06:16:35.9602970Z"} +2025/02/06 01:16:36.911 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:34.9900000Z","device_time":"2025-02-06T06:16:36.9110010Z"} +2025/02/06 01:16:37.953 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:36.0330000Z","device_time":"2025-02-06T06:16:37.9534000Z"} +2025/02/06 01:16:38.944 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:37.0230000Z","device_time":"2025-02-06T06:16:38.9438390Z"} +2025/02/06 01:16:39.973 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:38.0520000Z","device_time":"2025-02-06T06:16:39.9726580Z"} +2025/02/06 01:16:40.977 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:39.0560000Z","device_time":"2025-02-06T06:16:40.9765900Z"} +2025/02/06 01:16:42.010 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:40.0890000Z","device_time":"2025-02-06T06:16:42.0098460Z"} +2025/02/06 01:16:43.001 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:41.0800000Z","device_time":"2025-02-06T06:16:43.0013080Z"} +2025/02/06 01:16:44.035 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:42.1150000Z","device_time":"2025-02-06T06:16:44.0354240Z"} +2025/02/06 01:16:45.053 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:43.1320000Z","device_time":"2025-02-06T06:16:45.0526890Z"} +2025/02/06 01:16:46.095 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:44.1750000Z","device_time":"2025-02-06T06:16:46.0953770Z"} +2025/02/06 01:16:47.099 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:45.1780000Z","device_time":"2025-02-06T06:16:47.0986770Z"} +2025/02/06 01:16:48.142 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:46.2210000Z","device_time":"2025-02-06T06:16:48.1421410Z"} +2025/02/06 01:16:49.186 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:47.2650000Z","device_time":"2025-02-06T06:16:49.1863640Z"} +2025/02/06 01:16:50.234 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:48.3130000Z","device_time":"2025-02-06T06:16:50.2339960Z"} +2025/02/06 01:16:51.248 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:49.3270000Z","device_time":"2025-02-06T06:16:51.2481290Z"} +2025/02/06 01:16:52.285 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:50.3650000Z","device_time":"2025-02-06T06:16:52.2853960Z"} +2025/02/06 01:16:53.319 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:51.3980000Z","device_time":"2025-02-06T06:16:53.3192130Z"} +2025/02/06 01:16:54.356 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:52.4360000Z","device_time":"2025-02-06T06:16:54.3564430Z"} +2025/02/06 01:16:55.406 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:53.4870000Z","device_time":"2025-02-06T06:16:55.4057610Z"} +2025/02/06 01:16:56.405 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:54.4870000Z","device_time":"2025-02-06T06:16:56.4053940Z"} +2025/02/06 01:16:57.434 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:55.5150000Z","device_time":"2025-02-06T06:16:57.4335810Z"} +2025/02/06 01:16:58.461 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:56.5410000Z","device_time":"2025-02-06T06:16:58.4603470Z"} +2025/02/06 01:16:59.500 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:57.5810000Z","device_time":"2025-02-06T06:16:59.4996120Z"} +2025/02/06 01:17:00.507 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:58.5890000Z","device_time":"2025-02-06T06:17:00.5075040Z"} +2025/02/06 01:17:01.516 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:16:59.5970000Z","device_time":"2025-02-06T06:17:01.5162740Z"} +2025/02/06 01:17:02.562 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:00.6440000Z","device_time":"2025-02-06T06:17:02.5624010Z"} +2025/02/06 01:17:03.578 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:01.6590000Z","device_time":"2025-02-06T06:17:03.5777180Z"} +2025/02/06 01:17:04.573 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:02.6540000Z","device_time":"2025-02-06T06:17:04.5732770Z"} +2025/02/06 01:17:05.623 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:03.7040000Z","device_time":"2025-02-06T06:17:05.6232700Z"} +2025/02/06 01:17:06.631 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:04.7120000Z","device_time":"2025-02-06T06:17:06.6305200Z"} +2025/02/06 01:17:07.665 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:05.7460000Z","device_time":"2025-02-06T06:17:07.6647270Z"} +2025/02/06 01:17:08.705 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:06.7860000Z","device_time":"2025-02-06T06:17:08.7047150Z"} +2025/02/06 01:17:09.721 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:07.8020000Z","device_time":"2025-02-06T06:17:09.7212350Z"} +2025/02/06 01:17:10.794 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:08.8750000Z","device_time":"2025-02-06T06:17:10.7939730Z"} +2025/02/06 01:17:11.801 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:09.8760000Z","device_time":"2025-02-06T06:17:11.7948850Z"} +2025/02/06 01:17:12.803 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:10.8840000Z","device_time":"2025-02-06T06:17:12.8027380Z"} +2025/02/06 01:17:13.799 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:11.8800000Z","device_time":"2025-02-06T06:17:13.7984540Z"} +2025/02/06 01:17:14.816 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:12.8970000Z","device_time":"2025-02-06T06:17:14.8159680Z"} +2025/02/06 01:17:15.863 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:13.9440000Z","device_time":"2025-02-06T06:17:15.8627340Z"} +2025/02/06 01:17:16.852 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:14.9330000Z","device_time":"2025-02-06T06:17:16.8519600Z"} +2025/02/06 01:17:17.898 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:15.9790000Z","device_time":"2025-02-06T06:17:17.8982860Z"} +2025/02/06 01:17:18.988 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:17.0690000Z","device_time":"2025-02-06T06:17:18.9879990Z"} +2025/02/06 01:17:20.005 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:18.0860000Z","device_time":"2025-02-06T06:17:20.0046780Z"} +2025/02/06 01:17:21.023 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:19.1050000Z","device_time":"2025-02-06T06:17:21.0234130Z"} +2025/02/06 01:17:22.024 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:20.1060000Z","device_time":"2025-02-06T06:17:22.0244820Z"} +2025/02/06 01:17:23.038 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:21.1190000Z","device_time":"2025-02-06T06:17:23.0383180Z"} +2025/02/06 01:17:24.053 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:22.1340000Z","device_time":"2025-02-06T06:17:24.0529070Z"} +2025/02/06 01:17:25.102 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:23.1830000Z","device_time":"2025-02-06T06:17:25.1018160Z"} +2025/02/06 01:17:26.098 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:24.1790000Z","device_time":"2025-02-06T06:17:26.0977840Z"} +2025/02/06 01:17:27.134 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:25.2160000Z","device_time":"2025-02-06T06:17:27.1344760Z"} +2025/02/06 01:17:28.169 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:26.2500000Z","device_time":"2025-02-06T06:17:28.1686740Z"} +2025/02/06 01:17:29.165 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:27.2460000Z","device_time":"2025-02-06T06:17:29.1647670Z"} +2025/02/06 01:17:30.234 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:28.3150000Z","device_time":"2025-02-06T06:17:30.2340750Z"} +2025/02/06 01:17:31.237 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:29.3180000Z","device_time":"2025-02-06T06:17:31.2372980Z"} +2025/02/06 01:17:32.273 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:30.3540000Z","device_time":"2025-02-06T06:17:32.2728570Z"} +2025/02/06 01:17:33.313 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:31.3940000Z","device_time":"2025-02-06T06:17:33.3127160Z"} +2025/02/06 01:17:34.350 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:32.4310000Z","device_time":"2025-02-06T06:17:34.3496190Z"} +2025/02/06 01:17:35.361 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:33.4420000Z","device_time":"2025-02-06T06:17:35.3610520Z"} +2025/02/06 01:17:36.434 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:34.5150000Z","device_time":"2025-02-06T06:17:36.4338020Z"} +2025/02/06 01:17:37.471 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:35.5500000Z","device_time":"2025-02-06T06:17:37.4693100Z"} +2025/02/06 01:17:38.482 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:36.5630000Z","device_time":"2025-02-06T06:17:38.4819320Z"} +2025/02/06 01:17:39.491 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:37.5720000Z","device_time":"2025-02-06T06:17:39.4912540Z"} +2025/02/06 01:17:40.489 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:38.5700000Z","device_time":"2025-02-06T06:17:40.4891640Z"} +2025/02/06 01:17:41.518 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:39.5990000Z","device_time":"2025-02-06T06:17:41.5177600Z"} +2025/02/06 01:17:42.523 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:40.6040000Z","device_time":"2025-02-06T06:17:42.5224650Z"} +2025/02/06 01:17:43.542 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:41.6230000Z","device_time":"2025-02-06T06:17:43.5418750Z"} +2025/02/06 01:17:44.573 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:42.6540000Z","device_time":"2025-02-06T06:17:44.5731910Z"} +2025/02/06 01:17:45.591 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:43.6720000Z","device_time":"2025-02-06T06:17:45.5906910Z"} +2025/02/06 01:17:46.620 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:44.7010000Z","device_time":"2025-02-06T06:17:46.6202880Z"} +2025/02/06 01:17:47.643 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:45.7240000Z","device_time":"2025-02-06T06:17:47.6430220Z"} +2025/02/06 01:17:48.674 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:46.7550000Z","device_time":"2025-02-06T06:17:48.6734670Z"} +2025/02/06 01:17:49.682 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:47.7630000Z","device_time":"2025-02-06T06:17:49.6817580Z"} +2025/02/06 01:17:50.705 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:48.7860000Z","device_time":"2025-02-06T06:17:50.7053520Z"} +2025/02/06 01:17:51.744 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:49.8250000Z","device_time":"2025-02-06T06:17:51.7435180Z"} +2025/02/06 01:17:52.778 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:50.8600000Z","device_time":"2025-02-06T06:17:52.7785060Z"} +2025/02/06 01:17:53.789 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:51.8670000Z","device_time":"2025-02-06T06:17:53.7857310Z"} +2025/02/06 01:17:54.828 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:52.9090000Z","device_time":"2025-02-06T06:17:54.8277640Z"} +2025/02/06 01:17:55.857 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:53.9390000Z","device_time":"2025-02-06T06:17:55.8573730Z"} +2025/02/06 01:17:56.890 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:54.9710000Z","device_time":"2025-02-06T06:17:56.8897600Z"} +2025/02/06 01:17:57.913 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:55.9940000Z","device_time":"2025-02-06T06:17:57.9132170Z"} +2025/02/06 01:17:58.934 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:57.0150000Z","device_time":"2025-02-06T06:17:58.9339000Z"} +2025/02/06 01:17:59.969 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:58.0480000Z","device_time":"2025-02-06T06:17:59.9667670Z"} +2025/02/06 01:18:00.981 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:17:59.0620000Z","device_time":"2025-02-06T06:18:00.9806960Z"} +2025/02/06 01:18:02.064 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:00.1450000Z","device_time":"2025-02-06T06:18:02.0640790Z"} +2025/02/06 01:18:03.094 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:01.1750000Z","device_time":"2025-02-06T06:18:03.0938240Z"} +2025/02/06 01:18:04.119 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:02.2000000Z","device_time":"2025-02-06T06:18:04.1192600Z"} +2025/02/06 01:18:05.144 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:03.2250000Z","device_time":"2025-02-06T06:18:05.1439060Z"} +2025/02/06 01:18:06.148 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:04.2290000Z","device_time":"2025-02-06T06:18:06.1480780Z"} +2025/02/06 01:18:07.143 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:05.2240000Z","device_time":"2025-02-06T06:18:07.1425570Z"} +2025/02/06 01:18:08.171 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:06.2530000Z","device_time":"2025-02-06T06:18:08.1713860Z"} +2025/02/06 01:18:09.211 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:07.2890000Z","device_time":"2025-02-06T06:18:09.2078030Z"} +2025/02/06 01:18:10.231 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:08.3120000Z","device_time":"2025-02-06T06:18:10.2306100Z"} +2025/02/06 01:18:11.267 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:09.3490000Z","device_time":"2025-02-06T06:18:11.2674180Z"} +2025/02/06 01:18:12.270 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:10.3520000Z","device_time":"2025-02-06T06:18:12.2703650Z"} +2025/02/06 01:18:13.280 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:11.3610000Z","device_time":"2025-02-06T06:18:13.2798740Z"} +2025/02/06 01:18:14.301 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:12.3820000Z","device_time":"2025-02-06T06:18:14.3011110Z"} +2025/02/06 01:18:15.358 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:13.4390000Z","device_time":"2025-02-06T06:18:15.3583460Z"} +2025/02/06 01:18:16.381 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:14.4600000Z","device_time":"2025-02-06T06:18:16.3787140Z"} +2025/02/06 01:18:17.418 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:15.4990000Z","device_time":"2025-02-06T06:18:17.4182840Z"} +2025/02/06 01:18:18.423 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:16.5040000Z","device_time":"2025-02-06T06:18:18.4230720Z"} +2025/02/06 01:18:19.434 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:17.5150000Z","device_time":"2025-02-06T06:18:19.4336560Z"} +2025/02/06 01:18:20.456 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:18.5370000Z","device_time":"2025-02-06T06:18:20.4555710Z"} +2025/02/06 01:18:21.476 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:19.5570000Z","device_time":"2025-02-06T06:18:21.4756570Z"} +2025/02/06 01:18:22.489 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:20.5700000Z","device_time":"2025-02-06T06:18:22.4893340Z"} +2025/02/06 01:18:23.531 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:21.6120000Z","device_time":"2025-02-06T06:18:23.5306300Z"} +2025/02/06 01:18:24.543 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:22.6240000Z","device_time":"2025-02-06T06:18:24.5429280Z"} +2025/02/06 01:18:25.547 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:23.6280000Z","device_time":"2025-02-06T06:18:25.5465320Z"} +2025/02/06 01:18:26.594 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:24.6750000Z","device_time":"2025-02-06T06:18:26.5943230Z"} +2025/02/06 01:18:27.658 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:25.7390000Z","device_time":"2025-02-06T06:18:27.6580700Z"} +2025/02/06 01:18:28.644 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:26.7250000Z","device_time":"2025-02-06T06:18:28.6441440Z"} +2025/02/06 01:18:29.659 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:27.7400000Z","device_time":"2025-02-06T06:18:29.6590850Z"} +2025/02/06 01:18:30.699 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:28.7800000Z","device_time":"2025-02-06T06:18:30.6984980Z"} +2025/02/06 01:18:31.737 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:29.8180000Z","device_time":"2025-02-06T06:18:31.7367060Z"} +2025/02/06 01:18:32.773 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:30.8540000Z","device_time":"2025-02-06T06:18:32.7725830Z"} +2025/02/06 01:18:33.801 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:31.8810000Z","device_time":"2025-02-06T06:18:33.7998190Z"} +2025/02/06 01:18:34.820 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:32.9010000Z","device_time":"2025-02-06T06:18:34.8200450Z"} +2025/02/06 01:18:35.832 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:33.9130000Z","device_time":"2025-02-06T06:18:35.8320260Z"} +2025/02/06 01:18:36.840 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:34.9210000Z","device_time":"2025-02-06T06:18:36.8398600Z"} +2025/02/06 01:18:37.859 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:35.9400000Z","device_time":"2025-02-06T06:18:37.8593070Z"} +2025/02/06 01:18:38.889 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:36.9700000Z","device_time":"2025-02-06T06:18:38.8891730Z"} +2025/02/06 01:18:39.932 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:38.0140000Z","device_time":"2025-02-06T06:18:39.9323830Z"} +2025/02/06 01:18:40.941 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:39.0220000Z","device_time":"2025-02-06T06:18:40.9404340Z"} +2025/02/06 01:18:41.980 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:40.0610000Z","device_time":"2025-02-06T06:18:41.9799340Z"} +2025/02/06 01:18:42.999 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:41.0800000Z","device_time":"2025-02-06T06:18:42.9989740Z"} +2025/02/06 01:18:44.037 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:42.1180000Z","device_time":"2025-02-06T06:18:44.0364750Z"} +2025/02/06 01:18:45.048 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:43.1290000Z","device_time":"2025-02-06T06:18:45.0483030Z"} +2025/02/06 01:18:46.117 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:44.1980000Z","device_time":"2025-02-06T06:18:46.1164260Z"} +2025/02/06 01:18:47.096 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:45.1780000Z","device_time":"2025-02-06T06:18:47.0964640Z"} +2025/02/06 01:18:48.106 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:46.1870000Z","device_time":"2025-02-06T06:18:48.1059690Z"} +2025/02/06 01:18:49.143 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:47.2240000Z","device_time":"2025-02-06T06:18:49.1429640Z"} +2025/02/06 01:18:50.218 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:48.2990000Z","device_time":"2025-02-06T06:18:50.2174660Z"} +2025/02/06 01:18:51.234 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:49.3160000Z","device_time":"2025-02-06T06:18:51.2343580Z"} +2025/02/06 01:18:52.212 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:50.2930000Z","device_time":"2025-02-06T06:18:52.2118030Z"} +2025/02/06 01:18:53.272 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:51.3510000Z","device_time":"2025-02-06T06:18:53.2701160Z"} +2025/02/06 01:18:54.329 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:52.4110000Z","device_time":"2025-02-06T06:18:54.3294450Z"} +2025/02/06 01:18:55.323 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:53.4040000Z","device_time":"2025-02-06T06:18:55.3229880Z"} +2025/02/06 01:18:56.370 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:54.4510000Z","device_time":"2025-02-06T06:18:56.3701060Z"} +2025/02/06 01:18:57.402 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:55.4830000Z","device_time":"2025-02-06T06:18:57.4020840Z"} +2025/02/06 01:18:58.425 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:56.5060000Z","device_time":"2025-02-06T06:18:58.4248360Z"} +2025/02/06 01:18:59.406 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:57.4870000Z","device_time":"2025-02-06T06:18:59.4057910Z"} +2025/02/06 01:19:00.445 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:58.5260000Z","device_time":"2025-02-06T06:19:00.4444490Z"} +2025/02/06 01:19:01.447 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:18:59.5280000Z","device_time":"2025-02-06T06:19:01.4473500Z"} +2025/02/06 01:19:02.487 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:00.5680000Z","device_time":"2025-02-06T06:19:02.4869230Z"} +2025/02/06 01:19:03.488 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:01.5690000Z","device_time":"2025-02-06T06:19:03.4876680Z"} +2025/02/06 01:19:04.532 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:02.6130000Z","device_time":"2025-02-06T06:19:04.5316880Z"} +2025/02/06 01:19:05.547 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:03.6280000Z","device_time":"2025-02-06T06:19:05.5472060Z"} +2025/02/06 01:19:06.585 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:04.6660000Z","device_time":"2025-02-06T06:19:06.5847950Z"} +2025/02/06 01:19:07.624 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:05.7050000Z","device_time":"2025-02-06T06:19:07.6239070Z"} +2025/02/06 01:19:08.647 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:06.7280000Z","device_time":"2025-02-06T06:19:08.6472390Z"} +2025/02/06 01:19:09.688 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:07.7650000Z","device_time":"2025-02-06T06:19:09.6840480Z"} +2025/02/06 01:19:10.689 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:08.7710000Z","device_time":"2025-02-06T06:19:10.6894600Z"} +2025/02/06 01:19:11.693 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:09.7740000Z","device_time":"2025-02-06T06:19:11.6924890Z"} +2025/02/06 01:19:12.725 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:10.8060000Z","device_time":"2025-02-06T06:19:12.7252650Z"} +2025/02/06 01:19:13.778 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:11.8590000Z","device_time":"2025-02-06T06:19:13.7776400Z"} +2025/02/06 01:19:14.764 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:12.8450000Z","device_time":"2025-02-06T06:19:14.7635710Z"} +2025/02/06 01:19:15.787 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:13.8680000Z","device_time":"2025-02-06T06:19:15.7871710Z"} +2025/02/06 01:19:16.844 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:14.9260000Z","device_time":"2025-02-06T06:19:16.8443790Z"} +2025/02/06 01:19:17.879 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:15.9600000Z","device_time":"2025-02-06T06:19:17.8793300Z"} +2025/02/06 01:19:18.907 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:16.9880000Z","device_time":"2025-02-06T06:19:18.9064540Z"} +2025/02/06 01:19:19.928 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:18.0090000Z","device_time":"2025-02-06T06:19:19.9279030Z"} +2025/02/06 01:19:20.941 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:19.0220000Z","device_time":"2025-02-06T06:19:20.9410400Z"} +2025/02/06 01:19:21.961 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:20.0420000Z","device_time":"2025-02-06T06:19:21.9609300Z"} +2025/02/06 01:19:22.984 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:21.0650000Z","device_time":"2025-02-06T06:19:22.9834540Z"} +2025/02/06 01:19:23.993 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:22.0740000Z","device_time":"2025-02-06T06:19:23.9925920Z"} +2025/02/06 01:19:25.036 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:23.1170000Z","device_time":"2025-02-06T06:19:25.0361470Z"} +2025/02/06 01:19:26.053 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:24.1340000Z","device_time":"2025-02-06T06:19:26.0531160Z"} +2025/02/06 01:19:27.093 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:25.1740000Z","device_time":"2025-02-06T06:19:27.0931890Z"} +2025/02/06 01:19:28.112 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:26.1930000Z","device_time":"2025-02-06T06:19:28.1116260Z"} +2025/02/06 01:19:29.114 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:27.1950000Z","device_time":"2025-02-06T06:19:29.1137020Z"} +2025/02/06 01:19:30.149 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:28.2300000Z","device_time":"2025-02-06T06:19:30.1490540Z"} +2025/02/06 01:19:31.166 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:29.2470000Z","device_time":"2025-02-06T06:19:31.1663410Z"} +2025/02/06 01:19:32.164 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:30.2450000Z","device_time":"2025-02-06T06:19:32.1640400Z"} +2025/02/06 01:19:33.220 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:31.3010000Z","device_time":"2025-02-06T06:19:33.2201290Z"} +2025/02/06 01:19:34.220 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:32.3020000Z","device_time":"2025-02-06T06:19:34.2204170Z"} +2025/02/06 01:19:35.251 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:33.3320000Z","device_time":"2025-02-06T06:19:35.2507880Z"} +2025/02/06 01:19:36.263 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:34.3440000Z","device_time":"2025-02-06T06:19:36.2624080Z"} +2025/02/06 01:19:37.287 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:35.3680000Z","device_time":"2025-02-06T06:19:37.2865930Z"} +2025/02/06 01:19:38.326 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:36.4070000Z","device_time":"2025-02-06T06:19:38.3262750Z"} +2025/02/06 01:19:39.331 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:37.4120000Z","device_time":"2025-02-06T06:19:39.3310020Z"} +2025/02/06 01:19:40.344 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:38.4250000Z","device_time":"2025-02-06T06:19:40.3439870Z"} +2025/02/06 01:19:41.362 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:39.4430000Z","device_time":"2025-02-06T06:19:41.3621770Z"} +2025/02/06 01:19:42.387 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:40.4680000Z","device_time":"2025-02-06T06:19:42.3871680Z"} +2025/02/06 01:19:43.429 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:41.5100000Z","device_time":"2025-02-06T06:19:43.4292300Z"} +2025/02/06 01:19:44.455 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:42.5360000Z","device_time":"2025-02-06T06:19:44.4553020Z"} +2025/02/06 01:19:45.502 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:43.5830000Z","device_time":"2025-02-06T06:19:45.5023130Z"} +2025/02/06 01:19:46.516 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:44.5970000Z","device_time":"2025-02-06T06:19:46.5161600Z"} +2025/02/06 01:19:47.528 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:45.6090000Z","device_time":"2025-02-06T06:19:47.5276900Z"} +2025/02/06 01:19:48.565 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:46.6460000Z","device_time":"2025-02-06T06:19:48.5650630Z"} +2025/02/06 01:19:49.581 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:47.6620000Z","device_time":"2025-02-06T06:19:49.5812340Z"} +2025/02/06 01:19:50.629 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:48.7020000Z","device_time":"2025-02-06T06:19:50.6204120Z"} +2025/02/06 01:19:51.628 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:49.7090000Z","device_time":"2025-02-06T06:19:51.6279270Z"} +2025/02/06 01:19:52.665 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:50.7460000Z","device_time":"2025-02-06T06:19:52.6645010Z"} +2025/02/06 01:19:53.671 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:51.7520000Z","device_time":"2025-02-06T06:19:53.6709170Z"} +2025/02/06 01:19:54.681 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:52.7620000Z","device_time":"2025-02-06T06:19:54.6807680Z"} +2025/02/06 01:19:55.717 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:53.7980000Z","device_time":"2025-02-06T06:19:55.7171040Z"} +2025/02/06 01:19:56.735 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:54.8170000Z","device_time":"2025-02-06T06:19:56.7353780Z"} +2025/02/06 01:19:57.772 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:55.8530000Z","device_time":"2025-02-06T06:19:57.7721530Z"} +2025/02/06 01:19:58.783 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:56.8640000Z","device_time":"2025-02-06T06:19:58.7830540Z"} +2025/02/06 01:19:59.822 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:57.9030000Z","device_time":"2025-02-06T06:19:59.8219800Z"} +2025/02/06 01:20:00.824 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:58.9050000Z","device_time":"2025-02-06T06:20:00.8243310Z"} +2025/02/06 01:20:01.861 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:19:59.9420000Z","device_time":"2025-02-06T06:20:01.8604010Z"} +2025/02/06 01:20:02.909 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:00.9890000Z","device_time":"2025-02-06T06:20:02.9078450Z"} +2025/02/06 01:20:03.954 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:02.0350000Z","device_time":"2025-02-06T06:20:03.9541410Z"} +2025/02/06 01:20:04.927 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:03.0080000Z","device_time":"2025-02-06T06:20:04.9266930Z"} +2025/02/06 01:20:05.964 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:04.0430000Z","device_time":"2025-02-06T06:20:05.9623370Z"} +2025/02/06 01:20:06.990 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:05.0710000Z","device_time":"2025-02-06T06:20:06.9897400Z"} +2025/02/06 01:20:08.004 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:06.0850000Z","device_time":"2025-02-06T06:20:08.0036850Z"} +2025/02/06 01:20:09.024 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:07.1050000Z","device_time":"2025-02-06T06:20:09.0239750Z"} +2025/02/06 01:20:10.058 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:08.1390000Z","device_time":"2025-02-06T06:20:10.0576050Z"} +2025/02/06 01:20:11.117 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:09.1980000Z","device_time":"2025-02-06T06:20:11.1170880Z"} +2025/02/06 01:20:12.163 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:10.2380000Z","device_time":"2025-02-06T06:20:12.1570380Z"} +2025/02/06 01:20:13.167 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:11.2490000Z","device_time":"2025-02-06T06:20:13.1674750Z"} +2025/02/06 01:20:14.197 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:12.2780000Z","device_time":"2025-02-06T06:20:14.1967510Z"} +2025/02/06 01:20:15.224 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:13.3050000Z","device_time":"2025-02-06T06:20:15.2240420Z"} +2025/02/06 01:20:16.256 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:14.3370000Z","device_time":"2025-02-06T06:20:16.2559310Z"} +2025/02/06 01:20:17.267 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:15.3480000Z","device_time":"2025-02-06T06:20:17.2668940Z"} +2025/02/06 01:20:18.271 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:16.3520000Z","device_time":"2025-02-06T06:20:18.2712730Z"} +2025/02/06 01:20:19.283 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:17.3640000Z","device_time":"2025-02-06T06:20:19.2825460Z"} +2025/02/06 01:20:20.340 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:18.4210000Z","device_time":"2025-02-06T06:20:20.3400710Z"} +2025/02/06 01:20:21.327 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:19.4080000Z","device_time":"2025-02-06T06:20:21.3267680Z"} +2025/02/06 01:20:22.339 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:20.4200000Z","device_time":"2025-02-06T06:20:22.3392850Z"} +2025/02/06 01:20:23.381 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:21.4620000Z","device_time":"2025-02-06T06:20:23.3805660Z"} +2025/02/06 01:20:24.389 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:22.4700000Z","device_time":"2025-02-06T06:20:24.3888650Z"} +2025/02/06 01:20:25.400 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:23.4820000Z","device_time":"2025-02-06T06:20:25.4004660Z"} +2025/02/06 01:20:26.439 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:24.5200000Z","device_time":"2025-02-06T06:20:26.4387810Z"} +2025/02/06 01:20:27.450 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:25.5310000Z","device_time":"2025-02-06T06:20:27.4498490Z"} +2025/02/06 01:20:28.493 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:26.5740000Z","device_time":"2025-02-06T06:20:28.4926890Z"} +2025/02/06 01:20:29.529 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:27.6100000Z","device_time":"2025-02-06T06:20:29.5292580Z"} +2025/02/06 01:20:30.546 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:28.6270000Z","device_time":"2025-02-06T06:20:30.5460810Z"} +2025/02/06 01:20:31.583 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:29.6640000Z","device_time":"2025-02-06T06:20:31.5828970Z"} +2025/02/06 01:20:32.635 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:30.7160000Z","device_time":"2025-02-06T06:20:32.6351410Z"} +2025/02/06 01:20:33.614 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:31.6950000Z","device_time":"2025-02-06T06:20:33.6141110Z"} +2025/02/06 01:20:34.628 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:32.7060000Z","device_time":"2025-02-06T06:20:34.6244500Z"} +2025/02/06 01:20:35.636 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:33.7170000Z","device_time":"2025-02-06T06:20:35.6361800Z"} +2025/02/06 01:20:36.632 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:34.7130000Z","device_time":"2025-02-06T06:20:36.6322170Z"} +2025/02/06 01:20:37.651 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:35.7320000Z","device_time":"2025-02-06T06:20:37.6511340Z"} +2025/02/06 01:20:38.675 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:36.7560000Z","device_time":"2025-02-06T06:20:38.6753210Z"} +2025/02/06 01:20:39.689 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:37.7700000Z","device_time":"2025-02-06T06:20:39.6889200Z"} +2025/02/06 01:20:40.732 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:38.8130000Z","device_time":"2025-02-06T06:20:40.7320490Z"} +2025/02/06 01:20:41.781 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:39.8630000Z","device_time":"2025-02-06T06:20:41.7813700Z"} +2025/02/06 01:20:42.875 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:40.9560000Z","device_time":"2025-02-06T06:20:42.8752830Z"} +2025/02/06 01:20:43.866 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:41.9470000Z","device_time":"2025-02-06T06:20:43.8656370Z"} +2025/02/06 01:20:44.902 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:42.9830000Z","device_time":"2025-02-06T06:20:44.9020590Z"} +2025/02/06 01:20:45.935 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:44.0160000Z","device_time":"2025-02-06T06:20:45.9347200Z"} +2025/02/06 01:20:46.943 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:45.0240000Z","device_time":"2025-02-06T06:20:46.9431150Z"} +2025/02/06 01:20:47.954 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:46.0350000Z","device_time":"2025-02-06T06:20:47.9538190Z"} +2025/02/06 01:20:48.997 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:47.0780000Z","device_time":"2025-02-06T06:20:48.9968090Z"} +2025/02/06 01:20:50.020 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:48.1010000Z","device_time":"2025-02-06T06:20:50.0203430Z"} +2025/02/06 01:20:51.023 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:49.1050000Z","device_time":"2025-02-06T06:20:51.0233880Z"} +2025/02/06 01:20:52.056 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:50.1370000Z","device_time":"2025-02-06T06:20:52.0562730Z"} +2025/02/06 01:20:53.077 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:51.1580000Z","device_time":"2025-02-06T06:20:53.0772770Z"} +2025/02/06 01:20:54.087 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:52.1670000Z","device_time":"2025-02-06T06:20:54.0858000Z"} +2025/02/06 01:20:55.114 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:53.1950000Z","device_time":"2025-02-06T06:20:55.1137550Z"} +2025/02/06 01:20:56.128 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:54.2090000Z","device_time":"2025-02-06T06:20:56.1276380Z"} +2025/02/06 01:20:57.166 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:55.2470000Z","device_time":"2025-02-06T06:20:57.1655960Z"} +2025/02/06 01:20:58.201 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:56.2820000Z","device_time":"2025-02-06T06:20:58.2004060Z"} +2025/02/06 01:20:59.226 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:57.3070000Z","device_time":"2025-02-06T06:20:59.2258550Z"} +2025/02/06 01:21:00.259 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:58.3400000Z","device_time":"2025-02-06T06:21:00.2590210Z"} +2025/02/06 01:21:01.262 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:20:59.3430000Z","device_time":"2025-02-06T06:21:01.2615130Z"} +2025/02/06 01:21:02.271 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:00.3520000Z","device_time":"2025-02-06T06:21:02.2709940Z"} +2025/02/06 01:21:03.286 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:01.3670000Z","device_time":"2025-02-06T06:21:03.2862660Z"} +2025/02/06 01:21:04.296 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:02.3770000Z","device_time":"2025-02-06T06:21:04.2955440Z"} +2025/02/06 01:21:05.329 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:03.4100000Z","device_time":"2025-02-06T06:21:05.3287530Z"} +2025/02/06 01:21:06.358 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:04.4390000Z","device_time":"2025-02-06T06:21:06.3577210Z"} +2025/02/06 01:21:07.352 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:05.4330000Z","device_time":"2025-02-06T06:21:07.3521060Z"} +2025/02/06 01:21:08.367 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:06.4480000Z","device_time":"2025-02-06T06:21:08.3671190Z"} +2025/02/06 01:21:09.389 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:07.4700000Z","device_time":"2025-02-06T06:21:09.3886320Z"} +2025/02/06 01:21:10.408 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:08.4890000Z","device_time":"2025-02-06T06:21:10.4074740Z"} +2025/02/06 01:21:11.463 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:09.5440000Z","device_time":"2025-02-06T06:21:11.4633030Z"} +2025/02/06 01:21:12.685 11284 11332 Info Unity {"ntp_time":"2025-02-06T06:21:10.7660000Z","device_time":"2025-02-06T06:21:12.6846890Z"} diff --git a/python/evaluations/data/single_device/ntp_clock/tab_s6/run2-logcat.txt b/python/evaluations/data/single_device/ntp_clock/tab_s6/run2-logcat.txt new file mode 100644 index 0000000..6d62726 --- /dev/null +++ b/python/evaluations/data/single_device/ntp_clock/tab_s6/run2-logcat.txt @@ -0,0 +1,295 @@ +2025/02/06 01:21:58.704 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:21:56.7710000Z","device_time":"2025-02-06T06:21:58.7032630Z"} +2025/02/06 01:21:59.705 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:21:57.7730000Z","device_time":"2025-02-06T06:21:59.7052090Z"} +2025/02/06 01:22:00.714 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:21:58.7810000Z","device_time":"2025-02-06T06:22:00.7140410Z"} +2025/02/06 01:22:01.751 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:21:59.8190000Z","device_time":"2025-02-06T06:22:01.7512470Z"} +2025/02/06 01:22:02.768 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:00.8340000Z","device_time":"2025-02-06T06:22:02.7661780Z"} +2025/02/06 01:22:03.802 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:01.8690000Z","device_time":"2025-02-06T06:22:03.8017100Z"} +2025/02/06 01:22:04.813 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:02.8810000Z","device_time":"2025-02-06T06:22:04.8133850Z"} +2025/02/06 01:22:05.825 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:03.8920000Z","device_time":"2025-02-06T06:22:05.8246420Z"} +2025/02/06 01:22:06.841 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:04.9090000Z","device_time":"2025-02-06T06:22:06.8413740Z"} +2025/02/06 01:22:07.852 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:05.9190000Z","device_time":"2025-02-06T06:22:07.8513880Z"} +2025/02/06 01:22:08.882 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:06.9490000Z","device_time":"2025-02-06T06:22:08.8814640Z"} +2025/02/06 01:22:09.902 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:07.9690000Z","device_time":"2025-02-06T06:22:09.9018020Z"} +2025/02/06 01:22:10.915 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:08.9820000Z","device_time":"2025-02-06T06:22:10.9149320Z"} +2025/02/06 01:22:11.942 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:10.0100000Z","device_time":"2025-02-06T06:22:11.9420560Z"} +2025/02/06 01:22:12.951 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:11.0190000Z","device_time":"2025-02-06T06:22:12.9511710Z"} +2025/02/06 01:22:13.968 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:12.0360000Z","device_time":"2025-02-06T06:22:13.9681570Z"} +2025/02/06 01:22:14.981 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:13.0480000Z","device_time":"2025-02-06T06:22:14.9809920Z"} +2025/02/06 01:22:15.994 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:14.0620000Z","device_time":"2025-02-06T06:22:15.9933460Z"} +2025/02/06 01:22:17.016 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:15.0820000Z","device_time":"2025-02-06T06:22:17.0135520Z"} +2025/02/06 01:22:18.041 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:16.1100000Z","device_time":"2025-02-06T06:22:18.0412950Z"} +2025/02/06 01:22:19.037 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:17.1060000Z","device_time":"2025-02-06T06:22:19.0372860Z"} +2025/02/06 01:22:20.049 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:18.1180000Z","device_time":"2025-02-06T06:22:20.0490920Z"} +2025/02/06 01:22:21.099 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:19.1680000Z","device_time":"2025-02-06T06:22:21.0988140Z"} +2025/02/06 01:22:22.092 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:20.1600000Z","device_time":"2025-02-06T06:22:22.0915790Z"} +2025/02/06 01:22:23.168 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:21.2370000Z","device_time":"2025-02-06T06:22:23.1683040Z"} +2025/02/06 01:22:24.194 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:22.2630000Z","device_time":"2025-02-06T06:22:24.1938770Z"} +2025/02/06 01:22:25.228 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:23.2970000Z","device_time":"2025-02-06T06:22:25.2278210Z"} +2025/02/06 01:22:26.227 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:24.2960000Z","device_time":"2025-02-06T06:22:26.2275150Z"} +2025/02/06 01:22:27.253 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:25.3220000Z","device_time":"2025-02-06T06:22:27.2532740Z"} +2025/02/06 01:22:28.282 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:26.3510000Z","device_time":"2025-02-06T06:22:28.2816900Z"} +2025/02/06 01:22:29.350 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:27.4190000Z","device_time":"2025-02-06T06:22:29.3502030Z"} +2025/02/06 01:22:30.365 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:28.4340000Z","device_time":"2025-02-06T06:22:30.3650460Z"} +2025/02/06 01:22:31.374 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:29.4420000Z","device_time":"2025-02-06T06:22:31.3735950Z"} +2025/02/06 01:22:32.385 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:30.4540000Z","device_time":"2025-02-06T06:22:32.3847540Z"} +2025/02/06 01:22:33.419 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:31.4880000Z","device_time":"2025-02-06T06:22:33.4190320Z"} +2025/02/06 01:22:34.433 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:32.5020000Z","device_time":"2025-02-06T06:22:34.4331440Z"} +2025/02/06 01:22:35.471 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:33.5400000Z","device_time":"2025-02-06T06:22:35.4710870Z"} +2025/02/06 01:22:36.477 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:34.5460000Z","device_time":"2025-02-06T06:22:36.4774670Z"} +2025/02/06 01:22:37.516 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:35.5850000Z","device_time":"2025-02-06T06:22:37.5159130Z"} +2025/02/06 01:22:38.528 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:36.5970000Z","device_time":"2025-02-06T06:22:38.5284280Z"} +2025/02/06 01:22:39.534 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:37.6030000Z","device_time":"2025-02-06T06:22:39.5342920Z"} +2025/02/06 01:22:40.576 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:38.6450000Z","device_time":"2025-02-06T06:22:40.5759670Z"} +2025/02/06 01:22:41.594 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:39.6640000Z","device_time":"2025-02-06T06:22:41.5935010Z"} +2025/02/06 01:22:42.615 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:40.6860000Z","device_time":"2025-02-06T06:22:42.6151440Z"} +2025/02/06 01:22:43.637 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:41.7080000Z","device_time":"2025-02-06T06:22:43.6371700Z"} +2025/02/06 01:22:44.627 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:42.6970000Z","device_time":"2025-02-06T06:22:44.6263130Z"} +2025/02/06 01:22:45.654 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:43.7220000Z","device_time":"2025-02-06T06:22:45.6512440Z"} +2025/02/06 01:22:46.665 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:44.7350000Z","device_time":"2025-02-06T06:22:46.6646210Z"} +2025/02/06 01:22:47.695 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:45.7650000Z","device_time":"2025-02-06T06:22:47.6943990Z"} +2025/02/06 01:22:48.707 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:46.7780000Z","device_time":"2025-02-06T06:22:48.7072010Z"} +2025/02/06 01:22:49.779 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:47.8500000Z","device_time":"2025-02-06T06:22:49.7793660Z"} +2025/02/06 01:22:50.725 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:48.7960000Z","device_time":"2025-02-06T06:22:50.7254520Z"} +2025/02/06 01:22:51.768 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:49.8380000Z","device_time":"2025-02-06T06:22:51.7677210Z"} +2025/02/06 01:22:52.806 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:50.8760000Z","device_time":"2025-02-06T06:22:52.8058840Z"} +2025/02/06 01:22:53.800 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:51.8700000Z","device_time":"2025-02-06T06:22:53.7995770Z"} +2025/02/06 01:22:54.828 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:52.8990000Z","device_time":"2025-02-06T06:22:54.8284200Z"} +2025/02/06 01:22:55.853 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:53.9230000Z","device_time":"2025-02-06T06:22:55.8530500Z"} +2025/02/06 01:22:56.880 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:54.9510000Z","device_time":"2025-02-06T06:22:56.8803520Z"} +2025/02/06 01:22:57.922 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:55.9920000Z","device_time":"2025-02-06T06:22:57.9216070Z"} +2025/02/06 01:22:58.922 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:56.9920000Z","device_time":"2025-02-06T06:22:58.9218810Z"} +2025/02/06 01:22:59.968 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:58.0390000Z","device_time":"2025-02-06T06:22:59.9682360Z"} +2025/02/06 01:23:00.978 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:22:59.0490000Z","device_time":"2025-02-06T06:23:00.9782460Z"} +2025/02/06 01:23:01.986 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:00.0550000Z","device_time":"2025-02-06T06:23:01.9841570Z"} +2025/02/06 01:23:03.004 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:01.0740000Z","device_time":"2025-02-06T06:23:03.0039860Z"} +2025/02/06 01:23:04.042 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:02.1120000Z","device_time":"2025-02-06T06:23:04.0416330Z"} +2025/02/06 01:23:05.078 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:03.1480000Z","device_time":"2025-02-06T06:23:05.0775980Z"} +2025/02/06 01:23:06.086 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:04.1570000Z","device_time":"2025-02-06T06:23:06.0862770Z"} +2025/02/06 01:23:07.101 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:05.1710000Z","device_time":"2025-02-06T06:23:07.1006440Z"} +2025/02/06 01:23:08.135 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:06.2060000Z","device_time":"2025-02-06T06:23:08.1353040Z"} +2025/02/06 01:23:09.145 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:07.2160000Z","device_time":"2025-02-06T06:23:09.1451560Z"} +2025/02/06 01:23:10.167 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:08.2370000Z","device_time":"2025-02-06T06:23:10.1666810Z"} +2025/02/06 01:23:11.166 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:09.2360000Z","device_time":"2025-02-06T06:23:11.1655540Z"} +2025/02/06 01:23:12.212 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:10.2820000Z","device_time":"2025-02-06T06:23:12.2116540Z"} +2025/02/06 01:23:13.229 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:11.3000000Z","device_time":"2025-02-06T06:23:13.2293380Z"} +2025/02/06 01:23:14.254 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:12.3240000Z","device_time":"2025-02-06T06:23:14.2535090Z"} +2025/02/06 01:23:15.307 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:13.3770000Z","device_time":"2025-02-06T06:23:15.3070630Z"} +2025/02/06 01:23:16.303 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:14.3740000Z","device_time":"2025-02-06T06:23:16.3034350Z"} +2025/02/06 01:23:17.316 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:15.3850000Z","device_time":"2025-02-06T06:23:17.3140830Z"} +2025/02/06 01:23:18.334 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:16.4040000Z","device_time":"2025-02-06T06:23:18.3332080Z"} +2025/02/06 01:23:19.365 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:17.4350000Z","device_time":"2025-02-06T06:23:19.3648760Z"} +2025/02/06 01:23:20.380 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:18.4510000Z","device_time":"2025-02-06T06:23:20.3800960Z"} +2025/02/06 01:23:21.381 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:19.4510000Z","device_time":"2025-02-06T06:23:21.3810260Z"} +2025/02/06 01:23:22.468 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:20.5380000Z","device_time":"2025-02-06T06:23:22.4675930Z"} +2025/02/06 01:23:23.469 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:21.5390000Z","device_time":"2025-02-06T06:23:23.4688550Z"} +2025/02/06 01:23:24.475 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:22.5450000Z","device_time":"2025-02-06T06:23:24.4747090Z"} +2025/02/06 01:23:25.484 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:23.5560000Z","device_time":"2025-02-06T06:23:25.4842500Z"} +2025/02/06 01:23:26.462 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:24.5340000Z","device_time":"2025-02-06T06:23:26.4620660Z"} +2025/02/06 01:23:27.520 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:25.5920000Z","device_time":"2025-02-06T06:23:27.5202760Z"} +2025/02/06 01:23:28.517 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:26.5890000Z","device_time":"2025-02-06T06:23:28.5173840Z"} +2025/02/06 01:23:29.548 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:27.6190000Z","device_time":"2025-02-06T06:23:29.5477230Z"} +2025/02/06 01:23:30.576 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:28.6480000Z","device_time":"2025-02-06T06:23:30.5762320Z"} +2025/02/06 01:23:31.598 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:29.6690000Z","device_time":"2025-02-06T06:23:31.5979800Z"} +2025/02/06 01:23:32.616 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:30.6880000Z","device_time":"2025-02-06T06:23:32.6164270Z"} +2025/02/06 01:23:33.656 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:31.7270000Z","device_time":"2025-02-06T06:23:33.6558170Z"} +2025/02/06 01:23:34.637 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:32.7090000Z","device_time":"2025-02-06T06:23:34.6370370Z"} +2025/02/06 01:23:35.669 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:33.7400000Z","device_time":"2025-02-06T06:23:35.6690080Z"} +2025/02/06 01:23:36.706 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:34.7770000Z","device_time":"2025-02-06T06:23:36.7057180Z"} +2025/02/06 01:23:37.721 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:35.7920000Z","device_time":"2025-02-06T06:23:37.7206260Z"} +2025/02/06 01:23:38.737 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:36.8080000Z","device_time":"2025-02-06T06:23:38.7365470Z"} +2025/02/06 01:23:39.747 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:37.8180000Z","device_time":"2025-02-06T06:23:39.7468980Z"} +2025/02/06 01:23:40.784 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:38.8550000Z","device_time":"2025-02-06T06:23:40.7837630Z"} +2025/02/06 01:23:41.824 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:39.8920000Z","device_time":"2025-02-06T06:23:41.8210080Z"} +2025/02/06 01:23:42.940 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:41.0110000Z","device_time":"2025-02-06T06:23:42.9399890Z"} +2025/02/06 01:23:43.963 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:42.0340000Z","device_time":"2025-02-06T06:23:43.9627930Z"} +2025/02/06 01:23:45.062 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:43.1330000Z","device_time":"2025-02-06T06:23:45.0619730Z"} +2025/02/06 01:23:46.064 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:44.1350000Z","device_time":"2025-02-06T06:23:46.0636790Z"} +2025/02/06 01:23:47.157 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:45.2280000Z","device_time":"2025-02-06T06:23:47.1567710Z"} +2025/02/06 01:23:48.113 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:46.1840000Z","device_time":"2025-02-06T06:23:48.1125710Z"} +2025/02/06 01:23:49.144 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:47.2160000Z","device_time":"2025-02-06T06:23:49.1441130Z"} +2025/02/06 01:23:50.164 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:48.2360000Z","device_time":"2025-02-06T06:23:50.1641100Z"} +2025/02/06 01:23:51.206 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:49.2770000Z","device_time":"2025-02-06T06:23:51.2056170Z"} +2025/02/06 01:23:52.208 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:50.2790000Z","device_time":"2025-02-06T06:23:52.2079170Z"} +2025/02/06 01:23:53.253 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:51.3250000Z","device_time":"2025-02-06T06:23:53.2532240Z"} +2025/02/06 01:23:54.317 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:52.3880000Z","device_time":"2025-02-06T06:23:54.3166330Z"} +2025/02/06 01:23:55.344 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:53.4150000Z","device_time":"2025-02-06T06:23:55.3436230Z"} +2025/02/06 01:23:56.363 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:54.4350000Z","device_time":"2025-02-06T06:23:56.3635040Z"} +2025/02/06 01:23:57.402 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:55.4740000Z","device_time":"2025-02-06T06:23:57.4021850Z"} +2025/02/06 01:23:58.429 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:56.5000000Z","device_time":"2025-02-06T06:23:58.4285280Z"} +2025/02/06 01:23:59.438 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:57.5090000Z","device_time":"2025-02-06T06:23:59.4378110Z"} +2025/02/06 01:24:00.456 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:58.5280000Z","device_time":"2025-02-06T06:24:00.4560290Z"} +2025/02/06 01:24:01.485 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:23:59.5560000Z","device_time":"2025-02-06T06:24:01.4847080Z"} +2025/02/06 01:24:02.527 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:00.5980000Z","device_time":"2025-02-06T06:24:02.5266280Z"} +2025/02/06 01:24:03.546 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:01.6170000Z","device_time":"2025-02-06T06:24:03.5459260Z"} +2025/02/06 01:24:04.572 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:02.6440000Z","device_time":"2025-02-06T06:24:04.5720930Z"} +2025/02/06 01:24:05.615 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:03.6870000Z","device_time":"2025-02-06T06:24:05.6151740Z"} +2025/02/06 01:24:06.621 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:04.6920000Z","device_time":"2025-02-06T06:24:06.6208330Z"} +2025/02/06 01:24:07.649 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:05.7200000Z","device_time":"2025-02-06T06:24:07.6487160Z"} +2025/02/06 01:24:08.674 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:06.7450000Z","device_time":"2025-02-06T06:24:08.6739130Z"} +2025/02/06 01:24:09.656 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:07.7270000Z","device_time":"2025-02-06T06:24:09.6555590Z"} +2025/02/06 01:24:10.685 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:08.7570000Z","device_time":"2025-02-06T06:24:10.6851410Z"} +2025/02/06 01:24:11.703 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:09.7720000Z","device_time":"2025-02-06T06:24:11.7006710Z"} +2025/02/06 01:24:12.705 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:10.7770000Z","device_time":"2025-02-06T06:24:12.7054410Z"} +2025/02/06 01:24:13.746 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:11.8170000Z","device_time":"2025-02-06T06:24:13.7454080Z"} +2025/02/06 01:24:14.752 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:12.8230000Z","device_time":"2025-02-06T06:24:14.7516330Z"} +2025/02/06 01:24:15.772 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:13.8430000Z","device_time":"2025-02-06T06:24:15.7713980Z"} +2025/02/06 01:24:16.777 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:14.8480000Z","device_time":"2025-02-06T06:24:16.7762550Z"} +2025/02/06 01:24:17.778 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:15.8500000Z","device_time":"2025-02-06T06:24:17.7782210Z"} +2025/02/06 01:24:18.830 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:16.9010000Z","device_time":"2025-02-06T06:24:18.8297100Z"} +2025/02/06 01:24:19.834 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:17.9050000Z","device_time":"2025-02-06T06:24:19.8338470Z"} +2025/02/06 01:24:20.878 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:18.9490000Z","device_time":"2025-02-06T06:24:20.8778930Z"} +2025/02/06 01:24:21.889 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:19.9600000Z","device_time":"2025-02-06T06:24:21.8883470Z"} +2025/02/06 01:24:22.910 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:20.9810000Z","device_time":"2025-02-06T06:24:22.9096730Z"} +2025/02/06 01:24:23.934 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:22.0050000Z","device_time":"2025-02-06T06:24:23.9335220Z"} +2025/02/06 01:24:24.941 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:23.0130000Z","device_time":"2025-02-06T06:24:24.9410600Z"} +2025/02/06 01:24:25.985 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:24.0570000Z","device_time":"2025-02-06T06:24:25.9852550Z"} +2025/02/06 01:24:26.999 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:25.0700000Z","device_time":"2025-02-06T06:24:26.9988020Z"} +2025/02/06 01:24:28.030 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:26.1010000Z","device_time":"2025-02-06T06:24:28.0298110Z"} +2025/02/06 01:24:29.061 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:27.1300000Z","device_time":"2025-02-06T06:24:29.0588810Z"} +2025/02/06 01:24:30.054 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:28.1250000Z","device_time":"2025-02-06T06:24:30.0536930Z"} +2025/02/06 01:24:31.072 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:29.1430000Z","device_time":"2025-02-06T06:24:31.0715330Z"} +2025/02/06 01:24:32.097 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:30.1680000Z","device_time":"2025-02-06T06:24:32.0968030Z"} +2025/02/06 01:24:33.118 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:31.1890000Z","device_time":"2025-02-06T06:24:33.1179480Z"} +2025/02/06 01:24:34.145 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:32.2170000Z","device_time":"2025-02-06T06:24:34.1453150Z"} +2025/02/06 01:24:35.155 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:33.2270000Z","device_time":"2025-02-06T06:24:35.1551850Z"} +2025/02/06 01:24:36.198 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:34.2700000Z","device_time":"2025-02-06T06:24:36.1982290Z"} +2025/02/06 01:24:37.208 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:35.2790000Z","device_time":"2025-02-06T06:24:37.2074960Z"} +2025/02/06 01:24:38.217 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:36.2880000Z","device_time":"2025-02-06T06:24:38.2168730Z"} +2025/02/06 01:24:39.248 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:37.3200000Z","device_time":"2025-02-06T06:24:39.2481560Z"} +2025/02/06 01:24:40.270 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:38.3410000Z","device_time":"2025-02-06T06:24:40.2696740Z"} +2025/02/06 01:24:41.273 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:39.3450000Z","device_time":"2025-02-06T06:24:41.2733310Z"} +2025/02/06 01:24:42.291 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:40.3620000Z","device_time":"2025-02-06T06:24:42.2908280Z"} +2025/02/06 01:24:43.296 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:41.3670000Z","device_time":"2025-02-06T06:24:43.2957800Z"} +2025/02/06 01:24:44.333 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:42.4040000Z","device_time":"2025-02-06T06:24:44.3328100Z"} +2025/02/06 01:24:45.344 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:43.4150000Z","device_time":"2025-02-06T06:24:45.3438550Z"} +2025/02/06 01:24:46.386 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:44.4570000Z","device_time":"2025-02-06T06:24:46.3854630Z"} +2025/02/06 01:24:47.395 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:45.4660000Z","device_time":"2025-02-06T06:24:47.3949960Z"} +2025/02/06 01:24:48.430 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:46.5010000Z","device_time":"2025-02-06T06:24:48.4295080Z"} +2025/02/06 01:24:49.435 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:47.5020000Z","device_time":"2025-02-06T06:24:49.4306770Z"} +2025/02/06 01:24:50.484 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:48.5550000Z","device_time":"2025-02-06T06:24:50.4835730Z"} +2025/02/06 01:24:51.495 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:49.5670000Z","device_time":"2025-02-06T06:24:51.4951640Z"} +2025/02/06 01:24:52.506 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:50.5780000Z","device_time":"2025-02-06T06:24:52.5060380Z"} +2025/02/06 01:24:53.596 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:51.6680000Z","device_time":"2025-02-06T06:24:53.5964820Z"} +2025/02/06 01:24:54.592 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:52.6630000Z","device_time":"2025-02-06T06:24:54.5915870Z"} +2025/02/06 01:24:55.562 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:53.6310000Z","device_time":"2025-02-06T06:24:55.5596630Z"} +2025/02/06 01:24:56.648 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:54.7190000Z","device_time":"2025-02-06T06:24:56.6475650Z"} +2025/02/06 01:24:57.618 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:55.6900000Z","device_time":"2025-02-06T06:24:57.6182590Z"} +2025/02/06 01:24:58.639 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:56.7100000Z","device_time":"2025-02-06T06:24:58.6387370Z"} +2025/02/06 01:24:59.709 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:57.7770000Z","device_time":"2025-02-06T06:24:59.7051140Z"} +2025/02/06 01:25:00.742 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:58.8140000Z","device_time":"2025-02-06T06:25:00.7421100Z"} +2025/02/06 01:25:01.779 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:24:59.8500000Z","device_time":"2025-02-06T06:25:01.7788640Z"} +2025/02/06 01:25:02.784 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:00.8550000Z","device_time":"2025-02-06T06:25:02.7837180Z"} +2025/02/06 01:25:03.797 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:01.8680000Z","device_time":"2025-02-06T06:25:03.7966220Z"} +2025/02/06 01:25:04.802 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:02.8740000Z","device_time":"2025-02-06T06:25:04.8021120Z"} +2025/02/06 01:25:05.843 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:03.9150000Z","device_time":"2025-02-06T06:25:05.8431550Z"} +2025/02/06 01:25:06.870 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:04.9420000Z","device_time":"2025-02-06T06:25:06.8701150Z"} +2025/02/06 01:25:07.861 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:05.9330000Z","device_time":"2025-02-06T06:25:07.8613410Z"} +2025/02/06 01:25:08.898 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:06.9700000Z","device_time":"2025-02-06T06:25:08.8984970Z"} +2025/02/06 01:25:09.922 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:07.9930000Z","device_time":"2025-02-06T06:25:09.9219470Z"} +2025/02/06 01:25:10.954 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:09.0260000Z","device_time":"2025-02-06T06:25:10.9542020Z"} +2025/02/06 01:25:11.969 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:10.0410000Z","device_time":"2025-02-06T06:25:11.9692340Z"} +2025/02/06 01:25:13.008 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:11.0790000Z","device_time":"2025-02-06T06:25:13.0072010Z"} +2025/02/06 01:25:14.049 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:12.1200000Z","device_time":"2025-02-06T06:25:14.0487840Z"} +2025/02/06 01:25:15.076 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:13.1480000Z","device_time":"2025-02-06T06:25:15.0760450Z"} +2025/02/06 01:25:16.081 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:14.1530000Z","device_time":"2025-02-06T06:25:16.0810950Z"} +2025/02/06 01:25:17.106 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:15.1770000Z","device_time":"2025-02-06T06:25:17.1055880Z"} +2025/02/06 01:25:18.230 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:16.3020000Z","device_time":"2025-02-06T06:25:18.2300590Z"} +2025/02/06 01:25:19.168 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:17.2390000Z","device_time":"2025-02-06T06:25:19.1679290Z"} +2025/02/06 01:25:20.236 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:18.3050000Z","device_time":"2025-02-06T06:25:20.2337160Z"} +2025/02/06 01:25:21.251 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:19.3220000Z","device_time":"2025-02-06T06:25:21.2506500Z"} +2025/02/06 01:25:22.258 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:20.3290000Z","device_time":"2025-02-06T06:25:22.2580020Z"} +2025/02/06 01:25:23.267 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:21.3380000Z","device_time":"2025-02-06T06:25:23.2664950Z"} +2025/02/06 01:25:24.275 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:22.3460000Z","device_time":"2025-02-06T06:25:24.2747420Z"} +2025/02/06 01:25:25.314 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:23.3850000Z","device_time":"2025-02-06T06:25:25.3138940Z"} +2025/02/06 01:25:26.315 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:24.3860000Z","device_time":"2025-02-06T06:25:26.3147580Z"} +2025/02/06 01:25:27.327 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:25.3980000Z","device_time":"2025-02-06T06:25:27.3268720Z"} +2025/02/06 01:25:28.342 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:26.4130000Z","device_time":"2025-02-06T06:25:28.3416190Z"} +2025/02/06 01:25:29.368 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:27.4400000Z","device_time":"2025-02-06T06:25:29.3680530Z"} +2025/02/06 01:25:30.397 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:28.4680000Z","device_time":"2025-02-06T06:25:30.3968860Z"} +2025/02/06 01:25:31.401 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:29.4720000Z","device_time":"2025-02-06T06:25:31.4007750Z"} +2025/02/06 01:25:32.428 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:30.4990000Z","device_time":"2025-02-06T06:25:32.4278340Z"} +2025/02/06 01:25:33.442 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:31.5130000Z","device_time":"2025-02-06T06:25:33.4414600Z"} +2025/02/06 01:25:34.442 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:32.5130000Z","device_time":"2025-02-06T06:25:34.4418010Z"} +2025/02/06 01:25:35.456 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:33.5280000Z","device_time":"2025-02-06T06:25:35.4561210Z"} +2025/02/06 01:25:36.468 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:34.5400000Z","device_time":"2025-02-06T06:25:36.4682380Z"} +2025/02/06 01:25:37.507 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:35.5780000Z","device_time":"2025-02-06T06:25:37.5064390Z"} +2025/02/06 01:25:38.548 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:36.6200000Z","device_time":"2025-02-06T06:25:38.5481930Z"} +2025/02/06 01:25:39.572 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:37.6430000Z","device_time":"2025-02-06T06:25:39.5714000Z"} +2025/02/06 01:25:40.599 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:38.6700000Z","device_time":"2025-02-06T06:25:40.5989120Z"} +2025/02/06 01:25:41.602 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:39.6740000Z","device_time":"2025-02-06T06:25:41.6020550Z"} +2025/02/06 01:25:42.655 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:40.7260000Z","device_time":"2025-02-06T06:25:42.6546190Z"} +2025/02/06 01:25:43.664 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:41.7360000Z","device_time":"2025-02-06T06:25:43.6641310Z"} +2025/02/06 01:25:44.678 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:42.7500000Z","device_time":"2025-02-06T06:25:44.6782570Z"} +2025/02/06 01:25:45.712 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:43.7830000Z","device_time":"2025-02-06T06:25:45.7116820Z"} +2025/02/06 01:25:46.729 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:44.8000000Z","device_time":"2025-02-06T06:25:46.7285000Z"} +2025/02/06 01:25:47.761 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:45.8300000Z","device_time":"2025-02-06T06:25:47.7582120Z"} +2025/02/06 01:25:48.765 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:46.8360000Z","device_time":"2025-02-06T06:25:48.7649660Z"} +2025/02/06 01:25:49.776 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:47.8480000Z","device_time":"2025-02-06T06:25:49.7763220Z"} +2025/02/06 01:25:50.791 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:48.8630000Z","device_time":"2025-02-06T06:25:50.7914310Z"} +2025/02/06 01:25:51.796 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:49.8670000Z","device_time":"2025-02-06T06:25:51.7956430Z"} +2025/02/06 01:25:52.814 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:50.8850000Z","device_time":"2025-02-06T06:25:52.8133590Z"} +2025/02/06 01:25:53.821 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:51.8920000Z","device_time":"2025-02-06T06:25:53.8206450Z"} +2025/02/06 01:25:54.852 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:52.9240000Z","device_time":"2025-02-06T06:25:54.8522000Z"} +2025/02/06 01:25:55.889 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:53.9590000Z","device_time":"2025-02-06T06:25:55.8876800Z"} +2025/02/06 01:25:56.901 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:54.9700000Z","device_time":"2025-02-06T06:25:56.8981730Z"} +2025/02/06 01:25:57.885 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:55.9540000Z","device_time":"2025-02-06T06:25:57.8822040Z"} +2025/02/06 01:25:58.917 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:56.9880000Z","device_time":"2025-02-06T06:25:58.9169950Z"} +2025/02/06 01:25:59.996 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:58.0670000Z","device_time":"2025-02-06T06:25:59.9954960Z"} +2025/02/06 01:26:01.017 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:25:59.0880000Z","device_time":"2025-02-06T06:26:01.0166890Z"} +2025/02/06 01:26:02.013 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:00.0850000Z","device_time":"2025-02-06T06:26:02.0133500Z"} +2025/02/06 01:26:03.054 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:01.1250000Z","device_time":"2025-02-06T06:26:03.0539970Z"} +2025/02/06 01:26:04.073 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:02.1450000Z","device_time":"2025-02-06T06:26:04.0732720Z"} +2025/02/06 01:26:05.080 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:03.1510000Z","device_time":"2025-02-06T06:26:05.0796070Z"} +2025/02/06 01:26:06.133 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:04.2040000Z","device_time":"2025-02-06T06:26:06.1328030Z"} +2025/02/06 01:26:07.145 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:05.2160000Z","device_time":"2025-02-06T06:26:07.1443220Z"} +2025/02/06 01:26:08.197 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:06.2680000Z","device_time":"2025-02-06T06:26:08.1967560Z"} +2025/02/06 01:26:09.230 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:07.3020000Z","device_time":"2025-02-06T06:26:09.2304080Z"} +2025/02/06 01:26:10.223 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:08.2940000Z","device_time":"2025-02-06T06:26:10.2227820Z"} +2025/02/06 01:26:11.265 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:09.3370000Z","device_time":"2025-02-06T06:26:11.2653960Z"} +2025/02/06 01:26:12.280 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:10.3510000Z","device_time":"2025-02-06T06:26:12.2796130Z"} +2025/02/06 01:26:13.316 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:11.3880000Z","device_time":"2025-02-06T06:26:13.3163550Z"} +2025/02/06 01:26:14.344 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:12.4150000Z","device_time":"2025-02-06T06:26:14.3439030Z"} +2025/02/06 01:26:15.382 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:13.4540000Z","device_time":"2025-02-06T06:26:15.3820720Z"} +2025/02/06 01:26:16.398 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:14.4690000Z","device_time":"2025-02-06T06:26:16.3979800Z"} +2025/02/06 01:26:17.428 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:15.5000000Z","device_time":"2025-02-06T06:26:17.4282870Z"} +2025/02/06 01:26:18.471 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:16.5420000Z","device_time":"2025-02-06T06:26:18.4706730Z"} +2025/02/06 01:26:19.500 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:17.5710000Z","device_time":"2025-02-06T06:26:19.4995490Z"} +2025/02/06 01:26:20.535 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:18.6070000Z","device_time":"2025-02-06T06:26:20.5350720Z"} +2025/02/06 01:26:21.571 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:19.6430000Z","device_time":"2025-02-06T06:26:21.5713900Z"} +2025/02/06 01:26:22.593 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:20.6640000Z","device_time":"2025-02-06T06:26:22.5929720Z"} +2025/02/06 01:26:23.602 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:21.6740000Z","device_time":"2025-02-06T06:26:23.6022360Z"} +2025/02/06 01:26:24.621 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:22.6920000Z","device_time":"2025-02-06T06:26:24.6203070Z"} +2025/02/06 01:26:25.638 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:23.7090000Z","device_time":"2025-02-06T06:26:25.6374400Z"} +2025/02/06 01:26:26.647 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:24.7180000Z","device_time":"2025-02-06T06:26:26.6468580Z"} +2025/02/06 01:26:27.695 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:25.7660000Z","device_time":"2025-02-06T06:26:27.6946780Z"} +2025/02/06 01:26:28.696 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:26.7680000Z","device_time":"2025-02-06T06:26:28.6960840Z"} +2025/02/06 01:26:29.734 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:27.8050000Z","device_time":"2025-02-06T06:26:29.7340080Z"} +2025/02/06 01:26:30.749 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:28.8200000Z","device_time":"2025-02-06T06:26:30.7487950Z"} +2025/02/06 01:26:31.793 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:29.8640000Z","device_time":"2025-02-06T06:26:31.7928730Z"} +2025/02/06 01:26:32.805 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:30.8760000Z","device_time":"2025-02-06T06:26:32.8049280Z"} +2025/02/06 01:26:33.818 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:31.8900000Z","device_time":"2025-02-06T06:26:33.8183290Z"} +2025/02/06 01:26:34.844 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:32.9150000Z","device_time":"2025-02-06T06:26:34.8435380Z"} +2025/02/06 01:26:35.923 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:33.9920000Z","device_time":"2025-02-06T06:26:35.9208620Z"} +2025/02/06 01:26:36.944 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:35.0150000Z","device_time":"2025-02-06T06:26:36.9437340Z"} +2025/02/06 01:26:37.939 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:36.0100000Z","device_time":"2025-02-06T06:26:37.9388900Z"} +2025/02/06 01:26:38.973 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:37.0440000Z","device_time":"2025-02-06T06:26:38.9729810Z"} +2025/02/06 01:26:40.017 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:38.0880000Z","device_time":"2025-02-06T06:26:40.0168420Z"} +2025/02/06 01:26:41.059 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:39.1310000Z","device_time":"2025-02-06T06:26:41.0593340Z"} +2025/02/06 01:26:42.075 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:40.1460000Z","device_time":"2025-02-06T06:26:42.0748950Z"} +2025/02/06 01:26:43.112 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:41.1830000Z","device_time":"2025-02-06T06:26:43.1116770Z"} +2025/02/06 01:26:44.138 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:42.2090000Z","device_time":"2025-02-06T06:26:44.1377500Z"} +2025/02/06 01:26:45.149 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:43.2210000Z","device_time":"2025-02-06T06:26:45.1491950Z"} +2025/02/06 01:26:46.201 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:44.2730000Z","device_time":"2025-02-06T06:26:46.2010680Z"} +2025/02/06 01:26:47.203 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:45.2750000Z","device_time":"2025-02-06T06:26:47.2034810Z"} +2025/02/06 01:26:48.238 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:46.3100000Z","device_time":"2025-02-06T06:26:48.2384670Z"} +2025/02/06 01:26:49.244 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:47.3150000Z","device_time":"2025-02-06T06:26:49.2435590Z"} +2025/02/06 01:26:50.275 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:48.3460000Z","device_time":"2025-02-06T06:26:50.2746290Z"} +2025/02/06 01:26:51.283 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:49.3550000Z","device_time":"2025-02-06T06:26:51.2830650Z"} +2025/02/06 01:26:52.300 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:50.3720000Z","device_time":"2025-02-06T06:26:52.3000840Z"} +2025/02/06 01:26:53.312 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:51.3830000Z","device_time":"2025-02-06T06:26:53.3118950Z"} +2025/02/06 01:26:54.360 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:52.4290000Z","device_time":"2025-02-06T06:26:54.3570720Z"} +2025/02/06 01:26:55.380 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:53.4510000Z","device_time":"2025-02-06T06:26:55.3799380Z"} +2025/02/06 01:26:56.428 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:54.4990000Z","device_time":"2025-02-06T06:26:56.4279620Z"} +2025/02/06 01:26:57.469 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:55.5400000Z","device_time":"2025-02-06T06:26:57.4683360Z"} +2025/02/06 01:26:58.490 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:56.5610000Z","device_time":"2025-02-06T06:26:58.4895560Z"} +2025/02/06 01:26:59.524 14454 14488 Info Unity {"ntp_time":"2025-02-06T06:26:57.5950000Z","device_time":"2025-02-06T06:26:59.5237760Z"} diff --git a/python/evaluations/data/single_device/ntp_clock/tab_s6/run3-logcat.txt b/python/evaluations/data/single_device/ntp_clock/tab_s6/run3-logcat.txt new file mode 100644 index 0000000..d2375b5 --- /dev/null +++ b/python/evaluations/data/single_device/ntp_clock/tab_s6/run3-logcat.txt @@ -0,0 +1,307 @@ +2025/02/06 01:30:00.213 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:29:57.8320000Z","device_time":"2025-02-06T06:30:00.2005900Z"} +2025/02/06 01:30:01.215 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:29:58.8410000Z","device_time":"2025-02-06T06:30:01.2098670Z"} +2025/02/06 01:30:02.254 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:29:59.8840000Z","device_time":"2025-02-06T06:30:02.2524490Z"} +2025/02/06 01:30:03.283 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:00.9140000Z","device_time":"2025-02-06T06:30:03.2824140Z"} +2025/02/06 01:30:04.313 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:01.9440000Z","device_time":"2025-02-06T06:30:04.3127950Z"} +2025/02/06 01:30:05.320 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:02.9510000Z","device_time":"2025-02-06T06:30:05.3193440Z"} +2025/02/06 01:30:06.442 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:04.0730000Z","device_time":"2025-02-06T06:30:06.4420820Z"} +2025/02/06 01:30:07.448 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:05.0790000Z","device_time":"2025-02-06T06:30:07.4477930Z"} +2025/02/06 01:30:08.448 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:06.0790000Z","device_time":"2025-02-06T06:30:08.4480830Z"} +2025/02/06 01:30:09.459 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:07.0900000Z","device_time":"2025-02-06T06:30:09.4587940Z"} +2025/02/06 01:30:10.502 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:08.1300000Z","device_time":"2025-02-06T06:30:10.4989410Z"} +2025/02/06 01:30:11.646 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:09.2800000Z","device_time":"2025-02-06T06:30:11.6423360Z"} +2025/02/06 01:30:12.738 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:10.3780000Z","device_time":"2025-02-06T06:30:12.7371060Z"} +2025/02/06 01:30:13.759 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:11.3960000Z","device_time":"2025-02-06T06:30:13.7553320Z"} +2025/02/06 01:30:14.731 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:12.3700000Z","device_time":"2025-02-06T06:30:14.7287810Z"} +2025/02/06 01:30:15.804 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:13.4450000Z","device_time":"2025-02-06T06:30:15.8035780Z"} +2025/02/06 01:30:16.792 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:14.4330000Z","device_time":"2025-02-06T06:30:16.7917980Z"} +2025/02/06 01:30:17.809 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:15.4500000Z","device_time":"2025-02-06T06:30:17.8088730Z"} +2025/02/06 01:30:18.797 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:16.4380000Z","device_time":"2025-02-06T06:30:18.7970300Z"} +2025/02/06 01:30:19.819 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:17.4600000Z","device_time":"2025-02-06T06:30:19.8191050Z"} +2025/02/06 01:30:20.846 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:18.4870000Z","device_time":"2025-02-06T06:30:20.8456250Z"} +2025/02/06 01:30:21.879 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:19.5170000Z","device_time":"2025-02-06T06:30:21.8760640Z"} +2025/02/06 01:30:22.983 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:20.6200000Z","device_time":"2025-02-06T06:30:22.9788500Z"} +2025/02/06 01:30:24.144 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:21.7800000Z","device_time":"2025-02-06T06:30:24.1393580Z"} +2025/02/06 01:30:25.170 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:22.8110000Z","device_time":"2025-02-06T06:30:25.1700380Z"} +2025/02/06 01:30:26.205 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:23.8460000Z","device_time":"2025-02-06T06:30:26.2046760Z"} +2025/02/06 01:30:27.320 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:24.9600000Z","device_time":"2025-02-06T06:30:27.3185360Z"} +2025/02/06 01:30:28.286 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:25.9250000Z","device_time":"2025-02-06T06:30:28.2834670Z"} +2025/02/06 01:30:29.324 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:26.9650000Z","device_time":"2025-02-06T06:30:29.3235800Z"} +2025/02/06 01:30:30.323 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:27.9640000Z","device_time":"2025-02-06T06:30:30.3227190Z"} +2025/02/06 01:30:31.343 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:28.9840000Z","device_time":"2025-02-06T06:30:31.3424850Z"} +2025/02/06 01:30:32.449 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:30.0890000Z","device_time":"2025-02-06T06:30:32.4481920Z"} +2025/02/06 01:30:33.412 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:31.0480000Z","device_time":"2025-02-06T06:30:33.4072370Z"} +2025/02/06 01:30:34.454 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:32.0940000Z","device_time":"2025-02-06T06:30:34.4533180Z"} +2025/02/06 01:30:35.863 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:33.4540000Z","device_time":"2025-02-06T06:30:35.8126400Z"} +2025/02/06 01:30:36.763 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:34.4040000Z","device_time":"2025-02-06T06:30:36.7626850Z"} +2025/02/06 01:30:37.765 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:35.4060000Z","device_time":"2025-02-06T06:30:37.7645910Z"} +2025/02/06 01:30:38.824 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:36.4530000Z","device_time":"2025-02-06T06:30:38.8123770Z"} +2025/02/06 01:30:39.798 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:37.4390000Z","device_time":"2025-02-06T06:30:39.7977510Z"} +2025/02/06 01:30:40.842 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:38.4830000Z","device_time":"2025-02-06T06:30:40.8419700Z"} +2025/02/06 01:30:41.832 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:39.4730000Z","device_time":"2025-02-06T06:30:41.8313930Z"} +2025/02/06 01:30:42.860 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:40.5010000Z","device_time":"2025-02-06T06:30:42.8599440Z"} +2025/02/06 01:30:43.935 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:41.5760000Z","device_time":"2025-02-06T06:30:43.9350900Z"} +2025/02/06 01:30:44.983 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:42.6220000Z","device_time":"2025-02-06T06:30:44.9804930Z"} +2025/02/06 01:30:45.967 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:43.6080000Z","device_time":"2025-02-06T06:30:45.9668860Z"} +2025/02/06 01:30:47.027 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:44.6650000Z","device_time":"2025-02-06T06:30:47.0236960Z"} +2025/02/06 01:30:48.037 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:45.6780000Z","device_time":"2025-02-06T06:30:48.0367400Z"} +2025/02/06 01:30:49.047 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:46.6880000Z","device_time":"2025-02-06T06:30:49.0468040Z"} +2025/02/06 01:30:50.067 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:47.7080000Z","device_time":"2025-02-06T06:30:50.0666770Z"} +2025/02/06 01:30:51.087 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:48.7280000Z","device_time":"2025-02-06T06:30:51.0869630Z"} +2025/02/06 01:30:52.118 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:49.7450000Z","device_time":"2025-02-06T06:30:52.1041940Z"} +2025/02/06 01:30:53.137 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:50.7780000Z","device_time":"2025-02-06T06:30:53.1371350Z"} +2025/02/06 01:30:54.130 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:51.7710000Z","device_time":"2025-02-06T06:30:54.1296880Z"} +2025/02/06 01:30:55.225 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:52.8660000Z","device_time":"2025-02-06T06:30:55.2248200Z"} +2025/02/06 01:30:56.219 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:53.8600000Z","device_time":"2025-02-06T06:30:56.2190380Z"} +2025/02/06 01:30:57.257 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:54.8980000Z","device_time":"2025-02-06T06:30:57.2566850Z"} +2025/02/06 01:30:58.251 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:55.8920000Z","device_time":"2025-02-06T06:30:58.2509560Z"} +2025/02/06 01:30:59.272 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:56.9140000Z","device_time":"2025-02-06T06:30:59.2724700Z"} +2025/02/06 01:31:00.378 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:58.0190000Z","device_time":"2025-02-06T06:31:00.3781480Z"} +2025/02/06 01:31:01.322 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:58.9630000Z","device_time":"2025-02-06T06:31:01.3217070Z"} +2025/02/06 01:31:02.325 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:30:59.9660000Z","device_time":"2025-02-06T06:31:02.3250360Z"} +2025/02/06 01:31:03.352 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:00.9930000Z","device_time":"2025-02-06T06:31:03.3513960Z"} +2025/02/06 01:31:04.403 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:02.0440000Z","device_time":"2025-02-06T06:31:04.4027390Z"} +2025/02/06 01:31:05.418 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:03.0590000Z","device_time":"2025-02-06T06:31:05.4178130Z"} +2025/02/06 01:31:06.411 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:04.0510000Z","device_time":"2025-02-06T06:31:06.4103240Z"} +2025/02/06 01:31:07.430 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:05.0710000Z","device_time":"2025-02-06T06:31:07.4302320Z"} +2025/02/06 01:31:08.469 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:06.1100000Z","device_time":"2025-02-06T06:31:08.4686540Z"} +2025/02/06 01:31:09.513 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:07.1540000Z","device_time":"2025-02-06T06:31:09.5132440Z"} +2025/02/06 01:31:10.523 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:08.1640000Z","device_time":"2025-02-06T06:31:10.5227800Z"} +2025/02/06 01:31:11.564 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:09.2060000Z","device_time":"2025-02-06T06:31:11.5644620Z"} +2025/02/06 01:31:12.570 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:10.2110000Z","device_time":"2025-02-06T06:31:12.5700490Z"} +2025/02/06 01:31:13.583 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:11.2240000Z","device_time":"2025-02-06T06:31:13.5829410Z"} +2025/02/06 01:31:14.616 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:12.2570000Z","device_time":"2025-02-06T06:31:14.6157370Z"} +2025/02/06 01:31:15.630 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:13.2710000Z","device_time":"2025-02-06T06:31:15.6298150Z"} +2025/02/06 01:31:16.667 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:14.3070000Z","device_time":"2025-02-06T06:31:16.6656780Z"} +2025/02/06 01:31:17.677 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:15.3180000Z","device_time":"2025-02-06T06:31:17.6765970Z"} +2025/02/06 01:31:18.690 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:16.3310000Z","device_time":"2025-02-06T06:31:18.6897290Z"} +2025/02/06 01:31:19.700 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:17.3410000Z","device_time":"2025-02-06T06:31:19.6997690Z"} +2025/02/06 01:31:20.727 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:18.3670000Z","device_time":"2025-02-06T06:31:20.7262040Z"} +2025/02/06 01:31:21.733 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:19.3720000Z","device_time":"2025-02-06T06:31:21.7306430Z"} +2025/02/06 01:31:22.768 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:20.4090000Z","device_time":"2025-02-06T06:31:22.7676850Z"} +2025/02/06 01:31:23.800 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:21.4410000Z","device_time":"2025-02-06T06:31:23.7995460Z"} +2025/02/06 01:31:24.807 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:22.4480000Z","device_time":"2025-02-06T06:31:24.8065640Z"} +2025/02/06 01:31:25.875 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:23.5160000Z","device_time":"2025-02-06T06:31:25.8748800Z"} +2025/02/06 01:31:26.910 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:24.5460000Z","device_time":"2025-02-06T06:31:26.9047710Z"} +2025/02/06 01:31:27.873 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:25.5130000Z","device_time":"2025-02-06T06:31:27.8713790Z"} +2025/02/06 01:31:28.935 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:26.5760000Z","device_time":"2025-02-06T06:31:28.9351710Z"} +2025/02/06 01:31:29.999 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:27.6400000Z","device_time":"2025-02-06T06:31:29.9988820Z"} +2025/02/06 01:31:30.973 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:28.6140000Z","device_time":"2025-02-06T06:31:30.9732280Z"} +2025/02/06 01:31:32.019 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:29.6600000Z","device_time":"2025-02-06T06:31:32.0185470Z"} +2025/02/06 01:31:33.041 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:30.6820000Z","device_time":"2025-02-06T06:31:33.0411250Z"} +2025/02/06 01:31:34.045 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:31.6870000Z","device_time":"2025-02-06T06:31:34.0454440Z"} +2025/02/06 01:31:35.081 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:32.7210000Z","device_time":"2025-02-06T06:31:35.0803140Z"} +2025/02/06 01:31:36.095 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:33.7370000Z","device_time":"2025-02-06T06:31:36.0954100Z"} +2025/02/06 01:31:37.132 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:34.7710000Z","device_time":"2025-02-06T06:31:37.1298420Z"} +2025/02/06 01:31:38.194 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:35.8350000Z","device_time":"2025-02-06T06:31:38.1939430Z"} +2025/02/06 01:31:39.215 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:36.8560000Z","device_time":"2025-02-06T06:31:39.2148700Z"} +2025/02/06 01:31:40.268 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:37.9090000Z","device_time":"2025-02-06T06:31:40.2682550Z"} +2025/02/06 01:31:41.250 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:38.8910000Z","device_time":"2025-02-06T06:31:41.2498060Z"} +2025/02/06 01:31:42.282 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:39.9230000Z","device_time":"2025-02-06T06:31:42.2818020Z"} +2025/02/06 01:31:43.298 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:40.9390000Z","device_time":"2025-02-06T06:31:43.2979570Z"} +2025/02/06 01:31:44.339 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:41.9800000Z","device_time":"2025-02-06T06:31:44.3391630Z"} +2025/02/06 01:31:45.380 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:43.0210000Z","device_time":"2025-02-06T06:31:45.3800040Z"} +2025/02/06 01:31:46.420 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:44.0610000Z","device_time":"2025-02-06T06:31:46.4198170Z"} +2025/02/06 01:31:47.438 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:45.0790000Z","device_time":"2025-02-06T06:31:47.4381960Z"} +2025/02/06 01:31:48.431 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:46.0720000Z","device_time":"2025-02-06T06:31:48.4310390Z"} +2025/02/06 01:31:49.476 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:47.1170000Z","device_time":"2025-02-06T06:31:49.4754260Z"} +2025/02/06 01:31:50.484 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:48.1250000Z","device_time":"2025-02-06T06:31:50.4836080Z"} +2025/02/06 01:31:51.494 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:49.1350000Z","device_time":"2025-02-06T06:31:51.4941240Z"} +2025/02/06 01:31:52.537 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:50.1780000Z","device_time":"2025-02-06T06:31:52.5371990Z"} +2025/02/06 01:31:53.551 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:51.1920000Z","device_time":"2025-02-06T06:31:53.5505920Z"} +2025/02/06 01:31:54.555 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:52.1960000Z","device_time":"2025-02-06T06:31:54.5548150Z"} +2025/02/06 01:31:55.591 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:53.2320000Z","device_time":"2025-02-06T06:31:55.5911660Z"} +2025/02/06 01:31:56.622 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:54.2630000Z","device_time":"2025-02-06T06:31:56.6220540Z"} +2025/02/06 01:31:57.638 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:55.2780000Z","device_time":"2025-02-06T06:31:57.6372250Z"} +2025/02/06 01:31:58.681 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:56.3220000Z","device_time":"2025-02-06T06:31:58.6806050Z"} +2025/02/06 01:31:59.664 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:57.3050000Z","device_time":"2025-02-06T06:31:59.6635230Z"} +2025/02/06 01:32:00.727 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:58.3670000Z","device_time":"2025-02-06T06:32:00.7262190Z"} +2025/02/06 01:32:01.746 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:31:59.3840000Z","device_time":"2025-02-06T06:32:01.7431570Z"} +2025/02/06 01:32:02.943 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:00.5840000Z","device_time":"2025-02-06T06:32:02.9430910Z"} +2025/02/06 01:32:03.966 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:01.6060000Z","device_time":"2025-02-06T06:32:03.9651030Z"} +2025/02/06 01:32:04.971 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:02.6120000Z","device_time":"2025-02-06T06:32:04.9707810Z"} +2025/02/06 01:32:06.017 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:03.6500000Z","device_time":"2025-02-06T06:32:06.0091710Z"} +2025/02/06 01:32:07.075 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:04.7160000Z","device_time":"2025-02-06T06:32:07.0750520Z"} +2025/02/06 01:32:08.122 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:05.7630000Z","device_time":"2025-02-06T06:32:08.1221620Z"} +2025/02/06 01:32:09.103 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:06.7430000Z","device_time":"2025-02-06T06:32:09.1022450Z"} +2025/02/06 01:32:10.119 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:07.7590000Z","device_time":"2025-02-06T06:32:10.1182270Z"} +2025/02/06 01:32:11.110 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:08.7510000Z","device_time":"2025-02-06T06:32:11.1096150Z"} +2025/02/06 01:32:12.241 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:09.8790000Z","device_time":"2025-02-06T06:32:12.2374660Z"} +2025/02/06 01:32:13.247 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:10.8880000Z","device_time":"2025-02-06T06:32:13.2464840Z"} +2025/02/06 01:32:14.285 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:11.9260000Z","device_time":"2025-02-06T06:32:14.2846190Z"} +2025/02/06 01:32:15.287 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:12.9280000Z","device_time":"2025-02-06T06:32:15.2870380Z"} +2025/02/06 01:32:16.345 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:13.9850000Z","device_time":"2025-02-06T06:32:16.3443190Z"} +2025/02/06 01:32:17.381 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:15.0220000Z","device_time":"2025-02-06T06:32:17.3808360Z"} +2025/02/06 01:32:18.421 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:16.0620000Z","device_time":"2025-02-06T06:32:18.4209120Z"} +2025/02/06 01:32:19.424 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:17.0650000Z","device_time":"2025-02-06T06:32:19.4240250Z"} +2025/02/06 01:32:20.528 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:18.1690000Z","device_time":"2025-02-06T06:32:20.5278330Z"} +2025/02/06 01:32:21.545 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:19.1860000Z","device_time":"2025-02-06T06:32:21.5451810Z"} +2025/02/06 01:32:22.584 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:20.2250000Z","device_time":"2025-02-06T06:32:22.5833860Z"} +2025/02/06 01:32:23.592 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:21.2330000Z","device_time":"2025-02-06T06:32:23.5918760Z"} +2025/02/06 01:32:24.609 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:22.2500000Z","device_time":"2025-02-06T06:32:24.6089950Z"} +2025/02/06 01:32:25.682 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:23.3230000Z","device_time":"2025-02-06T06:32:25.6816770Z"} +2025/02/06 01:32:26.755 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:24.3960000Z","device_time":"2025-02-06T06:32:26.7544370Z"} +2025/02/06 01:32:27.701 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:25.3420000Z","device_time":"2025-02-06T06:32:27.7004730Z"} +2025/02/06 01:32:28.712 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:26.3530000Z","device_time":"2025-02-06T06:32:28.7120510Z"} +2025/02/06 01:32:29.753 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:27.3930000Z","device_time":"2025-02-06T06:32:29.7521920Z"} +2025/02/06 01:32:30.756 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:28.3970000Z","device_time":"2025-02-06T06:32:30.7560380Z"} +2025/02/06 01:32:31.804 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:29.4440000Z","device_time":"2025-02-06T06:32:31.8031970Z"} +2025/02/06 01:32:32.842 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:30.4820000Z","device_time":"2025-02-06T06:32:32.8412710Z"} +2025/02/06 01:32:33.871 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:31.5110000Z","device_time":"2025-02-06T06:32:33.8696510Z"} +2025/02/06 01:32:34.953 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:32.5840000Z","device_time":"2025-02-06T06:32:34.9433600Z"} +2025/02/06 01:32:35.902 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:33.5400000Z","device_time":"2025-02-06T06:32:35.8985510Z"} +2025/02/06 01:32:36.973 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:34.6140000Z","device_time":"2025-02-06T06:32:36.9729880Z"} +2025/02/06 01:32:38.010 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:35.6510000Z","device_time":"2025-02-06T06:32:38.0095930Z"} +2025/02/06 01:32:39.113 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:36.7540000Z","device_time":"2025-02-06T06:32:39.1131500Z"} +2025/02/06 01:32:40.090 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:37.7300000Z","device_time":"2025-02-06T06:32:40.0893060Z"} +2025/02/06 01:32:41.222 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:38.8540000Z","device_time":"2025-02-06T06:32:41.2127420Z"} +2025/02/06 01:32:42.157 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:39.7970000Z","device_time":"2025-02-06T06:32:42.1562080Z"} +2025/02/06 01:32:43.216 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:40.8520000Z","device_time":"2025-02-06T06:32:43.2107290Z"} +2025/02/06 01:32:44.168 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:41.8070000Z","device_time":"2025-02-06T06:32:44.1658040Z"} +2025/02/06 01:32:45.185 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:42.8260000Z","device_time":"2025-02-06T06:32:45.1844290Z"} +2025/02/06 01:32:46.231 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:43.8680000Z","device_time":"2025-02-06T06:32:46.2273500Z"} +2025/02/06 01:32:47.232 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:44.8720000Z","device_time":"2025-02-06T06:32:47.2312650Z"} +2025/02/06 01:32:48.293 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:45.9340000Z","device_time":"2025-02-06T06:32:48.2929090Z"} +2025/02/06 01:32:49.285 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:46.9220000Z","device_time":"2025-02-06T06:32:49.2807680Z"} +2025/02/06 01:32:50.271 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:47.9120000Z","device_time":"2025-02-06T06:32:50.2708020Z"} +2025/02/06 01:32:51.378 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:49.0190000Z","device_time":"2025-02-06T06:32:51.3775410Z"} +2025/02/06 01:32:52.376 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:50.0150000Z","device_time":"2025-02-06T06:32:52.3735730Z"} +2025/02/06 01:32:53.379 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:51.0200000Z","device_time":"2025-02-06T06:32:53.3785340Z"} +2025/02/06 01:32:54.418 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:52.0590000Z","device_time":"2025-02-06T06:32:54.4174850Z"} +2025/02/06 01:32:55.457 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:53.0980000Z","device_time":"2025-02-06T06:32:55.4568290Z"} +2025/02/06 01:32:56.670 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:54.3070000Z","device_time":"2025-02-06T06:32:56.6655850Z"} +2025/02/06 01:32:57.769 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:55.3890000Z","device_time":"2025-02-06T06:32:57.7481230Z"} +2025/02/06 01:32:58.769 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:56.4070000Z","device_time":"2025-02-06T06:32:58.7657830Z"} +2025/02/06 01:32:59.800 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:57.4410000Z","device_time":"2025-02-06T06:32:59.7994200Z"} +2025/02/06 01:33:00.840 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:58.4800000Z","device_time":"2025-02-06T06:33:00.8392900Z"} +2025/02/06 01:33:01.899 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:32:59.5400000Z","device_time":"2025-02-06T06:33:01.8989090Z"} +2025/02/06 01:33:02.889 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:00.5300000Z","device_time":"2025-02-06T06:33:02.8885010Z"} +2025/02/06 01:33:03.919 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:01.5600000Z","device_time":"2025-02-06T06:33:03.9191450Z"} +2025/02/06 01:33:04.933 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:02.5740000Z","device_time":"2025-02-06T06:33:04.9328730Z"} +2025/02/06 01:33:05.953 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:03.5940000Z","device_time":"2025-02-06T06:33:05.9529640Z"} +2025/02/06 01:33:06.953 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:04.5940000Z","device_time":"2025-02-06T06:33:06.9528010Z"} +2025/02/06 01:33:07.977 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:05.6170000Z","device_time":"2025-02-06T06:33:07.9762460Z"} +2025/02/06 01:33:09.009 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:06.6480000Z","device_time":"2025-02-06T06:33:09.0069200Z"} +2025/02/06 01:33:10.053 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:07.6940000Z","device_time":"2025-02-06T06:33:10.0525890Z"} +2025/02/06 01:33:11.122 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:08.7630000Z","device_time":"2025-02-06T06:33:11.1218200Z"} +2025/02/06 01:33:12.098 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:09.7380000Z","device_time":"2025-02-06T06:33:12.0967520Z"} +2025/02/06 01:33:13.098 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:10.7390000Z","device_time":"2025-02-06T06:33:13.0975210Z"} +2025/02/06 01:33:14.107 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:11.7480000Z","device_time":"2025-02-06T06:33:14.1072220Z"} +2025/02/06 01:33:15.133 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:12.7740000Z","device_time":"2025-02-06T06:33:15.1329100Z"} +2025/02/06 01:33:16.129 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:13.7700000Z","device_time":"2025-02-06T06:33:16.1285270Z"} +2025/02/06 01:33:17.176 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:14.8170000Z","device_time":"2025-02-06T06:33:17.1757090Z"} +2025/02/06 01:33:18.174 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:15.8150000Z","device_time":"2025-02-06T06:33:18.1739930Z"} +2025/02/06 01:33:19.194 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:16.8350000Z","device_time":"2025-02-06T06:33:19.1934840Z"} +2025/02/06 01:33:20.204 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:17.8450000Z","device_time":"2025-02-06T06:33:20.2040140Z"} +2025/02/06 01:33:21.217 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:18.8580000Z","device_time":"2025-02-06T06:33:21.2164950Z"} +2025/02/06 01:33:22.258 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:19.8990000Z","device_time":"2025-02-06T06:33:22.2578390Z"} +2025/02/06 01:33:23.253 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:20.8940000Z","device_time":"2025-02-06T06:33:23.2530590Z"} +2025/02/06 01:33:24.337 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:21.9780000Z","device_time":"2025-02-06T06:33:24.3364270Z"} +2025/02/06 01:33:25.445 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:23.0860000Z","device_time":"2025-02-06T06:33:25.4444630Z"} +2025/02/06 01:33:26.368 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:24.0070000Z","device_time":"2025-02-06T06:33:26.3655740Z"} +2025/02/06 01:33:27.371 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:25.0100000Z","device_time":"2025-02-06T06:33:27.3684550Z"} +2025/02/06 01:33:28.457 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:26.0950000Z","device_time":"2025-02-06T06:33:28.4540170Z"} +2025/02/06 01:33:29.466 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:27.1060000Z","device_time":"2025-02-06T06:33:29.4652530Z"} +2025/02/06 01:33:30.487 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:28.1270000Z","device_time":"2025-02-06T06:33:30.4862520Z"} +2025/02/06 01:33:31.511 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:29.1520000Z","device_time":"2025-02-06T06:33:31.5110330Z"} +2025/02/06 01:33:32.637 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:30.2780000Z","device_time":"2025-02-06T06:33:32.6364730Z"} +2025/02/06 01:33:33.676 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:31.3170000Z","device_time":"2025-02-06T06:33:33.6757620Z"} +2025/02/06 01:33:34.679 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:32.3200000Z","device_time":"2025-02-06T06:33:34.6788830Z"} +2025/02/06 01:33:35.713 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:33.3510000Z","device_time":"2025-02-06T06:33:35.7096180Z"} +2025/02/06 01:33:36.736 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:34.3770000Z","device_time":"2025-02-06T06:33:36.7357000Z"} +2025/02/06 01:33:37.753 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:35.3940000Z","device_time":"2025-02-06T06:33:37.7529850Z"} +2025/02/06 01:33:38.785 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:36.4260000Z","device_time":"2025-02-06T06:33:38.7851560Z"} +2025/02/06 01:33:39.830 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:37.4710000Z","device_time":"2025-02-06T06:33:39.8294910Z"} +2025/02/06 01:33:40.873 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:38.5140000Z","device_time":"2025-02-06T06:33:40.8730210Z"} +2025/02/06 01:33:41.976 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:39.6170000Z","device_time":"2025-02-06T06:33:41.9754460Z"} +2025/02/06 01:33:42.908 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:40.5470000Z","device_time":"2025-02-06T06:33:42.9054560Z"} +2025/02/06 01:33:43.939 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:41.5800000Z","device_time":"2025-02-06T06:33:43.9387420Z"} +2025/02/06 01:33:44.983 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:42.6240000Z","device_time":"2025-02-06T06:33:44.9824880Z"} +2025/02/06 01:33:46.010 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:43.6510000Z","device_time":"2025-02-06T06:33:46.0096420Z"} +2025/02/06 01:33:46.990 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:44.6310000Z","device_time":"2025-02-06T06:33:46.9898010Z"} +2025/02/06 01:33:48.059 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:45.7000000Z","device_time":"2025-02-06T06:33:48.0588560Z"} +2025/02/06 01:33:49.070 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:46.7110000Z","device_time":"2025-02-06T06:33:49.0702680Z"} +2025/02/06 01:33:50.129 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:47.7690000Z","device_time":"2025-02-06T06:33:50.1281180Z"} +2025/02/06 01:33:51.162 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:48.8030000Z","device_time":"2025-02-06T06:33:51.1616470Z"} +2025/02/06 01:33:52.194 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:49.8350000Z","device_time":"2025-02-06T06:33:52.1938160Z"} +2025/02/06 01:33:53.341 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:50.9640000Z","device_time":"2025-02-06T06:33:53.3229470Z"} +2025/02/06 01:33:54.249 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:51.8870000Z","device_time":"2025-02-06T06:33:54.2462230Z"} +2025/02/06 01:33:55.345 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:52.9850000Z","device_time":"2025-02-06T06:33:55.3442030Z"} +2025/02/06 01:33:56.423 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:54.0640000Z","device_time":"2025-02-06T06:33:56.4231650Z"} +2025/02/06 01:33:57.438 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:55.0790000Z","device_time":"2025-02-06T06:33:57.4374780Z"} +2025/02/06 01:33:58.538 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:56.1790000Z","device_time":"2025-02-06T06:33:58.5379680Z"} +2025/02/06 01:33:59.557 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:57.1970000Z","device_time":"2025-02-06T06:33:59.5563580Z"} +2025/02/06 01:34:00.607 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:58.2480000Z","device_time":"2025-02-06T06:34:00.6069090Z"} +2025/02/06 01:34:01.699 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:33:59.3400000Z","device_time":"2025-02-06T06:34:01.6990840Z"} +2025/02/06 01:34:02.633 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:00.2740000Z","device_time":"2025-02-06T06:34:02.6325610Z"} +2025/02/06 01:34:03.690 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:01.3310000Z","device_time":"2025-02-06T06:34:03.6896790Z"} +2025/02/06 01:34:04.664 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:02.3040000Z","device_time":"2025-02-06T06:34:04.6632900Z"} +2025/02/06 01:34:05.750 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:03.3910000Z","device_time":"2025-02-06T06:34:05.7499060Z"} +2025/02/06 01:34:06.761 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:04.4020000Z","device_time":"2025-02-06T06:34:06.7609470Z"} +2025/02/06 01:34:07.795 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:05.4360000Z","device_time":"2025-02-06T06:34:07.7946690Z"} +2025/02/06 01:34:08.839 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:06.4800000Z","device_time":"2025-02-06T06:34:08.8390200Z"} +2025/02/06 01:34:09.895 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:07.5350000Z","device_time":"2025-02-06T06:34:09.8943690Z"} +2025/02/06 01:34:10.964 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:08.6050000Z","device_time":"2025-02-06T06:34:10.9634050Z"} +2025/02/06 01:34:11.926 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:09.5670000Z","device_time":"2025-02-06T06:34:11.9259020Z"} +2025/02/06 01:34:12.972 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:10.6120000Z","device_time":"2025-02-06T06:34:12.9709770Z"} +2025/02/06 01:34:13.970 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:11.6100000Z","device_time":"2025-02-06T06:34:13.9692630Z"} +2025/02/06 01:34:15.013 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:12.6540000Z","device_time":"2025-02-06T06:34:15.0125020Z"} +2025/02/06 01:34:16.057 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:13.6980000Z","device_time":"2025-02-06T06:34:16.0570540Z"} +2025/02/06 01:34:17.061 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:14.7020000Z","device_time":"2025-02-06T06:34:17.0609260Z"} +2025/02/06 01:34:18.166 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:15.8070000Z","device_time":"2025-02-06T06:34:18.1658620Z"} +2025/02/06 01:34:19.218 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:16.8590000Z","device_time":"2025-02-06T06:34:19.2177120Z"} +2025/02/06 01:34:20.254 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:17.8950000Z","device_time":"2025-02-06T06:34:20.2539350Z"} +2025/02/06 01:34:21.267 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:18.9080000Z","device_time":"2025-02-06T06:34:21.2667170Z"} +2025/02/06 01:34:22.283 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:19.9240000Z","device_time":"2025-02-06T06:34:22.2825650Z"} +2025/02/06 01:34:23.314 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:20.9550000Z","device_time":"2025-02-06T06:34:23.3134080Z"} +2025/02/06 01:34:24.327 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:21.9680000Z","device_time":"2025-02-06T06:34:24.3266830Z"} +2025/02/06 01:34:25.336 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:22.9770000Z","device_time":"2025-02-06T06:34:25.3358340Z"} +2025/02/06 01:34:26.369 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:24.0100000Z","device_time":"2025-02-06T06:34:26.3686610Z"} +2025/02/06 01:34:27.379 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:25.0200000Z","device_time":"2025-02-06T06:34:27.3790870Z"} +2025/02/06 01:34:28.486 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:26.1270000Z","device_time":"2025-02-06T06:34:28.4856120Z"} +2025/02/06 01:34:29.821 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:27.4530000Z","device_time":"2025-02-06T06:34:29.8122050Z"} +2025/02/06 01:34:30.832 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:28.4730000Z","device_time":"2025-02-06T06:34:30.8314550Z"} +2025/02/06 01:34:31.889 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:29.5260000Z","device_time":"2025-02-06T06:34:31.8852390Z"} +2025/02/06 01:34:32.889 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:30.5290000Z","device_time":"2025-02-06T06:34:32.8882190Z"} +2025/02/06 01:34:33.997 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:31.6380000Z","device_time":"2025-02-06T06:34:33.9965030Z"} +2025/02/06 01:34:35.011 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:32.6520000Z","device_time":"2025-02-06T06:34:35.0108020Z"} +2025/02/06 01:34:36.065 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:33.7020000Z","device_time":"2025-02-06T06:34:36.0612600Z"} +2025/02/06 01:34:37.139 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:34.7800000Z","device_time":"2025-02-06T06:34:37.1388530Z"} +2025/02/06 01:34:38.199 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:35.8400000Z","device_time":"2025-02-06T06:34:38.1988450Z"} +2025/02/06 01:34:39.185 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:36.8260000Z","device_time":"2025-02-06T06:34:39.1844550Z"} +2025/02/06 01:34:40.232 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:37.8700000Z","device_time":"2025-02-06T06:34:40.2292260Z"} +2025/02/06 01:34:41.235 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:38.8740000Z","device_time":"2025-02-06T06:34:41.2325070Z"} +2025/02/06 01:34:42.282 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:39.9230000Z","device_time":"2025-02-06T06:34:42.2819780Z"} +2025/02/06 01:34:43.292 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:40.9290000Z","device_time":"2025-02-06T06:34:43.2883320Z"} +2025/02/06 01:34:44.349 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:41.9890000Z","device_time":"2025-02-06T06:34:44.3483030Z"} +2025/02/06 01:34:45.360 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:43.0000000Z","device_time":"2025-02-06T06:34:45.3593750Z"} +2025/02/06 01:34:46.389 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:44.0260000Z","device_time":"2025-02-06T06:34:46.3846460Z"} +2025/02/06 01:34:47.440 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:45.0790000Z","device_time":"2025-02-06T06:34:47.4376310Z"} +2025/02/06 01:34:48.469 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:46.1100000Z","device_time":"2025-02-06T06:34:48.4685410Z"} +2025/02/06 01:34:49.505 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:47.1460000Z","device_time":"2025-02-06T06:34:49.5049800Z"} +2025/02/06 01:34:50.530 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:48.1700000Z","device_time":"2025-02-06T06:34:50.5293710Z"} +2025/02/06 01:34:51.539 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:49.1800000Z","device_time":"2025-02-06T06:34:51.5388030Z"} +2025/02/06 01:34:52.584 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:50.2190000Z","device_time":"2025-02-06T06:34:52.5781790Z"} +2025/02/06 01:34:53.639 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:51.2800000Z","device_time":"2025-02-06T06:34:53.6384980Z"} +2025/02/06 01:34:54.708 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:52.3460000Z","device_time":"2025-02-06T06:34:54.7048520Z"} +2025/02/06 01:34:55.730 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:53.3670000Z","device_time":"2025-02-06T06:34:55.7262900Z"} +2025/02/06 01:34:56.759 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:54.3980000Z","device_time":"2025-02-06T06:34:56.7569540Z"} +2025/02/06 01:34:57.771 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:55.4110000Z","device_time":"2025-02-06T06:34:57.7702770Z"} +2025/02/06 01:34:58.806 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:56.4470000Z","device_time":"2025-02-06T06:34:58.8059210Z"} +2025/02/06 01:34:59.821 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:57.4620000Z","device_time":"2025-02-06T06:34:59.8206350Z"} +2025/02/06 01:35:01.025 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:58.6660000Z","device_time":"2025-02-06T06:35:01.0247690Z"} +2025/02/06 01:35:02.110 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:34:59.7510000Z","device_time":"2025-02-06T06:35:02.1100570Z"} +2025/02/06 01:35:03.126 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:00.7660000Z","device_time":"2025-02-06T06:35:03.1252780Z"} +2025/02/06 01:35:04.209 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:01.8500000Z","device_time":"2025-02-06T06:35:04.2085830Z"} +2025/02/06 01:35:05.212 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:02.8520000Z","device_time":"2025-02-06T06:35:05.2108820Z"} +2025/02/06 01:35:06.258 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:03.8980000Z","device_time":"2025-02-06T06:35:06.2573320Z"} +2025/02/06 01:35:07.281 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:04.9210000Z","device_time":"2025-02-06T06:35:07.2800640Z"} +2025/02/06 01:35:08.289 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:05.9300000Z","device_time":"2025-02-06T06:35:08.2884790Z"} +2025/02/06 01:35:09.305 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:06.9440000Z","device_time":"2025-02-06T06:35:09.3027960Z"} +2025/02/06 01:35:10.351 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:07.9910000Z","device_time":"2025-02-06T06:35:10.3504290Z"} +2025/02/06 01:35:11.346 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:08.9870000Z","device_time":"2025-02-06T06:35:11.3454640Z"} +2025/02/06 01:35:12.365 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:10.0060000Z","device_time":"2025-02-06T06:35:12.3647150Z"} +2025/02/06 01:35:13.391 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:11.0320000Z","device_time":"2025-02-06T06:35:13.3913670Z"} +2025/02/06 01:35:14.404 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:12.0450000Z","device_time":"2025-02-06T06:35:14.4040630Z"} +2025/02/06 01:35:15.470 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:13.1110000Z","device_time":"2025-02-06T06:35:15.4698020Z"} +2025/02/06 01:35:16.553 19115 19146 Info Unity {"ntp_time":"2025-02-06T06:35:14.1940000Z","device_time":"2025-02-06T06:35:16.5531620Z"} diff --git a/python/evaluations/data/single_device/system_clock/pixel_6/run1-logcat.txt b/python/evaluations/data/single_device/system_clock/pixel_6/run1-logcat.txt new file mode 100644 index 0000000..538897d --- /dev/null +++ b/python/evaluations/data/single_device/system_clock/pixel_6/run1-logcat.txt @@ -0,0 +1,295 @@ +2025/02/06 00:35:47.130 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:47.1154750Z","device_time":"2025-02-06T05:35:47.1154750Z"} +2025/02/06 00:35:48.085 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:48.0848660Z","device_time":"2025-02-06T05:35:48.0848660Z"} +2025/02/06 00:35:49.110 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:49.1098920Z","device_time":"2025-02-06T05:35:49.1098920Z"} +2025/02/06 00:35:50.130 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:50.1301850Z","device_time":"2025-02-06T05:35:50.1301850Z"} +2025/02/06 00:35:51.144 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:51.1435980Z","device_time":"2025-02-06T05:35:51.1435990Z"} +2025/02/06 00:35:52.163 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:52.1627830Z","device_time":"2025-02-06T05:35:52.1627830Z"} +2025/02/06 00:35:53.212 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:53.2120970Z","device_time":"2025-02-06T05:35:53.2120970Z"} +2025/02/06 00:35:54.203 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:54.2026800Z","device_time":"2025-02-06T05:35:54.2026800Z"} +2025/02/06 00:35:55.229 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:55.2284740Z","device_time":"2025-02-06T05:35:55.2284740Z"} +2025/02/06 00:35:56.250 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:56.2497090Z","device_time":"2025-02-06T05:35:56.2497090Z"} +2025/02/06 00:35:57.303 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:57.3028210Z","device_time":"2025-02-06T05:35:57.3028210Z"} +2025/02/06 00:35:58.361 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:58.3612760Z","device_time":"2025-02-06T05:35:58.3612760Z"} +2025/02/06 00:35:59.380 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:35:59.3804020Z","device_time":"2025-02-06T05:35:59.3804030Z"} +2025/02/06 00:36:00.391 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:00.3906680Z","device_time":"2025-02-06T05:36:00.3906680Z"} +2025/02/06 00:36:01.430 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:01.4298960Z","device_time":"2025-02-06T05:36:01.4298960Z"} +2025/02/06 00:36:02.433 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:02.4329110Z","device_time":"2025-02-06T05:36:02.4329110Z"} +2025/02/06 00:36:03.472 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:03.4724190Z","device_time":"2025-02-06T05:36:03.4724190Z"} +2025/02/06 00:36:04.491 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:04.4904990Z","device_time":"2025-02-06T05:36:04.4904990Z"} +2025/02/06 00:36:05.510 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:05.5099860Z","device_time":"2025-02-06T05:36:05.5099860Z"} +2025/02/06 00:36:06.545 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:06.5452160Z","device_time":"2025-02-06T05:36:06.5452160Z"} +2025/02/06 00:36:07.555 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:07.5545900Z","device_time":"2025-02-06T05:36:07.5545910Z"} +2025/02/06 00:36:08.564 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:08.5638630Z","device_time":"2025-02-06T05:36:08.5638630Z"} +2025/02/06 00:36:09.578 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:09.5775300Z","device_time":"2025-02-06T05:36:09.5775300Z"} +2025/02/06 00:36:10.586 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:10.5856800Z","device_time":"2025-02-06T05:36:10.5856800Z"} +2025/02/06 00:36:11.605 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:11.6030970Z","device_time":"2025-02-06T05:36:11.6030970Z"} +2025/02/06 00:36:12.613 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:12.6129980Z","device_time":"2025-02-06T05:36:12.6129980Z"} +2025/02/06 00:36:13.650 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:13.6500000Z","device_time":"2025-02-06T05:36:13.6500000Z"} +2025/02/06 00:36:14.659 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:14.6587180Z","device_time":"2025-02-06T05:36:14.6587180Z"} +2025/02/06 00:36:15.669 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:15.6684990Z","device_time":"2025-02-06T05:36:15.6684990Z"} +2025/02/06 00:36:16.706 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:16.7057840Z","device_time":"2025-02-06T05:36:16.7057840Z"} +2025/02/06 00:36:17.716 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:17.7152810Z","device_time":"2025-02-06T05:36:17.7152810Z"} +2025/02/06 00:36:18.747 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:18.7472680Z","device_time":"2025-02-06T05:36:18.7472680Z"} +2025/02/06 00:36:19.765 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:19.7643850Z","device_time":"2025-02-06T05:36:19.7643860Z"} +2025/02/06 00:36:20.786 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:20.7862810Z","device_time":"2025-02-06T05:36:20.7862810Z"} +2025/02/06 00:36:21.824 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:21.8243730Z","device_time":"2025-02-06T05:36:21.8243730Z"} +2025/02/06 00:36:22.837 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:22.8374790Z","device_time":"2025-02-06T05:36:22.8374790Z"} +2025/02/06 00:36:23.862 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:23.8622680Z","device_time":"2025-02-06T05:36:23.8622680Z"} +2025/02/06 00:36:24.894 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:24.8943570Z","device_time":"2025-02-06T05:36:24.8943570Z"} +2025/02/06 00:36:25.872 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:25.8718750Z","device_time":"2025-02-06T05:36:25.8718750Z"} +2025/02/06 00:36:26.879 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:26.8792800Z","device_time":"2025-02-06T05:36:26.8792800Z"} +2025/02/06 00:36:27.898 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:27.8974810Z","device_time":"2025-02-06T05:36:27.8974810Z"} +2025/02/06 00:36:28.925 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:28.9248620Z","device_time":"2025-02-06T05:36:28.9248630Z"} +2025/02/06 00:36:29.961 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:29.9609810Z","device_time":"2025-02-06T05:36:29.9609810Z"} +2025/02/06 00:36:30.937 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:30.9368540Z","device_time":"2025-02-06T05:36:30.9368540Z"} +2025/02/06 00:36:31.964 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:31.9634490Z","device_time":"2025-02-06T05:36:31.9634500Z"} +2025/02/06 00:36:32.977 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:32.9771410Z","device_time":"2025-02-06T05:36:32.9771410Z"} +2025/02/06 00:36:33.984 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:33.9841600Z","device_time":"2025-02-06T05:36:33.9841600Z"} +2025/02/06 00:36:35.042 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:35.0413950Z","device_time":"2025-02-06T05:36:35.0413950Z"} +2025/02/06 00:36:36.032 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:36.0313860Z","device_time":"2025-02-06T05:36:36.0313870Z"} +2025/02/06 00:36:37.094 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:37.0931930Z","device_time":"2025-02-06T05:36:37.0931930Z"} +2025/02/06 00:36:38.108 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:38.1080760Z","device_time":"2025-02-06T05:36:38.1080760Z"} +2025/02/06 00:36:39.107 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:39.1061350Z","device_time":"2025-02-06T05:36:39.1061350Z"} +2025/02/06 00:36:40.111 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:40.1109310Z","device_time":"2025-02-06T05:36:40.1109310Z"} +2025/02/06 00:36:41.130 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:41.1298810Z","device_time":"2025-02-06T05:36:41.1298810Z"} +2025/02/06 00:36:42.148 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:42.1482740Z","device_time":"2025-02-06T05:36:42.1482740Z"} +2025/02/06 00:36:43.159 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:43.1588710Z","device_time":"2025-02-06T05:36:43.1588710Z"} +2025/02/06 00:36:44.163 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:44.1630370Z","device_time":"2025-02-06T05:36:44.1630370Z"} +2025/02/06 00:36:45.188 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:45.1877610Z","device_time":"2025-02-06T05:36:45.1877620Z"} +2025/02/06 00:36:46.198 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:46.1974640Z","device_time":"2025-02-06T05:36:46.1974640Z"} +2025/02/06 00:36:47.235 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:47.2354630Z","device_time":"2025-02-06T05:36:47.2354640Z"} +2025/02/06 00:36:48.239 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:48.2385020Z","device_time":"2025-02-06T05:36:48.2385030Z"} +2025/02/06 00:36:49.249 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:49.2490730Z","device_time":"2025-02-06T05:36:49.2490730Z"} +2025/02/06 00:36:50.269 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:50.2690260Z","device_time":"2025-02-06T05:36:50.2690260Z"} +2025/02/06 00:36:51.287 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:51.2860430Z","device_time":"2025-02-06T05:36:51.2860430Z"} +2025/02/06 00:36:52.292 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:52.2922340Z","device_time":"2025-02-06T05:36:52.2922340Z"} +2025/02/06 00:36:53.299 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:53.2993340Z","device_time":"2025-02-06T05:36:53.2993340Z"} +2025/02/06 00:36:54.319 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:54.3186360Z","device_time":"2025-02-06T05:36:54.3186360Z"} +2025/02/06 00:36:55.343 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:55.3424840Z","device_time":"2025-02-06T05:36:55.3424840Z"} +2025/02/06 00:36:56.374 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:56.3738680Z","device_time":"2025-02-06T05:36:56.3738690Z"} +2025/02/06 00:36:57.388 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:57.3875430Z","device_time":"2025-02-06T05:36:57.3875430Z"} +2025/02/06 00:36:58.404 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:58.4035020Z","device_time":"2025-02-06T05:36:58.4035020Z"} +2025/02/06 00:36:59.443 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:36:59.4419410Z","device_time":"2025-02-06T05:36:59.4419410Z"} +2025/02/06 00:37:00.447 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:00.4467850Z","device_time":"2025-02-06T05:37:00.4467850Z"} +2025/02/06 00:37:01.473 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:01.4723030Z","device_time":"2025-02-06T05:37:01.4723030Z"} +2025/02/06 00:37:02.504 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:02.5035030Z","device_time":"2025-02-06T05:37:02.5035030Z"} +2025/02/06 00:37:03.516 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:03.5156760Z","device_time":"2025-02-06T05:37:03.5156760Z"} +2025/02/06 00:37:04.544 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:04.5438340Z","device_time":"2025-02-06T05:37:04.5438340Z"} +2025/02/06 00:37:05.623 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:05.6231460Z","device_time":"2025-02-06T05:37:05.6231470Z"} +2025/02/06 00:37:06.627 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:06.6270470Z","device_time":"2025-02-06T05:37:06.6270470Z"} +2025/02/06 00:37:07.659 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:07.6586990Z","device_time":"2025-02-06T05:37:07.6586990Z"} +2025/02/06 00:37:08.686 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:08.6854150Z","device_time":"2025-02-06T05:37:08.6854150Z"} +2025/02/06 00:37:09.680 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:09.6797780Z","device_time":"2025-02-06T05:37:09.6797780Z"} +2025/02/06 00:37:10.712 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:10.7114850Z","device_time":"2025-02-06T05:37:10.7114860Z"} +2025/02/06 00:37:11.745 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:11.7446380Z","device_time":"2025-02-06T05:37:11.7446380Z"} +2025/02/06 00:37:12.763 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:12.7628990Z","device_time":"2025-02-06T05:37:12.7628990Z"} +2025/02/06 00:37:13.789 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:13.7892010Z","device_time":"2025-02-06T05:37:13.7892010Z"} +2025/02/06 00:37:14.865 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:14.8646210Z","device_time":"2025-02-06T05:37:14.8646210Z"} +2025/02/06 00:37:15.878 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:15.8776410Z","device_time":"2025-02-06T05:37:15.8776410Z"} +2025/02/06 00:37:16.900 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:16.8995550Z","device_time":"2025-02-06T05:37:16.8995550Z"} +2025/02/06 00:37:17.917 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:17.9171580Z","device_time":"2025-02-06T05:37:17.9171580Z"} +2025/02/06 00:37:18.939 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:18.9386390Z","device_time":"2025-02-06T05:37:18.9386400Z"} +2025/02/06 00:37:19.954 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:19.9538760Z","device_time":"2025-02-06T05:37:19.9538760Z"} +2025/02/06 00:37:20.957 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:20.9568130Z","device_time":"2025-02-06T05:37:20.9568140Z"} +2025/02/06 00:37:21.997 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:21.9966360Z","device_time":"2025-02-06T05:37:21.9966360Z"} +2025/02/06 00:37:23.028 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:23.0274020Z","device_time":"2025-02-06T05:37:23.0274020Z"} +2025/02/06 00:37:24.065 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:24.0653000Z","device_time":"2025-02-06T05:37:24.0653000Z"} +2025/02/06 00:37:25.070 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:25.0699800Z","device_time":"2025-02-06T05:37:25.0699800Z"} +2025/02/06 00:37:26.084 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:26.0835000Z","device_time":"2025-02-06T05:37:26.0835000Z"} +2025/02/06 00:37:27.090 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:27.0894470Z","device_time":"2025-02-06T05:37:27.0894470Z"} +2025/02/06 00:37:28.142 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:28.1416590Z","device_time":"2025-02-06T05:37:28.1416590Z"} +2025/02/06 00:37:29.141 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:29.1409500Z","device_time":"2025-02-06T05:37:29.1409510Z"} +2025/02/06 00:37:30.202 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:30.2019050Z","device_time":"2025-02-06T05:37:30.2019050Z"} +2025/02/06 00:37:31.177 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:31.1768150Z","device_time":"2025-02-06T05:37:31.1768150Z"} +2025/02/06 00:37:32.218 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:32.2177800Z","device_time":"2025-02-06T05:37:32.2177800Z"} +2025/02/06 00:37:33.322 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:33.3214560Z","device_time":"2025-02-06T05:37:33.3214560Z"} +2025/02/06 00:37:34.306 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:34.3054860Z","device_time":"2025-02-06T05:37:34.3054860Z"} +2025/02/06 00:37:35.345 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:35.3450450Z","device_time":"2025-02-06T05:37:35.3450450Z"} +2025/02/06 00:37:36.355 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:36.3548850Z","device_time":"2025-02-06T05:37:36.3548850Z"} +2025/02/06 00:37:37.386 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:37.3854680Z","device_time":"2025-02-06T05:37:37.3854680Z"} +2025/02/06 00:37:38.400 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:38.3998120Z","device_time":"2025-02-06T05:37:38.3998130Z"} +2025/02/06 00:37:39.441 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:39.4413160Z","device_time":"2025-02-06T05:37:39.4413160Z"} +2025/02/06 00:37:40.499 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:40.4991630Z","device_time":"2025-02-06T05:37:40.4991640Z"} +2025/02/06 00:37:41.506 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:41.5056880Z","device_time":"2025-02-06T05:37:41.5056880Z"} +2025/02/06 00:37:42.546 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:42.5460840Z","device_time":"2025-02-06T05:37:42.5460840Z"} +2025/02/06 00:37:43.564 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:43.5640700Z","device_time":"2025-02-06T05:37:43.5640710Z"} +2025/02/06 00:37:44.591 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:44.5908170Z","device_time":"2025-02-06T05:37:44.5908170Z"} +2025/02/06 00:37:45.594 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:45.5933470Z","device_time":"2025-02-06T05:37:45.5933470Z"} +2025/02/06 00:37:46.606 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:46.6056110Z","device_time":"2025-02-06T05:37:46.6056110Z"} +2025/02/06 00:37:47.615 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:47.6149190Z","device_time":"2025-02-06T05:37:47.6149190Z"} +2025/02/06 00:37:48.675 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:48.6746480Z","device_time":"2025-02-06T05:37:48.6746480Z"} +2025/02/06 00:37:49.696 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:49.6958040Z","device_time":"2025-02-06T05:37:49.6958040Z"} +2025/02/06 00:37:50.685 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:50.6851060Z","device_time":"2025-02-06T05:37:50.6851070Z"} +2025/02/06 00:37:51.719 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:51.7185020Z","device_time":"2025-02-06T05:37:51.7185020Z"} +2025/02/06 00:37:52.720 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:52.7192510Z","device_time":"2025-02-06T05:37:52.7192510Z"} +2025/02/06 00:37:53.758 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:53.7577580Z","device_time":"2025-02-06T05:37:53.7577580Z"} +2025/02/06 00:37:54.795 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:54.7947520Z","device_time":"2025-02-06T05:37:54.7947520Z"} +2025/02/06 00:37:55.836 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:55.8355730Z","device_time":"2025-02-06T05:37:55.8355730Z"} +2025/02/06 00:37:56.830 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:56.8297170Z","device_time":"2025-02-06T05:37:56.8297180Z"} +2025/02/06 00:37:57.868 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:57.8677060Z","device_time":"2025-02-06T05:37:57.8677060Z"} +2025/02/06 00:37:58.860 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:58.8563620Z","device_time":"2025-02-06T05:37:58.8563620Z"} +2025/02/06 00:37:59.855 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:37:59.8552140Z","device_time":"2025-02-06T05:37:59.8552140Z"} +2025/02/06 00:38:00.887 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:00.8868120Z","device_time":"2025-02-06T05:38:00.8868120Z"} +2025/02/06 00:38:01.913 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:01.9128940Z","device_time":"2025-02-06T05:38:01.9128940Z"} +2025/02/06 00:38:02.928 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:02.9274840Z","device_time":"2025-02-06T05:38:02.9274840Z"} +2025/02/06 00:38:03.983 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:03.9792610Z","device_time":"2025-02-06T05:38:03.9792610Z"} +2025/02/06 00:38:04.986 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:04.9842690Z","device_time":"2025-02-06T05:38:04.9842690Z"} +2025/02/06 00:38:06.005 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:06.0044330Z","device_time":"2025-02-06T05:38:06.0044330Z"} +2025/02/06 00:38:07.028 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:07.0274110Z","device_time":"2025-02-06T05:38:07.0274120Z"} +2025/02/06 00:38:08.054 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:08.0541830Z","device_time":"2025-02-06T05:38:08.0541830Z"} +2025/02/06 00:38:09.044 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:09.0437290Z","device_time":"2025-02-06T05:38:09.0437300Z"} +2025/02/06 00:38:10.072 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:10.0718130Z","device_time":"2025-02-06T05:38:10.0718130Z"} +2025/02/06 00:38:11.102 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:11.1022100Z","device_time":"2025-02-06T05:38:11.1022100Z"} +2025/02/06 00:38:12.136 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:12.1353370Z","device_time":"2025-02-06T05:38:12.1353370Z"} +2025/02/06 00:38:13.141 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:13.1407620Z","device_time":"2025-02-06T05:38:13.1407620Z"} +2025/02/06 00:38:14.170 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:14.1684140Z","device_time":"2025-02-06T05:38:14.1684140Z"} +2025/02/06 00:38:15.182 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:15.1815380Z","device_time":"2025-02-06T05:38:15.1815380Z"} +2025/02/06 00:38:16.200 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:16.1995080Z","device_time":"2025-02-06T05:38:16.1995080Z"} +2025/02/06 00:38:17.223 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:17.2229840Z","device_time":"2025-02-06T05:38:17.2229840Z"} +2025/02/06 00:38:18.257 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:18.2562500Z","device_time":"2025-02-06T05:38:18.2562500Z"} +2025/02/06 00:38:19.276 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:19.2757400Z","device_time":"2025-02-06T05:38:19.2757400Z"} +2025/02/06 00:38:20.281 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:20.2805700Z","device_time":"2025-02-06T05:38:20.2805700Z"} +2025/02/06 00:38:21.305 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:21.3051850Z","device_time":"2025-02-06T05:38:21.3051850Z"} +2025/02/06 00:38:22.299 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:22.2980490Z","device_time":"2025-02-06T05:38:22.2980490Z"} +2025/02/06 00:38:23.409 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:23.4037180Z","device_time":"2025-02-06T05:38:23.4037180Z"} +2025/02/06 00:38:24.381 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:24.3806720Z","device_time":"2025-02-06T05:38:24.3806720Z"} +2025/02/06 00:38:25.419 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:25.4168260Z","device_time":"2025-02-06T05:38:25.4168260Z"} +2025/02/06 00:38:26.438 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:26.4360860Z","device_time":"2025-02-06T05:38:26.4360860Z"} +2025/02/06 00:38:27.476 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:27.4748350Z","device_time":"2025-02-06T05:38:27.4748360Z"} +2025/02/06 00:38:28.515 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:28.5140880Z","device_time":"2025-02-06T05:38:28.5140880Z"} +2025/02/06 00:38:29.536 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:29.5352370Z","device_time":"2025-02-06T05:38:29.5352370Z"} +2025/02/06 00:38:30.568 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:30.5673080Z","device_time":"2025-02-06T05:38:30.5673080Z"} +2025/02/06 00:38:31.579 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:31.5783670Z","device_time":"2025-02-06T05:38:31.5783670Z"} +2025/02/06 00:38:32.609 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:32.6082490Z","device_time":"2025-02-06T05:38:32.6082490Z"} +2025/02/06 00:38:33.647 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:33.6468660Z","device_time":"2025-02-06T05:38:33.6468660Z"} +2025/02/06 00:38:34.699 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:34.6990290Z","device_time":"2025-02-06T05:38:34.6990290Z"} +2025/02/06 00:38:35.707 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:35.7063070Z","device_time":"2025-02-06T05:38:35.7063080Z"} +2025/02/06 00:38:36.731 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:36.7306190Z","device_time":"2025-02-06T05:38:36.7306190Z"} +2025/02/06 00:38:37.733 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:37.7318640Z","device_time":"2025-02-06T05:38:37.7318640Z"} +2025/02/06 00:38:38.769 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:38.7688510Z","device_time":"2025-02-06T05:38:38.7688510Z"} +2025/02/06 00:38:39.793 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:39.7930730Z","device_time":"2025-02-06T05:38:39.7930740Z"} +2025/02/06 00:38:40.804 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:40.8033020Z","device_time":"2025-02-06T05:38:40.8033020Z"} +2025/02/06 00:38:41.846 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:41.8396900Z","device_time":"2025-02-06T05:38:41.8396910Z"} +2025/02/06 00:38:42.879 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:42.8787530Z","device_time":"2025-02-06T05:38:42.8787530Z"} +2025/02/06 00:38:43.904 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:43.9039010Z","device_time":"2025-02-06T05:38:43.9039010Z"} +2025/02/06 00:38:44.972 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:44.9607040Z","device_time":"2025-02-06T05:38:44.9607040Z"} +2025/02/06 00:38:46.021 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:46.0209610Z","device_time":"2025-02-06T05:38:46.0209610Z"} +2025/02/06 00:38:47.080 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:47.0799440Z","device_time":"2025-02-06T05:38:47.0799450Z"} +2025/02/06 00:38:48.094 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:48.0936550Z","device_time":"2025-02-06T05:38:48.0936550Z"} +2025/02/06 00:38:49.119 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:49.1188240Z","device_time":"2025-02-06T05:38:49.1188240Z"} +2025/02/06 00:38:50.191 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:50.1902330Z","device_time":"2025-02-06T05:38:50.1902330Z"} +2025/02/06 00:38:51.230 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:51.2299760Z","device_time":"2025-02-06T05:38:51.2299770Z"} +2025/02/06 00:38:52.214 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:52.2135710Z","device_time":"2025-02-06T05:38:52.2135710Z"} +2025/02/06 00:38:53.240 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:53.2400690Z","device_time":"2025-02-06T05:38:53.2400690Z"} +2025/02/06 00:38:54.303 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:54.3023520Z","device_time":"2025-02-06T05:38:54.3023520Z"} +2025/02/06 00:38:55.328 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:55.3276010Z","device_time":"2025-02-06T05:38:55.3276010Z"} +2025/02/06 00:38:56.388 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:56.3819000Z","device_time":"2025-02-06T05:38:56.3819000Z"} +2025/02/06 00:38:57.401 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:57.4006850Z","device_time":"2025-02-06T05:38:57.4006850Z"} +2025/02/06 00:38:58.415 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:58.4145200Z","device_time":"2025-02-06T05:38:58.4145200Z"} +2025/02/06 00:38:59.478 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:38:59.4775530Z","device_time":"2025-02-06T05:38:59.4775530Z"} +2025/02/06 00:39:00.481 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:00.4809870Z","device_time":"2025-02-06T05:39:00.4809870Z"} +2025/02/06 00:39:01.528 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:01.5278830Z","device_time":"2025-02-06T05:39:01.5278830Z"} +2025/02/06 00:39:02.533 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:02.5326580Z","device_time":"2025-02-06T05:39:02.5326580Z"} +2025/02/06 00:39:03.550 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:03.5489110Z","device_time":"2025-02-06T05:39:03.5489110Z"} +2025/02/06 00:39:04.568 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:04.5678570Z","device_time":"2025-02-06T05:39:04.5678570Z"} +2025/02/06 00:39:05.590 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:05.5812680Z","device_time":"2025-02-06T05:39:05.5812690Z"} +2025/02/06 00:39:06.627 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:06.6267650Z","device_time":"2025-02-06T05:39:06.6267650Z"} +2025/02/06 00:39:07.654 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:07.6533950Z","device_time":"2025-02-06T05:39:07.6533950Z"} +2025/02/06 00:39:08.669 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:08.6689590Z","device_time":"2025-02-06T05:39:08.6689590Z"} +2025/02/06 00:39:09.676 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:09.6760560Z","device_time":"2025-02-06T05:39:09.6760560Z"} +2025/02/06 00:39:10.747 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:10.7463200Z","device_time":"2025-02-06T05:39:10.7463210Z"} +2025/02/06 00:39:11.754 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:11.7527430Z","device_time":"2025-02-06T05:39:11.7527430Z"} +2025/02/06 00:39:12.798 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:12.7976950Z","device_time":"2025-02-06T05:39:12.7976950Z"} +2025/02/06 00:39:13.814 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:13.8124290Z","device_time":"2025-02-06T05:39:13.8124290Z"} +2025/02/06 00:39:14.843 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:14.8400280Z","device_time":"2025-02-06T05:39:14.8400280Z"} +2025/02/06 00:39:15.848 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:15.8477870Z","device_time":"2025-02-06T05:39:15.8477880Z"} +2025/02/06 00:39:16.909 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:16.9081710Z","device_time":"2025-02-06T05:39:16.9081720Z"} +2025/02/06 00:39:17.926 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:17.9257560Z","device_time":"2025-02-06T05:39:17.9257560Z"} +2025/02/06 00:39:18.951 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:18.9511060Z","device_time":"2025-02-06T05:39:18.9511060Z"} +2025/02/06 00:39:19.987 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:19.9865010Z","device_time":"2025-02-06T05:39:19.9865020Z"} +2025/02/06 00:39:20.987 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:20.9862960Z","device_time":"2025-02-06T05:39:20.9862960Z"} +2025/02/06 00:39:22.034 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:22.0333340Z","device_time":"2025-02-06T05:39:22.0333350Z"} +2025/02/06 00:39:23.074 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:23.0704090Z","device_time":"2025-02-06T05:39:23.0704100Z"} +2025/02/06 00:39:24.115 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:24.1118150Z","device_time":"2025-02-06T05:39:24.1118160Z"} +2025/02/06 00:39:25.169 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:25.1685940Z","device_time":"2025-02-06T05:39:25.1685940Z"} +2025/02/06 00:39:26.235 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:26.2322010Z","device_time":"2025-02-06T05:39:26.2322010Z"} +2025/02/06 00:39:27.334 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:27.3326550Z","device_time":"2025-02-06T05:39:27.3326550Z"} +2025/02/06 00:39:28.316 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:28.3160130Z","device_time":"2025-02-06T05:39:28.3160130Z"} +2025/02/06 00:39:29.358 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:29.3577270Z","device_time":"2025-02-06T05:39:29.3577280Z"} +2025/02/06 00:39:30.381 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:30.3784370Z","device_time":"2025-02-06T05:39:30.3784370Z"} +2025/02/06 00:39:31.397 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:31.3971250Z","device_time":"2025-02-06T05:39:31.3971250Z"} +2025/02/06 00:39:32.403 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:32.4026070Z","device_time":"2025-02-06T05:39:32.4026080Z"} +2025/02/06 00:39:33.473 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:33.4724230Z","device_time":"2025-02-06T05:39:33.4724230Z"} +2025/02/06 00:39:34.504 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:34.5036330Z","device_time":"2025-02-06T05:39:34.5036330Z"} +2025/02/06 00:39:35.529 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:35.5270060Z","device_time":"2025-02-06T05:39:35.5270060Z"} +2025/02/06 00:39:36.520 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:36.5198350Z","device_time":"2025-02-06T05:39:36.5198350Z"} +2025/02/06 00:39:37.576 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:37.5760560Z","device_time":"2025-02-06T05:39:37.5760570Z"} +2025/02/06 00:39:38.606 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:38.6056540Z","device_time":"2025-02-06T05:39:38.6056540Z"} +2025/02/06 00:39:39.708 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:39.6950680Z","device_time":"2025-02-06T05:39:39.6950690Z"} +2025/02/06 00:39:40.641 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:40.6403650Z","device_time":"2025-02-06T05:39:40.6403650Z"} +2025/02/06 00:39:41.721 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:41.7199200Z","device_time":"2025-02-06T05:39:41.7199200Z"} +2025/02/06 00:39:42.771 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:42.7700660Z","device_time":"2025-02-06T05:39:42.7700660Z"} +2025/02/06 00:39:43.801 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:43.8008390Z","device_time":"2025-02-06T05:39:43.8008400Z"} +2025/02/06 00:39:44.839 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:44.8387800Z","device_time":"2025-02-06T05:39:44.8387800Z"} +2025/02/06 00:39:45.891 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:45.8898700Z","device_time":"2025-02-06T05:39:45.8898700Z"} +2025/02/06 00:39:46.890 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:46.8889870Z","device_time":"2025-02-06T05:39:46.8889870Z"} +2025/02/06 00:39:47.950 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:47.9498810Z","device_time":"2025-02-06T05:39:47.9498810Z"} +2025/02/06 00:39:48.993 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:48.9928570Z","device_time":"2025-02-06T05:39:48.9928580Z"} +2025/02/06 00:39:50.008 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:50.0076150Z","device_time":"2025-02-06T05:39:50.0076150Z"} +2025/02/06 00:39:51.031 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:51.0307340Z","device_time":"2025-02-06T05:39:51.0307340Z"} +2025/02/06 00:39:52.096 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:52.0879190Z","device_time":"2025-02-06T05:39:52.0879190Z"} +2025/02/06 00:39:53.077 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:53.0763860Z","device_time":"2025-02-06T05:39:53.0763870Z"} +2025/02/06 00:39:54.224 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:54.2151520Z","device_time":"2025-02-06T05:39:54.2151520Z"} +2025/02/06 00:39:55.190 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:55.1837640Z","device_time":"2025-02-06T05:39:55.1837650Z"} +2025/02/06 00:39:56.234 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:56.2337170Z","device_time":"2025-02-06T05:39:56.2337180Z"} +2025/02/06 00:39:57.234 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:57.2337040Z","device_time":"2025-02-06T05:39:57.2337040Z"} +2025/02/06 00:39:58.254 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:58.2539390Z","device_time":"2025-02-06T05:39:58.2539390Z"} +2025/02/06 00:39:59.278 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:39:59.2684360Z","device_time":"2025-02-06T05:39:59.2684360Z"} +2025/02/06 00:40:00.360 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:00.3601260Z","device_time":"2025-02-06T05:40:00.3601270Z"} +2025/02/06 00:40:01.354 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:01.3448000Z","device_time":"2025-02-06T05:40:01.3448000Z"} +2025/02/06 00:40:02.438 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:02.4375830Z","device_time":"2025-02-06T05:40:02.4375830Z"} +2025/02/06 00:40:03.435 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:03.4348530Z","device_time":"2025-02-06T05:40:03.4348530Z"} +2025/02/06 00:40:04.440 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:04.4396100Z","device_time":"2025-02-06T05:40:04.4396100Z"} +2025/02/06 00:40:05.476 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:05.4751270Z","device_time":"2025-02-06T05:40:05.4751270Z"} +2025/02/06 00:40:06.508 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:06.5062470Z","device_time":"2025-02-06T05:40:06.5062470Z"} +2025/02/06 00:40:07.548 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:07.5472410Z","device_time":"2025-02-06T05:40:07.5472410Z"} +2025/02/06 00:40:08.574 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:08.5727730Z","device_time":"2025-02-06T05:40:08.5727730Z"} +2025/02/06 00:40:09.573 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:09.5720740Z","device_time":"2025-02-06T05:40:09.5720740Z"} +2025/02/06 00:40:10.634 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:10.6342310Z","device_time":"2025-02-06T05:40:10.6342310Z"} +2025/02/06 00:40:11.707 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:11.7009110Z","device_time":"2025-02-06T05:40:11.7009110Z"} +2025/02/06 00:40:12.726 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:12.7256550Z","device_time":"2025-02-06T05:40:12.7256550Z"} +2025/02/06 00:40:13.734 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:13.7328820Z","device_time":"2025-02-06T05:40:13.7328830Z"} +2025/02/06 00:40:14.751 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:14.7481040Z","device_time":"2025-02-06T05:40:14.7481040Z"} +2025/02/06 00:40:15.787 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:15.7866470Z","device_time":"2025-02-06T05:40:15.7866480Z"} +2025/02/06 00:40:16.786 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:16.7854940Z","device_time":"2025-02-06T05:40:16.7854940Z"} +2025/02/06 00:40:17.864 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:17.8348090Z","device_time":"2025-02-06T05:40:17.8348090Z"} +2025/02/06 00:40:18.853 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:18.8527730Z","device_time":"2025-02-06T05:40:18.8527730Z"} +2025/02/06 00:40:19.873 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:19.8725310Z","device_time":"2025-02-06T05:40:19.8725310Z"} +2025/02/06 00:40:20.880 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:20.8794490Z","device_time":"2025-02-06T05:40:20.8794490Z"} +2025/02/06 00:40:21.918 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:21.9172400Z","device_time":"2025-02-06T05:40:21.9172400Z"} +2025/02/06 00:40:22.956 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:22.9557750Z","device_time":"2025-02-06T05:40:22.9557750Z"} +2025/02/06 00:40:23.969 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:23.9686790Z","device_time":"2025-02-06T05:40:23.9686800Z"} +2025/02/06 00:40:24.997 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:24.9965570Z","device_time":"2025-02-06T05:40:24.9965570Z"} +2025/02/06 00:40:26.006 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:26.0053250Z","device_time":"2025-02-06T05:40:26.0053250Z"} +2025/02/06 00:40:27.026 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:27.0257860Z","device_time":"2025-02-06T05:40:27.0257860Z"} +2025/02/06 00:40:28.059 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:28.0583920Z","device_time":"2025-02-06T05:40:28.0583920Z"} +2025/02/06 00:40:29.072 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:29.0687970Z","device_time":"2025-02-06T05:40:29.0687970Z"} +2025/02/06 00:40:30.143 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:30.1424960Z","device_time":"2025-02-06T05:40:30.1424960Z"} +2025/02/06 00:40:31.089 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:31.0889160Z","device_time":"2025-02-06T05:40:31.0889170Z"} +2025/02/06 00:40:32.146 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:32.1452820Z","device_time":"2025-02-06T05:40:32.1452820Z"} +2025/02/06 00:40:33.111 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:33.1103910Z","device_time":"2025-02-06T05:40:33.1103910Z"} +2025/02/06 00:40:34.189 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:34.1890770Z","device_time":"2025-02-06T05:40:34.1890770Z"} +2025/02/06 00:40:35.188 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:35.1871730Z","device_time":"2025-02-06T05:40:35.1871730Z"} +2025/02/06 00:40:36.216 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:36.2125870Z","device_time":"2025-02-06T05:40:36.2125870Z"} +2025/02/06 00:40:37.250 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:37.2469080Z","device_time":"2025-02-06T05:40:37.2469080Z"} +2025/02/06 00:40:38.272 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:38.2718060Z","device_time":"2025-02-06T05:40:38.2718060Z"} +2025/02/06 00:40:39.311 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:39.3109270Z","device_time":"2025-02-06T05:40:39.3109270Z"} +2025/02/06 00:40:40.368 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:40.3673290Z","device_time":"2025-02-06T05:40:40.3673290Z"} +2025/02/06 00:40:41.431 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:41.4182360Z","device_time":"2025-02-06T05:40:41.4182360Z"} +2025/02/06 00:40:42.414 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:42.4134110Z","device_time":"2025-02-06T05:40:42.4134110Z"} +2025/02/06 00:40:43.449 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:43.4482150Z","device_time":"2025-02-06T05:40:43.4482150Z"} +2025/02/06 00:40:44.469 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:44.4502450Z","device_time":"2025-02-06T05:40:44.4502450Z"} +2025/02/06 00:40:45.517 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:45.5164770Z","device_time":"2025-02-06T05:40:45.5164770Z"} +2025/02/06 00:40:46.577 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:46.5771920Z","device_time":"2025-02-06T05:40:46.5771920Z"} +2025/02/06 00:40:47.664 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:47.6636690Z","device_time":"2025-02-06T05:40:47.6636700Z"} +2025/02/06 00:40:48.776 12059 12077 Info Unity {"ntp_time":"2025-02-06T05:40:48.7544210Z","device_time":"2025-02-06T05:40:48.7544210Z"} diff --git a/python/evaluations/data/single_device/system_clock/pixel_6/run2-logcat.txt b/python/evaluations/data/single_device/system_clock/pixel_6/run2-logcat.txt new file mode 100644 index 0000000..89c23e7 --- /dev/null +++ b/python/evaluations/data/single_device/system_clock/pixel_6/run2-logcat.txt @@ -0,0 +1,290 @@ +2025/02/06 00:41:50.303 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:50.3017710Z","device_time":"2025-02-06T05:41:50.3017710Z"} +2025/02/06 00:41:51.290 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:51.2901460Z","device_time":"2025-02-06T05:41:51.2901460Z"} +2025/02/06 00:41:52.308 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:52.3077950Z","device_time":"2025-02-06T05:41:52.3077950Z"} +2025/02/06 00:41:53.370 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:53.3700740Z","device_time":"2025-02-06T05:41:53.3700740Z"} +2025/02/06 00:41:54.402 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:54.3962540Z","device_time":"2025-02-06T05:41:54.3962550Z"} +2025/02/06 00:41:55.411 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:55.4107380Z","device_time":"2025-02-06T05:41:55.4107380Z"} +2025/02/06 00:41:56.464 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:56.4637510Z","device_time":"2025-02-06T05:41:56.4637510Z"} +2025/02/06 00:41:57.496 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:57.4958470Z","device_time":"2025-02-06T05:41:57.4958470Z"} +2025/02/06 00:41:58.544 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:58.5436000Z","device_time":"2025-02-06T05:41:58.5436000Z"} +2025/02/06 00:41:59.565 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:41:59.5650470Z","device_time":"2025-02-06T05:41:59.5650470Z"} +2025/02/06 00:42:00.608 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:00.6079670Z","device_time":"2025-02-06T05:42:00.6079670Z"} +2025/02/06 00:42:01.668 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:01.6667630Z","device_time":"2025-02-06T05:42:01.6667630Z"} +2025/02/06 00:42:02.633 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:02.6324420Z","device_time":"2025-02-06T05:42:02.6324420Z"} +2025/02/06 00:42:03.652 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:03.6514540Z","device_time":"2025-02-06T05:42:03.6514540Z"} +2025/02/06 00:42:04.686 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:04.6853900Z","device_time":"2025-02-06T05:42:04.6853900Z"} +2025/02/06 00:42:05.695 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:05.6947630Z","device_time":"2025-02-06T05:42:05.6947630Z"} +2025/02/06 00:42:06.721 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:06.7208450Z","device_time":"2025-02-06T05:42:06.7208450Z"} +2025/02/06 00:42:07.741 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:07.7405160Z","device_time":"2025-02-06T05:42:07.7405160Z"} +2025/02/06 00:42:08.752 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:08.7516080Z","device_time":"2025-02-06T05:42:08.7516080Z"} +2025/02/06 00:42:09.774 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:09.7741440Z","device_time":"2025-02-06T05:42:09.7741440Z"} +2025/02/06 00:42:10.779 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:10.7785380Z","device_time":"2025-02-06T05:42:10.7785380Z"} +2025/02/06 00:42:11.824 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:11.8225430Z","device_time":"2025-02-06T05:42:11.8225430Z"} +2025/02/06 00:42:12.840 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:12.8391180Z","device_time":"2025-02-06T05:42:12.8391180Z"} +2025/02/06 00:42:13.866 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:13.8655830Z","device_time":"2025-02-06T05:42:13.8655830Z"} +2025/02/06 00:42:14.884 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:14.8840420Z","device_time":"2025-02-06T05:42:14.8840420Z"} +2025/02/06 00:42:15.909 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:15.9092450Z","device_time":"2025-02-06T05:42:15.9092450Z"} +2025/02/06 00:42:16.949 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:16.9487810Z","device_time":"2025-02-06T05:42:16.9487820Z"} +2025/02/06 00:42:17.988 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:17.9879050Z","device_time":"2025-02-06T05:42:17.9879060Z"} +2025/02/06 00:42:18.993 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:18.9926790Z","device_time":"2025-02-06T05:42:18.9926790Z"} +2025/02/06 00:42:19.989 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:19.9889440Z","device_time":"2025-02-06T05:42:19.9889440Z"} +2025/02/06 00:42:21.021 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:21.0204420Z","device_time":"2025-02-06T05:42:21.0204430Z"} +2025/02/06 00:42:22.090 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:22.0899710Z","device_time":"2025-02-06T05:42:22.0899710Z"} +2025/02/06 00:42:23.103 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:23.1024770Z","device_time":"2025-02-06T05:42:23.1024770Z"} +2025/02/06 00:42:24.119 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:24.1189440Z","device_time":"2025-02-06T05:42:24.1189440Z"} +2025/02/06 00:42:25.148 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:25.1481980Z","device_time":"2025-02-06T05:42:25.1481980Z"} +2025/02/06 00:42:26.185 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:26.1849660Z","device_time":"2025-02-06T05:42:26.1849670Z"} +2025/02/06 00:42:27.239 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:27.2388960Z","device_time":"2025-02-06T05:42:27.2388960Z"} +2025/02/06 00:42:28.265 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:28.2646830Z","device_time":"2025-02-06T05:42:28.2646830Z"} +2025/02/06 00:42:29.264 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:29.2639790Z","device_time":"2025-02-06T05:42:29.2639790Z"} +2025/02/06 00:42:30.313 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:30.3125500Z","device_time":"2025-02-06T05:42:30.3125500Z"} +2025/02/06 00:42:31.315 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:31.3146490Z","device_time":"2025-02-06T05:42:31.3146490Z"} +2025/02/06 00:42:32.338 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:32.3376960Z","device_time":"2025-02-06T05:42:32.3376960Z"} +2025/02/06 00:42:33.366 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:33.3638620Z","device_time":"2025-02-06T05:42:33.3638620Z"} +2025/02/06 00:42:34.377 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:34.3771810Z","device_time":"2025-02-06T05:42:34.3771810Z"} +2025/02/06 00:42:35.380 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:35.3800980Z","device_time":"2025-02-06T05:42:35.3800980Z"} +2025/02/06 00:42:36.390 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:36.3898630Z","device_time":"2025-02-06T05:42:36.3898630Z"} +2025/02/06 00:42:37.406 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:37.4058200Z","device_time":"2025-02-06T05:42:37.4058200Z"} +2025/02/06 00:42:38.441 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:38.4410240Z","device_time":"2025-02-06T05:42:38.4410250Z"} +2025/02/06 00:42:39.493 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:39.4925330Z","device_time":"2025-02-06T05:42:39.4925330Z"} +2025/02/06 00:42:40.482 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:40.4812130Z","device_time":"2025-02-06T05:42:40.4812130Z"} +2025/02/06 00:42:41.538 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:41.5371570Z","device_time":"2025-02-06T05:42:41.5371580Z"} +2025/02/06 00:42:42.581 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:42.5804300Z","device_time":"2025-02-06T05:42:42.5804300Z"} +2025/02/06 00:42:43.644 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:43.6434410Z","device_time":"2025-02-06T05:42:43.6434410Z"} +2025/02/06 00:42:44.658 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:44.6580820Z","device_time":"2025-02-06T05:42:44.6580820Z"} +2025/02/06 00:42:45.709 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:45.7090330Z","device_time":"2025-02-06T05:42:45.7090330Z"} +2025/02/06 00:42:46.697 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:46.6966790Z","device_time":"2025-02-06T05:42:46.6966790Z"} +2025/02/06 00:42:47.735 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:47.7347640Z","device_time":"2025-02-06T05:42:47.7347640Z"} +2025/02/06 00:42:48.745 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:48.7444220Z","device_time":"2025-02-06T05:42:48.7444220Z"} +2025/02/06 00:42:49.814 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:49.8138060Z","device_time":"2025-02-06T05:42:49.8138060Z"} +2025/02/06 00:42:50.851 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:50.8503820Z","device_time":"2025-02-06T05:42:50.8503820Z"} +2025/02/06 00:42:51.934 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:51.9339630Z","device_time":"2025-02-06T05:42:51.9339640Z"} +2025/02/06 00:42:52.910 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:52.9090770Z","device_time":"2025-02-06T05:42:52.9090770Z"} +2025/02/06 00:42:53.949 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:53.9487050Z","device_time":"2025-02-06T05:42:53.9487050Z"} +2025/02/06 00:42:54.985 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:54.9848400Z","device_time":"2025-02-06T05:42:54.9848400Z"} +2025/02/06 00:42:56.056 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:56.0555680Z","device_time":"2025-02-06T05:42:56.0555680Z"} +2025/02/06 00:42:57.066 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:57.0634050Z","device_time":"2025-02-06T05:42:57.0634050Z"} +2025/02/06 00:42:58.113 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:58.1124250Z","device_time":"2025-02-06T05:42:58.1124260Z"} +2025/02/06 00:42:59.175 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:42:59.1750440Z","device_time":"2025-02-06T05:42:59.1750440Z"} +2025/02/06 00:43:00.200 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:00.2002300Z","device_time":"2025-02-06T05:43:00.2002310Z"} +2025/02/06 00:43:01.232 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:01.2304000Z","device_time":"2025-02-06T05:43:01.2304000Z"} +2025/02/06 00:43:02.297 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:02.2645750Z","device_time":"2025-02-06T05:43:02.2645750Z"} +2025/02/06 00:43:03.300 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:03.3002460Z","device_time":"2025-02-06T05:43:03.3002460Z"} +2025/02/06 00:43:04.302 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:04.2996670Z","device_time":"2025-02-06T05:43:04.2996670Z"} +2025/02/06 00:43:05.329 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:05.3290990Z","device_time":"2025-02-06T05:43:05.3291000Z"} +2025/02/06 00:43:06.331 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:06.3289440Z","device_time":"2025-02-06T05:43:06.3289450Z"} +2025/02/06 00:43:07.353 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:07.3526960Z","device_time":"2025-02-06T05:43:07.3526960Z"} +2025/02/06 00:43:08.368 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:08.3676700Z","device_time":"2025-02-06T05:43:08.3676700Z"} +2025/02/06 00:43:09.385 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:09.3842480Z","device_time":"2025-02-06T05:43:09.3842480Z"} +2025/02/06 00:43:10.406 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:10.3926920Z","device_time":"2025-02-06T05:43:10.3926920Z"} +2025/02/06 00:43:11.465 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:11.4624200Z","device_time":"2025-02-06T05:43:11.4624200Z"} +2025/02/06 00:43:12.463 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:12.4627220Z","device_time":"2025-02-06T05:43:12.4627230Z"} +2025/02/06 00:43:13.548 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:13.5368120Z","device_time":"2025-02-06T05:43:13.5368120Z"} +2025/02/06 00:43:14.476 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:14.4753880Z","device_time":"2025-02-06T05:43:14.4753880Z"} +2025/02/06 00:43:15.540 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:15.5308020Z","device_time":"2025-02-06T05:43:15.5308020Z"} +2025/02/06 00:43:16.588 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:16.5871720Z","device_time":"2025-02-06T05:43:16.5871720Z"} +2025/02/06 00:43:17.515 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:17.5150080Z","device_time":"2025-02-06T05:43:17.5150080Z"} +2025/02/06 00:43:18.570 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:18.5699440Z","device_time":"2025-02-06T05:43:18.5699440Z"} +2025/02/06 00:43:19.564 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:19.5632640Z","device_time":"2025-02-06T05:43:19.5632640Z"} +2025/02/06 00:43:20.619 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:20.6145360Z","device_time":"2025-02-06T05:43:20.6145360Z"} +2025/02/06 00:43:21.647 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:21.6466330Z","device_time":"2025-02-06T05:43:21.6466330Z"} +2025/02/06 00:43:22.687 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:22.6864290Z","device_time":"2025-02-06T05:43:22.6864290Z"} +2025/02/06 00:43:23.714 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:23.7137540Z","device_time":"2025-02-06T05:43:23.7137540Z"} +2025/02/06 00:43:24.767 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:24.7572530Z","device_time":"2025-02-06T05:43:24.7572530Z"} +2025/02/06 00:43:25.745 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:25.7443000Z","device_time":"2025-02-06T05:43:25.7443000Z"} +2025/02/06 00:43:26.767 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:26.7670280Z","device_time":"2025-02-06T05:43:26.7670280Z"} +2025/02/06 00:43:27.870 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:27.8693820Z","device_time":"2025-02-06T05:43:27.8693820Z"} +2025/02/06 00:43:28.894 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:28.8934440Z","device_time":"2025-02-06T05:43:28.8934440Z"} +2025/02/06 00:43:29.978 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:29.9765970Z","device_time":"2025-02-06T05:43:29.9765970Z"} +2025/02/06 00:43:30.990 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:30.9898730Z","device_time":"2025-02-06T05:43:30.9898730Z"} +2025/02/06 00:43:32.060 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:32.0595600Z","device_time":"2025-02-06T05:43:32.0595600Z"} +2025/02/06 00:43:33.063 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:33.0629980Z","device_time":"2025-02-06T05:43:33.0629980Z"} +2025/02/06 00:43:34.152 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:34.1510020Z","device_time":"2025-02-06T05:43:34.1510030Z"} +2025/02/06 00:43:35.185 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:35.1841120Z","device_time":"2025-02-06T05:43:35.1841130Z"} +2025/02/06 00:43:36.196 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:36.1951190Z","device_time":"2025-02-06T05:43:36.1951190Z"} +2025/02/06 00:43:37.248 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:37.2428570Z","device_time":"2025-02-06T05:43:37.2428570Z"} +2025/02/06 00:43:38.261 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:38.2607310Z","device_time":"2025-02-06T05:43:38.2607310Z"} +2025/02/06 00:43:39.301 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:39.3005690Z","device_time":"2025-02-06T05:43:39.3005690Z"} +2025/02/06 00:43:40.319 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:40.3190920Z","device_time":"2025-02-06T05:43:40.3190930Z"} +2025/02/06 00:43:41.322 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:41.3217800Z","device_time":"2025-02-06T05:43:41.3217800Z"} +2025/02/06 00:43:42.375 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:42.3744940Z","device_time":"2025-02-06T05:43:42.3744940Z"} +2025/02/06 00:43:43.415 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:43.4144370Z","device_time":"2025-02-06T05:43:43.4144380Z"} +2025/02/06 00:43:44.438 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:44.4325000Z","device_time":"2025-02-06T05:43:44.4325000Z"} +2025/02/06 00:43:45.483 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:45.4823300Z","device_time":"2025-02-06T05:43:45.4823300Z"} +2025/02/06 00:43:46.501 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:46.5008120Z","device_time":"2025-02-06T05:43:46.5008120Z"} +2025/02/06 00:43:47.479 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:47.4791150Z","device_time":"2025-02-06T05:43:47.4791150Z"} +2025/02/06 00:43:48.542 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:48.5416280Z","device_time":"2025-02-06T05:43:48.5416290Z"} +2025/02/06 00:43:49.531 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:49.5306020Z","device_time":"2025-02-06T05:43:49.5306020Z"} +2025/02/06 00:43:50.555 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:50.5545420Z","device_time":"2025-02-06T05:43:50.5545420Z"} +2025/02/06 00:43:51.620 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:51.6195960Z","device_time":"2025-02-06T05:43:51.6195960Z"} +2025/02/06 00:43:52.634 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:52.6331350Z","device_time":"2025-02-06T05:43:52.6331360Z"} +2025/02/06 00:43:53.648 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:53.6471670Z","device_time":"2025-02-06T05:43:53.6471680Z"} +2025/02/06 00:43:54.674 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:54.6734490Z","device_time":"2025-02-06T05:43:54.6734500Z"} +2025/02/06 00:43:55.693 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:55.6926360Z","device_time":"2025-02-06T05:43:55.6926360Z"} +2025/02/06 00:43:56.728 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:56.7282080Z","device_time":"2025-02-06T05:43:56.7282090Z"} +2025/02/06 00:43:57.746 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:57.7454370Z","device_time":"2025-02-06T05:43:57.7454380Z"} +2025/02/06 00:43:58.783 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:58.7828770Z","device_time":"2025-02-06T05:43:58.7828770Z"} +2025/02/06 00:43:59.818 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:43:59.8177830Z","device_time":"2025-02-06T05:43:59.8177840Z"} +2025/02/06 00:44:00.867 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:00.8639620Z","device_time":"2025-02-06T05:44:00.8639620Z"} +2025/02/06 00:44:01.889 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:01.8884600Z","device_time":"2025-02-06T05:44:01.8884600Z"} +2025/02/06 00:44:02.894 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:02.8937690Z","device_time":"2025-02-06T05:44:02.8937690Z"} +2025/02/06 00:44:03.929 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:03.9281230Z","device_time":"2025-02-06T05:44:03.9281230Z"} +2025/02/06 00:44:04.965 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:04.9495920Z","device_time":"2025-02-06T05:44:04.9495930Z"} +2025/02/06 00:44:05.989 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:05.9884910Z","device_time":"2025-02-06T05:44:05.9884910Z"} +2025/02/06 00:44:07.004 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:07.0031220Z","device_time":"2025-02-06T05:44:07.0031220Z"} +2025/02/06 00:44:08.045 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:08.0444940Z","device_time":"2025-02-06T05:44:08.0444940Z"} +2025/02/06 00:44:09.064 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:09.0632430Z","device_time":"2025-02-06T05:44:09.0632440Z"} +2025/02/06 00:44:10.102 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:10.1014620Z","device_time":"2025-02-06T05:44:10.1014620Z"} +2025/02/06 00:44:11.105 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:11.1018900Z","device_time":"2025-02-06T05:44:11.1018900Z"} +2025/02/06 00:44:12.195 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:12.1946460Z","device_time":"2025-02-06T05:44:12.1946460Z"} +2025/02/06 00:44:13.241 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:13.2407650Z","device_time":"2025-02-06T05:44:13.2407650Z"} +2025/02/06 00:44:14.298 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:14.2969330Z","device_time":"2025-02-06T05:44:14.2969340Z"} +2025/02/06 00:44:15.292 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:15.2920040Z","device_time":"2025-02-06T05:44:15.2920040Z"} +2025/02/06 00:44:16.349 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:16.3470400Z","device_time":"2025-02-06T05:44:16.3470400Z"} +2025/02/06 00:44:17.354 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:17.3542880Z","device_time":"2025-02-06T05:44:17.3542880Z"} +2025/02/06 00:44:18.379 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:18.3790580Z","device_time":"2025-02-06T05:44:18.3790590Z"} +2025/02/06 00:44:19.453 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:19.4531130Z","device_time":"2025-02-06T05:44:19.4531130Z"} +2025/02/06 00:44:20.463 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:20.4594670Z","device_time":"2025-02-06T05:44:20.4594670Z"} +2025/02/06 00:44:21.472 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:21.4705470Z","device_time":"2025-02-06T05:44:21.4705470Z"} +2025/02/06 00:44:22.510 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:22.5070410Z","device_time":"2025-02-06T05:44:22.5070410Z"} +2025/02/06 00:44:23.569 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:23.5685410Z","device_time":"2025-02-06T05:44:23.5685410Z"} +2025/02/06 00:44:24.593 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:24.5930140Z","device_time":"2025-02-06T05:44:24.5930140Z"} +2025/02/06 00:44:25.675 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:25.6740390Z","device_time":"2025-02-06T05:44:25.6740390Z"} +2025/02/06 00:44:26.672 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:26.6719630Z","device_time":"2025-02-06T05:44:26.6719630Z"} +2025/02/06 00:44:27.701 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:27.7008880Z","device_time":"2025-02-06T05:44:27.7008880Z"} +2025/02/06 00:44:28.755 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:28.7538400Z","device_time":"2025-02-06T05:44:28.7538400Z"} +2025/02/06 00:44:29.737 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:29.7363740Z","device_time":"2025-02-06T05:44:29.7363740Z"} +2025/02/06 00:44:30.789 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:30.7890030Z","device_time":"2025-02-06T05:44:30.7890030Z"} +2025/02/06 00:44:31.799 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:31.7983990Z","device_time":"2025-02-06T05:44:31.7983990Z"} +2025/02/06 00:44:32.877 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:32.8688190Z","device_time":"2025-02-06T05:44:32.8688190Z"} +2025/02/06 00:44:33.875 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:33.8747480Z","device_time":"2025-02-06T05:44:33.8747490Z"} +2025/02/06 00:44:34.884 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:34.8833310Z","device_time":"2025-02-06T05:44:34.8833310Z"} +2025/02/06 00:44:35.913 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:35.9124160Z","device_time":"2025-02-06T05:44:35.9124160Z"} +2025/02/06 00:44:36.917 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:36.9172210Z","device_time":"2025-02-06T05:44:36.9172210Z"} +2025/02/06 00:44:37.965 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:37.9643850Z","device_time":"2025-02-06T05:44:37.9643860Z"} +2025/02/06 00:44:39.139 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:39.1390400Z","device_time":"2025-02-06T05:44:39.1390400Z"} +2025/02/06 00:44:40.186 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:40.1860620Z","device_time":"2025-02-06T05:44:40.1860620Z"} +2025/02/06 00:44:41.285 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:41.2846310Z","device_time":"2025-02-06T05:44:41.2846310Z"} +2025/02/06 00:44:42.304 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:42.3034240Z","device_time":"2025-02-06T05:44:42.3034240Z"} +2025/02/06 00:44:43.289 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:43.2827660Z","device_time":"2025-02-06T05:44:43.2827660Z"} +2025/02/06 00:44:44.363 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:44.3625450Z","device_time":"2025-02-06T05:44:44.3625450Z"} +2025/02/06 00:44:45.431 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:45.4258980Z","device_time":"2025-02-06T05:44:45.4258990Z"} +2025/02/06 00:44:46.458 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:46.4574170Z","device_time":"2025-02-06T05:44:46.4574170Z"} +2025/02/06 00:44:47.445 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:47.4446940Z","device_time":"2025-02-06T05:44:47.4446940Z"} +2025/02/06 00:44:48.473 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:48.4722700Z","device_time":"2025-02-06T05:44:48.4722700Z"} +2025/02/06 00:44:49.490 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:49.4897370Z","device_time":"2025-02-06T05:44:49.4897380Z"} +2025/02/06 00:44:50.539 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:50.5390520Z","device_time":"2025-02-06T05:44:50.5390520Z"} +2025/02/06 00:44:51.544 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:51.5439440Z","device_time":"2025-02-06T05:44:51.5439440Z"} +2025/02/06 00:44:52.556 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:52.5555340Z","device_time":"2025-02-06T05:44:52.5555350Z"} +2025/02/06 00:44:53.596 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:53.5959870Z","device_time":"2025-02-06T05:44:53.5959870Z"} +2025/02/06 00:44:54.660 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:54.6595280Z","device_time":"2025-02-06T05:44:54.6595280Z"} +2025/02/06 00:44:55.600 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:55.5999710Z","device_time":"2025-02-06T05:44:55.5999710Z"} +2025/02/06 00:44:56.615 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:56.6145700Z","device_time":"2025-02-06T05:44:56.6145710Z"} +2025/02/06 00:44:57.650 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:57.6492990Z","device_time":"2025-02-06T05:44:57.6492990Z"} +2025/02/06 00:44:58.674 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:58.6739520Z","device_time":"2025-02-06T05:44:58.6739520Z"} +2025/02/06 00:44:59.677 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:44:59.6766400Z","device_time":"2025-02-06T05:44:59.6766400Z"} +2025/02/06 00:45:00.724 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:00.7231570Z","device_time":"2025-02-06T05:45:00.7231570Z"} +2025/02/06 00:45:01.745 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:01.7451970Z","device_time":"2025-02-06T05:45:01.7451980Z"} +2025/02/06 00:45:02.832 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:02.8309050Z","device_time":"2025-02-06T05:45:02.8309050Z"} +2025/02/06 00:45:03.853 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:03.8521920Z","device_time":"2025-02-06T05:45:03.8521920Z"} +2025/02/06 00:45:04.853 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:04.8532380Z","device_time":"2025-02-06T05:45:04.8532380Z"} +2025/02/06 00:45:05.894 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:05.8934270Z","device_time":"2025-02-06T05:45:05.8934270Z"} +2025/02/06 00:45:06.911 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:06.9101400Z","device_time":"2025-02-06T05:45:06.9101400Z"} +2025/02/06 00:45:07.928 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:07.9242270Z","device_time":"2025-02-06T05:45:07.9242270Z"} +2025/02/06 00:45:08.932 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:08.9312420Z","device_time":"2025-02-06T05:45:08.9312420Z"} +2025/02/06 00:45:09.984 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:09.9838210Z","device_time":"2025-02-06T05:45:09.9838210Z"} +2025/02/06 00:45:11.090 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:11.0894320Z","device_time":"2025-02-06T05:45:11.0894320Z"} +2025/02/06 00:45:12.030 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:12.0296250Z","device_time":"2025-02-06T05:45:12.0296250Z"} +2025/02/06 00:45:13.144 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:13.1246360Z","device_time":"2025-02-06T05:45:13.1246370Z"} +2025/02/06 00:45:14.098 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:14.0979550Z","device_time":"2025-02-06T05:45:14.0979550Z"} +2025/02/06 00:45:15.130 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:15.1292830Z","device_time":"2025-02-06T05:45:15.1292830Z"} +2025/02/06 00:45:16.179 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:16.1787340Z","device_time":"2025-02-06T05:45:16.1787340Z"} +2025/02/06 00:45:17.180 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:17.1793370Z","device_time":"2025-02-06T05:45:17.1793370Z"} +2025/02/06 00:45:18.222 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:18.2220000Z","device_time":"2025-02-06T05:45:18.2220000Z"} +2025/02/06 00:45:19.242 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:19.2415190Z","device_time":"2025-02-06T05:45:19.2415190Z"} +2025/02/06 00:45:20.349 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:20.3483620Z","device_time":"2025-02-06T05:45:20.3483620Z"} +2025/02/06 00:45:21.375 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:21.3741960Z","device_time":"2025-02-06T05:45:21.3741970Z"} +2025/02/06 00:45:22.376 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:22.3748710Z","device_time":"2025-02-06T05:45:22.3748710Z"} +2025/02/06 00:45:23.424 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:23.4238630Z","device_time":"2025-02-06T05:45:23.4238630Z"} +2025/02/06 00:45:24.443 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:24.4422560Z","device_time":"2025-02-06T05:45:24.4422560Z"} +2025/02/06 00:45:25.450 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:25.4499300Z","device_time":"2025-02-06T05:45:25.4499310Z"} +2025/02/06 00:45:26.486 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:26.4855840Z","device_time":"2025-02-06T05:45:26.4855850Z"} +2025/02/06 00:45:27.615 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:27.6143190Z","device_time":"2025-02-06T05:45:27.6143190Z"} +2025/02/06 00:45:28.574 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:28.5739190Z","device_time":"2025-02-06T05:45:28.5739190Z"} +2025/02/06 00:45:29.637 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:29.6366380Z","device_time":"2025-02-06T05:45:29.6366380Z"} +2025/02/06 00:45:30.632 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:30.6312840Z","device_time":"2025-02-06T05:45:30.6312840Z"} +2025/02/06 00:45:31.653 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:31.6529570Z","device_time":"2025-02-06T05:45:31.6529570Z"} +2025/02/06 00:45:32.695 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:32.6943170Z","device_time":"2025-02-06T05:45:32.6943170Z"} +2025/02/06 00:45:33.787 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:33.7863840Z","device_time":"2025-02-06T05:45:33.7863850Z"} +2025/02/06 00:45:34.825 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:34.8249300Z","device_time":"2025-02-06T05:45:34.8249300Z"} +2025/02/06 00:45:35.844 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:35.8431690Z","device_time":"2025-02-06T05:45:35.8431690Z"} +2025/02/06 00:45:36.852 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:36.8514250Z","device_time":"2025-02-06T05:45:36.8514250Z"} +2025/02/06 00:45:37.864 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:37.8639640Z","device_time":"2025-02-06T05:45:37.8639640Z"} +2025/02/06 00:45:38.891 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:38.8906380Z","device_time":"2025-02-06T05:45:38.8906380Z"} +2025/02/06 00:45:39.933 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:39.9312550Z","device_time":"2025-02-06T05:45:39.9312550Z"} +2025/02/06 00:45:41.012 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:41.0052630Z","device_time":"2025-02-06T05:45:41.0052630Z"} +2025/02/06 00:45:42.073 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:42.0702600Z","device_time":"2025-02-06T05:45:42.0702600Z"} +2025/02/06 00:45:43.097 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:43.0972550Z","device_time":"2025-02-06T05:45:43.0972550Z"} +2025/02/06 00:45:44.128 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:44.1278340Z","device_time":"2025-02-06T05:45:44.1278340Z"} +2025/02/06 00:45:45.162 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:45.1615780Z","device_time":"2025-02-06T05:45:45.1615780Z"} +2025/02/06 00:45:46.196 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:46.1951280Z","device_time":"2025-02-06T05:45:46.1951290Z"} +2025/02/06 00:45:47.190 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:47.1899950Z","device_time":"2025-02-06T05:45:47.1899950Z"} +2025/02/06 00:45:48.242 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:48.2418530Z","device_time":"2025-02-06T05:45:48.2418540Z"} +2025/02/06 00:45:49.269 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:49.2684040Z","device_time":"2025-02-06T05:45:49.2684050Z"} +2025/02/06 00:45:50.303 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:50.3022920Z","device_time":"2025-02-06T05:45:50.3022920Z"} +2025/02/06 00:45:51.319 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:51.3186290Z","device_time":"2025-02-06T05:45:51.3186290Z"} +2025/02/06 00:45:52.377 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:52.3768050Z","device_time":"2025-02-06T05:45:52.3768050Z"} +2025/02/06 00:45:53.426 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:53.4256350Z","device_time":"2025-02-06T05:45:53.4256350Z"} +2025/02/06 00:45:54.457 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:54.4502620Z","device_time":"2025-02-06T05:45:54.4502620Z"} +2025/02/06 00:45:55.470 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:55.4696270Z","device_time":"2025-02-06T05:45:55.4696270Z"} +2025/02/06 00:45:56.471 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:56.4708160Z","device_time":"2025-02-06T05:45:56.4708160Z"} +2025/02/06 00:45:57.543 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:57.5426450Z","device_time":"2025-02-06T05:45:57.5426450Z"} +2025/02/06 00:45:58.553 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:58.5524400Z","device_time":"2025-02-06T05:45:58.5524410Z"} +2025/02/06 00:45:59.607 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:45:59.6052680Z","device_time":"2025-02-06T05:45:59.6052690Z"} +2025/02/06 00:46:00.623 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:00.6226700Z","device_time":"2025-02-06T05:46:00.6226700Z"} +2025/02/06 00:46:01.630 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:01.6293190Z","device_time":"2025-02-06T05:46:01.6293190Z"} +2025/02/06 00:46:02.640 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:02.6399100Z","device_time":"2025-02-06T05:46:02.6399100Z"} +2025/02/06 00:46:03.659 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:03.6583640Z","device_time":"2025-02-06T05:46:03.6583640Z"} +2025/02/06 00:46:04.734 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:04.7336470Z","device_time":"2025-02-06T05:46:04.7336470Z"} +2025/02/06 00:46:05.757 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:05.7568830Z","device_time":"2025-02-06T05:46:05.7568840Z"} +2025/02/06 00:46:06.831 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:06.8307980Z","device_time":"2025-02-06T05:46:06.8307980Z"} +2025/02/06 00:46:07.856 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:07.8558000Z","device_time":"2025-02-06T05:46:07.8558000Z"} +2025/02/06 00:46:08.898 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:08.8970710Z","device_time":"2025-02-06T05:46:08.8970710Z"} +2025/02/06 00:46:09.931 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:09.9303350Z","device_time":"2025-02-06T05:46:09.9303350Z"} +2025/02/06 00:46:10.941 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:10.9347500Z","device_time":"2025-02-06T05:46:10.9347500Z"} +2025/02/06 00:46:11.984 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:11.9835840Z","device_time":"2025-02-06T05:46:11.9835840Z"} +2025/02/06 00:46:13.034 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:13.0334250Z","device_time":"2025-02-06T05:46:13.0334250Z"} +2025/02/06 00:46:14.014 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:14.0140620Z","device_time":"2025-02-06T05:46:14.0140620Z"} +2025/02/06 00:46:15.133 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:15.1326700Z","device_time":"2025-02-06T05:46:15.1326700Z"} +2025/02/06 00:46:17.201 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:17.1897390Z","device_time":"2025-02-06T05:46:17.1897390Z"} +2025/02/06 00:46:18.223 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:18.2224410Z","device_time":"2025-02-06T05:46:18.2224410Z"} +2025/02/06 00:46:19.217 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:19.2163380Z","device_time":"2025-02-06T05:46:19.2163380Z"} +2025/02/06 00:46:20.248 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:20.2472660Z","device_time":"2025-02-06T05:46:20.2472660Z"} +2025/02/06 00:46:21.284 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:21.2832700Z","device_time":"2025-02-06T05:46:21.2832700Z"} +2025/02/06 00:46:22.305 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:22.3051680Z","device_time":"2025-02-06T05:46:22.3051680Z"} +2025/02/06 00:46:23.314 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:23.3138970Z","device_time":"2025-02-06T05:46:23.3138970Z"} +2025/02/06 00:46:24.361 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:24.3605360Z","device_time":"2025-02-06T05:46:24.3605360Z"} +2025/02/06 00:46:25.403 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:25.4028520Z","device_time":"2025-02-06T05:46:25.4028520Z"} +2025/02/06 00:46:26.480 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:26.4792040Z","device_time":"2025-02-06T05:46:26.4792050Z"} +2025/02/06 00:46:27.504 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:27.5040840Z","device_time":"2025-02-06T05:46:27.5040850Z"} +2025/02/06 00:46:28.652 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:28.6517740Z","device_time":"2025-02-06T05:46:28.6517740Z"} +2025/02/06 00:46:29.657 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:29.6553120Z","device_time":"2025-02-06T05:46:29.6553120Z"} +2025/02/06 00:46:30.687 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:30.6852970Z","device_time":"2025-02-06T05:46:30.6852970Z"} +2025/02/06 00:46:31.707 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:31.7062410Z","device_time":"2025-02-06T05:46:31.7062410Z"} +2025/02/06 00:46:32.831 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:32.8231160Z","device_time":"2025-02-06T05:46:32.8231160Z"} +2025/02/06 00:46:33.840 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:33.8386000Z","device_time":"2025-02-06T05:46:33.8386000Z"} +2025/02/06 00:46:34.879 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:34.8782720Z","device_time":"2025-02-06T05:46:34.8782730Z"} +2025/02/06 00:46:35.901 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:35.9009330Z","device_time":"2025-02-06T05:46:35.9009330Z"} +2025/02/06 00:46:36.920 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:36.9201680Z","device_time":"2025-02-06T05:46:36.9201680Z"} +2025/02/06 00:46:37.957 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:37.9564190Z","device_time":"2025-02-06T05:46:37.9564190Z"} +2025/02/06 00:46:38.981 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:38.9803630Z","device_time":"2025-02-06T05:46:38.9803630Z"} +2025/02/06 00:46:39.996 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:39.9952160Z","device_time":"2025-02-06T05:46:39.9952160Z"} +2025/02/06 00:46:41.005 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:41.0051640Z","device_time":"2025-02-06T05:46:41.0051640Z"} +2025/02/06 00:46:42.113 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:42.1122300Z","device_time":"2025-02-06T05:46:42.1122300Z"} +2025/02/06 00:46:43.132 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:43.1317110Z","device_time":"2025-02-06T05:46:43.1317110Z"} +2025/02/06 00:46:44.139 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:44.1386120Z","device_time":"2025-02-06T05:46:44.1386120Z"} +2025/02/06 00:46:45.164 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:45.1637800Z","device_time":"2025-02-06T05:46:45.1637800Z"} +2025/02/06 00:46:46.167 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:46.1668450Z","device_time":"2025-02-06T05:46:46.1668450Z"} +2025/02/06 00:46:47.201 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:47.2011210Z","device_time":"2025-02-06T05:46:47.2011210Z"} +2025/02/06 00:46:48.230 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:48.2289710Z","device_time":"2025-02-06T05:46:48.2289720Z"} +2025/02/06 00:46:49.221 15776 15791 Info Unity {"ntp_time":"2025-02-06T05:46:49.2208650Z","device_time":"2025-02-06T05:46:49.2208660Z"} diff --git a/python/evaluations/data/single_device/system_clock/pixel_6/run3-logcat.txt b/python/evaluations/data/single_device/system_clock/pixel_6/run3-logcat.txt new file mode 100644 index 0000000..19fc465 --- /dev/null +++ b/python/evaluations/data/single_device/system_clock/pixel_6/run3-logcat.txt @@ -0,0 +1,291 @@ +2025/02/06 00:48:01.544 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:01.5416600Z","device_time":"2025-02-06T05:48:01.5416600Z"} +2025/02/06 00:48:02.568 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:02.5674940Z","device_time":"2025-02-06T05:48:02.5674940Z"} +2025/02/06 00:48:03.552 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:03.5514220Z","device_time":"2025-02-06T05:48:03.5514220Z"} +2025/02/06 00:48:04.613 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:04.6133610Z","device_time":"2025-02-06T05:48:04.6133610Z"} +2025/02/06 00:48:05.674 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:05.6739690Z","device_time":"2025-02-06T05:48:05.6739690Z"} +2025/02/06 00:48:06.664 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:06.6642930Z","device_time":"2025-02-06T05:48:06.6642930Z"} +2025/02/06 00:48:07.650 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:07.6494040Z","device_time":"2025-02-06T05:48:07.6494050Z"} +2025/02/06 00:48:08.660 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:08.6601310Z","device_time":"2025-02-06T05:48:08.6601310Z"} +2025/02/06 00:48:09.708 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:09.7081180Z","device_time":"2025-02-06T05:48:09.7081180Z"} +2025/02/06 00:48:10.722 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:10.7222270Z","device_time":"2025-02-06T05:48:10.7222280Z"} +2025/02/06 00:48:11.746 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:11.7461870Z","device_time":"2025-02-06T05:48:11.7461870Z"} +2025/02/06 00:48:12.753 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:12.7528680Z","device_time":"2025-02-06T05:48:12.7528690Z"} +2025/02/06 00:48:13.786 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:13.7854740Z","device_time":"2025-02-06T05:48:13.7854750Z"} +2025/02/06 00:48:14.829 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:14.8286470Z","device_time":"2025-02-06T05:48:14.8286480Z"} +2025/02/06 00:48:15.846 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:15.8452830Z","device_time":"2025-02-06T05:48:15.8452840Z"} +2025/02/06 00:48:16.872 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:16.8717100Z","device_time":"2025-02-06T05:48:16.8717100Z"} +2025/02/06 00:48:17.887 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:17.8869280Z","device_time":"2025-02-06T05:48:17.8869290Z"} +2025/02/06 00:48:18.917 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:18.9134540Z","device_time":"2025-02-06T05:48:18.9134550Z"} +2025/02/06 00:48:19.919 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:19.9188810Z","device_time":"2025-02-06T05:48:19.9188810Z"} +2025/02/06 00:48:20.936 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:20.9358830Z","device_time":"2025-02-06T05:48:20.9358840Z"} +2025/02/06 00:48:21.944 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:21.9441100Z","device_time":"2025-02-06T05:48:21.9441100Z"} +2025/02/06 00:48:22.980 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:22.9796550Z","device_time":"2025-02-06T05:48:22.9796560Z"} +2025/02/06 00:48:23.993 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:23.9932720Z","device_time":"2025-02-06T05:48:23.9932720Z"} +2025/02/06 00:48:25.056 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:25.0556940Z","device_time":"2025-02-06T05:48:25.0556940Z"} +2025/02/06 00:48:26.084 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:26.0838290Z","device_time":"2025-02-06T05:48:26.0838300Z"} +2025/02/06 00:48:27.119 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:27.1185040Z","device_time":"2025-02-06T05:48:27.1185040Z"} +2025/02/06 00:48:28.146 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:28.1457780Z","device_time":"2025-02-06T05:48:28.1457780Z"} +2025/02/06 00:48:29.145 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:29.1442460Z","device_time":"2025-02-06T05:48:29.1442460Z"} +2025/02/06 00:48:30.169 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:30.1684720Z","device_time":"2025-02-06T05:48:30.1684720Z"} +2025/02/06 00:48:31.251 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:31.2509040Z","device_time":"2025-02-06T05:48:31.2509040Z"} +2025/02/06 00:48:32.265 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:32.2609050Z","device_time":"2025-02-06T05:48:32.2609050Z"} +2025/02/06 00:48:33.301 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:33.3008900Z","device_time":"2025-02-06T05:48:33.3008910Z"} +2025/02/06 00:48:34.425 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:34.4244610Z","device_time":"2025-02-06T05:48:34.4244610Z"} +2025/02/06 00:48:35.425 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:35.4246830Z","device_time":"2025-02-06T05:48:35.4246840Z"} +2025/02/06 00:48:36.459 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:36.4583970Z","device_time":"2025-02-06T05:48:36.4583970Z"} +2025/02/06 00:48:37.475 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:37.4745540Z","device_time":"2025-02-06T05:48:37.4745540Z"} +2025/02/06 00:48:38.510 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:38.5096070Z","device_time":"2025-02-06T05:48:38.5096080Z"} +2025/02/06 00:48:39.571 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:39.5705640Z","device_time":"2025-02-06T05:48:39.5705650Z"} +2025/02/06 00:48:40.522 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:40.5213520Z","device_time":"2025-02-06T05:48:40.5213530Z"} +2025/02/06 00:48:41.555 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:41.5542720Z","device_time":"2025-02-06T05:48:41.5542720Z"} +2025/02/06 00:48:42.600 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:42.6001630Z","device_time":"2025-02-06T05:48:42.6001630Z"} +2025/02/06 00:48:43.610 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:43.6093980Z","device_time":"2025-02-06T05:48:43.6093980Z"} +2025/02/06 00:48:44.630 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:44.6299650Z","device_time":"2025-02-06T05:48:44.6299650Z"} +2025/02/06 00:48:45.665 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:45.6641480Z","device_time":"2025-02-06T05:48:45.6641490Z"} +2025/02/06 00:48:46.701 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:46.6995600Z","device_time":"2025-02-06T05:48:46.6995600Z"} +2025/02/06 00:48:47.678 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:47.6773770Z","device_time":"2025-02-06T05:48:47.6773770Z"} +2025/02/06 00:48:48.750 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:48.7483180Z","device_time":"2025-02-06T05:48:48.7483180Z"} +2025/02/06 00:48:49.758 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:49.7466490Z","device_time":"2025-02-06T05:48:49.7466490Z"} +2025/02/06 00:48:50.772 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:50.7715540Z","device_time":"2025-02-06T05:48:50.7715540Z"} +2025/02/06 00:48:51.816 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:51.8154530Z","device_time":"2025-02-06T05:48:51.8154540Z"} +2025/02/06 00:48:52.851 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:52.8495320Z","device_time":"2025-02-06T05:48:52.8495330Z"} +2025/02/06 00:48:53.855 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:53.8546890Z","device_time":"2025-02-06T05:48:53.8546900Z"} +2025/02/06 00:48:54.859 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:54.8590090Z","device_time":"2025-02-06T05:48:54.8590090Z"} +2025/02/06 00:48:55.900 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:55.8995250Z","device_time":"2025-02-06T05:48:55.8995250Z"} +2025/02/06 00:48:56.897 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:56.8968800Z","device_time":"2025-02-06T05:48:56.8968800Z"} +2025/02/06 00:48:57.935 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:57.9300200Z","device_time":"2025-02-06T05:48:57.9300200Z"} +2025/02/06 00:48:58.955 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:58.9548990Z","device_time":"2025-02-06T05:48:58.9548990Z"} +2025/02/06 00:48:59.990 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:48:59.9897930Z","device_time":"2025-02-06T05:48:59.9897930Z"} +2025/02/06 00:49:01.005 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:01.0046240Z","device_time":"2025-02-06T05:49:01.0046240Z"} +2025/02/06 00:49:02.019 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:02.0185120Z","device_time":"2025-02-06T05:49:02.0185120Z"} +2025/02/06 00:49:03.081 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:03.0767030Z","device_time":"2025-02-06T05:49:03.0767040Z"} +2025/02/06 00:49:04.099 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:04.0982710Z","device_time":"2025-02-06T05:49:04.0982720Z"} +2025/02/06 00:49:05.103 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:05.0969540Z","device_time":"2025-02-06T05:49:05.0969540Z"} +2025/02/06 00:49:06.144 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:06.1438890Z","device_time":"2025-02-06T05:49:06.1438900Z"} +2025/02/06 00:49:07.148 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:07.1475360Z","device_time":"2025-02-06T05:49:07.1475360Z"} +2025/02/06 00:49:08.174 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:08.1735300Z","device_time":"2025-02-06T05:49:08.1735300Z"} +2025/02/06 00:49:09.228 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:09.2276990Z","device_time":"2025-02-06T05:49:09.2276990Z"} +2025/02/06 00:49:10.209 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:10.2090790Z","device_time":"2025-02-06T05:49:10.2090790Z"} +2025/02/06 00:49:11.321 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:11.3209750Z","device_time":"2025-02-06T05:49:11.3209750Z"} +2025/02/06 00:49:12.262 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:12.2615910Z","device_time":"2025-02-06T05:49:12.2615910Z"} +2025/02/06 00:49:13.305 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:13.3045380Z","device_time":"2025-02-06T05:49:13.3045380Z"} +2025/02/06 00:49:14.366 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:14.3656410Z","device_time":"2025-02-06T05:49:14.3656420Z"} +2025/02/06 00:49:15.347 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:15.3465350Z","device_time":"2025-02-06T05:49:15.3465350Z"} +2025/02/06 00:49:16.378 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:16.3777750Z","device_time":"2025-02-06T05:49:16.3777750Z"} +2025/02/06 00:49:17.435 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:17.4344510Z","device_time":"2025-02-06T05:49:17.4344510Z"} +2025/02/06 00:49:18.423 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:18.4225840Z","device_time":"2025-02-06T05:49:18.4225840Z"} +2025/02/06 00:49:19.413 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:19.4129150Z","device_time":"2025-02-06T05:49:19.4129150Z"} +2025/02/06 00:49:20.428 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:20.4278610Z","device_time":"2025-02-06T05:49:20.4278610Z"} +2025/02/06 00:49:21.431 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:21.4307100Z","device_time":"2025-02-06T05:49:21.4307100Z"} +2025/02/06 00:49:22.506 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:22.5061530Z","device_time":"2025-02-06T05:49:22.5061540Z"} +2025/02/06 00:49:23.509 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:23.5086250Z","device_time":"2025-02-06T05:49:23.5086250Z"} +2025/02/06 00:49:24.640 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:24.6397600Z","device_time":"2025-02-06T05:49:24.6397600Z"} +2025/02/06 00:49:25.699 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:25.6991510Z","device_time":"2025-02-06T05:49:25.6991510Z"} +2025/02/06 00:49:26.722 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:26.7213860Z","device_time":"2025-02-06T05:49:26.7213860Z"} +2025/02/06 00:49:27.723 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:27.7226690Z","device_time":"2025-02-06T05:49:27.7226700Z"} +2025/02/06 00:49:28.733 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:28.7324150Z","device_time":"2025-02-06T05:49:28.7324150Z"} +2025/02/06 00:49:29.733 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:29.7324600Z","device_time":"2025-02-06T05:49:29.7324600Z"} +2025/02/06 00:49:30.832 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:30.8320940Z","device_time":"2025-02-06T05:49:30.8320940Z"} +2025/02/06 00:49:31.896 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:31.8954530Z","device_time":"2025-02-06T05:49:31.8954530Z"} +2025/02/06 00:49:32.932 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:32.9317660Z","device_time":"2025-02-06T05:49:32.9317660Z"} +2025/02/06 00:49:33.973 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:33.9693580Z","device_time":"2025-02-06T05:49:33.9693580Z"} +2025/02/06 00:49:34.951 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:34.9501510Z","device_time":"2025-02-06T05:49:34.9501510Z"} +2025/02/06 00:49:35.958 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:35.9575750Z","device_time":"2025-02-06T05:49:35.9575750Z"} +2025/02/06 00:49:37.021 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:37.0210290Z","device_time":"2025-02-06T05:49:37.0210290Z"} +2025/02/06 00:49:38.054 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:38.0529230Z","device_time":"2025-02-06T05:49:38.0529230Z"} +2025/02/06 00:49:39.141 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:39.1403020Z","device_time":"2025-02-06T05:49:39.1403020Z"} +2025/02/06 00:49:40.104 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:40.1037080Z","device_time":"2025-02-06T05:49:40.1037090Z"} +2025/02/06 00:49:41.214 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:41.2137060Z","device_time":"2025-02-06T05:49:41.2137060Z"} +2025/02/06 00:49:42.158 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:42.1578630Z","device_time":"2025-02-06T05:49:42.1578630Z"} +2025/02/06 00:49:43.244 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:43.2391530Z","device_time":"2025-02-06T05:49:43.2391530Z"} +2025/02/06 00:49:44.241 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:44.2406310Z","device_time":"2025-02-06T05:49:44.2406310Z"} +2025/02/06 00:49:45.265 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:45.2650600Z","device_time":"2025-02-06T05:49:45.2650610Z"} +2025/02/06 00:49:46.300 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:46.2991380Z","device_time":"2025-02-06T05:49:46.2991390Z"} +2025/02/06 00:49:47.309 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:47.3083190Z","device_time":"2025-02-06T05:49:47.3083190Z"} +2025/02/06 00:49:48.328 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:48.3275100Z","device_time":"2025-02-06T05:49:48.3275100Z"} +2025/02/06 00:49:49.359 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:49.3580050Z","device_time":"2025-02-06T05:49:49.3580050Z"} +2025/02/06 00:49:50.449 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:50.4483810Z","device_time":"2025-02-06T05:49:50.4483810Z"} +2025/02/06 00:49:51.438 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:51.4380690Z","device_time":"2025-02-06T05:49:51.4380690Z"} +2025/02/06 00:49:52.521 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:52.5204870Z","device_time":"2025-02-06T05:49:52.5204870Z"} +2025/02/06 00:49:53.495 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:53.4941650Z","device_time":"2025-02-06T05:49:53.4941650Z"} +2025/02/06 00:49:54.493 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:54.4922620Z","device_time":"2025-02-06T05:49:54.4922630Z"} +2025/02/06 00:49:55.508 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:55.5074580Z","device_time":"2025-02-06T05:49:55.5074580Z"} +2025/02/06 00:49:56.544 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:56.5432930Z","device_time":"2025-02-06T05:49:56.5432940Z"} +2025/02/06 00:49:57.595 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:57.5945860Z","device_time":"2025-02-06T05:49:57.5945860Z"} +2025/02/06 00:49:58.609 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:58.6086180Z","device_time":"2025-02-06T05:49:58.6086180Z"} +2025/02/06 00:49:59.676 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:49:59.6753330Z","device_time":"2025-02-06T05:49:59.6753330Z"} +2025/02/06 00:50:00.740 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:00.7397800Z","device_time":"2025-02-06T05:50:00.7397800Z"} +2025/02/06 00:50:04.321 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:04.2819450Z","device_time":"2025-02-06T05:50:04.2819450Z"} +2025/02/06 00:50:05.127 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:05.1243140Z","device_time":"2025-02-06T05:50:05.1243140Z"} +2025/02/06 00:50:06.217 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:06.2170710Z","device_time":"2025-02-06T05:50:06.2170710Z"} +2025/02/06 00:50:07.215 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:07.2146240Z","device_time":"2025-02-06T05:50:07.2146240Z"} +2025/02/06 00:50:08.230 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:08.2276220Z","device_time":"2025-02-06T05:50:08.2276220Z"} +2025/02/06 00:50:09.275 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:09.2728590Z","device_time":"2025-02-06T05:50:09.2728590Z"} +2025/02/06 00:50:10.264 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:10.2633310Z","device_time":"2025-02-06T05:50:10.2633320Z"} +2025/02/06 00:50:11.288 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:11.2880440Z","device_time":"2025-02-06T05:50:11.2880440Z"} +2025/02/06 00:50:12.326 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:12.3253370Z","device_time":"2025-02-06T05:50:12.3253370Z"} +2025/02/06 00:50:13.328 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:13.3275040Z","device_time":"2025-02-06T05:50:13.3275040Z"} +2025/02/06 00:50:14.390 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:14.3671870Z","device_time":"2025-02-06T05:50:14.3671880Z"} +2025/02/06 00:50:15.448 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:15.4478120Z","device_time":"2025-02-06T05:50:15.4478120Z"} +2025/02/06 00:50:16.445 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:16.4442720Z","device_time":"2025-02-06T05:50:16.4442730Z"} +2025/02/06 00:50:17.452 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:17.4499560Z","device_time":"2025-02-06T05:50:17.4499560Z"} +2025/02/06 00:50:18.490 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:18.4899590Z","device_time":"2025-02-06T05:50:18.4899590Z"} +2025/02/06 00:50:19.509 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:19.5082200Z","device_time":"2025-02-06T05:50:19.5082200Z"} +2025/02/06 00:50:20.520 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:20.5193960Z","device_time":"2025-02-06T05:50:20.5193960Z"} +2025/02/06 00:50:21.564 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:21.5638610Z","device_time":"2025-02-06T05:50:21.5638610Z"} +2025/02/06 00:50:22.592 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:22.5913090Z","device_time":"2025-02-06T05:50:22.5913090Z"} +2025/02/06 00:50:23.616 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:23.6156850Z","device_time":"2025-02-06T05:50:23.6156850Z"} +2025/02/06 00:50:24.629 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:24.6279910Z","device_time":"2025-02-06T05:50:24.6279910Z"} +2025/02/06 00:50:25.702 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:25.7017570Z","device_time":"2025-02-06T05:50:25.7017580Z"} +2025/02/06 00:50:26.717 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:26.7166020Z","device_time":"2025-02-06T05:50:26.7166020Z"} +2025/02/06 00:50:27.780 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:27.7788160Z","device_time":"2025-02-06T05:50:27.7788160Z"} +2025/02/06 00:50:28.798 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:28.7973530Z","device_time":"2025-02-06T05:50:28.7973530Z"} +2025/02/06 00:50:29.819 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:29.8185840Z","device_time":"2025-02-06T05:50:29.8185850Z"} +2025/02/06 00:50:30.846 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:30.8457140Z","device_time":"2025-02-06T05:50:30.8457140Z"} +2025/02/06 00:50:31.867 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:31.8665950Z","device_time":"2025-02-06T05:50:31.8665950Z"} +2025/02/06 00:50:32.890 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:32.8897320Z","device_time":"2025-02-06T05:50:32.8897330Z"} +2025/02/06 00:50:33.911 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:33.9103110Z","device_time":"2025-02-06T05:50:33.9103110Z"} +2025/02/06 00:50:34.941 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:34.9404680Z","device_time":"2025-02-06T05:50:34.9404680Z"} +2025/02/06 00:50:35.972 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:35.9719240Z","device_time":"2025-02-06T05:50:35.9719240Z"} +2025/02/06 00:50:37.104 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:37.1005360Z","device_time":"2025-02-06T05:50:37.1005360Z"} +2025/02/06 00:50:38.081 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:38.0799850Z","device_time":"2025-02-06T05:50:38.0799850Z"} +2025/02/06 00:50:39.114 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:39.1132390Z","device_time":"2025-02-06T05:50:39.1132400Z"} +2025/02/06 00:50:40.146 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:40.1454440Z","device_time":"2025-02-06T05:50:40.1454440Z"} +2025/02/06 00:50:41.142 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:41.1420420Z","device_time":"2025-02-06T05:50:41.1420420Z"} +2025/02/06 00:50:42.156 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:42.1562400Z","device_time":"2025-02-06T05:50:42.1562400Z"} +2025/02/06 00:50:43.198 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:43.1973380Z","device_time":"2025-02-06T05:50:43.1973380Z"} +2025/02/06 00:50:44.214 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:44.2136040Z","device_time":"2025-02-06T05:50:44.2136040Z"} +2025/02/06 00:50:45.249 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:45.2484270Z","device_time":"2025-02-06T05:50:45.2484270Z"} +2025/02/06 00:50:46.317 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:46.3164890Z","device_time":"2025-02-06T05:50:46.3164890Z"} +2025/02/06 00:50:47.326 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:47.3255660Z","device_time":"2025-02-06T05:50:47.3255660Z"} +2025/02/06 00:50:48.375 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:48.3695120Z","device_time":"2025-02-06T05:50:48.3695120Z"} +2025/02/06 00:50:49.409 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:49.4089630Z","device_time":"2025-02-06T05:50:49.4089630Z"} +2025/02/06 00:50:50.405 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:50.4041600Z","device_time":"2025-02-06T05:50:50.4041610Z"} +2025/02/06 00:50:51.450 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:51.4495120Z","device_time":"2025-02-06T05:50:51.4495120Z"} +2025/02/06 00:50:52.482 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:52.4805890Z","device_time":"2025-02-06T05:50:52.4805890Z"} +2025/02/06 00:50:53.498 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:53.4974730Z","device_time":"2025-02-06T05:50:53.4974730Z"} +2025/02/06 00:50:54.570 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:54.5699100Z","device_time":"2025-02-06T05:50:54.5699100Z"} +2025/02/06 00:50:55.605 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:55.6027550Z","device_time":"2025-02-06T05:50:55.6027550Z"} +2025/02/06 00:50:56.654 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:56.6537910Z","device_time":"2025-02-06T05:50:56.6537910Z"} +2025/02/06 00:50:57.658 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:57.6578360Z","device_time":"2025-02-06T05:50:57.6578360Z"} +2025/02/06 00:50:58.743 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:58.7426220Z","device_time":"2025-02-06T05:50:58.7426220Z"} +2025/02/06 00:50:59.784 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:50:59.7835170Z","device_time":"2025-02-06T05:50:59.7835180Z"} +2025/02/06 00:51:00.816 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:00.8160070Z","device_time":"2025-02-06T05:51:00.8160080Z"} +2025/02/06 00:51:01.828 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:01.8271730Z","device_time":"2025-02-06T05:51:01.8271730Z"} +2025/02/06 00:51:02.882 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:02.8807290Z","device_time":"2025-02-06T05:51:02.8807300Z"} +2025/02/06 00:51:03.902 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:03.9021680Z","device_time":"2025-02-06T05:51:03.9021680Z"} +2025/02/06 00:51:04.952 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:04.9509180Z","device_time":"2025-02-06T05:51:04.9509180Z"} +2025/02/06 00:51:05.973 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:05.9727350Z","device_time":"2025-02-06T05:51:05.9727350Z"} +2025/02/06 00:51:07.011 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:07.0105550Z","device_time":"2025-02-06T05:51:07.0105550Z"} +2025/02/06 00:51:08.038 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:08.0349170Z","device_time":"2025-02-06T05:51:08.0349170Z"} +2025/02/06 00:51:09.060 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:09.0594220Z","device_time":"2025-02-06T05:51:09.0594230Z"} +2025/02/06 00:51:10.091 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:10.0912430Z","device_time":"2025-02-06T05:51:10.0912430Z"} +2025/02/06 00:51:11.130 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:11.1296070Z","device_time":"2025-02-06T05:51:11.1296070Z"} +2025/02/06 00:51:12.123 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:12.1230060Z","device_time":"2025-02-06T05:51:12.1230060Z"} +2025/02/06 00:51:13.163 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:13.1626330Z","device_time":"2025-02-06T05:51:13.1626330Z"} +2025/02/06 00:51:15.205 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:15.2038430Z","device_time":"2025-02-06T05:51:15.2038430Z"} +2025/02/06 00:51:16.234 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:16.2335660Z","device_time":"2025-02-06T05:51:16.2335670Z"} +2025/02/06 00:51:17.262 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:17.2616040Z","device_time":"2025-02-06T05:51:17.2616050Z"} +2025/02/06 00:51:18.297 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:18.2943740Z","device_time":"2025-02-06T05:51:18.2943740Z"} +2025/02/06 00:51:19.286 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:19.2862070Z","device_time":"2025-02-06T05:51:19.2862080Z"} +2025/02/06 00:51:20.330 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:20.3293940Z","device_time":"2025-02-06T05:51:20.3293940Z"} +2025/02/06 00:51:21.385 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:21.3818770Z","device_time":"2025-02-06T05:51:21.3818780Z"} +2025/02/06 00:51:22.380 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:22.3798710Z","device_time":"2025-02-06T05:51:22.3798710Z"} +2025/02/06 00:51:23.401 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:23.4008410Z","device_time":"2025-02-06T05:51:23.4008410Z"} +2025/02/06 00:51:24.499 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:24.4931130Z","device_time":"2025-02-06T05:51:24.4931130Z"} +2025/02/06 00:51:25.506 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:25.5054760Z","device_time":"2025-02-06T05:51:25.5054760Z"} +2025/02/06 00:51:26.517 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:26.5166470Z","device_time":"2025-02-06T05:51:26.5166470Z"} +2025/02/06 00:51:27.566 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:27.5639150Z","device_time":"2025-02-06T05:51:27.5639150Z"} +2025/02/06 00:51:28.593 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:28.5928100Z","device_time":"2025-02-06T05:51:28.5928100Z"} +2025/02/06 00:51:29.657 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:29.6570760Z","device_time":"2025-02-06T05:51:29.6570760Z"} +2025/02/06 00:51:30.696 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:30.6955410Z","device_time":"2025-02-06T05:51:30.6955410Z"} +2025/02/06 00:51:31.740 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:31.7400260Z","device_time":"2025-02-06T05:51:31.7400260Z"} +2025/02/06 00:51:32.764 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:32.7629650Z","device_time":"2025-02-06T05:51:32.7629660Z"} +2025/02/06 00:51:33.848 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:33.8475080Z","device_time":"2025-02-06T05:51:33.8475090Z"} +2025/02/06 00:51:34.867 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:34.8667180Z","device_time":"2025-02-06T05:51:34.8667180Z"} +2025/02/06 00:51:35.912 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:35.9116170Z","device_time":"2025-02-06T05:51:35.9116170Z"} +2025/02/06 00:51:36.915 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:36.9140740Z","device_time":"2025-02-06T05:51:36.9140740Z"} +2025/02/06 00:51:37.942 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:37.9415780Z","device_time":"2025-02-06T05:51:37.9415780Z"} +2025/02/06 00:51:38.976 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:38.9754610Z","device_time":"2025-02-06T05:51:38.9754620Z"} +2025/02/06 00:51:39.988 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:39.9872520Z","device_time":"2025-02-06T05:51:39.9872530Z"} +2025/02/06 00:51:41.001 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:41.0005610Z","device_time":"2025-02-06T05:51:41.0005610Z"} +2025/02/06 00:51:42.039 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:42.0384340Z","device_time":"2025-02-06T05:51:42.0384350Z"} +2025/02/06 00:51:43.108 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:43.1065390Z","device_time":"2025-02-06T05:51:43.1065390Z"} +2025/02/06 00:51:44.090 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:44.0896470Z","device_time":"2025-02-06T05:51:44.0896470Z"} +2025/02/06 00:51:45.122 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:45.1209210Z","device_time":"2025-02-06T05:51:45.1209210Z"} +2025/02/06 00:51:46.129 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:46.1287010Z","device_time":"2025-02-06T05:51:46.1287020Z"} +2025/02/06 00:51:47.193 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:47.1927370Z","device_time":"2025-02-06T05:51:47.1927370Z"} +2025/02/06 00:51:48.257 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:48.2552630Z","device_time":"2025-02-06T05:51:48.2552640Z"} +2025/02/06 00:51:49.234 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:49.2338810Z","device_time":"2025-02-06T05:51:49.2338820Z"} +2025/02/06 00:51:50.333 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:50.3322770Z","device_time":"2025-02-06T05:51:50.3322770Z"} +2025/02/06 00:51:51.369 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:51.3684290Z","device_time":"2025-02-06T05:51:51.3684290Z"} +2025/02/06 00:51:52.374 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:52.3730210Z","device_time":"2025-02-06T05:51:52.3730210Z"} +2025/02/06 00:51:53.401 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:53.4001950Z","device_time":"2025-02-06T05:51:53.4001950Z"} +2025/02/06 00:51:54.438 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:54.4381410Z","device_time":"2025-02-06T05:51:54.4381410Z"} +2025/02/06 00:51:55.466 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:55.4560720Z","device_time":"2025-02-06T05:51:55.4560720Z"} +2025/02/06 00:51:56.502 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:56.5016970Z","device_time":"2025-02-06T05:51:56.5016970Z"} +2025/02/06 00:51:57.507 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:57.5015870Z","device_time":"2025-02-06T05:51:57.5015870Z"} +2025/02/06 00:51:58.524 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:58.5241200Z","device_time":"2025-02-06T05:51:58.5241200Z"} +2025/02/06 00:51:59.537 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:51:59.5363310Z","device_time":"2025-02-06T05:51:59.5363310Z"} +2025/02/06 00:52:00.574 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:00.5733790Z","device_time":"2025-02-06T05:52:00.5733790Z"} +2025/02/06 00:52:01.642 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:01.6414960Z","device_time":"2025-02-06T05:52:01.6414960Z"} +2025/02/06 00:52:02.718 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:02.7106170Z","device_time":"2025-02-06T05:52:02.7106170Z"} +2025/02/06 00:52:03.697 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:03.6939840Z","device_time":"2025-02-06T05:52:03.6939850Z"} +2025/02/06 00:52:04.832 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:04.8314420Z","device_time":"2025-02-06T05:52:04.8314430Z"} +2025/02/06 00:52:05.777 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:05.7759280Z","device_time":"2025-02-06T05:52:05.7759280Z"} +2025/02/06 00:52:06.797 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:06.7970080Z","device_time":"2025-02-06T05:52:06.7970090Z"} +2025/02/06 00:52:07.819 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:07.8119710Z","device_time":"2025-02-06T05:52:07.8119720Z"} +2025/02/06 00:52:08.850 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:08.8497700Z","device_time":"2025-02-06T05:52:08.8497700Z"} +2025/02/06 00:52:09.841 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:09.8382100Z","device_time":"2025-02-06T05:52:09.8382100Z"} +2025/02/06 00:52:10.881 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:10.8803130Z","device_time":"2025-02-06T05:52:10.8803130Z"} +2025/02/06 00:52:11.909 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:11.9077120Z","device_time":"2025-02-06T05:52:11.9077120Z"} +2025/02/06 00:52:12.935 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:12.9309960Z","device_time":"2025-02-06T05:52:12.9309960Z"} +2025/02/06 00:52:13.916 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:13.9152190Z","device_time":"2025-02-06T05:52:13.9152190Z"} +2025/02/06 00:52:14.968 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:14.9659090Z","device_time":"2025-02-06T05:52:14.9659090Z"} +2025/02/06 00:52:15.988 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:15.9872950Z","device_time":"2025-02-06T05:52:15.9872950Z"} +2025/02/06 00:52:17.001 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:17.0001000Z","device_time":"2025-02-06T05:52:17.0001000Z"} +2025/02/06 00:52:18.038 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:18.0355480Z","device_time":"2025-02-06T05:52:18.0355480Z"} +2025/02/06 00:52:19.050 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:19.0496220Z","device_time":"2025-02-06T05:52:19.0496220Z"} +2025/02/06 00:52:20.136 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:20.1351650Z","device_time":"2025-02-06T05:52:20.1351660Z"} +2025/02/06 00:52:21.210 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:21.2072280Z","device_time":"2025-02-06T05:52:21.2072280Z"} +2025/02/06 00:52:22.206 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:22.2054240Z","device_time":"2025-02-06T05:52:22.2054240Z"} +2025/02/06 00:52:23.274 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:23.2724180Z","device_time":"2025-02-06T05:52:23.2724180Z"} +2025/02/06 00:52:24.309 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:24.3087810Z","device_time":"2025-02-06T05:52:24.3087810Z"} +2025/02/06 00:52:25.326 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:25.3254100Z","device_time":"2025-02-06T05:52:25.3254100Z"} +2025/02/06 00:52:26.381 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:26.3809800Z","device_time":"2025-02-06T05:52:26.3809800Z"} +2025/02/06 00:52:27.419 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:27.4113370Z","device_time":"2025-02-06T05:52:27.4113370Z"} +2025/02/06 00:52:28.461 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:28.4601060Z","device_time":"2025-02-06T05:52:28.4601070Z"} +2025/02/06 00:52:29.501 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:29.5011870Z","device_time":"2025-02-06T05:52:29.5011870Z"} +2025/02/06 00:52:30.553 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:30.5527780Z","device_time":"2025-02-06T05:52:30.5527780Z"} +2025/02/06 00:52:32.571 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:32.5700270Z","device_time":"2025-02-06T05:52:32.5700270Z"} +2025/02/06 00:52:33.605 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:33.6048650Z","device_time":"2025-02-06T05:52:33.6048650Z"} +2025/02/06 00:52:34.637 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:34.6371540Z","device_time":"2025-02-06T05:52:34.6371550Z"} +2025/02/06 00:52:35.672 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:35.6714000Z","device_time":"2025-02-06T05:52:35.6714010Z"} +2025/02/06 00:52:36.712 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:36.7114120Z","device_time":"2025-02-06T05:52:36.7114130Z"} +2025/02/06 00:52:37.730 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:37.7290490Z","device_time":"2025-02-06T05:52:37.7290490Z"} +2025/02/06 00:52:38.776 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:38.7749860Z","device_time":"2025-02-06T05:52:38.7749860Z"} +2025/02/06 00:52:39.824 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:39.8241540Z","device_time":"2025-02-06T05:52:39.8241540Z"} +2025/02/06 00:52:40.836 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:40.8358980Z","device_time":"2025-02-06T05:52:40.8358980Z"} +2025/02/06 00:52:41.882 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:41.8814940Z","device_time":"2025-02-06T05:52:41.8814950Z"} +2025/02/06 00:52:42.950 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:42.9492220Z","device_time":"2025-02-06T05:52:42.9492230Z"} +2025/02/06 00:52:43.960 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:43.9599610Z","device_time":"2025-02-06T05:52:43.9599620Z"} +2025/02/06 00:52:44.980 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:44.9798170Z","device_time":"2025-02-06T05:52:44.9798170Z"} +2025/02/06 00:52:45.998 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:45.9973840Z","device_time":"2025-02-06T05:52:45.9973840Z"} +2025/02/06 00:52:47.019 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:47.0192370Z","device_time":"2025-02-06T05:52:47.0192370Z"} +2025/02/06 00:52:48.067 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:48.0671170Z","device_time":"2025-02-06T05:52:48.0671180Z"} +2025/02/06 00:52:49.125 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:49.1243090Z","device_time":"2025-02-06T05:52:49.1243090Z"} +2025/02/06 00:52:50.109 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:50.1088120Z","device_time":"2025-02-06T05:52:50.1088120Z"} +2025/02/06 00:52:51.160 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:51.1587920Z","device_time":"2025-02-06T05:52:51.1587920Z"} +2025/02/06 00:52:52.206 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:52.2060570Z","device_time":"2025-02-06T05:52:52.2060570Z"} +2025/02/06 00:52:54.320 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:54.3195130Z","device_time":"2025-02-06T05:52:54.3195130Z"} +2025/02/06 00:52:55.294 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:55.2936090Z","device_time":"2025-02-06T05:52:55.2936090Z"} +2025/02/06 00:52:56.329 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:56.3281600Z","device_time":"2025-02-06T05:52:56.3281600Z"} +2025/02/06 00:52:57.344 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:57.3435980Z","device_time":"2025-02-06T05:52:57.3435980Z"} +2025/02/06 00:52:58.376 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:58.3751690Z","device_time":"2025-02-06T05:52:58.3751690Z"} +2025/02/06 00:52:59.379 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:52:59.3780510Z","device_time":"2025-02-06T05:52:59.3780520Z"} +2025/02/06 00:53:00.414 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:53:00.4141870Z","device_time":"2025-02-06T05:53:00.4141870Z"} +2025/02/06 00:53:01.431 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:53:01.4302440Z","device_time":"2025-02-06T05:53:01.4302450Z"} +2025/02/06 00:53:02.444 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:53:02.4432940Z","device_time":"2025-02-06T05:53:02.4432940Z"} +2025/02/06 00:53:03.496 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:53:03.4953290Z","device_time":"2025-02-06T05:53:03.4953300Z"} +2025/02/06 00:53:04.533 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:53:04.5309880Z","device_time":"2025-02-06T05:53:04.5309880Z"} +2025/02/06 00:53:05.602 19165 19179 Info Unity {"ntp_time":"2025-02-06T05:53:05.6020590Z","device_time":"2025-02-06T05:53:05.6020590Z"} diff --git a/python/evaluations/data/single_device/system_clock/tab_s6/run1-logcat.txt b/python/evaluations/data/single_device/system_clock/tab_s6/run1-logcat.txt new file mode 100644 index 0000000..8b3debb --- /dev/null +++ b/python/evaluations/data/single_device/system_clock/tab_s6/run1-logcat.txt @@ -0,0 +1,252 @@ +2025/02/06 00:56:55.219 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:56:55.2075850Z","device_time":"2025-02-06T05:56:55.2075850Z"} +2025/02/06 00:56:56.235 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:56:56.2345990Z","device_time":"2025-02-06T05:56:56.2345990Z"} +2025/02/06 00:56:57.226 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:56:57.2259700Z","device_time":"2025-02-06T05:56:57.2259700Z"} +2025/02/06 00:56:58.253 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:56:58.2529380Z","device_time":"2025-02-06T05:56:58.2529380Z"} +2025/02/06 00:56:59.291 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:56:59.2910010Z","device_time":"2025-02-06T05:56:59.2910010Z"} +2025/02/06 00:57:00.298 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:00.2979970Z","device_time":"2025-02-06T05:57:00.2979970Z"} +2025/02/06 00:57:01.307 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:01.3072420Z","device_time":"2025-02-06T05:57:01.3072430Z"} +2025/02/06 00:57:02.351 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:02.3509660Z","device_time":"2025-02-06T05:57:02.3509670Z"} +2025/02/06 00:57:03.361 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:03.3610940Z","device_time":"2025-02-06T05:57:03.3610940Z"} +2025/02/06 00:57:04.406 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:04.4045660Z","device_time":"2025-02-06T05:57:04.4045680Z"} +2025/02/06 00:57:05.407 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:05.4069670Z","device_time":"2025-02-06T05:57:05.4069680Z"} +2025/02/06 00:57:06.428 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:06.4279290Z","device_time":"2025-02-06T05:57:06.4279300Z"} +2025/02/06 00:57:07.449 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:07.4491420Z","device_time":"2025-02-06T05:57:07.4491430Z"} +2025/02/06 00:57:08.468 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:08.4682520Z","device_time":"2025-02-06T05:57:08.4682520Z"} +2025/02/06 00:57:09.479 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:09.4789670Z","device_time":"2025-02-06T05:57:09.4789670Z"} +2025/02/06 00:57:10.486 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:10.4856930Z","device_time":"2025-02-06T05:57:10.4856930Z"} +2025/02/06 00:57:11.525 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:11.5243090Z","device_time":"2025-02-06T05:57:11.5243100Z"} +2025/02/06 00:57:12.518 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:12.5184520Z","device_time":"2025-02-06T05:57:12.5184520Z"} +2025/02/06 00:57:13.556 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:13.5565640Z","device_time":"2025-02-06T05:57:13.5565640Z"} +2025/02/06 00:57:14.585 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:14.5853800Z","device_time":"2025-02-06T05:57:14.5853800Z"} +2025/02/06 00:57:15.624 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:15.6240240Z","device_time":"2025-02-06T05:57:15.6240240Z"} +2025/02/06 00:57:16.700 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:16.6998210Z","device_time":"2025-02-06T05:57:16.6998220Z"} +2025/02/06 00:57:17.722 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:17.7221680Z","device_time":"2025-02-06T05:57:17.7221690Z"} +2025/02/06 00:57:18.739 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:18.7384440Z","device_time":"2025-02-06T05:57:18.7384450Z"} +2025/02/06 00:57:19.777 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:19.7768890Z","device_time":"2025-02-06T05:57:19.7768890Z"} +2025/02/06 00:57:20.773 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:20.7735410Z","device_time":"2025-02-06T05:57:20.7735410Z"} +2025/02/06 00:57:21.810 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:21.8099630Z","device_time":"2025-02-06T05:57:21.8099640Z"} +2025/02/06 00:57:22.833 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:22.8332280Z","device_time":"2025-02-06T05:57:22.8332280Z"} +2025/02/06 00:57:23.846 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:23.8463530Z","device_time":"2025-02-06T05:57:23.8463530Z"} +2025/02/06 00:57:24.870 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:24.8704670Z","device_time":"2025-02-06T05:57:24.8704670Z"} +2025/02/06 00:57:25.878 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:25.8780680Z","device_time":"2025-02-06T05:57:25.8780690Z"} +2025/02/06 00:57:26.925 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:26.9255890Z","device_time":"2025-02-06T05:57:26.9255900Z"} +2025/02/06 00:57:27.920 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:27.9204230Z","device_time":"2025-02-06T05:57:27.9204240Z"} +2025/02/06 00:57:28.949 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:28.9489770Z","device_time":"2025-02-06T05:57:28.9489770Z"} +2025/02/06 00:57:29.969 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:29.9636850Z","device_time":"2025-02-06T05:57:29.9636850Z"} +2025/02/06 00:57:31.001 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:31.0007680Z","device_time":"2025-02-06T05:57:31.0007690Z"} +2025/02/06 00:57:32.008 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:32.0081130Z","device_time":"2025-02-06T05:57:32.0081130Z"} +2025/02/06 00:57:33.017 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:33.0170680Z","device_time":"2025-02-06T05:57:33.0170690Z"} +2025/02/06 00:57:34.070 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:34.0699990Z","device_time":"2025-02-06T05:57:34.0699990Z"} +2025/02/06 00:57:35.098 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:35.0984780Z","device_time":"2025-02-06T05:57:35.0984780Z"} +2025/02/06 00:57:36.117 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:36.1169460Z","device_time":"2025-02-06T05:57:36.1169460Z"} +2025/02/06 00:57:37.151 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:37.1504370Z","device_time":"2025-02-06T05:57:37.1504380Z"} +2025/02/06 00:57:38.155 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:38.1551040Z","device_time":"2025-02-06T05:57:38.1551040Z"} +2025/02/06 00:57:39.173 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:39.1725920Z","device_time":"2025-02-06T05:57:39.1725930Z"} +2025/02/06 00:57:40.205 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:40.2046530Z","device_time":"2025-02-06T05:57:40.2046530Z"} +2025/02/06 00:57:41.215 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:41.2146360Z","device_time":"2025-02-06T05:57:41.2146360Z"} +2025/02/06 00:57:42.224 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:42.2245070Z","device_time":"2025-02-06T05:57:42.2245080Z"} +2025/02/06 00:57:43.266 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:43.2660730Z","device_time":"2025-02-06T05:57:43.2660730Z"} +2025/02/06 00:57:44.298 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:44.2958320Z","device_time":"2025-02-06T05:57:44.2958320Z"} +2025/02/06 00:57:45.316 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:45.3162940Z","device_time":"2025-02-06T05:57:45.3162940Z"} +2025/02/06 00:57:46.346 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:46.3463440Z","device_time":"2025-02-06T05:57:46.3463440Z"} +2025/02/06 00:57:47.347 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:47.3471850Z","device_time":"2025-02-06T05:57:47.3471850Z"} +2025/02/06 00:57:48.417 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:48.4166580Z","device_time":"2025-02-06T05:57:48.4166580Z"} +2025/02/06 00:57:49.437 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:49.4372060Z","device_time":"2025-02-06T05:57:49.4372060Z"} +2025/02/06 00:57:50.438 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:50.4383750Z","device_time":"2025-02-06T05:57:50.4383750Z"} +2025/02/06 00:57:51.466 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:51.4656730Z","device_time":"2025-02-06T05:57:51.4656730Z"} +2025/02/06 00:57:52.487 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:52.4865970Z","device_time":"2025-02-06T05:57:52.4865970Z"} +2025/02/06 00:57:53.516 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:53.5162600Z","device_time":"2025-02-06T05:57:53.5162610Z"} +2025/02/06 00:57:54.524 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:54.5243340Z","device_time":"2025-02-06T05:57:54.5243350Z"} +2025/02/06 00:57:55.542 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:55.5418760Z","device_time":"2025-02-06T05:57:55.5418760Z"} +2025/02/06 00:57:56.603 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:56.6032890Z","device_time":"2025-02-06T05:57:56.6032890Z"} +2025/02/06 00:57:57.606 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:57.6062180Z","device_time":"2025-02-06T05:57:57.6062180Z"} +2025/02/06 00:57:58.667 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:58.6672470Z","device_time":"2025-02-06T05:57:58.6672480Z"} +2025/02/06 00:57:59.666 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:57:59.6658640Z","device_time":"2025-02-06T05:57:59.6658640Z"} +2025/02/06 00:58:00.680 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:00.6801290Z","device_time":"2025-02-06T05:58:00.6801300Z"} +2025/02/06 00:58:01.686 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:01.6855560Z","device_time":"2025-02-06T05:58:01.6855570Z"} +2025/02/06 00:58:02.725 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:02.7245220Z","device_time":"2025-02-06T05:58:02.7245220Z"} +2025/02/06 00:58:03.737 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:03.7369720Z","device_time":"2025-02-06T05:58:03.7369720Z"} +2025/02/06 00:58:04.776 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:04.7764650Z","device_time":"2025-02-06T05:58:04.7764660Z"} +2025/02/06 00:58:05.786 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:05.7856780Z","device_time":"2025-02-06T05:58:05.7856780Z"} +2025/02/06 00:58:06.791 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:06.7909920Z","device_time":"2025-02-06T05:58:06.7909920Z"} +2025/02/06 00:58:07.810 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:07.8104190Z","device_time":"2025-02-06T05:58:07.8104190Z"} +2025/02/06 00:58:08.851 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:08.8497660Z","device_time":"2025-02-06T05:58:08.8497670Z"} +2025/02/06 00:58:09.858 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:09.8563080Z","device_time":"2025-02-06T05:58:09.8563090Z"} +2025/02/06 00:58:10.899 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:10.8992470Z","device_time":"2025-02-06T05:58:10.8992470Z"} +2025/02/06 00:58:11.935 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:11.9352690Z","device_time":"2025-02-06T05:58:11.9352690Z"} +2025/02/06 00:58:12.947 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:12.9470220Z","device_time":"2025-02-06T05:58:12.9470220Z"} +2025/02/06 00:58:13.949 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:13.9495080Z","device_time":"2025-02-06T05:58:13.9495090Z"} +2025/02/06 00:58:14.971 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:14.9710800Z","device_time":"2025-02-06T05:58:14.9710800Z"} +2025/02/06 00:58:16.004 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:16.0037770Z","device_time":"2025-02-06T05:58:16.0037780Z"} +2025/02/06 00:58:17.021 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:17.0209500Z","device_time":"2025-02-06T05:58:17.0209510Z"} +2025/02/06 00:58:18.054 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:18.0539040Z","device_time":"2025-02-06T05:58:18.0539040Z"} +2025/02/06 00:58:19.107 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:19.1075000Z","device_time":"2025-02-06T05:58:19.1075010Z"} +2025/02/06 00:58:20.130 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:20.1240830Z","device_time":"2025-02-06T05:58:20.1240830Z"} +2025/02/06 00:58:21.162 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:21.1621480Z","device_time":"2025-02-06T05:58:21.1621490Z"} +2025/02/06 00:58:22.202 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:22.2020040Z","device_time":"2025-02-06T05:58:22.2020050Z"} +2025/02/06 00:58:23.211 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:23.2109730Z","device_time":"2025-02-06T05:58:23.2109770Z"} +2025/02/06 00:58:24.221 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:24.2199800Z","device_time":"2025-02-06T05:58:24.2199800Z"} +2025/02/06 00:58:25.220 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:25.2196780Z","device_time":"2025-02-06T05:58:25.2196790Z"} +2025/02/06 00:58:26.245 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:26.2451250Z","device_time":"2025-02-06T05:58:26.2451260Z"} +2025/02/06 00:58:27.275 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:27.2749660Z","device_time":"2025-02-06T05:58:27.2749660Z"} +2025/02/06 00:58:28.292 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:28.2919000Z","device_time":"2025-02-06T05:58:28.2919000Z"} +2025/02/06 00:58:29.328 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:29.3282880Z","device_time":"2025-02-06T05:58:29.3282880Z"} +2025/02/06 00:58:30.338 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:30.3373960Z","device_time":"2025-02-06T05:58:30.3373960Z"} +2025/02/06 00:58:31.344 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:31.3437420Z","device_time":"2025-02-06T05:58:31.3437420Z"} +2025/02/06 00:58:32.369 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:32.3692030Z","device_time":"2025-02-06T05:58:32.3692040Z"} +2025/02/06 00:58:33.386 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:33.3862500Z","device_time":"2025-02-06T05:58:33.3862500Z"} +2025/02/06 00:58:34.404 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:34.4037210Z","device_time":"2025-02-06T05:58:34.4037220Z"} +2025/02/06 00:58:35.429 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:35.4292140Z","device_time":"2025-02-06T05:58:35.4292150Z"} +2025/02/06 00:58:36.421 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:36.4215280Z","device_time":"2025-02-06T05:58:36.4215290Z"} +2025/02/06 00:58:37.457 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:37.4575290Z","device_time":"2025-02-06T05:58:37.4575290Z"} +2025/02/06 00:58:38.501 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:38.5011270Z","device_time":"2025-02-06T05:58:38.5011280Z"} +2025/02/06 00:58:39.535 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:39.5346220Z","device_time":"2025-02-06T05:58:39.5346220Z"} +2025/02/06 00:58:40.545 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:40.5451930Z","device_time":"2025-02-06T05:58:40.5451930Z"} +2025/02/06 00:58:41.584 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:41.5844520Z","device_time":"2025-02-06T05:58:41.5844520Z"} +2025/02/06 00:58:42.622 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:42.6215070Z","device_time":"2025-02-06T05:58:42.6215070Z"} +2025/02/06 00:58:43.630 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:43.6304010Z","device_time":"2025-02-06T05:58:43.6304010Z"} +2025/02/06 00:58:44.648 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:44.6480930Z","device_time":"2025-02-06T05:58:44.6480930Z"} +2025/02/06 00:58:45.692 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:45.6923830Z","device_time":"2025-02-06T05:58:45.6923840Z"} +2025/02/06 00:58:46.695 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:46.6953320Z","device_time":"2025-02-06T05:58:46.6953320Z"} +2025/02/06 00:58:47.751 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:47.7511580Z","device_time":"2025-02-06T05:58:47.7511580Z"} +2025/02/06 00:58:48.770 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:48.7700260Z","device_time":"2025-02-06T05:58:48.7700260Z"} +2025/02/06 00:58:49.789 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:49.7892420Z","device_time":"2025-02-06T05:58:49.7892430Z"} +2025/02/06 00:58:50.836 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:50.8361570Z","device_time":"2025-02-06T05:58:50.8361580Z"} +2025/02/06 00:58:51.847 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:51.8472690Z","device_time":"2025-02-06T05:58:51.8472700Z"} +2025/02/06 00:58:52.873 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:52.8729200Z","device_time":"2025-02-06T05:58:52.8729210Z"} +2025/02/06 00:58:53.894 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:53.8945610Z","device_time":"2025-02-06T05:58:53.8945620Z"} +2025/02/06 00:58:54.897 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:54.8974630Z","device_time":"2025-02-06T05:58:54.8974640Z"} +2025/02/06 00:58:55.923 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:55.9225950Z","device_time":"2025-02-06T05:58:55.9225960Z"} +2025/02/06 00:58:56.942 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:56.9416290Z","device_time":"2025-02-06T05:58:56.9416290Z"} +2025/02/06 00:58:57.982 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:57.9816510Z","device_time":"2025-02-06T05:58:57.9816510Z"} +2025/02/06 00:58:58.996 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:58:58.9962680Z","device_time":"2025-02-06T05:58:58.9962690Z"} +2025/02/06 00:59:00.010 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:00.0100800Z","device_time":"2025-02-06T05:59:00.0100800Z"} +2025/02/06 00:59:01.022 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:01.0225240Z","device_time":"2025-02-06T05:59:01.0225240Z"} +2025/02/06 00:59:02.037 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:02.0372970Z","device_time":"2025-02-06T05:59:02.0372980Z"} +2025/02/06 00:59:03.035 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:03.0346690Z","device_time":"2025-02-06T05:59:03.0346700Z"} +2025/02/06 00:59:04.067 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:04.0664800Z","device_time":"2025-02-06T05:59:04.0664800Z"} +2025/02/06 00:59:05.106 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:05.1058550Z","device_time":"2025-02-06T05:59:05.1058550Z"} +2025/02/06 00:59:06.123 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:06.1232500Z","device_time":"2025-02-06T05:59:06.1232510Z"} +2025/02/06 00:59:07.161 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:07.1606790Z","device_time":"2025-02-06T05:59:07.1606790Z"} +2025/02/06 00:59:08.178 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:08.1783640Z","device_time":"2025-02-06T05:59:08.1783650Z"} +2025/02/06 00:59:09.178 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:09.1778380Z","device_time":"2025-02-06T05:59:09.1778380Z"} +2025/02/06 00:59:10.184 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:10.1836920Z","device_time":"2025-02-06T05:59:10.1836930Z"} +2025/02/06 00:59:11.227 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:11.2270730Z","device_time":"2025-02-06T05:59:11.2270730Z"} +2025/02/06 00:59:12.264 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:12.2642030Z","device_time":"2025-02-06T05:59:12.2642040Z"} +2025/02/06 00:59:13.252 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:13.2518800Z","device_time":"2025-02-06T05:59:13.2518800Z"} +2025/02/06 00:59:14.284 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:14.2843310Z","device_time":"2025-02-06T05:59:14.2843310Z"} +2025/02/06 00:59:15.294 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:15.2941350Z","device_time":"2025-02-06T05:59:15.2941350Z"} +2025/02/06 00:59:16.300 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:16.2997980Z","device_time":"2025-02-06T05:59:16.2997980Z"} +2025/02/06 00:59:17.318 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:17.3176140Z","device_time":"2025-02-06T05:59:17.3176140Z"} +2025/02/06 00:59:18.392 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:18.3918250Z","device_time":"2025-02-06T05:59:18.3918250Z"} +2025/02/06 00:59:19.366 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:19.3662920Z","device_time":"2025-02-06T05:59:19.3662930Z"} +2025/02/06 00:59:20.416 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:20.4161270Z","device_time":"2025-02-06T05:59:20.4161270Z"} +2025/02/06 00:59:21.454 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:21.4538420Z","device_time":"2025-02-06T05:59:21.4538420Z"} +2025/02/06 00:59:22.445 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:22.4451130Z","device_time":"2025-02-06T05:59:22.4451130Z"} +2025/02/06 00:59:23.464 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:23.4635410Z","device_time":"2025-02-06T05:59:23.4635410Z"} +2025/02/06 00:59:24.486 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:24.4865370Z","device_time":"2025-02-06T05:59:24.4865380Z"} +2025/02/06 00:59:25.508 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:25.5080890Z","device_time":"2025-02-06T05:59:25.5080890Z"} +2025/02/06 00:59:26.540 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:26.5397730Z","device_time":"2025-02-06T05:59:26.5397740Z"} +2025/02/06 00:59:27.539 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:27.5394860Z","device_time":"2025-02-06T05:59:27.5394870Z"} +2025/02/06 00:59:28.564 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:28.5640300Z","device_time":"2025-02-06T05:59:28.5640310Z"} +2025/02/06 00:59:29.576 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:29.5758940Z","device_time":"2025-02-06T05:59:29.5758940Z"} +2025/02/06 00:59:30.587 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:30.5872900Z","device_time":"2025-02-06T05:59:30.5872900Z"} +2025/02/06 00:59:31.600 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:31.6004840Z","device_time":"2025-02-06T05:59:31.6004840Z"} +2025/02/06 00:59:32.636 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:32.6360790Z","device_time":"2025-02-06T05:59:32.6360800Z"} +2025/02/06 00:59:33.643 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:33.6428070Z","device_time":"2025-02-06T05:59:33.6428070Z"} +2025/02/06 00:59:34.661 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:34.6559800Z","device_time":"2025-02-06T05:59:34.6559800Z"} +2025/02/06 00:59:35.671 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:35.6708970Z","device_time":"2025-02-06T05:59:35.6708980Z"} +2025/02/06 00:59:36.705 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:36.7052920Z","device_time":"2025-02-06T05:59:36.7052920Z"} +2025/02/06 00:59:37.718 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:37.7176500Z","device_time":"2025-02-06T05:59:37.7176510Z"} +2025/02/06 00:59:38.763 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:38.7629500Z","device_time":"2025-02-06T05:59:38.7629500Z"} +2025/02/06 00:59:39.796 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:39.7959660Z","device_time":"2025-02-06T05:59:39.7959660Z"} +2025/02/06 00:59:40.815 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:40.8153500Z","device_time":"2025-02-06T05:59:40.8153500Z"} +2025/02/06 00:59:41.846 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:41.8463820Z","device_time":"2025-02-06T05:59:41.8463830Z"} +2025/02/06 00:59:42.879 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:42.8781420Z","device_time":"2025-02-06T05:59:42.8781430Z"} +2025/02/06 00:59:43.896 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:43.8964130Z","device_time":"2025-02-06T05:59:43.8964130Z"} +2025/02/06 00:59:44.906 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:44.9056970Z","device_time":"2025-02-06T05:59:44.9056970Z"} +2025/02/06 00:59:45.998 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:45.9977210Z","device_time":"2025-02-06T05:59:45.9977210Z"} +2025/02/06 00:59:47.006 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:47.0056930Z","device_time":"2025-02-06T05:59:47.0056930Z"} +2025/02/06 00:59:48.026 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:48.0263860Z","device_time":"2025-02-06T05:59:48.0263860Z"} +2025/02/06 00:59:49.045 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:49.0449210Z","device_time":"2025-02-06T05:59:49.0449210Z"} +2025/02/06 00:59:50.068 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:50.0676780Z","device_time":"2025-02-06T05:59:50.0676780Z"} +2025/02/06 00:59:51.121 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:51.1210760Z","device_time":"2025-02-06T05:59:51.1210760Z"} +2025/02/06 00:59:52.136 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:52.1354440Z","device_time":"2025-02-06T05:59:52.1354450Z"} +2025/02/06 00:59:53.176 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:53.1760760Z","device_time":"2025-02-06T05:59:53.1760770Z"} +2025/02/06 00:59:54.189 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:54.1887840Z","device_time":"2025-02-06T05:59:54.1887840Z"} +2025/02/06 00:59:55.203 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:55.2032830Z","device_time":"2025-02-06T05:59:55.2032830Z"} +2025/02/06 00:59:56.233 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:56.2333600Z","device_time":"2025-02-06T05:59:56.2333610Z"} +2025/02/06 00:59:57.252 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:57.2518700Z","device_time":"2025-02-06T05:59:57.2518710Z"} +2025/02/06 00:59:58.280 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:58.2802320Z","device_time":"2025-02-06T05:59:58.2802320Z"} +2025/02/06 00:59:59.289 28631 28676 Info Unity {"ntp_time":"2025-02-06T05:59:59.2895250Z","device_time":"2025-02-06T05:59:59.2895250Z"} +2025/02/06 01:00:00.311 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:00.3113990Z","device_time":"2025-02-06T06:00:00.3113990Z"} +2025/02/06 01:00:01.323 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:01.3234940Z","device_time":"2025-02-06T06:00:01.3234950Z"} +2025/02/06 01:00:02.347 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:02.3470920Z","device_time":"2025-02-06T06:00:02.3470920Z"} +2025/02/06 01:00:03.358 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:03.3576000Z","device_time":"2025-02-06T06:00:03.3576010Z"} +2025/02/06 01:00:04.373 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:04.3706240Z","device_time":"2025-02-06T06:00:04.3706240Z"} +2025/02/06 01:00:05.381 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:05.3810660Z","device_time":"2025-02-06T06:00:05.3810660Z"} +2025/02/06 01:00:06.418 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:06.4178120Z","device_time":"2025-02-06T06:00:06.4178130Z"} +2025/02/06 01:00:07.452 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:07.4521120Z","device_time":"2025-02-06T06:00:07.4521130Z"} +2025/02/06 01:00:08.467 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:08.4665650Z","device_time":"2025-02-06T06:00:08.4665650Z"} +2025/02/06 01:00:09.486 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:09.4855140Z","device_time":"2025-02-06T06:00:09.4855140Z"} +2025/02/06 01:00:10.515 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:10.5153590Z","device_time":"2025-02-06T06:00:10.5153590Z"} +2025/02/06 01:00:11.526 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:11.5257820Z","device_time":"2025-02-06T06:00:11.5257820Z"} +2025/02/06 01:00:12.571 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:12.5699290Z","device_time":"2025-02-06T06:00:12.5699290Z"} +2025/02/06 01:00:13.616 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:13.6162270Z","device_time":"2025-02-06T06:00:13.6162280Z"} +2025/02/06 01:00:14.655 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:14.6552570Z","device_time":"2025-02-06T06:00:14.6552570Z"} +2025/02/06 01:00:15.663 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:15.6629060Z","device_time":"2025-02-06T06:00:15.6629070Z"} +2025/02/06 01:00:16.700 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:16.6999220Z","device_time":"2025-02-06T06:00:16.6999220Z"} +2025/02/06 01:00:17.708 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:17.7080930Z","device_time":"2025-02-06T06:00:17.7080940Z"} +2025/02/06 01:00:18.703 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:18.7027730Z","device_time":"2025-02-06T06:00:18.7027740Z"} +2025/02/06 01:00:19.728 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:19.7280250Z","device_time":"2025-02-06T06:00:19.7280250Z"} +2025/02/06 01:00:20.752 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:20.7523590Z","device_time":"2025-02-06T06:00:20.7523590Z"} +2025/02/06 01:00:21.773 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:21.7732450Z","device_time":"2025-02-06T06:00:21.7732450Z"} +2025/02/06 01:00:22.793 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:22.7933450Z","device_time":"2025-02-06T06:00:22.7933450Z"} +2025/02/06 01:00:23.804 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:23.8040940Z","device_time":"2025-02-06T06:00:23.8040950Z"} +2025/02/06 01:00:24.836 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:24.8355270Z","device_time":"2025-02-06T06:00:24.8355270Z"} +2025/02/06 01:00:25.845 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:25.8450100Z","device_time":"2025-02-06T06:00:25.8450110Z"} +2025/02/06 01:00:26.892 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:26.8919920Z","device_time":"2025-02-06T06:00:26.8919930Z"} +2025/02/06 01:00:27.927 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:27.9268980Z","device_time":"2025-02-06T06:00:27.9268980Z"} +2025/02/06 01:00:28.932 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:28.9323630Z","device_time":"2025-02-06T06:00:28.9323630Z"} +2025/02/06 01:00:29.941 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:29.9408410Z","device_time":"2025-02-06T06:00:29.9408410Z"} +2025/02/06 01:00:30.989 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:30.9890450Z","device_time":"2025-02-06T06:00:30.9890450Z"} +2025/02/06 01:00:31.995 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:31.9947230Z","device_time":"2025-02-06T06:00:31.9947240Z"} +2025/02/06 01:00:33.038 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:33.0381440Z","device_time":"2025-02-06T06:00:33.0381440Z"} +2025/02/06 01:00:34.069 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:34.0688420Z","device_time":"2025-02-06T06:00:34.0688420Z"} +2025/02/06 01:00:35.086 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:35.0864110Z","device_time":"2025-02-06T06:00:35.0864120Z"} +2025/02/06 01:00:36.114 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:36.1140140Z","device_time":"2025-02-06T06:00:36.1140150Z"} +2025/02/06 01:00:37.169 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:37.1687840Z","device_time":"2025-02-06T06:00:37.1687850Z"} +2025/02/06 01:00:38.221 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:38.2208190Z","device_time":"2025-02-06T06:00:38.2208190Z"} +2025/02/06 01:00:39.252 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:39.2521190Z","device_time":"2025-02-06T06:00:39.2521200Z"} +2025/02/06 01:00:40.296 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:40.2963840Z","device_time":"2025-02-06T06:00:40.2963840Z"} +2025/02/06 01:00:41.300 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:41.2995280Z","device_time":"2025-02-06T06:00:41.2995290Z"} +2025/02/06 01:00:42.330 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:42.3296810Z","device_time":"2025-02-06T06:00:42.3296810Z"} +2025/02/06 01:00:43.360 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:43.3598710Z","device_time":"2025-02-06T06:00:43.3598710Z"} +2025/02/06 01:00:44.396 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:44.3946850Z","device_time":"2025-02-06T06:00:44.3946850Z"} +2025/02/06 01:00:45.402 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:45.4020780Z","device_time":"2025-02-06T06:00:45.4020780Z"} +2025/02/06 01:00:46.410 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:46.4101020Z","device_time":"2025-02-06T06:00:46.4101020Z"} +2025/02/06 01:00:47.444 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:47.4443350Z","device_time":"2025-02-06T06:00:47.4443360Z"} +2025/02/06 01:00:48.463 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:48.4629220Z","device_time":"2025-02-06T06:00:48.4629230Z"} +2025/02/06 01:00:49.470 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:49.4698370Z","device_time":"2025-02-06T06:00:49.4698370Z"} +2025/02/06 01:00:50.498 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:50.4971230Z","device_time":"2025-02-06T06:00:50.4971230Z"} +2025/02/06 01:00:51.524 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:51.5239520Z","device_time":"2025-02-06T06:00:51.5239530Z"} +2025/02/06 01:00:52.547 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:52.5472860Z","device_time":"2025-02-06T06:00:52.5472860Z"} +2025/02/06 01:00:53.569 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:53.5684510Z","device_time":"2025-02-06T06:00:53.5684520Z"} +2025/02/06 01:00:54.587 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:54.5870250Z","device_time":"2025-02-06T06:00:54.5870250Z"} +2025/02/06 01:00:55.567 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:55.5665890Z","device_time":"2025-02-06T06:00:55.5665900Z"} +2025/02/06 01:00:56.596 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:56.5958360Z","device_time":"2025-02-06T06:00:56.5958370Z"} +2025/02/06 01:00:57.635 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:57.6347100Z","device_time":"2025-02-06T06:00:57.6347110Z"} +2025/02/06 01:00:58.648 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:58.6480260Z","device_time":"2025-02-06T06:00:58.6480260Z"} +2025/02/06 01:00:59.693 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:00:59.6930090Z","device_time":"2025-02-06T06:00:59.6930100Z"} +2025/02/06 01:01:00.709 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:00.7091480Z","device_time":"2025-02-06T06:01:00.7091480Z"} +2025/02/06 01:01:01.730 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:01.7296360Z","device_time":"2025-02-06T06:01:01.7296370Z"} +2025/02/06 01:01:02.748 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:02.7482880Z","device_time":"2025-02-06T06:01:02.7482890Z"} +2025/02/06 01:01:03.760 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:03.7599380Z","device_time":"2025-02-06T06:01:03.7599380Z"} +2025/02/06 01:01:04.800 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:04.7997000Z","device_time":"2025-02-06T06:01:04.7997010Z"} +2025/02/06 01:01:05.836 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:05.8360200Z","device_time":"2025-02-06T06:01:05.8360200Z"} +2025/02/06 01:01:06.850 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:06.8501780Z","device_time":"2025-02-06T06:01:06.8501790Z"} +2025/02/06 01:01:07.905 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:07.9047360Z","device_time":"2025-02-06T06:01:07.9047360Z"} +2025/02/06 01:01:08.931 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:08.9314480Z","device_time":"2025-02-06T06:01:08.9314490Z"} +2025/02/06 01:01:09.974 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:09.9742520Z","device_time":"2025-02-06T06:01:09.9742530Z"} +2025/02/06 01:01:10.994 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:10.9935590Z","device_time":"2025-02-06T06:01:10.9935590Z"} +2025/02/06 01:01:11.984 28631 28676 Info Unity {"ntp_time":"2025-02-06T06:01:11.9839420Z","device_time":"2025-02-06T06:01:11.9839420Z"} diff --git a/python/evaluations/data/single_device/system_clock/tab_s6/run2-logcat.txt b/python/evaluations/data/single_device/system_clock/tab_s6/run2-logcat.txt new file mode 100644 index 0000000..1b6bc06 --- /dev/null +++ b/python/evaluations/data/single_device/system_clock/tab_s6/run2-logcat.txt @@ -0,0 +1,296 @@ +2025/02/06 01:02:16.246 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:16.2454240Z","device_time":"2025-02-06T06:02:16.2454250Z"} +2025/02/06 01:02:17.271 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:17.2706720Z","device_time":"2025-02-06T06:02:17.2706730Z"} +2025/02/06 01:02:18.276 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:18.2758770Z","device_time":"2025-02-06T06:02:18.2758770Z"} +2025/02/06 01:02:19.315 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:19.3152200Z","device_time":"2025-02-06T06:02:19.3152200Z"} +2025/02/06 01:02:20.354 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:20.3538910Z","device_time":"2025-02-06T06:02:20.3538910Z"} +2025/02/06 01:02:21.370 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:21.3705400Z","device_time":"2025-02-06T06:02:21.3705400Z"} +2025/02/06 01:02:22.405 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:22.4051540Z","device_time":"2025-02-06T06:02:22.4051540Z"} +2025/02/06 01:02:23.432 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:23.4323940Z","device_time":"2025-02-06T06:02:23.4323940Z"} +2025/02/06 01:02:24.464 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:24.4644870Z","device_time":"2025-02-06T06:02:24.4644870Z"} +2025/02/06 01:02:25.467 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:25.4669560Z","device_time":"2025-02-06T06:02:25.4669560Z"} +2025/02/06 01:02:26.506 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:26.5061730Z","device_time":"2025-02-06T06:02:26.5061730Z"} +2025/02/06 01:02:27.519 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:27.5192810Z","device_time":"2025-02-06T06:02:27.5192810Z"} +2025/02/06 01:02:28.532 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:28.5323620Z","device_time":"2025-02-06T06:02:28.5323630Z"} +2025/02/06 01:02:29.542 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:29.5420030Z","device_time":"2025-02-06T06:02:29.5420030Z"} +2025/02/06 01:02:30.573 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:30.5726600Z","device_time":"2025-02-06T06:02:30.5726600Z"} +2025/02/06 01:02:31.597 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:31.5966810Z","device_time":"2025-02-06T06:02:31.5966810Z"} +2025/02/06 01:02:32.600 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:32.6002580Z","device_time":"2025-02-06T06:02:32.6002580Z"} +2025/02/06 01:02:33.624 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:33.6244290Z","device_time":"2025-02-06T06:02:33.6244290Z"} +2025/02/06 01:02:34.647 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:34.6470520Z","device_time":"2025-02-06T06:02:34.6470520Z"} +2025/02/06 01:02:35.687 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:35.6867890Z","device_time":"2025-02-06T06:02:35.6867890Z"} +2025/02/06 01:02:36.693 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:36.6926410Z","device_time":"2025-02-06T06:02:36.6926420Z"} +2025/02/06 01:02:37.734 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:37.7338200Z","device_time":"2025-02-06T06:02:37.7338200Z"} +2025/02/06 01:02:38.748 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:38.7484280Z","device_time":"2025-02-06T06:02:38.7484280Z"} +2025/02/06 01:02:39.764 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:39.7639480Z","device_time":"2025-02-06T06:02:39.7639480Z"} +2025/02/06 01:02:40.793 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:40.7927190Z","device_time":"2025-02-06T06:02:40.7927200Z"} +2025/02/06 01:02:41.816 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:41.8164820Z","device_time":"2025-02-06T06:02:41.8164820Z"} +2025/02/06 01:02:42.825 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:42.8249160Z","device_time":"2025-02-06T06:02:42.8249160Z"} +2025/02/06 01:02:43.855 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:43.8551330Z","device_time":"2025-02-06T06:02:43.8551340Z"} +2025/02/06 01:02:44.863 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:44.8626180Z","device_time":"2025-02-06T06:02:44.8626180Z"} +2025/02/06 01:02:45.880 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:45.8797680Z","device_time":"2025-02-06T06:02:45.8797680Z"} +2025/02/06 01:02:46.880 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:46.8800820Z","device_time":"2025-02-06T06:02:46.8800830Z"} +2025/02/06 01:02:47.925 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:47.9245260Z","device_time":"2025-02-06T06:02:47.9245270Z"} +2025/02/06 01:02:48.934 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:48.9337980Z","device_time":"2025-02-06T06:02:48.9337980Z"} +2025/02/06 01:02:49.970 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:49.9697580Z","device_time":"2025-02-06T06:02:49.9697590Z"} +2025/02/06 01:02:50.983 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:50.9830010Z","device_time":"2025-02-06T06:02:50.9830010Z"} +2025/02/06 01:02:51.998 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:51.9977720Z","device_time":"2025-02-06T06:02:51.9977730Z"} +2025/02/06 01:02:53.031 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:53.0314770Z","device_time":"2025-02-06T06:02:53.0314780Z"} +2025/02/06 01:02:54.059 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:54.0587100Z","device_time":"2025-02-06T06:02:54.0587110Z"} +2025/02/06 01:02:55.066 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:55.0662560Z","device_time":"2025-02-06T06:02:55.0662570Z"} +2025/02/06 01:02:56.070 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:56.0698450Z","device_time":"2025-02-06T06:02:56.0698450Z"} +2025/02/06 01:02:57.097 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:57.0969110Z","device_time":"2025-02-06T06:02:57.0969120Z"} +2025/02/06 01:02:58.126 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:58.1260830Z","device_time":"2025-02-06T06:02:58.1260830Z"} +2025/02/06 01:02:59.119 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:02:59.1188340Z","device_time":"2025-02-06T06:02:59.1188340Z"} +2025/02/06 01:03:00.154 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:00.1544600Z","device_time":"2025-02-06T06:03:00.1544610Z"} +2025/02/06 01:03:01.180 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:01.1779630Z","device_time":"2025-02-06T06:03:01.1779630Z"} +2025/02/06 01:03:02.185 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:02.1852200Z","device_time":"2025-02-06T06:03:02.1852210Z"} +2025/02/06 01:03:03.219 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:03.2194410Z","device_time":"2025-02-06T06:03:03.2194410Z"} +2025/02/06 01:03:04.294 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:04.2934710Z","device_time":"2025-02-06T06:03:04.2934710Z"} +2025/02/06 01:03:05.296 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:05.2964210Z","device_time":"2025-02-06T06:03:05.2964220Z"} +2025/02/06 01:03:06.274 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:06.2735510Z","device_time":"2025-02-06T06:03:06.2735520Z"} +2025/02/06 01:03:07.309 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:07.3087560Z","device_time":"2025-02-06T06:03:07.3087570Z"} +2025/02/06 01:03:08.361 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:08.3607430Z","device_time":"2025-02-06T06:03:08.3607440Z"} +2025/02/06 01:03:09.415 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:09.4151470Z","device_time":"2025-02-06T06:03:09.4151470Z"} +2025/02/06 01:03:10.440 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:10.4403000Z","device_time":"2025-02-06T06:03:10.4403010Z"} +2025/02/06 01:03:11.475 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:11.4719460Z","device_time":"2025-02-06T06:03:11.4719460Z"} +2025/02/06 01:03:12.470 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:12.4696860Z","device_time":"2025-02-06T06:03:12.4696860Z"} +2025/02/06 01:03:13.528 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:13.5276860Z","device_time":"2025-02-06T06:03:13.5276860Z"} +2025/02/06 01:03:14.541 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:14.5407480Z","device_time":"2025-02-06T06:03:14.5407480Z"} +2025/02/06 01:03:15.585 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:15.5847650Z","device_time":"2025-02-06T06:03:15.5847650Z"} +2025/02/06 01:03:16.599 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:16.5991260Z","device_time":"2025-02-06T06:03:16.5991260Z"} +2025/02/06 01:03:17.629 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:17.6291410Z","device_time":"2025-02-06T06:03:17.6291410Z"} +2025/02/06 01:03:18.647 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:18.6472230Z","device_time":"2025-02-06T06:03:18.6472240Z"} +2025/02/06 01:03:19.692 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:19.6917700Z","device_time":"2025-02-06T06:03:19.6917700Z"} +2025/02/06 01:03:20.727 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:20.7248270Z","device_time":"2025-02-06T06:03:20.7248280Z"} +2025/02/06 01:03:21.754 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:21.7539150Z","device_time":"2025-02-06T06:03:21.7539150Z"} +2025/02/06 01:03:22.770 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:22.7699500Z","device_time":"2025-02-06T06:03:22.7699510Z"} +2025/02/06 01:03:23.805 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:23.8052470Z","device_time":"2025-02-06T06:03:23.8052470Z"} +2025/02/06 01:03:24.819 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:24.8191950Z","device_time":"2025-02-06T06:03:24.8191950Z"} +2025/02/06 01:03:25.840 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:25.8400180Z","device_time":"2025-02-06T06:03:25.8400190Z"} +2025/02/06 01:03:26.867 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:26.8671700Z","device_time":"2025-02-06T06:03:26.8671700Z"} +2025/02/06 01:03:27.864 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:27.8634560Z","device_time":"2025-02-06T06:03:27.8634560Z"} +2025/02/06 01:03:28.930 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:28.9298680Z","device_time":"2025-02-06T06:03:28.9298690Z"} +2025/02/06 01:03:29.947 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:29.9466290Z","device_time":"2025-02-06T06:03:29.9466290Z"} +2025/02/06 01:03:30.939 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:30.9391340Z","device_time":"2025-02-06T06:03:30.9391340Z"} +2025/02/06 01:03:31.963 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:31.9633720Z","device_time":"2025-02-06T06:03:31.9633720Z"} +2025/02/06 01:03:32.959 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:32.9592580Z","device_time":"2025-02-06T06:03:32.9592580Z"} +2025/02/06 01:03:33.984 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:33.9838880Z","device_time":"2025-02-06T06:03:33.9838880Z"} +2025/02/06 01:03:34.990 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:34.9896910Z","device_time":"2025-02-06T06:03:34.9896910Z"} +2025/02/06 01:03:36.014 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:36.0141970Z","device_time":"2025-02-06T06:03:36.0141980Z"} +2025/02/06 01:03:37.041 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:37.0413690Z","device_time":"2025-02-06T06:03:37.0413700Z"} +2025/02/06 01:03:38.043 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:38.0424160Z","device_time":"2025-02-06T06:03:38.0424170Z"} +2025/02/06 01:03:39.057 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:39.0566560Z","device_time":"2025-02-06T06:03:39.0566560Z"} +2025/02/06 01:03:40.083 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:40.0828590Z","device_time":"2025-02-06T06:03:40.0828600Z"} +2025/02/06 01:03:41.100 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:41.0997550Z","device_time":"2025-02-06T06:03:41.0997550Z"} +2025/02/06 01:03:42.136 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:42.1354500Z","device_time":"2025-02-06T06:03:42.1354510Z"} +2025/02/06 01:03:43.141 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:43.1410160Z","device_time":"2025-02-06T06:03:43.1410170Z"} +2025/02/06 01:03:44.164 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:44.1640950Z","device_time":"2025-02-06T06:03:44.1640950Z"} +2025/02/06 01:03:45.188 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:45.1880540Z","device_time":"2025-02-06T06:03:45.1880550Z"} +2025/02/06 01:03:46.206 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:46.2055570Z","device_time":"2025-02-06T06:03:46.2055570Z"} +2025/02/06 01:03:47.223 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:47.2231790Z","device_time":"2025-02-06T06:03:47.2231800Z"} +2025/02/06 01:03:48.238 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:48.2375300Z","device_time":"2025-02-06T06:03:48.2375310Z"} +2025/02/06 01:03:49.263 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:49.2635360Z","device_time":"2025-02-06T06:03:49.2635370Z"} +2025/02/06 01:03:50.307 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:50.3053570Z","device_time":"2025-02-06T06:03:50.3053580Z"} +2025/02/06 01:03:51.329 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:51.3294500Z","device_time":"2025-02-06T06:03:51.3294500Z"} +2025/02/06 01:03:52.351 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:52.3508870Z","device_time":"2025-02-06T06:03:52.3508880Z"} +2025/02/06 01:03:53.392 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:53.3901440Z","device_time":"2025-02-06T06:03:53.3901440Z"} +2025/02/06 01:03:54.399 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:54.3986550Z","device_time":"2025-02-06T06:03:54.3986550Z"} +2025/02/06 01:03:55.415 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:55.4145250Z","device_time":"2025-02-06T06:03:55.4145250Z"} +2025/02/06 01:03:56.435 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:56.4348560Z","device_time":"2025-02-06T06:03:56.4348560Z"} +2025/02/06 01:03:57.440 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:57.4404390Z","device_time":"2025-02-06T06:03:57.4404400Z"} +2025/02/06 01:03:58.464 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:58.4643950Z","device_time":"2025-02-06T06:03:58.4643950Z"} +2025/02/06 01:03:59.519 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:03:59.5189360Z","device_time":"2025-02-06T06:03:59.5189370Z"} +2025/02/06 01:04:00.535 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:00.5346500Z","device_time":"2025-02-06T06:04:00.5346510Z"} +2025/02/06 01:04:01.569 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:01.5672530Z","device_time":"2025-02-06T06:04:01.5672530Z"} +2025/02/06 01:04:02.597 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:02.5972480Z","device_time":"2025-02-06T06:04:02.5972480Z"} +2025/02/06 01:04:03.607 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:03.6067470Z","device_time":"2025-02-06T06:04:03.6067480Z"} +2025/02/06 01:04:04.621 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:04.6211700Z","device_time":"2025-02-06T06:04:04.6211700Z"} +2025/02/06 01:04:05.636 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:05.6364360Z","device_time":"2025-02-06T06:04:05.6364370Z"} +2025/02/06 01:04:06.654 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:06.6544510Z","device_time":"2025-02-06T06:04:06.6544520Z"} +2025/02/06 01:04:07.684 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:07.6836350Z","device_time":"2025-02-06T06:04:07.6836360Z"} +2025/02/06 01:04:08.702 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:08.7016790Z","device_time":"2025-02-06T06:04:08.7016800Z"} +2025/02/06 01:04:09.725 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:09.7247910Z","device_time":"2025-02-06T06:04:09.7247910Z"} +2025/02/06 01:04:10.767 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:10.7666400Z","device_time":"2025-02-06T06:04:10.7666410Z"} +2025/02/06 01:04:11.779 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:11.7794310Z","device_time":"2025-02-06T06:04:11.7794310Z"} +2025/02/06 01:04:12.826 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:12.8264930Z","device_time":"2025-02-06T06:04:12.8264940Z"} +2025/02/06 01:04:13.843 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:13.8426730Z","device_time":"2025-02-06T06:04:13.8426730Z"} +2025/02/06 01:04:14.858 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:14.8575980Z","device_time":"2025-02-06T06:04:14.8575990Z"} +2025/02/06 01:04:15.854 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:15.8538560Z","device_time":"2025-02-06T06:04:15.8538570Z"} +2025/02/06 01:04:16.868 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:16.8676480Z","device_time":"2025-02-06T06:04:16.8676490Z"} +2025/02/06 01:04:17.902 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:17.9020750Z","device_time":"2025-02-06T06:04:17.9020760Z"} +2025/02/06 01:04:18.907 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:18.9067660Z","device_time":"2025-02-06T06:04:18.9067660Z"} +2025/02/06 01:04:19.952 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:19.9521630Z","device_time":"2025-02-06T06:04:19.9521630Z"} +2025/02/06 01:04:20.953 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:20.9528310Z","device_time":"2025-02-06T06:04:20.9528320Z"} +2025/02/06 01:04:21.975 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:21.9747700Z","device_time":"2025-02-06T06:04:21.9747710Z"} +2025/02/06 01:04:22.990 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:22.9888420Z","device_time":"2025-02-06T06:04:22.9888430Z"} +2025/02/06 01:04:24.017 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:24.0173260Z","device_time":"2025-02-06T06:04:24.0173270Z"} +2025/02/06 01:04:25.021 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:25.0205090Z","device_time":"2025-02-06T06:04:25.0205090Z"} +2025/02/06 01:04:26.059 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:26.0594130Z","device_time":"2025-02-06T06:04:26.0594130Z"} +2025/02/06 01:04:27.079 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:27.0790740Z","device_time":"2025-02-06T06:04:27.0790750Z"} +2025/02/06 01:04:28.143 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:28.1428300Z","device_time":"2025-02-06T06:04:28.1428310Z"} +2025/02/06 01:04:29.152 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:29.1519410Z","device_time":"2025-02-06T06:04:29.1519410Z"} +2025/02/06 01:04:30.151 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:30.1505050Z","device_time":"2025-02-06T06:04:30.1505050Z"} +2025/02/06 01:04:31.158 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:31.1579370Z","device_time":"2025-02-06T06:04:31.1579380Z"} +2025/02/06 01:04:32.175 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:32.1747130Z","device_time":"2025-02-06T06:04:32.1747130Z"} +2025/02/06 01:04:33.190 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:33.1883440Z","device_time":"2025-02-06T06:04:33.1883450Z"} +2025/02/06 01:04:34.214 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:34.2136890Z","device_time":"2025-02-06T06:04:34.2136900Z"} +2025/02/06 01:04:35.255 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:35.2553960Z","device_time":"2025-02-06T06:04:35.2553960Z"} +2025/02/06 01:04:36.285 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:36.2846100Z","device_time":"2025-02-06T06:04:36.2846100Z"} +2025/02/06 01:04:37.285 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:37.2848800Z","device_time":"2025-02-06T06:04:37.2848800Z"} +2025/02/06 01:04:38.291 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:38.2913050Z","device_time":"2025-02-06T06:04:38.2913060Z"} +2025/02/06 01:04:39.335 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:39.3354160Z","device_time":"2025-02-06T06:04:39.3354170Z"} +2025/02/06 01:04:40.345 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:40.3451960Z","device_time":"2025-02-06T06:04:40.3451960Z"} +2025/02/06 01:04:41.357 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:41.3568140Z","device_time":"2025-02-06T06:04:41.3568150Z"} +2025/02/06 01:04:42.366 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:42.3656730Z","device_time":"2025-02-06T06:04:42.3656740Z"} +2025/02/06 01:04:43.401 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:43.4012450Z","device_time":"2025-02-06T06:04:43.4012460Z"} +2025/02/06 01:04:44.410 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:44.4104470Z","device_time":"2025-02-06T06:04:44.4104470Z"} +2025/02/06 01:04:45.454 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:45.4535820Z","device_time":"2025-02-06T06:04:45.4535830Z"} +2025/02/06 01:04:46.478 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:46.4783500Z","device_time":"2025-02-06T06:04:46.4783500Z"} +2025/02/06 01:04:47.488 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:47.4876830Z","device_time":"2025-02-06T06:04:47.4876830Z"} +2025/02/06 01:04:48.517 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:48.5173800Z","device_time":"2025-02-06T06:04:48.5173810Z"} +2025/02/06 01:04:49.527 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:49.5270860Z","device_time":"2025-02-06T06:04:49.5270870Z"} +2025/02/06 01:04:50.566 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:50.5657400Z","device_time":"2025-02-06T06:04:50.5657410Z"} +2025/02/06 01:04:51.584 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:51.5840120Z","device_time":"2025-02-06T06:04:51.5840120Z"} +2025/02/06 01:04:52.616 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:52.6155850Z","device_time":"2025-02-06T06:04:52.6155850Z"} +2025/02/06 01:04:53.630 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:53.6298910Z","device_time":"2025-02-06T06:04:53.6298920Z"} +2025/02/06 01:04:54.665 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:54.6647820Z","device_time":"2025-02-06T06:04:54.6647820Z"} +2025/02/06 01:04:55.673 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:55.6730050Z","device_time":"2025-02-06T06:04:55.6730050Z"} +2025/02/06 01:04:56.685 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:56.6847370Z","device_time":"2025-02-06T06:04:56.6847380Z"} +2025/02/06 01:04:57.706 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:57.7061480Z","device_time":"2025-02-06T06:04:57.7061490Z"} +2025/02/06 01:04:58.706 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:58.7064720Z","device_time":"2025-02-06T06:04:58.7064720Z"} +2025/02/06 01:04:59.744 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:04:59.7436670Z","device_time":"2025-02-06T06:04:59.7436680Z"} +2025/02/06 01:05:00.782 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:00.7818350Z","device_time":"2025-02-06T06:05:00.7818350Z"} +2025/02/06 01:05:01.811 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:01.8106930Z","device_time":"2025-02-06T06:05:01.8106930Z"} +2025/02/06 01:05:02.819 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:02.8185090Z","device_time":"2025-02-06T06:05:02.8185090Z"} +2025/02/06 01:05:03.819 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:03.8184980Z","device_time":"2025-02-06T06:05:03.8184990Z"} +2025/02/06 01:05:04.851 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:04.8510530Z","device_time":"2025-02-06T06:05:04.8510530Z"} +2025/02/06 01:05:05.889 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:05.8895250Z","device_time":"2025-02-06T06:05:05.8895260Z"} +2025/02/06 01:05:06.940 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:06.9399160Z","device_time":"2025-02-06T06:05:06.9399160Z"} +2025/02/06 01:05:07.924 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:07.9242210Z","device_time":"2025-02-06T06:05:07.9242210Z"} +2025/02/06 01:05:08.949 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:08.9492410Z","device_time":"2025-02-06T06:05:08.9492420Z"} +2025/02/06 01:05:09.964 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:09.9638280Z","device_time":"2025-02-06T06:05:09.9638280Z"} +2025/02/06 01:05:11.003 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:11.0034400Z","device_time":"2025-02-06T06:05:11.0034400Z"} +2025/02/06 01:05:12.045 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:12.0446680Z","device_time":"2025-02-06T06:05:12.0446680Z"} +2025/02/06 01:05:13.050 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:13.0499760Z","device_time":"2025-02-06T06:05:13.0499770Z"} +2025/02/06 01:05:14.063 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:14.0632470Z","device_time":"2025-02-06T06:05:14.0632480Z"} +2025/02/06 01:05:15.077 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:15.0767520Z","device_time":"2025-02-06T06:05:15.0767520Z"} +2025/02/06 01:05:16.116 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:16.1162760Z","device_time":"2025-02-06T06:05:16.1162760Z"} +2025/02/06 01:05:17.121 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:17.1207390Z","device_time":"2025-02-06T06:05:17.1207400Z"} +2025/02/06 01:05:18.134 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:18.1344900Z","device_time":"2025-02-06T06:05:18.1344900Z"} +2025/02/06 01:05:19.146 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:19.1463160Z","device_time":"2025-02-06T06:05:19.1463170Z"} +2025/02/06 01:05:20.181 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:20.1808890Z","device_time":"2025-02-06T06:05:20.1808890Z"} +2025/02/06 01:05:21.205 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:21.2048020Z","device_time":"2025-02-06T06:05:21.2048020Z"} +2025/02/06 01:05:22.228 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:22.2276120Z","device_time":"2025-02-06T06:05:22.2276130Z"} +2025/02/06 01:05:23.224 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:23.2235410Z","device_time":"2025-02-06T06:05:23.2235420Z"} +2025/02/06 01:05:24.260 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:24.2595450Z","device_time":"2025-02-06T06:05:24.2595450Z"} +2025/02/06 01:05:25.252 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:25.2519080Z","device_time":"2025-02-06T06:05:25.2519080Z"} +2025/02/06 01:05:26.275 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:26.2747790Z","device_time":"2025-02-06T06:05:26.2747790Z"} +2025/02/06 01:05:27.307 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:27.3067450Z","device_time":"2025-02-06T06:05:27.3067460Z"} +2025/02/06 01:05:28.307 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:28.3068090Z","device_time":"2025-02-06T06:05:28.3068090Z"} +2025/02/06 01:05:29.351 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:29.3506710Z","device_time":"2025-02-06T06:05:29.3506720Z"} +2025/02/06 01:05:30.335 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:30.3354000Z","device_time":"2025-02-06T06:05:30.3354000Z"} +2025/02/06 01:05:31.369 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:31.3694100Z","device_time":"2025-02-06T06:05:31.3694110Z"} +2025/02/06 01:05:32.408 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:32.4080670Z","device_time":"2025-02-06T06:05:32.4080670Z"} +2025/02/06 01:05:33.395 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:33.3927510Z","device_time":"2025-02-06T06:05:33.3927510Z"} +2025/02/06 01:05:34.427 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:34.4266210Z","device_time":"2025-02-06T06:05:34.4266220Z"} +2025/02/06 01:05:35.450 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:35.4497930Z","device_time":"2025-02-06T06:05:35.4497930Z"} +2025/02/06 01:05:36.486 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:36.4859760Z","device_time":"2025-02-06T06:05:36.4859770Z"} +2025/02/06 01:05:37.501 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:37.5012080Z","device_time":"2025-02-06T06:05:37.5012090Z"} +2025/02/06 01:05:38.520 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:38.5203660Z","device_time":"2025-02-06T06:05:38.5203660Z"} +2025/02/06 01:05:39.533 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:39.5332580Z","device_time":"2025-02-06T06:05:39.5332580Z"} +2025/02/06 01:05:40.545 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:40.5448290Z","device_time":"2025-02-06T06:05:40.5448290Z"} +2025/02/06 01:05:41.573 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:41.5728380Z","device_time":"2025-02-06T06:05:41.5728380Z"} +2025/02/06 01:05:42.607 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:42.6069030Z","device_time":"2025-02-06T06:05:42.6069040Z"} +2025/02/06 01:05:43.643 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:43.6430130Z","device_time":"2025-02-06T06:05:43.6430140Z"} +2025/02/06 01:05:44.646 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:44.6456960Z","device_time":"2025-02-06T06:05:44.6456960Z"} +2025/02/06 01:05:45.700 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:45.6996700Z","device_time":"2025-02-06T06:05:45.6996700Z"} +2025/02/06 01:05:46.687 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:46.6870860Z","device_time":"2025-02-06T06:05:46.6870870Z"} +2025/02/06 01:05:47.706 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:47.7060300Z","device_time":"2025-02-06T06:05:47.7060300Z"} +2025/02/06 01:05:48.709 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:48.7086030Z","device_time":"2025-02-06T06:05:48.7086030Z"} +2025/02/06 01:05:49.736 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:49.7355710Z","device_time":"2025-02-06T06:05:49.7355710Z"} +2025/02/06 01:05:50.748 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:50.7480540Z","device_time":"2025-02-06T06:05:50.7480540Z"} +2025/02/06 01:05:51.758 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:51.7576180Z","device_time":"2025-02-06T06:05:51.7576190Z"} +2025/02/06 01:05:52.789 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:52.7889950Z","device_time":"2025-02-06T06:05:52.7889950Z"} +2025/02/06 01:05:53.815 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:53.8145130Z","device_time":"2025-02-06T06:05:53.8145130Z"} +2025/02/06 01:05:54.828 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:54.8284230Z","device_time":"2025-02-06T06:05:54.8284240Z"} +2025/02/06 01:05:55.837 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:55.8366350Z","device_time":"2025-02-06T06:05:55.8366360Z"} +2025/02/06 01:05:56.878 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:56.8785140Z","device_time":"2025-02-06T06:05:56.8785140Z"} +2025/02/06 01:05:57.889 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:57.8885550Z","device_time":"2025-02-06T06:05:57.8885560Z"} +2025/02/06 01:05:58.907 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:58.9070190Z","device_time":"2025-02-06T06:05:58.9070200Z"} +2025/02/06 01:05:59.941 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:05:59.9406750Z","device_time":"2025-02-06T06:05:59.9406750Z"} +2025/02/06 01:06:00.961 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:00.9611960Z","device_time":"2025-02-06T06:06:00.9611960Z"} +2025/02/06 01:06:01.986 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:01.9863990Z","device_time":"2025-02-06T06:06:01.9863990Z"} +2025/02/06 01:06:03.028 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:03.0281620Z","device_time":"2025-02-06T06:06:03.0281620Z"} +2025/02/06 01:06:04.042 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:04.0417920Z","device_time":"2025-02-06T06:06:04.0417930Z"} +2025/02/06 01:06:05.045 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:05.0449790Z","device_time":"2025-02-06T06:06:05.0449800Z"} +2025/02/06 01:06:06.089 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:06.0893450Z","device_time":"2025-02-06T06:06:06.0893450Z"} +2025/02/06 01:06:07.116 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:07.1164540Z","device_time":"2025-02-06T06:06:07.1164550Z"} +2025/02/06 01:06:08.111 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:08.1111770Z","device_time":"2025-02-06T06:06:08.1111770Z"} +2025/02/06 01:06:09.144 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:09.1435150Z","device_time":"2025-02-06T06:06:09.1435160Z"} +2025/02/06 01:06:10.153 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:10.1527570Z","device_time":"2025-02-06T06:06:10.1527570Z"} +2025/02/06 01:06:11.175 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:11.1745730Z","device_time":"2025-02-06T06:06:11.1745730Z"} +2025/02/06 01:06:12.182 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:12.1824790Z","device_time":"2025-02-06T06:06:12.1824790Z"} +2025/02/06 01:06:13.211 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:13.2095970Z","device_time":"2025-02-06T06:06:13.2095970Z"} +2025/02/06 01:06:14.263 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:14.2633120Z","device_time":"2025-02-06T06:06:14.2633120Z"} +2025/02/06 01:06:15.276 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:15.2757640Z","device_time":"2025-02-06T06:06:15.2757640Z"} +2025/02/06 01:06:16.285 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:16.2849410Z","device_time":"2025-02-06T06:06:16.2849410Z"} +2025/02/06 01:06:17.329 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:17.3289470Z","device_time":"2025-02-06T06:06:17.3289470Z"} +2025/02/06 01:06:18.341 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:18.3410470Z","device_time":"2025-02-06T06:06:18.3410480Z"} +2025/02/06 01:06:19.374 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:19.3742900Z","device_time":"2025-02-06T06:06:19.3742910Z"} +2025/02/06 01:06:20.410 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:20.4092260Z","device_time":"2025-02-06T06:06:20.4092270Z"} +2025/02/06 01:06:21.414 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:21.4144470Z","device_time":"2025-02-06T06:06:21.4144470Z"} +2025/02/06 01:06:22.455 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:22.4553310Z","device_time":"2025-02-06T06:06:22.4553320Z"} +2025/02/06 01:06:23.442 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:23.4416080Z","device_time":"2025-02-06T06:06:23.4416080Z"} +2025/02/06 01:06:24.477 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:24.4771520Z","device_time":"2025-02-06T06:06:24.4771520Z"} +2025/02/06 01:06:25.486 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:25.4855140Z","device_time":"2025-02-06T06:06:25.4855150Z"} +2025/02/06 01:06:26.523 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:26.5231180Z","device_time":"2025-02-06T06:06:26.5231190Z"} +2025/02/06 01:06:27.573 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:27.5726750Z","device_time":"2025-02-06T06:06:27.5726750Z"} +2025/02/06 01:06:28.572 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:28.5713680Z","device_time":"2025-02-06T06:06:28.5713680Z"} +2025/02/06 01:06:29.599 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:29.5989050Z","device_time":"2025-02-06T06:06:29.5989060Z"} +2025/02/06 01:06:30.625 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:30.6249310Z","device_time":"2025-02-06T06:06:30.6249320Z"} +2025/02/06 01:06:31.636 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:31.6363450Z","device_time":"2025-02-06T06:06:31.6363450Z"} +2025/02/06 01:06:32.675 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:32.6749090Z","device_time":"2025-02-06T06:06:32.6749090Z"} +2025/02/06 01:06:33.688 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:33.6879220Z","device_time":"2025-02-06T06:06:33.6879220Z"} +2025/02/06 01:06:34.698 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:34.6984540Z","device_time":"2025-02-06T06:06:34.6984540Z"} +2025/02/06 01:06:35.738 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:35.7375230Z","device_time":"2025-02-06T06:06:35.7375240Z"} +2025/02/06 01:06:36.736 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:36.7354870Z","device_time":"2025-02-06T06:06:36.7354890Z"} +2025/02/06 01:06:37.755 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:37.7548700Z","device_time":"2025-02-06T06:06:37.7548710Z"} +2025/02/06 01:06:38.759 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:38.7586840Z","device_time":"2025-02-06T06:06:38.7586850Z"} +2025/02/06 01:06:39.775 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:39.7749870Z","device_time":"2025-02-06T06:06:39.7749880Z"} +2025/02/06 01:06:40.851 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:40.8512740Z","device_time":"2025-02-06T06:06:40.8512750Z"} +2025/02/06 01:06:41.856 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:41.8559530Z","device_time":"2025-02-06T06:06:41.8559540Z"} +2025/02/06 01:06:42.884 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:42.8842680Z","device_time":"2025-02-06T06:06:42.8842680Z"} +2025/02/06 01:06:43.904 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:43.9034700Z","device_time":"2025-02-06T06:06:43.9034710Z"} +2025/02/06 01:06:44.898 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:44.8983400Z","device_time":"2025-02-06T06:06:44.8983410Z"} +2025/02/06 01:06:45.921 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:45.9208290Z","device_time":"2025-02-06T06:06:45.9208290Z"} +2025/02/06 01:06:46.936 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:46.9356810Z","device_time":"2025-02-06T06:06:46.9356820Z"} +2025/02/06 01:06:47.967 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:47.9670220Z","device_time":"2025-02-06T06:06:47.9670230Z"} +2025/02/06 01:06:48.974 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:48.9744710Z","device_time":"2025-02-06T06:06:48.9744720Z"} +2025/02/06 01:06:49.989 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:49.9893350Z","device_time":"2025-02-06T06:06:49.9893350Z"} +2025/02/06 01:06:51.027 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:51.0274770Z","device_time":"2025-02-06T06:06:51.0274770Z"} +2025/02/06 01:06:52.036 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:52.0358720Z","device_time":"2025-02-06T06:06:52.0358730Z"} +2025/02/06 01:06:53.079 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:53.0784210Z","device_time":"2025-02-06T06:06:53.0784220Z"} +2025/02/06 01:06:54.100 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:54.0998480Z","device_time":"2025-02-06T06:06:54.0998490Z"} +2025/02/06 01:06:55.117 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:55.1169730Z","device_time":"2025-02-06T06:06:55.1169740Z"} +2025/02/06 01:06:56.133 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:56.1325650Z","device_time":"2025-02-06T06:06:56.1325660Z"} +2025/02/06 01:06:57.148 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:57.1473340Z","device_time":"2025-02-06T06:06:57.1478110Z"} +2025/02/06 01:06:58.176 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:58.1756560Z","device_time":"2025-02-06T06:06:58.1756560Z"} +2025/02/06 01:06:59.209 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:06:59.2085480Z","device_time":"2025-02-06T06:06:59.2085490Z"} +2025/02/06 01:07:00.234 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:00.2343210Z","device_time":"2025-02-06T06:07:00.2343220Z"} +2025/02/06 01:07:01.244 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:01.2436330Z","device_time":"2025-02-06T06:07:01.2436330Z"} +2025/02/06 01:07:02.269 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:02.2688070Z","device_time":"2025-02-06T06:07:02.2688070Z"} +2025/02/06 01:07:03.304 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:03.3044150Z","device_time":"2025-02-06T06:07:03.3044150Z"} +2025/02/06 01:07:04.304 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:04.3039220Z","device_time":"2025-02-06T06:07:04.3039230Z"} +2025/02/06 01:07:05.348 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:05.3479480Z","device_time":"2025-02-06T06:07:05.3479490Z"} +2025/02/06 01:07:06.387 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:06.3871370Z","device_time":"2025-02-06T06:07:06.3871370Z"} +2025/02/06 01:07:07.375 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:07.3748420Z","device_time":"2025-02-06T06:07:07.3748420Z"} +2025/02/06 01:07:08.422 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:08.4217830Z","device_time":"2025-02-06T06:07:08.4217840Z"} +2025/02/06 01:07:09.421 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:09.4206740Z","device_time":"2025-02-06T06:07:09.4206750Z"} +2025/02/06 01:07:10.459 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:10.4587080Z","device_time":"2025-02-06T06:07:10.4587090Z"} +2025/02/06 01:07:11.496 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:11.4956930Z","device_time":"2025-02-06T06:07:11.4956930Z"} +2025/02/06 01:07:12.513 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:12.5132390Z","device_time":"2025-02-06T06:07:12.5132400Z"} +2025/02/06 01:07:13.537 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:13.5353200Z","device_time":"2025-02-06T06:07:13.5353200Z"} +2025/02/06 01:07:14.552 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:14.5524140Z","device_time":"2025-02-06T06:07:14.5524150Z"} +2025/02/06 01:07:15.563 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:15.5614300Z","device_time":"2025-02-06T06:07:15.5614310Z"} +2025/02/06 01:07:16.567 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:16.5674900Z","device_time":"2025-02-06T06:07:16.5674910Z"} +2025/02/06 01:07:17.659 32485 32525 Info Unity {"ntp_time":"2025-02-06T06:07:17.6592860Z","device_time":"2025-02-06T06:07:17.6592870Z"} diff --git a/python/evaluations/data/single_device/system_clock/tab_s6/run3-logcat.txt b/python/evaluations/data/single_device/system_clock/tab_s6/run3-logcat.txt new file mode 100644 index 0000000..53d52ac --- /dev/null +++ b/python/evaluations/data/single_device/system_clock/tab_s6/run3-logcat.txt @@ -0,0 +1,292 @@ +2025/02/06 01:08:11.110 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:11.1087970Z","device_time":"2025-02-06T06:08:11.1087970Z"} +2025/02/06 01:08:12.134 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:12.1337980Z","device_time":"2025-02-06T06:08:12.1337990Z"} +2025/02/06 01:08:13.139 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:13.1394090Z","device_time":"2025-02-06T06:08:13.1394090Z"} +2025/02/06 01:08:14.170 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:14.1696310Z","device_time":"2025-02-06T06:08:14.1696310Z"} +2025/02/06 01:08:15.261 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:15.2613230Z","device_time":"2025-02-06T06:08:15.2613230Z"} +2025/02/06 01:08:16.276 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:16.2757090Z","device_time":"2025-02-06T06:08:16.2757090Z"} +2025/02/06 01:08:17.279 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:17.2789820Z","device_time":"2025-02-06T06:08:17.2789830Z"} +2025/02/06 01:08:18.319 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:18.3192500Z","device_time":"2025-02-06T06:08:18.3192500Z"} +2025/02/06 01:08:19.329 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:19.3282420Z","device_time":"2025-02-06T06:08:19.3282420Z"} +2025/02/06 01:08:20.637 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:20.6369910Z","device_time":"2025-02-06T06:08:20.6369920Z"} +2025/02/06 01:08:22.632 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:22.6317430Z","device_time":"2025-02-06T06:08:22.6317430Z"} +2025/02/06 01:08:23.636 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:23.6365560Z","device_time":"2025-02-06T06:08:23.6365560Z"} +2025/02/06 01:08:24.611 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:24.6107910Z","device_time":"2025-02-06T06:08:24.6107920Z"} +2025/02/06 01:08:25.630 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:25.6295010Z","device_time":"2025-02-06T06:08:25.6295010Z"} +2025/02/06 01:08:26.647 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:26.6468170Z","device_time":"2025-02-06T06:08:26.6468180Z"} +2025/02/06 01:08:27.682 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:27.6820470Z","device_time":"2025-02-06T06:08:27.6820480Z"} +2025/02/06 01:08:28.686 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:28.6863590Z","device_time":"2025-02-06T06:08:28.6863600Z"} +2025/02/06 01:08:29.726 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:29.7261770Z","device_time":"2025-02-06T06:08:29.7261770Z"} +2025/02/06 01:08:30.768 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:30.7679620Z","device_time":"2025-02-06T06:08:30.7679630Z"} +2025/02/06 01:08:31.789 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:31.7890450Z","device_time":"2025-02-06T06:08:31.7890450Z"} +2025/02/06 01:08:32.825 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:32.8250860Z","device_time":"2025-02-06T06:08:32.8250870Z"} +2025/02/06 01:08:33.871 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:33.8703660Z","device_time":"2025-02-06T06:08:33.8703660Z"} +2025/02/06 01:08:34.865 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:34.8645670Z","device_time":"2025-02-06T06:08:34.8645670Z"} +2025/02/06 01:08:35.875 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:35.8754550Z","device_time":"2025-02-06T06:08:35.8754560Z"} +2025/02/06 01:08:36.913 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:36.9132690Z","device_time":"2025-02-06T06:08:36.9132690Z"} +2025/02/06 01:08:37.941 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:37.9407590Z","device_time":"2025-02-06T06:08:37.9407600Z"} +2025/02/06 01:08:38.938 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:38.9378280Z","device_time":"2025-02-06T06:08:38.9378280Z"} +2025/02/06 01:08:39.980 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:39.9797280Z","device_time":"2025-02-06T06:08:39.9797290Z"} +2025/02/06 01:08:41.012 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:41.0122690Z","device_time":"2025-02-06T06:08:41.0122690Z"} +2025/02/06 01:08:42.020 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:42.0201050Z","device_time":"2025-02-06T06:08:42.0201050Z"} +2025/02/06 01:08:43.036 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:43.0360430Z","device_time":"2025-02-06T06:08:43.0360430Z"} +2025/02/06 01:08:44.101 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:44.1008960Z","device_time":"2025-02-06T06:08:44.1008960Z"} +2025/02/06 01:08:45.109 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:45.1086890Z","device_time":"2025-02-06T06:08:45.1086900Z"} +2025/02/06 01:08:46.108 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:46.1076280Z","device_time":"2025-02-06T06:08:46.1076280Z"} +2025/02/06 01:08:47.162 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:47.1622590Z","device_time":"2025-02-06T06:08:47.1622590Z"} +2025/02/06 01:08:48.168 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:48.1679850Z","device_time":"2025-02-06T06:08:48.1679850Z"} +2025/02/06 01:08:49.193 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:49.1930010Z","device_time":"2025-02-06T06:08:49.1930010Z"} +2025/02/06 01:08:50.209 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:50.2089750Z","device_time":"2025-02-06T06:08:50.2089750Z"} +2025/02/06 01:08:51.246 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:51.2457230Z","device_time":"2025-02-06T06:08:51.2457230Z"} +2025/02/06 01:08:52.280 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:52.2799990Z","device_time":"2025-02-06T06:08:52.2799990Z"} +2025/02/06 01:08:53.315 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:53.3153240Z","device_time":"2025-02-06T06:08:53.3153240Z"} +2025/02/06 01:08:54.312 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:54.3117200Z","device_time":"2025-02-06T06:08:54.3117210Z"} +2025/02/06 01:08:55.333 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:55.3325350Z","device_time":"2025-02-06T06:08:55.3325350Z"} +2025/02/06 01:08:56.345 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:56.3450310Z","device_time":"2025-02-06T06:08:56.3450310Z"} +2025/02/06 01:08:57.350 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:57.3498680Z","device_time":"2025-02-06T06:08:57.3498680Z"} +2025/02/06 01:08:58.363 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:58.3625520Z","device_time":"2025-02-06T06:08:58.3625520Z"} +2025/02/06 01:08:59.400 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:08:59.4004550Z","device_time":"2025-02-06T06:08:59.4004560Z"} +2025/02/06 01:09:00.410 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:00.4105400Z","device_time":"2025-02-06T06:09:00.4105400Z"} +2025/02/06 01:09:01.402 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:01.4018250Z","device_time":"2025-02-06T06:09:01.4018250Z"} +2025/02/06 01:09:02.442 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:02.4417730Z","device_time":"2025-02-06T06:09:02.4417730Z"} +2025/02/06 01:09:03.440 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:03.4399390Z","device_time":"2025-02-06T06:09:03.4399390Z"} +2025/02/06 01:09:04.477 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:04.4767640Z","device_time":"2025-02-06T06:09:04.4767650Z"} +2025/02/06 01:09:05.501 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:05.5010420Z","device_time":"2025-02-06T06:09:05.5010430Z"} +2025/02/06 01:09:06.526 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:06.5256490Z","device_time":"2025-02-06T06:09:06.5256500Z"} +2025/02/06 01:09:07.544 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:07.5439090Z","device_time":"2025-02-06T06:09:07.5439090Z"} +2025/02/06 01:09:08.575 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:08.5748800Z","device_time":"2025-02-06T06:09:08.5748810Z"} +2025/02/06 01:09:09.592 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:09.5912950Z","device_time":"2025-02-06T06:09:09.5912960Z"} +2025/02/06 01:09:10.611 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:10.6109090Z","device_time":"2025-02-06T06:09:10.6109090Z"} +2025/02/06 01:09:11.616 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:11.6154530Z","device_time":"2025-02-06T06:09:11.6154530Z"} +2025/02/06 01:09:12.650 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:12.6494970Z","device_time":"2025-02-06T06:09:12.6494970Z"} +2025/02/06 01:09:13.652 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:13.6519520Z","device_time":"2025-02-06T06:09:13.6519520Z"} +2025/02/06 01:09:14.700 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:14.7000180Z","device_time":"2025-02-06T06:09:14.7000180Z"} +2025/02/06 01:09:15.721 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:15.7206330Z","device_time":"2025-02-06T06:09:15.7206330Z"} +2025/02/06 01:09:16.739 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:16.7391620Z","device_time":"2025-02-06T06:09:16.7391620Z"} +2025/02/06 01:09:17.768 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:17.7681690Z","device_time":"2025-02-06T06:09:17.7681700Z"} +2025/02/06 01:09:18.796 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:18.7960750Z","device_time":"2025-02-06T06:09:18.7960750Z"} +2025/02/06 01:09:19.808 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:19.8078430Z","device_time":"2025-02-06T06:09:19.8078440Z"} +2025/02/06 01:09:20.816 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:20.8160270Z","device_time":"2025-02-06T06:09:20.8160280Z"} +2025/02/06 01:09:21.826 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:21.8257440Z","device_time":"2025-02-06T06:09:21.8257440Z"} +2025/02/06 01:09:22.864 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:22.8635590Z","device_time":"2025-02-06T06:09:22.8635600Z"} +2025/02/06 01:09:23.879 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:23.8791580Z","device_time":"2025-02-06T06:09:23.8791580Z"} +2025/02/06 01:09:24.880 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:24.8795650Z","device_time":"2025-02-06T06:09:24.8795650Z"} +2025/02/06 01:09:25.926 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:25.9261990Z","device_time":"2025-02-06T06:09:25.9262000Z"} +2025/02/06 01:09:26.936 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:26.9363150Z","device_time":"2025-02-06T06:09:26.9363150Z"} +2025/02/06 01:09:27.971 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:27.9710970Z","device_time":"2025-02-06T06:09:27.9710970Z"} +2025/02/06 01:09:29.010 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:29.0098960Z","device_time":"2025-02-06T06:09:29.0098970Z"} +2025/02/06 01:09:30.037 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:30.0344600Z","device_time":"2025-02-06T06:09:30.0344610Z"} +2025/02/06 01:09:31.069 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:31.0691460Z","device_time":"2025-02-06T06:09:31.0691460Z"} +2025/02/06 01:09:32.088 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:32.0874620Z","device_time":"2025-02-06T06:09:32.0874630Z"} +2025/02/06 01:09:33.099 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:33.0979820Z","device_time":"2025-02-06T06:09:33.0979830Z"} +2025/02/06 01:09:34.122 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:34.1214510Z","device_time":"2025-02-06T06:09:34.1214510Z"} +2025/02/06 01:09:35.138 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:35.1381280Z","device_time":"2025-02-06T06:09:35.1381290Z"} +2025/02/06 01:09:36.194 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:36.1942170Z","device_time":"2025-02-06T06:09:36.1942180Z"} +2025/02/06 01:09:37.210 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:37.2098730Z","device_time":"2025-02-06T06:09:37.2098740Z"} +2025/02/06 01:09:38.192 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:38.1917340Z","device_time":"2025-02-06T06:09:38.1917340Z"} +2025/02/06 01:09:39.231 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:39.2309870Z","device_time":"2025-02-06T06:09:39.2309880Z"} +2025/02/06 01:09:40.248 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:40.2476540Z","device_time":"2025-02-06T06:09:40.2476550Z"} +2025/02/06 01:09:41.327 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:41.3266720Z","device_time":"2025-02-06T06:09:41.3266720Z"} +2025/02/06 01:09:42.355 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:42.3546710Z","device_time":"2025-02-06T06:09:42.3546720Z"} +2025/02/06 01:09:43.346 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:43.3459950Z","device_time":"2025-02-06T06:09:43.3459960Z"} +2025/02/06 01:09:44.359 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:44.3588000Z","device_time":"2025-02-06T06:09:44.3588000Z"} +2025/02/06 01:09:45.377 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:45.3766570Z","device_time":"2025-02-06T06:09:45.3766580Z"} +2025/02/06 01:09:46.398 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:46.3979650Z","device_time":"2025-02-06T06:09:46.3979650Z"} +2025/02/06 01:09:47.412 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:47.4118860Z","device_time":"2025-02-06T06:09:47.4118870Z"} +2025/02/06 01:09:48.444 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:48.4442820Z","device_time":"2025-02-06T06:09:48.4442820Z"} +2025/02/06 01:09:49.435 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:49.4348570Z","device_time":"2025-02-06T06:09:49.4348570Z"} +2025/02/06 01:09:50.505 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:50.5048480Z","device_time":"2025-02-06T06:09:50.5048490Z"} +2025/02/06 01:09:51.482 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:51.4819470Z","device_time":"2025-02-06T06:09:51.4819470Z"} +2025/02/06 01:09:52.519 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:52.5190650Z","device_time":"2025-02-06T06:09:52.5190650Z"} +2025/02/06 01:09:53.549 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:53.5485240Z","device_time":"2025-02-06T06:09:53.5485250Z"} +2025/02/06 01:09:54.557 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:54.5574650Z","device_time":"2025-02-06T06:09:54.5574650Z"} +2025/02/06 01:09:55.564 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:55.5644720Z","device_time":"2025-02-06T06:09:55.5644720Z"} +2025/02/06 01:09:56.577 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:56.5770090Z","device_time":"2025-02-06T06:09:56.5770090Z"} +2025/02/06 01:09:57.616 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:57.6160340Z","device_time":"2025-02-06T06:09:57.6160350Z"} +2025/02/06 01:09:58.639 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:58.6395240Z","device_time":"2025-02-06T06:09:58.6395240Z"} +2025/02/06 01:09:59.657 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:09:59.6566680Z","device_time":"2025-02-06T06:09:59.6566680Z"} +2025/02/06 01:10:00.678 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:00.6781090Z","device_time":"2025-02-06T06:10:00.6781100Z"} +2025/02/06 01:10:01.692 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:01.6917540Z","device_time":"2025-02-06T06:10:01.6917540Z"} +2025/02/06 01:10:02.726 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:02.7255110Z","device_time":"2025-02-06T06:10:02.7255110Z"} +2025/02/06 01:10:03.732 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:03.7320450Z","device_time":"2025-02-06T06:10:03.7320450Z"} +2025/02/06 01:10:04.750 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:04.7504120Z","device_time":"2025-02-06T06:10:04.7504130Z"} +2025/02/06 01:10:05.765 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:05.7639310Z","device_time":"2025-02-06T06:10:05.7639310Z"} +2025/02/06 01:10:06.788 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:06.7875420Z","device_time":"2025-02-06T06:10:06.7875430Z"} +2025/02/06 01:10:07.810 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:07.8100680Z","device_time":"2025-02-06T06:10:07.8100690Z"} +2025/02/06 01:10:08.824 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:08.8244190Z","device_time":"2025-02-06T06:10:08.8244190Z"} +2025/02/06 01:10:09.863 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:09.8628990Z","device_time":"2025-02-06T06:10:09.8628990Z"} +2025/02/06 01:10:10.894 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:10.8941220Z","device_time":"2025-02-06T06:10:10.8941220Z"} +2025/02/06 01:10:11.928 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:11.9264010Z","device_time":"2025-02-06T06:10:11.9264010Z"} +2025/02/06 01:10:12.946 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:12.9463810Z","device_time":"2025-02-06T06:10:12.9463810Z"} +2025/02/06 01:10:13.989 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:13.9888510Z","device_time":"2025-02-06T06:10:13.9888520Z"} +2025/02/06 01:10:15.006 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:15.0060950Z","device_time":"2025-02-06T06:10:15.0060960Z"} +2025/02/06 01:10:16.005 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:16.0054060Z","device_time":"2025-02-06T06:10:16.0054070Z"} +2025/02/06 01:10:17.045 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:17.0455270Z","device_time":"2025-02-06T06:10:17.0455280Z"} +2025/02/06 01:10:18.087 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:18.0874200Z","device_time":"2025-02-06T06:10:18.0874200Z"} +2025/02/06 01:10:19.078 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:19.0782530Z","device_time":"2025-02-06T06:10:19.0782540Z"} +2025/02/06 01:10:20.105 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:20.1050240Z","device_time":"2025-02-06T06:10:20.1050250Z"} +2025/02/06 01:10:21.144 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:21.1441890Z","device_time":"2025-02-06T06:10:21.1441890Z"} +2025/02/06 01:10:22.184 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:22.1842250Z","device_time":"2025-02-06T06:10:22.1842250Z"} +2025/02/06 01:10:23.193 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:23.1931640Z","device_time":"2025-02-06T06:10:23.1931640Z"} +2025/02/06 01:10:24.187 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:24.1873800Z","device_time":"2025-02-06T06:10:24.1873810Z"} +2025/02/06 01:10:25.245 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:25.2452920Z","device_time":"2025-02-06T06:10:25.2452920Z"} +2025/02/06 01:10:26.251 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:26.2511990Z","device_time":"2025-02-06T06:10:26.2511990Z"} +2025/02/06 01:10:27.262 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:27.2617500Z","device_time":"2025-02-06T06:10:27.2617500Z"} +2025/02/06 01:10:28.274 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:28.2735620Z","device_time":"2025-02-06T06:10:28.2735620Z"} +2025/02/06 01:10:29.290 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:29.2898770Z","device_time":"2025-02-06T06:10:29.2898770Z"} +2025/02/06 01:10:30.312 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:30.3123030Z","device_time":"2025-02-06T06:10:30.3123030Z"} +2025/02/06 01:10:31.333 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:31.3326700Z","device_time":"2025-02-06T06:10:31.3326710Z"} +2025/02/06 01:10:32.367 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:32.3667430Z","device_time":"2025-02-06T06:10:32.3667430Z"} +2025/02/06 01:10:33.378 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:33.3782500Z","device_time":"2025-02-06T06:10:33.3782500Z"} +2025/02/06 01:10:34.383 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:34.3830880Z","device_time":"2025-02-06T06:10:34.3830880Z"} +2025/02/06 01:10:35.420 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:35.4202650Z","device_time":"2025-02-06T06:10:35.4202650Z"} +2025/02/06 01:10:36.439 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:36.4386140Z","device_time":"2025-02-06T06:10:36.4386150Z"} +2025/02/06 01:10:37.495 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:37.4949590Z","device_time":"2025-02-06T06:10:37.4949600Z"} +2025/02/06 01:10:38.503 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:38.5029260Z","device_time":"2025-02-06T06:10:38.5029270Z"} +2025/02/06 01:10:39.516 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:39.5159390Z","device_time":"2025-02-06T06:10:39.5159400Z"} +2025/02/06 01:10:40.532 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:40.5322770Z","device_time":"2025-02-06T06:10:40.5322780Z"} +2025/02/06 01:10:41.560 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:41.5599900Z","device_time":"2025-02-06T06:10:41.5599910Z"} +2025/02/06 01:10:42.583 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:42.5826770Z","device_time":"2025-02-06T06:10:42.5826770Z"} +2025/02/06 01:10:43.570 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:43.5700320Z","device_time":"2025-02-06T06:10:43.5700330Z"} +2025/02/06 01:10:44.617 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:44.6170090Z","device_time":"2025-02-06T06:10:44.6170100Z"} +2025/02/06 01:10:45.621 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:45.6209350Z","device_time":"2025-02-06T06:10:45.6209360Z"} +2025/02/06 01:10:46.647 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:46.6469470Z","device_time":"2025-02-06T06:10:46.6469470Z"} +2025/02/06 01:10:47.667 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:47.6647820Z","device_time":"2025-02-06T06:10:47.6647820Z"} +2025/02/06 01:10:48.683 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:48.6827080Z","device_time":"2025-02-06T06:10:48.6827090Z"} +2025/02/06 01:10:49.698 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:49.6983330Z","device_time":"2025-02-06T06:10:49.6983340Z"} +2025/02/06 01:10:50.718 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:50.7183150Z","device_time":"2025-02-06T06:10:50.7183160Z"} +2025/02/06 01:10:51.734 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:51.7339510Z","device_time":"2025-02-06T06:10:51.7339510Z"} +2025/02/06 01:10:52.744 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:52.7438730Z","device_time":"2025-02-06T06:10:52.7438740Z"} +2025/02/06 01:10:53.762 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:53.7616050Z","device_time":"2025-02-06T06:10:53.7616050Z"} +2025/02/06 01:10:54.788 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:54.7877080Z","device_time":"2025-02-06T06:10:54.7877090Z"} +2025/02/06 01:10:55.806 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:55.8059170Z","device_time":"2025-02-06T06:10:55.8059180Z"} +2025/02/06 01:10:56.821 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:56.8208250Z","device_time":"2025-02-06T06:10:56.8208260Z"} +2025/02/06 01:10:57.859 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:57.8585860Z","device_time":"2025-02-06T06:10:57.8585860Z"} +2025/02/06 01:10:58.893 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:58.8925830Z","device_time":"2025-02-06T06:10:58.8925840Z"} +2025/02/06 01:10:59.931 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:10:59.9309360Z","device_time":"2025-02-06T06:10:59.9309360Z"} +2025/02/06 01:11:00.950 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:00.9496740Z","device_time":"2025-02-06T06:11:00.9496740Z"} +2025/02/06 01:11:01.948 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:01.9461700Z","device_time":"2025-02-06T06:11:01.9461700Z"} +2025/02/06 01:11:02.967 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:02.9672890Z","device_time":"2025-02-06T06:11:02.9672890Z"} +2025/02/06 01:11:03.998 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:03.9976280Z","device_time":"2025-02-06T06:11:03.9976280Z"} +2025/02/06 01:11:05.007 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:05.0066950Z","device_time":"2025-02-06T06:11:05.0066950Z"} +2025/02/06 01:11:06.020 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:06.0196610Z","device_time":"2025-02-06T06:11:06.0196620Z"} +2025/02/06 01:11:07.036 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:07.0355080Z","device_time":"2025-02-06T06:11:07.0355080Z"} +2025/02/06 01:11:08.062 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:08.0622130Z","device_time":"2025-02-06T06:11:08.0622140Z"} +2025/02/06 01:11:09.089 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:09.0888870Z","device_time":"2025-02-06T06:11:09.0888880Z"} +2025/02/06 01:11:10.124 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:10.1243050Z","device_time":"2025-02-06T06:11:10.1243060Z"} +2025/02/06 01:11:11.166 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:11.1662540Z","device_time":"2025-02-06T06:11:11.1662540Z"} +2025/02/06 01:11:12.193 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:12.1924360Z","device_time":"2025-02-06T06:11:12.1924370Z"} +2025/02/06 01:11:13.225 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:13.2253470Z","device_time":"2025-02-06T06:11:13.2253470Z"} +2025/02/06 01:11:14.251 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:14.2509900Z","device_time":"2025-02-06T06:11:14.2509920Z"} +2025/02/06 01:11:15.267 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:15.2670510Z","device_time":"2025-02-06T06:11:15.2670520Z"} +2025/02/06 01:11:16.278 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:16.2782080Z","device_time":"2025-02-06T06:11:16.2782090Z"} +2025/02/06 01:11:17.306 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:17.3058970Z","device_time":"2025-02-06T06:11:17.3058980Z"} +2025/02/06 01:11:18.323 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:18.3235280Z","device_time":"2025-02-06T06:11:18.3235290Z"} +2025/02/06 01:11:19.330 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:19.3295380Z","device_time":"2025-02-06T06:11:19.3295380Z"} +2025/02/06 01:11:20.347 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:20.3472490Z","device_time":"2025-02-06T06:11:20.3472500Z"} +2025/02/06 01:11:21.380 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:21.3799550Z","device_time":"2025-02-06T06:11:21.3799560Z"} +2025/02/06 01:11:22.397 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:22.3973250Z","device_time":"2025-02-06T06:11:22.3973250Z"} +2025/02/06 01:11:23.408 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:23.4079870Z","device_time":"2025-02-06T06:11:23.4079870Z"} +2025/02/06 01:11:24.432 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:24.4318060Z","device_time":"2025-02-06T06:11:24.4318060Z"} +2025/02/06 01:11:25.445 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:25.4423330Z","device_time":"2025-02-06T06:11:25.4423330Z"} +2025/02/06 01:11:26.466 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:26.4658360Z","device_time":"2025-02-06T06:11:26.4658370Z"} +2025/02/06 01:11:27.491 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:27.4913450Z","device_time":"2025-02-06T06:11:27.4913450Z"} +2025/02/06 01:11:28.551 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:28.5461460Z","device_time":"2025-02-06T06:11:28.5461470Z"} +2025/02/06 01:11:29.641 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:29.6387590Z","device_time":"2025-02-06T06:11:29.6387600Z"} +2025/02/06 01:11:30.553 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:30.5525750Z","device_time":"2025-02-06T06:11:30.5525760Z"} +2025/02/06 01:11:31.618 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:31.6172630Z","device_time":"2025-02-06T06:11:31.6172630Z"} +2025/02/06 01:11:32.722 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:32.7217400Z","device_time":"2025-02-06T06:11:32.7217410Z"} +2025/02/06 01:11:33.673 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:33.6730910Z","device_time":"2025-02-06T06:11:33.6730920Z"} +2025/02/06 01:11:34.683 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:34.6829590Z","device_time":"2025-02-06T06:11:34.6829600Z"} +2025/02/06 01:11:35.672 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:35.6718130Z","device_time":"2025-02-06T06:11:35.6718130Z"} +2025/02/06 01:11:36.740 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:36.7402230Z","device_time":"2025-02-06T06:11:36.7402240Z"} +2025/02/06 01:11:37.756 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:37.7553540Z","device_time":"2025-02-06T06:11:37.7553550Z"} +2025/02/06 01:11:38.843 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:38.8413500Z","device_time":"2025-02-06T06:11:38.8413510Z"} +2025/02/06 01:11:39.867 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:39.8661770Z","device_time":"2025-02-06T06:11:39.8661770Z"} +2025/02/06 01:11:40.878 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:40.8774370Z","device_time":"2025-02-06T06:11:40.8774380Z"} +2025/02/06 01:11:41.930 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:41.9298330Z","device_time":"2025-02-06T06:11:41.9298340Z"} +2025/02/06 01:11:42.946 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:42.9442100Z","device_time":"2025-02-06T06:11:42.9442110Z"} +2025/02/06 01:11:43.982 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:43.9816740Z","device_time":"2025-02-06T06:11:43.9816740Z"} +2025/02/06 01:11:45.044 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:45.0441400Z","device_time":"2025-02-06T06:11:45.0441400Z"} +2025/02/06 01:11:46.054 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:46.0528490Z","device_time":"2025-02-06T06:11:46.0528500Z"} +2025/02/06 01:11:47.088 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:47.0880040Z","device_time":"2025-02-06T06:11:47.0880050Z"} +2025/02/06 01:11:48.070 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:48.0697400Z","device_time":"2025-02-06T06:11:48.0697410Z"} +2025/02/06 01:11:49.083 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:49.0827000Z","device_time":"2025-02-06T06:11:49.0827010Z"} +2025/02/06 01:11:50.136 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:50.1330420Z","device_time":"2025-02-06T06:11:50.1330420Z"} +2025/02/06 01:11:51.132 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:51.1318970Z","device_time":"2025-02-06T06:11:51.1318980Z"} +2025/02/06 01:11:52.167 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:52.1671910Z","device_time":"2025-02-06T06:11:52.1671910Z"} +2025/02/06 01:11:53.174 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:53.1739710Z","device_time":"2025-02-06T06:11:53.1739710Z"} +2025/02/06 01:11:54.243 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:54.2421670Z","device_time":"2025-02-06T06:11:54.2421680Z"} +2025/02/06 01:11:55.251 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:55.2508050Z","device_time":"2025-02-06T06:11:55.2508060Z"} +2025/02/06 01:11:56.341 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:56.3387060Z","device_time":"2025-02-06T06:11:56.3387060Z"} +2025/02/06 01:11:57.299 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:57.2960900Z","device_time":"2025-02-06T06:11:57.2960910Z"} +2025/02/06 01:11:58.320 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:58.3198990Z","device_time":"2025-02-06T06:11:58.3199000Z"} +2025/02/06 01:11:59.329 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:11:59.3284910Z","device_time":"2025-02-06T06:11:59.3284920Z"} +2025/02/06 01:12:00.371 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:00.3707690Z","device_time":"2025-02-06T06:12:00.3707700Z"} +2025/02/06 01:12:01.431 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:01.4307610Z","device_time":"2025-02-06T06:12:01.4307620Z"} +2025/02/06 01:12:02.516 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:02.5161720Z","device_time":"2025-02-06T06:12:02.5161730Z"} +2025/02/06 01:12:03.549 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:03.5484150Z","device_time":"2025-02-06T06:12:03.5484160Z"} +2025/02/06 01:12:04.566 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:04.5663970Z","device_time":"2025-02-06T06:12:04.5663970Z"} +2025/02/06 01:12:05.621 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:05.6208740Z","device_time":"2025-02-06T06:12:05.6208750Z"} +2025/02/06 01:12:06.667 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:06.6664470Z","device_time":"2025-02-06T06:12:06.6664480Z"} +2025/02/06 01:12:07.640 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:07.6402250Z","device_time":"2025-02-06T06:12:07.6402260Z"} +2025/02/06 01:12:08.698 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:08.6980020Z","device_time":"2025-02-06T06:12:08.6980020Z"} +2025/02/06 01:12:09.708 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:09.7079170Z","device_time":"2025-02-06T06:12:09.7079180Z"} +2025/02/06 01:12:10.728 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:10.7279690Z","device_time":"2025-02-06T06:12:10.7279700Z"} +2025/02/06 01:12:11.744 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:11.7439990Z","device_time":"2025-02-06T06:12:11.7440000Z"} +2025/02/06 01:12:12.775 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:12.7744420Z","device_time":"2025-02-06T06:12:12.7744430Z"} +2025/02/06 01:12:13.775 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:13.7747260Z","device_time":"2025-02-06T06:12:13.7747270Z"} +2025/02/06 01:12:14.797 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:14.7969780Z","device_time":"2025-02-06T06:12:14.7969790Z"} +2025/02/06 01:12:15.863 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:15.8626690Z","device_time":"2025-02-06T06:12:15.8626700Z"} +2025/02/06 01:12:16.805 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:16.8047120Z","device_time":"2025-02-06T06:12:16.8047130Z"} +2025/02/06 01:12:17.846 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:17.8456010Z","device_time":"2025-02-06T06:12:17.8456020Z"} +2025/02/06 01:12:18.905 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:18.9049060Z","device_time":"2025-02-06T06:12:18.9049060Z"} +2025/02/06 01:12:19.942 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:19.9380000Z","device_time":"2025-02-06T06:12:19.9380010Z"} +2025/02/06 01:12:21.118 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:21.1176860Z","device_time":"2025-02-06T06:12:21.1176860Z"} +2025/02/06 01:12:22.150 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:22.1498130Z","device_time":"2025-02-06T06:12:22.1498140Z"} +2025/02/06 01:12:23.147 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:23.1462930Z","device_time":"2025-02-06T06:12:23.1462940Z"} +2025/02/06 01:12:24.225 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:24.2243770Z","device_time":"2025-02-06T06:12:24.2243780Z"} +2025/02/06 01:12:25.252 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:25.2513160Z","device_time":"2025-02-06T06:12:25.2513170Z"} +2025/02/06 01:12:26.292 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:26.2919930Z","device_time":"2025-02-06T06:12:26.2919940Z"} +2025/02/06 01:12:27.293 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:27.2927390Z","device_time":"2025-02-06T06:12:27.2927400Z"} +2025/02/06 01:12:28.329 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:28.3268740Z","device_time":"2025-02-06T06:12:28.3268740Z"} +2025/02/06 01:12:29.343 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:29.3422210Z","device_time":"2025-02-06T06:12:29.3422220Z"} +2025/02/06 01:12:30.362 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:30.3614040Z","device_time":"2025-02-06T06:12:30.3614050Z"} +2025/02/06 01:12:31.394 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:31.3937530Z","device_time":"2025-02-06T06:12:31.3937540Z"} +2025/02/06 01:12:32.446 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:32.4459560Z","device_time":"2025-02-06T06:12:32.4459560Z"} +2025/02/06 01:12:33.449 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:33.4488520Z","device_time":"2025-02-06T06:12:33.4488520Z"} +2025/02/06 01:12:34.532 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:34.5316370Z","device_time":"2025-02-06T06:12:34.5316380Z"} +2025/02/06 01:12:35.614 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:35.6136020Z","device_time":"2025-02-06T06:12:35.6136030Z"} +2025/02/06 01:12:36.885 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:36.8832930Z","device_time":"2025-02-06T06:12:36.8832930Z"} +2025/02/06 01:12:39.009 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:39.0078700Z","device_time":"2025-02-06T06:12:39.0078710Z"} +2025/02/06 01:12:39.991 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:39.9909590Z","device_time":"2025-02-06T06:12:39.9909600Z"} +2025/02/06 01:12:41.007 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:41.0064920Z","device_time":"2025-02-06T06:12:41.0064930Z"} +2025/02/06 01:12:42.146 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:42.1452620Z","device_time":"2025-02-06T06:12:42.1452620Z"} +2025/02/06 01:12:43.148 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:43.1249480Z","device_time":"2025-02-06T06:12:43.1249490Z"} +2025/02/06 01:12:44.299 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:44.2871720Z","device_time":"2025-02-06T06:12:44.2871720Z"} +2025/02/06 01:12:45.328 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:45.3234550Z","device_time":"2025-02-06T06:12:45.3234560Z"} +2025/02/06 01:12:46.535 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:46.5166250Z","device_time":"2025-02-06T06:12:46.5166260Z"} +2025/02/06 01:12:47.382 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:47.3819800Z","device_time":"2025-02-06T06:12:47.3819810Z"} +2025/02/06 01:12:48.410 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:48.4096600Z","device_time":"2025-02-06T06:12:48.4096600Z"} +2025/02/06 01:12:49.436 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:49.4342550Z","device_time":"2025-02-06T06:12:49.4342560Z"} +2025/02/06 01:12:50.535 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:50.5323390Z","device_time":"2025-02-06T06:12:50.5323400Z"} +2025/02/06 01:12:51.551 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:51.5468370Z","device_time":"2025-02-06T06:12:51.5468380Z"} +2025/02/06 01:12:52.616 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:52.6149440Z","device_time":"2025-02-06T06:12:52.6149450Z"} +2025/02/06 01:12:53.585 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:53.5848910Z","device_time":"2025-02-06T06:12:53.5848920Z"} +2025/02/06 01:12:54.601 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:54.6008050Z","device_time":"2025-02-06T06:12:54.6008060Z"} +2025/02/06 01:12:55.684 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:55.6836630Z","device_time":"2025-02-06T06:12:55.6836630Z"} +2025/02/06 01:12:56.662 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:56.6612420Z","device_time":"2025-02-06T06:12:56.6612420Z"} +2025/02/06 01:12:57.699 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:57.6964830Z","device_time":"2025-02-06T06:12:57.6964830Z"} +2025/02/06 01:12:58.703 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:58.7022580Z","device_time":"2025-02-06T06:12:58.7022590Z"} +2025/02/06 01:12:59.714 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:12:59.7130930Z","device_time":"2025-02-06T06:12:59.7130940Z"} +2025/02/06 01:13:00.761 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:00.7572140Z","device_time":"2025-02-06T06:13:00.7572150Z"} +2025/02/06 01:13:01.931 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:01.9307380Z","device_time":"2025-02-06T06:13:01.9307380Z"} +2025/02/06 01:13:02.911 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:02.9104210Z","device_time":"2025-02-06T06:13:02.9104210Z"} +2025/02/06 01:13:03.915 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:03.9151590Z","device_time":"2025-02-06T06:13:03.9151600Z"} +2025/02/06 01:13:04.959 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:04.9587140Z","device_time":"2025-02-06T06:13:04.9587140Z"} +2025/02/06 01:13:05.991 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:05.9907060Z","device_time":"2025-02-06T06:13:05.9907070Z"} +2025/02/06 01:13:06.996 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:06.9887420Z","device_time":"2025-02-06T06:13:06.9887430Z"} +2025/02/06 01:13:08.047 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:08.0468330Z","device_time":"2025-02-06T06:13:08.0468340Z"} +2025/02/06 01:13:09.123 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:09.1227550Z","device_time":"2025-02-06T06:13:09.1227550Z"} +2025/02/06 01:13:10.063 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:10.0626460Z","device_time":"2025-02-06T06:13:10.0626470Z"} +2025/02/06 01:13:11.083 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:11.0827800Z","device_time":"2025-02-06T06:13:11.0827800Z"} +2025/02/06 01:13:12.131 5059 5093 Info Unity {"ntp_time":"2025-02-06T06:13:12.1294910Z","device_time":"2025-02-06T06:13:12.1294910Z"} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs index 450c2b2..52dc0e1 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs @@ -258,8 +258,8 @@ public async void OnConnectToServer() { await ntpClock.SynchronizeAsync(); } - // NOTE: enable if want to evaluate temporal sync - // CaptureTimeMetrics(); + // NOTE: enable only if you want to evaluate temporal sync. Don't enable to release builds + // CaptureTimeMetrics(1f); } catch (Exception e) { @@ -278,7 +278,7 @@ public class TimeLogEntry public string device_time; } - private async void CaptureTimeMetrics() + private async void CaptureTimeMetrics(float interval_s) { while (true) { @@ -289,8 +289,8 @@ private async void CaptureTimeMetrics() ntp_time = ntpTime.ToString("o"), device_time = deviceTime.ToString("o"), }; - Debug.LogWarning($"TimeLog: {JsonUtility.ToJson(logEntry)}"); - await Awaitable.WaitForSecondsAsync(5f); + Debug.Log($"{JsonUtility.ToJson(logEntry)}"); + await Awaitable.WaitForSecondsAsync(interval_s); } } From e0b7e238a771b91eb5601d6dcb5aae537cb1130a Mon Sep 17 00:00:00 2001 From: felixngfender Date: Sun, 9 Feb 2025 22:03:01 -0500 Subject: [PATCH 11/21] chore(evaluations): temporal sync evals diagrams & results --- python/evaluations/temporal.ipynb | 472 ++++++++++++ python/poetry.lock | 1146 ++++++++++++++++++++++++++++- python/pyproject.toml | 8 +- 3 files changed, 1588 insertions(+), 38 deletions(-) create mode 100644 python/evaluations/temporal.ipynb diff --git a/python/evaluations/temporal.ipynb b/python/evaluations/temporal.ipynb new file mode 100644 index 0000000..9c60659 --- /dev/null +++ b/python/evaluations/temporal.ipynb @@ -0,0 +1,472 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. 6 5-minute runs with 1s interval to confirm our application-level clock implementation is sane. NTP clock starts off as unsynced and defaults to the system clock. Thus we'll compare the timestamps this clock gives when unsynced with the actual system clock.\n", + "\n", + "data/single_device/system_clock/\n", + "\n", + "pixel_6/\n", + "\n", + "- [x] run1-logcat.txt\n", + "- [x] run2-logcat.txt\n", + "- [x] run3-logcat.txt\n", + "\n", + "tab_s6/\n", + "\n", + "- [x] run1-logcat.txt\n", + "- [x] run2-logcat.txt\n", + "- [x] run3-logcat.txt\n", + "\n", + "2. 6 5-minute runs with 1s interval to investigate clock drift. Here we compare the timestamps given by the NTP clock when synced with the system clock.\n", + "\n", + "data/single_device/ntp_clock/\n", + "\n", + "pixel_6/\n", + "\n", + "- [x] run1-logcat.txt\n", + "- [x] run2-logcat.txt\n", + "- [x] run3-logcat.txt\n", + "\n", + "tab_s6/\n", + "\n", + "- [x] run1-logcat.txt\n", + "- [x] run2-logcat.txt\n", + "- [x] run3-logcat.txt\n", + "\n", + "3. 10 runs to compare server-side first frame latency between NTP-synced devices and non-NTP-synced/unsynced/system clock devices. All devices start and stop capture at the exact same time.\n", + "\n", + "data/dual_device/system_clock/\n", + "\n", + "- [x] run1.rrd\n", + "- [x] run2.rrd\n", + "- [x] run3.rrd\n", + "- [x] run4.rrd\n", + "- [x] run5.rrd\n", + "\n", + "data/dual_device/ntp_clock/\n", + "\n", + "- [x] run1.rrd\n", + "- [x] run2.rrd\n", + "- [x] run3.rrd\n", + "- [x] run4.rrd\n", + "- [x] run5.rrd\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from datetime import datetime\n", + "from typing import Literal\n", + "\n", + "cmap = plt.get_cmap(\"tab10\", 6)\n", + "\n", + "\n", + "def parse_logcat(\n", + " file_path: str,\n", + " time_unit: Literal[\"us\"] | Literal[\"ms\"],\n", + " ntp_key: str = \"ntp_time\",\n", + " system_key: str = \"device_time\",\n", + "):\n", + " timestamps = []\n", + " offsets = []\n", + "\n", + " with open(file_path, \"r\") as f:\n", + " for line in f:\n", + " try:\n", + " parts = line.strip().split(\"Info Unity \")\n", + " if len(parts) < 2:\n", + " continue\n", + " json_data = json.loads(parts[1])\n", + "\n", + " ntp_time = datetime.strptime(\n", + " json_data[ntp_key], \"%Y-%m-%dT%H:%M:%S.%f0Z\"\n", + " )\n", + " system_time = datetime.strptime(\n", + " json_data[system_key], \"%Y-%m-%dT%H:%M:%S.%f0Z\"\n", + " )\n", + "\n", + " if time_unit == \"us\":\n", + " offset = (ntp_time - system_time).total_seconds() * 1e6\n", + " else:\n", + " offset = (ntp_time - system_time).total_seconds() * 1e3\n", + " timestamps.append(system_time)\n", + " offsets.append(offset)\n", + " except Exception as e:\n", + " print(f\"Error parsing line: {line}\\nError: {e}\")\n", + "\n", + " if time_unit == \"us\":\n", + " return pd.DataFrame({\"timestamp\": timestamps, \"offset_us\": offsets})\n", + " else:\n", + " return pd.DataFrame({\"timestamp\": timestamps, \"offset_ms\": offsets})\n", + "\n", + "\n", + "def load_experiment_data(\n", + " base_dir: str,\n", + " time_unit: Literal[\"us\"] | Literal[\"ms\"],\n", + " devices: list[str],\n", + " runs: list[str],\n", + " ntp_key: str = \"ntp_time\",\n", + " system_key: str = \"device_time\",\n", + "):\n", + " data = {}\n", + " for device in devices:\n", + " all_runs = []\n", + " for run in runs:\n", + " file_path = os.path.join(base_dir, device, run)\n", + " df = parse_logcat(file_path, time_unit, ntp_key, system_key)\n", + " df[\"run\"] = run\n", + " df[\"device\"] = device\n", + " df[\"device_run\"] = f\"{device} - {run}\"\n", + " all_runs.append(df)\n", + " data[device] = pd.concat(all_runs, ignore_index=True)\n", + "\n", + " return pd.concat(data.values(), ignore_index=True)\n", + "\n", + "\n", + "def plot_results(all_data: pd.DataFrame, title: str):\n", + " unique_labels = all_data[\"device_run\"].unique()\n", + " color_map = {label: cmap(i) for i, label in enumerate(unique_labels)}\n", + "\n", + " plt.figure(figsize=(12, 6))\n", + " for label in unique_labels:\n", + " human_readable_label = (\n", + " label.replace(\"pixel_6\", \"Pixel 6\")\n", + " .replace(\"tab_s6\", \"Tab S6\")\n", + " .replace(\"run\", \"Run \")\n", + " .replace(\"-logcat.txt\", \"\")\n", + " )\n", + "\n", + " df_subset = all_data[all_data[\"device_run\"] == label]\n", + " if \"offset_us\" in df_subset.columns:\n", + " plt.scatter(\n", + " df_subset[\"timestamp\"],\n", + " df_subset[\"offset_us\"],\n", + " label=human_readable_label,\n", + " color=color_map[label],\n", + " s=20,\n", + " alpha=0.7,\n", + " )\n", + " else:\n", + " plt.scatter(\n", + " df_subset[\"timestamp\"],\n", + " df_subset[\"offset_ms\"],\n", + " label=human_readable_label,\n", + " color=color_map[label],\n", + " s=20,\n", + " alpha=0.7,\n", + " )\n", + "\n", + " plt.axhline(y=0, color=\"gray\", linestyle=\"--\")\n", + " plt.xlabel(\"Timestamp\")\n", + " if \"offset_us\" in df_subset.columns:\n", + " plt.ylabel(\"Offset (µs)\")\n", + " else:\n", + " plt.ylabel(\"Offset (ms)\")\n", + " plt.title(title)\n", + " plt.legend()\n", + " plt.show()\n", + "\n", + "\n", + "def compute_statistics(all_data: pd.DataFrame):\n", + " unique_labels = all_data[\"device_run\"].unique()\n", + " for label in unique_labels:\n", + " human_readable_label = (\n", + " label.replace(\"pixel_6\", \"Pixel 6\")\n", + " .replace(\"tab_s6\", \"Tab S6\")\n", + " .replace(\"run\", \"Run \")\n", + " .replace(\"-logcat.txt\", \"\")\n", + " )\n", + "\n", + " df_subset = all_data[all_data[\"device_run\"] == label]\n", + " time_unit_key = \"offset_us\" if \"offset_us\" in df_subset.columns else \"offset_ms\"\n", + " mean_offset = df_subset[time_unit_key].mean()\n", + " median_offset = df_subset[time_unit_key].median()\n", + " std_dev = df_subset[time_unit_key].std()\n", + "\n", + " time_unit = \"µs\" if \"offset_us\" in df_subset.columns else \"ms\"\n", + " print(f\"Device-Run: {human_readable_label}\")\n", + " print(f\" Mean Offset: {mean_offset:.3f} {time_unit}\")\n", + " print(f\" Median Offset: {median_offset:.3f} {time_unit}\")\n", + " print(f\" Standard Deviation: {std_dev:.3f} {time_unit}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABBYAAAIjCAYAAAC3RZiOAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAljBJREFUeJzs3Xl4FFXWx/Ff9Z50dpIQ9n3fBQZBQEAUBFFcGUSRAVE2BxhxAHEUN3QAF1wGxXkFRscRERdGFEQEXEBHEGSPiiAIhIQle9JJd9f7R0xLTIJJE0jA7+d5+oGqOnXvuZ3uTur0rSrDNE1TAAAAAAAAQbBUdgIAAAAAAOD8RWEBAAAAAAAEjcICAAAAAAAIGoUFAAAAAAAQNAoLAAAAAAAgaBQWAAAAAABA0CgsAAAAAACAoFFYAAAAAAAAQaOwAAAAAAAAgkZhAQCAcli3bp0Mw9C6desqO5VzolevXurVq9dZa98wDE2YMOGstf9rXq9Xf/3rX1WnTh1ZLBYNHjxYkpSZmanbb79dCQkJMgxDkyZNOmc5/d4sWrRIhmFo//79lZ0KAKCCUFgAgN+xmTNnyjAMHTt2rMTtrVu3PqsHlReywoMnl8ulQ4cOFdveq1cvtW7dWtIvP4ffehT+LEaMGFFkfUREhNq1a6cnnnhCHo+nTPkdPXpUU6ZMUfPmzRUaGiq3262OHTvqkUceUWpqakU9DWddfn6+nnnmGXXu3Fnh4eEKCwtT586d9cwzzyg/P79Y/Msvv6w5c+bohhtu0OLFizV58mRJ0qxZs7Ro0SKNHTtWr7zyim699dYKzfPw4cOaOXOmtm7dWq79du7cqVtuuUW1atWS0+lUzZo1NWzYMO3cubNC8ztTvXr1KtNreObMmZWdKgDgLLBVdgIAAFzIPB6PHn/8cT377LOlxlx33XVq3LhxYDkzM1Njx47Vtddeq+uuuy6wvnr16oH/O51O/fOf/5QkpaamatmyZZoyZYq++uorvf7666fN6auvvtKAAQOUmZmpW265RR07dpQkbdq0SY8//rg++eQTffjhh0GN91zKysrSwIEDtX79el111VUaMWKELBaLVq5cqYkTJ+qtt97SihUr5Ha7A/t8/PHHqlWrlp566qkibX388ce6+OKL9cADD5yVXA8fPqwHH3xQ9evXV/v27cu0z1tvvaWhQ4cqJiZGo0aNUoMGDbR//3793//9n9588029/vrruvbaa89KvuU1Y8YM3X777YHlr776Ss8884zuvfdetWjRIrC+bdu2atWqlf74xz/K6XRWRqoAgLOAwgIAAGdR+/bt9dJLL2n69OmqWbNmiTFt27ZV27ZtA8vHjh3T2LFj1bZtW91yyy0l7mOz2YpsGzdunLp06aIlS5boySefLLWv1NRUXXvttbJardqyZYuaN29eZPujjz6ql156qbzDrBR/+ctftH79ej377LNFTqcYO3asnn/+eU2YMEFTpkzR/PnzA9uSk5MVFRVVrK3k5GS1bNnyXKRdJnv37tWtt96qhg0b6pNPPlFcXFxg28SJE9WjRw/deuut2rZtmxo2bHjO8srKyipSqCl0+eWXF1l2uVx65plndPnll5c468lqtZ6tFAEAlYBTIQAAZVZ4fYE33nhDjz76qGrXri2Xy6XLLrtM33//fZHY7777Ttdff70SEhLkcrlUu3Zt/fGPf1RaWpok6dJLL1W7du1K7KdZs2bq16+fJGn//v0yDENz587VggUL1KhRIzmdTnXu3FlfffVVsX337Nmjm266SXFxcQoJCVGzZs00Y8aMIjGHDh3SyJEjVb16dTmdTrVq1Uovv/xysbZ++uknDR48WG63W/Hx8Zo8eXKZTzUodO+998rn8+nxxx8v137lZbFYAgdwpzt3/cUXX9ShQ4f05JNPFisqSAWzIu67777T9pWcnKxRo0apevXqcrlcateunRYvXlwszu/3a968eWrTpo1cLpfi4uLUv39/bdq06bTtP/LII7JYLKed5fHTTz/p//7v/9SnT58Sr9Ewfvx49e7dW//85z/1008/BV5Ha9eu1c6dOwNT8wtf0/v27dOKFSsC6wufw2effVatWrVSaGiooqOj1alTJ7322mtF+vqt19O6devUuXNnSdKf/vSnQB+LFi0qdXxz5sxRdna2FixYUKSoIEmxsbF68cUXlZWVpdmzZ0uS3nzzTRmGofXr1xdr68UXX5RhGNqxY0dg3Z49e3TDDTcoJiZGLpdLnTp10vLly4vsV3g6z/r16zVu3DjFx8erdu3apeZcViVdY6F+/fq66qqrtG7dOnXq1EkhISFq06ZN4Fomb731VuB11LFjR23ZsqVYu2UZEwDg7GDGAgCg3B5//HFZLBZNmTJFaWlpmj17toYNG6Yvv/xSkpSXl6d+/frJ4/HorrvuUkJCgg4dOqT33ntPqampioyM1K233qrRo0drx44dgWsNSAVTqL/99ttiB7evvfaaMjIydOedd8owDM2ePVvXXXedfvjhB9ntdknStm3b1KNHD9ntdt1xxx2qX7++9u7dq//+97969NFHJRVcW+Diiy8OXDQwLi5OH3zwgUaNGqX09PTARftycnJ02WWX6cCBA/rzn/+smjVr6pVXXtHHH39crueqQYMGGj58uF566SVNmzat1JkEFWHv3r2SpGrVqpUas3z5coWEhOiGG24Iqo+cnBz16tVL33//vSZMmKAGDRpo6dKlGjFihFJTUzVx4sRA7KhRo7Ro0SJdeeWVuv322+X1evXpp5/qiy++UKdOnUps/7777tOsWbP04osvavTo0aXm8cEHH8jn82n48OGlxgwfPlxr167VypUrNXToUL3yyit69NFHlZmZqccee0yS1KJFC73yyiuaPHmyateurbvvvluSFBcXp5deekl//vOfdcMNN2jixInKzc3Vtm3b9OWXX+rmm2+WVLbXU4sWLfTQQw/p/vvv1x133KEePXpIkrp161Zq7v/9739Vv379QOyv9ezZU/Xr19eKFSskSQMHDlRYWJjeeOMNXXrppUVilyxZolatWgXeZzt37tQll1yiWrVqadq0aXK73XrjjTc0ePBgLVu2rNjpFePGjVNcXJzuv/9+ZWVllZrzmfr+++918803684779Qtt9yiuXPnatCgQXrhhRd07733aty4cZKkxx57TDfddJMSExNlsViCGhMAoIKZAIDfrQceeMCUZKakpJS4vVWrVuall14aWF67dq0pyWzRooXp8XgC6+fNm2dKMrdv326apmlu2bLFlGQuXbq01L5TU1NNl8tlTp06tcj6P//5z6bb7TYzMzNN0zTNffv2mZLMatWqmSdOnAjEvfvuu6Yk87///W9gXc+ePc3w8HDzxx9/LNKm3+8P/H/UqFFmjRo1zGPHjhWJ+eMf/2hGRkaa2dnZpmma5tNPP21KMt94441ATFZWltm4cWNTkrl27dpSx2aaprlw4UJTkvnVV1+Ze/fuNW02m/nnP/85sP3SSy81W7VqVeK+KSkppiTzgQceKHH7bbfdZrrdbjMlJcVMSUkxv//+e3PWrFmmYRhm27ZtT5tXdHS02a5du9PGnOrSSy8t8hoofF5effXVwLq8vDyza9euZlhYmJmenm6apml+/PHHpqQiYy506s9Dkjl+/HjTNE3z7rvvNi0Wi7lo0aLfzGvSpEmmJHPLli2lxnz99demJPMvf/lLkfGU9LzXq1fPHDhwYJF111xzTak/o0JlfT199dVXpiRz4cKFvzGygveGJPOaa645bdzVV19tSgo850OHDjXj4+NNr9cbiDly5IhpsVjMhx56KLDusssuM9u0aWPm5uYG1vn9frNbt25mkyZNAusKX8Pdu3cv0mZZLF26tNT3SWG7+/btC6yrV6+eKcncsGFDYN2qVatMSWZISEiR9/SLL75YrO2yjgkAcHZwKgQAoNz+9Kc/yeFwBJYLv1X94YcfJEmRkZGSpFWrVik7O7vENiIjI3XNNdfoP//5j0zTlCT5fD4tWbIkcPrBqYYMGaLo6OhS+0xJSdEnn3yikSNHqm7dukX2NQxDkmSappYtW6ZBgwbJNE0dO3Ys8OjXr5/S0tL09ddfS5Lef/991ahRo8g3+6GhobrjjjvK81RJkho2bKhbb71VCxYs0JEjR8q9f0mysrIUFxenuLg4NW7cWPfee6+6du2qt99++7T7paenKzw8POh+33//fSUkJGjo0KGBdXa7XX/+85+VmZkZmIq/bNkyGYZR4sUQC38ehUzT1IQJEzRv3jy9+uqruu22234zj4yMDEk67VgKt6Wnp//2wEoQFRWln376qcRTbqTyvZ7KoyxjO3V74fiGDBmi5OTkIrdCffPNN+X3+zVkyBBJ0okTJ/Txxx/rpptuUkZGRiDf48ePq1+/fvruu++K3cVk9OjR5+SaCC1btlTXrl0Dy126dJEk9enTp8h7unB94Xs/mDEBACoWhQUAwGn9+iBQUrED98ID/pMnT0oqmP7/l7/8Rf/85z8VGxurfv366fnnnw9cX6HQ8OHDdeDAAX366aeSpI8++khHjx4t8VZ/v9Vn4UHGqadV/FpKSopSU1MD562f+vjTn/4kqeD6AZL0448/qnHjxsXG36xZs1LbP5377rtPXq+3wq614HK5tHr1aq1evVqffPKJDh48qM8///w3L+QXEREROHANxo8//qgmTZoEpqAXKrzy/48//iip4LSMmjVrKiYm5jfb/Ne//qXnn39ezz77bJGCxekUHlSfbixlPUAvzdSpUxUWFqY//OEPatKkicaPH6/PP/88sL08r6fyKMvYTt1eGN+/f39FRkZqyZIlgZglS5aoffv2atq0qaSC0w1M09Tf/va3YjkXFoF+nXODBg3KPYZg/Po9XligrFOnTonrC9/7wYwJAFCxuMYCAPyOuVwuSQXnzZckOzs7EHOq0r69LJx5IElPPPGERowYoXfffVcffvih/vznP+uxxx7TF198EbgAXL9+/VS9enW9+uqr6tmzp1599VUlJCSob9++QfX5W/x+vyTplltuKfVb8VPvzlCRGjZsqFtuuUULFizQtGnTzrg9q9Va4vP0W5o3b66tW7cqLy+vyKyTynTJJZdo69ateu6553TTTTeVqRhRWMjYtm1bqbdv3LZtmyQFfbeHFi1aKDExUe+9955WrlypZcuW6R//+Ifuv/9+Pfjgg2ft9RQZGakaNWoE8i/Ntm3bVKtWLUVEREgquAXp4MGD9fbbb+sf//iHjh49qs8//1yzZs0K7FOY85QpUwIXSP21U299KkkhISHlHkMwSnuP/9Z7P5gxAQAqFoUFAPgdq1evniQpMTGx2LeC2dnZOnjwoK644oqg22/Tpo3atGmj++67Txs2bNAll1yiF154QY888oikggOGm2++WYsWLdLf//53vfPOO0FPuy78pv7UK9//WlxcnMLDw+Xz+X7zoLxevXrasWOHTNMsMmshMTGx3LkVuu+++/Tqq6/q73//e9BtnKlBgwZp48aNWrZsWZlnB5yqXr162rZtm/x+f5FZC3v27Alsl6RGjRpp1apVOnHixG8WCho3bqzZs2erV69e6t+/v9asWfObswyuvPJKWa1WvfLKK6VewPFf//qXbDab+vfvX54hFuF2uzVkyBANGTJEeXl5uu666/Too49q+vTp5Xo9lTTz53SuuuoqvfTSS/rss8/UvXv3Yts//fRT7d+/X3feeWeR9UOGDNHixYu1Zs0a7d69W6ZpBk6DkH55n9jt9qAKU1XRhTgmADjfcCoEAPyOXXbZZXI4HJo/f37gW79CCxYskNfr1ZVXXlnudtPT0+X1eousa9OmjSwWS7HbNd566606efKk7rzzTmVmZuqWW24p/0BUUDTo2bOnXn75ZR04cKDItsJvNq1Wq66//notW7asxAJESkpK4P8DBgzQ4cOH9eabbwbWFd7+L1iNGjXSLbfcohdffFFJSUlBt3MmxowZoxo1aujuu+/Wt99+W2x7cnJyoPBTkgEDBigpKanIdHuv16tnn31WYWFhgTsSXH/99TJNUw8++GCxNkqaZdK2bVu9//772r17twYNGlTqLJpCderU0Z/+9Cd99NFHmj9/frHtL7zwgj7++GONGjUq6FskHj9+vMiyw+FQy5YtZZqm8vPzy/V6KrxmSGpqapn6vueeexQSEqI777yzWB4nTpzQmDFjFBoaqnvuuafItr59+yomJkZLlizRkiVL9Ic//KHIqQzx8fHq1auXXnzxxRKv93FqzueLC3FMAHC+YcYCAPyOxcfH6/7779d9992nnj176uqrr1ZoaKg2bNig//znP7riiis0aNCgcrf78ccfa8KECbrxxhvVtGlTeb1evfLKK4EDsVN16NBBrVu31tKlS9WiRQtddNFFQY/nmWeeUffu3XXRRRfpjjvuUIMGDbR//36tWLFCW7dulVRwq8y1a9eqS5cuGj16tFq2bKkTJ07o66+/1kcffaQTJ05IKrhg3XPPPafhw4dr8+bNqlGjhl555RWFhoYGnZ8kzZgxQ6+88ooSExPVqlWrM2orGNHR0Xr77bc1YMAAtW/fXrfccos6duwoSfr666/1n//8p8gF9H7tjjvu0IsvvqgRI0Zo8+bNql+/vt588019/vnnevrppwMzDXr37q1bb71VzzzzjL777jv1799ffr9fn376qXr37q0JEyYUa/viiy/Wu+++qwEDBuiGG27QO++8E7iVaEmeeuop7dmzR+PGjdPKlSsDMxNWrVqld999V5deeqmeeOKJoJ+rK664QgkJCbrkkktUvXp17d69W88995wGDhwYGGdZX0+NGjVSVFSUXnjhBYWHh8vtdqtLly6lXr+gSZMmWrx4sYYNG6Y2bdpo1KhRgdfz//3f/+nYsWP6z3/+o0aNGhXZz26367rrrtPrr7+urKwszZ07t1jbzz//vLp37642bdpo9OjRatiwoY4ePaqNGzfqp59+0jfffBP0c1ZZLsQxAcB55ZzfhwIAUOW8+uqr5sUXX2y63W7T6XSazZs3Nx988MEit24zzV9uN/nr20gW3hKy8FZ6P/zwgzly5EizUaNGpsvlMmNiYszevXubH330UYn9z54925Rkzpo1q9i2wrbnzJlTbJtKuCXjjh07zGuvvdaMiooyXS6X2axZM/Nvf/tbkZijR4+a48ePN+vUqWPa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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Device-Run: Pixel 6 - Run 1\n", + " Mean Offset: -0.176 µs\n", + " Median Offset: 0.000 µs\n", + " Standard Deviation: 0.382 µs\n", + "Device-Run: Pixel 6 - Run 2\n", + " Mean Offset: -0.176 µs\n", + " Median Offset: 0.000 µs\n", + " Standard Deviation: 0.381 µs\n", + "Device-Run: Pixel 6 - Run 3\n", + " Mean Offset: -0.244 µs\n", + " Median Offset: 0.000 µs\n", + " Standard Deviation: 0.430 µs\n", + "Device-Run: Tab S6 - Run 1\n", + " Mean Offset: -0.417 µs\n", + " Median Offset: 0.000 µs\n", + " Standard Deviation: 0.548 µs\n", + "Device-Run: Tab S6 - Run 2\n", + " Mean Offset: -2.081 µs\n", + " Median Offset: 0.000 µs\n", + " Standard Deviation: 27.702 µs\n", + "Device-Run: Tab S6 - Run 3\n", + " Mean Offset: -0.531 µs\n", + " Median Offset: -1.000 µs\n", + " Standard Deviation: 0.507 µs\n" + ] + } + ], + "source": [ + "# Experiment 1: Unsynced NTP Clock vs System Clock\n", + "base_dir_1 = \"data/single_device/system_clock/\"\n", + "devices_1 = [\"pixel_6\", \"tab_s6\"]\n", + "runs_1 = [\"run1-logcat.txt\", \"run2-logcat.txt\", \"run3-logcat.txt\"]\n", + "\n", + "exp1_data = load_experiment_data(\n", + " base_dir_1, \"us\", devices_1, runs_1, ntp_key=\"ntp_time\", system_key=\"device_time\"\n", + ")\n", + "plot_results(exp1_data, title=\"Unsynced NTP Clock Offset Over Time\")\n", + "compute_statistics(exp1_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABAIAAAIjCAYAAACZALkcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAhfRJREFUeJzs3Xd0VNXax/HfZNITUoAUSoBQQu9gBOmiwSAYvCCigBFEqVKVKl1QioKCFL0SLuoVEawgCAhIU6lSBKSKAiFBICGB9PP+wZu5xBQSmCSE+X7WmuXMOfvs/ew5M5HzzD57mwzDMAQAAAAAAGyCXWEHAAAAAAAACg6JAAAAAAAAbAiJAAAAAAAAbAiJAAAAAAAAbAiJAAAAAAAAbAiJAAAAAAAAbAiJAAAAAAAAbAiJAAAAAAAAbAiJAAAAAAAAbAiJAAAAcmHz5s0ymUzavHlzYYdSIFq1aqVWrVrlW/0mk0kDBw7Mt/r/KSUlRa+++qoCAgJkZ2ensLAwSVJcXJxeeOEF+fv7y2QyaciQIQUWk62JiIiQyWTSmTNnCjsUALB5JAIAAFZz8OBBde7cWeXLl5ezs7PKlCmjRx55RO+++25hh1Zg0i92nJ2dde7cuUz7W7VqpVq1akmSJk6cKJPJdNtH+gV5eHh4hu0eHh6qW7euZs+ercTExFzFd/HiRY0YMULVqlWTq6ur3Nzc1LBhQ02dOlVXr1611tuQ75KTk/XOO++ocePGKlasmNzd3dW4cWO98847Sk5OzlT+ww8/1MyZM9W5c2ctXbpUQ4cOlSRNmzZNERER6tevn5YtW6YePXpYNc7z589r4sSJ2r9/f56OO3z4sLp3764yZcrIyclJpUuX1rPPPqvDhw9bNb671apVq1x9hidOnFjYoQIAbmFf2AEAAO4PO3bsUOvWrVWuXDn16dNH/v7++vPPP/XTTz9p7ty5GjRoUGGHWKASExP1xhtv5JgEefLJJ1W5cmXL67i4OPXr10+dOnXSk08+adnu5+dnee7k5KQPPvhAknT16lWtXLlSI0aM0K5du/Tpp5/mGNOuXbsUGhqquLg4de/eXQ0bNpQk7d69W2+88YZ+/PFHff/993fU34IUHx+v9u3ba8uWLXr88ccVHh4uOzs7rV27VoMHD9aqVau0evVqubm5WY754YcfVKZMGb399tsZ6vrhhx/04IMPasKECfkS6/nz5zVp0iRVqFBB9erVy9Uxq1atUrdu3VS8eHH17t1bgYGBOnPmjP7973/r888/16effqpOnTrlS7x5NXbsWL3wwguW17t27dI777yjMWPGqHr16pbtderUUc2aNfX000/LycmpMEIFANyCRAAAwCpef/11eXp6ateuXfLy8sqwLyoqqnCCKkT16tXT+++/r9GjR6t06dJZlqlTp47q1KljeX3p0iX169dPderUUffu3bM8xt7ePsO+/v37Kzg4WMuXL9dbb72VbVtXr15Vp06dZDabtW/fPlWrVi3D/tdff13vv/9+XrtZKIYNG6YtW7bo3XffzXB7Qb9+/TR//nwNHDhQI0aM0IIFCyz7oqKiMn0u07fXqFGjIMLOlZMnT6pHjx6qWLGifvzxR/n4+Fj2DR48WM2bN1ePHj104MABVaxYscDiio+Pz5BYSffII49keO3s7Kx33nlHjzzySJa3lpjN5vwKEQCQB9waAACwipMnT6pmzZpZXmz5+vpanrds2VJ169bNso6qVasqJCREknTmzBmZTCbNmjVLixcvVqVKleTk5KTGjRtr165dmY49evSonnrqKfn4+MjFxUVVq1bV2LFjM5Q5d+6cevXqJT8/Pzk5OalmzZr68MMPM9X1119/KSwsTG5ubvL19dXQoUNzPfQ+3ZgxY5Samqo33ngjT8fllZ2dneWCK6d7rxctWqRz587prbfeypQEkG6OOhg3blyObUVFRal3797y8/OTs7Oz6tatq6VLl2Yql5aWprlz56p27dpydnaWj4+P2rVrp927d+dY/9SpU2VnZ5fjKIq//vpL//73v9WmTZss5xgYMGCAWrdurQ8++EB//fWX5XO0adMmHT582DJUPX3Oh9OnT2v16tWW7env4bvvvquaNWvK1dVV3t7eatSokT755JMMbd3u87R582Y1btxYkvT8889b2oiIiMi2fzNnztT169e1ePHiDEkASSpZsqQWLVqk+Ph4zZgxQ5L0+eefy2QyacuWLZnqWrRokUwmkw4dOmTZdvToUXXu3FnFixeXs7OzGjVqpK+//jrDcem3t2zZskX9+/eXr6+vypYtm23MuZXVHAEVKlTQ448/rs2bN6tRo0ZycXFR7dq1LXNxrFq1yvI5atiwofbt25ep3tz0CQCQEYkAAIBVlC9fXnv27Mlw0ZGV9F8z/1lu165d+v333zP9Ev7JJ59o5syZeumllzR16lSdOXNGTz75ZIb7wA8cOKDg4GD98MMP6tOnj+bOnauwsDB98803ljIXL17Ugw8+qA0bNmjgwIGaO3euKleurN69e2vOnDmWcjdu3NDDDz+sdevWaeDAgRo7dqy2bt2qV199NU/vR2BgoHr27Kn3339f58+fz9OxeXXy5ElJUokSJbIt8/XXX8vFxUWdO3e+ozZu3LihVq1aadmyZXr22Wc1c+ZMeXp6Kjw8XHPnzs1Qtnfv3hoyZIgCAgL05ptvatSoUXJ2dtZPP/2Ubf3jxo3T+PHjtWjRohxvI/nuu++Umpqqnj17ZlumZ8+eSklJ0dq1a+Xj46Nly5apWrVqKlu2rJYtW6Zly5apevXqWrZsmUqWLKl69epZtvv4+Oj999/Xyy+/rBo1amjOnDmaNGmS6tWrp59//tnSRm4+T9WrV9fkyZMlSS+++KKljRYtWmQb+zfffKMKFSqoefPmWe5v0aKFKlSooNWrV0uS2rdvL3d3d3322WeZyi5fvlw1a9a0zElx+PBhPfjggzpy5IhGjRql2bNny83NTWFhYfriiy8yHd+/f3/99ttvGj9+vEaNGpVtzHfrxIkTeuaZZ9ShQwdNnz5dV65cUYcOHfTxxx9r6NCh6t69uyZNmqSTJ0/qqaeeUlpamuXYvPYJAPD/DAAArOD77783zGazYTabjSZNmhivvvqqsW7dOiMpKSlDuatXrxrOzs7GyJEjM2x/+eWXDTc3NyMuLs4wDMM4ffq0IckoUaKEcfnyZUu5r776ypBkfPPNN5ZtLVq0MIoVK2b88ccfGepMS0uzPO/du7dRqlQp49KlSxnKPP3004anp6dx/fp1wzAMY86cOYYk47PPPrOUiY+PNypXrmxIMjZt2pTj+7BkyRJDkrFr1y7j5MmThr29vfHyyy9b9rds2dKoWbNmlsdGR0cbkowJEyZkuf+5554z3NzcjOjoaCM6Oto4ceKEMW3aNMNkMhl16tTJMS5vb2+jbt26OZa5VcuWLY2WLVtaXqe/Lx999JFlW1JSktGkSRPD3d3diI2NNQzDMH744QdDUoY+p7v1fEgyBgwYYBiGYQwfPtyws7MzIiIibhvXkCFDDEnGvn37si2zd+9eQ5IxbNiwDP3J6n0vX7680b59+wzbnnjiiWzPUbrcfp527dplSDKWLFlym57d/G5IMp544okcy3Xs2NGQZHnPu3XrZvj6+hopKSmWMhcuXDDs7OyMyZMnW7Y9/PDDRu3atY2EhATLtrS0NKNp06ZGlSpVLNvSP8PNmjXLUGdurFixItvvSXq9p0+ftmwrX768IcnYsWOHZdu6desMSYaLi0uG7/SiRYsy1Z3bPgEAMmJEAADAKh555BHt3LlTHTt21K+//qoZM2YoJCREZcqUyTBM19PTU0888YT++9//yjAMSVJqaqqWL19uGY5/q65du8rb29vyOv2X0lOnTkmSoqOj9eOPP6pXr14qV65chmNNJpMkyTAMrVy5Uh06dJBhGLp06ZLlERISopiYGO3du1eStGbNGpUqVSrDL+eurq568cUX8/yeVKxYUT169NDixYt14cKFPB+flfj4ePn4+MjHx0eVK1fWmDFj1KRJk9v++hkbG6tixYrdcbtr1qyRv7+/unXrZtnm4OCgl19+WXFxcZah6StXrpTJZMpy8r3085HOMAzLr+kfffSRnnvuudvGce3aNUnKsS/p+2JjY2/fsSx4eXnpr7/+yvIWFClvn6e8yE3fbt2f3r+uXbsqKioqw9KWn3/+udLS0tS1a1dJ0uXLl/XDDz/oqaee0rVr1yzx/v333woJCdHx48czrXLRp0+fArmnv0aNGmrSpInldXBwsCSpTZs2Gb7T6dvTv/t30icAwE0kAgAAVtO4cWOtWrVKV65c0S+//KLRo0fr2rVr6ty5s3777TdLuZ49e+rs2bPaunWrJGnDhg26ePFilku3/fPiPj0pcOXKFUn/uyhIH/6clejoaF29etVy3/Wtj+eff17S/yY0/OOPP1S5cuVMF61Vq1bN03uRbty4cUpJSbHaXAHOzs5av3691q9frx9//FF//vmntm/fftuJ4zw8PCwXmnfijz/+UJUqVWRnl/GfDukzw//xxx+Sbt6mULp0aRUvXvy2df7nP//R/Pnz9e6772ZIMOQk/SI4p77k9oI6OyNHjpS7u7seeOABValSRQMGDND27dst+/PyecqL3PTt1v3p5du1aydPT08tX77cUmb58uWqV6+egoKCJN0cfm8Yhl577bVMMacnbf4Zc2BgYJ77cCf++R339PSUJAUEBGS5Pf27fyd9AgDcxKoBAACrc3R0VOPGjdW4cWMFBQXp+eef14oVKyz/OA8JCZGfn58++ugjtWjRQh999JH8/f3Vtm3bTHVl94tk+miC3Ei/p7h79+7Z/up86+z91lSxYkV1795dixcvtsp91mazOcv36XaqVaum/fv3KykpSY6OjncdhzU89NBD2r9/v+bNm6ennnoqV8mD9MTDgQMHsl2O78CBA5J0x6sBVK9eXceOHdO3336rtWvXauXKlXrvvfc0fvx4TZo0Kd8+T56enipVqpQl/uwcOHBAZcqUkYeHh6SbS0qm3xP/3nvv6eLFi9q+fbumTZtmOSY95hEjRlgm5PynW5eylCQXF5c89+FOZPcdv913/076BAC4iUQAACBfNWrUSJIyDI03m8165plnFBERoTfffFNffvnlHQ9DTv8lPKdJCn18fFSsWDGlpqbe9iK6fPnyOnTokAzDyDAq4NixY3mOLd24ceP00Ucf6c0337zjOu5Whw4dtHPnTq1cuTLXv77fqnz58jpw4IDS0tIyjAo4evSoZb8kVapUSevWrdPly5dve2FfuXJlzZgxQ61atVK7du20cePG2/6K/9hjj8lsNmvZsmXZThj4n//8R/b29mrXrl1eupiBm5ubunbtqq5duyopKUlPPvmkXn/9dY0ePTpPn6d/jiy5nccff1zvv/++tm3bpmbNmmXav3XrVp05c0YvvfRShu1du3bV0qVLtXHjRh05ckSGYVhuC5D+9z1xcHC4o0TSveh+7BMAFBRuDQAAWMWmTZuy/JV+zZo1kjIPre/Ro4euXLmil156SXFxcZlWC8gtHx8ftWjRQh9++KHOnj2bYV96PGazWf/617+0cuXKLBMG0dHRluehoaE6f/68Pv/8c8u29OXc7lSlSpXUvXt3LVq0SJGRkXdcz93o27evSpUqpeHDh+v333/PtD8qKkpTp07N9vjQ0FBFRkZmGH6ekpKid999V+7u7mrZsqUk6V//+pcMw9CkSZMy1ZHV56NOnTpas2aNjhw5og4dOujGjRs59iMgIEDPP/+8NmzYoAULFmTav3DhQv3www/q3bv3HS959/fff2d47ejoqBo1asgwDCUnJ+fp85Q+58XVq1dz1fYrr7wiFxcXvfTSS5niuHz5svr27StXV1e98sorGfa1bdtWxYsX1/Lly7V8+XI98MADGYb2+/r6qlWrVlq0aFGW81XcGnNRcT/2CQAKCiMCAABWMWjQIF2/fl2dOnVS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z+mFF15Q165dLfvs7Oz0z6n1kpOTs+zDrUwmkyWJkZNPP/1UL7zwgj777LMM8y3kp1wnAr788kvNmjVLfn6ZZ6j09/fXjBkz9MUXX1g1uFslJSWpS5cu6tevX47llixZogsXLlgeYWFhln2nT59W+/bt1bp1a+3fv19DhgzRCy+8kGGJhuXLl2vYsGGaMGGC9u7dq7p16yokJCTXmRwAAAAAsAZnJ38VL95MKclXlZR8RWlpSUpKvqKU5KsqXrxZvq4ekJXt27crPDxcnTp1Uu3ateXv72+ZLO9WP/30U6bX1atXz1NbNWrUUEpKihISEuTo6KjGjRtnWL1Akn7//XeVL18+y+NdXFxUuXJly6NYsWK5bnvAgAE6dOiQ5frWx8dHkZGRGZIBt04ceDf++9//6vnnn9d///tftW/f3ip15kaulg+Ubi4jUbNmzWz316pVS5GRkVYJKiuTJk2SpNtOtuDl5SV/f/8s9y1cuFCBgYGaPXu2pJsZpG3btuntt99WSEiIJOmtt95Snz599Pzzz1uOWb16tT788EONGjXKSr0BAAAAgNsrX+4lSbo5J0BSlMxmF/n6hVq2F6QqVapo1apV6tChg0wmk1577bUsf/Hevn27ZsyYobCwMK1fv14rVqzQ6tWrs623VatW6tatmxo1aqQSJUrot99+05gxY9S6dWvL7PevvPKKunbtqhYtWqh169Zau3atvvnmG23evNnq/XR1dVWfPn00YcIEhYWFqVWrVoqOjtaMGTPUuXNnrV27Vt99991drxD3ySef6LnnntPcuXMVHBxsuZ52cXGRp6enNbqSrVyPCChZsmSW2Z50p0+fLpDZDW8nfTLDBx54QB9++GGGrM3OnTszDbUICQnRzp07Jd0cdbBnz54MZezs7NS2bVtLmawkJiYqNjY2wwMAAAAA7pa9vZsqVRymOrUXqEb1GapTe4EqVRyW70sHZuWtt96St7e3mjZtqg4dOigkJEQNGjTIVG748OHavXu36tevr6lTp+qtt96y/PCalZCQEC1dulSPPvqoqlevrkGDBikkJESfffaZpUynTp20cOFCzZgxQ7Vr19YHH3yglStXqlmzZvnS14EDB+rIkSNasWKFqlevrvfee0/z589X3bp19csvv2jEiBF33cbixYuVkpKiAQMGqFSpUpbH4MGDrdCDnJmMf97skI1e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V6gjAnJr/fr1OnHihE6cOKGyZctm2Je++qGnp6e+//57DRgwQA0bNlTJkiU1fvx4vfjii5ayTZs21SeffKJx48ZpzJgxqlKlir788kvVqlXLUubVV19VfHy8XnzxRV29elXNmjXT2rVr5ezsXDCdBQAAAAAgH5mM9CtpWE1e1m8EAAAAAOBu5eU6tEjcGgAAAAAAAKyDRAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADaERAAAAAAAADbEvrADAADAmn6NjdeXF6/o7I2kDNsTUtMkSc5muyy3FeTz27V/p/FZu1938t79U15jdTbbqal3MbX39ZK/k0Om+gAAwN0jEQAAKNI2XorR2ksxOp+QpF1X4xRrFHZEuFur/47VhBPn1KN0CY2rVFpu9ubCDgkAgPsKiQAAQJF0Mv6GOu07oajk1MIOBfkgRdJ/LvwtLwd7jaxYqrDDAQDgvsIcAQCAIqnLr6dIAtznUg3p66irikxMLuxQAAC4r5AIAAAUORsvxeg8F4c2ISYlVReTONcAAFgTiQAAQJHz67UbhR0CCoinvVl+jkwaCACANZEIAAAUOXWLuRR2CCgAZpPUkdUDAACwOhIBAIAi5+GSnirNxeF9zV5Sz1IlNLCcb2GHAgDAfYdVAwAARdKqepXUce/xbCcMNEkq5+Sgqm7OcjSZdCPN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VnBwsH755ZdMZXbu3Kk2bdrIzc1NHh4eatGihW7cuFHg9V64cEHPPPOMgoKCZGdnpyFDhmQqExERIZPJlOHh7Ox8+zeiCCpK527VqlV65JFH5OPjIw8PDzVp0kTr1q27o7aLuvvtvE2cODHTd65atWq5fDeKjqJ03rZt26aHHnpIJUqUkIuLi6pVq6a33377jtou6u6388b37X/ulfN2q+3bt8ve3l716tW7o7aLuvvtvPF9+5975bxt3rw50zkxmUyKjIzMc9tF3f123qz2fTOQK59++qnh6OhofPjhh8bhw4eNPn36GF5eXsbFixctZXbs2GF4eHgY06dPNw4dOmQcPXrUWL58uZGQkFDg9Z4+fdp4+eWXjaVLlxr16tUzBg8enKnMkiVLDA8PD+PChQuWR2Rk5J29QfewonbuBg8ebLz55pvGL7/8Yvz+++/G6NGjDQcHB2Pv3r15aruoux/P24QJE4yaNWtm+M5FR0ff5Tt1bylq523v3r3GJ598Yhw6dMg4ffq0sWzZMsPV1dVYtGhRntou6u7H88b37aZ76bylu3LlilGxYkXj0UcfNerWrZvntou6+/G88X276V46b5s2bTIkGceOHctwXlJTU/PUdlF3P543a33fSATk0gMPPGAMGDDA8jo1NdUoXbq0MX36dMu24OBgY9y4cfdEvbdq2bJltokAT0/PO663qCjK5y5djRo1jEmTJuWp7aLufjxvEyZMyPSPp/vN/XDeOnXqZHTv3j1PbRd19+N54/t207143rp27WqMGzcuy3PE9+2monbe+L7ddC+dt/QLyitXrtxV20Xd/XjerPV949aAXEhKStKePXvUtm1byzY7Ozu1bdtWO3fulCRFRUXp559/lq+vr5o2bSo/Pz+1bNlS27ZtK5B6W7VqpfDw8Dz3LS4uTuXLl1dAQICeeOIJHT58OM913Mvuh3OXlpama9euqXjx4rluu6i7H89buuPHj6t06dKqWLGinn32WZ09ezbX78u97n44b/v27dOOHTvUsmXLXLdd1N2P5y0d37d777wtWbJEp06d0oQJE+6o7aLufjxv6fi+3XvnTZLq1aunUqVK6ZFHHtH27dvz1HZRdz+et3TW+L6RCMiFS5cuKTU1VX5+fhm2+/n5We7XOHXqlKSb92z06dNHa9euVYMGDfTwww/r+PHj+V5vuXLlVKpU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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Device-Run: Pixel 6 - Run 1\n", + " Mean Offset: -2559.774 ms\n", + " Median Offset: -2559.792 ms\n", + " Standard Deviation: 0.300 ms\n", + "Device-Run: Pixel 6 - Run 2\n", + " Mean Offset: -2487.260 ms\n", + " Median Offset: -2487.274 ms\n", + " Standard Deviation: 0.283 ms\n", + "Device-Run: Pixel 6 - Run 3\n", + " Mean Offset: -2521.212 ms\n", + " Median Offset: -2520.671 ms\n", + " Standard Deviation: 1.268 ms\n", + "Device-Run: Tab S6 - Run 1\n", + " Mean Offset: -1919.192 ms\n", + " Median Offset: -1918.974 ms\n", + " Standard Deviation: 0.788 ms\n", + "Device-Run: Tab S6 - Run 2\n", + " Mean Offset: -1929.133 ms\n", + " Median Offset: -1928.758 ms\n", + " Standard Deviation: 1.163 ms\n", + "Device-Run: Tab S6 - Run 3\n", + " Mean Offset: -2359.237 ms\n", + " Median Offset: -2358.876 ms\n", + " Standard Deviation: 1.867 ms\n" + ] + } + ], + "source": [ + "# Experiment 2: NTP Clock (synced) vs System Clock\n", + "base_dir_2 = \"data/single_device/ntp_clock/\"\n", + "devices_2 = [\"pixel_6\", \"tab_s6\"]\n", + "runs_2 = [\"run1-logcat.txt\", \"run2-logcat.txt\", \"run3-logcat.txt\"]\n", + "\n", + "exp2_data = load_experiment_data(\n", + " base_dir_2, \"ms\", devices_2, runs_2, ntp_key=\"ntp_time\", system_key=\"device_time\"\n", + ")\n", + "plot_results(exp2_data, title=\"Synced NTP Clock Offset Over Time\")\n", + "compute_statistics(exp2_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsMAAAHDCAYAAADBZBffAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWIlJREFUeJzt3Xd8Tvf///HnlZBJIkSMJkRixB6hpUpaRayiAx1mq1qjarRFFx0o3VO3UdqPT7VVVK2i1fJpjZAaQYnaI0SCkEjy/v3hl/N1yZCLXAmux/12y43rfd7nnNfrOnJ55Z33eR+bMcYIAAAAcEFuRR0AAAAAUFQohgEAAOCyKIYBAADgsiiGAQAA4LIohgEAAOCyKIYBAADgsiiGAQAA4LIohgEAAOCyKIYBAADgsiiGAeRoz549stlsmjZtWlGHAris0NBQ9e3bt6jDAG5oFMOAi5o2bZpsNluOX6NHj3bKOSdMmKC5c+fmq29WMZ7TV9OmTZ0SX2HLyvGNN94okON99NFHN9wPL0eOHNFTTz2liIgI+fj4yNfXV5GRkXr11Vd18uTJog4PwA2gWFEHAKBovfzyy6pSpYpdW506dVS5cmWdPXtWxYsXL7BzTZgwQffdd5+6du2a730eeOABdejQwa6tbNmyBRbTjeSjjz5SYGDgDTOSuHbtWnXo0EGnT59Wz549FRkZKUlat26dXnvtNf32229asmRJEUfpXNu3b5ebG+NWgDNRDAMurn379mrcuHGO27y8vC67/5kzZ+Tr61vQYVkaNWqknj175qtvZmam0tLS8hU3rm0nT57U3XffLXd3d8XExCgiIsJu+/jx4/XZZ58VUXTOZYzRuXPn5O3tLU9Pz6IOB7jh8eMmgBzlNGe4b9++KlGihHbt2qUOHTqoZMmSeuihhyRJO3fu1L333qvy5cvLy8tLwcHBuv/++5WUlCRJstlsOnPmjKZPn25Nd7jaEUybzaYhQ4Zo1qxZql27tjw9PbVo0SJJ0htvvKFbb71VZcqUkbe3tyIjIzVnzpxcj/Htt9+qVq1a8vb2VrNmzfT3339Lkj755BNVrVpVXl5euv3227Vnz55sx/jzzz/Vrl07+fv7y8fHR1FRUfrjjz+uKreLTZ06Va1atVJQUJA8PT1Vq1YtTZkyxa5PaGiotmzZol9//dV6f2+//XZr+8mTJzVs2DCFhITI09NTVatW1aRJk5SZmWn1uXjaxqeffqrw8HB5enqqSZMmWrt2bba44uLi1L17d5UtW1be3t6qUaOGnnvuOUnSihUrZLPZ9MMPP2Tb7+uvv5bNZtOaNWtyzfmTTz7RgQMH9NZbb2UrhCWpXLlyev755+3aPvroI+vfQcWKFTV48OBsUyluv/121alTR7GxsYqKipKPj4+qVq1q/dv49ddfdcstt1j5LFu2zG7/cePGyWazWbn7+fmpTJkyevLJJ3Xu3Dm7vvm5btKFa9epUyctXrxYjRs3lre3tz755BNr28XfJ+fPn9dLL72katWqycvLS2XKlNFtt92mpUuX2h1z+fLlatGihXx9fVWqVCl16dJF27ZtyzGXf/75R3379lWpUqXk7++vfv36KSUlJYerAtyYGBkGXFxSUpISEhLs2gIDA3Ptn56erujoaN12221644035OPjo7S0NEVHRys1NVVPPPGEypcvrwMHDmjBggU6efKk/P399dVXX6l///66+eabNWDAAElSeHj4ZeNLSUnJFp+/v781fWP58uX673//qyFDhigwMFChoaGSpHfffVedO3fWQw89pLS0NP3nP/9Rt27dtGDBAnXs2NHueKtWrdK8efM0ePBgSdLEiRPVqVMnPfPMM/roo480aNAgJSYmavLkyXr44Ye1fPlya9/ly5erffv2ioyM1NixY+Xm5mYVQatWrdLNN9982RwvZ8qUKapdu7Y6d+6sYsWKaf78+Ro0aJAyMzOtmN955x098cQTKlGihFWQlitXznoPo6KidODAAT322GOqVKmSVq9erTFjxujQoUN655137M739ddf69SpU3rsscdks9k0efJk3XPPPdq9e7f1vsfGxqpFixYqXry4BgwYoNDQUO3atUvz58/X+PHjdfvttyskJESzZs3S3XffbXf8WbNmKTw8XM2aNcs153nz5snb21v33Xdfvt6jcePG6aWXXlLr1q01cOBAbd++XVOmTNHatWv1xx9/2E33SUxMVKdOnXT//ferW7dumjJliu6//37NmjVLw4YN0+OPP64HH3xQr7/+uu677z7t27dPJUuWtDtf9+7dFRoaqokTJ+p///uf3nvvPSUmJmrGjBkOXbcs27dv1wMPPKDHHntMjz76qGrUqJFrnhMnTrS+l5KTk7Vu3Tpt2LBBbdq0kSQtW7ZM7du3V1hYmMaNG6ezZ8/q/fffV/PmzbVhwwbre+TiXKpUqaKJEydqw4YN+vzzzxUUFKRJkybl670HrnsGgEuaOnWqkZTjlzHGxMfHG0lm6tSp1j59+vQxkszo0aPtjhUTE2MkmW+//TbPc/r6+po+ffrkK76s8+f0tWLFCmOMMZKMm5ub2bJlS7b9U1JS7F6npaWZOnXqmFatWtm1SzKenp4mPj7eavvkk0+MJFO+fHmTnJxstY8ZM8ZIsvpmZmaaatWqmejoaJOZmWl37ipVqpg2bdrkK8fXX389z36X5mKMMdHR0SYsLMyurXbt2iYqKipb31deecX4+vqaHTt22LWPHj3auLu7m71799rFU6ZMGXPixAmr348//mgkmfnz51ttLVu2NCVLljT//vuv3TEvfh/GjBljPD09zcmTJ622o0ePmmLFipmxY8fmmXNAQICpX79+nn0uPqaHh4dp27atycjIsNo/+OADI8l8+eWXVltUVJSRZL7++murLS4uzvq39L///c9qX7x4cbbvgbFjxxpJpnPnznYxDBo0yEgymzZtstrye90qV65sJJlFixZl61+5cmW775n69eubjh075vFuGNOgQQMTFBRkjh8/brVt2rTJuLm5md69e2fL5eGHH7bb/+677zZlypTJ8xzAjYRpEoCL+/DDD7V06VK7r8sZOHCg3Wt/f39J0uLFiwv816sDBgzIFl/9+vWt7VFRUapVq1a2/by9va2/JyYmKikpSS1atNCGDRuy9b3zzjvtRstuueUWSdK9995rNyKY1b57925J0saNG7Vz5049+OCDOn78uBISEpSQkKAzZ87ozjvv1G+//WY3DeFKXZxL1kh+VFSUdu/ebU1Dycu3336rFi1aKCAgwIoxISFBrVu3VkZGhn777Te7/j169FBAQID1ukWLFnZ5Hzt2TL/99psefvhhVapUyW5fm81m/b13795KTU21m54ye/ZspaenX3YeeHJycrbR2NwsW7ZMaWlpGjZsmN3NZo8++qj8/Pz0008/2fUvUaKE7r//fut1jRo1VKpUKdWsWdO6xlL2632xS0d2n3jiCUnSwoULrTZHrluVKlUUHR192VxLlSqlLVu2aOfOnTluP3TokDZu3Ki+ffuqdOnSVnu9evXUpk0bu/iyPP7443avW7RooePHjys5Ofmy8QA3AqZJAC7u5ptvzvUGupwUK1ZMwcHBdm1VqlTRiBEj9NZbb2nWrFlq0aKFOnfurJ49e1qF8pWqVq2aWrdunev2S1fCyLJgwQK9+uqr2rhxo1JTU632i4u1LJcWdFkxh4SE5NiemJgoSVZB0qdPn1zjS0pKsissr8Qff/yhsWPHas2aNdl+2EhKSrrse7xz507FxsbmugrH0aNH7V5f+n5kxZ+Vd1ZxWKdOnTzPGxERoSZNmmjWrFl65JFHJF2YItG0aVNVrVo1z339/Px06tSpPPtk+ffffyUp29QCDw8PhYWFWduzBAcHZ/t34O/vf9nrfbFq1arZvQ4PD5ebm5vdnHJHrltu/44v9fLLL6tLly6qXr266tSpo3bt2qlXr16qV6+epNzfC0mqWbOmFi9enO2m17yut5+fX77iAq5nFMMAHOLp6ZnjUk9vvvmm+vbtqx9//FFLlizR0KFDrfmUlxbPBeni0bcsq1atUufOndWyZUt99NFHqlChgooXL66pU6fq66+/ztbf3d09x2Pn1m6MkSRr1Pf1119XgwYNcuxbokSJ/KSRq127dunOO+9URESE3nrrLYWEhMjDw0MLFy7U22+/na+R58zMTLVp00bPPPNMjturV69u9/pyeTuid+/eevLJJ7V//36lpqbqf//7nz744IPL7hcREaGNGzcqLS1NHh4eDp83L1d6vfNyaXHt6HXL6d9xTlq2bKldu3ZZ32eff/653n77bX388cfq379/vo5xqYK83sD1iGIYQIGpW7eu6tatq+eff16rV69W8+bN9fHHH+vVV1+VlPOorDN899138vLy0uLFi+2Wppo6dWqBnifrBkA/P788R6+vxvz585Wamqp58+bZjeCtWLEiW9/c3t/w8HCdPn26wGIMCwuTJG3evPmyfe+//36NGDFC33zzjbVudY8ePS6731133aU1a9bou+++0wMPPJBn38qVK0u6cBNaVmySlJaWpvj4eKdcm507d9qN5v7zzz/KzMy0pts4ct0cVbp0afXr10/9+vXT6dOn1bJlS40bN079+/e3ey8uFRcXp8DAQKcuhQhcj5gzDOCqJScnKz093a6tbt26cnNzs5ui4OvrWyhPDXN3d5fNZlNGRobVtmfPnnw//S6/IiMjFR4erjfeeEOnT5/Otv3YsWNXfY6sUbuLR+mSkpJyLOxze3+7d++uNWvWaPHixdm2nTx5Mtu1u5yyZcuqZcuW+vLLL7V37167bZeOJgYGBqp9+/aaOXOmZs2apXbt2uW5WkmWxx9/XBUqVNDIkSO1Y8eObNuPHj1q/ZDVunVreXh46L333rM7/xdffKGkpKRsq4cUhA8//NDu9fvvvy/pwrrdkmPXzRHHjx+3e12iRAlVrVrV+j6rUKGCGjRooOnTp9v9W9i8ebOWLFmS7QE2ABgZBlAAli9friFDhqhbt26qXr260tPT9dVXX8nd3V333nuv1S8yMlLLli3TW2+9pYoVK6pKlSp2NywVlI4dO+qtt95Su3bt9OCDD+ro0aP68MMPVbVqVcXGxhbYedzc3PT555+rffv2ql27tvr166ebbrpJBw4c0IoVK+Tn56f58+df9ji//PJLtjVqJalr165q27atPDw8dNddd+mxxx7T6dOn9dlnnykoKEiHDh2y6x8ZGakpU6bo1VdfVdWqVRUUFKRWrVrp6aef1rx589SpUyf17dtXkZGROnPmjP7++2/NmTNHe/bsyVeBerH33ntPt912mxo1aqQBAwaoSpUq2rNnj3766Sdt3LjRrm/v3r2tJdJeeeWVfB0/ICBAP/zwgzp06KAGDRrYPYFuw4YN+uabb6yl2cqWLasxY8bopZdeUrt27dS5c2dt375dH330kZo0aZLvh7Y4Ij4+Xp07d1a7du20Zs0azZw5Uw8++KB1c6cj180RtWrV0u23367IyEiVLl1a69at05w5czRkyBCrz+uvv6727durWbNmeuSRR6yl1fz9/TVu3LirTR248RTdQhYAilLW0mpr167NcXtuS6v5+vpm67t7927z8MMPm/DwcOPl5WVKly5t7rjjDrNs2TK7fnFxcaZly5bG29vbSMpzmbX8LDsmyQwePDjHbV988YWpVq2a8fT0NBEREWbq1KnWUlKXO0Zu516xYkWOS8jFxMSYe+65x5QpU8Z4enqaypUrm+7du5tffvkl19gvPk9uX1999ZUxxph58+aZevXqGS8vLxMaGmomTZpkvvzyS7tl3owx5vDhw6Zjx46mZMmSRpLdMmunTp0yY8aMMVWrVjUeHh4mMDDQ3HrrreaNN94waWlpeead9T5duhza5s2bzd13321KlSplvLy8TI0aNcwLL7yQbd/U1FQTEBBg/P39zdmzZ/N8Ty518OBBM3z4cFO9enXj5eVlfHx8TGRk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CQkJ0cmTJ9WqVSs1bNhQ69at06JFi3TkyBF1797d7tzTp09XYGCg/vrrLz3xxBMaOHCgunXrpltvvVUbNmxQ27Zt1atXL6WkpOQY+8aNG7VlyxaNHDlSbm7ZP2Zymz5z4MABdejQQU2aNNGmTZs0ZcoUffHFF3r11VetPnldw4ulpqaqW7du2rhxo1atWqVKlSpZ226++WatWrUqxxgAZyhRooRKlCihuXPn2n1PX6x///5atGiRDh06ZLUtWLBAKSkp6tGjh9U2ffp0+fr66s8//9TkyZP18ssva+nSpZKkzMxMtW/fXn/88YdmzpyprVu36rXXXpO7u7ukC5+R7dq107333qvY2FjNnj1bv//+u4YMGWIdv2/fvtq3b59WrFihOXPm6KOPPtLRo0fzzG/VqlWqXr26SpYsmW1b8+bN1alTJ40ePTr/b1g+eHt7S5L1+XypWbNmqXXr1mrYsGG2bcWLF5evr2+O+/Xt21fr1q3TvHnztGbNGhlj1KFDB2taxcaNG3XnnXeqVq1aWrNmjX7//XfdddddOX6Wf/3113rggQc0a9YsPfTQQ1b7zTffrP3792vPnj2Opg1nKOpqHNc/R0aGK1eubNLT0622bt26mR49ehhjjPnuu++Mn59ftpGFLAMHDjTt27e3Xr/55psmLCzMZGZmGmMujAz7+PjY7f/000+bW265xRhjTHJysvH09DSfffZZjsf/6quvTI0aNazjGWNMamqq8fb2NosXLzbGGFOhQgUzefJka/v58+dNcHBwniPDP/zwg3F3d7c7rjHGfPDBB8bHx8eULFnS3HHHHebll182u3btsrafPXvWBAQEmNmzZ1tt9erVM+PGjcvX+5XTdXnllVdM27Zt7dr27dtnJJnt27db+912223W9vT0dOPr62t69epltR06dMhIMmvWrMnx3LNnzzaSchyRudiloz3PPvtstmvw4YcfmhIlSpiMjIzLXsOs461atcrceeed5rbbbjMnT57M1u/dd981oaGhecYGFLQ5c+aYgIAA4+XlZW699VYzZswYs2nTJrs+tWrVMpMmTbJe33XXXaZv377W60u/P40xpkmTJmbUqFHGGGMWL15s3NzcrO/nSz3yyCNmwIABdm2rVq0ybm5u5uzZs2b79u1Gkvnrr7+s7du2bTOS8hwZfvLJJ02rVq2ytUsyP/zwg9myZYtxd3c3v/32mzHm6keGExMTzd13321KlChhDh8+nGNM3t7eZujQobnGnOXiz8odO3YYSeaPP/6wtickJBhvb2/z3//+1xhjzAMPPGCaN29+2eN98MEHxt/fP8ffBiQlJV32NwUoPIwMo1DVrl3bGqGQpAoVKlgjDm3atFHlypUVFhamXr16adasWXYjj48++qiWLFmiAwcOSLpwg17fvn1ls9msPqGhoXYjExcff9u2bUpNTdWdd96ZY2ybNm3SP//8o5IlS1qjOKVLl9a5c+e0a9cuJSUl6dChQ7rlllusfYoVK2Y34puTs2fPytPT0y5OSRo8eLAOHz6sWbNmqVmzZvr2229Vu3Zta4THy8tLvXr10pdffilJ2rBhgzZv3mzddHK59yu3HFesWGHlV6JECUVEREi6MGKUpV69etbf3d3dVaZMGdWtW9dqyxqJzW20yFzhgy23bdumZs2a2b1XzZs31+nTp7V///7LXsMsDzzwgM6cOaMlS5bI398/23Zvb+/LvldAQbv33nt18OBBzZs3T+3atdPKlSvVqFEj67dj0oXR4alTp0qSjhw5op9//tnut1+S/fenZP85t3HjRgUHB6t69eo5xrBp0yZNmzbN7jMgOjpamZmZio+P17Zt21SsWDFFRkZa+0RERFz2ZuizZ8/Ky8sr1+21atVS7969r3p0+NZbb1WJEiUUEBCgTZs2afbs2Tn+Zki6ss+hrPwv/pwvU6aMatSooW3btkn6v5HhvMyZM0fDhw/X0qVLFRUVlW171qg2n0PXBophXDU/Pz8lJSVlaz958mS2QqR48eJ2r202mzIzMyVJJUuW1IYNG/TNN9+oQoUKevHFF1W/fn3r5oiGDRuqfv36mjFjhtavX68tW7ZYhWF+jp/14ZOb06dPKzIyUhs3brT72rFjhx588MHLvg+5CQwMVEpKSo6/yitZsqTuuusujR8/Xps2bVKLFi3spgT0799fS5cu1f79+zV16lS1atVKlStXtvbN6/3KLce77rorW447d+60plhIOb+PF7dlFatZ7+2lsv4jLqiVMbJc7hpm6dChg2JjY7VmzZoct584cUJly5YtyNCAfPHy8lKbNm30wgsvaPXq1erbt6/Gjh1rbe/du7d2796tNWvWaObMmapSpYpatGhhd4yr/Zx77LHH7L7/N23apJ07dyo8PPyK8woMDFRiYmKefV566SVt2LBBc+fOveLzzJ49W5s2bVJiYqJ27dqlDh065Nq3evXqBf4ZJOXvc6hhw4YqW7asvvzyyxyL8hMnTkgSn0PXCIphXLUaNWpow4YN2do3bNiQ6+hEbooVK6bWrVtr8uTJio2N1Z49e7R8+XJre//+/TVt2jRNnTpVrVu3VkhISL6PXa1aNXl7e+uXX37JcXujRo20c+dOBQUFqWrVqnZf/v7+8vf3V4UKFfTnn39a+6Snp2v9+vV5nrdBgwaSpK1bt+bZz2azKSIiQmfOnLHa6tatq8aNG+uzzz7T119/nW2EKK/3y8PDI9sctkaNGmnLli0KDQ3NlmNu8+euRIMGDVSrVi29+eabORbMuRXsNWvWtOboZfnjjz9UsmRJBQcHX/YaZhk4cKBee+01de7cWb/++mu27Zs3b85xHiFQ2GrVqmX3PV+mTBl17dpVU6dO1bRp09SvXz+HjlevXj3t379fO3bsyHF7o0aNtHXr1mzf/1WrVpWHh4ciIiKyfa5t3779sqvcNGzYUHFxcXmOxoaEhGjIkCF69tlnc71X4nJCQkIUHh6er2U7H3zwQS1btizH5dfOnz9v975nqVmzptLT0+0+548fP67t27erVq1aki68x5f7DAoPD9eKFSv0448/5rim8ObNm1W8eHHVrl37snnA+SiGcdUGDhyoHTt2aOjQoYqNjdX27dv11ltv6ZtvvnFoCa0FCxbovffe08aNG/Xvv/9qxowZyszMVI0aNaw+Dz74oPbv36/PPvssW2F4OV5eXho1apSeeeYZzZgxQ7t27dL//vc/ffHFF5IuLLkVGBioLl26aNWqVYqPj9fKlSs1dOhQ7d+/X5L05JNP6rXXXtPcuXMVFxenQYMGXfY/ibJly6pRo0b6/fffrbaNGzeqS5cumjNnjrZu3ap//vlHX3zxhb788kt16dLFbv/+/fvrtddekzFGd999d77fr9DQUP3555/as2ePEhISlJmZqcGDB+vEiRN64IEHtHbtWu3atUuLFy9Wv379rvg/p5zYbDZNnTpVO3bsUIsWLbRw4ULt3r1bsbGxGj9+fLYcswwaNEj79u3TE088obi4OP34448aO3asRowYITc3t8tew4s98cQTevXVV9WpUye79166cLNP27ZtCyxf4HKOHz+uVq1aaebMmYqNjVV8fLy+/fZbTZ48Ocfv+enTp2vbtm3q06ePQ+eJiopSy5Ytde+992rp0qWKj4/Xzz//rEWLFkmSRo0apdWrV2vIkCHWb4V+/PFH6wa6GjVqqF27dnrsscf0559/av369erfv/9lR0PvuOMOnT59+rLLlY0ZM0YHDx7UsmXLHMrrSgwbNkzNmzfXnXfeqQ8//FCbNm3S7t279d///ldNmzbVzp07s+1TrVo1denSRY8++qh+//13bdq0ST179tRNN91kXacxY8Zo7dq1GjRokGJjYxUXF6cpU6YoISHB7ljVq1fXihUr9N1332Vb833VqlVq0aJFvn/bBScrygnLuHH89ddfpk2bNqZs2bLG39/f3HLLLeaHH36w65O1tNrFnnzySRMVFWWMuXATR1RUlAkICDDe3t6mXr16djePZenVq1eOy6xlLa12sbfffttUrlzZep2RkWFeffVVU7lyZVO8eHFTqVIlM2HCBGv7oUOHTO/evU1gYKDx9PQ0YWFh5tFHHzVJSUnGmAs3zD355JPGz8/PlCpVyowYMeKyS6sZY8xHH31kmjZtar0+duyYGTp0qKlTp44pUaKEKVmypKlbt6554403si1FdurUKePj42MGDRpk136592v79u2madOmxtvb225ptR07dpi7777bWjYoIiLCDBs2zLppLacb73JaVkn//8aYvGzfvt307t3bVKxY0Xh4eJjKlSubBx54wLqx7kqXVsvtGuZ0vDfffNOULFnSuiFm9erVplSpUiYlJSXP2IGCdO7cOTN69GjTqFEj4+/vb3x8fEyNGjXM888/n+3fYmZmpqlcubLp0KFDtuPk9P156c1ox48fN/369TNlypQxXl5epk6dOnZLO2Z9XpcoUcL4+vqaevXqmfHjx1vbDx06ZDp27Gg8PT1NpUqVrOUq87qBzhhjunfvbkaPHm3XltPnxIQJE4ykq15aLT/OnTtnJk6caOrWrWu8vLxM6dKlTfPmzc20adOsz5Xcllbz9/c33t7eJjo6OtvSaitXrjS33nqr8fT0NKVKlTLR0dHWkpGXHm/r1q0mKCjIjBgxwmqrUaOG+eabbxzKBc5jM+YK73QBisidd96p2rVr67333ivqUPLt7NmzqlGjhmbPnq1mzZo5tO+ePXsUHh6utWvXqlGjRk6K0HX06NFD9evX17PPPlvUoQA5On36tG666SZNnTpV99xzT1GHk2+xsbFq06aNdu3aZT1gCNn9/PPPGjlypGJjY1WsWLGiDgdimgSuI4mJifrhhx+0cuVKDR48uKjDcYi3t7dmzJiR7ddoeTl//rwOHz6s559/Xk2bNqUQLgBpaWmqW7euhg8fXtShANlkZmbq6NGjeuWVV1SqVCl17ty5qENySL169TRp0iTFx8cXdSjXtDNnzmjq1KkUwtcQRoZx3QgNDVViYqJeeOEFu8dz3qhWrlypO+64Q9WrV9ecOXPsljYDcOPZs2ePqlSpouDgYE2bNu2yy3cBKBgUwwAAAHBZTJMAAACAy6IYBgAAgMuiGAYAAIDLohgGAACAy6IYBgAAgMuiGAYAAIDLohgGAACAy6IYBgAAgMuiGAYAAIDL+n/hzpFhoeEL4QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unsynced (System Clock) First Frame Latency:\n", + " Mean: -720.257 ms\n", + " Median: -720.404 ms\n", + " Std Dev: 27.252 ms\n", + "\n", + "Synced (NTP Clock) First Frame Latency:\n", + " Mean: 71.600 ms\n", + " Median: 82.000 ms\n", + " Std Dev: 49.571 ms\n", + "\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import os\n", + "import matplotlib.pyplot as plt\n", + "import rerun as rr\n", + "\n", + "\n", + "def compute_first_frame_latency(rrd_path: str):\n", + " recording = rr.dataframe.load_recording(rrd_path)\n", + " view = recording.view(index=\"device_timestamp\", contents=\"/**\")\n", + "\n", + " df = view.select().read_pandas()\n", + "\n", + " # Drop any columns with \"Color\" or \"HalfSize3D\" in the name, they span all rows\n", + " # so we are not able to correctly determine when the first actual frame from each device was captured\n", + " df = df.loc[:, ~df.columns.str.contains(\"Color\")]\n", + " df = df.loc[:, ~df.columns.str.contains(\"HalfSize3D\")]\n", + " # Convert timestamps to datetime\n", + " df[\"device_timestamp\"] = pd.to_datetime(df[\"device_timestamp\"])\n", + "\n", + " # Extract column names related to each device\n", + " device_columns = [col for col in df.columns if \"gyroscope_frame\" in col]\n", + "\n", + " # Identify unique devices\n", + " devices = list(set(col.split(\"/\")[2] for col in device_columns))\n", + "\n", + " # Store first frame timestamps\n", + " first_frame_timestamps = {}\n", + "\n", + " for device in devices:\n", + " device_cols = [col for col in df.columns if device in col]\n", + " first_valid_idx = df[device_cols].dropna(how=\"all\").index.min()\n", + "\n", + " if pd.notna(first_valid_idx):\n", + " first_frame_timestamps[device] = df.loc[first_valid_idx, \"device_timestamp\"]\n", + "\n", + " # Compute first frame latency (difference between two devices)\n", + " timestamps = list(first_frame_timestamps.values())\n", + " if len(timestamps) == 2:\n", + " latency = (timestamps[1] - timestamps[0]).total_seconds() * 1e3 # Convert to ms\n", + " return latency\n", + " else:\n", + " return None\n", + "\n", + "\n", + "# Paths to datasets\n", + "system_clock_dir = \"data/multi_device/system_clock/\"\n", + "ntp_clock_dir = \"data/multi_device/ntp_clock/\"\n", + "\n", + "# Get all run files\n", + "system_clock_runs = sorted(\n", + " [\n", + " os.path.join(system_clock_dir, f)\n", + " for f in os.listdir(system_clock_dir)\n", + " if f.endswith(\".rrd\")\n", + " ]\n", + ")\n", + "ntp_clock_runs = sorted(\n", + " [\n", + " os.path.join(ntp_clock_dir, f)\n", + " for f in os.listdir(ntp_clock_dir)\n", + " if f.endswith(\".rrd\")\n", + " ]\n", + ")\n", + "\n", + "# Compute latencies for each run\n", + "system_latencies = [compute_first_frame_latency(run) for run in system_clock_runs]\n", + "ntp_latencies = [compute_first_frame_latency(run) for run in ntp_clock_runs]\n", + "\n", + "# Remove None values (in case of any errors)\n", + "system_latencies = [lat for lat in system_latencies if lat is not None]\n", + "ntp_latencies = [lat for lat in ntp_latencies if lat is not None]\n", + "\n", + "# Visualize with a box plot\n", + "plt.figure(figsize=(8, 5))\n", + "plt.boxplot(\n", + " [system_latencies, ntp_latencies],\n", + " tick_labels=[\"Unsynced (System Clock)\", \"Synced (NTP Clock)\"],\n", + " patch_artist=True,\n", + ")\n", + "plt.ylabel(\"First Frame Latency (ms)\")\n", + "plt.title(\"First Frame Latency Comparison\")\n", + "plt.grid(axis=\"y\", linestyle=\"--\", alpha=0.7)\n", + "plt.show()\n", + "\n", + "# Print statistics\n", + "print(\"Unsynced (System Clock) First Frame Latency:\")\n", + "print(f\" Mean: {pd.Series(system_latencies).mean():.3f} ms\")\n", + "print(f\" Median: {pd.Series(system_latencies).median():.3f} ms\")\n", + "print(f\" Std Dev: {pd.Series(system_latencies).std():.3f} ms\\n\")\n", + "\n", + "print(\"Synced (NTP Clock) First Frame Latency:\")\n", + "print(f\" Mean: {pd.Series(ntp_latencies).mean():.3f} ms\")\n", + "print(f\" Median: {pd.Series(ntp_latencies).median():.3f} ms\")\n", + "print(f\" Std Dev: {pd.Series(ntp_latencies).std():.3f} ms\\n\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "arflow-SCZ1vie_-py3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python/poetry.lock b/python/poetry.lock index 8ddcc8d..dd92c9b 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,4 +1,30 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "attrs" @@ -19,6 +45,85 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "cfgv" version = "3.4.0" @@ -41,6 +146,96 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "contourpy" +version = "1.3.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.10" +files = [ + {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, + {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, + {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, + {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, + {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, + {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, + {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + [[package]] name = "coverage" version = "7.6.8" @@ -118,6 +313,67 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "debugpy" +version = "1.8.12" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.12-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:a2ba7ffe58efeae5b8fad1165357edfe01464f9aef25e814e891ec690e7dd82a"}, + {file = "debugpy-1.8.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbbd4149c4fc5e7d508ece083e78c17442ee13b0e69bfa6bd63003e486770f45"}, + {file = "debugpy-1.8.12-cp310-cp310-win32.whl", hash = "sha256:b202f591204023b3ce62ff9a47baa555dc00bb092219abf5caf0e3718ac20e7c"}, + {file = "debugpy-1.8.12-cp310-cp310-win_amd64.whl", hash = "sha256:9649eced17a98ce816756ce50433b2dd85dfa7bc92ceb60579d68c053f98dff9"}, + {file = "debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:36f4829839ef0afdfdd208bb54f4c3d0eea86106d719811681a8627ae2e53dd5"}, + {file = "debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28ed481d530e3138553be60991d2d61103ce6da254e51547b79549675f539b7"}, + {file = "debugpy-1.8.12-cp311-cp311-win32.whl", hash = "sha256:4ad9a94d8f5c9b954e0e3b137cc64ef3f579d0df3c3698fe9c3734ee397e4abb"}, + {file = "debugpy-1.8.12-cp311-cp311-win_amd64.whl", hash = "sha256:4703575b78dd697b294f8c65588dc86874ed787b7348c65da70cfc885efdf1e1"}, + {file = "debugpy-1.8.12-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:7e94b643b19e8feb5215fa508aee531387494bf668b2eca27fa769ea11d9f498"}, + {file = "debugpy-1.8.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:086b32e233e89a2740c1615c2f775c34ae951508b28b308681dbbb87bba97d06"}, + {file = "debugpy-1.8.12-cp312-cp312-win32.whl", hash = "sha256:2ae5df899732a6051b49ea2632a9ea67f929604fd2b036613a9f12bc3163b92d"}, + {file = "debugpy-1.8.12-cp312-cp312-win_amd64.whl", hash = "sha256:39dfbb6fa09f12fae32639e3286112fc35ae976114f1f3d37375f3130a820969"}, + {file = "debugpy-1.8.12-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:696d8ae4dff4cbd06bf6b10d671e088b66669f110c7c4e18a44c43cf75ce966f"}, + {file = "debugpy-1.8.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:898fba72b81a654e74412a67c7e0a81e89723cfe2a3ea6fcd3feaa3395138ca9"}, + {file = "debugpy-1.8.12-cp313-cp313-win32.whl", hash = "sha256:22a11c493c70413a01ed03f01c3c3a2fc4478fc6ee186e340487b2edcd6f4180"}, + {file = "debugpy-1.8.12-cp313-cp313-win_amd64.whl", hash = "sha256:fdb3c6d342825ea10b90e43d7f20f01535a72b3a1997850c0c3cefa5c27a4a2c"}, + {file = "debugpy-1.8.12-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:b0232cd42506d0c94f9328aaf0d1d0785f90f87ae72d9759df7e5051be039738"}, + {file = "debugpy-1.8.12-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af40506a59450f1315168d47a970db1a65aaab5df3833ac389d2899a5d63b3f"}, + {file = "debugpy-1.8.12-cp38-cp38-win32.whl", hash = "sha256:5cc45235fefac57f52680902b7d197fb2f3650112379a6fa9aa1b1c1d3ed3f02"}, + {file = "debugpy-1.8.12-cp38-cp38-win_amd64.whl", hash = "sha256:557cc55b51ab2f3371e238804ffc8510b6ef087673303890f57a24195d096e61"}, + {file = "debugpy-1.8.12-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:b5c6c967d02fee30e157ab5227706f965d5c37679c687b1e7bbc5d9e7128bd41"}, + {file = "debugpy-1.8.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a77f422f31f170c4b7e9ca58eae2a6c8e04da54121900651dfa8e66c29901a"}, + {file = "debugpy-1.8.12-cp39-cp39-win32.whl", hash = "sha256:a4042edef80364239f5b7b5764e55fd3ffd40c32cf6753da9bda4ff0ac466018"}, + {file = "debugpy-1.8.12-cp39-cp39-win_amd64.whl", hash = "sha256:f30b03b0f27608a0b26c75f0bb8a880c752c0e0b01090551b9d87c7d783e2069"}, + {file = "debugpy-1.8.12-py2.py3-none-any.whl", hash = "sha256:274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6"}, + {file = "debugpy-1.8.12.tar.gz", hash = "sha256:646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + [[package]] name = "distlib" version = "0.3.9" @@ -200,6 +456,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "executing" +version = "2.2.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, + {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + [[package]] name = "filelock" version = "3.16.1" @@ -216,6 +486,79 @@ docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2. testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] +[[package]] +name = "fonttools" +version = "4.55.8" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.55.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d11600f5343092697d7434f3bf77a393c7ae74be206fe30e577b9a195fd53165"}, + {file = "fonttools-4.55.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c96f2506ce1a0beeaa9595f9a8b7446477eb133f40c0e41fc078744c28149f80"}, + {file = "fonttools-4.55.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b5f05ef72e846e9f49ccdd74b9da4309901a4248434c63c1ee9321adcb51d65"}, + {file = "fonttools-4.55.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba45b637da80a262b55b7657aec68da2ac54b8ae7891cd977a5dbe5fd26db429"}, + {file = "fonttools-4.55.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:edcffaeadba9a334c1c3866e275d7dd495465e7dbd296f688901bdbd71758113"}, + {file = "fonttools-4.55.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b9f9fce3c9b2196e162182ec5db8af8eb3acd0d76c2eafe9fdba5f370044e556"}, + {file = "fonttools-4.55.8-cp310-cp310-win32.whl", hash = "sha256:f089e8da0990cfe2d67e81d9cf581ff372b48dc5acf2782701844211cd1f0eb3"}, + {file = "fonttools-4.55.8-cp310-cp310-win_amd64.whl", hash = "sha256:01ea3901b0802fc5f9e854f5aeb5bc27770dd9dd24c28df8f74ba90f8b3f5915"}, + {file = "fonttools-4.55.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:95f5a1d4432b3cea6571f5ce4f4e9b25bf36efbd61c32f4f90130a690925d6ee"}, + {file = "fonttools-4.55.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d20f152de7625a0008ba1513f126daaaa0de3b4b9030aa72dd5c27294992260"}, + {file = "fonttools-4.55.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5a3ff5bb95fd5a3962b2754f8435e6d930c84fc9e9921c51e802dddf40acd56"}, + {file = "fonttools-4.55.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b99d4fd2b6d0a00c7336c8363fccc7a11eccef4b17393af75ca6e77cf93ff413"}, + {file = "fonttools-4.55.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d637e4d33e46619c79d1a6c725f74d71b574cd15fb5bbb9b6f3eba8f28363573"}, + {file = "fonttools-4.55.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0f38bfb6b7a39c4162c3eb0820a0bdf8e3bdd125cd54e10ba242397d15e32439"}, + {file = "fonttools-4.55.8-cp311-cp311-win32.whl", hash = "sha256:acfec948de41cd5e640d5c15d0200e8b8e7c5c6bb82afe1ca095cbc4af1188ee"}, + {file = "fonttools-4.55.8-cp311-cp311-win_amd64.whl", hash = "sha256:604c805b41241b4880e2dc86cf2d4754c06777371c8299799ac88d836cb18c3b"}, + {file = "fonttools-4.55.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63403ee0f2fa4e1de28e539f8c24f2bdca1d8ecb503fa9ea2d231d9f1e729809"}, + {file = "fonttools-4.55.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:302e1003a760b222f711d5ba6d1ad7fd5f7f713eb872cd6a3eb44390bc9770af"}, + {file = "fonttools-4.55.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e72a7816ff8a759be9ca36ca46934f8ccf4383711ef597d9240306fe1878cb8d"}, + {file = "fonttools-4.55.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03c2b50b54e6e8b3564b232e57e8f58be217cf441cf0155745d9e44a76f9c30f"}, + {file = "fonttools-4.55.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7230f7590f9570d26ee903b6a4540274494e200fae978df0d9325b7b9144529"}, + {file = "fonttools-4.55.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:466a78984f0572305c3c48377f4e3f7f4e909f1209f45ef8e7041d5c8a744a56"}, + {file = "fonttools-4.55.8-cp312-cp312-win32.whl", hash = "sha256:243cbfc0b7cb1c307af40e321f8343a48d0a080bc1f9466cf2b5468f776ef108"}, + {file = "fonttools-4.55.8-cp312-cp312-win_amd64.whl", hash = "sha256:a19059aa892676822c1f05cb5a67296ecdfeb267fe7c47d4758f3e8e942c2b2a"}, + {file = "fonttools-4.55.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:332883b6280b9d90d2ba7e9e81be77cf2ace696161e60cdcf40cfcd2b3ed06fa"}, + {file = "fonttools-4.55.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6b8d7c149d47b47de7ec81763396c8266e5ebe2e0b14aa9c3ccf29e52260ab2f"}, + {file = "fonttools-4.55.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dfae7c94987149bdaa0388e6c937566aa398fa0eec973b17952350a069cff4e"}, + {file = "fonttools-4.55.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0fe12f06169af2fdc642d26a8df53e40adc3beedbd6ffedb19f1c5397b63afd"}, + {file = "fonttools-4.55.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f971aa5f50c22dc4b63a891503624ae2c77330429b34ead32f23c2260c5618cd"}, + {file = "fonttools-4.55.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:708cb17b2590b7f6c6854999df0039ff1140dda9e6f56d67c3599ba6f968fab5"}, + {file = "fonttools-4.55.8-cp313-cp313-win32.whl", hash = "sha256:cfe9cf30f391a0f2875247a3e5e44d8dcb61596e5cf89b360cdffec8a80e9961"}, + {file = "fonttools-4.55.8-cp313-cp313-win_amd64.whl", hash = "sha256:1e10efc8ee10d6f1fe2931d41bccc90cd4b872f2ee4ff21f2231a2c293b2dbf8"}, + {file = "fonttools-4.55.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9b6fcff4dc755b32faff955d989ee26394ddad3a90ea7d558db17a4633c8390c"}, + {file = "fonttools-4.55.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:02c41322e5bdcb484b61b776fcea150215c83619b39c96aa0b44d4fd87bb5574"}, + {file = "fonttools-4.55.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9164f44add0acec0f12fce682824c040dc52e483bfe3838c37142897150c8364"}, + {file = "fonttools-4.55.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2248ebfbcea0d0b3cb459d76a9f67f2eadc10ec0d07e9cadab8777d3f016bf2"}, + {file = "fonttools-4.55.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3461347016c94cb42b36caa907e11565878c4c2c375604f3651d11dc06d1ab3e"}, + {file = "fonttools-4.55.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:67df1c3935838fb9e56f227d7f506c9043b149a4a3b667bef17929c7a1114d19"}, + {file = "fonttools-4.55.8-cp38-cp38-win32.whl", hash = "sha256:cb121d6dd34625cece32234a5fa0359475bb118838b6b4295ffdb13b935edb04"}, + {file = "fonttools-4.55.8-cp38-cp38-win_amd64.whl", hash = "sha256:285c1ac10c160fbdff6d05358230e66c4f98cbbf271f3ec7eb34e967771543e8"}, + {file = "fonttools-4.55.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8abd135e427d88e461a4833c03cf96cfb9028c78c15d58123291f22398e25492"}, + {file = "fonttools-4.55.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:65cb8f97eed7906dcf19bc2736b70c6239e9d7e77aad7c6110ba7239ae082e81"}, + {file = "fonttools-4.55.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450c354c04a6e12a3db968e915fe05730f79ff3d39560947ef8ee6eaa2ab2212"}, + {file = "fonttools-4.55.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2232012a1502b2b8ab4c6bc1d3524bfe90238c0c1a50ac94a0a2085aa87a58a5"}, + {file = "fonttools-4.55.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d39f0c977639be0f9f5505d4c7c478236737f960c567a35f058649c056e41434"}, + {file = "fonttools-4.55.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:de78d6d0dbe32561ce059265437021f4746e56073c4799f0f1095828ae7232bd"}, + {file = "fonttools-4.55.8-cp39-cp39-win32.whl", hash = "sha256:bf4b5b3496ddfdd4e57112e77ec51f1ab388d35ac17322c1248addb2eb0d429a"}, + {file = "fonttools-4.55.8-cp39-cp39-win_amd64.whl", hash = "sha256:ccf8ae02918f431953d338db4d0a675a395faf82bab3a76025582cf32a2f3b7b"}, + {file = "fonttools-4.55.8-py3-none-any.whl", hash = "sha256:07636dae94f7fe88561f9da7a46b13d8e3f529f87fdb221b11d85f91eabceeb7"}, + {file = "fonttools-4.55.8.tar.gz", hash = "sha256:54d481d456dcd59af25d4a9c56b2c4c3f20e9620b261b84144e5950f33e8df17"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + [[package]] name = "grpc-interceptor" version = "0.15.4" @@ -398,39 +741,106 @@ files = [ license = ["ukkonen"] [[package]] -name = "importlib-metadata" -version = "8.5.0" -description = "Read metadata from Python packages" +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, - {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] -zipp = ">=3.20" +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" +name = "ipython" +version = "8.32.0" +description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "ipython-8.32.0-py3-none-any.whl", hash = "sha256:cae85b0c61eff1fc48b0a8002de5958b6528fa9c8defb1894da63f42613708aa"}, + {file = "ipython-8.32.0.tar.gz", hash = "sha256:be2c91895b0b9ea7ba49d33b23e2040c352b33eb6a519cca7ce6e0c743444251"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + [[package]] name = "jinja2" version = "3.1.4" @@ -448,6 +858,137 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.10" +files = [ + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, + {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -518,6 +1059,88 @@ files = [ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] +[[package]] +name = "matplotlib" +version = "3.10.0" +description = "Python plotting package" +optional = false +python-versions = ">=3.10" +files = [ + {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, + {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6"}, + {file = "matplotlib-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1"}, + {file = "matplotlib-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683"}, + {file = "matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765"}, + {file = "matplotlib-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8"}, + {file = "matplotlib-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12"}, + {file = "matplotlib-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf"}, + {file = "matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae"}, + {file = "matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e"}, + {file = "matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede"}, + {file = "matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef"}, + {file = "matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + [[package]] name = "nodeenv" version = "1.9.1" @@ -585,6 +1208,107 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "pandas" +version = "2.2.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + [[package]] name = "pdoc" version = "14.7.0" @@ -604,6 +1328,20 @@ pygments = ">=2.12.0" [package.extras] dev = ["hypothesis", "mypy", "pdoc-pyo3-sample-library (==1.0.11)", "pygments (>=2.14.0)", "pytest", "pytest-cov", "pytest-timeout", "ruff", "tox", "types-pygments"] +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "pillow" version = "11.0.0" @@ -745,6 +1483,20 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "prompt-toolkit" +version = "3.0.50" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, + {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "protobuf" version = "5.29.1" @@ -765,6 +1517,61 @@ files = [ {file = "protobuf-5.29.1.tar.gz", hash = "sha256:683be02ca21a6ffe80db6dd02c0b5b2892322c59ca57fd6c872d652cb80549cb"}, ] +[[package]] +name = "psutil" +version = "6.1.1" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"}, + {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"}, + {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, + {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"}, + {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"}, + {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, + {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, + {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, +] + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "pyarrow" version = "18.1.0" @@ -819,6 +1626,17 @@ files = [ [package.extras] test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + [[package]] name = "pygments" version = "2.18.0" @@ -833,6 +1651,20 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyparsing" +version = "3.2.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pyright" version = "1.1.390" @@ -905,9 +1737,60 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} pytest = "*" +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2025.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, + {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, +] + +[[package]] +name = "pywin32" +version = "308" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -970,6 +1853,127 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "pyzmq" +version = "26.2.1" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.2.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:f39d1227e8256d19899d953e6e19ed2ccb689102e6d85e024da5acf410f301eb"}, + {file = "pyzmq-26.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a23948554c692df95daed595fdd3b76b420a4939d7a8a28d6d7dea9711878641"}, + {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95f5728b367a042df146cec4340d75359ec6237beebf4a8f5cf74657c65b9257"}, + {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95f7b01b3f275504011cf4cf21c6b885c8d627ce0867a7e83af1382ebab7b3ff"}, + {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80a00370a2ef2159c310e662c7c0f2d030f437f35f478bb8b2f70abd07e26b24"}, + {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:8531ed35dfd1dd2af95f5d02afd6545e8650eedbf8c3d244a554cf47d8924459"}, + {file = "pyzmq-26.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cdb69710e462a38e6039cf17259d328f86383a06c20482cc154327968712273c"}, + {file = "pyzmq-26.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e7eeaef81530d0b74ad0d29eec9997f1c9230c2f27242b8d17e0ee67662c8f6e"}, + {file = "pyzmq-26.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:361edfa350e3be1f987e592e834594422338d7174364763b7d3de5b0995b16f3"}, + {file = "pyzmq-26.2.1-cp310-cp310-win32.whl", hash = "sha256:637536c07d2fb6a354988b2dd1d00d02eb5dd443f4bbee021ba30881af1c28aa"}, + {file = "pyzmq-26.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:45fad32448fd214fbe60030aa92f97e64a7140b624290834cc9b27b3a11f9473"}, + {file = "pyzmq-26.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:d9da0289d8201c8a29fd158aaa0dfe2f2e14a181fd45e2dc1fbf969a62c1d594"}, + {file = "pyzmq-26.2.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:c059883840e634a21c5b31d9b9a0e2b48f991b94d60a811092bc37992715146a"}, + {file = "pyzmq-26.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed038a921df836d2f538e509a59cb638df3e70ca0fcd70d0bf389dfcdf784d2a"}, + {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9027a7fcf690f1a3635dc9e55e38a0d6602dbbc0548935d08d46d2e7ec91f454"}, + {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d75fcb00a1537f8b0c0bb05322bc7e35966148ffc3e0362f0369e44a4a1de99"}, + {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0019cc804ac667fb8c8eaecdb66e6d4a68acf2e155d5c7d6381a5645bd93ae4"}, + {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f19dae58b616ac56b96f2e2290f2d18730a898a171f447f491cc059b073ca1fa"}, + {file = "pyzmq-26.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f5eeeb82feec1fc5cbafa5ee9022e87ffdb3a8c48afa035b356fcd20fc7f533f"}, + {file = "pyzmq-26.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:000760e374d6f9d1a3478a42ed0c98604de68c9e94507e5452951e598ebecfba"}, + {file = "pyzmq-26.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:817fcd3344d2a0b28622722b98500ae9c8bfee0f825b8450932ff19c0b15bebd"}, + {file = "pyzmq-26.2.1-cp311-cp311-win32.whl", hash = "sha256:88812b3b257f80444a986b3596e5ea5c4d4ed4276d2b85c153a6fbc5ca457ae7"}, + {file = "pyzmq-26.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:ef29630fde6022471d287c15c0a2484aba188adbfb978702624ba7a54ddfa6c1"}, + {file = "pyzmq-26.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:f32718ee37c07932cc336096dc7403525301fd626349b6eff8470fe0f996d8d7"}, + {file = "pyzmq-26.2.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:a6549ecb0041dafa55b5932dcbb6c68293e0bd5980b5b99f5ebb05f9a3b8a8f3"}, + {file = "pyzmq-26.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0250c94561f388db51fd0213cdccbd0b9ef50fd3c57ce1ac937bf3034d92d72e"}, + {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ee4297d9e4b34b5dc1dd7ab5d5ea2cbba8511517ef44104d2915a917a56dc8"}, + {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2a9cb17fd83b7a3a3009901aca828feaf20aa2451a8a487b035455a86549c09"}, + {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786dd8a81b969c2081b31b17b326d3a499ddd1856e06d6d79ad41011a25148da"}, + {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2d88ba221a07fc2c5581565f1d0fe8038c15711ae79b80d9462e080a1ac30435"}, + {file = "pyzmq-26.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c84c1297ff9f1cd2440da4d57237cb74be21fdfe7d01a10810acba04e79371a"}, + {file = "pyzmq-26.2.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46d4ebafc27081a7f73a0f151d0c38d4291656aa134344ec1f3d0199ebfbb6d4"}, + {file = "pyzmq-26.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:91e2bfb8e9a29f709d51b208dd5f441dc98eb412c8fe75c24ea464734ccdb48e"}, + {file = "pyzmq-26.2.1-cp312-cp312-win32.whl", hash = "sha256:4a98898fdce380c51cc3e38ebc9aa33ae1e078193f4dc641c047f88b8c690c9a"}, + {file = "pyzmq-26.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0741edbd0adfe5f30bba6c5223b78c131b5aa4a00a223d631e5ef36e26e6d13"}, + {file = "pyzmq-26.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:e5e33b1491555843ba98d5209439500556ef55b6ab635f3a01148545498355e5"}, + {file = "pyzmq-26.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:099b56ef464bc355b14381f13355542e452619abb4c1e57a534b15a106bf8e23"}, + {file = "pyzmq-26.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:651726f37fcbce9f8dd2a6dab0f024807929780621890a4dc0c75432636871be"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57dd4d91b38fa4348e237a9388b4423b24ce9c1695bbd4ba5a3eada491e09399"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d51a7bfe01a48e1064131f3416a5439872c533d756396be2b39e3977b41430f9"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7154d228502e18f30f150b7ce94f0789d6b689f75261b623f0fdc1eec642aab"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f1f31661a80cc46aba381bed475a9135b213ba23ca7ff6797251af31510920ce"}, + {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:290c96f479504439b6129a94cefd67a174b68ace8a8e3f551b2239a64cfa131a"}, + {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f2c307fbe86e18ab3c885b7e01de942145f539165c3360e2af0f094dd440acd9"}, + {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b314268e716487bfb86fcd6f84ebbe3e5bec5fac75fdf42bc7d90fdb33f618ad"}, + {file = "pyzmq-26.2.1-cp313-cp313-win32.whl", hash = "sha256:edb550616f567cd5603b53bb52a5f842c0171b78852e6fc7e392b02c2a1504bb"}, + {file = "pyzmq-26.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:100a826a029c8ef3d77a1d4c97cbd6e867057b5806a7276f2bac1179f893d3bf"}, + {file = "pyzmq-26.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:6991ee6c43e0480deb1b45d0c7c2bac124a6540cba7db4c36345e8e092da47ce"}, + {file = "pyzmq-26.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:25e720dba5b3a3bb2ad0ad5d33440babd1b03438a7a5220511d0c8fa677e102e"}, + {file = "pyzmq-26.2.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:9ec6abfb701437142ce9544bd6a236addaf803a32628d2260eb3dbd9a60e2891"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e1eb9d2bfdf5b4e21165b553a81b2c3bd5be06eeddcc4e08e9692156d21f1f6"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90dc731d8e3e91bcd456aa7407d2eba7ac6f7860e89f3766baabb521f2c1de4a"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6a93d684278ad865fc0b9e89fe33f6ea72d36da0e842143891278ff7fd89c3"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c1bb37849e2294d519117dd99b613c5177934e5c04a5bb05dd573fa42026567e"}, + {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:632a09c6d8af17b678d84df442e9c3ad8e4949c109e48a72f805b22506c4afa7"}, + {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:fc409c18884eaf9ddde516d53af4f2db64a8bc7d81b1a0c274b8aa4e929958e8"}, + {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:17f88622b848805d3f6427ce1ad5a2aa3cf61f12a97e684dab2979802024d460"}, + {file = "pyzmq-26.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3ef584f13820d2629326fe20cc04069c21c5557d84c26e277cfa6235e523b10f"}, + {file = "pyzmq-26.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:160194d1034902937359c26ccfa4e276abffc94937e73add99d9471e9f555dd6"}, + {file = "pyzmq-26.2.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:574b285150afdbf0a0424dddf7ef9a0d183988eb8d22feacb7160f7515e032cb"}, + {file = "pyzmq-26.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44dba28c34ce527cf687156c81f82bf1e51f047838d5964f6840fd87dfecf9fe"}, + {file = "pyzmq-26.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9fbdb90b85c7624c304f72ec7854659a3bd901e1c0ffb2363163779181edeb68"}, + {file = "pyzmq-26.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a7ad34a2921e8f76716dc7205c9bf46a53817e22b9eec2e8a3e08ee4f4a72468"}, + {file = "pyzmq-26.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:866c12b7c90dd3a86983df7855c6f12f9407c8684db6aa3890fc8027462bda82"}, + {file = "pyzmq-26.2.1-cp37-cp37m-win32.whl", hash = "sha256:eeb37f65350d5c5870517f02f8bbb2ac0fbec7b416c0f4875219fef305a89a45"}, + {file = "pyzmq-26.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4eb3197f694dfb0ee6af29ef14a35f30ae94ff67c02076eef8125e2d98963cd0"}, + {file = "pyzmq-26.2.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:36d4e7307db7c847fe37413f333027d31c11d5e6b3bacbb5022661ac635942ba"}, + {file = "pyzmq-26.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1c6ae0e95d0a4b0cfe30f648a18e764352d5415279bdf34424decb33e79935b8"}, + {file = "pyzmq-26.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5b4fc44f5360784cc02392f14235049665caaf7c0fe0b04d313e763d3338e463"}, + {file = "pyzmq-26.2.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:51431f6b2750eb9b9d2b2952d3cc9b15d0215e1b8f37b7a3239744d9b487325d"}, + {file = "pyzmq-26.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdbc78ae2065042de48a65f1421b8af6b76a0386bb487b41955818c3c1ce7bed"}, + {file = "pyzmq-26.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d14f50d61a89b0925e4d97a0beba6053eb98c426c5815d949a43544f05a0c7ec"}, + {file = "pyzmq-26.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:004837cb958988c75d8042f5dac19a881f3d9b3b75b2f574055e22573745f841"}, + {file = "pyzmq-26.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b2007f28ce1b8acebdf4812c1aab997a22e57d6a73b5f318b708ef9bcabbe95"}, + {file = "pyzmq-26.2.1-cp38-cp38-win32.whl", hash = "sha256:269c14904da971cb5f013100d1aaedb27c0a246728c341d5d61ddd03f463f2f3"}, + {file = "pyzmq-26.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:31fff709fef3b991cfe7189d2cfe0c413a1d0e82800a182cfa0c2e3668cd450f"}, + {file = "pyzmq-26.2.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:a4bffcadfd40660f26d1b3315a6029fd4f8f5bf31a74160b151f5c577b2dc81b"}, + {file = "pyzmq-26.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e76ad4729c2f1cf74b6eb1bdd05f6aba6175999340bd51e6caee49a435a13bf5"}, + {file = "pyzmq-26.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8b0f5bab40a16e708e78a0c6ee2425d27e1a5d8135c7a203b4e977cee37eb4aa"}, + {file = "pyzmq-26.2.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8e47050412f0ad3a9b2287779758073cbf10e460d9f345002d4779e43bb0136"}, + {file = "pyzmq-26.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f18ce33f422d119b13c1363ed4cce245b342b2c5cbbb76753eabf6aa6f69c7d"}, + {file = "pyzmq-26.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ceb0d78b7ef106708a7e2c2914afe68efffc0051dc6a731b0dbacd8b4aee6d68"}, + {file = "pyzmq-26.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ebdd96bd637fd426d60e86a29ec14b8c1ab64b8d972f6a020baf08a30d1cf46"}, + {file = "pyzmq-26.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:03719e424150c6395b9513f53a5faadcc1ce4b92abdf68987f55900462ac7eec"}, + {file = "pyzmq-26.2.1-cp39-cp39-win32.whl", hash = "sha256:ef5479fac31df4b304e96400fc67ff08231873ee3537544aa08c30f9d22fce38"}, + {file = "pyzmq-26.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:f92a002462154c176dac63a8f1f6582ab56eb394ef4914d65a9417f5d9fde218"}, + {file = "pyzmq-26.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:1fd4b3efc6f62199886440d5e27dd3ccbcb98dfddf330e7396f1ff421bfbb3c2"}, + {file = "pyzmq-26.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:380816d298aed32b1a97b4973a4865ef3be402a2e760204509b52b6de79d755d"}, + {file = "pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97cbb368fd0debdbeb6ba5966aa28e9a1ae3396c7386d15569a6ca4be4572b99"}, + {file = "pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf7b5942c6b0dafcc2823ddd9154f419147e24f8df5b41ca8ea40a6db90615c"}, + {file = "pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fe6e28a8856aea808715f7a4fc11f682b9d29cac5d6262dd8fe4f98edc12d53"}, + {file = "pyzmq-26.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bd8fdee945b877aa3bffc6a5a8816deb048dab0544f9df3731ecd0e54d8c84c9"}, + {file = "pyzmq-26.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ee7152f32c88e0e1b5b17beb9f0e2b14454235795ef68c0c120b6d3d23d12833"}, + {file = "pyzmq-26.2.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:baa1da72aecf6a490b51fba7a51f1ce298a1e0e86d0daef8265c8f8f9848eb77"}, + {file = "pyzmq-26.2.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:49135bb327fca159262d8fd14aa1f4a919fe071b04ed08db4c7c37d2f0647162"}, + {file = "pyzmq-26.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bacc1a10c150d58e8a9ee2b2037a70f8d903107e0f0b6e079bf494f2d09c091"}, + {file = "pyzmq-26.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:09dac387ce62d69bec3f06d51610ca1d660e7849eb45f68e38e7f5cf1f49cbcb"}, + {file = "pyzmq-26.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70b3a46ecd9296e725ccafc17d732bfc3cdab850b54bd913f843a0a54dfb2c04"}, + {file = "pyzmq-26.2.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:59660e15c797a3b7a571c39f8e0b62a1f385f98ae277dfe95ca7eaf05b5a0f12"}, + {file = "pyzmq-26.2.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0f50db737d688e96ad2a083ad2b453e22865e7e19c7f17d17df416e91ddf67eb"}, + {file = "pyzmq-26.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a003200b6cd64e89b5725ff7e284a93ab24fd54bbac8b4fa46b1ed57be693c27"}, + {file = "pyzmq-26.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f9ba5def063243793dec6603ad1392f735255cbc7202a3a484c14f99ec290705"}, + {file = "pyzmq-26.2.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1238c2448c58b9c8d6565579393148414a42488a5f916b3f322742e561f6ae0d"}, + {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eddb3784aed95d07065bcf94d07e8c04024fdb6b2386f08c197dfe6b3528fda"}, + {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0f19c2097fffb1d5b07893d75c9ee693e9cbc809235cf3f2267f0ef6b015f24"}, + {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0995fd3530f2e89d6b69a2202e340bbada3191014352af978fa795cb7a446331"}, + {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7c6160fe513654e65665332740f63de29ce0d165e053c0c14a161fa60dd0da01"}, + {file = "pyzmq-26.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8ec8e3aea6146b761d6c57fcf8f81fcb19f187afecc19bf1701a48db9617a217"}, + {file = "pyzmq-26.2.1.tar.gz", hash = "sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + [[package]] name = "rerun-sdk" version = "0.20.3" @@ -1042,6 +2046,36 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "tomli" version = "2.2.1" @@ -1083,6 +2117,41 @@ files = [ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] +[[package]] +name = "tornado" +version = "6.4.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1094,6 +2163,17 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "tzdata" +version = "2025.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, + {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, +] + [[package]] name = "virtualenv" version = "20.28.0" @@ -1115,25 +2195,17 @@ docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "s test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] -name = "zipp" -version = "3.21.0" -description = "Backport of pathlib-compatible object wrapper for zip files" +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" optional = false -python-versions = ">=3.9" +python-versions = "*" files = [ - {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, - {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] -type = ["pytest-mypy"] - [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.13" -content-hash = "11551d3ce02fd34cb007a08c1b55521fbf23dd3e586816a60ecc849e87bfbc63" +python-versions = ">=3.10,<3.13" +content-hash = "089ad7bd173263d7331956eb8d998d97f61347de611ce4b549d9152114922e1e" diff --git a/python/pyproject.toml b/python/pyproject.toml index ea42e1f..fe59b49 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -14,7 +14,7 @@ repository = "https://github.com/cake-lab/ARFlow" "Video" = "https://youtu.be/mml8YrCgfTk" [tool.poetry.dependencies] -python = ">=3.9,<3.13" +python = ">=3.10,<3.13" rerun-sdk = "^0.20.3" grpcio = "^1.60.1" grpcio-tools = "^1.60.1" @@ -33,6 +33,11 @@ grpc-stubs = "^1.53.0.5" [tool.poetry.group.docs.dependencies] pdoc = "^14.6.1" +[tool.poetry.group.evals.dependencies] +ipykernel = "^6.29.5" +matplotlib = "^3.10.0" +pandas = "^2.2.3" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" @@ -49,6 +54,7 @@ extend-exclude = [ ] [tool.ruff.lint] +exclude = ["*.ipynb"] # https://github.com/astral-sh/ruff-vscode/blob/main/README.md#configuring-vs-code extend-select = ["I"] # Enable all `pydocstyle` rules, limiting to those that adhere to the From 920193e57203f2695e52f890079f2f0923cd3b8f Mon Sep 17 00:00:00 2001 From: felixngfender Date: Thu, 13 Feb 2025 20:14:35 -0500 Subject: [PATCH 12/21] chore(benchmarks): simple empty frames bench --- python/benchmarks/BENCHMARKING.md | 4 +++- python/benchmarks/bench.sh | 2 -- python/benchmarks/generate_payload.py | 23 +++++++++++++++---- .../scenarios/complex_proto/payload | 2 +- .../benchmarks/scenarios/empty_frames/payload | 1 + python/benchmarks/setup_scenario.sh | 4 ++-- 6 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 python/benchmarks/scenarios/empty_frames/payload diff --git a/python/benchmarks/BENCHMARKING.md b/python/benchmarks/BENCHMARKING.md index 719c1f2..d57ca31 100644 --- a/python/benchmarks/BENCHMARKING.md +++ b/python/benchmarks/BENCHMARKING.md @@ -1,6 +1,8 @@ Taken from . Instructions to run are in their README. +Simple start: + ```shell -poetry run ./generate_payload.py +./bench.sh ``` diff --git a/python/benchmarks/bench.sh b/python/benchmarks/bench.sh index fb998b0..60a5750 100755 --- a/python/benchmarks/bench.sh +++ b/python/benchmarks/bench.sh @@ -85,8 +85,6 @@ fi echo "Sending frames to session: ${session_id}" -# replace SESSION_ID_PLACEHOLDER in payload - # Warm up the service if [[ "${GRPC_BENCHMARK_WARMUP}" != "0s" ]]; then echo -n "Warming up the service for ${GRPC_BENCHMARK_WARMUP}... " diff --git a/python/benchmarks/generate_payload.py b/python/benchmarks/generate_payload.py index 2a31c9f..3c76486 100755 --- a/python/benchmarks/generate_payload.py +++ b/python/benchmarks/generate_payload.py @@ -2,20 +2,35 @@ # ruff:noqa: D100, D101, D103 +import argparse from pathlib import Path from google.protobuf.json_format import MessageToJson from cakelab.arflow_grpc.v1.ar_frame_pb2 import ARFrame -from cakelab.arflow_grpc.v1.create_session_request_pb2 import CreateSessionRequest from cakelab.arflow_grpc.v1.device_pb2 import Device from cakelab.arflow_grpc.v1.save_ar_frames_request_pb2 import SaveARFramesRequest -from cakelab.arflow_grpc.v1.session_pb2 import SessionMetadata, SessionUuid +from cakelab.arflow_grpc.v1.session_pb2 import SessionUuid SCENARIOS_DIR = "scenarios" def main() -> None: + # list out directories in scenarios + scenarios = [str(d) for d in Path(SCENARIOS_DIR).iterdir() if d.is_dir()] + parser = argparse.ArgumentParser(description="Generate payload for AR frames.") + parser.add_argument( + "--scenario", required=True, choices=scenarios, help="Scenario name" + ) + parser.add_argument( + "--session-id", + required=True, + type=str, + help="Session ID to replace placeholder", + ) + parser.add_argument("-o", "--output", required=True, help="Output file path") + args = parser.parse_args() + device = Device( model="iPhone 12", name="iPhone 12", @@ -23,14 +38,14 @@ def main() -> None: uid="f3131490-dddd-419a-8504-fa8bb55282b2", ) message = SaveARFramesRequest( - session_id=SessionUuid(value="SESSION_ID_PLACEHOLDER"), + session_id=SessionUuid(value=args.session_id), device=device, frames=[ARFrame(), ARFrame()], ) message_as_json = MessageToJson( message=message, preserving_proto_field_name=True, indent=None ) - with open(Path(SCENARIOS_DIR, "complex_proto", "payload"), "w") as f: + with open(args.output, "w") as f: f.write(message_as_json) # message = CreateSessionRequest( diff --git a/python/benchmarks/scenarios/complex_proto/payload b/python/benchmarks/scenarios/complex_proto/payload index d2038d0..079f3d8 100644 --- a/python/benchmarks/scenarios/complex_proto/payload +++ b/python/benchmarks/scenarios/complex_proto/payload @@ -1 +1 @@ -{"session_id": {"value": "SESSION_ID_PLACEHOLDER"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{}, {}]} \ No newline at end of file +{"session_id": {"value": "d3411542-dc5c-4816-b10d-134478ad5b53"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{}, {}]} \ No newline at end of file diff --git a/python/benchmarks/scenarios/empty_frames/payload b/python/benchmarks/scenarios/empty_frames/payload new file mode 100644 index 0000000..79d747c --- /dev/null +++ b/python/benchmarks/scenarios/empty_frames/payload @@ -0,0 +1 @@ +{"session_id": {"value": "df3dc4e3-5f77-49a1-8036-0528059daaf8"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{}, {}]} \ No newline at end of file diff --git a/python/benchmarks/setup_scenario.sh b/python/benchmarks/setup_scenario.sh index 2a55e09..bbccc47 100755 --- a/python/benchmarks/setup_scenario.sh +++ b/python/benchmarks/setup_scenario.sh @@ -1,5 +1,6 @@ #!/usr/bin/env sh +SCENARIOS_DIR="scenarios" SCENARIO=$1 COPY_PAYLOAD=$2 SESSION_ID=$3 @@ -7,7 +8,6 @@ SESSION_ID=$3 if ${COPY_PAYLOAD}; then rm -rf payload mkdir -p payload + poetry run ./generate_payload.py --scenario="${SCENARIOS_DIR}/${SCENARIO}" --session-id="${SESSION_ID}" -o scenarios/"${SCENARIO}"/payload cp scenarios/"${SCENARIO}"/payload payload/payload - # replace SESSION_ID_PLACEHOLDER in payload - sed -i "s/SESSION_ID_PLACEHOLDER/${SESSION_ID}/g" payload/payload fi From c7ed5c628c5266d4e3f9aa7824c6ac1102a0a7f0 Mon Sep 17 00:00:00 2001 From: felixngfender Date: Thu, 13 Feb 2025 22:50:41 -0500 Subject: [PATCH 13/21] chore(benchmarks): wip for light, medium, heavy, and mixed load --- python/benchmarks/BENCHMARKING.md | 18 +++ python/benchmarks/bench.sh | 2 +- python/benchmarks/build.sh | 2 +- python/benchmarks/generate_ci.sh | 2 +- python/benchmarks/generate_payload.py | 150 +++++++++++++++++- .../scenarios/complex_proto/payload | 1 - .../benchmarks/scenarios/empty_frames/payload | 1 - python/benchmarks/scenarios/light/payload | 1 + python/benchmarks/scenarios/medium/payload | 1 + python/benchmarks/scenarios/mixed/payload | 0 python/benchmarks/setup_scenario.sh | 3 +- 11 files changed, 166 insertions(+), 15 deletions(-) delete mode 100644 python/benchmarks/scenarios/complex_proto/payload delete mode 100644 python/benchmarks/scenarios/empty_frames/payload create mode 100644 python/benchmarks/scenarios/light/payload create mode 100644 python/benchmarks/scenarios/medium/payload create mode 100644 python/benchmarks/scenarios/mixed/payload diff --git a/python/benchmarks/BENCHMARKING.md b/python/benchmarks/BENCHMARKING.md index d57ca31..aad838a 100644 --- a/python/benchmarks/BENCHMARKING.md +++ b/python/benchmarks/BENCHMARKING.md @@ -1,8 +1,26 @@ +# Benchmarking ARFlow + Taken from . Instructions to run are in their README. Simple start: ```shell +./build.sh + ./bench.sh ``` + +Default scenario is `mixed`. Can change this with `GRPC_REQUEST_SCENARIO` env +var. + +Additionally, our evaluation also suggests the data batching design can +significantly improve system throughput under high concurrent loads by ZZ% + +craft a representative, complex payload of data to benchmark. + +3 scenarios: light, medium, heavy, mixed load. the first 3 are homogeneous +batches of data meaning the AR frames passed in should be of one type only. With +mixed load, it's a round-robin between homogeneous frames which is +representative of the typical ARFlow client-server interaction. This round-robin +comes from `ghz`. See diff --git a/python/benchmarks/bench.sh b/python/benchmarks/bench.sh index 60a5750..50361e6 100755 --- a/python/benchmarks/bench.sh +++ b/python/benchmarks/bench.sh @@ -10,7 +10,7 @@ export GRPC_CLIENT_CONCURRENCY=${GRPC_CLIENT_CONCURRENCY:-"1000"} export GRPC_CLIENT_QPS=${GRPC_CLIENT_QPS:-"0"} export GRPC_CLIENT_QPS=$((GRPC_CLIENT_QPS / GRPC_CLIENT_CONCURRENCY)) export GRPC_CLIENT_CPUS=${GRPC_CLIENT_CPUS:-"1"} -export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"complex_proto"} +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"mixed"} export GRPC_IMAGE_NAME="${GRPC_IMAGE_NAME:-grpc_bench}" export GRPC_GHZ_TAG="${GRPC_GHZ_TAG:-0.114.0}" diff --git a/python/benchmarks/build.sh b/python/benchmarks/build.sh index 745c42d..7c011cd 100755 --- a/python/benchmarks/build.sh +++ b/python/benchmarks/build.sh @@ -2,7 +2,7 @@ # TODO: use this ./generate_ci.sh >.github/workflows/build.yml -export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"complex_proto"} +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"mixed"} export GRPC_IMAGE_NAME="${GRPC_IMAGE_NAME:-grpc_bench}" # Setup the chosen scenario diff --git a/python/benchmarks/generate_ci.sh b/python/benchmarks/generate_ci.sh index 0fedbb8..d7862f9 100755 --- a/python/benchmarks/generate_ci.sh +++ b/python/benchmarks/generate_ci.sh @@ -3,7 +3,7 @@ set -eu set -o pipefail -export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"complex_proto"} +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"mixed"} cat < None: - # list out directories in scenarios - scenarios = [str(d) for d in Path(SCENARIOS_DIR).iterdir() if d.is_dir()] + scenarios = [ + str(d)[len(SCENARIOS_DIR) + 1 :] + for d in Path(SCENARIOS_DIR).iterdir() + if d.is_dir() + ] parser = argparse.ArgumentParser(description="Generate payload for AR frames.") parser.add_argument( - "--scenario", required=True, choices=scenarios, help="Scenario name" + "--session-id", + required=True, + type=str, + help="Session ID to send frames to", ) parser.add_argument( - "--session-id", + "--scenario", required=True, type=str, - help="Session ID to replace placeholder", + choices=scenarios, + help="Scenario to generate payload", ) - parser.add_argument("-o", "--output", required=True, help="Output file path") args = parser.parse_args() + frames = [] + if "light" in args.scenario: + # transform sampling interval is 50ms so 20Hz, default send interval is + # 0.5s, so each time we send 10 transform frames + frames = [ + ARFrame( + # transform_frame=TransformFrame( + # device_timestamp=Timestamp(seconds=i, nanos=0), + # data=np.random.rand(12).astype(np.float32).tobytes(), + # ), + # gyroscope_frame=GyroscopeFrame( + # device_timestamp=Timestamp(seconds=i, nanos=0), + # attitude=Quaternion(x=1.0, y=2.0, z=3.0, w=4.0), + # rotation_rate=Vector3(x=1.0, y=2.0, z=3.0), + # gravity=Vector3(x=1.0, y=2.0, z=3.0), + # acceleration=Vector3(x=1.0, y=2.0, z=3.0), + # ), + audio_frame=AudioFrame( + device_timestamp=Timestamp(seconds=i, nanos=0), + data=np.random.rand(4).astype(np.float32).tobytes(), + ) + ) + # TODO: Interesting: different frame lengths yield very + # different results + for i in range(100) + ] + elif "medium" == args.scenario: + # 60fps camera with default 0.5s send interval gives us 30 depth frames + # per request + frames = [ + ARFrame( + depth_frame=DepthFrame( + device_timestamp=Timestamp(seconds=i, nanos=0), + environment_depth_temporal_smoothing_enabled=True, + image=XRCpuImage( + dimensions=Vector2Int(x=4, y=4), + format=XRCpuImage.FORMAT_DEPTHUINT16, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 255, (4, 4), dtype=np.uint16 + ).tobytes(), + ) + ], + ), + ), + ) + for i in range(30) + ] + elif "heavy" == args.scenario: + # same here, 30 color frames per request + # TODO: This does not work yet, because of the extra padding on Android + # assumption we make on the server. + frames = [ + ARFrame( + color_frame=ColorFrame( + device_timestamp=Timestamp(seconds=i, nanos=0), + image=XRCpuImage( + dimensions=Vector2Int(x=4, y=4), + format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 255, (4, 4), dtype=np.uint8 + ).tobytes(), + pixel_stride=1, + row_stride=4, + ), + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 255, (2, 4), dtype=np.uint8 + ).tobytes(), + pixel_stride=2, + row_stride=4, + ), + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 255, (2, 4), dtype=np.uint8 + ).tobytes(), + pixel_stride=2, + row_stride=4, + ), + ], + ), + intrinsics=Intrinsics( + focal_length=Vector2( + x=1.0, + y=1.0, + ), + principal_point=Vector2( + x=1.0, + y=1.0, + ), + resolution=Vector2Int( + x=4, + y=4, + ), + ), + ) + ) + for i in range(30) + ] + elif "mixed" == args.scenario: + frames = [] + else: + raise ValueError(f"Invalid scenario: {args.scenario}") + device = Device( model="iPhone 12", name="iPhone 12", @@ -40,12 +173,13 @@ def main() -> None: message = SaveARFramesRequest( session_id=SessionUuid(value=args.session_id), device=device, - frames=[ARFrame(), ARFrame()], + frames=frames, ) message_as_json = MessageToJson( message=message, preserving_proto_field_name=True, indent=None ) - with open(args.output, "w") as f: + os.makedirs(args.scenario, exist_ok=True) + with open(f"{SCENARIOS_DIR}/{args.scenario}/payload", "w") as f: f.write(message_as_json) # message = CreateSessionRequest( diff --git a/python/benchmarks/scenarios/complex_proto/payload b/python/benchmarks/scenarios/complex_proto/payload deleted file mode 100644 index 079f3d8..0000000 --- a/python/benchmarks/scenarios/complex_proto/payload +++ /dev/null @@ -1 +0,0 @@ -{"session_id": {"value": "d3411542-dc5c-4816-b10d-134478ad5b53"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{}, {}]} \ No newline at end of file diff --git a/python/benchmarks/scenarios/empty_frames/payload b/python/benchmarks/scenarios/empty_frames/payload deleted file mode 100644 index 79d747c..0000000 --- a/python/benchmarks/scenarios/empty_frames/payload +++ /dev/null @@ -1 +0,0 @@ -{"session_id": {"value": "df3dc4e3-5f77-49a1-8036-0528059daaf8"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{}, {}]} \ No newline at end of file diff --git a/python/benchmarks/scenarios/light/payload b/python/benchmarks/scenarios/light/payload new file mode 100644 index 0000000..05c6c50 --- /dev/null +++ b/python/benchmarks/scenarios/light/payload @@ -0,0 +1 @@ +{"session_id": {"value": "86e2f561-70eb-42e2-abc0-6ef70ddcb8fc"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{"audio_frame": {"device_timestamp": "1970-01-01T00:00:00Z", "data": [160.0, 46.0, 201.0, 61.0, 78.0, 33.0, 177.0, 62.0, 215.0, 147.0, 107.0, 63.0, 93.0, 228.0, 105.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:01Z", "data": [143.0, 51.0, 41.0, 61.0, 173.0, 117.0, 60.0, 61.0, 9.0, 40.0, 130.0, 61.0, 170.0, 196.0, 38.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:02Z", "data": [140.0, 211.0, 227.0, 62.0, 31.0, 146.0, 44.0, 63.0, 15.0, 45.0, 216.0, 62.0, 243.0, 86.0, 72.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:03Z", "data": [117.0, 58.0, 28.0, 63.0, 105.0, 77.0, 1.0, 62.0, 74.0, 217.0, 117.0, 63.0, 12.0, 119.0, 200.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:04Z", "data": [242.0, 96.0, 123.0, 63.0, 205.0, 48.0, 85.0, 62.0, 7.0, 176.0, 47.0, 62.0, 135.0, 220.0, 232.0, 60.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:05Z", "data": [189.0, 213.0, 63.0, 63.0, 98.0, 174.0, 183.0, 62.0, 118.0, 203.0, 70.0, 63.0, 15.0, 183.0, 208.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:06Z", "data": [231.0, 100.0, 229.0, 60.0, 30.0, 109.0, 22.0, 63.0, 73.0, 115.0, 25.0, 62.0, 60.0, 124.0, 103.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:07Z", "data": [20.0, 61.0, 8.0, 63.0, 228.0, 119.0, 130.0, 62.0, 96.0, 115.0, 51.0, 63.0, 178.0, 85.0, 141.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:08Z", "data": [82.0, 179.0, 54.0, 63.0, 242.0, 208.0, 56.0, 63.0, 248.0, 118.0, 197.0, 61.0, 245.0, 81.0, 33.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:09Z", "data": [150.0, 114.0, 3.0, 63.0, 102.0, 5.0, 221.0, 62.0, 243.0, 90.0, 125.0, 63.0, 25.0, 249.0, 34.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:10Z", "data": [171.0, 194.0, 11.0, 63.0, 26.0, 150.0, 225.0, 62.0, 192.0, 207.0, 54.0, 62.0, 213.0, 74.0, 81.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:11Z", "data": [47.0, 244.0, 209.0, 61.0, 57.0, 145.0, 89.0, 63.0, 95.0, 32.0, 67.0, 63.0, 133.0, 219.0, 1.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:12Z", "data": [224.0, 229.0, 230.0, 62.0, 72.0, 59.0, 101.0, 63.0, 251.0, 221.0, 180.0, 62.0, 74.0, 204.0, 117.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:13Z", "data": [36.0, 130.0, 122.0, 62.0, 213.0, 223.0, 78.0, 63.0, 70.0, 191.0, 245.0, 62.0, 141.0, 163.0, 25.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:14Z", "data": [242.0, 88.0, 169.0, 60.0, 98.0, 26.0, 207.0, 60.0, 171.0, 19.0, 115.0, 63.0, 41.0, 21.0, 214.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:15Z", "data": [83.0, 159.0, 217.0, 62.0, 122.0, 6.0, 121.0, 63.0, 205.0, 61.0, 104.0, 63.0, 81.0, 204.0, 98.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:16Z", "data": [10.0, 147.0, 229.0, 60.0, 99.0, 126.0, 244.0, 62.0, 178.0, 252.0, 219.0, 62.0, 8.0, 17.0, 84.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:17Z", "data": [238.0, 177.0, 246.0, 61.0, 183.0, 114.0, 244.0, 62.0, 19.0, 197.0, 4.0, 61.0, 189.0, 15.0, 116.0, 60.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:18Z", "data": [215.0, 98.0, 159.0, 62.0, 8.0, 205.0, 108.0, 63.0, 72.0, 217.0, 99.0, 63.0, 153.0, 159.0, 9.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:19Z", "data": [208.0, 127.0, 27.0, 63.0, 121.0, 120.0, 191.0, 61.0, 180.0, 21.0, 241.0, 62.0, 105.0, 146.0, 213.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:20Z", "data": [52.0, 255.0, 58.0, 63.0, 214.0, 231.0, 89.0, 62.0, 70.0, 158.0, 108.0, 62.0, 46.0, 215.0, 54.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:21Z", "data": [3.0, 154.0, 42.0, 63.0, 216.0, 135.0, 208.0, 62.0, 227.0, 219.0, 42.0, 63.0, 242.0, 252.0, 152.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:22Z", "data": [216.0, 242.0, 108.0, 63.0, 228.0, 44.0, 93.0, 63.0, 47.0, 180.0, 6.0, 63.0, 183.0, 157.0, 233.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:23Z", "data": [99.0, 236.0, 224.0, 62.0, 253.0, 203.0, 104.0, 63.0, 125.0, 136.0, 197.0, 62.0, 98.0, 76.0, 225.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:24Z", "data": [158.0, 228.0, 214.0, 62.0, 28.0, 193.0, 124.0, 63.0, 172.0, 101.0, 3.0, 63.0, 157.0, 46.0, 21.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:25Z", "data": [17.0, 22.0, 13.0, 62.0, 146.0, 127.0, 5.0, 63.0, 148.0, 20.0, 125.0, 63.0, 172.0, 157.0, 110.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:26Z", "data": [178.0, 26.0, 23.0, 62.0, 135.0, 197.0, 61.0, 63.0, 247.0, 88.0, 157.0, 62.0, 201.0, 209.0, 170.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:27Z", "data": [12.0, 45.0, 63.0, 63.0, 110.0, 200.0, 94.0, 63.0, 17.0, 5.0, 31.0, 63.0, 121.0, 192.0, 154.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:28Z", "data": [31.0, 74.0, 20.0, 63.0, 109.0, 174.0, 117.0, 62.0, 11.0, 160.0, 117.0, 63.0, 9.0, 19.0, 231.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:29Z", "data": [36.0, 186.0, 168.0, 62.0, 162.0, 135.0, 74.0, 62.0, 41.0, 27.0, 87.0, 63.0, 41.0, 2.0, 43.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:30Z", "data": [48.0, 138.0, 121.0, 63.0, 174.0, 106.0, 121.0, 63.0, 212.0, 43.0, 85.0, 63.0, 136.0, 110.0, 57.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:31Z", "data": [51.0, 52.0, 250.0, 62.0, 53.0, 201.0, 60.0, 63.0, 134.0, 119.0, 89.0, 63.0, 77.0, 80.0, 104.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:32Z", "data": [141.0, 128.0, 19.0, 63.0, 51.0, 1.0, 33.0, 63.0, 74.0, 91.0, 116.0, 62.0, 255.0, 88.0, 80.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:33Z", "data": [41.0, 163.0, 159.0, 62.0, 13.0, 78.0, 4.0, 63.0, 205.0, 79.0, 158.0, 62.0, 203.0, 159.0, 125.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:34Z", "data": [176.0, 22.0, 82.0, 62.0, 152.0, 62.0, 85.0, 63.0, 183.0, 12.0, 31.0, 62.0, 247.0, 133.0, 227.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:35Z", "data": [18.0, 76.0, 180.0, 62.0, 21.0, 128.0, 109.0, 63.0, 3.0, 10.0, 30.0, 63.0, 13.0, 250.0, 42.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:36Z", "data": [173.0, 157.0, 33.0, 62.0, 27.0, 69.0, 222.0, 62.0, 121.0, 108.0, 58.0, 63.0, 220.0, 24.0, 249.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:37Z", "data": [53.0, 91.0, 242.0, 62.0, 233.0, 73.0, 177.0, 62.0, 76.0, 14.0, 222.0, 62.0, 228.0, 235.0, 161.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:38Z", "data": [107.0, 117.0, 4.0, 61.0, 174.0, 40.0, 20.0, 63.0, 121.0, 253.0, 106.0, 63.0, 196.0, 113.0, 7.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:39Z", "data": [173.0, 122.0, 207.0, 61.0, 193.0, 15.0, 31.0, 63.0, 121.0, 239.0, 62.0, 62.0, 51.0, 157.0, 118.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:40Z", "data": [157.0, 21.0, 200.0, 61.0, 28.0, 64.0, 168.0, 62.0, 230.0, 175.0, 27.0, 63.0, 183.0, 241.0, 101.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:41Z", "data": [159.0, 120.0, 42.0, 62.0, 208.0, 29.0, 121.0, 62.0, 142.0, 50.0, 195.0, 61.0, 71.0, 122.0, 33.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:42Z", "data": [225.0, 190.0, 107.0, 63.0, 158.0, 74.0, 72.0, 63.0, 70.0, 213.0, 111.0, 63.0, 97.0, 244.0, 24.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:43Z", "data": [64.0, 247.0, 155.0, 62.0, 94.0, 85.0, 72.0, 63.0, 117.0, 128.0, 190.0, 60.0, 208.0, 224.0, 86.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:44Z", "data": [31.0, 113.0, 69.0, 63.0, 232.0, 152.0, 92.0, 63.0, 35.0, 175.0, 1.0, 61.0, 60.0, 26.0, 71.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:45Z", "data": [42.0, 0.0, 138.0, 62.0, 222.0, 125.0, 67.0, 63.0, 159.0, 247.0, 160.0, 62.0, 223.0, 141.0, 235.0, 60.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:46Z", "data": [136.0, 138.0, 64.0, 63.0, 15.0, 37.0, 27.0, 63.0, 117.0, 155.0, 125.0, 63.0, 120.0, 88.0, 114.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:47Z", "data": [53.0, 51.0, 26.0, 63.0, 165.0, 143.0, 0.0, 63.0, 94.0, 74.0, 220.0, 62.0, 73.0, 225.0, 88.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:48Z", "data": [103.0, 170.0, 214.0, 62.0, 163.0, 89.0, 175.0, 61.0, 102.0, 23.0, 110.0, 63.0, 76.0, 168.0, 25.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:49Z", "data": [241.0, 70.0, 56.0, 63.0, 219.0, 61.0, 31.0, 61.0, 212.0, 229.0, 86.0, 63.0, 149.0, 218.0, 3.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:50Z", "data": [159.0, 198.0, 98.0, 61.0, 124.0, 21.0, 11.0, 63.0, 24.0, 106.0, 31.0, 63.0, 83.0, 2.0, 120.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:51Z", "data": [174.0, 235.0, 158.0, 62.0, 209.0, 206.0, 205.0, 61.0, 2.0, 116.0, 161.0, 62.0, 212.0, 221.0, 152.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:52Z", "data": [72.0, 61.0, 6.0, 63.0, 175.0, 223.0, 48.0, 62.0, 174.0, 23.0, 237.0, 62.0, 121.0, 218.0, 103.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:53Z", "data": [65.0, 46.0, 44.0, 62.0, 28.0, 20.0, 168.0, 62.0, 239.0, 194.0, 94.0, 63.0, 191.0, 93.0, 35.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:54Z", "data": [84.0, 251.0, 175.0, 62.0, 127.0, 12.0, 175.0, 59.0, 45.0, 13.0, 118.0, 63.0, 109.0, 143.0, 109.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:55Z", "data": [109.0, 126.0, 17.0, 63.0, 29.0, 145.0, 32.0, 61.0, 123.0, 160.0, 33.0, 63.0, 126.0, 145.0, 36.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:56Z", "data": [32.0, 63.0, 28.0, 63.0, 115.0, 222.0, 217.0, 62.0, 9.0, 76.0, 93.0, 62.0, 201.0, 245.0, 27.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:57Z", "data": [155.0, 21.0, 22.0, 61.0, 95.0, 47.0, 228.0, 61.0, 230.0, 205.0, 132.0, 62.0, 219.0, 60.0, 20.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:58Z", "data": [200.0, 108.0, 167.0, 61.0, 92.0, 202.0, 198.0, 61.0, 172.0, 28.0, 23.0, 63.0, 131.0, 214.0, 207.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:59Z", "data": [89.0, 206.0, 137.0, 61.0, 147.0, 240.0, 227.0, 61.0, 45.0, 100.0, 104.0, 63.0, 123.0, 236.0, 180.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:00Z", "data": [82.0, 180.0, 85.0, 63.0, 134.0, 193.0, 7.0, 63.0, 186.0, 150.0, 207.0, 62.0, 221.0, 34.0, 40.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:01Z", "data": [231.0, 31.0, 92.0, 63.0, 215.0, 189.0, 10.0, 63.0, 92.0, 238.0, 14.0, 62.0, 162.0, 146.0, 124.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:02Z", "data": [172.0, 107.0, 54.0, 63.0, 171.0, 220.0, 92.0, 62.0, 157.0, 18.0, 145.0, 62.0, 105.0, 247.0, 179.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:03Z", "data": [69.0, 136.0, 31.0, 62.0, 136.0, 80.0, 94.0, 62.0, 50.0, 159.0, 16.0, 60.0, 40.0, 79.0, 42.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:04Z", "data": [199.0, 34.0, 37.0, 63.0, 86.0, 237.0, 10.0, 63.0, 101.0, 48.0, 152.0, 61.0, 252.0, 228.0, 22.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:05Z", "data": [208.0, 242.0, 149.0, 62.0, 122.0, 230.0, 189.0, 61.0, 141.0, 7.0, 235.0, 62.0, 175.0, 123.0, 88.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:06Z", "data": [190.0, 231.0, 78.0, 59.0, 0.0, 149.0, 95.0, 63.0, 37.0, 75.0, 47.0, 63.0, 152.0, 58.0, 97.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:07Z", "data": [65.0, 176.0, 104.0, 63.0, 65.0, 86.0, 72.0, 61.0, 216.0, 131.0, 138.0, 59.0, 159.0, 109.0, 59.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:08Z", "data": [245.0, 124.0, 22.0, 63.0, 9.0, 20.0, 223.0, 62.0, 164.0, 104.0, 202.0, 60.0, 70.0, 145.0, 76.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:09Z", "data": [66.0, 252.0, 111.0, 63.0, 224.0, 248.0, 164.0, 62.0, 171.0, 182.0, 110.0, 62.0, 64.0, 91.0, 88.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:10Z", "data": [148.0, 46.0, 245.0, 62.0, 34.0, 53.0, 21.0, 63.0, 7.0, 216.0, 92.0, 63.0, 64.0, 110.0, 16.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:11Z", "data": [231.0, 3.0, 130.0, 61.0, 120.0, 26.0, 62.0, 63.0, 33.0, 107.0, 239.0, 60.0, 213.0, 244.0, 215.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:12Z", "data": [17.0, 254.0, 119.0, 62.0, 38.0, 60.0, 100.0, 62.0, 52.0, 48.0, 64.0, 63.0, 41.0, 158.0, 100.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:13Z", "data": [18.0, 116.0, 124.0, 62.0, 36.0, 223.0, 121.0, 63.0, 116.0, 5.0, 70.0, 63.0, 78.0, 121.0, 251.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:14Z", "data": [33.0, 229.0, 12.0, 62.0, 94.0, 46.0, 49.0, 63.0, 107.0, 6.0, 97.0, 63.0, 106.0, 214.0, 132.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:15Z", "data": [38.0, 65.0, 47.0, 63.0, 80.0, 66.0, 0.0, 63.0, 162.0, 29.0, 62.0, 63.0, 0.0, 82.0, 77.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:16Z", "data": [40.0, 146.0, 6.0, 62.0, 37.0, 18.0, 10.0, 63.0, 107.0, 157.0, 65.0, 63.0, 100.0, 12.0, 14.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:17Z", "data": [137.0, 122.0, 48.0, 59.0, 106.0, 245.0, 189.0, 62.0, 184.0, 17.0, 236.0, 62.0, 0.0, 93.0, 29.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:18Z", "data": [227.0, 104.0, 189.0, 62.0, 28.0, 223.0, 152.0, 62.0, 130.0, 103.0, 239.0, 62.0, 146.0, 9.0, 59.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:19Z", "data": [124.0, 162.0, 1.0, 63.0, 224.0, 119.0, 112.0, 63.0, 54.0, 35.0, 211.0, 62.0, 190.0, 200.0, 23.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:20Z", "data": [109.0, 62.0, 60.0, 63.0, 145.0, 191.0, 65.0, 63.0, 26.0, 16.0, 88.0, 63.0, 135.0, 17.0, 98.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:21Z", "data": [42.0, 36.0, 142.0, 61.0, 37.0, 125.0, 224.0, 62.0, 205.0, 143.0, 141.0, 62.0, 137.0, 39.0, 6.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:22Z", "data": [235.0, 104.0, 56.0, 63.0, 74.0, 123.0, 50.0, 63.0, 254.0, 226.0, 67.0, 60.0, 99.0, 155.0, 207.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:23Z", "data": [79.0, 222.0, 61.0, 63.0, 94.0, 74.0, 171.0, 61.0, 219.0, 8.0, 70.0, 63.0, 138.0, 207.0, 26.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:24Z", "data": [15.0, 104.0, 104.0, 63.0, 39.0, 57.0, 17.0, 63.0, 169.0, 155.0, 78.0, 63.0, 217.0, 37.0, 14.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:25Z", "data": [189.0, 168.0, 41.0, 63.0, 203.0, 38.0, 46.0, 61.0, 240.0, 146.0, 89.0, 63.0, 216.0, 130.0, 168.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:26Z", "data": [103.0, 221.0, 236.0, 62.0, 41.0, 207.0, 5.0, 63.0, 119.0, 31.0, 169.0, 62.0, 36.0, 252.0, 23.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:27Z", "data": [162.0, 34.0, 211.0, 62.0, 223.0, 48.0, 116.0, 63.0, 213.0, 23.0, 107.0, 62.0, 107.0, 69.0, 119.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:28Z", "data": [205.0, 18.0, 140.0, 62.0, 56.0, 103.0, 64.0, 61.0, 232.0, 46.0, 173.0, 62.0, 46.0, 8.0, 84.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:29Z", "data": [211.0, 185.0, 89.0, 63.0, 52.0, 116.0, 43.0, 63.0, 19.0, 213.0, 124.0, 63.0, 55.0, 110.0, 15.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:30Z", "data": [138.0, 70.0, 221.0, 62.0, 234.0, 121.0, 40.0, 63.0, 136.0, 51.0, 66.0, 63.0, 95.0, 236.0, 125.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:31Z", "data": [191.0, 84.0, 19.0, 63.0, 107.0, 184.0, 184.0, 62.0, 65.0, 206.0, 31.0, 62.0, 0.0, 186.0, 160.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:32Z", "data": [35.0, 184.0, 77.0, 63.0, 109.0, 123.0, 198.0, 62.0, 50.0, 217.0, 102.0, 63.0, 158.0, 132.0, 135.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:33Z", "data": [242.0, 54.0, 169.0, 62.0, 190.0, 43.0, 23.0, 63.0, 14.0, 57.0, 171.0, 61.0, 162.0, 167.0, 94.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:34Z", "data": [147.0, 126.0, 63.0, 62.0, 148.0, 111.0, 16.0, 63.0, 88.0, 74.0, 245.0, 62.0, 189.0, 151.0, 49.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:35Z", "data": [66.0, 154.0, 5.0, 62.0, 96.0, 142.0, 90.0, 63.0, 253.0, 164.0, 23.0, 62.0, 204.0, 209.0, 229.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:36Z", "data": [121.0, 31.0, 63.0, 63.0, 133.0, 160.0, 96.0, 63.0, 84.0, 171.0, 129.0, 62.0, 20.0, 188.0, 77.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:37Z", "data": [72.0, 233.0, 166.0, 61.0, 200.0, 46.0, 41.0, 63.0, 43.0, 3.0, 68.0, 63.0, 32.0, 48.0, 23.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:38Z", "data": [30.0, 6.0, 122.0, 63.0, 180.0, 168.0, 76.0, 63.0, 254.0, 16.0, 19.0, 63.0, 175.0, 50.0, 49.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:39Z", "data": [160.0, 181.0, 85.0, 63.0, 219.0, 82.0, 25.0, 63.0, 77.0, 28.0, 115.0, 63.0, 180.0, 46.0, 219.0, 60.0]}}]} \ No newline at end of file diff --git a/python/benchmarks/scenarios/medium/payload b/python/benchmarks/scenarios/medium/payload new file mode 100644 index 0000000..ba1e689 --- /dev/null +++ b/python/benchmarks/scenarios/medium/payload @@ -0,0 +1 @@ +{"session_id": {"value": "c8c83696-607b-4090-b8ea-8886bfd4aea8"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{"depth_frame": {"device_timestamp": "1970-01-01T00:00:00Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "RQAdACUAxwBNAMYAxQCPAEcAeAD5AJMAAQDJAFgABgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:01Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "cADQADIA0QDPALkAPQAPADwAnAB0ANoAnADhAHYAMQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:02Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "swAEAKcAdwAJAOsABgBcANYA+gBsAGYAoAAiAEcA3AA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:03Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "+wDiAM0AeABLAGoAygCpABAAuwB3AMgALAD7APsAyQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:04Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "iQAGAAUAswBnAHAAPAC8ADAAZwDEABgA1wCJAEQAcgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:05Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "tQCqAFQAZAC2AGsAOwCcAN8AawBzAHcAhQDoAPoAXwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:06Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "4ABRAJQAIACVADUAywCDACkArQAaAFoA+gBjAIwAAwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:07Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "XwC3AGwA5ACIALYAKQDmAFUAwAA/AAIAHwC5AAQAyAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:08Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "EQAvABsA1ABtAMAA3wBcACEA0wBrAPYAFQDWAM8A/AA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:09Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "7QBpAN4A1ADBALwA1wAOAA8AgwBYAP4AhwA2AMsA3gA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:10Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "tAATAM4AVADtAKUAUADdADMAawBVAAgAOAAlAGsAkgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:11Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "BAD6ABoA7gANAHIA5QBiAOcAxAAzAMoAIQDHAGAA3wA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:12Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "EgCBAGwAWwBLAK8AFACqABsABgCTACwAQABVAIgAoQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:13Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "oQC7AKIAkACRAOoAgwCUAKsAAwB1ANAAoQCIAPkAPwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:14Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "2wAQAHgA1wBKAGIAFQCWAKAADADUAPUArgCIAFkAgQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:15Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "0ADfAAUAyQCHAP4ATQAdAEAAjwAXAFwA1AAcAA0AyQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:16Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "QgB6APYA9QDMACoApwBwAMIA1QAOACMAIQBYAKgAjAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:17Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "igCSAOUAEgDwAPgAYgCWAEcA7AAlADAAoQBIACEAaQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:18Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "nAByAHkAwgCdADUAaQDQAGYAdwCwAMwAIgCRADQAVAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:19Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "DgBwAPMAnQCmANkAOADyACgAPAD3APgAmQDyAIIAWQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:20Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "jABuAPQA3ABzABMAbwCaAEUAiAAqAEcAggBaAIAAKAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:21Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "nQCGAG4A3gBrAFYAJAAyAPoAGwBIAKMA2wDUABsA0QA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:22Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "gABBAOgArwCPAPsADQA0AMIAWAAyAJYAuAC5AHcAwgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:23Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "owA4AFMA6wDuAFgAGgBFAN0A6gAQAIkAHgBuADMAcwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:24Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "UQAHACYASgBoAPEAXACTAHkAcQC0AEIAyAD4ACQAgwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:25Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "IgAeADIApgAcACsAggCXADcALACfAF8AYQAxALsA8wA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:26Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "0AAsAHcAQQBfAKIAmAB9AFMAwgAlAB0APgBzAGoAfAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:27Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "NgDIABkARwAJALAAeAAYADAAEwArAKIAvQCAACUAmwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:28Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "ugAPAHwAuADzAKQA9QBJAC0AbADXAIoA6gDGAFgApAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:29Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "uQAeAAAA1QAWAGoAmQBoAFsACQCOANwAVABtAOEAVQA="}]}}}]} \ No newline at end of file diff --git a/python/benchmarks/scenarios/mixed/payload b/python/benchmarks/scenarios/mixed/payload new file mode 100644 index 0000000..e69de29 diff --git a/python/benchmarks/setup_scenario.sh b/python/benchmarks/setup_scenario.sh index bbccc47..ce632b8 100755 --- a/python/benchmarks/setup_scenario.sh +++ b/python/benchmarks/setup_scenario.sh @@ -1,6 +1,5 @@ #!/usr/bin/env sh -SCENARIOS_DIR="scenarios" SCENARIO=$1 COPY_PAYLOAD=$2 SESSION_ID=$3 @@ -8,6 +7,6 @@ SESSION_ID=$3 if ${COPY_PAYLOAD}; then rm -rf payload mkdir -p payload - poetry run ./generate_payload.py --scenario="${SCENARIOS_DIR}/${SCENARIO}" --session-id="${SESSION_ID}" -o scenarios/"${SCENARIO}"/payload + poetry run ./generate_payload.py --scenario "${SCENARIO}" --session-id="${SESSION_ID}" cp scenarios/"${SCENARIO}"/payload payload/payload fi From 0544dafdd7af1bb10edbcf31a34f36ba7f6c373d Mon Sep 17 00:00:00 2001 From: felixngfender Date: Sat, 22 Feb 2025 19:15:27 -0500 Subject: [PATCH 14/21] feat(client): optimal data transmit parameters --- .../New Android\342\204\242 Profile.asset" | 2 +- .../Runtime/DataBuffers/GyroscopeBuffer.cs | 5 +- .../Runtime/DataBuffers/TransformBuffer.cs | 8 +- .../Runtime/DataModalityUI/AudioUIConfig.cs | 105 ++++++++++++------ .../BaseDataModalityUIConfig.cs | 15 ++- .../Runtime/DataModalityUI/ColorUIConfig.cs | 82 +++++++++----- .../DataModalityUIConfigDefaults.cs | 8 +- .../Runtime/DataModalityUI/DepthUIConfig.cs | 84 ++++++++------ .../DataModalityUI/GyroscopeUIConfig.cs | 100 ++++++++++------- .../DataModalityUI/MeshDetectionUIConfig.cs | 92 +++++++++------ .../DataModalityUI/PlaneDetectionUIConfig.cs | 90 +++++++++------ .../PointCloudDetectionUIConfig.cs | 89 +++++++++------ .../DataModalityUI/TransformUIConfig.cs | 98 ++++++++++------ .../DeviceSample/ARFlowDeviceSample.cs | 56 ++++++---- unity/ProjectSettings/ProjectSettings.asset | 4 +- 15 files changed, 526 insertions(+), 312 deletions(-) diff --git "a/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" "b/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" index 8c41142..35ac39a 100644 --- "a/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" +++ "b/unity/Assets/Settings/Build Profiles/New Android\342\204\242 Profile.asset" @@ -38,7 +38,7 @@ MonoBehaviour: m_ExplicitNullChecks: 0 m_ExplicitDivideByZeroChecks: 0 m_ExplicitArrayBoundsChecks: 0 - m_CompressionType: 2 + m_CompressionType: 3 m_InstallInBuildFolder: 0 m_BuildSubtarget: 0 m_BuildSystem: 1 diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs index cc871c1..075904d 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/GyroscopeBuffer.cs @@ -74,6 +74,7 @@ public IClock Clock get => m_Clock; set => m_Clock = value; } + /* m_Device = GetDeviceInfo.GetDevice(); @@ -97,11 +98,11 @@ public IClock Clock */ public ConcurrentQueue Buffer => m_Buffer; - public GyroscopeBuffer(IClock clock, float samplingIntervalMs = 50) + public GyroscopeBuffer(IClock clock, float samplingRateHz = 125) { m_Buffer = new ConcurrentQueue(); m_Clock = clock; - m_SamplingIntervalMs = samplingIntervalMs; + m_SamplingIntervalMs = (float)(1000.0 / samplingRateHz); } public void StartCapture() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs index 0453eef..3f7116a 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataBuffers/TransformBuffer.cs @@ -58,16 +58,12 @@ public IClock Clock public ConcurrentQueue Buffer => m_Buffer; - public TransformBuffer( - Camera mainCamera, - IClock clock, - float samplingIntervalMs = 50 - ) + public TransformBuffer(Camera mainCamera, IClock clock, float samplingRateHz = 60) { m_Buffer = new ConcurrentQueue(); m_MainCamera = mainCamera; m_Clock = clock; - m_SamplingIntervalMs = samplingIntervalMs; + m_SamplingIntervalMs = (float)(1000.0 / samplingRateHz); } public void StartCapture() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs index 1ae3aff..04ce153 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs @@ -1,18 +1,11 @@ -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - -using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.Clock; -using CakeLab.ARFlow.DataModalityUIConfig; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -22,67 +15,104 @@ public class AudioUIConfig : BaseDataModalityUIConfig private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Audio"; - private const string SAMPLE_RATE_NAME = "Sample Rate"; + private const string SAMPLING_RATE_NAME = "Sampling Rate (Hz)"; private TMP_InputField sampleRateField; - private const string DEFAULT_SAMPLE_RATE = "16000"; + private const string DEFAULT_SAMPLING_RATE = "16000"; private const string FRAME_LENGTH_NAME = "Frame Length"; private TMP_InputField frameLengthField; private const string DEFAULT_FRAME_LENGTH = "512"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; private bool m_IsBufferAvailable; private bool m_IsModalityActive = false; public override bool isModalityActive => m_IsModalityActive; private IClock m_Clock; + public AudioUIConfig(IClock clock, bool isBufferAvailable = true) { m_IsBufferAvailable = isBufferAvailable; m_Clock = clock; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Sample Rate - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, SAMPLE_RATE_NAME, DEFAULT_SAMPLE_RATE, out var sampleRateObject, out sampleRateField); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SAMPLING_RATE_NAME, + DEFAULT_SAMPLING_RATE, + out var sampleRateObject, + out sampleRateField + ); sampleRateField.contentType = TMP_InputField.ContentType.IntegerNumber; m_UIConfigElements.Add(sampleRateObject); - //Frame length - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, FRAME_LENGTH_NAME, DEFAULT_FRAME_LENGTH, out var frameLengthObj, out frameLengthField); + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + FRAME_LENGTH_NAME, + DEFAULT_FRAME_LENGTH, + out var frameLengthObj, + out frameLengthField + ); frameLengthField.contentType = TMP_InputField.ContentType.IntegerNumber; m_UIConfigElements.Add(frameLengthObj); - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + LIGHT_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } - public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -97,7 +127,6 @@ public override void TurnOnConfig() foreach (GameObject element in m_UIConfigElements) { element.SetActive(true); - } m_IsModalityActive = true; } @@ -122,15 +151,20 @@ public override void TurnOnConfig() /// Get the current delay value, set by the user ///
/// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); - + return float.Parse(sendIntervalField.text); } + public AudioBuffer GetBufferFromConfig() { - return new AudioBuffer(m_Clock, int.Parse(sampleRateField.text), int.Parse(frameLengthField.text)); + return new AudioBuffer( + m_Clock, + int.Parse(sampleRateField.text), + int.Parse(frameLengthField.text) + ); } + public override IARFrameBuffer GetGenericBuffer() { return GetBufferFromConfig(); @@ -144,4 +178,5 @@ public override void Dispose() } } } -} \ No newline at end of file +} + diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/BaseDataModalityUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/BaseDataModalityUIConfig.cs index f4ed3a3..e112146 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/BaseDataModalityUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/BaseDataModalityUIConfig.cs @@ -1,8 +1,6 @@ -using UnityEngine; -using TMPro; using System; using CakeLab.ARFlow.DataBuffers; - +using UnityEngine; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -13,11 +11,16 @@ namespace CakeLab.ARFlow.DataModalityUIConfig ///
public abstract class BaseDataModalityUIConfig : IDisposable { - public abstract float GetDelay(); + public abstract float GetSendIntervalS(); public abstract void TurnOnConfig(); public abstract void TurnOffConfig(); - public abstract void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality); + public abstract void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ); public abstract bool isModalityActive { get; } + public virtual void ToggleConfig(bool isOn) { if (isOn) @@ -29,8 +32,8 @@ public virtual void ToggleConfig(bool isOn) TurnOffConfig(); } } + public abstract IARFrameBuffer GetGenericBuffer(); public abstract void Dispose(); } } - diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs index 67cb86b..93fb787 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs @@ -1,18 +1,12 @@ -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.DataModalityUIConfig; -using CakeLab.ARFlow.Clock; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -23,9 +17,10 @@ public class ColorUIConfig : BaseDataModalityUIConfig private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Camera Color"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; private ARCameraManager m_Manager; @@ -33,38 +28,66 @@ public class ColorUIConfig : BaseDataModalityUIConfig private bool m_IsModalityActive = false; public override bool isModalityActive => m_IsModalityActive; private IClock m_Clock; - public ColorUIConfig(ARCameraManager cameraManager, IClock clock, bool isBufferAvailable = true) + + public ColorUIConfig( + ARCameraManager cameraManager, + IClock clock, + bool isBufferAvailable = true + ) { m_IsBufferAvailable = isBufferAvailable; - m_Clock = clock; m_Manager = cameraManager; + m_Clock = clock; + m_Manager = cameraManager; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { - //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } - //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + HEAVY_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -72,7 +95,6 @@ public override void TurnOffConfig() m_IsModalityActive = false; // if (m_Manager) m_Manager.enabled = false; - } public override void TurnOnConfig() @@ -89,10 +111,11 @@ public override void TurnOnConfig() /// Get the current delay value, set by the user ///
/// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); + return float.Parse(sendIntervalField.text); } + public ColorBuffer GetBufferFromConfig() { //TODO: validate @@ -112,4 +135,5 @@ public override void Dispose() } } } -} \ No newline at end of file +} + diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs index 3cdce50..3044163 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DataModalityUIConfigDefaults.cs @@ -3,9 +3,11 @@ namespace CakeLab.ARFlow.DataModalityUIConfig public static class DefaultValues { public const string ENABLE_NAME = "Enable"; - public const string DELAY_NAME = "Delay (s)"; - public const string DELAY_DEFAULT = "0.5"; + public const string SEND_INTERVAL_NAME = "Send Interval (s)"; + public const string LIGHT_MODALITIES_SEND_INTERVAL_DEFAULT = "1"; + public const string HEAVY_MODALITIES_SEND_INTERVAL_DEFAULT = "0.25"; public const string UNAVAILABLE_MESSAGE = "This data modality is not available."; } -} \ No newline at end of file +} + diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs index 61eae3a..49c5d14 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs @@ -1,18 +1,12 @@ -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.Clock; -using CakeLab.ARFlow.DataModalityUIConfig; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -23,9 +17,10 @@ public class DepthUIConfig : BaseDataModalityUIConfig private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Camera Depth"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; private AROcclusionManager m_Manager; @@ -33,39 +28,66 @@ public class DepthUIConfig : BaseDataModalityUIConfig private bool m_IsModalityActive = false; public override bool isModalityActive => m_IsModalityActive; private IClock m_Clock; - public DepthUIConfig(AROcclusionManager manager, IClock clock, bool isBufferAvailable = true) + + public DepthUIConfig( + AROcclusionManager manager, + IClock clock, + bool isBufferAvailable = true + ) { m_IsBufferAvailable = isBufferAvailable; - m_Clock = clock; m_Manager = manager; + m_Clock = clock; + m_Manager = manager; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { - //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } - //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + HEAVY_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } - public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -74,7 +96,6 @@ public override void TurnOffConfig() m_IsModalityActive = false; // if (m_Manager) m_Manager.enabled = false; - } public override void TurnOnConfig() @@ -87,15 +108,15 @@ public override void TurnOnConfig() // if (m_Manager) m_Manager.enabled = true; } - /// /// Get the current delay value, set by the user /// /// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); + return float.Parse(sendIntervalField.text); } + public DepthBuffer GetBufferFromConfig() { return new DepthBuffer(m_Manager, m_Clock); @@ -114,4 +135,5 @@ public override void Dispose() } } } -} \ No newline at end of file +} + diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs index 3b9a9b8..88b5352 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/GyroscopeUIConfig.cs @@ -1,20 +1,12 @@ - -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - +using CakeLab.ARFlow.Utilities; using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - -using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.Clock; -using CakeLab.ARFlow.DataModalityUIConfig; -using CakeLab.ARFlow.Utilities; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -24,56 +16,87 @@ public class GyroscopeUIConfig : BaseDataModalityUIConfig private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Gyroscope"; - private const string SAMPLING_INTERVAL_NAME = "Sampling Interval (ms)"; - private TMP_InputField samplingIntervalField; - private const string DEFAULT_SAMPLING_INTERVAL = "50"; + private const string SAMPLING_RATE_NAME = "Sampling Rate (Hz)"; + private TMP_InputField samplingRateHzField; + private const string DEFAULT_SAMPLING_RATE_HZ = "125"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; private bool m_IsBufferAvailable; private bool m_IsModalityActive = false; public override bool isModalityActive => m_IsModalityActive; private IClock m_Clock; + public GyroscopeUIConfig(IClock clock, bool isBufferAvailable = true) { m_IsBufferAvailable = isBufferAvailable; m_Clock = clock; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Sampling Interval - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, SAMPLING_INTERVAL_NAME, DEFAULT_SAMPLING_INTERVAL, out var samplingIntervalObj, out samplingIntervalField); - samplingIntervalField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(samplingIntervalObj); - - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SAMPLING_RATE_NAME, + DEFAULT_SAMPLING_RATE_HZ, + out var samplingRateHzObj, + out samplingRateHzField + ); + samplingRateHzField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(samplingRateHzObj); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + LIGHT_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } - public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -93,17 +116,18 @@ public override void TurnOnConfig() } /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); + return float.Parse(sendIntervalField.text); } + public GyroscopeBuffer GetBufferFromConfig() { InternalDebug.Log("Gyroscope buffer created"); - return new GyroscopeBuffer(m_Clock, int.Parse(samplingIntervalField.text)); + return new GyroscopeBuffer(m_Clock, float.Parse(samplingRateHzField.text)); } public override IARFrameBuffer GetGenericBuffer() @@ -119,4 +143,4 @@ public override void Dispose() } } } -} \ No newline at end of file +} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs index bf635e4..072fb40 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs @@ -1,19 +1,12 @@ - -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.Clock; -using CakeLab.ARFlow.DataModalityUIConfig; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -24,10 +17,11 @@ public class MeshDetectionUIConfig : BaseDataModalityUIConfig private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Mesh Detection"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; ARMeshManager m_Manager; @@ -35,39 +29,66 @@ public class MeshDetectionUIConfig : BaseDataModalityUIConfig private bool m_IsModalityActive = false; public override bool isModalityActive => m_IsModalityActive; private IClock m_Clock; - public MeshDetectionUIConfig(ARMeshManager manager, IClock clock, bool isBufferAvailable = true) + + public MeshDetectionUIConfig( + ARMeshManager manager, + IClock clock, + bool isBufferAvailable = true + ) { m_IsBufferAvailable = isBufferAvailable; - m_Clock = clock; m_Manager = manager; + m_Clock = clock; + m_Manager = manager; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { - //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } - //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + HEAVY_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } - public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -75,8 +96,8 @@ public override void TurnOffConfig() // Keep toggle and name active m_IsModalityActive = false; - if (m_Manager) m_Manager.enabled = false; - + if (m_Manager) + m_Manager.enabled = false; } public override void TurnOnConfig() @@ -86,18 +107,19 @@ public override void TurnOnConfig() element.SetActive(true); } m_IsModalityActive = true; - if (m_Manager) m_Manager.enabled = true; + if (m_Manager) + m_Manager.enabled = true; } - /// /// Get the current delay value, set by the user /// /// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); + return float.Parse(sendIntervalField.text); } + public MeshDetectionBuffer GetBufferFromConfig() { return new MeshDetectionBuffer(m_Manager, m_Clock); @@ -107,6 +129,7 @@ public override IARFrameBuffer GetGenericBuffer() { return GetBufferFromConfig(); } + public override void Dispose() { foreach (GameObject element in m_UIConfigElements) @@ -115,4 +138,5 @@ public override void Dispose() } } } -} \ No newline at end of file +} + diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs index 300692d..410efa5 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs @@ -1,19 +1,12 @@ - -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.Clock; -using CakeLab.ARFlow.DataModalityUIConfig; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -24,49 +17,77 @@ public class PlaneDetectionUIConfig : BaseDataModalityUIConfig private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Plane Detection"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; private ARPlaneManager m_Manager; private bool m_IsBufferAvailable = true; private bool m_IsModalityActive = false; public override bool isModalityActive => m_IsModalityActive; private IClock m_Clock; - public PlaneDetectionUIConfig(ARPlaneManager manager, IClock clock, bool isBufferAvailable = true) + + public PlaneDetectionUIConfig( + ARPlaneManager manager, + IClock clock, + bool isBufferAvailable = true + ) { m_IsBufferAvailable = isBufferAvailable; - m_Clock = clock; m_Manager = manager; + m_Clock = clock; + m_Manager = manager; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { - //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } - //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + HEAVY_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } - public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -74,8 +95,8 @@ public override void TurnOffConfig() // Keep toggle and name active m_IsModalityActive = false; - if (m_Manager) m_Manager.enabled = false; - + if (m_Manager) + m_Manager.enabled = false; } public override void TurnOnConfig() @@ -85,17 +106,19 @@ public override void TurnOnConfig() element.SetActive(true); } m_IsModalityActive = true; - if (m_Manager) m_Manager.enabled = true; + if (m_Manager) + m_Manager.enabled = true; } /// /// Get the current delay value, set by the user /// /// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); + return float.Parse(sendIntervalField.text); } + public PlaneDetectionBuffer GetBufferFromConfig() { return new PlaneDetectionBuffer(m_Manager, m_Clock); @@ -114,4 +137,5 @@ public override void Dispose() } } } -} \ No newline at end of file +} + diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs index 382c669..fb7f84d 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs @@ -1,18 +1,12 @@ -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.DataModalityUIConfig; -using CakeLab.ARFlow.Clock; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -23,9 +17,10 @@ public class PointCloudDetectionUIConfig : BaseDataModalityUIConfig private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Point Cloud Detection"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; private ARPointCloudManager m_Manager; @@ -33,39 +28,66 @@ public class PointCloudDetectionUIConfig : BaseDataModalityUIConfig private bool m_IsModalityActive = false; public override bool isModalityActive => m_IsModalityActive; private IClock m_Clock; - public PointCloudDetectionUIConfig(ARPointCloudManager manager, IClock clock, bool isBufferAvailable = true) + + public PointCloudDetectionUIConfig( + ARPointCloudManager manager, + IClock clock, + bool isBufferAvailable = true + ) { m_IsBufferAvailable = isBufferAvailable; - m_Clock = clock; m_Manager = manager; + m_Clock = clock; + m_Manager = manager; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { - //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } - //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + HEAVY_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } - public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -73,8 +95,8 @@ public override void TurnOffConfig() // Keep toggle and name active m_IsModalityActive = false; - if (m_Manager) m_Manager.enabled = false; - + if (m_Manager) + m_Manager.enabled = false; } public override void TurnOnConfig() @@ -84,17 +106,19 @@ public override void TurnOnConfig() element.SetActive(true); } m_IsModalityActive = true; - if (m_Manager) m_Manager.enabled = true; + if (m_Manager) + m_Manager.enabled = true; } /// /// Get the current delay value, set by the user /// /// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); + return float.Parse(sendIntervalField.text); } + public PointCloudDetectionBuffer GetBufferFromConfig() { //TODO: validate @@ -114,4 +138,5 @@ public override void Dispose() } } } -} \ No newline at end of file +} + diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs index 5ec9314..0626a9e 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/TransformUIConfig.cs @@ -1,19 +1,11 @@ - -using UnityEngine; +using System; +using System.Collections.Generic; +using CakeLab.ARFlow.Clock; using CakeLab.ARFlow.DataBuffers; - using TMPro; +using UnityEngine; using UnityEngine.UI; - -using System.Collections.Generic; -using System; -using UnityEditor; - -using UnityEngine.XR.ARFoundation; - using static CakeLab.ARFlow.DataModalityUIConfig.DefaultValues; -using CakeLab.ARFlow.Clock; -using CakeLab.ARFlow.DataModalityUIConfig; namespace CakeLab.ARFlow.DataModalityUIConfig { @@ -25,14 +17,15 @@ public class TransformUIConfig : BaseDataModalityUIConfig // toggle for buffer is a special case - toggling turns config off and on private GameObject toggle; private List m_UIConfigElements = new(); + // Configs private const string MODALITY_NAME = "Transform"; - private const string SAMPLING_INTERVAL_NAME = "Sampling Interval (ms)"; - private TMP_InputField samplingIntervalField; - private const string DEFAULT_SAMPLING_INTERVAL = "50"; + private const string SAMPLING_RATE_NAME = "Sampling Rate (Hz)"; + private TMP_InputField samplingRateHzField; + private const string DEFAULT_SAMPLING_RATE_HZ = "60"; - private TMP_InputField delayField; + private TMP_InputField sendIntervalField; private Camera m_camera; @@ -48,38 +41,67 @@ public TransformUIConfig(Camera mainCamera, IClock clock, bool isBufferAvailable m_Clock = clock; } - public override void InitializeConfig(GameObject parent, DataModalityUIConfigPrefabs prefabs, Action onToggleModality) + public override void InitializeConfig( + GameObject parent, + DataModalityUIConfigPrefabs prefabs, + Action onToggleModality + ) { //Name - InstantiateGameObject.InstantiateHeaderText(parent, prefabs.headerTextPrefab, MODALITY_NAME, out var bufferNameObject); + InstantiateGameObject.InstantiateHeaderText( + parent, + prefabs.headerTextPrefab, + MODALITY_NAME, + out var bufferNameObject + ); if (!m_IsBufferAvailable) { //If buffer is not available, don't show the rest of the UI - GameObject bufferNotAvailableText = GameObject.Instantiate(prefabs.bodyTextPrefab, parent.transform); + GameObject bufferNotAvailableText = GameObject.Instantiate( + prefabs.bodyTextPrefab, + parent.transform + ); bufferNotAvailableText.GetComponent().text = UNAVAILABLE_MESSAGE; return; } //Buffer toggle (on or off) - InstantiateGameObject.InstantiateToggle(parent, prefabs.togglePrefab, ENABLE_NAME, new Action[] { onToggleModality, ToggleConfig }, out toggle, out _); - - //Sampling Interval - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, SAMPLING_INTERVAL_NAME, DEFAULT_SAMPLING_INTERVAL, out var samplingIntervalObj, out samplingIntervalField); - samplingIntervalField.contentType = TMP_InputField.ContentType.IntegerNumber; - m_UIConfigElements.Add(samplingIntervalObj); - - //Delay - InstantiateGameObject.InstantiateInputField(parent, prefabs.textFieldPrefab, DELAY_NAME, DELAY_DEFAULT, out var delayObject, out delayField); - delayField.contentType = TMP_InputField.ContentType.DecimalNumber; - m_UIConfigElements.Add(delayObject); + InstantiateGameObject.InstantiateToggle( + parent, + prefabs.togglePrefab, + ENABLE_NAME, + new Action[] { onToggleModality, ToggleConfig }, + out toggle, + out _ + ); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SAMPLING_RATE_NAME, + DEFAULT_SAMPLING_RATE_HZ, + out var samplingRateHzObject, + out samplingRateHzField + ); + samplingRateHzField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(samplingRateHzObject); + + InstantiateGameObject.InstantiateInputField( + parent, + prefabs.textFieldPrefab, + SEND_INTERVAL_NAME, + LIGHT_MODALITIES_SEND_INTERVAL_DEFAULT, + out var sendIntervalObject, + out sendIntervalField + ); + sendIntervalField.contentType = TMP_InputField.ContentType.DecimalNumber; + m_UIConfigElements.Add(sendIntervalObject); ToggleConfig(m_IsModalityActive); } - public override void TurnOffConfig() { - foreach (GameObject element in m_UIConfigElements) { element.SetActive(false); @@ -97,17 +119,19 @@ public override void TurnOnConfig() } m_IsModalityActive = true; } + /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// - public override float GetDelay() + public override float GetSendIntervalS() { - return float.Parse(delayField.text); + return float.Parse(sendIntervalField.text); } + public TransformBuffer GetBufferFromConfig() { - return new TransformBuffer(m_camera, m_Clock, int.Parse(samplingIntervalField.text)); + return new TransformBuffer(m_camera, m_Clock, float.Parse(samplingRateHzField.text)); } public override IARFrameBuffer GetGenericBuffer() @@ -123,4 +147,4 @@ public override void Dispose() } } } -} \ No newline at end of file +} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs index 52dc0e1..a9fdfb8 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/SceneScripts/DeviceSample/ARFlowDeviceSample.cs @@ -21,8 +21,8 @@ public class ARFlowDeviceSample : MonoBehaviour { public GameObject XROrigin; - [Space(20)] + [Space(20)] [Header("AR Managers & Data collectors")] // AR Managers for AR data collection [Tooltip("Camera image data's manager from the device camera")] @@ -37,7 +37,9 @@ public class ARFlowDeviceSample : MonoBehaviour public ARPointCloudManager pointCloudManager; - [Tooltip("Pose will be obtained from this object. This object should contain a TrackedPoseDriver component.")] + [Tooltip( + "Pose will be obtained from this object. This object should contain a TrackedPoseDriver component." + )] public Transform poseObjTransform; // Variables for state of the ARFlow device sample @@ -53,8 +55,6 @@ public class ARFlowDeviceSample : MonoBehaviour private bool m_isSending = false; - - // Data buffers and UI configs /// @@ -115,10 +115,10 @@ public async void SendFrame(BufferControl control) { while (!control.cts.Token.IsCancellationRequested) { - float currentDelay = control.config.GetDelay(); + float currentSendIntervalS = control.config.GetSendIntervalS(); // OperationCanceledException is thrown when the token is cancelled, this is expected // For more details, see https://blog.stephencleary.com/2022/02/cancellation-1-overview.html - await Awaitable.WaitForSecondsAsync(currentDelay, control.cts.Token); + await Awaitable.WaitForSecondsAsync(currentSendIntervalS, control.cts.Token); IEnumerable arFrames = control.buffer.TakeARFrames(); @@ -199,7 +199,6 @@ public class FindServerWindow public string serverPort => portServerField.text; public string serverAddress => $"http://{serverIP}:{serverPort}"; - public bool isToggleOn => NTPSameServerToggle.isOn; public string ipNTPText => isToggleOn ? serverIP : ipNTPField.text; @@ -218,12 +217,15 @@ public void initFindServerWindow() { ipServerField.text = _defaultIp; portServerField.text = _defaultPort; - NTPSameServerToggle.onValueChanged.AddListener((bool value) => - { - ipNTPField.interactable = !value; - }); + NTPSameServerToggle.onValueChanged.AddListener( + (bool value) => + { + ipNTPField.interactable = !value; + } + ); } } + [Header("UI Windows")] [Tooltip("UI Window for finding server")] public FindServerWindow findServerWindow; @@ -232,14 +234,17 @@ public async void OnConnectToServer() { try { - string serverURL = Uri.IsWellFormedUriString(findServerWindow.serverAddress, UriKind.RelativeOrAbsolute) ? - findServerWindow.serverAddress : findServerWindow.defaultAddress; + string serverURL = Uri.IsWellFormedUriString( + findServerWindow.serverAddress, + UriKind.RelativeOrAbsolute + ) + ? findServerWindow.serverAddress + : findServerWindow.defaultAddress; string ntpURL = findServerWindow.ntpAddress; grpcClient = new GrpcClient(serverURL); - Toast.Show("Connection in progress.", 1f, ToastColor.Yellow); // Search for session also @@ -612,6 +617,7 @@ public class ArucoWindow public TMP_Text positionText; public TMP_Text rotationText; } + public ArucoWindow arucoWindow; /// @@ -619,11 +625,13 @@ public class ArucoWindow /// This object will be a helper for setting the xrorigin, since setting the position of xrorigin while syncing give undefine behaviors /// public GameObject arucoSyncObj; + void ResetOriginPosition() { XROrigin.transform.position = UnityEngine.Vector3.zero; XROrigin.transform.rotation = UnityEngine.Quaternion.identity; } + void onStartScan() { ResetOriginPosition(); @@ -635,14 +643,15 @@ void onStartScan() arucoWindow.statusText.text = "To sync, scan an ArUco Marker of the type specified."; arucoWindow.positionText.text = $""; arucoWindow.rotationText.text = $""; - } + void onStopScan() { arucoWindow.cameraArUco.OnStopScanning(); arucoWindow.scanWindow.SetActive(false); arucoWindow.configWindow.SetActive(true); } + void onGoBackFromAruco() { arucoWindow.cameraArUco.OnStopScanning(); @@ -651,20 +660,24 @@ void onGoBackFromAruco() arViewWindow.windowGameObject.SetActive(true); } + void onGoToArucoWindow() { arViewWindow.windowGameObject.SetActive(false); arucoWindow.configWindow.SetActive(true); arucoWindow.scanWindow.SetActive(false); } + void OnSpaceSynced() { InternalDebug.Log($"Space synced successfully {arucoSyncObj.transform.position}"); arucoWindow.finishScanButton.interactable = true; - arucoWindow.statusText.text = "ArUco marker scanned. To finish syncing, press the finish button"; + arucoWindow.statusText.text = + "ArUco marker scanned. To finish syncing, press the finish button"; arucoWindow.positionText.text = $"Position: {arucoSyncObj.transform.position}"; arucoWindow.rotationText.text = $"Rotation: {arucoSyncObj.transform.rotation.eulerAngles}"; } + void OnFinishScan() { XROrigin.transform.position = arucoSyncObj.transform.position; @@ -681,11 +694,10 @@ void OnApplicationQuit() } } - bool CheckSubsystemAvailability() where T : class, ISubsystem + bool CheckSubsystemAvailability() + where T : class, ISubsystem { - return LoaderUtility - .GetActiveLoader()? - .GetLoadedSubsystem() != null; + return LoaderUtility.GetActiveLoader()?.GetLoadedSubsystem() != null; } private void DisposeUIConfig() @@ -760,9 +772,9 @@ private void InitUIConfig() ); } } + void Start() { - if (UnityEngine.InputSystem.Gyroscope.current != null) { InputSystem.EnableDevice(UnityEngine.InputSystem.Gyroscope.current); @@ -782,12 +794,10 @@ void Start() m_Device = GetDeviceInfo.GetDevice(); - // Initialize find server window findServerWindow.initFindServerWindow(); findServerWindow.connectButton.onClick.AddListener(OnConnectToServer); - // Initialize sessions window sessionsWindow.refreshButton.onClick.AddListener(async () => await SearchForSession()); sessionsWindow.createSessionButton.onClick.AddListener(OnPressCreateSession); diff --git a/unity/ProjectSettings/ProjectSettings.asset b/unity/ProjectSettings/ProjectSettings.asset index a42201f..768c37a 100644 --- a/unity/ProjectSettings/ProjectSettings.asset +++ b/unity/ProjectSettings/ProjectSettings.asset @@ -142,11 +142,11 @@ PlayerSettings: tvOSBundleVersion: 1.0 bundleVersion: 0.0.3 preloadedAssets: + - {fileID: 4800000, guid: c9f956787b1d945e7b36e0516201fc76, type: 3} + - {fileID: 4800000, guid: 0945859e5a1034c2cb6dce53cb4fb899, type: 3} - {fileID: 11400000, guid: c199e683398494f32b4cde18e73ab731, type: 2} - {fileID: 7409956309476867576, guid: 3fd4fc0127790db4bae83f7b77da8d45, type: 2} - {fileID: 4754762928077386648, guid: b07c4ba7650be4c25b3d0c497e7e2bb8, type: 2} - - {fileID: 4800000, guid: c9f956787b1d945e7b36e0516201fc76, type: 3} - - {fileID: 4800000, guid: 0945859e5a1034c2cb6dce53cb4fb899, type: 3} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1 From 8c5ec7ca8e710f62064e4cc530aaebc646b13790 Mon Sep 17 00:00:00 2001 From: felixngfender Date: Sat, 22 Feb 2025 19:16:24 -0500 Subject: [PATCH 15/21] test(server): add color modality to saving AR frames test --- python/tests/test_server.py | 142 +++++++++--------- python/tests/test_service.py | 142 +++++++++--------- .../Runtime/DataModalityUI/AudioUIConfig.cs | 2 +- .../Runtime/DataModalityUI/ColorUIConfig.cs | 2 +- .../Runtime/DataModalityUI/DepthUIConfig.cs | 2 +- .../DataModalityUI/MeshDetectionUIConfig.cs | 2 +- .../DataModalityUI/PlaneDetectionUIConfig.cs | 2 +- .../PointCloudDetectionUIConfig.cs | 2 +- 8 files changed, 148 insertions(+), 148 deletions(-) diff --git a/python/tests/test_server.py b/python/tests/test_server.py index 432f2c0..3841a31 100644 --- a/python/tests/test_server.py +++ b/python/tests/test_server.py @@ -21,6 +21,7 @@ from cakelab.arflow_grpc.v1.ar_plane_pb2 import ARPlane from cakelab.arflow_grpc.v1.arflow_service_pb2_grpc import ARFlowServiceStub from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame +from cakelab.arflow_grpc.v1.color_frame_pb2 import ColorFrame from cakelab.arflow_grpc.v1.create_session_request_pb2 import CreateSessionRequest from cakelab.arflow_grpc.v1.create_session_response_pb2 import CreateSessionResponse from cakelab.arflow_grpc.v1.delete_session_request_pb2 import DeleteSessionRequest @@ -28,6 +29,7 @@ from cakelab.arflow_grpc.v1.device_pb2 import Device from cakelab.arflow_grpc.v1.get_session_request_pb2 import GetSessionRequest from cakelab.arflow_grpc.v1.gyroscope_frame_pb2 import GyroscopeFrame +from cakelab.arflow_grpc.v1.intrinsics_pb2 import Intrinsics from cakelab.arflow_grpc.v1.join_session_request_pb2 import JoinSessionRequest from cakelab.arflow_grpc.v1.join_session_response_pb2 import JoinSessionResponse from cakelab.arflow_grpc.v1.leave_session_request_pb2 import LeaveSessionRequest @@ -257,77 +259,75 @@ def test_save_ar_frames( device=device_fixture, ) - # TODO: Re-enable test when workaround in YUV 420 extra padding - # workaround is fixed - # color_frames = [ - # ColorFrame( - # device_timestamp=Timestamp(seconds=0, nanos=0), - # image=XRCpuImage( - # dimensions=Vector2Int(x=4, y=4), - # format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, - # timestamp=0, - # planes=[ - # XRCpuImage.Plane( - # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - # 0, 255, (4, 4), dtype=np.uint8 - # ).tobytes(), - # pixel_stride=1, - # row_stride=4, - # ), - # XRCpuImage.Plane( - # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - # 0, 255, (2, 4), dtype=np.uint8 - # ).tobytes(), - # pixel_stride=2, - # row_stride=4, - # ), - # XRCpuImage.Plane( - # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - # 0, 255, (2, 4), dtype=np.uint8 - # ).tobytes(), - # pixel_stride=2, - # row_stride=4, - # ), - # ], - # ), - # intrinsics=Intrinsics( - # focal_length=Vector2( - # x=1.0, - # y=1.0, - # ), - # principal_point=Vector2( - # x=1.0, - # y=1.0, - # ), - # resolution=Vector2Int( - # x=4, - # y=4, - # ), - # ), - # ) - # ] - # ar_frames = [ - # ARFrame( - # color_frame=color_frames[0], - # ) - # ] - # default_service_fixture.SaveARFrames( - # SaveARFramesRequest( - # session_id=SessionUuid(value="session1"), - # device=device_fixture, - # frames=ar_frames, - # ) - # ) - # mock_on_save_color_frames.assert_called_once_with( - # frames=color_frames, - # session_stream=default_service_fixture.client_sessions["session1"], - # device=device_fixture, - # ) - # mock_on_save_ar_frames.assert_called_with( - # frames=ar_frames, - # session_stream=default_service_fixture.client_sessions["session1"], - # device=device_fixture, - # ) + color_frames = [ + ColorFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + image=XRCpuImage( + dimensions=Vector2Int(x=4, y=4), + format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 256, (4, 4), dtype=np.uint8 + ).tobytes(), + pixel_stride=1, + row_stride=4, + ), + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 256, (2, 2), dtype=np.uint8 + ).tobytes()[:-1], # Trim one byte + pixel_stride=1, + row_stride=2, + ), + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 256, (2, 2), dtype=np.uint8 + ).tobytes()[:-1], # Trim one byte + pixel_stride=1, + row_stride=2, + ), + ], + ), + intrinsics=Intrinsics( + focal_length=Vector2( + x=1.0, + y=1.0, + ), + principal_point=Vector2( + x=1.0, + y=1.0, + ), + resolution=Vector2Int( + x=4, + y=4, + ), + ), + ) + ] + ar_frames = [ + ARFrame( + color_frame=color_frames[0], + ) + ] + stub.SaveARFrames( + SaveARFramesRequest( + session_id=response1.session.id, + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_color_frames.assert_called_once_with( + frames=color_frames, + session_stream=ANY, + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=ANY, + device=device_fixture, + ) depth_frames = [ DepthFrame( diff --git a/python/tests/test_service.py b/python/tests/test_service.py index aa2fdef..7414040 100644 --- a/python/tests/test_service.py +++ b/python/tests/test_service.py @@ -20,12 +20,14 @@ from cakelab.arflow_grpc.v1.ar_frame_pb2 import ARFrame from cakelab.arflow_grpc.v1.ar_plane_pb2 import ARPlane from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame +from cakelab.arflow_grpc.v1.color_frame_pb2 import ColorFrame from cakelab.arflow_grpc.v1.create_session_request_pb2 import CreateSessionRequest from cakelab.arflow_grpc.v1.delete_session_request_pb2 import DeleteSessionRequest from cakelab.arflow_grpc.v1.depth_frame_pb2 import DepthFrame from cakelab.arflow_grpc.v1.device_pb2 import Device from cakelab.arflow_grpc.v1.get_session_request_pb2 import GetSessionRequest from cakelab.arflow_grpc.v1.gyroscope_frame_pb2 import GyroscopeFrame +from cakelab.arflow_grpc.v1.intrinsics_pb2 import Intrinsics from cakelab.arflow_grpc.v1.join_session_request_pb2 import JoinSessionRequest from cakelab.arflow_grpc.v1.leave_session_request_pb2 import LeaveSessionRequest from cakelab.arflow_grpc.v1.list_sessions_request_pb2 import ListSessionsRequest @@ -284,77 +286,75 @@ def test_save_ar_frames( device=device_fixture, ) - # TODO: Re-enable test when workaround in YUV 420 extra padding - # workaround is fixed - # color_frames = [ - # ColorFrame( - # device_timestamp=Timestamp(seconds=0, nanos=0), - # image=XRCpuImage( - # dimensions=Vector2Int(x=4, y=4), - # format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, - # timestamp=0, - # planes=[ - # XRCpuImage.Plane( - # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - # 0, 255, (4, 4), dtype=np.uint8 - # ).tobytes(), - # pixel_stride=1, - # row_stride=4, - # ), - # XRCpuImage.Plane( - # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - # 0, 255, (2, 4), dtype=np.uint8 - # ).tobytes(), - # pixel_stride=2, - # row_stride=4, - # ), - # XRCpuImage.Plane( - # data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - # 0, 255, (2, 4), dtype=np.uint8 - # ).tobytes(), - # pixel_stride=2, - # row_stride=4, - # ), - # ], - # ), - # intrinsics=Intrinsics( - # focal_length=Vector2( - # x=1.0, - # y=1.0, - # ), - # principal_point=Vector2( - # x=1.0, - # y=1.0, - # ), - # resolution=Vector2Int( - # x=4, - # y=4, - # ), - # ), - # ) - # ] - # ar_frames = [ - # ARFrame( - # color_frame=color_frames[0], - # ) - # ] - # default_service_fixture.SaveARFrames( - # SaveARFramesRequest( - # session_id=SessionUuid(value="session1"), - # device=device_fixture, - # frames=ar_frames, - # ) - # ) - # mock_on_save_color_frames.assert_called_once_with( - # frames=color_frames, - # session_stream=default_service_fixture.client_sessions["session1"], - # device=device_fixture, - # ) - # mock_on_save_ar_frames.assert_called_with( - # frames=ar_frames, - # session_stream=default_service_fixture.client_sessions["session1"], - # device=device_fixture, - # ) + color_frames = [ + ColorFrame( + device_timestamp=Timestamp(seconds=0, nanos=0), + image=XRCpuImage( + dimensions=Vector2Int(x=4, y=4), + format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 256, (4, 4), dtype=np.uint8 + ).tobytes(), + pixel_stride=1, + row_stride=4, + ), + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 256, (2, 2), dtype=np.uint8 + ).tobytes()[:-1], # Trim one byte + pixel_stride=1, + row_stride=2, + ), + XRCpuImage.Plane( + data=np.random.randint( # pyright: ignore [reportUnknownMemberType] + 0, 256, (2, 2), dtype=np.uint8 + ).tobytes()[:-1], # Trim one byte + pixel_stride=1, + row_stride=2, + ), + ], + ), + intrinsics=Intrinsics( + focal_length=Vector2( + x=1.0, + y=1.0, + ), + principal_point=Vector2( + x=1.0, + y=1.0, + ), + resolution=Vector2Int( + x=4, + y=4, + ), + ), + ) + ] + ar_frames = [ + ARFrame( + color_frame=color_frames[0], + ) + ] + default_service_fixture.SaveARFrames( + SaveARFramesRequest( + session_id=SessionUuid(value="session1"), + device=device_fixture, + frames=ar_frames, + ) + ) + mock_on_save_color_frames.assert_called_once_with( + frames=color_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) + mock_on_save_ar_frames.assert_called_with( + frames=ar_frames, + session_stream=default_service_fixture.client_sessions["session1"], + device=device_fixture, + ) depth_frames = [ DepthFrame( diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs index 04ce153..99bd43e 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/AudioUIConfig.cs @@ -148,7 +148,7 @@ public override void TurnOnConfig() // } /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// public override float GetSendIntervalS() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs index 93fb787..b781566 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/ColorUIConfig.cs @@ -108,7 +108,7 @@ public override void TurnOnConfig() } /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// public override float GetSendIntervalS() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs index 49c5d14..07cbe6d 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/DepthUIConfig.cs @@ -109,7 +109,7 @@ public override void TurnOnConfig() } /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// public override float GetSendIntervalS() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs index 072fb40..5572d1a 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/MeshDetectionUIConfig.cs @@ -112,7 +112,7 @@ public override void TurnOnConfig() } /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// public override float GetSendIntervalS() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs index 410efa5..8322142 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PlaneDetectionUIConfig.cs @@ -111,7 +111,7 @@ public override void TurnOnConfig() } /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// public override float GetSendIntervalS() diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs index fb7f84d..ee08811 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/DataModalityUI/PointCloudDetectionUIConfig.cs @@ -111,7 +111,7 @@ public override void TurnOnConfig() } /// - /// Get the current delay value, set by the user + /// Get the current send interval value, set by the user /// /// public override float GetSendIntervalS() From 8a4340a442a9223109a6985ab340d0594631caf1 Mon Sep 17 00:00:00 2001 From: felixngfender Date: Sun, 23 Feb 2025 00:30:09 -0500 Subject: [PATCH 16/21] chore(benchmarks): send interval vs payload size and batching benches & data --- python/.gitignore | 1 + python/Dockerfile | 21 - python/benchmarks/BENCHMARKING.md | 10 +- python/benchmarks/analyze.sh | 3 +- .../250222T205146/arflow_server_bench.report | 35 + .../250222T205146/arflow_server_bench.stats | 9 + .../batching/heavy/250222T205146/bench.params | 13 + .../250222T205311/arflow_server_bench.report | 42 ++ .../250222T205311/arflow_server_bench.stats | 9 + .../batching/heavy/250222T205311/bench.params | 13 + .../250222T205435/arflow_server_bench.report | 38 ++ .../250222T205435/arflow_server_bench.stats | 10 + .../batching/heavy/250222T205435/bench.params | 13 + .../250222T205559/arflow_server_bench.report | 39 ++ .../250222T205559/arflow_server_bench.stats | 10 + .../batching/heavy/250222T205559/bench.params | 13 + .../250222T134153/arflow_server_bench.report | 38 ++ .../250222T134153/arflow_server_bench.stats | 9 + .../heavy/250222T134153/bench.params | 13 + .../250222T134316/arflow_server_bench.report | 38 ++ .../250222T134316/arflow_server_bench.stats | 10 + .../heavy/250222T134316/bench.params | 13 + .../250222T134441/arflow_server_bench.report | 38 ++ .../250222T134441/arflow_server_bench.stats | 10 + .../heavy/250222T134441/bench.params | 13 + .../250222T134607/arflow_server_bench.report | 38 ++ .../250222T134607/arflow_server_bench.stats | 9 + .../heavy/250222T134607/bench.params | 13 + .../250222T134730/arflow_server_bench.report | 38 ++ .../250222T134730/arflow_server_bench.stats | 10 + .../heavy/250222T134730/bench.params | 13 + .../250222T134855/arflow_server_bench.report | 35 + .../250222T134855/arflow_server_bench.stats | 10 + .../heavy/250222T134855/bench.params | 13 + .../250222T132240/arflow_server_bench.report | 38 ++ .../250222T132240/arflow_server_bench.stats | 9 + .../light/250222T132240/bench.params | 13 + .../250222T132403/arflow_server_bench.report | 38 ++ .../250222T132403/arflow_server_bench.stats | 9 + .../light/250222T132403/bench.params | 13 + .../250222T132526/arflow_server_bench.report | 38 ++ .../250222T132526/arflow_server_bench.stats | 10 + .../light/250222T132526/bench.params | 13 + .../250222T132650/arflow_server_bench.report | 35 + .../250222T132650/arflow_server_bench.stats | 9 + .../light/250222T132650/bench.params | 13 + .../250222T132813/arflow_server_bench.report | 35 + .../250222T132813/arflow_server_bench.stats | 9 + .../light/250222T132813/bench.params | 13 + .../250222T132936/arflow_server_bench.report | 38 ++ .../250222T132936/arflow_server_bench.stats | 10 + .../light/250222T132936/bench.params | 13 + .../250222T135353/arflow_server_bench.report | 42 ++ .../250222T135353/arflow_server_bench.stats | 9 + .../mixed/250222T135353/bench.params | 13 + .../250222T135517/arflow_server_bench.report | 35 + .../250222T135517/arflow_server_bench.stats | 9 + .../mixed/250222T135517/bench.params | 13 + .../250222T135641/arflow_server_bench.report | 38 ++ .../250222T135641/arflow_server_bench.stats | 10 + .../mixed/250222T135641/bench.params | 13 + .../250222T135806/arflow_server_bench.report | 35 + .../250222T135806/arflow_server_bench.stats | 9 + .../mixed/250222T135806/bench.params | 13 + .../250222T135929/arflow_server_bench.report | 38 ++ .../250222T135929/arflow_server_bench.stats | 9 + .../mixed/250222T135929/bench.params | 13 + .../250222T140053/arflow_server_bench.report | 38 ++ .../250222T140053/arflow_server_bench.stats | 10 + .../mixed/250222T140053/bench.params | 13 + python/benchmarks/batching_benchmark.sh | 33 + python/benchmarks/bench.sh | 12 +- python/benchmarks/build.sh | 6 - python/benchmarks/generate_payload.py | 285 ++++---- .../{mixed/payload => heavy/.gitkeep} | 0 python/benchmarks/scenarios/light/.gitkeep | 0 python/benchmarks/scenarios/light/payload | 1 - python/benchmarks/scenarios/medium/payload | 1 - python/benchmarks/scenarios/mixed/.gitkeep | 0 .../send_interval_payload_size_benchmark.sh | 38 ++ python/benchmarks/setup_scenario.sh | 3 +- python/benchmarks/visualize_results.ipynb | 607 ++++++++++++++++++ 82 files changed, 2172 insertions(+), 170 deletions(-) create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205146/bench.params create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205311/bench.params create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205435/bench.params create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/batching/heavy/250222T205559/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/bench.params create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.report create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.stats create mode 100644 python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/bench.params create mode 100755 python/benchmarks/batching_benchmark.sh rename python/benchmarks/scenarios/{mixed/payload => heavy/.gitkeep} (100%) create mode 100644 python/benchmarks/scenarios/light/.gitkeep delete mode 100644 python/benchmarks/scenarios/light/payload delete mode 100644 python/benchmarks/scenarios/medium/payload create mode 100644 python/benchmarks/scenarios/mixed/.gitkeep create mode 100755 python/benchmarks/send_interval_payload_size_benchmark.sh create mode 100644 python/benchmarks/visualize_results.ipynb diff --git a/python/.gitignore b/python/.gitignore index 8ce1e4b..c1a4da0 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -185,6 +185,7 @@ pyrightconfig.json # benchmark artifacts benchmarks/payload benchmarks/results +benchmarks/scenarios/**/payload # evaluation artifacts !evaluations/**/*.rrd diff --git a/python/Dockerfile b/python/Dockerfile index 1943a56..6f37d19 100644 --- a/python/Dockerfile +++ b/python/Dockerfile @@ -1,25 +1,8 @@ -# TODO: remove -# FROm python:3.12-slim-bookworm -# -# WORKDIR /app -# COPY python_grpc_bench /app -# COPY proto /app/proto -# -# RUN python -m pip install grpcio grpcio-tools -# RUN python -m grpc_tools.protoc -I/app/proto/helloworld --python_out=. --grpc_python_out=. helloworld.proto -# -# ENTRYPOINT [ "python", "/app/server.py" ] - -# FROM python:3.12-alpine AS base FROM python:3.12-slim-bookworm AS base ENV VIRTUAL_ENV=/app/.venv \ PATH="/app/.venv/bin:$PATH" -# RUN apk update && \ -# apk add libpq - - FROM base AS builder ENV POETRY_NO_INTERACTION=1 \ @@ -27,9 +10,6 @@ ENV POETRY_NO_INTERACTION=1 \ POETRY_VIRTUALENVS_CREATE=1 \ POETRY_CACHE_DIR=/tmp/poetry_cache -# RUN apk update && \ -# apk add musl-dev build-base gcc gfortran openblas-dev - WORKDIR /app RUN pip install --no-cache-dir poetry==1.8.4 @@ -52,5 +32,4 @@ EXPOSE 8500 ENV PORT=8500 -# TODO: Vary entrypoint to include save mode ENTRYPOINT ["python", "-m", "arflow._cli", "view"] diff --git a/python/benchmarks/BENCHMARKING.md b/python/benchmarks/BENCHMARKING.md index aad838a..f2e38f8 100644 --- a/python/benchmarks/BENCHMARKING.md +++ b/python/benchmarks/BENCHMARKING.md @@ -19,8 +19,8 @@ significantly improve system throughput under high concurrent loads by ZZ% craft a representative, complex payload of data to benchmark. -3 scenarios: light, medium, heavy, mixed load. the first 3 are homogeneous -batches of data meaning the AR frames passed in should be of one type only. With -mixed load, it's a round-robin between homogeneous frames which is -representative of the typical ARFlow client-server interaction. This round-robin -comes from `ghz`. See +3 scenarios: light, heavy, mixed load. the first 3 are homogeneous batches of +data meaning the AR frames passed in should be of one type only. With mixed +load, it's a round-robin between homogeneous frames which is representative of +the typical ARFlow client-server interaction. This round-robin comes from `ghz`. +See diff --git a/python/benchmarks/analyze.sh b/python/benchmarks/analyze.sh index e3d7404..a6a3791 100755 --- a/python/benchmarks/analyze.sh +++ b/python/benchmarks/analyze.sh @@ -19,8 +19,9 @@ $(git log -1 --pretty="%h %cD %cn %s") - GRPC_SERVER_RAM=${GRPC_SERVER_RAM} - GRPC_CLIENT_CONNECTIONS=${GRPC_CLIENT_CONNECTIONS} - GRPC_CLIENT_CONCURRENCY=${GRPC_CLIENT_CONCURRENCY} -- GRPC_CLIENT_QPS=${GRPC_CLIENT_QPS} +- GRPC_CLIENT_RPS=${GRPC_CLIENT_RPS} - GRPC_CLIENT_CPUS=${GRPC_CLIENT_CPUS} +- GRPC_CLIENT_FRAMES_PER_REQUEST=${GRPC_CLIENT_FRAMES_PER_REQUEST} - GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO} - GRPC_GHZ_TAG=${GRPC_GHZ_TAG} EOF diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.report b/python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.report new file mode 100644 index 0000000..68872b0 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.report @@ -0,0 +1,35 @@ + +Summary: + Count: 1199 + Total: 60.01 s + Slowest: 51.18 ms + Fastest: 21.35 ms + Average: 31.08 ms + Requests/sec: 19.98 + +Response time histogram: + 21.352 [1] | + 24.336 [54] |∎∎∎∎∎ + 27.319 [144] |∎∎∎∎∎∎∎∎∎∎∎∎∎ + 30.302 [280] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 33.285 [427] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 36.268 [196] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 39.251 [63] |∎∎∎∎∎∎ + 42.234 [20] |∎∎ + 45.217 [12] |∎ + 48.200 [0] | + 51.183 [2] | + +Latency distribution: + 10 % in 25.61 ms + 25 % in 28.83 ms + 50 % in 31.02 ms + 75 % in 33.23 ms + 90 % in 35.79 ms + 95 % in 37.62 ms + 99 % in 42.88 ms + +Status code distribution: + [OK] 1199 responses + + diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.stats b/python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.stats new file mode 100644 index 0000000..4ec8895 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205146/arflow_server_bench.stats @@ -0,0 +1,9 @@ +93.57% 333.5MiB / 4GiB +82.20% 328.7MiB / 4GiB +82.58% 302MiB / 4GiB +79.53% 327MiB / 4GiB +79.22% 332.3MiB / 4GiB +78.96% 329.4MiB / 4GiB +82.16% 309.2MiB / 4GiB +79.62% 329.1MiB / 4GiB +77.09% 333.5MiB / 4GiB diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205146/bench.params b/python/benchmarks/archived_results/batching/heavy/250222T205146/bench.params new file mode 100644 index 0000000..361c816 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205146/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +a896bbc Sat, 22 Feb 2025 19:16:24 -0500 felixngfender test(server): add color modality to saving AR frames test +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.report b/python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.report new file mode 100644 index 0000000..5f74036 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.report @@ -0,0 +1,42 @@ + +Summary: + Count: 10602 + Total: 60.00 s + Slowest: 77.30 ms + Fastest: 4.40 ms + Average: 28.08 ms + Requests/sec: 176.70 + +Response time histogram: + 4.396 [1] | + 11.687 [1581] |∎∎∎∎∎∎∎∎∎∎∎ + 18.977 [5870] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 26.267 [149] |∎ + 33.557 [1] | + 40.847 [0] | + 48.138 [0] | + 55.428 [2] | + 62.718 [737] |∎∎∎∎∎ + 70.008 [2135] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 77.298 [121] |∎ + +Latency distribution: + 10 % in 11.12 ms + 25 % in 12.60 ms + 50 % in 14.71 ms + 75 % in 61.37 ms + 90 % in 65.74 ms + 95 % in 67.43 ms + 99 % in 70.23 ms + +Status code distribution: + [Unavailable] 5 responses + [OK] 10597 responses + +Error distribution: + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:58822->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:58838->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:58830->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:58808->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:58814->127.0.0.1:50051: use of closed network connection + diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.stats b/python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.stats new file mode 100644 index 0000000..148f84c --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205311/arflow_server_bench.stats @@ -0,0 +1,9 @@ +104.69% 104.4MiB / 4GiB +103.08% 105.9MiB / 4GiB +102.06% 103.5MiB / 4GiB +102.64% 103.7MiB / 4GiB +102.48% 100.8MiB / 4GiB +101.71% 107MiB / 4GiB +101.63% 102.9MiB / 4GiB +104.59% 101.4MiB / 4GiB +103.40% 105.4MiB / 4GiB diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205311/bench.params b/python/benchmarks/archived_results/batching/heavy/250222T205311/bench.params new file mode 100644 index 0000000..4d4e71e --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205311/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +a896bbc Sat, 22 Feb 2025 19:16:24 -0500 felixngfender test(server): add color modality to saving AR frames test +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=500 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=1 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.report b/python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.report new file mode 100644 index 0000000..28b210b --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 1202 + Total: 60.16 s + Slowest: 58.25 ms + Fastest: 21.73 ms + Average: 31.95 ms + Requests/sec: 19.98 + +Response time histogram: + 21.729 [1] | + 25.380 [83] |∎∎∎∎∎∎ + 29.032 [135] |∎∎∎∎∎∎∎∎∎∎ + 32.684 [517] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 36.336 [306] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 39.988 [112] |∎∎∎∎∎∎∎∎∎ + 43.640 [28] |∎∎ + 47.292 [12] |∎ + 50.944 [3] | + 54.596 [1] | + 58.247 [1] | + +Latency distribution: + 10 % in 26.51 ms + 25 % in 29.80 ms + 50 % in 31.71 ms + 75 % in 34.17 ms + 90 % in 37.14 ms + 95 % in 39.38 ms + 99 % in 44.79 ms + +Status code distribution: + [Canceled] 3 responses + [OK] 1199 responses + +Error distribution: + [3] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.stats b/python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.stats new file mode 100644 index 0000000..5199b51 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205435/arflow_server_bench.stats @@ -0,0 +1,10 @@ +94.39% 233.1MiB / 4GiB +87.78% 222.2MiB / 4GiB +80.97% 228.4MiB / 4GiB +87.68% 222MiB / 4GiB +79.13% 189.7MiB / 4GiB +78.33% 221.5MiB / 4GiB +77.12% 222.9MiB / 4GiB +79.87% 221.7MiB / 4GiB +78.39% 235.7MiB / 4GiB +64.24% 32.7MiB / 4GiB diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205435/bench.params b/python/benchmarks/archived_results/batching/heavy/250222T205435/bench.params new file mode 100644 index 0000000..4bd5c79 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205435/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +a896bbc Sat, 22 Feb 2025 19:16:24 -0500 felixngfender test(server): add color modality to saving AR frames test +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.report b/python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.report new file mode 100644 index 0000000..3306ba3 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.report @@ -0,0 +1,39 @@ + +Summary: + Count: 20530 + Total: 60.01 s + Slowest: 31.65 ms + Fastest: 4.65 ms + Average: 14.40 ms + Requests/sec: 342.12 + +Response time histogram: + 4.649 [1] | + 7.349 [17] | + 10.049 [708] |∎∎∎ + 12.749 [5070] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 15.449 [8121] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 18.149 [4777] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 20.849 [1490] |∎∎∎∎∎∎∎ + 23.549 [288] |∎ + 26.249 [46] | + 28.949 [8] | + 31.649 [2] | + +Latency distribution: + 10 % in 11.10 ms + 25 % in 12.51 ms + 50 % in 14.20 ms + 75 % in 16.06 ms + 90 % in 17.94 ms + 95 % in 19.11 ms + 99 % in 21.65 ms + +Status code distribution: + [OK] 20528 responses + [Unavailable] 2 responses + +Error distribution: + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:38940->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:38990->127.0.0.1:50051: use of closed network connection + diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.stats b/python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.stats new file mode 100644 index 0000000..639aad7 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205559/arflow_server_bench.stats @@ -0,0 +1,10 @@ +203.69% 104.9MiB / 4GiB +208.07% 104.5MiB / 4GiB +204.39% 102.7MiB / 4GiB +205.26% 106.9MiB / 4GiB +206.77% 102.5MiB / 4GiB +207.66% 104.7MiB / 4GiB +207.64% 104.7MiB / 4GiB +207.93% 73.71MiB / 4GiB +210.36% 63.95MiB / 4GiB +91.95% 87.62MiB / 4GiB diff --git a/python/benchmarks/archived_results/batching/heavy/250222T205559/bench.params b/python/benchmarks/archived_results/batching/heavy/250222T205559/bench.params new file mode 100644 index 0000000..58f5f26 --- /dev/null +++ b/python/benchmarks/archived_results/batching/heavy/250222T205559/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +a896bbc Sat, 22 Feb 2025 19:16:24 -0500 felixngfender test(server): add color modality to saving AR frames test +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=500 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=1 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.report new file mode 100644 index 0000000..42fe5ed --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 1201 + Total: 60.11 s + Slowest: 40.26 ms + Fastest: 19.73 ms + Average: 26.39 ms + Requests/sec: 19.98 + +Response time histogram: + 19.732 [1] | + 21.785 [85] |∎∎∎∎∎∎∎∎∎ + 23.838 [201] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 25.891 [187] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 27.944 [383] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 29.998 [204] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 32.051 [83] |∎∎∎∎∎∎∎∎∎ + 34.104 [38] |∎∎∎∎ + 36.157 [12] |∎ + 38.210 [1] | + 40.263 [4] | + +Latency distribution: + 10 % in 22.14 ms + 25 % in 23.98 ms + 50 % in 26.61 ms + 75 % in 28.22 ms + 90 % in 30.33 ms + 95 % in 31.89 ms + 99 % in 34.78 ms + +Status code distribution: + [OK] 1199 responses + [Canceled] 2 responses + +Error distribution: + [2] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.stats new file mode 100644 index 0000000..8595fe1 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/arflow_server_bench.stats @@ -0,0 +1,9 @@ +72.34% 272.2MiB / 4GiB +69.77% 183.7MiB / 4GiB +70.47% 245MiB / 4GiB +69.62% 261.7MiB / 4GiB +68.88% 269.2MiB / 4GiB +68.70% 280MiB / 4GiB +71.50% 252MiB / 4GiB +70.74% 263.7MiB / 4GiB +70.39% 261MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/bench.params new file mode 100644 index 0000000..94974bc --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134153/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.report new file mode 100644 index 0000000..002a19c --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 600 + Total: 60.11 s + Slowest: 76.02 ms + Fastest: 41.28 ms + Average: 50.25 ms + Requests/sec: 9.98 + +Response time histogram: + 41.283 [1] | + 44.757 [99] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 48.230 [166] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 51.704 [95] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 55.177 [129] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 58.651 [59] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 62.124 [31] |∎∎∎∎∎∎∎ + 65.598 [6] |∎ + 69.071 [5] |∎ + 72.545 [3] |∎ + 76.019 [5] |∎ + +Latency distribution: + 10 % in 43.75 ms + 25 % in 45.62 ms + 50 % in 49.53 ms + 75 % in 53.90 ms + 90 % in 57.59 ms + 95 % in 60.41 ms + 99 % in 72.39 ms + +Status code distribution: + [OK] 599 responses + [Canceled] 1 responses + +Error distribution: + [1] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.stats new file mode 100644 index 0000000..fd4247f --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/arflow_server_bench.stats @@ -0,0 +1,10 @@ +71.02% 310.2MiB / 4GiB +63.35% 337.4MiB / 4GiB +62.70% 330.8MiB / 4GiB +62.04% 332.7MiB / 4GiB +64.68% 332.7MiB / 4GiB +65.44% 271.8MiB / 4GiB +63.85% 308.5MiB / 4GiB +63.37% 328.6MiB / 4GiB +64.26% 318.6MiB / 4GiB +49.98% 331.9MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/bench.params new file mode 100644 index 0000000..a6df1a1 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134316/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=10 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=30 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.report new file mode 100644 index 0000000..42e35ee --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 300 + Total: 60.20 s + Slowest: 153.99 ms + Fastest: 79.79 ms + Average: 94.99 ms + Requests/sec: 4.98 + +Response time histogram: + 79.787 [1] | + 87.207 [43] |∎∎∎∎∎∎∎∎∎∎∎∎∎ + 94.628 [132] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 102.048 [81] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 109.469 [22] |∎∎∎∎∎∎∎ + 116.889 [5] |∎∎ + 124.310 [3] |∎ + 131.730 [4] |∎ + 139.151 [5] |∎∎ + 146.571 [0] | + 153.992 [3] |∎ + +Latency distribution: + 10 % in 85.91 ms + 25 % in 88.99 ms + 50 % in 93.20 ms + 75 % in 97.42 ms + 90 % in 105.32 ms + 95 % in 120.43 ms + 99 % in 146.59 ms + +Status code distribution: + [OK] 299 responses + [Canceled] 1 responses + +Error distribution: + [1] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.stats new file mode 100644 index 0000000..7bb8710 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/arflow_server_bench.stats @@ -0,0 +1,10 @@ +64.40% 655.3MiB / 4GiB +69.23% 557.6MiB / 4GiB +63.15% 626.3MiB / 4GiB +63.41% 621.1MiB / 4GiB +64.06% 627.2MiB / 4GiB +61.75% 627.2MiB / 4GiB +69.23% 603MiB / 4GiB +59.87% 608.7MiB / 4GiB +61.95% 675MiB / 4GiB +63.69% 632.4MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/bench.params new file mode 100644 index 0000000..cc53a9d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134441/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=5 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=60 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.report new file mode 100644 index 0000000..87c3dbc --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 1200 + Total: 60.06 s + Slowest: 46.06 ms + Fastest: 20.62 ms + Average: 28.58 ms + Requests/sec: 19.98 + +Response time histogram: + 20.623 [1] | + 23.166 [75] |∎∎∎∎∎∎ + 25.710 [83] |∎∎∎∎∎∎∎ + 28.253 [356] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 30.796 [479] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 33.340 [158] |∎∎∎∎∎∎∎∎∎∎∎∎∎ + 35.883 [27] |∎∎ + 38.426 [5] | + 40.970 [7] |∎ + 43.513 [2] | + 46.056 [6] |∎ + +Latency distribution: + 10 % in 24.25 ms + 25 % in 27.40 ms + 50 % in 28.67 ms + 75 % in 30.09 ms + 90 % in 31.74 ms + 95 % in 33.04 ms + 99 % in 39.60 ms + +Status code distribution: + [OK] 1199 responses + [Canceled] 1 responses + +Error distribution: + [1] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.stats new file mode 100644 index 0000000..ae6f966 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/arflow_server_bench.stats @@ -0,0 +1,9 @@ +79.79% 215.3MiB / 4GiB +74.15% 215MiB / 4GiB +72.19% 222.7MiB / 4GiB +73.83% 220.8MiB / 4GiB +74.20% 184.8MiB / 4GiB +75.06% 220.1MiB / 4GiB +75.31% 242.2MiB / 4GiB +74.30% 217.7MiB / 4GiB +74.42% 222.7MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/bench.params new file mode 100644 index 0000000..09d6141 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134607/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.report new file mode 100644 index 0000000..2f25350 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 600 + Total: 60.12 s + Slowest: 77.98 ms + Fastest: 46.80 ms + Average: 53.45 ms + Requests/sec: 9.98 + +Response time histogram: + 46.800 [1] | + 49.918 [95] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 53.037 [238] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 56.155 [141] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 59.273 [78] |∎∎∎∎∎∎∎∎∎∎∎∎∎ + 62.392 [21] |∎∎∎∎ + 65.510 [9] |∎∎ + 68.628 [6] |∎ + 71.746 [2] | + 74.865 [5] |∎ + 77.983 [3] |∎ + +Latency distribution: + 10 % in 49.35 ms + 25 % in 50.57 ms + 50 % in 52.46 ms + 75 % in 55.36 ms + 90 % in 58.51 ms + 95 % in 61.30 ms + 99 % in 72.95 ms + +Status code distribution: + [OK] 599 responses + [Canceled] 1 responses + +Error distribution: + [1] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.stats new file mode 100644 index 0000000..23506ad --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/arflow_server_bench.stats @@ -0,0 +1,10 @@ +71.27% 232.6MiB / 4GiB +69.11% 258.8MiB / 4GiB +67.49% 246.6MiB / 4GiB +67.21% 241.5MiB / 4GiB +67.30% 233.7MiB / 4GiB +69.26% 218.4MiB / 4GiB +67.90% 268.3MiB / 4GiB +67.36% 241.7MiB / 4GiB +66.30% 241.4MiB / 4GiB +52.44% 226.9MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/bench.params new file mode 100644 index 0000000..677755d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134730/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=10 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=30 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.report new file mode 100644 index 0000000..8489a00 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.report @@ -0,0 +1,35 @@ + +Summary: + Count: 299 + Total: 60.01 s + Slowest: 155.71 ms + Fastest: 76.37 ms + Average: 92.35 ms + Requests/sec: 4.98 + +Response time histogram: + 76.371 [1] | + 84.304 [51] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 92.238 [127] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 100.171 [91] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 108.105 [13] |∎∎∎∎ + 116.038 [4] |∎ + 123.972 [1] | + 131.905 [0] | + 139.839 [6] |∎∎ + 147.772 [2] |∎ + 155.706 [3] |∎ + +Latency distribution: + 10 % in 81.92 ms + 25 % in 86.05 ms + 50 % in 90.53 ms + 75 % in 95.83 ms + 90 % in 100.12 ms + 95 % in 112.63 ms + 99 % in 148.40 ms + +Status code distribution: + [OK] 299 responses + + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.stats new file mode 100644 index 0000000..1bf2bb9 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/arflow_server_bench.stats @@ -0,0 +1,10 @@ +63.57% 595.6MiB / 4GiB +73.22% 538MiB / 4GiB +60.13% 608.7MiB / 4GiB +60.48% 643MiB / 4GiB +62.14% 613.4MiB / 4GiB +60.98% 614.4MiB / 4GiB +66.92% 523.1MiB / 4GiB +57.75% 613.5MiB / 4GiB +60.45% 640.2MiB / 4GiB +61.83% 613.8MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/bench.params new file mode 100644 index 0000000..ceb9d8e --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/heavy/250222T134855/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=5 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=60 +- GRPC_REQUEST_SCENARIO=heavy +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.report new file mode 100644 index 0000000..2b245dc --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 1202 + Total: 60.16 s + Slowest: 2.55 ms + Fastest: 1.34 ms + Average: 1.75 ms + Requests/sec: 19.98 + +Response time histogram: + 1.342 [1] | + 1.463 [38] |∎∎∎∎ + 1.584 [132] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 1.706 [338] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 1.827 [372] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 1.948 [171] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.069 [77] |∎∎∎∎∎∎∎∎ + 2.191 [41] |∎∎∎∎ + 2.312 [17] |∎∎ + 2.433 [9] |∎ + 2.555 [3] | + +Latency distribution: + 10 % in 1.55 ms + 25 % in 1.64 ms + 50 % in 1.73 ms + 75 % in 1.84 ms + 90 % in 1.98 ms + 95 % in 2.09 ms + 99 % in 2.32 ms + +Status code distribution: + [OK] 1199 responses + [Canceled] 3 responses + +Error distribution: + [3] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.stats new file mode 100644 index 0000000..b621fed --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/arflow_server_bench.stats @@ -0,0 +1,9 @@ +4.88% 90.86MiB / 4GiB +5.71% 90.65MiB / 4GiB +5.50% 90.42MiB / 4GiB +5.61% 91.17MiB / 4GiB +5.42% 90.43MiB / 4GiB +5.41% 90.69MiB / 4GiB +5.46% 90.7MiB / 4GiB +5.47% 90.96MiB / 4GiB +5.43% 90.72MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/bench.params new file mode 100644 index 0000000..47b9640 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132240/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=light +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.report new file mode 100644 index 0000000..f7d3c06 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 600 + Total: 60.11 s + Slowest: 2.62 ms + Fastest: 1.57 ms + Average: 1.97 ms + Requests/sec: 9.98 + +Response time histogram: + 1.567 [1] | + 1.673 [13] |∎∎∎ + 1.779 [43] |∎∎∎∎∎∎∎∎∎∎ + 1.884 [133] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 1.990 [179] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.096 [102] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.202 [59] |∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.307 [35] |∎∎∎∎∎∎∎∎ + 2.413 [20] |∎∎∎∎ + 2.519 [10] |∎∎ + 2.624 [4] |∎ + +Latency distribution: + 10 % in 1.78 ms + 25 % in 1.86 ms + 50 % in 1.95 ms + 75 % in 2.06 ms + 90 % in 2.22 ms + 95 % in 2.34 ms + 99 % in 2.49 ms + +Status code distribution: + [OK] 599 responses + [Canceled] 1 responses + +Error distribution: + [1] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.stats new file mode 100644 index 0000000..982147a --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/arflow_server_bench.stats @@ -0,0 +1,9 @@ +3.13% 90.55MiB / 4GiB +3.84% 90.33MiB / 4GiB +3.79% 90.11MiB / 4GiB +3.62% 90.34MiB / 4GiB +3.50% 90.34MiB / 4GiB +3.54% 90.1MiB / 4GiB +3.69% 90.11MiB / 4GiB +3.86% 90.11MiB / 4GiB +3.63% 90.37MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/bench.params new file mode 100644 index 0000000..2012ec0 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132403/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=10 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=30 +- GRPC_REQUEST_SCENARIO=light +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.report new file mode 100644 index 0000000..ac19e9d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 302 + Total: 60.61 s + Slowest: 3.13 ms + Fastest: 1.96 ms + Average: 2.32 ms + Requests/sec: 4.98 + +Response time histogram: + 1.959 [1] | + 2.076 [7] |∎∎∎ + 2.193 [49] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.310 [82] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.427 [80] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.544 [41] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.661 [23] |∎∎∎∎∎∎∎∎∎∎∎ + 2.778 [10] |∎∎∎∎∎ + 2.895 [4] |∎∎ + 3.012 [1] | + 3.129 [1] | + +Latency distribution: + 10 % in 2.15 ms + 25 % in 2.22 ms + 50 % in 2.32 ms + 75 % in 2.44 ms + 90 % in 2.59 ms + 95 % in 2.70 ms + 99 % in 2.87 ms + +Status code distribution: + [OK] 299 responses + [Canceled] 3 responses + +Error distribution: + [3] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.stats new file mode 100644 index 0000000..326bf5e --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/arflow_server_bench.stats @@ -0,0 +1,10 @@ +2.47% 89.94MiB / 4GiB +3.03% 90.22MiB / 4GiB +2.99% 90MiB / 4GiB +2.81% 90.04MiB / 4GiB +2.99% 90.53MiB / 4GiB +2.79% 90.53MiB / 4GiB +3.03% 90.52MiB / 4GiB +2.79% 90.04MiB / 4GiB +2.70% 90.04MiB / 4GiB +2.08% 90.03MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/bench.params new file mode 100644 index 0000000..75c2a6d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132526/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=5 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=60 +- GRPC_REQUEST_SCENARIO=light +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.report new file mode 100644 index 0000000..fb1d1f2 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.report @@ -0,0 +1,35 @@ + +Summary: + Count: 1199 + Total: 60.01 s + Slowest: 2.75 ms + Fastest: 1.32 ms + Average: 1.74 ms + Requests/sec: 19.98 + +Response time histogram: + 1.319 [1] | + 1.462 [36] |∎∎∎ + 1.605 [171] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 1.749 [466] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 1.892 [341] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.035 [112] |∎∎∎∎∎∎∎∎∎∎ + 2.178 [51] |∎∎∎∎ + 2.322 [12] |∎ + 2.465 [7] |∎ + 2.608 [1] | + 2.751 [1] | + +Latency distribution: + 10 % in 1.55 ms + 25 % in 1.64 ms + 50 % in 1.72 ms + 75 % in 1.82 ms + 90 % in 1.97 ms + 95 % in 2.06 ms + 99 % in 2.27 ms + +Status code distribution: + [OK] 1199 responses + + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.stats new file mode 100644 index 0000000..c2af137 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/arflow_server_bench.stats @@ -0,0 +1,9 @@ +4.85% 90.43MiB / 4GiB +5.52% 90.96MiB / 4GiB +5.54% 89.97MiB / 4GiB +5.54% 89.95MiB / 4GiB +5.48% 90.2MiB / 4GiB +5.50% 90.21MiB / 4GiB +5.31% 90.48MiB / 4GiB +5.43% 89.98MiB / 4GiB +5.20% 89.98MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/bench.params new file mode 100644 index 0000000..f71ace4 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132650/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=light +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.report new file mode 100644 index 0000000..355d6b7 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.report @@ -0,0 +1,35 @@ + +Summary: + Count: 599 + Total: 60.01 s + Slowest: 2.78 ms + Fastest: 1.57 ms + Average: 1.97 ms + Requests/sec: 9.98 + +Response time histogram: + 1.569 [1] | + 1.690 [24] |∎∎∎∎∎ + 1.811 [80] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 1.932 [184] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.053 [155] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.174 [78] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.295 [40] |∎∎∎∎∎∎∎∎∎ + 2.416 [23] |∎∎∎∎∎ + 2.538 [10] |∎∎ + 2.659 [3] |∎ + 2.780 [1] | + +Latency distribution: + 10 % in 1.77 ms + 25 % in 1.85 ms + 50 % in 1.94 ms + 75 % in 2.06 ms + 90 % in 2.20 ms + 95 % in 2.34 ms + 99 % in 2.48 ms + +Status code distribution: + [OK] 599 responses + + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.stats new file mode 100644 index 0000000..1ab0578 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/arflow_server_bench.stats @@ -0,0 +1,9 @@ +3.09% 90.82MiB / 4GiB +3.92% 90.61MiB / 4GiB +3.80% 90.62MiB / 4GiB +3.77% 90.43MiB / 4GiB +3.64% 90.45MiB / 4GiB +3.66% 90.69MiB / 4GiB +3.73% 90.45MiB / 4GiB +3.82% 90.47MiB / 4GiB +3.61% 90.69MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/bench.params new file mode 100644 index 0000000..48def1a --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132813/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=10 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=30 +- GRPC_REQUEST_SCENARIO=light +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.report new file mode 100644 index 0000000..83ed5c4 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 304 + Total: 61.01 s + Slowest: 3.17 ms + Fastest: 2.03 ms + Average: 2.33 ms + Requests/sec: 4.98 + +Response time histogram: + 2.028 [1] |∎ + 2.143 [29] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.257 [75] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.371 [59] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.486 [59] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.600 [37] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 2.715 [20] |∎∎∎∎∎∎∎∎∎∎∎ + 2.829 [11] |∎∎∎∎∎∎ + 2.943 [4] |∎∎ + 3.058 [2] |∎ + 3.172 [2] |∎ + +Latency distribution: + 10 % in 2.14 ms + 25 % in 2.23 ms + 50 % in 2.34 ms + 75 % in 2.49 ms + 90 % in 2.64 ms + 95 % in 2.75 ms + 99 % in 3.01 ms + +Status code distribution: + [OK] 299 responses + [Canceled] 5 responses + +Error distribution: + [5] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.stats new file mode 100644 index 0000000..742588d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/arflow_server_bench.stats @@ -0,0 +1,10 @@ +2.46% 90.22MiB / 4GiB +2.99% 90.26MiB / 4GiB +2.94% 90.05MiB / 4GiB +2.88% 90.08MiB / 4GiB +2.84% 90.58MiB / 4GiB +2.80% 90.33MiB / 4GiB +2.80% 90.09MiB / 4GiB +2.83% 90.34MiB / 4GiB +2.73% 90.57MiB / 4GiB +2.12% 90.07MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/bench.params new file mode 100644 index 0000000..ce96eee --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/light/250222T132936/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=5 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=60 +- GRPC_REQUEST_SCENARIO=light +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.report new file mode 100644 index 0000000..39d1299 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.report @@ -0,0 +1,42 @@ + +Summary: + Count: 2010 + Total: 60.03 s + Slowest: 586.12 ms + Fastest: 1.76 ms + Average: 147.11 ms + Requests/sec: 33.48 + +Response time histogram: + 1.759 [1] | + 60.195 [662] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 118.632 [345] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 177.068 [21] |∎ + 235.505 [374] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 293.941 [353] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 352.378 [219] |∎∎∎∎∎∎∎∎∎∎∎∎∎ + 410.814 [18] |∎ + 469.251 [1] | + 527.688 [9] |∎ + 586.124 [2] | + +Latency distribution: + 10 % in 5.72 ms + 25 % in 12.04 ms + 50 % in 111.23 ms + 75 % in 279.79 ms + 90 % in 296.76 ms + 95 % in 302.16 ms + 99 % in 392.40 ms + +Status code distribution: + [OK] 2005 responses + [Unavailable] 5 responses + +Error distribution: + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:47948->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:47906->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:47916->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:47930->127.0.0.1:50051: use of closed network connection + [1] rpc error: code = Unavailable desc = error reading from server: read tcp 127.0.0.1:47936->127.0.0.1:50051: use of closed network connection + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.stats new file mode 100644 index 0000000..7e84c71 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/arflow_server_bench.stats @@ -0,0 +1,9 @@ +102.33% 279.1MiB / 4GiB +101.07% 313.2MiB / 4GiB +101.15% 376.9MiB / 4GiB +101.12% 293.9MiB / 4GiB +100.88% 322.4MiB / 4GiB +100.41% 292.3MiB / 4GiB +101.43% 340.6MiB / 4GiB +101.66% 336.5MiB / 4GiB +103.43% 290.6MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/bench.params new file mode 100644 index 0000000..ce3bda3 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135353/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=40 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=mixed +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.report new file mode 100644 index 0000000..a09cb6d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.report @@ -0,0 +1,35 @@ + +Summary: + Count: 1199 + Total: 60.01 s + Slowest: 277.52 ms + Fastest: 1.48 ms + Average: 29.07 ms + Requests/sec: 19.98 + +Response time histogram: + 1.480 [1] | + 29.083 [597] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 56.687 [475] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 84.291 [98] |∎∎∎∎∎∎∎ + 111.894 [16] |∎ + 139.498 [1] | + 167.102 [1] | + 194.705 [5] | + 222.309 [1] | + 249.913 [1] | + 277.517 [3] | + +Latency distribution: + 10 % in 1.86 ms + 25 % in 2.17 ms + 50 % in 41.41 ms + 75 % in 50.27 ms + 90 % in 56.93 ms + 95 % in 62.13 ms + 99 % in 120.81 ms + +Status code distribution: + [OK] 1199 responses + + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.stats new file mode 100644 index 0000000..c1f5458 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/arflow_server_bench.stats @@ -0,0 +1,9 @@ +100.00% 587.7MiB / 4GiB +69.27% 526.6MiB / 4GiB +70.18% 524.3MiB / 4GiB +66.02% 513.6MiB / 4GiB +77.83% 443.8MiB / 4GiB +68.07% 505MiB / 4GiB +67.17% 526.3MiB / 4GiB +65.33% 544.6MiB / 4GiB +70.72% 347.6MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/bench.params new file mode 100644 index 0000000..0d4a0da --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135517/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=30 +- GRPC_REQUEST_SCENARIO=mixed +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.report new file mode 100644 index 0000000..e391219 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 602 + Total: 60.31 s + Slowest: 253.45 ms + Fastest: 1.72 ms + Average: 47.26 ms + Requests/sec: 9.98 + +Response time histogram: + 1.725 [1] | + 26.897 [294] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 52.069 [4] |∎ + 77.241 [4] |∎ + 102.413 [269] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 127.585 [13] |∎∎ + 152.757 [10] |∎ + 177.929 [2] | + 203.101 [0] | + 228.273 [1] | + 253.445 [1] | + +Latency distribution: + 10 % in 2.21 ms + 25 % in 2.38 ms + 50 % in 71.62 ms + 75 % in 87.99 ms + 90 % in 94.85 ms + 95 % in 101.47 ms + 99 % in 141.05 ms + +Status code distribution: + [OK] 599 responses + [Canceled] 3 responses + +Error distribution: + [3] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.stats new file mode 100644 index 0000000..2a5752d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/arflow_server_bench.stats @@ -0,0 +1,10 @@ +91.36% 521.3MiB / 4GiB +62.39% 491.2MiB / 4GiB +59.53% 479.7MiB / 4GiB +63.80% 507.5MiB / 4GiB +62.79% 484MiB / 4GiB +62.66% 487.9MiB / 4GiB +63.32% 491.3MiB / 4GiB +63.02% 506.5MiB / 4GiB +60.12% 507.6MiB / 4GiB +43.23% 492.1MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/bench.params new file mode 100644 index 0000000..6ca636d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135641/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=1 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=10 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=60 +- GRPC_REQUEST_SCENARIO=mixed +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.report new file mode 100644 index 0000000..a79c049 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.report @@ -0,0 +1,35 @@ + +Summary: + Count: 2399 + Total: 60.00 s + Slowest: 63.46 ms + Fastest: 1.44 ms + Average: 15.73 ms + Requests/sec: 39.98 + +Response time histogram: + 1.444 [1] | + 7.646 [1197] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 13.848 [1] | + 20.050 [1] | + 26.252 [50] |∎∎ + 32.454 [1077] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 38.656 [66] |∎∎ + 44.858 [0] | + 51.060 [2] | + 57.262 [2] | + 63.464 [2] | + +Latency distribution: + 10 % in 1.92 ms + 25 % in 2.26 ms + 50 % in 16.76 ms + 75 % in 28.42 ms + 90 % in 30.42 ms + 95 % in 31.36 ms + 99 % in 34.80 ms + +Status code distribution: + [OK] 2399 responses + + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.stats new file mode 100644 index 0000000..e7ef0dd --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/arflow_server_bench.stats @@ -0,0 +1,9 @@ +80.35% 165.9MiB / 4GiB +76.65% 168.7MiB / 4GiB +78.47% 165.8MiB / 4GiB +80.59% 178.6MiB / 4GiB +79.09% 162.7MiB / 4GiB +81.75% 167.8MiB / 4GiB +80.23% 191.9MiB / 4GiB +80.47% 162.7MiB / 4GiB +80.05% 169.9MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/bench.params new file mode 100644 index 0000000..178be67 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135806/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=40 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=15 +- GRPC_REQUEST_SCENARIO=mixed +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.report new file mode 100644 index 0000000..30c640a --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 1200 + Total: 60.06 s + Slowest: 74.95 ms + Fastest: 1.44 ms + Average: 27.20 ms + Requests/sec: 19.98 + +Response time histogram: + 1.438 [1] | + 8.789 [599] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 16.140 [0] | + 23.492 [0] | + 30.843 [0] | + 38.195 [0] | + 45.546 [6] | + 52.898 [387] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 60.249 [178] |∎∎∎∎∎∎∎∎∎∎∎∎ + 67.601 [23] |∎∎ + 74.952 [5] | + +Latency distribution: + 10 % in 1.92 ms + 25 % in 2.26 ms + 50 % in 7.37 ms + 75 % in 51.46 ms + 90 % in 55.15 ms + 95 % in 57.58 ms + 99 % in 63.97 ms + +Status code distribution: + [OK] 1199 responses + [Canceled] 1 responses + +Error distribution: + [1] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.stats new file mode 100644 index 0000000..d50f70d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/arflow_server_bench.stats @@ -0,0 +1,9 @@ +72.94% 202.8MiB / 4GiB +69.57% 228.4MiB / 4GiB +69.73% 206.4MiB / 4GiB +69.34% 206.2MiB / 4GiB +71.26% 192MiB / 4GiB +66.47% 239.4MiB / 4GiB +66.72% 245.1MiB / 4GiB +67.73% 215.3MiB / 4GiB +71.20% 204.9MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/bench.params new file mode 100644 index 0000000..0af531c --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T135929/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=20 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=30 +- GRPC_REQUEST_SCENARIO=mixed +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.report b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.report new file mode 100644 index 0000000..3db7a54 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.report @@ -0,0 +1,38 @@ + +Summary: + Count: 600 + Total: 60.10 s + Slowest: 148.81 ms + Fastest: 1.84 ms + Average: 43.99 ms + Requests/sec: 9.98 + +Response time histogram: + 1.842 [1] | + 16.539 [298] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 31.235 [1] | + 45.932 [0] | + 60.628 [0] | + 75.325 [21] |∎∎∎ + 90.021 [217] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ + 104.718 [45] |∎∎∎∎∎∎ + 119.414 [11] |∎ + 134.111 [3] | + 148.807 [2] | + +Latency distribution: + 10 % in 2.20 ms + 25 % in 2.32 ms + 50 % in 29.19 ms + 75 % in 84.01 ms + 90 % in 90.07 ms + 95 % in 95.71 ms + 99 % in 118.82 ms + +Status code distribution: + [Canceled] 1 responses + [OK] 599 responses + +Error distribution: + [1] rpc error: code = Canceled desc = grpc: the client connection is closing + diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.stats b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.stats new file mode 100644 index 0000000..bd72d5d --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/arflow_server_bench.stats @@ -0,0 +1,10 @@ +89.30% 571.6MiB / 4GiB +62.74% 646.8MiB / 4GiB +59.84% 615.2MiB / 4GiB +60.47% 609.5MiB / 4GiB +61.83% 683.6MiB / 4GiB +56.35% 607.3MiB / 4GiB +57.69% 610.7MiB / 4GiB +58.37% 663.1MiB / 4GiB +55.04% 662.2MiB / 4GiB +39.89% 609.9MiB / 4GiB diff --git a/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/bench.params b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/bench.params new file mode 100644 index 0000000..26bc7e7 --- /dev/null +++ b/python/benchmarks/archived_results/send_interval_payload_size/mixed/250222T140053/bench.params @@ -0,0 +1,13 @@ +Benchmark Execution Parameters: +9a9cc0d Thu, 13 Feb 2025 22:50:41 -0500 felixngfender chore(benchmarks): wip for light, medium, heavy, and mixed load +- GRPC_BENCHMARK_DURATION=60s +- GRPC_BENCHMARK_WARMUP=10s +- GRPC_SERVER_CPUS=2 +- GRPC_SERVER_RAM=4096m +- GRPC_CLIENT_CONNECTIONS=5 +- GRPC_CLIENT_CONCURRENCY=5 +- GRPC_CLIENT_RPS=10 +- GRPC_CLIENT_CPUS=5 +- GRPC_CLIENT_FRAMES_PER_REQUEST=60 +- GRPC_REQUEST_SCENARIO=mixed +- GRPC_GHZ_TAG=0.114.0 diff --git a/python/benchmarks/batching_benchmark.sh b/python/benchmarks/batching_benchmark.sh new file mode 100755 index 0000000..26089ec --- /dev/null +++ b/python/benchmarks/batching_benchmark.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +bash build.sh || exit 1 + +export GRPC_BENCHMARK_DURATION=60s +export GRPC_BENCHMARK_WARMUP=10s +export GRPC_SERVER_RAM=4096m +export GRPC_CLIENT_CPUS=5 +export GRPC_CLIENT_CONCURRENCY=5 +export GRPC_CLIENT_CONNECTIONS=5 +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"heavy"} + +rpss=(20 500) +frames_per_requests=(15 1) + +cpus=0 +while [ $cpus -ne 2 ]; do + cpus=$((cpus + 1)) + for i in "${!rpss[@]}"; do + rps=${rpss[$i]} + frames_per_request=${frames_per_requests[$i]} + + echo "Benchmarking $GRPC_REQUEST_SCENARIO scenario with $cpus CPU(s), RPS=$rps, and Frames Per Request=$frames_per_request" + + GRPC_SERVER_CPUS=$cpus \ + GRPC_CLIENT_RPS=$rps \ + GRPC_CLIENT_FRAMES_PER_REQUEST=$frames_per_request \ + bash bench.sh || exit 2 + sleep 10 + done +done + +echo "Benchmarking finished" \ No newline at end of file diff --git a/python/benchmarks/bench.sh b/python/benchmarks/bench.sh index 50361e6..e129632 100755 --- a/python/benchmarks/bench.sh +++ b/python/benchmarks/bench.sh @@ -7,9 +7,9 @@ export GRPC_SERVER_CPUS=${GRPC_SERVER_CPUS:-"1"} export GRPC_SERVER_RAM=${GRPC_SERVER_RAM:-"512m"} export GRPC_CLIENT_CONNECTIONS=${GRPC_CLIENT_CONNECTIONS:-"50"} export GRPC_CLIENT_CONCURRENCY=${GRPC_CLIENT_CONCURRENCY:-"1000"} -export GRPC_CLIENT_QPS=${GRPC_CLIENT_QPS:-"0"} -export GRPC_CLIENT_QPS=$((GRPC_CLIENT_QPS / GRPC_CLIENT_CONCURRENCY)) +export GRPC_CLIENT_RPS=${GRPC_CLIENT_RPS:-"0"} export GRPC_CLIENT_CPUS=${GRPC_CLIENT_CPUS:-"1"} +export GRPC_CLIENT_FRAMES_PER_REQUEST=${GRPC_CLIENT_FRAMES_PER_REQUEST:-"50"} export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"mixed"} export GRPC_IMAGE_NAME="${GRPC_IMAGE_NAME:-grpc_bench}" export GRPC_GHZ_TAG="${GRPC_GHZ_TAG:-0.114.0}" @@ -37,7 +37,7 @@ echo "==> Running benchmark for ${benchmark}..." mkdir -p "${RESULTS_DIR}" -# Start the local Rerun Viewer TODO: if view mode +# Start the local Rerun Viewer poetry run rerun & # Start the gRPC Server container @@ -78,7 +78,7 @@ docker run --name ghz --rm --network=host -v "${PWD}/../../protos:/protos:ro" \ # Setup the chosen scenario session_id=$(docker logs ${benchmark} | grep -m 1 "value:" | cut -d'"' -f2) -if ! sh setup_scenario.sh $GRPC_REQUEST_SCENARIO true "${session_id}"; then +if ! sh setup_scenario.sh "$GRPC_REQUEST_SCENARIO" true "${session_id}" "$GRPC_CLIENT_FRAMES_PER_REQUEST"; then echo "Scenario setup fiascoed." exit 1 fi @@ -100,7 +100,7 @@ if [[ "${GRPC_BENCHMARK_WARMUP}" != "0s" ]]; then --insecure \ --concurrency="${GRPC_CLIENT_CONCURRENCY}" \ --connections="${GRPC_CLIENT_CONNECTIONS}" \ - --rps="${GRPC_CLIENT_QPS}" \ + --rps="${GRPC_CLIENT_RPS}" \ --duration "${GRPC_BENCHMARK_WARMUP}" \ --data-file /payload/payload \ 127.0.0.1:50051 >/dev/null @@ -129,7 +129,7 @@ docker run --name ghz --rm --network=host -v "${PWD}/../../protos:/protos:ro" \ --insecure \ --concurrency="${GRPC_CLIENT_CONCURRENCY}" \ --connections="${GRPC_CLIENT_CONNECTIONS}" \ - --rps="${GRPC_CLIENT_QPS}" \ + --rps="${GRPC_CLIENT_RPS}" \ --duration "${GRPC_BENCHMARK_DURATION}" \ --data-file /payload/payload \ 127.0.0.1:50051 >"${RESULTS_DIR}/${benchmark}".report diff --git a/python/benchmarks/build.sh b/python/benchmarks/build.sh index 7c011cd..47ab542 100755 --- a/python/benchmarks/build.sh +++ b/python/benchmarks/build.sh @@ -5,12 +5,6 @@ export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"mixed"} export GRPC_IMAGE_NAME="${GRPC_IMAGE_NAME:-grpc_bench}" -# Setup the chosen scenario -if ! sh setup_scenario.sh "$GRPC_REQUEST_SCENARIO" false; then - echo "Scenario setup fiascoed." - exit 1 -fi - benchmark="arflow_server_bench" builds="" echo "==> Building Docker image..." diff --git a/python/benchmarks/generate_payload.py b/python/benchmarks/generate_payload.py index c04ebe1..08c917e 100755 --- a/python/benchmarks/generate_payload.py +++ b/python/benchmarks/generate_payload.py @@ -11,23 +11,14 @@ from google.protobuf.timestamp_pb2 import Timestamp from cakelab.arflow_grpc.v1.ar_frame_pb2 import ARFrame -from cakelab.arflow_grpc.v1.audio_frame_pb2 import AudioFrame from cakelab.arflow_grpc.v1.color_frame_pb2 import ColorFrame -from cakelab.arflow_grpc.v1.depth_frame_pb2 import DepthFrame from cakelab.arflow_grpc.v1.device_pb2 import Device - -# from cakelab.arflow_grpc.v1.gyroscope_frame_pb2 import GyroscopeFrame from cakelab.arflow_grpc.v1.intrinsics_pb2 import Intrinsics - -# from cakelab.arflow_grpc.v1.quaternion_pb2 import Quaternion from cakelab.arflow_grpc.v1.save_ar_frames_request_pb2 import SaveARFramesRequest from cakelab.arflow_grpc.v1.session_pb2 import SessionUuid - -# from cakelab.arflow_grpc.v1.transform_frame_pb2 import TransformFrame +from cakelab.arflow_grpc.v1.transform_frame_pb2 import TransformFrame from cakelab.arflow_grpc.v1.vector2_int_pb2 import Vector2Int from cakelab.arflow_grpc.v1.vector2_pb2 import Vector2 - -# from cakelab.arflow_grpc.v1.vector3_pb2 import Vector3 from cakelab.arflow_grpc.v1.xr_cpu_image_pb2 import XRCpuImage SCENARIOS_DIR = "scenarios" @@ -53,114 +44,160 @@ def main() -> None: choices=scenarios, help="Scenario to generate payload", ) + parser.add_argument( + "--frames-per-request", + required=True, + type=int, + help="Number of AR frames per request", + ) args = parser.parse_args() - frames = [] - if "light" in args.scenario: - # transform sampling interval is 50ms so 20Hz, default send interval is - # 0.5s, so each time we send 10 transform frames - frames = [ - ARFrame( - # transform_frame=TransformFrame( - # device_timestamp=Timestamp(seconds=i, nanos=0), - # data=np.random.rand(12).astype(np.float32).tobytes(), - # ), - # gyroscope_frame=GyroscopeFrame( - # device_timestamp=Timestamp(seconds=i, nanos=0), - # attitude=Quaternion(x=1.0, y=2.0, z=3.0, w=4.0), - # rotation_rate=Vector3(x=1.0, y=2.0, z=3.0), - # gravity=Vector3(x=1.0, y=2.0, z=3.0), - # acceleration=Vector3(x=1.0, y=2.0, z=3.0), - # ), - audio_frame=AudioFrame( - device_timestamp=Timestamp(seconds=i, nanos=0), - data=np.random.rand(4).astype(np.float32).tobytes(), - ) - ) - # TODO: Interesting: different frame lengths yield very - # different results - for i in range(100) - ] - elif "medium" == args.scenario: - # 60fps camera with default 0.5s send interval gives us 30 depth frames - # per request - frames = [ - ARFrame( - depth_frame=DepthFrame( - device_timestamp=Timestamp(seconds=i, nanos=0), - environment_depth_temporal_smoothing_enabled=True, - image=XRCpuImage( - dimensions=Vector2Int(x=4, y=4), - format=XRCpuImage.FORMAT_DEPTHUINT16, - timestamp=0, - planes=[ - XRCpuImage.Plane( - data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - 0, 255, (4, 4), dtype=np.uint16 - ).tobytes(), - ) - ], + round_robin_frames = [] + if "light" == args.scenario: + round_robin_frames = [ + [ + ARFrame( + transform_frame=TransformFrame( + device_timestamp=Timestamp(seconds=i, nanos=0), + data=np.random.rand(12).astype(np.float32).tobytes(), ), - ), - ) - for i in range(30) + ) + for i in range(args.frames_per_request) + ] ] elif "heavy" == args.scenario: - # same here, 30 color frames per request - # TODO: This does not work yet, because of the extra padding on Android - # assumption we make on the server. - frames = [ - ARFrame( - color_frame=ColorFrame( - device_timestamp=Timestamp(seconds=i, nanos=0), - image=XRCpuImage( - dimensions=Vector2Int(x=4, y=4), - format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, - timestamp=0, - planes=[ - XRCpuImage.Plane( - data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - 0, 255, (4, 4), dtype=np.uint8 - ).tobytes(), - pixel_stride=1, - row_stride=4, + width, height = 640, 480 + uv_width, uv_height = width // 2, height // 2 + y_plane_data = np.random.randint( + 0, 256, (height, width), dtype=np.uint8 + ).tobytes() + u_plane_data = np.random.randint( + 0, 256, (uv_height, uv_width), dtype=np.uint8 + ).tobytes()[:-1] # Trim one byte + v_plane_data = np.random.randint( + 0, 256, (uv_height, uv_width), dtype=np.uint8 + ).tobytes()[:-1] # Trim one byte + y_row_stride = width + uv_row_stride = uv_width + y_pixel_stride = 1 + uv_pixel_stride = 1 + round_robin_frames = [ + [ + ARFrame( + color_frame=ColorFrame( + device_timestamp=Timestamp(seconds=i, nanos=0), + image=XRCpuImage( + dimensions=Vector2Int(x=width, y=height), + format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=y_plane_data, + pixel_stride=y_pixel_stride, + row_stride=y_row_stride, + ), + XRCpuImage.Plane( + data=u_plane_data, + pixel_stride=uv_pixel_stride, + row_stride=uv_row_stride, + ), + XRCpuImage.Plane( + data=v_plane_data, + pixel_stride=uv_pixel_stride, + row_stride=uv_row_stride, + ), + ], + ), + intrinsics=Intrinsics( + focal_length=Vector2( + x=1.0, + y=1.0, ), - XRCpuImage.Plane( - data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - 0, 255, (2, 4), dtype=np.uint8 - ).tobytes(), - pixel_stride=2, - row_stride=4, + principal_point=Vector2( + x=1.0, + y=1.0, ), - XRCpuImage.Plane( - data=np.random.randint( # pyright: ignore [reportUnknownMemberType] - 0, 255, (2, 4), dtype=np.uint8 - ).tobytes(), - pixel_stride=2, - row_stride=4, + resolution=Vector2Int( + x=width, + y=height, ), - ], - ), - intrinsics=Intrinsics( - focal_length=Vector2( - x=1.0, - y=1.0, ), - principal_point=Vector2( - x=1.0, - y=1.0, + ) + ) + for i in range(args.frames_per_request) + ] + ] + elif "mixed" == args.scenario: + width, height = 640, 480 + uv_width, uv_height = width // 2, height // 2 + y_plane_data = np.random.randint( + 0, 256, (height, width), dtype=np.uint8 + ).tobytes() + u_plane_data = np.random.randint( + 0, 256, (uv_height, uv_width), dtype=np.uint8 + ).tobytes()[:-1] # Trim one byte + v_plane_data = np.random.randint( + 0, 256, (uv_height, uv_width), dtype=np.uint8 + ).tobytes()[:-1] # Trim one byte + y_row_stride = width + uv_row_stride = uv_width + y_pixel_stride = 1 + uv_pixel_stride = 1 + round_robin_frames = [ + [ + ARFrame( + transform_frame=TransformFrame( + device_timestamp=Timestamp(seconds=i, nanos=0), + data=np.random.rand(12).astype(np.float32).tobytes(), + ), + ) + for i in range(args.frames_per_request) + ], + [ + ARFrame( + color_frame=ColorFrame( + device_timestamp=Timestamp(seconds=i, nanos=0), + image=XRCpuImage( + dimensions=Vector2Int(x=width, y=height), + format=XRCpuImage.FORMAT_ANDROID_YUV_420_888, + timestamp=0, + planes=[ + XRCpuImage.Plane( + data=y_plane_data, + pixel_stride=y_pixel_stride, + row_stride=y_row_stride, + ), + XRCpuImage.Plane( + data=u_plane_data, + pixel_stride=uv_pixel_stride, + row_stride=uv_row_stride, + ), + XRCpuImage.Plane( + data=v_plane_data, + pixel_stride=uv_pixel_stride, + row_stride=uv_row_stride, + ), + ], ), - resolution=Vector2Int( - x=4, - y=4, + intrinsics=Intrinsics( + focal_length=Vector2( + x=1.0, + y=1.0, + ), + principal_point=Vector2( + x=1.0, + y=1.0, + ), + resolution=Vector2Int( + x=width, + y=height, + ), ), - ), + ) ) - ) - for i in range(30) + for i in range(args.frames_per_request) + ], ] - elif "mixed" == args.scenario: - frames = [] else: raise ValueError(f"Invalid scenario: {args.scenario}") @@ -170,30 +207,22 @@ def main() -> None: type=Device.TYPE_HANDHELD, uid="f3131490-dddd-419a-8504-fa8bb55282b2", ) - message = SaveARFramesRequest( - session_id=SessionUuid(value=args.session_id), - device=device, - frames=frames, - ) - message_as_json = MessageToJson( - message=message, preserving_proto_field_name=True, indent=None - ) - os.makedirs(args.scenario, exist_ok=True) + messages = [ + SaveARFramesRequest( + session_id=SessionUuid(value=args.session_id), + device=device, + frames=frames, + ) + for frames in round_robin_frames + ] + messages_as_json = [ + MessageToJson(message=message, preserving_proto_field_name=True, indent=None) + for message in messages + ] + payload_as_json = f"[{','.join(messages_as_json)}]" + os.makedirs(f"{SCENARIOS_DIR}/{args.scenario}", exist_ok=True) with open(f"{SCENARIOS_DIR}/{args.scenario}/payload", "w") as f: - f.write(message_as_json) - - # message = CreateSessionRequest( - # device=device, - # ) - # message_as_json = MessageToJson( - # message=message, preserving_proto_field_name=True, indent=None - # ) - # with open(Path(SCENARIOS_DIR, "session"), "w") as f: - # f.write(message_as_json) - - # message_as_bin = message.SerializeToString() - # with open("bing.bin", "wb") as f: - # f.write(message_as_bin) + f.write(payload_as_json) if __name__ == "__main__": diff --git a/python/benchmarks/scenarios/mixed/payload b/python/benchmarks/scenarios/heavy/.gitkeep similarity index 100% rename from python/benchmarks/scenarios/mixed/payload rename to python/benchmarks/scenarios/heavy/.gitkeep diff --git a/python/benchmarks/scenarios/light/.gitkeep b/python/benchmarks/scenarios/light/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/python/benchmarks/scenarios/light/payload b/python/benchmarks/scenarios/light/payload deleted file mode 100644 index 05c6c50..0000000 --- a/python/benchmarks/scenarios/light/payload +++ /dev/null @@ -1 +0,0 @@ -{"session_id": {"value": "86e2f561-70eb-42e2-abc0-6ef70ddcb8fc"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{"audio_frame": {"device_timestamp": "1970-01-01T00:00:00Z", "data": [160.0, 46.0, 201.0, 61.0, 78.0, 33.0, 177.0, 62.0, 215.0, 147.0, 107.0, 63.0, 93.0, 228.0, 105.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:01Z", "data": [143.0, 51.0, 41.0, 61.0, 173.0, 117.0, 60.0, 61.0, 9.0, 40.0, 130.0, 61.0, 170.0, 196.0, 38.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:02Z", "data": [140.0, 211.0, 227.0, 62.0, 31.0, 146.0, 44.0, 63.0, 15.0, 45.0, 216.0, 62.0, 243.0, 86.0, 72.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:03Z", "data": [117.0, 58.0, 28.0, 63.0, 105.0, 77.0, 1.0, 62.0, 74.0, 217.0, 117.0, 63.0, 12.0, 119.0, 200.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:04Z", "data": [242.0, 96.0, 123.0, 63.0, 205.0, 48.0, 85.0, 62.0, 7.0, 176.0, 47.0, 62.0, 135.0, 220.0, 232.0, 60.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:05Z", "data": [189.0, 213.0, 63.0, 63.0, 98.0, 174.0, 183.0, 62.0, 118.0, 203.0, 70.0, 63.0, 15.0, 183.0, 208.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:06Z", "data": [231.0, 100.0, 229.0, 60.0, 30.0, 109.0, 22.0, 63.0, 73.0, 115.0, 25.0, 62.0, 60.0, 124.0, 103.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:07Z", "data": [20.0, 61.0, 8.0, 63.0, 228.0, 119.0, 130.0, 62.0, 96.0, 115.0, 51.0, 63.0, 178.0, 85.0, 141.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:08Z", "data": [82.0, 179.0, 54.0, 63.0, 242.0, 208.0, 56.0, 63.0, 248.0, 118.0, 197.0, 61.0, 245.0, 81.0, 33.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:09Z", "data": [150.0, 114.0, 3.0, 63.0, 102.0, 5.0, 221.0, 62.0, 243.0, 90.0, 125.0, 63.0, 25.0, 249.0, 34.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:10Z", "data": [171.0, 194.0, 11.0, 63.0, 26.0, 150.0, 225.0, 62.0, 192.0, 207.0, 54.0, 62.0, 213.0, 74.0, 81.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:11Z", "data": [47.0, 244.0, 209.0, 61.0, 57.0, 145.0, 89.0, 63.0, 95.0, 32.0, 67.0, 63.0, 133.0, 219.0, 1.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:12Z", "data": [224.0, 229.0, 230.0, 62.0, 72.0, 59.0, 101.0, 63.0, 251.0, 221.0, 180.0, 62.0, 74.0, 204.0, 117.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:13Z", "data": [36.0, 130.0, 122.0, 62.0, 213.0, 223.0, 78.0, 63.0, 70.0, 191.0, 245.0, 62.0, 141.0, 163.0, 25.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:14Z", "data": [242.0, 88.0, 169.0, 60.0, 98.0, 26.0, 207.0, 60.0, 171.0, 19.0, 115.0, 63.0, 41.0, 21.0, 214.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:15Z", "data": [83.0, 159.0, 217.0, 62.0, 122.0, 6.0, 121.0, 63.0, 205.0, 61.0, 104.0, 63.0, 81.0, 204.0, 98.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:16Z", "data": [10.0, 147.0, 229.0, 60.0, 99.0, 126.0, 244.0, 62.0, 178.0, 252.0, 219.0, 62.0, 8.0, 17.0, 84.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:17Z", "data": [238.0, 177.0, 246.0, 61.0, 183.0, 114.0, 244.0, 62.0, 19.0, 197.0, 4.0, 61.0, 189.0, 15.0, 116.0, 60.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:18Z", "data": [215.0, 98.0, 159.0, 62.0, 8.0, 205.0, 108.0, 63.0, 72.0, 217.0, 99.0, 63.0, 153.0, 159.0, 9.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:19Z", "data": [208.0, 127.0, 27.0, 63.0, 121.0, 120.0, 191.0, 61.0, 180.0, 21.0, 241.0, 62.0, 105.0, 146.0, 213.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:20Z", "data": [52.0, 255.0, 58.0, 63.0, 214.0, 231.0, 89.0, 62.0, 70.0, 158.0, 108.0, 62.0, 46.0, 215.0, 54.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:21Z", "data": [3.0, 154.0, 42.0, 63.0, 216.0, 135.0, 208.0, 62.0, 227.0, 219.0, 42.0, 63.0, 242.0, 252.0, 152.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:22Z", "data": [216.0, 242.0, 108.0, 63.0, 228.0, 44.0, 93.0, 63.0, 47.0, 180.0, 6.0, 63.0, 183.0, 157.0, 233.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:23Z", "data": [99.0, 236.0, 224.0, 62.0, 253.0, 203.0, 104.0, 63.0, 125.0, 136.0, 197.0, 62.0, 98.0, 76.0, 225.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:24Z", "data": [158.0, 228.0, 214.0, 62.0, 28.0, 193.0, 124.0, 63.0, 172.0, 101.0, 3.0, 63.0, 157.0, 46.0, 21.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:25Z", "data": [17.0, 22.0, 13.0, 62.0, 146.0, 127.0, 5.0, 63.0, 148.0, 20.0, 125.0, 63.0, 172.0, 157.0, 110.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:26Z", "data": [178.0, 26.0, 23.0, 62.0, 135.0, 197.0, 61.0, 63.0, 247.0, 88.0, 157.0, 62.0, 201.0, 209.0, 170.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:27Z", "data": [12.0, 45.0, 63.0, 63.0, 110.0, 200.0, 94.0, 63.0, 17.0, 5.0, 31.0, 63.0, 121.0, 192.0, 154.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:28Z", "data": [31.0, 74.0, 20.0, 63.0, 109.0, 174.0, 117.0, 62.0, 11.0, 160.0, 117.0, 63.0, 9.0, 19.0, 231.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:29Z", "data": [36.0, 186.0, 168.0, 62.0, 162.0, 135.0, 74.0, 62.0, 41.0, 27.0, 87.0, 63.0, 41.0, 2.0, 43.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:30Z", "data": [48.0, 138.0, 121.0, 63.0, 174.0, 106.0, 121.0, 63.0, 212.0, 43.0, 85.0, 63.0, 136.0, 110.0, 57.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:31Z", "data": [51.0, 52.0, 250.0, 62.0, 53.0, 201.0, 60.0, 63.0, 134.0, 119.0, 89.0, 63.0, 77.0, 80.0, 104.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:32Z", "data": [141.0, 128.0, 19.0, 63.0, 51.0, 1.0, 33.0, 63.0, 74.0, 91.0, 116.0, 62.0, 255.0, 88.0, 80.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:33Z", "data": [41.0, 163.0, 159.0, 62.0, 13.0, 78.0, 4.0, 63.0, 205.0, 79.0, 158.0, 62.0, 203.0, 159.0, 125.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:34Z", "data": [176.0, 22.0, 82.0, 62.0, 152.0, 62.0, 85.0, 63.0, 183.0, 12.0, 31.0, 62.0, 247.0, 133.0, 227.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:35Z", "data": [18.0, 76.0, 180.0, 62.0, 21.0, 128.0, 109.0, 63.0, 3.0, 10.0, 30.0, 63.0, 13.0, 250.0, 42.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:36Z", "data": [173.0, 157.0, 33.0, 62.0, 27.0, 69.0, 222.0, 62.0, 121.0, 108.0, 58.0, 63.0, 220.0, 24.0, 249.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:37Z", "data": [53.0, 91.0, 242.0, 62.0, 233.0, 73.0, 177.0, 62.0, 76.0, 14.0, 222.0, 62.0, 228.0, 235.0, 161.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:38Z", "data": [107.0, 117.0, 4.0, 61.0, 174.0, 40.0, 20.0, 63.0, 121.0, 253.0, 106.0, 63.0, 196.0, 113.0, 7.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:39Z", "data": [173.0, 122.0, 207.0, 61.0, 193.0, 15.0, 31.0, 63.0, 121.0, 239.0, 62.0, 62.0, 51.0, 157.0, 118.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:40Z", "data": [157.0, 21.0, 200.0, 61.0, 28.0, 64.0, 168.0, 62.0, 230.0, 175.0, 27.0, 63.0, 183.0, 241.0, 101.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:41Z", "data": [159.0, 120.0, 42.0, 62.0, 208.0, 29.0, 121.0, 62.0, 142.0, 50.0, 195.0, 61.0, 71.0, 122.0, 33.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:42Z", "data": [225.0, 190.0, 107.0, 63.0, 158.0, 74.0, 72.0, 63.0, 70.0, 213.0, 111.0, 63.0, 97.0, 244.0, 24.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:43Z", "data": [64.0, 247.0, 155.0, 62.0, 94.0, 85.0, 72.0, 63.0, 117.0, 128.0, 190.0, 60.0, 208.0, 224.0, 86.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:44Z", "data": [31.0, 113.0, 69.0, 63.0, 232.0, 152.0, 92.0, 63.0, 35.0, 175.0, 1.0, 61.0, 60.0, 26.0, 71.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:45Z", "data": [42.0, 0.0, 138.0, 62.0, 222.0, 125.0, 67.0, 63.0, 159.0, 247.0, 160.0, 62.0, 223.0, 141.0, 235.0, 60.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:46Z", "data": [136.0, 138.0, 64.0, 63.0, 15.0, 37.0, 27.0, 63.0, 117.0, 155.0, 125.0, 63.0, 120.0, 88.0, 114.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:47Z", "data": [53.0, 51.0, 26.0, 63.0, 165.0, 143.0, 0.0, 63.0, 94.0, 74.0, 220.0, 62.0, 73.0, 225.0, 88.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:48Z", "data": [103.0, 170.0, 214.0, 62.0, 163.0, 89.0, 175.0, 61.0, 102.0, 23.0, 110.0, 63.0, 76.0, 168.0, 25.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:49Z", "data": [241.0, 70.0, 56.0, 63.0, 219.0, 61.0, 31.0, 61.0, 212.0, 229.0, 86.0, 63.0, 149.0, 218.0, 3.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:50Z", "data": [159.0, 198.0, 98.0, 61.0, 124.0, 21.0, 11.0, 63.0, 24.0, 106.0, 31.0, 63.0, 83.0, 2.0, 120.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:51Z", "data": [174.0, 235.0, 158.0, 62.0, 209.0, 206.0, 205.0, 61.0, 2.0, 116.0, 161.0, 62.0, 212.0, 221.0, 152.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:52Z", "data": [72.0, 61.0, 6.0, 63.0, 175.0, 223.0, 48.0, 62.0, 174.0, 23.0, 237.0, 62.0, 121.0, 218.0, 103.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:53Z", "data": [65.0, 46.0, 44.0, 62.0, 28.0, 20.0, 168.0, 62.0, 239.0, 194.0, 94.0, 63.0, 191.0, 93.0, 35.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:54Z", "data": [84.0, 251.0, 175.0, 62.0, 127.0, 12.0, 175.0, 59.0, 45.0, 13.0, 118.0, 63.0, 109.0, 143.0, 109.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:55Z", "data": [109.0, 126.0, 17.0, 63.0, 29.0, 145.0, 32.0, 61.0, 123.0, 160.0, 33.0, 63.0, 126.0, 145.0, 36.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:56Z", "data": [32.0, 63.0, 28.0, 63.0, 115.0, 222.0, 217.0, 62.0, 9.0, 76.0, 93.0, 62.0, 201.0, 245.0, 27.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:57Z", "data": [155.0, 21.0, 22.0, 61.0, 95.0, 47.0, 228.0, 61.0, 230.0, 205.0, 132.0, 62.0, 219.0, 60.0, 20.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:58Z", "data": [200.0, 108.0, 167.0, 61.0, 92.0, 202.0, 198.0, 61.0, 172.0, 28.0, 23.0, 63.0, 131.0, 214.0, 207.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:00:59Z", "data": [89.0, 206.0, 137.0, 61.0, 147.0, 240.0, 227.0, 61.0, 45.0, 100.0, 104.0, 63.0, 123.0, 236.0, 180.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:00Z", "data": [82.0, 180.0, 85.0, 63.0, 134.0, 193.0, 7.0, 63.0, 186.0, 150.0, 207.0, 62.0, 221.0, 34.0, 40.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:01Z", "data": [231.0, 31.0, 92.0, 63.0, 215.0, 189.0, 10.0, 63.0, 92.0, 238.0, 14.0, 62.0, 162.0, 146.0, 124.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:02Z", "data": [172.0, 107.0, 54.0, 63.0, 171.0, 220.0, 92.0, 62.0, 157.0, 18.0, 145.0, 62.0, 105.0, 247.0, 179.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:03Z", "data": [69.0, 136.0, 31.0, 62.0, 136.0, 80.0, 94.0, 62.0, 50.0, 159.0, 16.0, 60.0, 40.0, 79.0, 42.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:04Z", "data": [199.0, 34.0, 37.0, 63.0, 86.0, 237.0, 10.0, 63.0, 101.0, 48.0, 152.0, 61.0, 252.0, 228.0, 22.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:05Z", "data": [208.0, 242.0, 149.0, 62.0, 122.0, 230.0, 189.0, 61.0, 141.0, 7.0, 235.0, 62.0, 175.0, 123.0, 88.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:06Z", "data": [190.0, 231.0, 78.0, 59.0, 0.0, 149.0, 95.0, 63.0, 37.0, 75.0, 47.0, 63.0, 152.0, 58.0, 97.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:07Z", "data": [65.0, 176.0, 104.0, 63.0, 65.0, 86.0, 72.0, 61.0, 216.0, 131.0, 138.0, 59.0, 159.0, 109.0, 59.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:08Z", "data": [245.0, 124.0, 22.0, 63.0, 9.0, 20.0, 223.0, 62.0, 164.0, 104.0, 202.0, 60.0, 70.0, 145.0, 76.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:09Z", "data": [66.0, 252.0, 111.0, 63.0, 224.0, 248.0, 164.0, 62.0, 171.0, 182.0, 110.0, 62.0, 64.0, 91.0, 88.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:10Z", "data": [148.0, 46.0, 245.0, 62.0, 34.0, 53.0, 21.0, 63.0, 7.0, 216.0, 92.0, 63.0, 64.0, 110.0, 16.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:11Z", "data": [231.0, 3.0, 130.0, 61.0, 120.0, 26.0, 62.0, 63.0, 33.0, 107.0, 239.0, 60.0, 213.0, 244.0, 215.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:12Z", "data": [17.0, 254.0, 119.0, 62.0, 38.0, 60.0, 100.0, 62.0, 52.0, 48.0, 64.0, 63.0, 41.0, 158.0, 100.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:13Z", "data": [18.0, 116.0, 124.0, 62.0, 36.0, 223.0, 121.0, 63.0, 116.0, 5.0, 70.0, 63.0, 78.0, 121.0, 251.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:14Z", "data": [33.0, 229.0, 12.0, 62.0, 94.0, 46.0, 49.0, 63.0, 107.0, 6.0, 97.0, 63.0, 106.0, 214.0, 132.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:15Z", "data": [38.0, 65.0, 47.0, 63.0, 80.0, 66.0, 0.0, 63.0, 162.0, 29.0, 62.0, 63.0, 0.0, 82.0, 77.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:16Z", "data": [40.0, 146.0, 6.0, 62.0, 37.0, 18.0, 10.0, 63.0, 107.0, 157.0, 65.0, 63.0, 100.0, 12.0, 14.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:17Z", "data": [137.0, 122.0, 48.0, 59.0, 106.0, 245.0, 189.0, 62.0, 184.0, 17.0, 236.0, 62.0, 0.0, 93.0, 29.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:18Z", "data": [227.0, 104.0, 189.0, 62.0, 28.0, 223.0, 152.0, 62.0, 130.0, 103.0, 239.0, 62.0, 146.0, 9.0, 59.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:19Z", "data": [124.0, 162.0, 1.0, 63.0, 224.0, 119.0, 112.0, 63.0, 54.0, 35.0, 211.0, 62.0, 190.0, 200.0, 23.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:20Z", "data": [109.0, 62.0, 60.0, 63.0, 145.0, 191.0, 65.0, 63.0, 26.0, 16.0, 88.0, 63.0, 135.0, 17.0, 98.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:21Z", "data": [42.0, 36.0, 142.0, 61.0, 37.0, 125.0, 224.0, 62.0, 205.0, 143.0, 141.0, 62.0, 137.0, 39.0, 6.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:22Z", "data": [235.0, 104.0, 56.0, 63.0, 74.0, 123.0, 50.0, 63.0, 254.0, 226.0, 67.0, 60.0, 99.0, 155.0, 207.0, 61.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:23Z", "data": [79.0, 222.0, 61.0, 63.0, 94.0, 74.0, 171.0, 61.0, 219.0, 8.0, 70.0, 63.0, 138.0, 207.0, 26.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:24Z", "data": [15.0, 104.0, 104.0, 63.0, 39.0, 57.0, 17.0, 63.0, 169.0, 155.0, 78.0, 63.0, 217.0, 37.0, 14.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:25Z", "data": [189.0, 168.0, 41.0, 63.0, 203.0, 38.0, 46.0, 61.0, 240.0, 146.0, 89.0, 63.0, 216.0, 130.0, 168.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:26Z", "data": [103.0, 221.0, 236.0, 62.0, 41.0, 207.0, 5.0, 63.0, 119.0, 31.0, 169.0, 62.0, 36.0, 252.0, 23.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:27Z", "data": [162.0, 34.0, 211.0, 62.0, 223.0, 48.0, 116.0, 63.0, 213.0, 23.0, 107.0, 62.0, 107.0, 69.0, 119.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:28Z", "data": [205.0, 18.0, 140.0, 62.0, 56.0, 103.0, 64.0, 61.0, 232.0, 46.0, 173.0, 62.0, 46.0, 8.0, 84.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:29Z", "data": [211.0, 185.0, 89.0, 63.0, 52.0, 116.0, 43.0, 63.0, 19.0, 213.0, 124.0, 63.0, 55.0, 110.0, 15.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:30Z", "data": [138.0, 70.0, 221.0, 62.0, 234.0, 121.0, 40.0, 63.0, 136.0, 51.0, 66.0, 63.0, 95.0, 236.0, 125.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:31Z", "data": [191.0, 84.0, 19.0, 63.0, 107.0, 184.0, 184.0, 62.0, 65.0, 206.0, 31.0, 62.0, 0.0, 186.0, 160.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:32Z", "data": [35.0, 184.0, 77.0, 63.0, 109.0, 123.0, 198.0, 62.0, 50.0, 217.0, 102.0, 63.0, 158.0, 132.0, 135.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:33Z", "data": [242.0, 54.0, 169.0, 62.0, 190.0, 43.0, 23.0, 63.0, 14.0, 57.0, 171.0, 61.0, 162.0, 167.0, 94.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:34Z", "data": [147.0, 126.0, 63.0, 62.0, 148.0, 111.0, 16.0, 63.0, 88.0, 74.0, 245.0, 62.0, 189.0, 151.0, 49.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:35Z", "data": [66.0, 154.0, 5.0, 62.0, 96.0, 142.0, 90.0, 63.0, 253.0, 164.0, 23.0, 62.0, 204.0, 209.0, 229.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:36Z", "data": [121.0, 31.0, 63.0, 63.0, 133.0, 160.0, 96.0, 63.0, 84.0, 171.0, 129.0, 62.0, 20.0, 188.0, 77.0, 62.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:37Z", "data": [72.0, 233.0, 166.0, 61.0, 200.0, 46.0, 41.0, 63.0, 43.0, 3.0, 68.0, 63.0, 32.0, 48.0, 23.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:38Z", "data": [30.0, 6.0, 122.0, 63.0, 180.0, 168.0, 76.0, 63.0, 254.0, 16.0, 19.0, 63.0, 175.0, 50.0, 49.0, 63.0]}}, {"audio_frame": {"device_timestamp": "1970-01-01T00:01:39Z", "data": [160.0, 181.0, 85.0, 63.0, 219.0, 82.0, 25.0, 63.0, 77.0, 28.0, 115.0, 63.0, 180.0, 46.0, 219.0, 60.0]}}]} \ No newline at end of file diff --git a/python/benchmarks/scenarios/medium/payload b/python/benchmarks/scenarios/medium/payload deleted file mode 100644 index ba1e689..0000000 --- a/python/benchmarks/scenarios/medium/payload +++ /dev/null @@ -1 +0,0 @@ -{"session_id": {"value": "c8c83696-607b-4090-b8ea-8886bfd4aea8"}, "device": {"model": "iPhone 12", "name": "iPhone 12", "type": "TYPE_HANDHELD", "uid": "f3131490-dddd-419a-8504-fa8bb55282b2"}, "frames": [{"depth_frame": {"device_timestamp": "1970-01-01T00:00:00Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "RQAdACUAxwBNAMYAxQCPAEcAeAD5AJMAAQDJAFgABgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:01Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "cADQADIA0QDPALkAPQAPADwAnAB0ANoAnADhAHYAMQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:02Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "swAEAKcAdwAJAOsABgBcANYA+gBsAGYAoAAiAEcA3AA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:03Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "+wDiAM0AeABLAGoAygCpABAAuwB3AMgALAD7APsAyQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:04Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "iQAGAAUAswBnAHAAPAC8ADAAZwDEABgA1wCJAEQAcgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:05Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "tQCqAFQAZAC2AGsAOwCcAN8AawBzAHcAhQDoAPoAXwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:06Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "4ABRAJQAIACVADUAywCDACkArQAaAFoA+gBjAIwAAwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:07Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "XwC3AGwA5ACIALYAKQDmAFUAwAA/AAIAHwC5AAQAyAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:08Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "EQAvABsA1ABtAMAA3wBcACEA0wBrAPYAFQDWAM8A/AA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:09Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "7QBpAN4A1ADBALwA1wAOAA8AgwBYAP4AhwA2AMsA3gA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:10Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "tAATAM4AVADtAKUAUADdADMAawBVAAgAOAAlAGsAkgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:11Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "BAD6ABoA7gANAHIA5QBiAOcAxAAzAMoAIQDHAGAA3wA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:12Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "EgCBAGwAWwBLAK8AFACqABsABgCTACwAQABVAIgAoQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:13Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "oQC7AKIAkACRAOoAgwCUAKsAAwB1ANAAoQCIAPkAPwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:14Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "2wAQAHgA1wBKAGIAFQCWAKAADADUAPUArgCIAFkAgQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:15Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "0ADfAAUAyQCHAP4ATQAdAEAAjwAXAFwA1AAcAA0AyQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:16Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "QgB6APYA9QDMACoApwBwAMIA1QAOACMAIQBYAKgAjAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:17Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "igCSAOUAEgDwAPgAYgCWAEcA7AAlADAAoQBIACEAaQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:18Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "nAByAHkAwgCdADUAaQDQAGYAdwCwAMwAIgCRADQAVAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:19Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "DgBwAPMAnQCmANkAOADyACgAPAD3APgAmQDyAIIAWQA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:20Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "jABuAPQA3ABzABMAbwCaAEUAiAAqAEcAggBaAIAAKAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:21Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "nQCGAG4A3gBrAFYAJAAyAPoAGwBIAKMA2wDUABsA0QA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:22Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "gABBAOgArwCPAPsADQA0AMIAWAAyAJYAuAC5AHcAwgA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:23Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "owA4AFMA6wDuAFgAGgBFAN0A6gAQAIkAHgBuADMAcwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:24Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "UQAHACYASgBoAPEAXACTAHkAcQC0AEIAyAD4ACQAgwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:25Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "IgAeADIApgAcACsAggCXADcALACfAF8AYQAxALsA8wA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:26Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "0AAsAHcAQQBfAKIAmAB9AFMAwgAlAB0APgBzAGoAfAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:27Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "NgDIABkARwAJALAAeAAYADAAEwArAKIAvQCAACUAmwA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:28Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "ugAPAHwAuADzAKQA9QBJAC0AbADXAIoA6gDGAFgApAA="}]}}}, {"depth_frame": {"device_timestamp": "1970-01-01T00:00:29Z", "environment_depth_temporal_smoothing_enabled": true, "image": {"dimensions": {"x": 4, "y": 4}, "format": "FORMAT_DEPTHUINT16", "planes": [{"data": "uQAeAAAA1QAWAGoAmQBoAFsACQCOANwAVABtAOEAVQA="}]}}}]} \ No newline at end of file diff --git a/python/benchmarks/scenarios/mixed/.gitkeep b/python/benchmarks/scenarios/mixed/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/python/benchmarks/send_interval_payload_size_benchmark.sh b/python/benchmarks/send_interval_payload_size_benchmark.sh new file mode 100755 index 0000000..3af2013 --- /dev/null +++ b/python/benchmarks/send_interval_payload_size_benchmark.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +bash build.sh || exit 1 + +export GRPC_BENCHMARK_DURATION=60s +export GRPC_BENCHMARK_WARMUP=10s +export GRPC_SERVER_RAM=4096m +export GRPC_CLIENT_CPUS=5 +export GRPC_CLIENT_CONCURRENCY=5 +export GRPC_CLIENT_CONNECTIONS=5 +export GRPC_REQUEST_SCENARIO=${GRPC_REQUEST_SCENARIO:-"mixed"} + +if [ "$GRPC_REQUEST_SCENARIO" == "mixed" ]; then + rpss=(40 20 10) # double to account for round-robinness of the data modalities sent + frames_per_requests=(15 30 60) +else + rpss=(20 10 5) + frames_per_requests=(15 30 60) +fi + +cpus=0 +while [ $cpus -ne 2 ]; do + cpus=$((cpus + 1)) + for i in "${!rpss[@]}"; do + rps=${rpss[$i]} + frames_per_request=${frames_per_requests[$i]} + + echo "Benchmarking $GRPC_REQUEST_SCENARIO scenario with $cpus CPU(s), RPS=$rps, and Frames Per Request=$frames_per_request" + + GRPC_SERVER_CPUS=$cpus \ + GRPC_CLIENT_RPS=$rps \ + GRPC_CLIENT_FRAMES_PER_REQUEST=$frames_per_request \ + bash bench.sh || exit 2 + sleep 10 + done +done + +echo "Benchmarking finished" diff --git a/python/benchmarks/setup_scenario.sh b/python/benchmarks/setup_scenario.sh index ce632b8..8805df4 100755 --- a/python/benchmarks/setup_scenario.sh +++ b/python/benchmarks/setup_scenario.sh @@ -3,10 +3,11 @@ SCENARIO=$1 COPY_PAYLOAD=$2 SESSION_ID=$3 +FRAMES_PER_REQUEST=$4 if ${COPY_PAYLOAD}; then rm -rf payload mkdir -p payload - poetry run ./generate_payload.py --scenario "${SCENARIO}" --session-id="${SESSION_ID}" + poetry run ./generate_payload.py --scenario "${SCENARIO}" --session-id="${SESSION_ID}" --frames-per-request="${FRAMES_PER_REQUEST}" cp scenarios/"${SCENARIO}"/payload payload/payload fi diff --git a/python/benchmarks/visualize_results.ipynb b/python/benchmarks/visualize_results.ipynb new file mode 100644 index 0000000..a316920 --- /dev/null +++ b/python/benchmarks/visualize_results.ipynb @@ -0,0 +1,607 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "archived_results/send_interval_payload_size/\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
scenarioserver_cpusclient_rpsframes_per_reqthroughputp95cpu_cpumem_mem_mib
4heavy15604.98120.4364.074000623.380000
3heavy110309.9860.4163.069000320.320000
0heavy1201519.9831.8970.267778254.277778
1heavy25604.98112.6362.747000600.370000
2heavy210309.9861.3066.564000240.990000
5heavy2201519.9833.0474.805556217.922222
10light15604.982.702.76800090.189000
7light110309.982.343.62222290.262222
11light1201519.982.095.43222290.733333
9light25604.982.752.73900090.259000
6light210309.982.343.67111190.581111
8light2201519.982.065.37444490.240000
12mixed110609.98101.4763.222000496.910000
16mixed1203019.9862.1372.732222502.166667
17mixed1401533.48302.16101.497778316.166667
15mixed210609.9895.7160.152000627.990000
14mixed2203019.9857.5869.440000215.611111
13mixed2401539.9831.3679.738889170.444444
\n", + "
" + ], + "text/plain": [ + " scenario server_cpus client_rps frames_per_req throughput p95 \\\n", + "4 heavy 1 5 60 4.98 120.43 \n", + "3 heavy 1 10 30 9.98 60.41 \n", + "0 heavy 1 20 15 19.98 31.89 \n", + "1 heavy 2 5 60 4.98 112.63 \n", + "2 heavy 2 10 30 9.98 61.30 \n", + "5 heavy 2 20 15 19.98 33.04 \n", + "10 light 1 5 60 4.98 2.70 \n", + "7 light 1 10 30 9.98 2.34 \n", + "11 light 1 20 15 19.98 2.09 \n", + "9 light 2 5 60 4.98 2.75 \n", + "6 light 2 10 30 9.98 2.34 \n", + "8 light 2 20 15 19.98 2.06 \n", + "12 mixed 1 10 60 9.98 101.47 \n", + "16 mixed 1 20 30 19.98 62.13 \n", + "17 mixed 1 40 15 33.48 302.16 \n", + "15 mixed 2 10 60 9.98 95.71 \n", + "14 mixed 2 20 30 19.98 57.58 \n", + "13 mixed 2 40 15 39.98 31.36 \n", + "\n", + " cpu_cpu mem_mem_mib \n", + "4 64.074000 623.380000 \n", + "3 63.069000 320.320000 \n", + "0 70.267778 254.277778 \n", + "1 62.747000 600.370000 \n", + "2 66.564000 240.990000 \n", + "5 74.805556 217.922222 \n", + "10 2.768000 90.189000 \n", + "7 3.622222 90.262222 \n", + "11 5.432222 90.733333 \n", + "9 2.739000 90.259000 \n", + "6 3.671111 90.581111 \n", + "8 5.374444 90.240000 \n", + "12 63.222000 496.910000 \n", + "16 72.732222 502.166667 \n", + "17 101.497778 316.166667 \n", + "15 60.152000 627.990000 \n", + "14 69.440000 215.611111 \n", + "13 79.738889 170.444444 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "from pathlib import Path\n", + "import re\n", + "\n", + "# Configuration\n", + "RESULTS_DIR = \"archived_results/send_interval_payload_size/\"\n", + "\n", + "\n", + "# Helper functions for parsing files\n", + "def parse_report(file_path):\n", + " content = file_path.read_text()\n", + " data = {}\n", + "\n", + " # Basic metrics\n", + " metrics = {\n", + " \"Count\": (\"count\", int),\n", + " \"Total\": (\"total_time\", lambda x: float(x.replace(\" s\", \"\"))),\n", + " \"Slowest\": (\n", + " \"slowest_ms\",\n", + " lambda x: float(x.replace(\" ms\", \"\")),\n", + " ),\n", + " \"Fastest\": (\n", + " \"fastest_ms\",\n", + " lambda x: float(x.replace(\" ms\", \"\")),\n", + " ),\n", + " \"Average\": (\n", + " \"avg_ms\",\n", + " lambda x: float(x.replace(\" ms\", \"\")),\n", + " ),\n", + " \"Requests/sec\": (\"rps\", float),\n", + " }\n", + "\n", + " for line in content.split(\"\\n\"):\n", + " if \":\" in line:\n", + " key, val = line.split(\":\", 1)\n", + " key = key.strip()\n", + " val = val.strip()\n", + " if key in metrics:\n", + " name, conv = metrics[key]\n", + " data[name] = conv(val)\n", + "\n", + " # Latency percentiles\n", + " latency_perc = re.findall(r\"(\\d+) % in ([\\d.]+) ms\", content)\n", + " for perc, val in latency_perc:\n", + " data[f\"p{perc}\"] = float(val)\n", + "\n", + " return data\n", + "\n", + "\n", + "def parse_stats(file_path):\n", + " stats = []\n", + " for line in file_path.read_text().split(\"\\n\"):\n", + " if not line.strip():\n", + " continue\n", + " parts = line.strip().split()\n", + " cpu_percent = float(parts[0].strip(\"%\"))\n", + " mem_used = float(parts[1].replace(\"MiB\", \"\"))\n", + " stats.append({\"cpu\": cpu_percent, \"mem_mib\": mem_used})\n", + " return pd.DataFrame(stats).mean().to_dict()\n", + "\n", + "\n", + "def parse_params(file_path):\n", + " params = {}\n", + " for line in file_path.read_text().split(\"\\n\"):\n", + " if line.startswith(\"- \"):\n", + " line = line[2:].strip()\n", + " if \"=\" in line:\n", + " k, v = line.split(\"=\", 1)\n", + " params[k.strip()] = v.strip()\n", + " return params\n", + "\n", + "\n", + "# Main data collection\n", + "data = []\n", + "for scenario_dir in Path(RESULTS_DIR).iterdir():\n", + " if not scenario_dir.is_dir():\n", + " continue\n", + "\n", + " scenario = scenario_dir.name\n", + " for run_dir in scenario_dir.iterdir():\n", + " if not run_dir.is_dir():\n", + " continue\n", + "\n", + " # Parse files\n", + " try:\n", + " report = parse_report(run_dir / \"arflow_server_bench.report\")\n", + " stats = parse_stats(run_dir / \"arflow_server_bench.stats\")\n", + " params = parse_params(run_dir / \"bench.params\")\n", + " except FileNotFoundError:\n", + " continue\n", + "\n", + " # Combine data\n", + " row = {\n", + " \"scenario\": scenario,\n", + " \"server_cpus\": int(params.get(\"GRPC_SERVER_CPUS\", 1)),\n", + " \"client_rps\": int(params.get(\"GRPC_CLIENT_RPS\", 0)),\n", + " \"frames_per_req\": int(params.get(\"GRPC_CLIENT_FRAMES_PER_REQUEST\", 0)),\n", + " **report,\n", + " **{f\"cpu_{k}\": v for k, v in stats.items() if k == \"cpu\"},\n", + " **{f\"mem_{k}\": v for k, v in stats.items() if k == \"mem_mib\"},\n", + " }\n", + " data.append(row)\n", + "\n", + "df = pd.DataFrame(data)\n", + "df[\"throughput\"] = df[\"rps\"]\n", + "df = df.sort_values(by=[\"scenario\", \"server_cpus\", \"client_rps\"])\n", + "\n", + "# Display all configurations\n", + "print(RESULTS_DIR)\n", + "display(\n", + " df[\n", + " [\n", + " \"scenario\",\n", + " \"server_cpus\",\n", + " \"client_rps\",\n", + " \"frames_per_req\",\n", + " \"throughput\",\n", + " \"p95\",\n", + " \"cpu_cpu\",\n", + " \"mem_mem_mib\",\n", + " ]\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "archived_results/batching/\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
scenarioserver_cpusclient_rpsframes_per_reqthroughputp95cpu_cpumem_mem_mib
0heavy1201519.9837.6281.658889324.966667
2heavy2201519.9839.3880.790000202.990000
3heavy15001176.7067.43102.920000103.888889
1heavy25001342.1219.11195.37200095.618000
\n", + "
" + ], + "text/plain": [ + " scenario server_cpus client_rps frames_per_req throughput p95 \\\n", + "0 heavy 1 20 15 19.98 37.62 \n", + "2 heavy 2 20 15 19.98 39.38 \n", + "3 heavy 1 500 1 176.70 67.43 \n", + "1 heavy 2 500 1 342.12 19.11 \n", + "\n", + " cpu_cpu mem_mem_mib \n", + "0 81.658889 324.966667 \n", + "2 80.790000 202.990000 \n", + "3 102.920000 103.888889 \n", + "1 195.372000 95.618000 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "RESULTS_DIR = \"archived_results/batching/\"\n", + "data = []\n", + "for scenario_dir in Path(RESULTS_DIR).iterdir():\n", + " if not scenario_dir.is_dir():\n", + " continue\n", + "\n", + " scenario = scenario_dir.name\n", + " for run_dir in scenario_dir.iterdir():\n", + " if not run_dir.is_dir():\n", + " continue\n", + "\n", + " # Parse files\n", + " try:\n", + " report = parse_report(run_dir / \"arflow_server_bench.report\")\n", + " stats = parse_stats(run_dir / \"arflow_server_bench.stats\")\n", + " params = parse_params(run_dir / \"bench.params\")\n", + " except FileNotFoundError:\n", + " continue\n", + "\n", + " # Combine data\n", + " row = {\n", + " \"scenario\": scenario,\n", + " \"server_cpus\": int(params.get(\"GRPC_SERVER_CPUS\", 1)),\n", + " \"client_rps\": int(params.get(\"GRPC_CLIENT_RPS\", 0)),\n", + " \"frames_per_req\": int(params.get(\"GRPC_CLIENT_FRAMES_PER_REQUEST\", 0)),\n", + " **report,\n", + " **{f\"cpu_{k}\": v for k, v in stats.items() if k == \"cpu\"},\n", + " **{f\"mem_{k}\": v for k, v in stats.items() if k == \"mem_mib\"},\n", + " }\n", + " data.append(row)\n", + "\n", + "df = pd.DataFrame(data)\n", + "df[\"throughput\"] = df[\"rps\"]\n", + "df = df.sort_values(by=[\"scenario\", \"client_rps\", \"server_cpus\"])\n", + "\n", + "# Display all configurations\n", + "print(RESULTS_DIR)\n", + "display(\n", + " df[\n", + " [\n", + " \"scenario\",\n", + " \"server_cpus\",\n", + " \"client_rps\",\n", + " \"frames_per_req\",\n", + " \"throughput\",\n", + " \"p95\",\n", + " \"cpu_cpu\",\n", + " \"mem_mem_mib\",\n", + " ]\n", + " ]\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "arflow-SCZ1vie_-py3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From af2ba65eb28004ec6aa0ab0827bf5d5e7bc24869 Mon Sep 17 00:00:00 2001 From: felixngfender Date: Sun, 23 Feb 2025 00:40:13 -0500 Subject: [PATCH 17/21] chore(benchmarks): minor docs cleanup --- python/benchmarks/BENCHMARKING.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/python/benchmarks/BENCHMARKING.md b/python/benchmarks/BENCHMARKING.md index f2e38f8..b7e86ae 100644 --- a/python/benchmarks/BENCHMARKING.md +++ b/python/benchmarks/BENCHMARKING.md @@ -10,17 +10,3 @@ Simple start: ./bench.sh ``` - -Default scenario is `mixed`. Can change this with `GRPC_REQUEST_SCENARIO` env -var. - -Additionally, our evaluation also suggests the data batching design can -significantly improve system throughput under high concurrent loads by ZZ% - -craft a representative, complex payload of data to benchmark. - -3 scenarios: light, heavy, mixed load. the first 3 are homogeneous batches of -data meaning the AR frames passed in should be of one type only. With mixed -load, it's a round-robin between homogeneous frames which is representative of -the typical ARFlow client-server interaction. This round-robin comes from `ghz`. -See From eeca6919a307676fec6f2993dee0f8fe6d622829 Mon Sep 17 00:00:00 2001 From: Khang Luu Date: Fri, 28 Feb 2025 02:20:57 -0500 Subject: [PATCH 18/21] Fix: transform not representative in evaluation (rotation is still not working) --- .../Materials/4x4_1000-0_180rotated.png | 3 + .../Materials/4x4_1000-0_180rotated.png.meta | 143 +++++++++++++++++ .../Assets/Materials/aruco-rotated.mat | 137 ++++++++++++++++ .../Assets/Materials/aruco-rotated.mat.meta | 8 + .../Assets/Materials/aruco.mat | 6 +- .../Assets/Scenes/SpacialEval.unity | 147 ++++++----------- .../Runtime/Evaluation/SpacialEvaluation.cs | 3 - .../Evaluation/SpacialEvaluationManager.cs | 151 ++++++++++++++---- 8 files changed, 455 insertions(+), 143 deletions(-) create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat.meta diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png new file mode 100644 index 0000000..251af44 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02f8bc1c6075f3d58163802a6e724b0d1dcaebdb484ad3f7aecfc4601acab7e3 +size 266 diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png.meta new file mode 100644 index 0000000..2e4c3d8 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 803fd1c227fecfb459cb8ad45f7e34ad +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat new file mode 100644 index 0000000..bd20f89 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-5602789791772390472 +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: 9 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: aruco-rotated + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _METALLICSPECGLOSSMAP + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + 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: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + 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_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 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 + - _SrcBlendAlpha: 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.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat.meta new file mode 100644 index 0000000..35bc84c --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco-rotated.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 367dfc6de3c38674787bd1cc3169cdc2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat index bb5d79f..212fb58 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat @@ -40,7 +40,7 @@ Material: serializedVersion: 3 m_TexEnvs: - _BaseMap: - m_Texture: {fileID: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + m_Texture: {fileID: 2800000, guid: 803fd1c227fecfb459cb8ad45f7e34ad, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _BumpMap: @@ -64,11 +64,11 @@ Material: m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MainTex: - m_Texture: {fileID: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + m_Texture: {fileID: 2800000, guid: 803fd1c227fecfb459cb8ad45f7e34ad, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: - m_Texture: {fileID: 2800000, guid: 99ba8abd78d0afd41811151cf809f5b7, type: 3} + m_Texture: {fileID: 2800000, guid: 803fd1c227fecfb459cb8ad45f7e34ad, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _OcclusionMap: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity index a1f396f..2db9018 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity @@ -663,7 +663,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Start + m_text: Start in iterations m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -690,8 +690,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 24 - m_fontSizeBase: 24 + m_fontSize: 15 + m_fontSizeBase: 15 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 @@ -770,7 +770,7 @@ RectTransform: m_GameObject: {fileID: 1034274601} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.41, y: 1.41, z: 1.41} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 m_Children: - {fileID: 1006815207} @@ -778,7 +778,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 482, y: -279} + m_AnchoredPosition: {x: 151, y: -107} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1034274603 @@ -902,7 +902,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 21.325073, y: -21.400042} + m_AnchoredPosition: {x: 21.325073, y: -135} m_SizeDelta: {x: -42.649887, y: -42.799915} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1263916035 @@ -923,14 +923,14 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: -491.6 + m_Spacing: -577.87 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 m_ChildControlWidth: 0 m_ChildControlHeight: 0 m_ChildScaleWidth: 0 m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 + m_ReverseArrangement: 1 --- !u!114 &1263916036 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1078,8 +1078,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 24 - m_fontSizeBase: 24 + m_fontSize: 20 + m_fontSizeBase: 20 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 @@ -1116,7 +1116,7 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 0, y: 0, z: -183.68564, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 m_hasFontAssetChanged: 0 @@ -1203,14 +1203,14 @@ Camera: serializedVersion: 2 m_ClearFlags: 2 m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 + m_projectionMatrixMode: 2 m_GateFitMode: 2 m_FOVAxisMode: 0 m_Iso: 200 m_ShutterSpeed: 0.005 m_Aperture: 16 m_FocusDistance: 10 - m_FocalLength: 50 + m_FocalLength: 20.78461 m_BladeCount: 5 m_Curvature: {x: 2, y: 11} m_BarrelClipping: 0.25 @@ -1225,7 +1225,7 @@ Camera: height: 1 near clip plane: 0.3 far clip plane: 1000 - field of view: 60 + field of view: 60.000004 orthographic: 0 orthographic size: 5 m_Depth: -1 @@ -1270,58 +1270,73 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 2126620349} + m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalScale.y + value: 0.1 + objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_LocalScale.z + value: 0.1 + objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -1.1619852 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -0.3762669 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalPosition.z - value: 0 + value: 4 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.w - value: 0 + value: 0.8119817 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0.5836829 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.y - value: 1 + value: -0 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalEulerAnglesHint.x - value: 0 + value: -71.42 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalEulerAnglesHint.y - value: 180 + value: 0 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, + type: 3} + propertyPath: m_ConstrainProportionsScale + value: 0 + objectReference: {fileID: 0} - target: {fileID: 7893538066097599192, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_Name @@ -1332,12 +1347,6 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} ---- !u!4 &1767675540 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, - type: 3} - m_PrefabInstance: {fileID: 1767675539} - m_PrefabAsset: {fileID: 0} --- !u!1 &1770931407 GameObject: m_ObjectHideFlags: 0 @@ -1495,38 +1504,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1770931407} m_CullTransparentMesh: 1 ---- !u!1 &1819979425 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1819979426} - m_Layer: 0 - m_Name: Parent - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1819979426 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1819979425} - serializedVersion: 2 - m_LocalRotation: {x: -0.6708778, y: -0.20510794, z: -0.20835538, w: 0.68149966} - m_LocalPosition: {x: 2.2392783, y: 0.29, z: -4.1} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2126620349} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: -89.1, y: 0, z: -34} --- !u!1 &1822936294 GameObject: m_ObjectHideFlags: 0 @@ -1748,8 +1725,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 36 - m_fontSizeBase: 36 + m_fontSize: 15 + m_fontSizeBase: 15 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 @@ -1786,7 +1763,7 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 0, y: 0, z: -199.70131, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 m_hasFontAssetChanged: 0 @@ -1849,7 +1826,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} m_Name: m_EditorClassIdentifier: - m_UiScaleMode: 0 + m_UiScaleMode: 1 m_ReferencePixelsPerUnit: 100 m_ScaleFactor: 1 m_ReferenceResolution: {x: 800, y: 600} @@ -1916,9 +1893,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c7ddcab23e564e1449ac442ecfd45709, type: 3} m_Name: m_EditorClassIdentifier: - texturedPlane: {fileID: 1540106671} - arucoObj: {fileID: 2126620348} - arucoParent: {fileID: 1819979425} + arucoPlane: {fileID: 1540106671} activeCamera: {fileID: 1493587411} infoText: {fileID: 1844435562} toggleButton: {fileID: 1034274603} @@ -2014,38 +1989,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2126620348 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2126620349} - m_Layer: 0 - m_Name: ArUco Window - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2126620349 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2126620348} - serializedVersion: 2 - 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_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1767675540} - m_Father: {fileID: 1819979426} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -2053,6 +1996,6 @@ SceneRoots: - {fileID: 1822936297} - {fileID: 1493587412} - {fileID: 279801541} - - {fileID: 1819979426} + - {fileID: 1767675539} - {fileID: 1969231322} - {fileID: 2031246733} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs index e3e8195..61ef3a7 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs @@ -2,9 +2,6 @@ namespace CakeLab.ARFlow.Evaluation { - using Codice.Client.Common.FsNodeReaders; - using PlasticGui.WorkspaceWindow; - /// /// Class to evaluate the spacial accuracy of the ARFlow system. /// diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs index 23cec04..8494ad6 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs @@ -102,8 +102,8 @@ private Matrix4x4 EstimatePoseCanonicalMarker(Mat rgbMat, float markerLength) // Calculate pose marker Calib3d.solvePnP(objPoints, imagePoints, _camIntrinsics, _distCoeffs, rvec, tvec); - // In this example we are processing with RGB color image, so Axis-color correspondences are X: blue, Y: green, Z: red. (Usually X: red, Y: green, Z: blue) - Calib3d.drawFrameAxes(rgbMat, _camIntrinsics, _distCoeffs, rvec, tvec, markerLength * 0.5f); + // // In this example we are processing with RGB color image, so Axis-color correspondences are X: blue, Y: green, Z: red. (Usually X: red, Y: green, Z: blue) + // Calib3d.drawFrameAxes(rgbMat, _camIntrinsics, _distCoeffs, rvec, tvec, markerLength * 0.5f); return GetpositionAndQuaternion(rvec, tvec); } @@ -121,14 +121,57 @@ private Matrix4x4 GetpositionAndQuaternion(Mat rvec, Mat tvec) rvec.get(0, 0, rvecArr); double[] tvecArr = new double[3]; tvec.get(0, 0, tvecArr); - Debug.Log(rvecArr); - Debug.Log(tvecArr); PoseData poseData = ARUtils.ConvertRvecTvecToPoseData(rvecArr, tvecArr); + // Debug.Log(poseData.rot); + // poseData.rot = Quaternion.Inverse(poseData.rot); + // Debug.Log(poseData.rot); + // poseData.rot = Offset(poseData.rot); - // Convert to transform matrix. - return ARUtils.ConvertPoseDataToMatrix(ref poseData, true); + Debug.Log(poseData.rot); + var res = ARUtils.ConvertPoseDataToMatrix(ref poseData, true); + + return res; } + /* + predicted: + -0.95958 0.04530 -0.27778 -0.97365 + -0.00672 0.98299 0.18353 -0.36796 + 0.28137 0.17797 -0.94295 3.28595 + 0.00000 0.00000 0.00000 1.00000 + + predicted: + -0.96569 0.00496 0.25966 -0.96942 + 0.05072 0.98417 0.16983 -0.37315 + -0.25471 0.17717 -0.95065 3.27472 + 0.00000 0.00000 0.00000 1.00000 + + */ + + // private Matrix4x4 InverseRotations(Matrix4x4 mat) { + + // } + + private Quaternion Offset(Quaternion q) { + var offset = Quaternion.Euler(0, -20, -90); + return offset * q; + } + + private Matrix4x4 FlipZ(Matrix4x4 mat) { + var flipZ = Matrix4x4.Scale(new Vector3(1, 1, -1)); + return flipZ*mat; + } + + private Matrix4x4 SwapXZ(Matrix4x4 mat) { + var swapXZ = Matrix4x4.identity; + swapXZ.m00 = 0; swapXZ.m02 = 1; + swapXZ.m20 = 1; swapXZ.m22 = 0; + + return swapXZ*mat; + } + + + public void dispose() { _camIntrinsics.Dispose(); @@ -151,12 +194,12 @@ public class SpacialEvaluationManager : MonoBehaviour //The textured plane, child to the arucoObj. //In the current implementation, this plane is rotated by 90 degrees along the y axis. // This is to make sure that the initial state (unrotated) - public GameObject texturedPlane; + public GameObject arucoPlane; - // The ARPlane object that will be moved, child of the arucoParent - public GameObject arucoObj; - // The parent object of the ARPlane object. These two objects are for rotation purposes. - public GameObject arucoParent; + // // The ARPlane object that will be moved, child of the arucoParent + // public GameObject arucoObj; + // // The parent object of the ARPlane object. These two objects are for rotation purposes. + // public GameObject arucoParent; public Camera activeCamera; @@ -182,12 +225,14 @@ void Start() Mat GetCameraIntrinsics() { - float f = activeCamera.focalLength; - float fx = f; - float fy = f; + float fx = (activeCamera.focalLength * activeCamera.pixelWidth) / activeCamera.sensorSize.x; + float fy = (activeCamera.focalLength * activeCamera.pixelHeight) / activeCamera.sensorSize.y; - float cx = activeCamera.sensorSize.x / 2; - float cy = activeCamera.sensorSize.y / 2; + // float fx = f; + // float fy = f; + + float cx = activeCamera.pixelWidth / 2; + float cy = activeCamera.pixelHeight / 2; Mat camMatrix = new Mat(3, 3, CvType.CV_64FC1); camMatrix.put(0, 0, fx); @@ -217,10 +262,43 @@ void OnButtonClicked() { isCancelled = true; isRunning = false; - buttonText.text = "Start"; + buttonText.text = "Start in iterations"; } } + /// + /// Detect and shows the prediction from the window currently shown on the camera (instead of procedural testing) + /// + void FixedUpdate() + { + if (isRunning) return; + Mat intrinsics = GetCameraIntrinsics(); + + var markerLength = arucoPlane.transform.localScale.x*10; + + int mHeight = activeCamera.pixelHeight; + int mWidth = activeCamera.pixelWidth; + + var rect = new UnityEngine.Rect(0, 0, mWidth, mHeight); + RenderTexture renderTexture = new RenderTexture(mWidth, mHeight, 24); + Texture2D screenShot = new Texture2D(mWidth, mHeight, TextureFormat.RGBA32, false); + activeCamera.targetTexture = renderTexture; + + activeCamera.Render(); + + RenderTexture.active = renderTexture; + screenShot.ReadPixels(rect, 0, 0); + + Matrix4x4 evalRes = spacialEvaluation.ObtainPoseFromImage(screenShot, markerLength, intrinsics); + Matrix4x4 truth = GetGroundTruth(); + + + string info = $"predicted: \n{evalRes} \n truth: \n {truth}"; + + + infoText.text = info; + } + void StartEvaluation(int iterations) { //Potentially randomize camera intrinsics @@ -239,7 +317,9 @@ void StartEvaluation(int iterations) activeCamera.targetTexture = renderTexture; // Assuming marker is scaled proportionally in all directions, and units are in meters. - var markerLength = texturedPlane.transform.localScale.x; + //TODO + var markerLength = arucoPlane.transform.localScale.x*10; + for (int i = 0; i < iterations; i++) { @@ -277,14 +357,13 @@ void StartEvaluation(int iterations) Matrix4x4 GetGroundTruth() { - Transform t = arucoObj.transform; - // Vector3 relativePosition = activeCamera.transform.InverseTransformDirection(t.position - activeCamera.transform.position); - - - // return Matrix4x4.TRS(relativePosition, t.rotation, Vector3.one); - return Matrix4x4.TRS(t.position, t.rotation, Vector3.one); - + Transform t = arucoPlane.transform; + Vector3 relativePosition = activeCamera.transform.InverseTransformPoint(t.position); + Quaternion relativeRotation = Quaternion.Inverse(activeCamera.transform.rotation) * t.rotation; + Debug.Log(relativeRotation); + return Matrix4x4.TRS(relativePosition, relativeRotation, Vector3.one); + // return Matrix4x4.TRS(t.position, t.rotation, Vector3.one); } void randomizePosition() @@ -293,13 +372,13 @@ void randomizePosition() // ranges are set to be of adequate size to fit the camera viewport. Vector3 viewportPos = new Vector3(); - viewportPos.x = Random.Range(0.1f, 0.9f); - viewportPos.y = Random.Range(0.1f, 0.9f); + viewportPos.x = Random.Range(0.2f, 0.8f); + viewportPos.y = Random.Range(0.2f, 0.8f); viewportPos.z = Random.Range(3, 6); Vector3 pos = activeCamera.ViewportToWorldPoint(viewportPos); Debug.Log(pos); - arucoParent.transform.position = activeCamera.ViewportToWorldPoint(viewportPos); + arucoPlane.transform.position = activeCamera.ViewportToWorldPoint(viewportPos); } void randomizeRotation() @@ -307,18 +386,20 @@ void randomizeRotation() // Randomize x and z of parent // Values are tested relative to camera's viewport, so that it is visible Vector3 parentRotation = new Vector3(); - parentRotation.x = Random.Range(-100, -50); + parentRotation.x = Random.Range(-40, -120); + parentRotation.y = Random.Range(-30, 30); parentRotation.z = Random.Range(-30, 30); - arucoParent.transform.rotation = Quaternion.Euler(parentRotation); + arucoPlane.transform.rotation = Quaternion.Euler(parentRotation); + // arucoParent.transform.rotation = Quaternion.Euler(parentRotation); //randomize y of plane - Vector3 planeRotation = new Vector3(); - planeRotation.y = Random.Range(0, 360); - planeRotation.x = 0; - planeRotation.z = 0; - arucoObj.transform.localRotation = Quaternion.Euler(planeRotation); + // Vector3 planeRotation = new Vector3(); + // planeRotation.x = 0; + // planeRotation.z = 0; + // arucoObj.transform.localRotation = Quaternion.Euler(planeRotation); } } + } From dcd6a3a3ab01d27c3865218537d4b1d8e232d254 Mon Sep 17 00:00:00 2001 From: Khang Luu Date: Mon, 3 Mar 2025 02:28:35 -0500 Subject: [PATCH 19/21] fix: Rotational predictions from ArUco was not correct in Unity's coordinate system --- .../Materials/4x4_1000-0_180rotated.png | 4 +- .../Evaluation/SpacialEvaluationManager.cs | 146 +++++++++++++----- 2 files changed, 108 insertions(+), 42 deletions(-) diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png index 251af44..ea6ccd5 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02f8bc1c6075f3d58163802a6e724b0d1dcaebdb484ad3f7aecfc4601acab7e3 -size 266 +oid sha256:e35d91791fc67e567cd240b545bf648a039d516e372b9e0b1dd7ba07c88af325 +size 250 diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs index 8494ad6..638c9ba 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs @@ -127,51 +127,38 @@ private Matrix4x4 GetpositionAndQuaternion(Mat rvec, Mat tvec) // Debug.Log(poseData.rot); // poseData.rot = Offset(poseData.rot); - Debug.Log(poseData.rot); + //Through testing, it is observed that the change in coordinate system is missing for the rotational data. var res = ARUtils.ConvertPoseDataToMatrix(ref poseData, true); + //Perform coordinate change for rotational data + res = FlipAxes(res); + return res; } - /* - predicted: - -0.95958 0.04530 -0.27778 -0.97365 - -0.00672 0.98299 0.18353 -0.36796 - 0.28137 0.17797 -0.94295 3.28595 - 0.00000 0.00000 0.00000 1.00000 - - predicted: - -0.96569 0.00496 0.25966 -0.96942 - 0.05072 0.98417 0.16983 -0.37315 - -0.25471 0.17717 -0.95065 3.27472 - 0.00000 0.00000 0.00000 1.00000 - - */ - - // private Matrix4x4 InverseRotations(Matrix4x4 mat) { - - // } + private Matrix4x4 FlipAxes(Matrix4x4 mat){ + Vector4 col0 = mat.GetColumn(0); + Vector4 col1 = mat.GetColumn(1); + Vector4 col2 = mat.GetColumn(2); - private Quaternion Offset(Quaternion q) { - var offset = Quaternion.Euler(0, -20, -90); - return offset * q; - } + Matrix4x4 corrected = mat; + corrected.SetColumn(0, col0); // Right + corrected.SetColumn(1, col2); // Up + corrected.SetColumn(2, -col1); // Forward - private Matrix4x4 FlipZ(Matrix4x4 mat) { - var flipZ = Matrix4x4.Scale(new Vector3(1, 1, -1)); - return flipZ*mat; + return corrected; } - private Matrix4x4 SwapXZ(Matrix4x4 mat) { - var swapXZ = Matrix4x4.identity; - swapXZ.m00 = 0; swapXZ.m02 = 1; - swapXZ.m20 = 1; swapXZ.m22 = 0; + private Quaternion Offset(Quaternion q) { + // For rotation: This offset produces the lowest error compared to the truth data + // fine-tuned by hand and not reliable (signs flip when scanning aruco marker) - return swapXZ*mat; + // var offset = Quaternion.Euler(-45, 60, -90); + // var offset = Quaternion.Euler(-90, 0, 0); + var offset = Quaternion.Euler(0, -90, 90); + return offset * q; } - - public void dispose() { _camIntrinsics.Dispose(); @@ -292,13 +279,95 @@ void FixedUpdate() Matrix4x4 evalRes = spacialEvaluation.ObtainPoseFromImage(screenShot, markerLength, intrinsics); Matrix4x4 truth = GetGroundTruth(); + // for OnDrawGizmos + // OnDrawGizmos does not call the methods that perform prediction, + // since my laptop does not have enough RAM to run this real-time. + // TODO: remove and replace + evalR = ExtractRotation(evalRes); + trueR = ExtractRotation(truth); - string info = $"predicted: \n{evalRes} \n truth: \n {truth}"; + evalP = ExtractPosition(evalRes); + trueP = ExtractPosition(truth); + // Quaternion offset = Quaternion.Inverse(trueR) * (evalR); + // ShowDebugOffset(offset); + } + + void ShowDebugOffset(Quaternion offset){ + string info = $"truth: {trueR} \n prediction: {evalR}"; + info += $"\noffset angle: {ComputeQuaternionError(offset)}"; infoText.text = info; } + Quaternion evalR = Quaternion.identity; + Quaternion trueR = Quaternion.identity; + Vector3 evalP = new Vector3(); + Vector3 trueP = new Vector3(); + + void OnDrawGizmos() + { + Quaternion predRot = evalR; + Quaternion truthRot = trueR; + + // Get positions (you might use the translation part of the TRS) + Vector3 posPred = evalP; + Vector3 posTruth = trueP; + + // Draw truth axes at its position (red = right, green = up, blue = forward) + Gizmos.color = Color.red; + Gizmos.DrawLine(posTruth, posTruth + truthRot * Vector3.right); + Gizmos.color = Color.green; + Gizmos.DrawLine(posTruth, posTruth + truthRot * Vector3.up); + Gizmos.color = Color.blue; + Gizmos.DrawLine(posTruth, posTruth + truthRot * Vector3.forward); + + // Draw predicted axes offset a bit for clarity + Vector3 offsetPos = posPred + Vector3.right * 0.5f; + Gizmos.color = Color.magenta; + Gizmos.DrawLine(offsetPos, offsetPos + predRot * Vector3.right); + Gizmos.color = Color.yellow; + Gizmos.DrawLine(offsetPos, offsetPos + predRot * Vector3.up); + Gizmos.color = Color.cyan; + Gizmos.DrawLine(offsetPos, offsetPos + predRot * Vector3.forward); + } + + float ComputeQuaternionError(Quaternion offset) { + float angle; + Vector3 axis; + offset.ToAngleAxis(out angle, out axis); + + // Ensure the angle is within [0, 180] degrees + if (angle > 180f) + angle = 360f - angle; + + return angle; // Angular error in degrees + } + + public Quaternion ExtractRotation(Matrix4x4 matrix) + { + Vector3 forward; + forward.x = matrix.m02; + forward.y = matrix.m12; + forward.z = matrix.m22; + + Vector3 upwards; + upwards.x = matrix.m01; + upwards.y = matrix.m11; + upwards.z = matrix.m21; + + return Quaternion.LookRotation(forward, upwards); + } + + public Vector3 ExtractPosition(Matrix4x4 matrix) + { + Vector3 position; + position.x = matrix.m03; + position.y = matrix.m13; + position.z = matrix.m23; + return position; + } + void StartEvaluation(int iterations) { //Potentially randomize camera intrinsics @@ -354,16 +423,13 @@ void StartEvaluation(int iterations) isRunning = false; } - + Matrix4x4 GetGroundTruth() { Transform t = arucoPlane.transform; - Vector3 relativePosition = activeCamera.transform.InverseTransformPoint(t.position); - Quaternion relativeRotation = Quaternion.Inverse(activeCamera.transform.rotation) * t.rotation; - Debug.Log(relativeRotation); - return Matrix4x4.TRS(relativePosition, relativeRotation, Vector3.one); - // return Matrix4x4.TRS(t.position, t.rotation, Vector3.one); + Matrix4x4 trsMat = Matrix4x4.TRS(t.position, t.rotation, Vector3.one); + return activeCamera.transform.localToWorldMatrix * trsMat; } void randomizePosition() From 5510392d85413a5c30b40ccda40902eb6885922e Mon Sep 17 00:00:00 2001 From: Khang Luu Date: Tue, 4 Mar 2025 01:10:52 -0500 Subject: [PATCH 20/21] chore: Change scene setup and output evaluations --- unity/.gitignore | 1 + .../XR/Settings/OpenXR Package Settings.asset | 4255 +++++++++++++++-- .../Materials/ArUco.meta} | 5 +- .../Materials/{ => ArUco}/4x4_1000-0.png | 0 .../Materials/{ => ArUco}/4x4_1000-0.png.meta | 15 +- .../{ => ArUco}/4x4_1000-0_180rotated.png | 0 .../4x4_1000-0_180rotated.png.meta | 2 +- .../Assets/Materials/ArUco/edited180-2.png | 3 + .../Materials/ArUco/edited180-2.png.meta | 143 + .../Assets/Materials/ArUco/edited180.png | 3 + .../Assets/Materials/ArUco/edited180.png.meta | 143 + .../Materials/ImageEdits.meta} | 5 +- .../Assets/Materials/aruco.mat | 13 +- .../Assets/Scenes/SpacialEval.unity | 282 +- .../edu.wpi.cake.arflow.arucotracking.asmdef | 22 - .../Evaluation/ArUcoSpacialEvaluation.cs | 164 + .../Evaluation/ArUcoSpacialEvaluation.cs.meta | 2 + .../Runtime/Evaluation/SpacialEvaluation.cs | 96 +- .../Evaluation/SpacialEvaluationManager.cs | 455 +- .../edu.wpi.cake.arflow.evaluation.asmdef | 22 - .../Runtime/Utilities/MathUtilities.cs | 101 + .../Runtime/Utilities/MathUtilities.cs.meta | 2 + .../Runtime/edu.wpi.cake.arflow.asmdef | 3 +- 23 files changed, 4935 insertions(+), 802 deletions(-) rename unity/Packages/edu.wpi.cake.arflow/{Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef.meta => Assets/Materials/ArUco.meta} (57%) rename unity/Packages/edu.wpi.cake.arflow/Assets/Materials/{ => ArUco}/4x4_1000-0.png (100%) rename unity/Packages/edu.wpi.cake.arflow/Assets/Materials/{ => ArUco}/4x4_1000-0.png.meta (88%) rename unity/Packages/edu.wpi.cake.arflow/Assets/Materials/{ => ArUco}/4x4_1000-0_180rotated.png (100%) rename unity/Packages/edu.wpi.cake.arflow/Assets/Materials/{ => ArUco}/4x4_1000-0_180rotated.png.meta (98%) create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png.meta create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png create mode 100644 unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png.meta rename unity/Packages/edu.wpi.cake.arflow/{Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta => Assets/Materials/ImageEdits.meta} (57%) delete mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs.meta delete mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs create mode 100644 unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs.meta diff --git a/unity/.gitignore b/unity/.gitignore index 6b7a1fd..c30e367 100644 --- a/unity/.gitignore +++ b/unity/.gitignore @@ -2,6 +2,7 @@ # # Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore # +/Benchmark/ /[Ll]ibrary/ /[Tt]emp/ /[Oo]bj/ diff --git a/unity/Assets/XR/Settings/OpenXR Package Settings.asset b/unity/Assets/XR/Settings/OpenXR Package Settings.asset index 865108d..1b883a6 100644 --- a/unity/Assets/XR/Settings/OpenXR Package Settings.asset +++ b/unity/Assets/XR/Settings/OpenXR Package Settings.asset @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!114 &-8480742177966435414 +--- !u!114 &-9116301751028700345 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9,20 +9,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b5a1f07dc5afe854f9f12a4194aca3fb, type: 3} - m_Name: iPhone + m_Script: {fileID: 11500000, guid: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro m_EditorClassIdentifier: - features: - - {fileID: 150516425967632419} - m_renderMode: 1 - m_autoColorSubmissionMode: 1 - m_colorSubmissionModes: - m_List: 00000000 - m_depthSubmissionMode: 0 - m_optimizeBufferDiscards: 0 - m_symmetricProjection: 0 - m_foveatedRenderingApi: 0 ---- !u!114 &-8141607500619013533 + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-9084856736471488335 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -31,18 +29,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} - m_Name: MetaQuestTouchProControllerProfile Standalone + m_Script: {fileID: 11500000, guid: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro m_EditorClassIdentifier: - m_enabled: 1 - nameUi: Meta Quest Touch Pro Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.metaquestpro - openxrExtensionStrings: XR_FB_touch_controller_pro - company: Unity + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-7874029990419393675 +--- !u!114 &-9062398725917483748 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -51,18 +49,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} - m_Name: HPReverbG2ControllerProfile Standalone + m_Script: {fileID: 11500000, guid: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: HP Reverb G2 Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.hpreverb - openxrExtensionStrings: XR_EXT_hp_mixed_reality_controller - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-6505736655092226301 +--- !u!114 &-8842550878324330633 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -71,18 +69,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f028123e2efe1d443875bc7609b4a98b, type: 3} - m_Name: PalmPoseInteraction Standalone + m_Script: {fileID: 11500000, guid: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Palm Pose - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.palmpose - openxrExtensionStrings: XR_EXT_palm_pose - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-6353450188064078682 +--- !u!114 &-8839130987380357120 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -91,41 +89,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f647cc0545697264a9878224faada6d5, type: 3} - m_Name: MetaQuestFeature Android + m_Script: {fileID: 11500000, guid: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Meta Quest Support - version: 1.0.0 - featureIdInternal: com.unity.openxr.feature.metaquest - openxrExtensionStrings: XR_OCULUS_android_initialize_loader - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 - targetDevices: - - visibleName: Quest - manifestName: quest - enabled: 1 - - visibleName: Quest 2 - manifestName: quest2 - enabled: 1 - - visibleName: Quest Pro - manifestName: cambria - enabled: 1 - - visibleName: Quest 3 - manifestName: eureka - enabled: 1 - - visibleName: Quest 3S - manifestName: quest3s - enabled: 1 - forceRemoveInternetPermission: 1 - symmetricProjection: 0 - foveatedRenderingApi: 0 - systemSplashScreen: {fileID: 0} - optimizeBufferDiscards: 1 - lateLatchingMode: 0 - lateLatchingDebug: 0 ---- !u!114 &-5463030417629842242 +--- !u!114 &-8813226123555672847 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -134,18 +109,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} - m_Name: HandCommonPosesInteraction Standalone + m_Script: {fileID: 11500000, guid: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Hand Interaction Poses - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.handinteractionposes - openxrExtensionStrings: XR_EXT_hand_interaction - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-5455767046364352404 +--- !u!114 &-8783035120271962210 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -154,18 +129,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} - m_Name: XrPerformanceSettingsFeature Android + m_Script: {fileID: 11500000, guid: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: XR Performance Settings - version: 1.0.0 - featureIdInternal: com.unity.openxr.feature.extension.performance_settings - openxrExtensionStrings: XR_EXT_performance_settings - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-4965189875087185544 +--- !u!114 &-8689481617817325614 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -174,18 +149,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} - m_Name: MicrosoftMotionControllerProfile Standalone + m_Script: {fileID: 11500000, guid: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Microsoft Motion Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.microsoftmotioncontroller + nameUi: + version: + featureIdInternal: openxrExtensionStrings: - company: Unity + company: priority: 0 required: 0 ---- !u!114 &-4892842299608769327 +--- !u!114 &-8660765809959877521 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -194,19 +169,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7de993716e042c6499d0c18eed3a773c, type: 3} - m_Name: MockRuntime Standalone + m_Script: {fileID: 11500000, guid: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Mock Runtime - version: 0.0.2 - featureIdInternal: com.unity.openxr.feature.mockruntime - openxrExtensionStrings: XR_UNITY_null_gfx XR_UNITY_android_present - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 - ignoreValidationErrors: 0 ---- !u!114 &-4400914749312113033 +--- !u!114 &-8480742177966435414 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -215,20 +189,20 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 056125dd64c0ed540b40a4af74f7b495, type: 3} - m_Name: RuntimeDebuggerOpenXRFeature Standalone + m_Script: {fileID: 11500000, guid: b5a1f07dc5afe854f9f12a4194aca3fb, type: 3} + m_Name: iPhone m_EditorClassIdentifier: - m_enabled: 0 - nameUi: Runtime Debugger - version: 1 - featureIdInternal: com.unity.openxr.features.runtimedebugger - openxrExtensionStrings: - company: Unity - priority: 0 - required: 0 - cacheSize: 1048576 - perThreadCacheSize: 51200 ---- !u!114 &-3947811099833192623 + features: + - {fileID: 150516425967632419} + m_renderMode: 1 + m_autoColorSubmissionMode: 1 + m_colorSubmissionModes: + m_List: 00000000 + m_depthSubmissionMode: 0 + m_optimizeBufferDiscards: 0 + m_symmetricProjection: 0 + m_foveatedRenderingApi: 0 +--- !u!114 &-8449490089235164379 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -237,18 +211,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} - m_Name: EyeGazeInteraction Standalone + m_Script: {fileID: 11500000, guid: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Eye Gaze Interaction Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.eyetracking - openxrExtensionStrings: XR_EXT_eye_gaze_interaction - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-3481186317179906858 +--- !u!114 &-8287648878952414682 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -257,18 +231,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 274c02963f889a64e90bc2e596e21d13, type: 3} - m_Name: HTCViveControllerProfile Standalone + m_Script: {fileID: 11500000, guid: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: HTC Vive Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.htcvive + nameUi: + version: + featureIdInternal: openxrExtensionStrings: - company: Unity + company: priority: 0 required: 0 ---- !u!114 &-3067746823929701400 +--- !u!114 &-8180060128018235156 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -277,18 +251,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} - m_Name: ValveIndexControllerProfile Standalone + m_Script: {fileID: 11500000, guid: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Valve Index Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.valveindex + nameUi: + version: + featureIdInternal: openxrExtensionStrings: - company: Unity + company: priority: 0 required: 0 ---- !u!114 &-2526980850138402404 +--- !u!114 &-8141607500619013533 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -297,31 +271,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9c5b5af5107e35a43818d5411328bfc3, type: 3} - m_Name: DPadInteraction Standalone + m_Script: {fileID: 11500000, guid: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Standalone m_EditorClassIdentifier: - m_enabled: 0 - nameUi: D-Pad Binding + m_enabled: 1 + nameUi: Meta Quest Touch Pro Controller Profile version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.dpadinteraction - openxrExtensionStrings: XR_KHR_binding_modification XR_EXT_dpad_binding + featureIdInternal: com.unity.openxr.feature.input.metaquestpro + openxrExtensionStrings: XR_FB_touch_controller_pro company: Unity priority: 0 required: 0 - forceThresholdLeft: 0.5 - forceThresholdReleaseLeft: 0.4 - centerRegionLeft: 0.5 - wedgeAngleLeft: 1.5707964 - isStickyLeft: 0 - forceThresholdRight: 0.5 - forceThresholdReleaseRight: 0.4 - centerRegionRight: 0.5 - wedgeAngleRight: 1.5707964 - isStickyRight: 0 - extensionStrings: - - XR_KHR_binding_modification - - XR_EXT_dpad_binding ---- !u!114 &-2392335432687893224 +--- !u!114 &-8104559056210110154 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -330,18 +291,20 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} - m_Name: MetaQuestTouchProControllerProfile Android + m_Script: {fileID: 11500000, guid: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Meta Quest Touch Pro Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.metaquestpro - openxrExtensionStrings: XR_FB_touch_controller_pro - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-2205730756659651877 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &-8038501305765375674 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -350,20 +313,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9ef793c31862a37448e907829482ef80, type: 3} - m_Name: OculusQuestFeature Android + m_Script: {fileID: 11500000, guid: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Oculus Quest Support - version: 1.0.0 - featureIdInternal: com.unity.openxr.feature.oculusquest - openxrExtensionStrings: XR_OCULUS_android_initialize_loader - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 - targetQuest: 1 - targetQuest2: 1 ---- !u!114 &-1805090261162031303 +--- !u!114 &-8015468987978074896 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -372,18 +333,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5019471fb2174e5c852ecd4047163007, type: 3} - m_Name: HandInteractionProfile Standalone + m_Script: {fileID: 11500000, guid: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Hand Interaction Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.handinteraction - openxrExtensionStrings: XR_EXT_hand_interaction - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &-988451475663862392 +--- !u!114 &-7974790057657267511 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -392,18 +353,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: feeef8d85de8db242bdda70cc7ff5acd, type: 3} - m_Name: OculusTouchControllerProfile Android + m_Script: {fileID: 11500000, guid: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Oculus Touch Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.oculustouch + nameUi: + version: + featureIdInternal: openxrExtensionStrings: - company: Unity + company: priority: 0 required: 0 ---- !u!114 &-407388711334016663 +--- !u!114 &-7973237705873253221 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -412,19 +373,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7de993716e042c6499d0c18eed3a773c, type: 3} - m_Name: MockRuntime Android + m_Script: {fileID: 11500000, guid: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Mock Runtime - version: 0.0.2 - featureIdInternal: com.unity.openxr.feature.mockruntime - openxrExtensionStrings: XR_UNITY_null_gfx XR_UNITY_android_present - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 - ignoreValidationErrors: 0 ---- !u!114 &11400000 +--- !u!114 &-7946373735670643075 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -433,15 +393,3278 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9f0ebc320a151d3408ea1e9fce54d40e, type: 3} + m_Script: {fileID: 11500000, guid: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-7874029990419393675 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: HP Reverb G2 Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.hpreverb + openxrExtensionStrings: XR_EXT_hp_mixed_reality_controller + company: Unity + priority: 0 + required: 0 +--- !u!114 &-7833987861575272816 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &-7489318896967549462 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-7277097615073227913 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-7176319058441194828 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-6954008623260848977 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-6612740702643002710 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-6595760480435232717 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-6505736655092226301 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Palm Pose + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.palmpose + openxrExtensionStrings: XR_EXT_palm_pose + company: Unity + priority: 0 + required: 0 +--- !u!114 &-6353450188064078682 +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: f647cc0545697264a9878224faada6d5, type: 3} + m_Name: MetaQuestFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Meta Quest Support + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.metaquest + openxrExtensionStrings: XR_OCULUS_android_initialize_loader + company: Unity + priority: 0 + required: 0 + targetDevices: + - visibleName: Quest + manifestName: quest + enabled: 1 + - visibleName: Quest 2 + manifestName: quest2 + enabled: 1 + - visibleName: Quest Pro + manifestName: cambria + enabled: 1 + - visibleName: Quest 3 + manifestName: eureka + enabled: 1 + - visibleName: Quest 3S + manifestName: quest3s + enabled: 1 + forceRemoveInternetPermission: 1 + symmetricProjection: 0 + foveatedRenderingApi: 0 + systemSplashScreen: {fileID: 0} + optimizeBufferDiscards: 1 + lateLatchingMode: 0 + lateLatchingDebug: 0 +--- !u!114 &-6123245105893205590 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-6093844381113413320 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-5571120672260222551 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Meta Quest Touch Pro Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.metaquestpro + openxrExtensionStrings: XR_FB_touch_controller_pro + company: Unity + priority: 0 + required: 0 +--- !u!114 &-5504248448347643536 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-5463030417629842242 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Hand Interaction Poses + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.handinteractionposes + openxrExtensionStrings: XR_EXT_hand_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &-5455767046364352404 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: XR Performance Settings + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.extension.performance_settings + openxrExtensionStrings: XR_EXT_performance_settings + company: Unity + priority: 0 + required: 0 +--- !u!114 &-5326501729773820666 +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: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-5197223467057920676 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-5165707612120655221 +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: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4979040574654513408 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4970532917879007324 +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: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4965189875087185544 +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: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Microsoft Motion Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.microsoftmotioncontroller + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &-4925435974211607266 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &-4892842299608769327 +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: 7de993716e042c6499d0c18eed3a773c, type: 3} + m_Name: MockRuntime Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Mock Runtime + version: 0.0.2 + featureIdInternal: com.unity.openxr.feature.mockruntime + openxrExtensionStrings: XR_UNITY_null_gfx XR_UNITY_android_present + company: Unity + priority: 0 + required: 0 + ignoreValidationErrors: 0 +--- !u!114 &-4879851076911344971 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4774432323304895574 +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: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4754704500655392286 +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: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4735231286265850410 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4700713081110919659 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4557709088088578581 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4405334526841171831 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4400914749312113033 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Runtime Debugger + version: 1 + featureIdInternal: com.unity.openxr.features.runtimedebugger + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &-4212803103593108369 +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: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-4185438069820594488 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-3947811099833192623 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Eye Gaze Interaction Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.eyetracking + openxrExtensionStrings: XR_EXT_eye_gaze_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &-3917015567841864070 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Conformance Automation + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.conformance + openxrExtensionStrings: XR_EXT_conformance_automation + company: Unity + priority: 0 + required: 0 +--- !u!114 &-3912761374203824118 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-3853248089953426105 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: XR Performance Settings + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.extension.performance_settings + openxrExtensionStrings: XR_EXT_performance_settings + company: Unity + priority: 0 + required: 0 +--- !u!114 &-3844885613294109969 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-3807426226486117247 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &-3721166285035205746 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-3707494506182370897 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &-3481186317179906858 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: HTC Vive Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.htcvive + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &-3222872438413759493 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-3067746823929701400 +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: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Valve Index Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.valveindex + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &-2962410621290429272 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &-2943356751785214813 +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: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Khronos Simple Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.khrsimpleprofile + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &-2917820322241244460 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2878563404678077731 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2739858783000164822 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2526980850138402404 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: D-Pad Binding + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.dpadinteraction + openxrExtensionStrings: XR_KHR_binding_modification XR_EXT_dpad_binding + company: Unity + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &-2457578132578730896 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2425120766486761383 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2394982495241047478 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2392335432687893224 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Meta Quest Touch Pro Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.metaquestpro + openxrExtensionStrings: XR_FB_touch_controller_pro + company: Unity + priority: 0 + required: 0 +--- !u!114 &-2296218668639198918 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2205730756659651877 +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: 9ef793c31862a37448e907829482ef80, type: 3} + m_Name: OculusQuestFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Oculus Quest Support + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.oculusquest + openxrExtensionStrings: XR_OCULUS_android_initialize_loader + company: Unity + priority: 0 + required: 0 + targetQuest: 1 + targetQuest2: 1 +--- !u!114 &-2137792462930386082 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-2010400633503968482 +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: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-1805090261162031303 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Hand Interaction Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.handinteraction + openxrExtensionStrings: XR_EXT_hand_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &-1263204550744361851 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-1183816839064744230 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-1094726287188055678 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-1027567614680452563 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-1021001810919318927 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-988451475663862392 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Oculus Touch Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.oculustouch + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &-894910460077932069 +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: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-826303195979277017 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Runtime Debugger + version: 1 + featureIdInternal: com.unity.openxr.features.runtimedebugger + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &-779650726374022166 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: HTC Vive Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.htcvive + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &-728303251325356924 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &-722511669274494815 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-717126885562447233 +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: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-554475428135649586 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-541949512201318586 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-430662312889797575 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &-407388711334016663 +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: 7de993716e042c6499d0c18eed3a773c, type: 3} + m_Name: MockRuntime Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Mock Runtime + version: 0.0.2 + featureIdInternal: com.unity.openxr.feature.mockruntime + openxrExtensionStrings: XR_UNITY_null_gfx XR_UNITY_android_present + company: Unity + priority: 0 + required: 0 + ignoreValidationErrors: 0 +--- !u!114 &-257692026993441408 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Foveated Rendering + version: 1 + featureIdInternal: com.unity.openxr.feature.foveatedrendering + openxrExtensionStrings: XR_UNITY_foveation XR_FB_foveation XR_FB_foveation_configuration + XR_FB_swapchain_update_state XR_FB_foveation_vulkan XR_META_foveation_eye_tracked + XR_META_vulkan_swapchain_create_info + company: Unity + priority: 0 + required: 0 +--- !u!114 &-176776863547417067 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-156899396787623562 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-38571763592580234 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &-35577016049116607 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !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: 9f0ebc320a151d3408ea1e9fce54d40e, type: 3} m_Name: OpenXR Package Settings m_EditorClassIdentifier: - Keys: 010000000400000007000000 - Values: - - {fileID: 6720732313735848337} - - {fileID: -8480742177966435414} - - {fileID: 4754762928077386648} ---- !u!114 &150516425967632419 + Keys: 0100000004000000070000000e000000 + Values: + - {fileID: 6720732313735848337} + - {fileID: -8480742177966435414} + - {fileID: 4754762928077386648} + - {fileID: 6881802674578076984} +--- !u!114 &295190552187114 +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: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Microsoft Motion Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.microsoftmotioncontroller + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &150516425967632419 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature iPhone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: XR Performance Settings + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.extension.performance_settings + openxrExtensionStrings: XR_EXT_performance_settings + company: Unity + priority: 0 + required: 0 +--- !u!114 &255144530417640615 +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: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Microsoft Hand Interaction Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.handtracking + openxrExtensionStrings: XR_MSFT_hand_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &433512072313469995 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &506701419566192321 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &723146401394516650 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Oculus Touch Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.oculustouch + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &840823509415557435 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Palm Pose + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.palmpose + openxrExtensionStrings: XR_EXT_palm_pose + company: Unity + priority: 0 + required: 0 +--- !u!114 &871385507866960553 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &906263844854402413 +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: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &921399241036640687 +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: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1005890211639025085 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1029594719130214147 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1116022970532071023 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1304650415944970406 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &1448232204692170381 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1491299817029460086 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Hand Interaction Poses + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.handinteractionposes + openxrExtensionStrings: XR_EXT_hand_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &1713893748857591340 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1730277169647170336 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1843555929309568881 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &1944063264941221717 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &1993605784353379858 +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: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2007415869010663154 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2011043171049954229 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2160245351764002572 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2173430932292538719 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2221893475934459970 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2225437875004127212 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2403879421201120441 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2654311997692106484 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2759167775958018371 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2907523809790945401 +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: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &2951383461324372489 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &3122387460561219871 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &3210100703034001060 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &3270009185079835776 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &3289850366409700924 +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: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Microsoft Hand Interaction Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.handtracking + openxrExtensionStrings: XR_MSFT_hand_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &3367899108047196998 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &3423868815022314577 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &3766112633672159336 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Eye Gaze Interaction Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.eyetracking + openxrExtensionStrings: XR_EXT_eye_gaze_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &3799361135406044814 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Hand Interaction Poses + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.handinteractionposes + openxrExtensionStrings: XR_EXT_hand_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &3814908315504480874 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &3951445593470091291 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Standalone + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Meta Quest Touch Plus Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.metaquestplus + openxrExtensionStrings: XR_META_touch_controller_plus + company: Unity + priority: 0 + required: 0 +--- !u!114 &3953130378588601136 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &4294598169895833641 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &4337980861955204596 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Palm Pose + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.palmpose + openxrExtensionStrings: XR_EXT_palm_pose + company: Unity + priority: 0 + required: 0 +--- !u!114 &4376591911239922703 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &4388410013609094914 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &4476391441633104268 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &4493372947754422219 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Runtime Debugger + version: 1 + featureIdInternal: com.unity.openxr.features.runtimedebugger + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &4636866252723802683 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: D-Pad Binding + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.dpadinteraction + openxrExtensionStrings: XR_KHR_binding_modification XR_EXT_dpad_binding + company: Unity + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &4754762928077386648 +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: b5a1f07dc5afe854f9f12a4194aca3fb, type: 3} + m_Name: Android + m_EditorClassIdentifier: + features: + - {fileID: 6763875769094488454} + - {fileID: 4636866252723802683} + - {fileID: 3766112633672159336} + - {fileID: 6232199339932794114} + - {fileID: 3799361135406044814} + - {fileID: 7979422117848197048} + - {fileID: 5543727010055294169} + - {fileID: -6353450188064078682} + - {fileID: 5982904420724867141} + - {fileID: -2392335432687893224} + - {fileID: 7420103928664751057} + - {fileID: -407388711334016663} + - {fileID: -2205730756659651877} + - {fileID: -988451475663862392} + - {fileID: 4337980861955204596} + - {fileID: 4493372947754422219} + - {fileID: -5455767046364352404} + m_renderMode: 1 + m_autoColorSubmissionMode: 1 + m_colorSubmissionModes: + m_List: 00000000 + m_depthSubmissionMode: 0 + m_optimizeBufferDiscards: 0 + m_symmetricProjection: 0 + m_foveatedRenderingApi: 0 +--- !u!114 &4765277746214703712 +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: feeef8d85de8db242bdda70cc7ff5acd, type: 3} + m_Name: OculusTouchControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Oculus Touch Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.oculustouch + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &4842097191953275897 +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: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &4855123594827299432 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &4864828913385178360 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5072747455443800614 +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: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5166356348311984921 +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: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Eye Gaze Interaction Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.eyetracking + openxrExtensionStrings: XR_EXT_eye_gaze_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &5297861624307593250 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5543727010055294169 +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: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Khronos Simple Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.khrsimpleprofile + openxrExtensionStrings: + company: Unity + priority: 0 + required: 0 +--- !u!114 &5556226877499910674 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5597083357542368468 +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: e5315f812f023cf4ebf26f7e5d2d70f2, type: 3} + m_Name: HPReverbG2ControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: HP Reverb G2 Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.hpreverb + openxrExtensionStrings: XR_EXT_hp_mixed_reality_controller + company: Unity + priority: 0 + required: 0 +--- !u!114 &5689537228945874757 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5735932875947943510 +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: f028123e2efe1d443875bc7609b4a98b, type: 3} + m_Name: PalmPoseInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5745605905643392576 +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: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5792518264092437303 +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: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Hand Interaction Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.handinteraction + openxrExtensionStrings: XR_EXT_hand_interaction + company: Unity + priority: 0 + required: 0 +--- !u!114 &5871049651721443982 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Meta Quest Touch Plus Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.metaquestplus + openxrExtensionStrings: XR_META_touch_controller_plus + company: Unity + priority: 0 + required: 0 +--- !u!114 &5909130303111252921 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &5982904420724867141 +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: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} + m_Name: MetaQuestTouchPlusControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Meta Quest Touch Plus Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.metaquestplus + openxrExtensionStrings: XR_META_touch_controller_plus + company: Unity + priority: 0 + required: 0 +--- !u!114 &6058290333418857263 +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: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &6215922587154582852 +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: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &6232199339932794114 +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: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Foveated Rendering + version: 1 + featureIdInternal: com.unity.openxr.feature.foveatedrendering + openxrExtensionStrings: XR_UNITY_foveation XR_FB_foveation XR_FB_foveation_configuration + XR_FB_swapchain_update_state XR_FB_foveation_vulkan XR_META_foveation_eye_tracked + XR_META_vulkan_swapchain_create_info + company: Unity + priority: 0 + required: 0 +--- !u!114 &6625706370063016862 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &6634803791765170270 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -450,18 +3673,111 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} - m_Name: XrPerformanceSettingsFeature iPhone + m_Script: {fileID: 11500000, guid: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: XR Performance Settings - version: 1.0.0 - featureIdInternal: com.unity.openxr.feature.extension.performance_settings - openxrExtensionStrings: XR_EXT_performance_settings + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &6676456486388223703 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: D-Pad Binding + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.dpadinteraction + openxrExtensionStrings: XR_KHR_binding_modification XR_EXT_dpad_binding company: Unity priority: 0 required: 0 ---- !u!114 &255144530417640615 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &6720732313735848337 +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: b5a1f07dc5afe854f9f12a4194aca3fb, type: 3} + m_Name: Standalone + m_EditorClassIdentifier: + features: + - {fileID: 8283933750968859912} + - {fileID: -2526980850138402404} + - {fileID: -3947811099833192623} + - {fileID: 7080769659189660161} + - {fileID: -5463030417629842242} + - {fileID: -1805090261162031303} + - {fileID: -7874029990419393675} + - {fileID: -3481186317179906858} + - {fileID: 8572673679526423431} + - {fileID: 3951445593470091291} + - {fileID: -8141607500619013533} + - {fileID: 255144530417640615} + - {fileID: -4965189875087185544} + - {fileID: -4892842299608769327} + - {fileID: 723146401394516650} + - {fileID: -6505736655092226301} + - {fileID: -4400914749312113033} + - {fileID: -3067746823929701400} + - {fileID: 7688276769643093682} + m_renderMode: 1 + m_autoColorSubmissionMode: 1 + m_colorSubmissionModes: + m_List: 00000000 + m_depthSubmissionMode: 0 + m_optimizeBufferDiscards: 0 + m_symmetricProjection: 0 + m_foveatedRenderingApi: 0 +--- !u!114 &6722584397610771260 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &6744314071803553091 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -471,17 +3787,37 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f928d0d73a35f294fbe357ca17aa3547, type: 3} - m_Name: MicrosoftHandInteraction Standalone + m_Name: MicrosoftHandInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Microsoft Hand Interaction Profile + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &6763875769094488454 +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: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Conformance Automation version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.handtracking - openxrExtensionStrings: XR_MSFT_hand_interaction + featureIdInternal: com.unity.openxr.feature.conformance + openxrExtensionStrings: XR_EXT_conformance_automation company: Unity priority: 0 required: 0 ---- !u!114 &723146401394516650 +--- !u!114 &6781224255462356475 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -490,18 +3826,117 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: feeef8d85de8db242bdda70cc7ff5acd, type: 3} - m_Name: OculusTouchControllerProfile Standalone + m_Script: {fileID: 11500000, guid: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Oculus Touch Controller Profile + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &6881802674578076984 +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: b5a1f07dc5afe854f9f12a4194aca3fb, type: 3} + m_Name: Metro + m_EditorClassIdentifier: + features: + - {fileID: -3917015567841864070} + - {fileID: 6676456486388223703} + - {fileID: 5166356348311984921} + - {fileID: -257692026993441408} + - {fileID: 1491299817029460086} + - {fileID: 5792518264092437303} + - {fileID: 5597083357542368468} + - {fileID: -779650726374022166} + - {fileID: -2943356751785214813} + - {fileID: 5871049651721443982} + - {fileID: -5571120672260222551} + - {fileID: 3289850366409700924} + - {fileID: 295190552187114} + - {fileID: 4765277746214703712} + - {fileID: 840823509415557435} + - {fileID: -826303195979277017} + - {fileID: 7062488806547891410} + - {fileID: -3853248089953426105} + m_renderMode: 1 + m_autoColorSubmissionMode: 1 + m_colorSubmissionModes: + m_List: 00000000 + m_depthSubmissionMode: 0 + m_optimizeBufferDiscards: 0 + m_symmetricProjection: 0 + m_foveatedRenderingApi: 0 +--- !u!114 &6971260428369757617 +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: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} + m_Name: HandCommonPosesInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &6985240334640814595 +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: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &7062488806547891410 +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: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: Valve Index Controller Profile version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.oculustouch + featureIdInternal: com.unity.openxr.feature.input.valveindex openxrExtensionStrings: company: Unity priority: 0 required: 0 ---- !u!114 &3766112633672159336 +--- !u!114 &7080769659189660161 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -510,18 +3945,53 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} - m_Name: EyeGazeInteraction Android + m_Script: {fileID: 11500000, guid: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Standalone m_EditorClassIdentifier: m_enabled: 0 - nameUi: Eye Gaze Interaction Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.eyetracking - openxrExtensionStrings: XR_EXT_eye_gaze_interaction + nameUi: Foveated Rendering + version: 1 + featureIdInternal: com.unity.openxr.feature.foveatedrendering + openxrExtensionStrings: XR_UNITY_foveation XR_FB_foveation XR_FB_foveation_configuration + XR_FB_swapchain_update_state XR_FB_foveation_vulkan XR_META_foveation_eye_tracked + XR_META_vulkan_swapchain_create_info company: Unity priority: 0 required: 0 ---- !u!114 &3799361135406044814 +--- !u!114 &7204056877081219736 +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: 9c5b5af5107e35a43818d5411328bfc3, type: 3} + m_Name: DPadInteraction Metro + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 + forceThresholdLeft: 0.5 + forceThresholdReleaseLeft: 0.4 + centerRegionLeft: 0.5 + wedgeAngleLeft: 1.5707964 + isStickyLeft: 0 + forceThresholdRight: 0.5 + forceThresholdReleaseRight: 0.4 + centerRegionRight: 0.5 + wedgeAngleRight: 1.5707964 + isStickyRight: 0 + extensionStrings: + - XR_KHR_binding_modification + - XR_EXT_dpad_binding +--- !u!114 &7261309940960641879 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -530,18 +4000,20 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a24be4b5ebfe5f4d8ed1de9b25cb7aa, type: 3} - m_Name: HandCommonPosesInteraction Android + m_Script: {fileID: 11500000, guid: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Hand Interaction Poses - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.handinteractionposes - openxrExtensionStrings: XR_EXT_hand_interaction - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &3951445593470091291 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &7339528489370762292 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -550,18 +4022,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} - m_Name: MetaQuestTouchPlusControllerProfile Standalone + m_Script: {fileID: 11500000, guid: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Meta Quest Touch Plus Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.metaquestplus - openxrExtensionStrings: XR_META_touch_controller_plus - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &4337980861955204596 +--- !u!114 &7420103928664751057 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -570,18 +4042,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f028123e2efe1d443875bc7609b4a98b, type: 3} - m_Name: PalmPoseInteraction Android + m_Script: {fileID: 11500000, guid: f928d0d73a35f294fbe357ca17aa3547, type: 3} + m_Name: MicrosoftHandInteraction Android m_EditorClassIdentifier: m_enabled: 0 - nameUi: Palm Pose + nameUi: Microsoft Hand Interaction Profile version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.palmpose - openxrExtensionStrings: XR_EXT_palm_pose + featureIdInternal: com.unity.openxr.feature.input.handtracking + openxrExtensionStrings: XR_MSFT_hand_interaction company: Unity priority: 0 required: 0 ---- !u!114 &4493372947754422219 +--- !u!114 &7688276769643093682 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -590,20 +4062,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 056125dd64c0ed540b40a4af74f7b495, type: 3} - m_Name: RuntimeDebuggerOpenXRFeature Android + m_Script: {fileID: 11500000, guid: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} + m_Name: XrPerformanceSettingsFeature Standalone m_EditorClassIdentifier: m_enabled: 0 - nameUi: Runtime Debugger - version: 1 - featureIdInternal: com.unity.openxr.features.runtimedebugger - openxrExtensionStrings: + nameUi: XR Performance Settings + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.extension.performance_settings + openxrExtensionStrings: XR_EXT_performance_settings company: Unity priority: 0 required: 0 - cacheSize: 1048576 - perThreadCacheSize: 51200 ---- !u!114 &4636866252723802683 +--- !u!114 &7764656038893214045 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -612,31 +4082,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9c5b5af5107e35a43818d5411328bfc3, type: 3} - m_Name: DPadInteraction Android + m_Script: {fileID: 11500000, guid: b3cf79659a011bd419c7a2a30eb74e9a, type: 3} + m_Name: EyeGazeInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: D-Pad Binding - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.dpadinteraction - openxrExtensionStrings: XR_KHR_binding_modification XR_EXT_dpad_binding - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 - forceThresholdLeft: 0.5 - forceThresholdReleaseLeft: 0.4 - centerRegionLeft: 0.5 - wedgeAngleLeft: 1.5707964 - isStickyLeft: 0 - forceThresholdRight: 0.5 - forceThresholdReleaseRight: 0.4 - centerRegionRight: 0.5 - wedgeAngleRight: 1.5707964 - isStickyRight: 0 - extensionStrings: - - XR_KHR_binding_modification - - XR_EXT_dpad_binding ---- !u!114 &4754762928077386648 +--- !u!114 &7812483279457637577 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -645,36 +4102,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b5a1f07dc5afe854f9f12a4194aca3fb, type: 3} - m_Name: Android + m_Script: {fileID: 11500000, guid: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro m_EditorClassIdentifier: - features: - - {fileID: 6763875769094488454} - - {fileID: 4636866252723802683} - - {fileID: 3766112633672159336} - - {fileID: 6232199339932794114} - - {fileID: 3799361135406044814} - - {fileID: 7979422117848197048} - - {fileID: 5543727010055294169} - - {fileID: -6353450188064078682} - - {fileID: 5982904420724867141} - - {fileID: -2392335432687893224} - - {fileID: 7420103928664751057} - - {fileID: -407388711334016663} - - {fileID: -2205730756659651877} - - {fileID: -988451475663862392} - - {fileID: 4337980861955204596} - - {fileID: 4493372947754422219} - - {fileID: -5455767046364352404} - m_renderMode: 1 - m_autoColorSubmissionMode: 1 - m_colorSubmissionModes: - m_List: 00000000 - m_depthSubmissionMode: 0 - m_optimizeBufferDiscards: 0 - m_symmetricProjection: 0 - m_foveatedRenderingApi: 0 ---- !u!114 &5543727010055294169 + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &7979422117848197048 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -683,18 +4122,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} - m_Name: KHRSimpleControllerProfile Android + m_Script: {fileID: 11500000, guid: 5019471fb2174e5c852ecd4047163007, type: 3} + m_Name: HandInteractionProfile Android m_EditorClassIdentifier: m_enabled: 0 - nameUi: Khronos Simple Controller Profile + nameUi: Hand Interaction Profile version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.khrsimpleprofile - openxrExtensionStrings: + featureIdInternal: com.unity.openxr.feature.input.handinteraction + openxrExtensionStrings: XR_EXT_hand_interaction company: Unity priority: 0 required: 0 ---- !u!114 &5982904420724867141 +--- !u!114 &8196777932801234469 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -703,18 +4142,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2b7365b139f7aec43b23d26b7a48b5a6, type: 3} - m_Name: MetaQuestTouchPlusControllerProfile Android + m_Script: {fileID: 11500000, guid: c4b862ee14fb479fbfe5fffe655d3ed3, type: 3} + m_Name: MetaQuestTouchProControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Meta Quest Touch Plus Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.metaquestplus - openxrExtensionStrings: XR_META_touch_controller_plus - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &6232199339932794114 +--- !u!114 &8283933750968859912 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -723,20 +4162,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} - m_Name: FoveatedRenderingFeature Android + m_Script: {fileID: 11500000, guid: 486b5e28864f9a94b979b9620ce5006d, type: 3} + m_Name: ConformanceAutomationFeature Standalone m_EditorClassIdentifier: m_enabled: 0 - nameUi: Foveated Rendering - version: 1 - featureIdInternal: com.unity.openxr.feature.foveatedrendering - openxrExtensionStrings: XR_UNITY_foveation XR_FB_foveation XR_FB_foveation_configuration - XR_FB_swapchain_update_state XR_FB_foveation_vulkan XR_META_foveation_eye_tracked - XR_META_vulkan_swapchain_create_info + nameUi: Conformance Automation + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.conformance + openxrExtensionStrings: XR_EXT_conformance_automation company: Unity priority: 0 required: 0 ---- !u!114 &6720732313735848337 +--- !u!114 &8337097250066816944 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -745,38 +4182,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b5a1f07dc5afe854f9f12a4194aca3fb, type: 3} - m_Name: Standalone + m_Script: {fileID: 11500000, guid: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Metro m_EditorClassIdentifier: - features: - - {fileID: 8283933750968859912} - - {fileID: -2526980850138402404} - - {fileID: -3947811099833192623} - - {fileID: 7080769659189660161} - - {fileID: -5463030417629842242} - - {fileID: -1805090261162031303} - - {fileID: -7874029990419393675} - - {fileID: -3481186317179906858} - - {fileID: 8572673679526423431} - - {fileID: 3951445593470091291} - - {fileID: -8141607500619013533} - - {fileID: 255144530417640615} - - {fileID: -4965189875087185544} - - {fileID: -4892842299608769327} - - {fileID: 723146401394516650} - - {fileID: -6505736655092226301} - - {fileID: -4400914749312113033} - - {fileID: -3067746823929701400} - - {fileID: 7688276769643093682} - m_renderMode: 1 - m_autoColorSubmissionMode: 1 - m_colorSubmissionModes: - m_List: 00000000 - m_depthSubmissionMode: 0 - m_optimizeBufferDiscards: 0 - m_symmetricProjection: 0 - m_foveatedRenderingApi: 0 ---- !u!114 &6763875769094488454 + m_enabled: 0 + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: + priority: 0 + required: 0 +--- !u!114 &8359766649784405891 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -785,18 +4202,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 486b5e28864f9a94b979b9620ce5006d, type: 3} - m_Name: ConformanceAutomationFeature Android + m_Script: {fileID: 11500000, guid: 274c02963f889a64e90bc2e596e21d13, type: 3} + m_Name: HTCViveControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Conformance Automation - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.conformance - openxrExtensionStrings: XR_EXT_conformance_automation - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &7080769659189660161 +--- !u!114 &8572673679526423431 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -805,20 +4222,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} - m_Name: FoveatedRenderingFeature Standalone + m_Script: {fileID: 11500000, guid: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} + m_Name: KHRSimpleControllerProfile Standalone m_EditorClassIdentifier: m_enabled: 0 - nameUi: Foveated Rendering - version: 1 - featureIdInternal: com.unity.openxr.feature.foveatedrendering - openxrExtensionStrings: XR_UNITY_foveation XR_FB_foveation XR_FB_foveation_configuration - XR_FB_swapchain_update_state XR_FB_foveation_vulkan XR_META_foveation_eye_tracked - XR_META_vulkan_swapchain_create_info + nameUi: Khronos Simple Controller Profile + version: 0.0.1 + featureIdInternal: com.unity.openxr.feature.input.khrsimpleprofile + openxrExtensionStrings: company: Unity priority: 0 required: 0 ---- !u!114 &7420103928664751057 +--- !u!114 &8683859937696144893 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -828,17 +4243,17 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f928d0d73a35f294fbe357ca17aa3547, type: 3} - m_Name: MicrosoftHandInteraction Android + m_Name: MicrosoftHandInteraction Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Microsoft Hand Interaction Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.handtracking - openxrExtensionStrings: XR_MSFT_hand_interaction - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &7688276769643093682 +--- !u!114 &8686070187844061665 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -847,18 +4262,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b213d3e3c7f3109449eb46a4c8ee42f0, type: 3} - m_Name: XrPerformanceSettingsFeature Standalone + m_Script: {fileID: 11500000, guid: 761fdd4502cb7a84e9ec7a2b24f33f37, type: 3} + m_Name: MicrosoftMotionControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: XR Performance Settings - version: 1.0.0 - featureIdInternal: com.unity.openxr.feature.extension.performance_settings - openxrExtensionStrings: XR_EXT_performance_settings - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &7979422117848197048 +--- !u!114 &8737096759934822303 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -867,18 +4282,20 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5019471fb2174e5c852ecd4047163007, type: 3} - m_Name: HandInteractionProfile Android + m_Script: {fileID: 11500000, guid: 056125dd64c0ed540b40a4af74f7b495, type: 3} + m_Name: RuntimeDebuggerOpenXRFeature Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Hand Interaction Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.handinteraction - openxrExtensionStrings: XR_EXT_hand_interaction - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &8283933750968859912 + cacheSize: 1048576 + perThreadCacheSize: 51200 +--- !u!114 &8781831793487042998 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -887,18 +4304,18 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 486b5e28864f9a94b979b9620ce5006d, type: 3} - m_Name: ConformanceAutomationFeature Standalone + m_Script: {fileID: 11500000, guid: f6a75d1f5ff90154ea2a8e58222a1f59, type: 3} + m_Name: FoveatedRenderingFeature Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Conformance Automation - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.conformance - openxrExtensionStrings: XR_EXT_conformance_automation - company: Unity + nameUi: + version: + featureIdInternal: + openxrExtensionStrings: + company: priority: 0 required: 0 ---- !u!114 &8572673679526423431 +--- !u!114 &9210645084577529620 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -907,14 +4324,14 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0f6bfdbcb316ed242b30a8798c9eb853, type: 3} - m_Name: KHRSimpleControllerProfile Standalone + m_Script: {fileID: 11500000, guid: 0d6ccd3d0ef0f1d458e69421dccbdae1, type: 3} + m_Name: ValveIndexControllerProfile Metro m_EditorClassIdentifier: m_enabled: 0 - nameUi: Khronos Simple Controller Profile - version: 0.0.1 - featureIdInternal: com.unity.openxr.feature.input.khrsimpleprofile + nameUi: + version: + featureIdInternal: openxrExtensionStrings: - company: Unity + company: priority: 0 required: 0 diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco.meta similarity index 57% rename from unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef.meta rename to unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco.meta index 0005306..56f7f15 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef.meta +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco.meta @@ -1,6 +1,7 @@ fileFormatVersion: 2 -guid: 41c3aeca0c91fe34199a41f6cca03a82 -AssemblyDefinitionImporter: +guid: 479196f5ab9f0644bb32fddf3dbb971e +folderAsset: yes +DefaultImporter: externalObjects: {} userData: assetBundleName: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0.png similarity index 100% rename from unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png rename to unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0.png diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0.png.meta similarity index 88% rename from unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png.meta rename to unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0.png.meta index de83c62..1f53a0a 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0.png.meta +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 99ba8abd78d0afd41811151cf809f5b7 +guid: 431ae114b6b7caa488d8d482dc83349d TextureImporter: internalIDToNameTable: [] externalObjects: {} @@ -106,6 +106,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0_180rotated.png similarity index 100% rename from unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png rename to unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0_180rotated.png diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0_180rotated.png.meta similarity index 98% rename from unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png.meta rename to unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0_180rotated.png.meta index 2e4c3d8..a9b932e 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/4x4_1000-0_180rotated.png.meta +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/4x4_1000-0_180rotated.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 803fd1c227fecfb459cb8ad45f7e34ad +guid: ab7913fe2580f0a4ebda222baffd603b TextureImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png new file mode 100644 index 0000000..879bc3e --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15d26ee6bbf2b183c8d6254136442cb82f33fc32c521167831b58c81e34b1534 +size 4035 diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png.meta new file mode 100644 index 0000000..9c07f4e --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180-2.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: e126cc831598e6048b024b89e352c919 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png new file mode 100644 index 0000000..ca27f84 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:224b44282b39ee027a56f86a1c50a22e31ad506ca9aebf5b2feab138c72d4aa3 +size 4035 diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png.meta new file mode 100644 index 0000000..4a07f93 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ArUco/edited180.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 87ad5e3d82936b34eb8c7804886d7b13 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ImageEdits.meta similarity index 57% rename from unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta rename to unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ImageEdits.meta index 46b36c5..2e7c311 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef.meta +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/ImageEdits.meta @@ -1,6 +1,7 @@ fileFormatVersion: 2 -guid: aaf6de717c7063d47bd9791dc7f03091 -AssemblyDefinitionImporter: +guid: da4de7c1b6acf2d44bba0503e1b56749 +folderAsset: yes +DefaultImporter: externalObjects: {} userData: assetBundleName: diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat index 212fb58..667e472 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Materials/aruco.mat @@ -21,11 +21,10 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: aruco - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Shader: {fileID: 4800000, guid: 650dd9526735d5b46b79224bc6e94025, type: 3} m_Parent: {fileID: 0} m_ModifiedSerializedProperties: 0 - m_ValidKeywords: - - _METALLICSPECGLOSSMAP + m_ValidKeywords: [] m_InvalidKeywords: [] m_LightmapFlags: 4 m_EnableInstancingVariants: 0 @@ -40,7 +39,7 @@ Material: serializedVersion: 3 m_TexEnvs: - _BaseMap: - m_Texture: {fileID: 2800000, guid: 803fd1c227fecfb459cb8ad45f7e34ad, type: 3} + m_Texture: {fileID: 2800000, guid: 87ad5e3d82936b34eb8c7804886d7b13, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _BumpMap: @@ -64,11 +63,11 @@ Material: m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MainTex: - m_Texture: {fileID: 2800000, guid: 803fd1c227fecfb459cb8ad45f7e34ad, type: 3} + m_Texture: {fileID: 2800000, guid: 87ad5e3d82936b34eb8c7804886d7b13, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: - m_Texture: {fileID: 2800000, guid: 803fd1c227fecfb459cb8ad45f7e34ad, type: 3} + m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _OcclusionMap: @@ -102,6 +101,7 @@ Material: - _AlphaToMask: 0 - _Blend: 0 - _BlendModePreserveSpecular: 1 + - _BlendOp: 0 - _BumpScale: 1 - _ClearCoatMask: 0 - _ClearCoatSmoothness: 0 @@ -120,6 +120,7 @@ Material: - _Parallax: 0.005 - _QueueOffset: 0 - _ReceiveShadows: 1 + - _SampleGI: 0 - _Smoothness: 0.5 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 diff --git a/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity index 2db9018..b00685f 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity +++ b/unity/Packages/edu.wpi.cake.arflow/Assets/Scenes/SpacialEval.unity @@ -462,7 +462,7 @@ Light: serializedVersion: 11 m_Type: 1 m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 + m_Intensity: 0.68 m_Range: 10 m_SpotAngle: 30 m_InnerSpotAngle: 21.80208 @@ -504,7 +504,7 @@ Light: m_Lightmapping: 4 m_LightShadowCasterMode: 0 m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 + m_BounceIntensity: 4.12 m_ColorTemperature: 6570 m_UseColorTemperature: 0 m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} @@ -606,6 +606,142 @@ MonoBehaviour: m_EditorClassIdentifier: m_Padding: {x: -8, y: -5, z: -8, w: -5} m_Softness: {x: 0, y: 0} +--- !u!1 &816786076 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 816786077} + - component: {fileID: 816786079} + - component: {fileID: 816786078} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &816786077 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 816786076} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1461297224} + 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 &816786078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 816786076} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Switch to live debugging + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 15 + m_fontSizeBase: 15 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &816786079 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 816786076} + m_CullTransparentMesh: 1 --- !u!1 &1006815206 GameObject: m_ObjectHideFlags: 0 @@ -778,7 +914,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 151, y: -107} + m_AnchoredPosition: {x: 265, y: -156} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1034274603 @@ -1130,6 +1266,127 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1348885246} m_CullTransparentMesh: 1 +--- !u!1 &1461297223 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1461297224} + - component: {fileID: 1461297227} + - component: {fileID: 1461297226} + - component: {fileID: 1461297225} + m_Layer: 5 + m_Name: Switch + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1461297224 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461297223} + 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_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 816786077} + m_Father: {fileID: 1969231322} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 265, y: -106.1} + m_SizeDelta: {x: 160, y: 50.1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1461297225 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461297223} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, 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: 1461297226} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1461297226 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461297223} + 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 &1461297227 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461297223} + m_CullTransparentMesh: 1 --- !u!1 &1493587408 GameObject: m_ObjectHideFlags: 0 @@ -1285,12 +1542,12 @@ PrefabInstance: - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalPosition.x - value: -1.1619852 + value: 0.22 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalPosition.y - value: -0.3762669 + value: 0.11 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} @@ -1300,22 +1557,22 @@ PrefabInstance: - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.w - value: 0.8119817 + value: 0.7989093 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.x - value: -0.5836829 + value: -0.574286 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: -0.14511448 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalRotation.z - value: -0 + value: -0.104313724 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} @@ -1325,7 +1582,7 @@ PrefabInstance: - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} propertyPath: m_LocalEulerAnglesHint.y - value: 0 + value: -20.59 objectReference: {fileID: 0} - target: {fileID: 563518184931968753, guid: 7ec731a7f785a824bb357b690e4e7bfb, type: 3} @@ -1874,6 +2131,7 @@ RectTransform: m_Children: - {fileID: 1263916034} - {fileID: 1034274602} + - {fileID: 1461297224} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -1897,7 +2155,9 @@ MonoBehaviour: activeCamera: {fileID: 1493587411} infoText: {fileID: 1844435562} toggleButton: {fileID: 1034274603} - buttonText: {fileID: 1348885248} + toggleButtonText: {fileID: 1006815208} + switchButton: {fileID: 1461297225} + switchButtonText: {fileID: 816786078} iterationsInput: {fileID: 253401067} --- !u!1 &2031246730 GameObject: diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef b/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef deleted file mode 100644 index 047c864..0000000 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/ArUcoTracking/edu.wpi.cake.arflow.arucotracking.asmdef +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "CakeLab.ARFlow.ArUcoTracking", - "rootNamespace": "", - "references": [ - "GUID:cef0e9dabbfe59a4790acbf31c21f33e", - "GUID:a9420e37d7990b54abdef6688edbe313", - "GUID:92703082f92b41ba80f0d6912de66115", - "GUID:c536cb714a8a9e84cb16ecf0330eea40", - "GUID:e40ba710768534012815d3193fa296cb", - "GUID:dc960734dc080426fa6612f1c5fe95f3", - "GUID:6055be8ebefd69e48b49212b09b47b2f" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs new file mode 100644 index 0000000..196904d --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs @@ -0,0 +1,164 @@ +using UnityEngine; +using OpenCVForUnity.ObjdetectModule; +using OpenCVForUnity.Calib3dModule; +using OpenCVForUnity.CoreModule; +using OpenCVForUnity.ImgprocModule; +using OpenCVForUnity.UnityUtils; +using OpenCVForUnity.UnityUtils.Helper; + +// using CakeLab.ARFlow.; + +namespace CakeLab.ARFlow.Evaluation +{ + using System.Collections.Generic; + using OpenCVForUnityExample; + using TMPro; + using UnityEngine.UI; + + + + /// + /// Class to evaluate the spacial accuracy of the ARFlow system. + /// + + public class ArUcoSpacialEvaluation : SpacialEvaluation + { + List _corners; + List _rejectedCorners; + + + Mat _rgbMat; + + + Mat _camIntrinsics; + Mat ids; + MatOfDouble _distCoeffs; + Dictionary _dictionary; + ArucoDetector _arucoDetector; + + //TODO: configure. For now the default (and used ArUco marker) is 4x4 50 + public int dictionaryId = Objdetect.DICT_4X4_50; + + public ArUcoSpacialEvaluation() + { + + ids = new Mat(); + _corners = new List(); + _rejectedCorners = new List(); + _rgbMat = new Mat(); // Initialize _rgbMat + _distCoeffs = new MatOfDouble(0, 0, 0, 0); + + DetectorParameters detectorParams = new DetectorParameters(); + detectorParams.set_useAruco3Detection(true); + RefineParameters refineParameters = new RefineParameters(10f, 3f, true); + _dictionary = Objdetect.getPredefinedDictionary((int)dictionaryId); + _arucoDetector = new ArucoDetector(_dictionary, detectorParams, refineParameters); + + } + + + /// + /// Obtain the pose of the camera from the captured image. + /// Pose is displayed as the localToWorldMatrix. + /// + /// + /// + // public abstract Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics); + public override Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics) + { + if (camIntrinsics != null) + { + _camIntrinsics = camIntrinsics; + } + + // Initialize _rgbMat with the dimensions of the captured image + if (_rgbMat.empty()) + { + _rgbMat = new Mat(capturedImage.height, capturedImage.width, CvType.CV_8UC3); + } + + Utils.texture2DToMat(capturedImage, _rgbMat); + _arucoDetector.detectMarkers(_rgbMat, _corners, ids, _rejectedCorners); + + return EstimatePoseCanonicalMarker(_rgbMat, markerLength); + } + + private Matrix4x4 EstimatePoseCanonicalMarker(Mat rgbMat, float markerLength) + { + using (MatOfPoint3f objPoints = new MatOfPoint3f( + new Point3(-markerLength / 2f, markerLength / 2f, 0), + new Point3(markerLength / 2f, markerLength / 2f, 0), + new Point3(markerLength / 2f, -markerLength / 2f, 0), + new Point3(-markerLength / 2f, -markerLength / 2f, 0) + )) + { + if (ids.total() > 0) + { + using (Mat rvec = new Mat(1, 1, CvType.CV_64FC3)) + using (Mat tvec = new Mat(1, 1, CvType.CV_64FC3)) + using (Mat corner_4x1 = _corners[0].reshape(2, 4)) // 1*4*CV_32FC2 => 4*1*CV_32FC2 + using (MatOfPoint2f imagePoints = new MatOfPoint2f(corner_4x1)) + { + // Calculate pose marker + Calib3d.solvePnP(objPoints, imagePoints, _camIntrinsics, _distCoeffs, rvec, tvec); + + // // In this example we are processing with RGB color image, so Axis-color correspondences are X: blue, Y: green, Z: red. (Usually X: red, Y: green, Z: blue) + // Calib3d.drawFrameAxes(rgbMat, _camIntrinsics, _distCoeffs, rvec, tvec, markerLength * 0.5f); + + return GetpositionAndQuaternion(rvec, tvec); + } + } + } + + + return Matrix4x4.identity; + } + + private Matrix4x4 GetpositionAndQuaternion(Mat rvec, Mat tvec) + { + // Convert to unity pose data. + double[] rvecArr = new double[3]; + rvec.get(0, 0, rvecArr); + double[] tvecArr = new double[3]; + tvec.get(0, 0, tvecArr); + PoseData poseData = ARUtils.ConvertRvecTvecToPoseData(rvecArr, tvecArr); + + var res = ARUtils.ConvertPoseDataToMatrix(ref poseData, true); + + //Through testing, it is observed that the change in coordinate system is missing for the rotational data. + //Perform coordinate change for rotational data + res = FlipAxes(res); + + return res; + } + + private Matrix4x4 FlipAxes(Matrix4x4 mat){ + + Vector4 col0 = mat.GetColumn(0); + Vector4 col1 = mat.GetColumn(1); + Vector4 col2 = mat.GetColumn(2); + + Matrix4x4 corrected = mat; + corrected.SetColumn(0, col0); // Right + corrected.SetColumn(1, col2); // Up + corrected.SetColumn(2, -col1); // Forward + + return corrected; + } + + public void dispose() + { + _camIntrinsics.Dispose(); + _distCoeffs.Dispose(); + ids.Dispose(); + foreach (var corner in _corners) + { + corner.Dispose(); + } + foreach (var corner in _rejectedCorners) + { + corner.Dispose(); + } + } + } +} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs.meta new file mode 100644 index 0000000..24a8f00 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/ArUcoSpacialEvaluation.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0e9cf54eeac01614a8e31f303a28acfc \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs index 61ef3a7..e5dad49 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs @@ -1,34 +1,94 @@ using UnityEngine; +using System.IO; +using System; + +using static CakeLab.ARFlow.Utilities.MathUtilities; +using JetBrains.Annotations; +using Mono.Cecil; +using PlasticGui.WorkspaceWindow.Configuration; +using OpenCVForUnity.CoreModule; namespace CakeLab.ARFlow.Evaluation { + public struct EvalParam + { + public String deviceModel; + public String deviceName; + public DeviceType deviceType; + public int totalCount; + public Vector2 focalLength; + public Vector2 principalPoint; + } + public struct EvalInfo + { + public EvalParam evalParam; + /// + /// Total time to run the prediction, even if prediction does not yield result + /// + public float totalTime; + public float matrixError; + public float translationError; + public float rotationError; + public int validScanCount; + } + /// /// Class to evaluate the spacial accuracy of the ARFlow system. - /// - - public class SpacialEvaluation + /// + public abstract class SpacialEvaluation { + + private string GetCurrentTime() + { + return DateTime.UtcNow.ToString("yyMMdd'T'HHmmss"); + } + /// - /// Calculate the Frobenius norm of the difference between the ground truth and the obtained pose - /// Matrix4x4 does not have a built-in matrix operation for adding, so we will manually calculate the Frobenius norm + /// The default path for evaluations/benchmarkings is saved in unity/Benchmark /// - /// Ground truth pose data in transformation matrix - /// Predicted pose data from the current method - /// - // public abstract Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics); - public static float GetErrorScore(Matrix4x4 groundTruth, Matrix4x4 obtainedPose) + /// Save path as string + private string CreateAndGetSaveFolder() { - float errorScore = 0; - for (int i = 0; i < 4; i++) + string path = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')); + // string path = Application.dataPath; + path = Path.Combine(path, "Benchmark", $"{GetCurrentTime()}"); + var inf = Directory.CreateDirectory(path); + Debug.Log(inf); + return path; + } + + public void WriteResultToFile(EvalInfo info) { + string fileName = "Result.txt"; + string path = Path.Combine(CreateAndGetSaveFolder(), fileName); + + using (StreamWriter writer = new StreamWriter(path, false)) { - for (int j = 0; j < 4; j++) - { - float difference = groundTruth[i, j] - obtainedPose[i, j]; - errorScore += difference * difference; - } + writer.WriteLine($"---Parameters---"); + writer.WriteLine($"Device model: {info.evalParam.deviceModel}"); + writer.WriteLine($"Device name: {info.evalParam.deviceName}"); + writer.WriteLine($"Device type: {info.evalParam.deviceType}"); + writer.WriteLine($"Total iteration count: {info.evalParam.totalCount}"); + writer.WriteLine(); + + writer.WriteLine($"---Camera intrinsics---"); + writer.WriteLine($"Focal length: ({info.evalParam.focalLength.x}, {info.evalParam.focalLength.y})"); + writer.WriteLine($"Principal point: ({info.evalParam.principalPoint.x}, {info.evalParam.principalPoint.y})"); + + writer.WriteLine(); + writer.WriteLine("---Evaluation info---"); + writer.WriteLine($"Total time for all predictions: {info.totalTime}"); + writer.WriteLine($"TRS Matrix error (L2): {info.matrixError}"); + writer.WriteLine($"Translation error (L2): {info.translationError}"); + writer.WriteLine($"Rotation error (degree): {info.rotationError}"); + writer.WriteLine($"Scanned count: {info.validScanCount}"); + + writer.Close(); } - return Mathf.Sqrt(errorScore); + Debug.Log("done"); } + + public abstract Matrix4x4 ObtainPoseFromImage(Texture2D screenShot, float markerLength, Mat intrinsics); + } } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs index 638c9ba..87aa5ea 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs @@ -6,7 +6,7 @@ using OpenCVForUnity.UnityUtils; using OpenCVForUnity.UnityUtils.Helper; -// using CakeLab.ARFlow.; +using static CakeLab.ARFlow.Utilities.MathUtilities; namespace CakeLab.ARFlow.Evaluation { @@ -15,199 +15,41 @@ namespace CakeLab.ARFlow.Evaluation using TMPro; using UnityEngine.UI; - - - /// - /// Class to evaluate the spacial accuracy of the ARFlow system. - /// - - public class ArUcoSpacialEvaluation : SpacialEvaluation - { - List _corners; - List _rejectedCorners; - - - Mat _rgbMat; - - - Mat _camIntrinsics; - Mat ids; - MatOfDouble _distCoeffs; - Dictionary _dictionary; - ArucoDetector _arucoDetector; - - //TODO: configure. For now the default (and used ArUco marker) is 4x4 50 - public int dictionaryId = Objdetect.DICT_4X4_50; - - public ArUcoSpacialEvaluation() - { - - ids = new Mat(); - _corners = new List(); - _rejectedCorners = new List(); - _rgbMat = new Mat(); // Initialize _rgbMat - _distCoeffs = new MatOfDouble(0, 0, 0, 0); - - DetectorParameters detectorParams = new DetectorParameters(); - detectorParams.set_useAruco3Detection(true); - RefineParameters refineParameters = new RefineParameters(10f, 3f, true); - _dictionary = Objdetect.getPredefinedDictionary((int)dictionaryId); - _arucoDetector = new ArucoDetector(_dictionary, detectorParams, refineParameters); - - } - - - /// - /// Obtain the pose of the camera from the captured image. - /// Pose is displayed as the localToWorldMatrix. - /// - /// - /// - // public abstract Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics); - public Matrix4x4 ObtainPoseFromImage(Texture2D capturedImage, float markerLength, Mat camIntrinsics) - { - if (camIntrinsics != null) - { - _camIntrinsics = camIntrinsics; - } - - // Initialize _rgbMat with the dimensions of the captured image - if (_rgbMat.empty()) - { - _rgbMat = new Mat(capturedImage.height, capturedImage.width, CvType.CV_8UC3); - } - - Utils.texture2DToMat(capturedImage, _rgbMat); - _arucoDetector.detectMarkers(_rgbMat, _corners, ids, _rejectedCorners); - - return EstimatePoseCanonicalMarker(_rgbMat, markerLength); - } - - private Matrix4x4 EstimatePoseCanonicalMarker(Mat rgbMat, float markerLength) - { - using (MatOfPoint3f objPoints = new MatOfPoint3f( - new Point3(-markerLength / 2f, markerLength / 2f, 0), - new Point3(markerLength / 2f, markerLength / 2f, 0), - new Point3(markerLength / 2f, -markerLength / 2f, 0), - new Point3(-markerLength / 2f, -markerLength / 2f, 0) - )) - { - if (ids.total() > 0) - { - using (Mat rvec = new Mat(1, 1, CvType.CV_64FC3)) - using (Mat tvec = new Mat(1, 1, CvType.CV_64FC3)) - using (Mat corner_4x1 = _corners[0].reshape(2, 4)) // 1*4*CV_32FC2 => 4*1*CV_32FC2 - using (MatOfPoint2f imagePoints = new MatOfPoint2f(corner_4x1)) - { - // Calculate pose marker - Calib3d.solvePnP(objPoints, imagePoints, _camIntrinsics, _distCoeffs, rvec, tvec); - - // // In this example we are processing with RGB color image, so Axis-color correspondences are X: blue, Y: green, Z: red. (Usually X: red, Y: green, Z: blue) - // Calib3d.drawFrameAxes(rgbMat, _camIntrinsics, _distCoeffs, rvec, tvec, markerLength * 0.5f); - - return GetpositionAndQuaternion(rvec, tvec); - } - } - } - - - return Matrix4x4.identity; - } - - private Matrix4x4 GetpositionAndQuaternion(Mat rvec, Mat tvec) - { - // Convert to unity pose data. - double[] rvecArr = new double[3]; - rvec.get(0, 0, rvecArr); - double[] tvecArr = new double[3]; - tvec.get(0, 0, tvecArr); - PoseData poseData = ARUtils.ConvertRvecTvecToPoseData(rvecArr, tvecArr); - // Debug.Log(poseData.rot); - // poseData.rot = Quaternion.Inverse(poseData.rot); - // Debug.Log(poseData.rot); - // poseData.rot = Offset(poseData.rot); - - //Through testing, it is observed that the change in coordinate system is missing for the rotational data. - var res = ARUtils.ConvertPoseDataToMatrix(ref poseData, true); - - //Perform coordinate change for rotational data - res = FlipAxes(res); - - return res; - } - - private Matrix4x4 FlipAxes(Matrix4x4 mat){ - Vector4 col0 = mat.GetColumn(0); - Vector4 col1 = mat.GetColumn(1); - Vector4 col2 = mat.GetColumn(2); - - Matrix4x4 corrected = mat; - corrected.SetColumn(0, col0); // Right - corrected.SetColumn(1, col2); // Up - corrected.SetColumn(2, -col1); // Forward - - return corrected; - } - - private Quaternion Offset(Quaternion q) { - // For rotation: This offset produces the lowest error compared to the truth data - // fine-tuned by hand and not reliable (signs flip when scanning aruco marker) - - // var offset = Quaternion.Euler(-45, 60, -90); - // var offset = Quaternion.Euler(-90, 0, 0); - var offset = Quaternion.Euler(0, -90, 90); - return offset * q; - } - - public void dispose() - { - _camIntrinsics.Dispose(); - _distCoeffs.Dispose(); - ids.Dispose(); - foreach (var corner in _corners) - { - corner.Dispose(); - } - foreach (var corner in _rejectedCorners) - { - corner.Dispose(); - } - } - } - public class SpacialEvaluationManager : MonoBehaviour { - //The textured plane, child to the arucoObj. - //In the current implementation, this plane is rotated by 90 degrees along the y axis. - // This is to make sure that the initial state (unrotated) + // The textured plane, child to the arucoObj. + // With the way Unity sets up the gameobject texture, the plane is rotated 180 degree so that it matches the original orientation public GameObject arucoPlane; - // // The ARPlane object that will be moved, child of the arucoParent - // public GameObject arucoObj; - // // The parent object of the ARPlane object. These two objects are for rotation purposes. - // public GameObject arucoParent; - public Camera activeCamera; public TMP_Text infoText; public Button toggleButton; - public TMP_Text buttonText; - - public TMP_InputField iterationsInput; + public TMP_Text toggleButtonText; + public Button switchButton; + public TMP_Text switchButtonText; + public TMP_InputField iterationsInput; + ArUcoSpacialEvaluation spacialEvaluation = new ArUcoSpacialEvaluation(); bool isRunning = false; bool isCancelled = false; + enum Mode { + IterationTesting, + LiveDebug + } + Mode currentMode = Mode.IterationTesting; void Start() { - toggleButton.onClick.AddListener(OnButtonClicked); + toggleButton.onClick.AddListener(OnToggleButtonClicked); + switchButton.onClick.AddListener(OnSwitchButtonClicked); } Mat GetCameraIntrinsics() @@ -215,9 +57,6 @@ Mat GetCameraIntrinsics() float fx = (activeCamera.focalLength * activeCamera.pixelWidth) / activeCamera.sensorSize.x; float fy = (activeCamera.focalLength * activeCamera.pixelHeight) / activeCamera.sensorSize.y; - // float fx = f; - // float fy = f; - float cx = activeCamera.pixelWidth / 2; float cy = activeCamera.pixelHeight / 2; @@ -235,34 +74,54 @@ Mat GetCameraIntrinsics() return camMatrix; } - void OnButtonClicked() + void OnToggleButtonClicked() { - int iterations = iterationsInput.text == "" ? 1 : int.Parse(iterationsInput.text); - if (!isRunning) + if (currentMode == Mode.IterationTesting) { - isCancelled = false; - isRunning = true; - StartEvaluation(iterations); - buttonText.text = "Stop"; + int iterations = iterationsInput.text == "" ? 1 : int.Parse(iterationsInput.text); + if (!isRunning) + { + isCancelled = false; + isRunning = true; + StartEvaluation(iterations); + toggleButtonText.text = "Stop"; + } + else + { + isCancelled = true; + isRunning = false; + toggleButtonText.text = "Start in iterations"; + } } - else - { - isCancelled = true; - isRunning = false; - buttonText.text = "Start in iterations"; + else if (currentMode == Mode.LiveDebug) { + randomizePosition(); + randomizeRotation(); + + ComputePredictionAndTrueData(); } } - /// - /// Detect and shows the prediction from the window currently shown on the camera (instead of procedural testing) - /// - void FixedUpdate() + void OnSwitchButtonClicked() { - if (isRunning) return; - Mat intrinsics = GetCameraIntrinsics(); - - var markerLength = arucoPlane.transform.localScale.x*10; + if (currentMode == Mode.IterationTesting) + { + toggleButtonText.text = "Randomize Transformation"; + switchButtonText.text = "Switch to Iterations testing"; + currentMode = Mode.LiveDebug; + } + else if (currentMode == Mode.LiveDebug) + { + toggleButtonText.text = "Start in iterations"; + switchButtonText.text = "Switch to live debugging"; + currentMode = Mode.IterationTesting; + } + } + /// + /// Capture the image from the active camera as a Texture2D + /// + /// Note that this texture should be destroyed at the end of it's life cycle. + Texture2D CaptureFromActiveCamera() { int mHeight = activeCamera.pixelHeight; int mWidth = activeCamera.pixelWidth; @@ -276,42 +135,67 @@ void FixedUpdate() RenderTexture.active = renderTexture; screenShot.ReadPixels(rect, 0, 0); - Matrix4x4 evalRes = spacialEvaluation.ObtainPoseFromImage(screenShot, markerLength, intrinsics); + return screenShot; + } + + /// + /// Detect and shows the prediction from the window currently shown on the camera (instead of procedural testing) + /// + void FixedUpdate() + { + if (isRunning) return; +#if UNITY_EDITOR + //This code is only for when we are able to move the object freely (currently not implemented in builds) + //To help with debugging with detectors + // ComputePredictionAndTrueData(); +#endif + } + + /// + /// Compute and populate the predR, trueR, predP, trueP fields for the OnDrawGizmos method + /// + void ComputePredictionAndTrueData() { + Mat intrinsics = GetCameraIntrinsics(); + + var markerLength = arucoPlane.transform.localScale.x*10; + + Texture2D screenShot = CaptureFromActiveCamera(); + + Matrix4x4 predRes = spacialEvaluation.ObtainPoseFromImage(screenShot, markerLength, intrinsics); Matrix4x4 truth = GetGroundTruth(); // for OnDrawGizmos - // OnDrawGizmos does not call the methods that perform prediction, - // since my laptop does not have enough RAM to run this real-time. - // TODO: remove and replace - evalR = ExtractRotation(evalRes); - trueR = ExtractRotation(truth); + predR = ExtractRotationFromMatrix(predRes); + trueR = ExtractRotationFromMatrix(truth); - evalP = ExtractPosition(evalRes); - trueP = ExtractPosition(truth); + predP = ExtractPositionFromMatrix(predRes); + trueP = ExtractPositionFromMatrix(truth); - // Quaternion offset = Quaternion.Inverse(trueR) * (evalR); - // ShowDebugOffset(offset); - } + ShowDebugOffset(predRes); - void ShowDebugOffset(Quaternion offset){ - string info = $"truth: {trueR} \n prediction: {evalR}"; - info += $"\noffset angle: {ComputeQuaternionError(offset)}"; + Destroy(screenShot); + } + void ShowDebugOffset(Matrix4x4 predRes){ + + string info = $"truth: {trueR} \n prediction: {predR}"; + info += $"\noffset angle: {ComputeQuaternionError(trueR, predR)}"; + if (predRes == Matrix4x4.identity) info += "\nNot detected"; infoText.text = info; } - Quaternion evalR = Quaternion.identity; + Quaternion predR = Quaternion.identity; Quaternion trueR = Quaternion.identity; - Vector3 evalP = new Vector3(); + Vector3 predP = new Vector3(); Vector3 trueP = new Vector3(); void OnDrawGizmos() { - Quaternion predRot = evalR; + Quaternion predRot = predR; Quaternion truthRot = trueR; // Get positions (you might use the translation part of the TRS) - Vector3 posPred = evalP; + Vector3 posPred = predP; Vector3 posTruth = trueP; // Draw truth axes at its position (red = right, green = up, blue = forward) @@ -332,96 +216,86 @@ void OnDrawGizmos() Gizmos.DrawLine(offsetPos, offsetPos + predRot * Vector3.forward); } - float ComputeQuaternionError(Quaternion offset) { - float angle; - Vector3 axis; - offset.ToAngleAxis(out angle, out axis); - - // Ensure the angle is within [0, 180] degrees - if (angle > 180f) - angle = 360f - angle; - - return angle; // Angular error in degrees - } - - public Quaternion ExtractRotation(Matrix4x4 matrix) - { - Vector3 forward; - forward.x = matrix.m02; - forward.y = matrix.m12; - forward.z = matrix.m22; - - Vector3 upwards; - upwards.x = matrix.m01; - upwards.y = matrix.m11; - upwards.z = matrix.m21; - - return Quaternion.LookRotation(forward, upwards); - } - - public Vector3 ExtractPosition(Matrix4x4 matrix) - { - Vector3 position; - position.x = matrix.m03; - position.y = matrix.m13; - position.z = matrix.m23; - return position; - } - + //TODO: Potentially move this to th SpacialEvaluation class void StartEvaluation(int iterations) { //Potentially randomize camera intrinsics Mat intrinsics = GetCameraIntrinsics(); - float errorScore = 0; - int validCount = 0; + float totalTime = 0; + float matrixError = 0; + float translationError = 0; + float rotationError = 0; - int mHeight = activeCamera.pixelHeight; - int mWidth = activeCamera.pixelWidth; - - var rect = new UnityEngine.Rect(0, 0, mWidth, mHeight); - RenderTexture renderTexture = new RenderTexture(mWidth, mHeight, 24); - Texture2D screenShot = new Texture2D(mWidth, mHeight, TextureFormat.RGBA32, false); - - activeCamera.targetTexture = renderTexture; - - // Assuming marker is scaled proportionally in all directions, and units are in meters. - //TODO + int validCount = 0; + // Assuming marker is scaled proportionally in all directions. var markerLength = arucoPlane.transform.localScale.x*10; - - for (int i = 0; i < iterations; i++) { - if (isCancelled) return; randomizePosition(); randomizeRotation(); + Texture2D screenShot = CaptureFromActiveCamera(); - activeCamera.Render(); + if (isCancelled) return; - RenderTexture.active = renderTexture; - screenShot.ReadPixels(rect, 0, 0); + float t = Time.realtimeSinceStartup; - Matrix4x4 evalRes = spacialEvaluation.ObtainPoseFromImage(screenShot, markerLength, intrinsics); + Matrix4x4 predRes = spacialEvaluation.ObtainPoseFromImage(screenShot, markerLength, intrinsics); + + totalTime += Time.realtimeSinceStartup - t; Matrix4x4 truth = GetGroundTruth(); - if (evalRes != Matrix4x4.identity) + if (predRes != Matrix4x4.identity) { - errorScore += SpacialEvaluation.GetErrorScore(truth, evalRes); + matrixError += GetFrobeniusNorm(truth, predRes); + translationError += GetTranslationError(truth, predRes); + rotationError += GetRotationalError(truth, predRes); validCount++; } - Debug.Log(errorScore); - Debug.Log(evalRes); - Debug.Log(truth); - Debug.Log("---------------------"); - - infoText.text = errorScore.ToString(); + Destroy(screenShot); } - buttonText.text = "Start"; - infoText.text = $"{errorScore.ToString()}/{validCount}"; + toggleButtonText.text = "Start"; + infoText.text = $"Matrix error: {matrixError}/{validCount}\n" + + $"Translation error: {translationError}/{validCount}\n" + + $"Rotation error: {rotationError}/{validCount}\n" + + $"Time in second: {totalTime}"; + + EvalParam evalParam = GetEvalParam(iterations); + EvalInfo evalInfo = new EvalInfo + { + evalParam=evalParam, + totalTime=totalTime, + matrixError=matrixError, + translationError=translationError, + rotationError=rotationError, + validScanCount=validCount + }; + + spacialEvaluation.WriteResultToFile(evalInfo); isRunning = false; + } + + EvalParam GetEvalParam(int totalCount) + { + Vector2 focalLength; + focalLength.x = (activeCamera.focalLength * activeCamera.pixelWidth) / activeCamera.sensorSize.x; + focalLength.y = (activeCamera.focalLength * activeCamera.pixelHeight) / activeCamera.sensorSize.y; + + Vector2 principalPoint; + principalPoint.x = activeCamera.pixelWidth / 2; + principalPoint.y = activeCamera.pixelHeight / 2; + return new EvalParam + { + deviceModel = SystemInfo.deviceModel, + deviceName = SystemInfo.deviceName, + deviceType = SystemInfo.deviceType, + totalCount = totalCount, + focalLength = focalLength, + principalPoint = principalPoint + }; } Matrix4x4 GetGroundTruth() @@ -434,38 +308,25 @@ Matrix4x4 GetGroundTruth() void randomizePosition() { - // Randomize the position of the object - // ranges are set to be of adequate size to fit the camera viewport. Vector3 viewportPos = new Vector3(); viewportPos.x = Random.Range(0.2f, 0.8f); viewportPos.y = Random.Range(0.2f, 0.8f); viewportPos.z = Random.Range(3, 6); - Vector3 pos = activeCamera.ViewportToWorldPoint(viewportPos); - Debug.Log(pos); arucoPlane.transform.position = activeCamera.ViewportToWorldPoint(viewportPos); } void randomizeRotation() { // Randomize x and z of parent - // Values are tested relative to camera's viewport, so that it is visible + // Values are tested relative to camera's viewport to make sure it is visible Vector3 parentRotation = new Vector3(); - parentRotation.x = Random.Range(-40, -120); - parentRotation.y = Random.Range(-30, 30); - parentRotation.z = Random.Range(-30, 30); + parentRotation.x = Random.Range(-40, -150); + parentRotation.y = Random.Range(-50, 50); + parentRotation.z = Random.Range(-50, 50); arucoPlane.transform.rotation = Quaternion.Euler(parentRotation); - // arucoParent.transform.rotation = Quaternion.Euler(parentRotation); - - //randomize y of plane - // Vector3 planeRotation = new Vector3(); - // planeRotation.x = 0; - // planeRotation.z = 0; - // arucoObj.transform.localRotation = Quaternion.Euler(planeRotation); } } - - } diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef deleted file mode 100644 index 2262c8e..0000000 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/edu.wpi.cake.arflow.evaluation.asmdef +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "CakeLab.ARFlow.Evaluation", - "rootNamespace": "", - "references": [ - "GUID:cef0e9dabbfe59a4790acbf31c21f33e", - "GUID:a9420e37d7990b54abdef6688edbe313", - "GUID:92703082f92b41ba80f0d6912de66115", - "GUID:c536cb714a8a9e84cb16ecf0330eea40", - "GUID:e40ba710768534012815d3193fa296cb", - "GUID:dc960734dc080426fa6612f1c5fe95f3", - "GUID:6055be8ebefd69e48b49212b09b47b2f" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs new file mode 100644 index 0000000..e7ecb30 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs @@ -0,0 +1,101 @@ +using System; +using UnityEngine; +using UnityEngine.XR.ARFoundation; +using UnityEngine.XR.ARSubsystems; + +namespace CakeLab.ARFlow.Utilities +{ + public static class MathUtilities + { + public static Quaternion ExtractRotationFromMatrix(Matrix4x4 matrix) + { + Vector3 forward; + forward.x = matrix.m02; + forward.y = matrix.m12; + forward.z = matrix.m22; + + Vector3 upwards; + upwards.x = matrix.m01; + upwards.y = matrix.m11; + upwards.z = matrix.m21; + + return Quaternion.LookRotation(forward, upwards); + } + + public static Vector3 ExtractPositionFromMatrix(Matrix4x4 matrix) + { + Vector3 position; + position.x = matrix.m03; + position.y = matrix.m13; + position.z = matrix.m23; + return position; + } + + /// + /// Compute the error of 2 quaternion based on their offset + /// + /// The floating point error + public static float ComputeQuaternionError(Quaternion a, Quaternion b) { + Quaternion offset = Quaternion.Inverse(a) * b; + + float angle; + Vector3 axis; + offset.ToAngleAxis(out angle, out axis); + + // Ensure the angle is within [0, 180] degrees + if (angle > 180f) + angle = 360f - angle; + + return angle; // Angular error in degrees + } + + /// + /// Calculate the L2 error + /// + /// + /// + /// + public static float GetTranslationError(Matrix4x4 groundTruth, Matrix4x4 predictedPose) + { + Vector3 truth = ExtractPositionFromMatrix(groundTruth); + Vector3 pred = ExtractPositionFromMatrix(groundTruth); + return Mathf.Sqrt(Vector3.Distance(truth, pred)); + } + + /// + /// Calculate the error in degrees + /// + /// + /// + /// + public static float GetRotationalError(Matrix4x4 groundTruth, Matrix4x4 predictedPose) + { + Quaternion truth = ExtractRotationFromMatrix(groundTruth); + Quaternion pred = ExtractRotationFromMatrix(predictedPose); + + return ComputeQuaternionError(truth, pred); + } + + /// + /// Calculate the Frobenius norm of the difference between 2 Matrix4x4 + /// Matrix4x4 does not have a built-in matrix operation for adding, so we will manually calculate this + /// + /// Ground truth pose data in transformation matrix + /// Predicted pose data from the current method + /// + public static float GetFrobeniusNorm(Matrix4x4 groundTruth, Matrix4x4 predictedPose) + { + float errorScore = 0; + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + float difference = groundTruth[i, j] - predictedPose[i, j]; + errorScore += difference * difference; + } + } + + return Mathf.Sqrt(errorScore); + } + } +} diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs.meta b/unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs.meta new file mode 100644 index 0000000..0d0b0d8 --- /dev/null +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Utilities/MathUtilities.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b7c35d4e6a517634badbbb73abec6906 \ No newline at end of file diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/edu.wpi.cake.arflow.asmdef b/unity/Packages/edu.wpi.cake.arflow/Runtime/edu.wpi.cake.arflow.asmdef index 1e18288..446d97f 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/edu.wpi.cake.arflow.asmdef +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/edu.wpi.cake.arflow.asmdef @@ -10,7 +10,8 @@ "GUID:411961ebab96043d8a061c656d3a461c", "GUID:e40ba710768534012815d3193fa296cb", "GUID:6055be8ebefd69e48b49212b09b47b2f", - "GUID:dc960734dc080426fa6612f1c5fe95f3" + "GUID:dc960734dc080426fa6612f1c5fe95f3", + "GUID:cef0e9dabbfe59a4790acbf31c21f33e" ], "includePlatforms": [], "excludePlatforms": [], From aa5d5b1be9b2aabf1ff17a72442e1718b0285dad Mon Sep 17 00:00:00 2001 From: Khang Luu Date: Tue, 4 Mar 2025 01:46:09 -0500 Subject: [PATCH 21/21] chore: add information about randomization factors to evaluation result --- .../Runtime/Evaluation/SpacialEvaluation.cs | 45 +++++++++++-- .../Evaluation/SpacialEvaluationManager.cs | 67 ++++++++++++++++--- 2 files changed, 97 insertions(+), 15 deletions(-) diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs index e5dad49..d02ccd5 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluation.cs @@ -16,12 +16,38 @@ public struct EvalParam public String deviceName; public DeviceType deviceType; public int totalCount; + } + + public struct EvalCameraIntrinsics + { public Vector2 focalLength; public Vector2 principalPoint; } + public struct Vector3Setup + { + public Vector2 xVariation; + public Vector2 yVariation; + public Vector2 zVariation; + } + public struct EvalSetupInfo + { + + /// + /// Range is in viewport coordinates (x and y is 0 to 1) + /// + public Vector3Setup positionSetup; + + /// + /// Range is in euler angles + /// + public Vector3Setup rotationSetup; + } public struct EvalInfo { public EvalParam evalParam; + public EvalCameraIntrinsics cameraIntrinsics; + + public EvalSetupInfo setupInfo; /// /// Total time to run the prediction, even if prediction does not yield result /// @@ -71,14 +97,25 @@ public void WriteResultToFile(EvalInfo info) { writer.WriteLine(); writer.WriteLine($"---Camera intrinsics---"); - writer.WriteLine($"Focal length: ({info.evalParam.focalLength.x}, {info.evalParam.focalLength.y})"); - writer.WriteLine($"Principal point: ({info.evalParam.principalPoint.x}, {info.evalParam.principalPoint.y})"); + writer.WriteLine($"Focal length: ({info.cameraIntrinsics.focalLength.x}, {info.cameraIntrinsics.focalLength.y})"); + writer.WriteLine($"Principal point: ({info.cameraIntrinsics.principalPoint.x}, {info.cameraIntrinsics.principalPoint.y})"); + + writer.WriteLine(); + writer.WriteLine("---Setup info---"); + writer.WriteLine($"Position randomization: "); + writer.WriteLine($"- Viewport x (from 0-1): {info.setupInfo.positionSetup.xVariation.x} - {info.setupInfo.positionSetup.xVariation.y} "); + writer.WriteLine($"- Viewport y: {info.setupInfo.positionSetup.yVariation.x} - {info.setupInfo.positionSetup.yVariation.y} "); + writer.WriteLine($"- z coordinate: {info.setupInfo.positionSetup.zVariation.x} - {info.setupInfo.positionSetup.zVariation.y} "); + writer.WriteLine($"Rotation randomization (in euler angles): "); + writer.WriteLine($"- x: {info.setupInfo.rotationSetup.xVariation.x} - {info.setupInfo.rotationSetup.xVariation.y} "); + writer.WriteLine($"- y: {info.setupInfo.rotationSetup.yVariation.x} - {info.setupInfo.rotationSetup.yVariation.y} "); + writer.WriteLine($"- z: {info.setupInfo.rotationSetup.zVariation.x} - {info.setupInfo.rotationSetup.zVariation.y} "); writer.WriteLine(); writer.WriteLine("---Evaluation info---"); writer.WriteLine($"Total time for all predictions: {info.totalTime}"); - writer.WriteLine($"TRS Matrix error (L2): {info.matrixError}"); - writer.WriteLine($"Translation error (L2): {info.translationError}"); + writer.WriteLine($"TRS Matrix error - L2: {info.matrixError}"); + writer.WriteLine($"Translation error - L2: {info.translationError}"); writer.WriteLine($"Rotation error (degree): {info.rotationError}"); writer.WriteLine($"Scanned count: {info.validScanCount}"); diff --git a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs index 87aa5ea..87dcfdd 100644 --- a/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs +++ b/unity/Packages/edu.wpi.cake.arflow/Runtime/Evaluation/SpacialEvaluationManager.cs @@ -263,9 +263,13 @@ void StartEvaluation(int iterations) + $"Time in second: {totalTime}"; EvalParam evalParam = GetEvalParam(iterations); + EvalCameraIntrinsics evalCam = GetEvalCamIntrinsicsInfo(); + EvalSetupInfo evalSetup = GetEvalSetupInfo(); EvalInfo evalInfo = new EvalInfo { evalParam=evalParam, + cameraIntrinsics=evalCam, + setupInfo=evalSetup, totalTime=totalTime, matrixError=matrixError, translationError=translationError, @@ -277,8 +281,27 @@ void StartEvaluation(int iterations) isRunning = false; } + /// + /// Get the info for writing the evaluation to a file + /// + /// EvalParam GetEvalParam(int totalCount) { + + return new EvalParam + { + deviceModel = SystemInfo.deviceModel, + deviceName = SystemInfo.deviceName, + deviceType = SystemInfo.deviceType, + totalCount = totalCount, + }; + } + + /// + /// Get the info for writing the evaluation to a file + /// + /// + EvalCameraIntrinsics GetEvalCamIntrinsicsInfo() { Vector2 focalLength; focalLength.x = (activeCamera.focalLength * activeCamera.pixelWidth) / activeCamera.sensorSize.x; focalLength.y = (activeCamera.focalLength * activeCamera.pixelHeight) / activeCamera.sensorSize.y; @@ -287,16 +310,24 @@ EvalParam GetEvalParam(int totalCount) principalPoint.x = activeCamera.pixelWidth / 2; principalPoint.y = activeCamera.pixelHeight / 2; - return new EvalParam + return new EvalCameraIntrinsics { - deviceModel = SystemInfo.deviceModel, - deviceName = SystemInfo.deviceName, - deviceType = SystemInfo.deviceType, - totalCount = totalCount, focalLength = focalLength, principalPoint = principalPoint }; } + + /// + /// Get the info for writing the evaluation to a file + /// + /// + EvalSetupInfo GetEvalSetupInfo() { + return new EvalSetupInfo + { + positionSetup = randomPositionSetup, + rotationSetup = randomRotationSetup + }; + } Matrix4x4 GetGroundTruth() { @@ -305,14 +336,28 @@ Matrix4x4 GetGroundTruth() Matrix4x4 trsMat = Matrix4x4.TRS(t.position, t.rotation, Vector3.one); return activeCamera.transform.localToWorldMatrix * trsMat; } + + readonly Vector3Setup randomPositionSetup = new Vector3Setup + { + xVariation = new Vector2(0.2f, 0.8f), + yVariation = new Vector2(0.2f, 0.8f), + zVariation = new Vector2(3, 6), + }; + + readonly Vector3Setup randomRotationSetup = new Vector3Setup + { + xVariation = new Vector2(-40, -150), + yVariation = new Vector2(-50, 50), + zVariation = new Vector2(-50, 50), + }; void randomizePosition() { Vector3 viewportPos = new Vector3(); - viewportPos.x = Random.Range(0.2f, 0.8f); - viewportPos.y = Random.Range(0.2f, 0.8f); - viewportPos.z = Random.Range(3, 6); + viewportPos.x = Random.Range(randomPositionSetup.xVariation.x, randomPositionSetup.xVariation.y); + viewportPos.y = Random.Range(randomPositionSetup.yVariation.x, randomPositionSetup.yVariation.y); + viewportPos.z = Random.Range(randomPositionSetup.zVariation.x, randomPositionSetup.zVariation.y); arucoPlane.transform.position = activeCamera.ViewportToWorldPoint(viewportPos); } @@ -322,9 +367,9 @@ void randomizeRotation() // Randomize x and z of parent // Values are tested relative to camera's viewport to make sure it is visible Vector3 parentRotation = new Vector3(); - parentRotation.x = Random.Range(-40, -150); - parentRotation.y = Random.Range(-50, 50); - parentRotation.z = Random.Range(-50, 50); + parentRotation.x = Random.Range(randomRotationSetup.xVariation.x, randomRotationSetup.xVariation.y); + parentRotation.y = Random.Range(randomRotationSetup.yVariation.x, randomRotationSetup.yVariation.y); + parentRotation.z = Random.Range(randomRotationSetup.zVariation.x, randomRotationSetup.zVariation.y); arucoPlane.transform.rotation = Quaternion.Euler(parentRotation); } }