Repository: empriselab/RCareWorld (language: python)

Issue:
Feature wanted: Get the grasp_point position and rotation



Discussion / hints:

Fix patch:
diff --git a/pyrcareworld/pyrcareworld/attributes/controller_attr.py b/pyrcareworld/pyrcareworld/attributes/controller_attr.py
index 854f416..42e787a 100755
--- a/pyrcareworld/pyrcareworld/attributes/controller_attr.py
+++ b/pyrcareworld/pyrcareworld/attributes/controller_attr.py
@@ -1,3 +1,4 @@
+from typing import Tuple
 import pyrcareworld.attributes as attr
 
 class ControllerAttr(attr.ColliderAttr):
@@ -31,6 +32,12 @@ class ControllerAttr(attr.ColliderAttr):
         - 'drive_forces': Inverse dynamics drive forces.
     """
 
+    def __init__(self, env, id: int, data: dict = {}):
+        super().__init__(env, id, data)
+
+        self.last_grasp_position = None
+        self.last_grasp_rotation = None
+
     def SetJointPosition(self, joint_positions: list):
         """
         Set the joint position for each moveable joint and move with PD control.
@@ -393,3 +400,25 @@ def AddRoot6DOF(self, new_id: int = None):
         self._send_data("AddRoot6DOF", new_id)
         self.env.attrs[new_id] = ControllerAttr(self.env, new_id)
         return self.env.attrs[new_id]
+    
+    def GetGraspPoint(self, link_name: str = "link_grasp_center", fallback: str = "grasp", euler: bool = False) -> Tuple[list, list]:
+        """
+        Get the grasp point's position and rotation as a tuple `(pos, rot)`. May not provide useful data for the first few steps, in which case `(None, None)` will be returned.
+
+        :param link_name: Str, name of the grasp point link. For the stretch 3, it is named `"link_grasp_center"`.
+        :param fallback: Str, a substring of the grasp link name to find the grasp point link if `link_name` exactly is not found.
+        :param euler: Bool, whether to use euler angles instead of quaternions.
+        :return: A list of length 3, representing the position of the grasp point.
+        """
+        self._send_data("SetGraspLink", link_name, fallback)
+
+        pos_reading = self.data.get("grasp_point_position", self.last_grasp_position)
+        rot_reading = self.data.get("grasp_point_rotation", self.last_grasp_rotation) if not euler else self.data.get("grasp_point_euler", self.last_grasp_rotation)
+
+        if pos_reading is None:
+            self.last_grasp_position = pos_reading
+
+        if rot_reading is None:
+            self.last_grasp_rotation = rot_reading
+
+        return pos_reading, rot_reading
diff --git a/template/Bathing/BathingPlayer_Data/Managed/Assembly-CSharp.dll b/template/Bathing/BathingPlayer_Data/Managed/Assembly-CSharp.dll
index 9b28a64..98305b6 100644
Binary files a/template/Bathing/BathingPlayer_Data/Managed/Assembly-CSharp.dll and b/template/Bathing/BathingPlayer_Data/Managed/Assembly-CSharp.dll differ
diff --git a/template/Bathing/BathingPlayer_Data/Managed/RCareWorld.dll b/template/Bathing/BathingPlayer_Data/Managed/RCareWorld.dll
index dee88ed..94951d5 100644
Binary files a/template/Bathing/BathingPlayer_Data/Managed/RCareWorld.dll and b/template/Bathing/BathingPlayer_Data/Managed/RCareWorld.dll differ
diff --git a/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/StandaloneLinux64/catalog_2024.12.02.19.53.16.hash b/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/StandaloneLinux64/catalog_2024.12.02.19.53.16.hash
new file mode 100644
index 0000000..e07de37
--- /dev/null
+++ b/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/StandaloneLinux64/catalog_2024.12.02.19.53.16.hash
@@ -0,0 +1,1 @@
+f38eb7e217bfd6680e3bb1dbd6063490
\ No newline at end of file
diff --git a/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/StandaloneLinux64/catalog_2024.12.02.19.53.16.json b/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/StandaloneLinux64/catalog_2024.12.02.19.53.16.json
new file mode 100644
index 0000000..3693abb
--- /dev/null
+++ b/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/StandaloneLinux64/catalog_2024.12.02.19.53.16.json
@@ -0,0 +1,1 @@
+{"m_LocatorId":"AddressablesMainContentCatalog","m_BuildResultHash":"a76dfd9345324ec6618f35f23aefd081","m_InstanceProviderData":{"m_Id":"UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider","m_ObjectType":{"m_AssemblyName":"Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider"},"m_Data":""},"m_SceneProviderData":{"m_Id":"UnityEngine.ResourceManagement.ResourceProviders.SceneProvider","m_ObjectType":{"m_AssemblyName":"Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.ResourceManagement.ResourceProviders.SceneProvider"},"m_Data":""},"m_ResourceProviderData":[{"m_Id":"UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider","m_ObjectType":{"m_AssemblyName":"Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider"},"m_Data":""},{"m_Id":"UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider","m_ObjectType":{"m_AssemblyName":"Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider"},"m_Data":""},{"m_Id":"UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider","m_ObjectType":{"m_AssemblyName":"Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider"},"m_Data":""}],"m_ProviderIds":["UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider","UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider"],"m_InternalIds":["{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/bundle_assets_franka_panda_b817fbedcfd3441b691f099e3e2f6e4a.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/bundle_assets_gelslim_f1388dfedaf89e3bdb830e2a1e0ce890.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/bundle_assets_gelslimtarget_829640567a562a9e37faa219984e3532.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/bundle_assets_omplmanager_129376ce8891e27050f9d4183fa96b4e.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/bundle_assets_simplefrankagripper_0869b6e77870dd3459f27664caf63021.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/f73f77f85ce465a5c4fa379a2fd36b7f_unitybuiltinshaders_86d3af9b7350a248a2e40b2b705878ee.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/rfuniversebuiltin_assets_all_83243b30d169fdbfe6c8124b75a3dc0e.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/robot_assets_all_462e2d2c4fb565b195eec35bbaa70278.bundle","{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/user_assets_all_f357883c84a80231486b0404b1dc2f9f.bundle","2DBBox.prefab","3DBBox.prefab","articulation-item.uxml","articulation-window.uxml","Assets/RCareCommon/Core Assets/CareAvatars/Prefabs/WithoutWheelchair/female1_cp.prefab","Assets/RCareCommon/Core Assets/CareAvatars/Prefabs/WithoutWheelchair/female2_c4-c5.prefab","Assets/RCareCommon/Core Assets/CareAvatars/Prefabs/WithoutWheelchair/male1_c6-c7.prefab","Assets/RCareCommon/Core Assets/CareAvatars/Prefabs/WithoutWheelchair/male2_hemi.prefab","Assets/RCareCommon/Core Assets/CareAvatars/Prefabs/WithoutWheelchair/male3_c1-c3.prefab","Assets/RCareCommon/Core Assets/CareAvatars/Prefabs/WithoutWheelchair/male4_stroke.prefab","Assets/RCareCommon/Core Assets/Devices/limb_tool.obj","Assets/RCareCommon/Core Assets/Robots/Kinova Gen3/kinova_gen3_7dof-robotiq85.prefab","Assets/RCareCommon/Library/Other Prefabs/food.prefab","bhand.prefab","Camera.prefab","CameraDepth.shader","CameraID.shader","CameraMotionVector.shader","CameraNormal.shader","CameraView.prefab","Collider.shader","Collider_Box.prefab","ColliderBound.prefab","CollisionLine.prefab","debug-item.uxml","DebugSimple.shader","debug-window.uxml","franka_panda.prefab","GelProxy.shader","GelSlim.prefab","GelSlimTarget.prefab","GraspPoint.prefab","JointLink.prefab","LightView.prefab","Mask.shader","ObjectID.prefab","OmplManager.prefab","PointCloud.shader","PoseGizmo.prefab","Rigidbody_Sphere.prefab","shadowhand.prefab","SimpleFrankaGripper.prefab","svh.prefab"],"m_KeyDataString":"ZgAAAABCAAAAYnVuZGxlX2Fzc2V0c19mcmFua2FfcGFuZGFfYjgxN2ZiZWRjZmQzNDQxYjY5MWYwOTllM2UyZjZlNGEuYnVuZGxlAD0AAABidW5kbGVfYXNzZXRzX2dlbHNsaW1fZjEzODhkZmVkYWY4OWUzYmRiODMwZTJhMWUwY2U4OTAuYnVuZGxlAEMAAABidW5kbGVfYXNzZXRzX2dlbHNsaW10YXJnZXRfODI5NjQwNTY3YTU2MmE5ZTM3ZmFhMjE5OTg0ZTM1MzIuYnVuZGxlAEEAAABidW5kbGVfYXNzZXRzX29tcGxtYW5hZ2VyXzEyOTM3NmNlODg5MWUyNzA1MGY5ZDQxODNmYTk2YjRlLmJ1bmRsZQBJAAAAYnVuZGxlX2Fzc2V0c19zaW1wbGVmcmFua2FncmlwcGVyXzA4NjliNmU3Nzg3MGRkMzQ1OWYyNzY2NGNhZjYzMDIxLmJ1bmRsZQBcAAAAZjczZjc3Zjg1Y2U0NjVhNWM0ZmEzNzlhMmZkMzZiN2ZfdW5pdHlidWlsdGluc2hhZGVyc184NmQzYWY5YjczNTBhMjQ4YTJlNDBiMmI3MDU4NzhlZS5idW5kbGUARAAAAHJmdW5pdmVyc2VidWlsdGluX2Fzc2V0c19hbGxfODMyNDNiMzBkMTY5ZmRiZmU2YzgxMjRiNzVhM2RjMGUuYnVuZGxlADgAAAByb2JvdF9hc3NldHNfYWxsXzQ2MmUyZDJjNGZiNTY1YjE5NWVlYzM1YmJhYTcwMjc4LmJ1bmRsZQA3AAAAdXNlcl9hc3NldHNfYWxsX2YzNTc4ODNjODRhODAyMzE0ODZiMDQwNGIxZGMyZjlmLmJ1bmRsZQAMAAAARGVidWcvMkRCQm94ACAAAAA3Mjg5MDdjOTEyMGU0ZGY0ZDg2NTRlYzA1ZTVmODM5ZAAMAAAARGVidWcvM0RCQm94ACAAAAAzYmYwNWM5YmQ3M2M3ZTY0OTk4ZDc2ZGNmYjY2MGQ2NgAaAAAAVUlUb29raXQvYXJ0aWN1bGF0aW9uLWl0ZW0AIAAAADY5MGJkYzAzYWI2MzRmNzRmYTVlZTRhMTZkMDBlYWY4ABwAAABVSVRvb2tpdC9hcnRpY3VsYXRpb24td2luZG93ACAAAABkZWY0ZDYwZTY5NGZhYjQ0OWJhZmEwYWFmYmVkNmRjZgAKAAAAZmVtYWxlMV9jcAAgAAAAOTk0MDAyZDFjNjgzMzc2ODY4NDVmNGE3NzhiMDNjYTEADQAAAGZlbWFsZTJfYzQtYzUAIAAAAGNlY2U2MWMxMjdhZTZmNTFjYjNhYWQyNmZkZjY1ZGZmAAsAAABtYWxlMV9jNi1jNwAgAAAAMmVhNDc1MzI4ZGQ3ZjcxNjA5NGM0YzNjMTgyOTQ3YmEADAAAAG1hbGUyX3N0cm9rZQAgAAAANTRlZmQ5MTZmYTU2NzVjNzdiYmU2MGEwNzY2MDcyMjUACwAAAG1hbGUzX2MxLWMzACAAAABjOTFjMzEzN2VhYzkxZmZhYTk2ZWI2MGIyNzA3NzQ4NwAFAAAAaGVucnkAIAAAADIxYmI2YzFlMWRlY2VjMTM3OGU5MTEwZWQxNWEyYzExAAkAAABsaW1iX3Rvb2wAIAAAADM3YWNiZjFlNmI0NmNjM2I1YmMzYjExYTZhNzg2MzFkABoAAABraW5vdmFfZ2VuM183ZG9mLXJvYm90aXE4NQAgAAAANjgwOWY2NTQxM2UyZjUzMWU5YTVkNmQ2MzdlYWIzYWIABAAAAGZvb2QAIAAAAGY2OWYyNTQ2MmNmMmY5NTRkYjY3ZmVmZTIxMGI1MWRjAD8AAABBc3NldHMvUkNhcmVDb21tb24vQ29yZSBBc3NldHMvUm9ib3RzL0JhcnJldHQgSGFuZC9iaGFuZC5wcmVmYWIAIAAAAGNjOTg4YzIzMTY1Mzg4ZWVjOTIxOTBhYTVkYzNkYWM0AAYAAABDYW1lcmEAIAAAADU1YmNiZjRhMDY3OWQ0ODQ5YmNkYmEwOTgyZDJjMWE1ABMAAABTaGFkZXJzL0NhbWVyYURlcHRoACAAAABkZjZhN2Y3OGY1MTMxZTA0NDhmZTljZDZlMTFmZmI4YgAQAAAAU2hhZGVycy9DYW1lcmFJRAAgAAAAODQyNGJlNzk3MzE0ODJiNGE4MDkyMDI1YTM2MzJlNmMAGgAAAFNoYWRlcnMvQ2FtZXJhTW90aW9uVmVjdG9yACAAAAAxODVjNWVjODRmYzY0MDQ0NjgzMTYzM2JlOTk2MjE5OAAUAAAAU2hhZGVycy9DYW1lcmFOb3JtYWwAIAAAAGJjNWY1ODgwM2JlYWU2ZjQ3YWY1Yzg1ZDM3YTc3YWE0AB4AAABDYW1lcmEgJiBMaWdodCBWaWV3L0NhbWVyYVZpZXcAIAAAADg0MDBhYzQzNmVjYmY5YTQ5YThmNWYzOTM3MzNjYzVlABAAAABTaGFkZXJzL0NvbGxpZGVyACAAAAAyNWI5ZDBlMWVlZWUwODA0MGEzZjRkYzM3ZjE5YjhjMAAMAAAAQ29sbGlkZXJfQm94ACAAAAA0Nzk1MzQ1NmEyMGNjMzY0ZmI5MzZkMjQ5MzJmYzJmYQATAAAARGVidWcvQ29sbGlkZXJCb3VuZAAgAAAANWQ3ZTNhM2Y2ZDY2OWIxNGJiYTc4ODMyMjBjNzY4ZWUAEwAAAERlYnVnL0NvbGxpc2lvbkxpbmUAIAAAAGUxOTc2ZmVlZTZjZTM2ODQyYjI5MTIwYmRkMDk1NzBkABMAAABVSVRvb2tpdC9kZWJ1Zy1pdGVtACAAAAA3MDJmMTEyNTIxOWU5ZTU0NmI1OTAwNjhlZWY2OGY3ZQATAAAAU2hhZGVycy9EZWJ1Z1NpbXBsZQAgAAAAOWZmYTg5YmNiOTc0NTc2NWFhMzY1YWRiOTQ2NTNmNzUAFQAAAFVJVG9va2l0L2RlYnVnLXdpbmRvdwAgAAAAMjkxOWExM2E4NzUwMjlkNDE4ZTQ4MjJlYzhkYjhhNjAADAAAAGZyYW5rYV9wYW5kYQAgAAAAODdjNzY4ZDkwMWQ0MDdjNGJhYjdkY2ZjMGNiNDM5MTUAEAAAAFNoYWRlcnMvR2VsUHJveHkAIAAAADlhZjJmMDY5ZjI3YWEyMzRlODlmODE4NjVmN2UxMzk4AAcAAABHZWxTbGltACAAAAAzYjRmNmJlNTQ2MWI3ZGM0NmEyYTBmZmYzNmNiMjY2ZgANAAAAR2VsU2xpbVRhcmdldAAgAAAAYmI2OTIxN2FiY2FjM2Q5NDhiNTg1ZDJlMjVjOGY2MzQAEAAAAERlYnVnL0dyYXNwUG9pbnQAIAAAAGNkNzY0YzkzOWI4MGMyMDQyOWI4MTUzM2I5NmZkZTlhAA8AAABEZWJ1Zy9Kb2ludExpbmsAIAAAAGY1YjRkNDg3YTljNjQ3YTRiODk4YjUxYzcxMWYxM2UwAB0AAABDYW1lcmEgJiBMaWdodCBWaWV3L0xpZ2h0VmlldwAgAAAAMzhkYmE5M2ViOWE2ZmE5NGNiYWI3ZmM1NGE5YTM2NGUADAAAAFNoYWRlcnMvTWFzawAgAAAANmQxNDg0NzYwZTA2OWU5NDlhYTRmMTM3NzdhNzAwZmEADgAAAERlYnVnL09iamVjdElEACAAAABlMWQxNjMwMjNmZjZlNmI0NmE1NzQ4YTk1OGIwNjMyNAALAAAAT21wbE1hbmFnZXIAIAAAADk2MTllZTIyNmZmYTA1ZjQ4ODFiMzU4MmE4MjBlM2JhABIAAABTaGFkZXJzL1BvaW50Q2xvdWQAIAAAADU3NzkwZWE0ZjhhZDUwZjQ1OTVjZWMxNzgwOWYxYmU0AA8AAABEZWJ1Zy9Qb3NlR2l6bW8AIAAAAGM0NmM4YTk5YWZkYjgyMDQ5ODZmM2IyMDA2MzViOGVlABAAAABSaWdpZGJvZHlfU3BoZXJlACAAAAA3MTI0MzQ4OGEyY2I0NmU0ZmFhNTkxZDQ1OTYyYzBiNgAKAAAAc2hhZG93aGFuZAAgAAAANDAxMzYyMGI1Y2I3ZTU4NGNhYzZmMmMyODM5MTIyZWMAEwAAAFNpbXBsZUZyYW5rYUdyaXBwZXIAIAAAAGRiN2FkZmNiMDE2YmFjN2E1OTFlMzdlNTE3NTNlMzA2AAMAAABzdmgAIAAAADJkZTRmNzg1NzliMWU2YjRiOTlkMjdjNmQ5ZDY5ZTlmAAoAAAAxMzE3MDE4MTczAAoAAAAtNTMzOTU3NjM1AAsAAAAtMTUzMDEzMTY3OQAKAAAALTkzODQwNDgzNQAKAAAALTMwMjcwNzQ2NAALAAAALTEwMDk1ODYxODkACwAAAC0xNDgyNzQ2NTY1","m_BucketDataString":"ZgAAAAQAAAABAAAAAAAAAEsAAAABAAAAAQAAAI0AAAABAAAAAgAAANUAAAABAAAAAwAAABsBAAABAAAABAAAAGkBAAABAAAABQAAAMoBAAABAAAABgAAABMCAAABAAAABwAAAFACAAABAAAACAAAAIwCAAABAAAACQAAAJ0CAAABAAAACQAAAMICAAABAAAACgAAANMCAAABAAAACgAAAPgCAAACAAAACwAAAAwAAAAXAwAAAgAAAAsAAAAMAAAAPAMAAAIAAAANAAAADgAAAF0DAAACAAAADQAAAA4AAACCAwAAAQAAAA8AAACRAwAAAQAAAA8AAAC2AwAAAQAAABAAAADIAwAAAQAAABAAAADtAwAAAQAAABEAAAD9AwAAAQAAABEAAAAiBAAAAQAAABIAAAAzBAAAAQAAABIAAABYBAAAAQAAABMAAABoBAAAAQAAABMAAACNBAAAAQAAABQAAACXBAAAAQAAABQAAAC8BAAAAwAAABUAAAAWAAAAFwAAAMoEAAADAAAAFQAAABYAAAAXAAAA7wQAAAEAAAAYAAAADgUAAAEAAAAYAAAAMwUAAAEAAAAZAAAAPAUAAAEAAAAZAAAAYQUAAAEAAAAaAAAApQUAAAEAAAAaAAAAygUAAAEAAAAbAAAA1QUAAAEAAAAbAAAA+gUAAAEAAAAcAAAAEgYAAAEAAAAcAAAANwYAAAEAAAAdAAAATAYAAAEAAAAdAAAAcQYAAAEAAAAeAAAAkAYAAAEAAAAeAAAAtQYAAAEAAAAfAAAAzgYAAAEAAAAfAAAA8wYAAAEAAAAgAAAAFgcAAAEAAAAgAAAAOwcAAAEAAAAhAAAAUAcAAAEAAAAhAAAAdQcAAAEAAAAiAAAAhgcAAAEAAAAiAAAAqwcAAAEAAAAjAAAAwwcAAAEAAAAjAAAA6AcAAAEAAAAkAAAAAAgAAAEAAAAkAAAAJQgAAAIAAAAlAAAAJgAAAD0IAAACAAAAJQAAACYAAABiCAAAAQAAACcAAAB6CAAAAQAAACcAAACfCAAAAgAAACgAAAApAAAAuQgAAAIAAAAoAAAAKQAAAN4IAAABAAAAKgAAAO8IAAABAAAAKgAAABQJAAABAAAAKwAAACkJAAABAAAAKwAAAE4JAAABAAAALAAAAFoJAAABAAAALAAAAH8JAAABAAAALQAAAJEJAAABAAAALQAAALYJAAABAAAALgAAAMsJAAABAAAALgAAAPAJAAABAAAALwAAAAQKAAABAAAALwAAACkKAAABAAAAMAAAAEsKAAABAAAAMAAAAHAKAAABAAAAMQAAAIEKAAABAAAAMQAAAKYKAAABAAAAMgAAALkKAAABAAAAMgAAAN4KAAABAAAAMwAAAO4KAAABAAAAMwAAABMLAAABAAAANAAAACoLAAABAAAANAAAAE8LAAABAAAANQAAAGMLAAABAAAANQAAAIgLAAABAAAANgAAAJ0LAAABAAAANgAAAMILAAABAAAANwAAANELAAABAAAANwAAAPYLAAABAAAAOAAAAA4MAAABAAAAOAAAADMMAAABAAAAOQAAADsMAAABAAAAOQAAAGAMAAACAAAABgAAAAUAAABvDAAAAgAAAAgAAAAFAAAAfgwAAAIAAAAHAAAABQAAAI4MAAACAAAAAAAAAAUAAACdDAAAAgAAAAEAAAAFAAAArAwAAAIAAAACAAAABQAAALwMAAACAAAABAAAAAUAAAA=","m_EntryDataString":"OgAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAASwMAAAEAAAAAAAAAAgAAAAAAAAD/////AAAAAJYGAAACAAAAAAAAAAMAAAAAAAAA/////wAAAADZCQAAAwAAAAAAAAAEAAAAAAAAAP////8AAAAAHg0AAAQAAAAAAAAABQAAAAAAAAD/////AAAAAGEQAAAFAAAAAAAAAAYAAAAAAAAA/////wAAAADSEwAABgAAAAAAAAAHAAAAAAAAAP////8AAAAAGxcAAAcAAAAAAAAACAAAAAAAAAD/////AAAAAGgaAAAIAAAAAAAAAAkAAAABAAAAXwAAABSDZLX/////CQAAAAEAAAAKAAAAAQAAAF8AAAAUg2S1/////wsAAAABAAAACwAAAAEAAABfAAAAFINktf////8NAAAAAgAAAAsAAAABAAAAXwAAABSDZLX/////DQAAAAMAAAAMAAAAAQAAAF8AAAAUg2S1/////w8AAAACAAAADAAAAAEAAABfAAAAFINktf////8PAAAAAwAAAA0AAAABAAAAYAAAAG+WZhv/////EQAAAAEAAAAOAAAAAQAAAGAAAABvlmYb/////xMAAAABAAAADwAAAAEAAABgAAAAb5ZmG/////8VAAAAAQAAABAAAAABAAAAYAAAAG+WZhv/////FwAAAAEAAAARAAAAAQAAAGAAAABvlmYb/////xkAAAABAAAAEgAAAAEAAABgAAAAb5ZmG/////8bAAAAAQAAABMAAAABAAAAYAAAAG+WZhv/////HQAAAAEAAAATAAAAAQAAAGAAAABvlmYb/////x0AAAAEAAAAEwAAAAEAAABgAAAAb5ZmG/////8dAAAABQAAABQAAAABAAAAYAAAAG+WZhv/////HwAAAAEAAAAVAAAAAQAAAGAAAABvlmYb/////yEAAAABAAAAFgAAAAEAAABhAAAAwbF5mv////8jAAAAAQAAABcAAAABAAAAXwAAABSDZLX/////JQAAAAEAAAAYAAAAAQAAAF8AAAAUg2S1/////ycAAAAGAAAAGQAAAAEAAABfAAAAFINktf////8pAAAABgAAABoAAAABAAAAXwAAABSDZLX/////KwAAAAYAAAAbAAAAAQAAAF8AAAAUg2S1/////y0AAAAGAAAAHAAAAAEAAABfAAAAFINktf////8vAAAAAQAAAB0AAAABAAAAXwAAABSDZLX/////MQAAAAYAAAAeAAAAAQAAAF8AAAAUg2S1/////zMAAAABAAAAHwAAAAEAAABfAAAAFINktf////81AAAAAQAAACAAAAABAAAAXwAAABSDZLX/////NwAAAAEAAAAhAAAAAQAAAF8AAAAUg2S1/////zkAAAACAAAAIQAAAAEAAABfAAAAFINktf////85AAAAAwAAACIAAAABAAAAXwAAABSDZLX/////OwAAAAYAAAAjAAAAAQAAAF8AAAAUg2S1/////z0AAAACAAAAIwAAAAEAAABfAAAAFINktf////89AAAAAwAAACQAAAABAAAAYgAAAAUUbLb/////PwAAAAEAAAAlAAAAAQAAAF8AAAAUg2S1/////0EAAAAGAAAAJgAAAAEAAABjAAAAkp7TyP////9DAAAAAQAAACcAAAABAAAAZAAAACwXUUb/////RQAAAAEAAAAoAAAAAQAAAF8AAAAUg2S1/////0cAAAABAAAAKQAAAAEAAABfAAAAFINktf////9JAAAAAQAAACoAAAABAAAAXwAAABSDZLX/////SwAAAAEAAAArAAAAAQAAAF8AAAAUg2S1/////00AAAAGAAAALAAAAAEAAABfAAAAFINktf////9PAAAAAQAAAC0AAAABAAAAAwAAAIjWJe7/////UQAAAAEAAAAuAAAAAQAAAF8AAAAUg2S1/////1MAAAAGAAAALwAAAAEAAABfAAAAFINktf////9VAAAAAQAAADAAAAABAAAAXwAAABSDZLX/////VwAAAAEAAAAxAAAAAQAAAGEAAADBsXma/////1kAAAABAAAAMgAAAAEAAABlAAAAwU8UAf////9bAAAAAQAAADMAAAABAAAAYQAAAMGxeZr/////XQAAAAEAAAA=","m_ExtraDataString":"B0xVbml0eS5SZXNvdXJjZU1hbmFnZXIsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsSlVuaXR5RW5naW5lLlJlc291cmNlTWFuYWdlbWVudC5SZXNvdXJjZVByb3ZpZGVycy5Bc3NldEJ1bmRsZVJlcXVlc3RPcHRpb25zrgIAAHsAIgBtAF8ASABhAHMAaAAiADoAIgBiADgAMQA3AGYAYgBlAGQAYwBmAGQAMwA0ADQAMQBiADYAOQAxAGYAMAA5ADkAZQAzAGUAMgBmADYAZQA0AGEAIgAsACIAbQBfAEMAcgBjACIAOgAxADUAOQA4ADkANwA2ADQAOQA2ACwAIgBtAF8AVABpAG0AZQBvAHUAdAAiADoAMAAsACIAbQBfAEMAaAB1AG4AawBlAGQAVAByAGEAbgBzAGYAZQByACIAOgBmAGEAbABzAGUALAAiAG0AXwBSAGUAZABpAHIAZQBjAHQATABpAG0AaQB0ACIAOgAtADEALAAiAG0AXwBSAGUAdAByAHkAQwBvAHUAbgB0ACIAOgAwACwAIgBtAF8AQgB1AG4AZABsAGUATgBhAG0AZQAiADoAIgA5ADcAMQBhAGMANgAyADYAMQA1ADIAZgA0AGEAMwA4AGUAMQA2ADgAZgA4AGYAZgBkAGQAYQA0ADAAYgA3ADMAIgAsACIAbQBfAEEAcwBzAGUAdABMAG8AYQBkAE0AbwBkAGUAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBTAGkAegBlACIAOgAyADcAMAAwADgAMwAzACwAIgBtAF8AVQBzAGUAQwByAGMARgBvAHIAQwBhAGMAaABlAGQAQgB1AG4AZABsAGUAcwAiADoAdAByAHUAZQAsACIAbQBfAFUAcwBlAFUAVwBSAEYAbwByAEwAbwBjAGEAbABCAHUAbgBkAGwAZQBzACIAOgBmAGEAbABzAGUALAAiAG0AXwBDAGwAZQBhAHIATwB0AGgAZQByAEMAYQBjAGgAZQBkAFYAZQByAHMAaQBvAG4AcwBXAGgAZQBuAEwAbwBhAGQAZQBkACIAOgB0AHIAdQBlAH0AB0xVbml0eS5SZXNvdXJjZU1hbmFnZXIsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsSlVuaXR5RW5naW5lLlJlc291cmNlTWFuYWdlbWVudC5SZXNvdXJjZVByb3ZpZGVycy5Bc3NldEJ1bmRsZVJlcXVlc3RPcHRpb25zrgIAAHsAIgBtAF8ASABhAHMAaAAiADoAIgBmADEAMwA4ADgAZABmAGUAZABhAGYAOAA5AGUAMwBiAGQAYgA4ADMAMABlADIAYQAxAGUAMABjAGUAOAA5ADAAIgAsACIAbQBfAEMAcgBjACIAOgAyADUAOQA3ADMAOQA1ADcAMAAyACwAIgBtAF8AVABpAG0AZQBvAHUAdAAiADoAMAAsACIAbQBfAEMAaAB1AG4AawBlAGQAVAByAGEAbgBzAGYAZQByACIAOgBmAGEAbABzAGUALAAiAG0AXwBSAGUAZABpAHIAZQBjAHQATABpAG0AaQB0ACIAOgAtADEALAAiAG0AXwBSAGUAdAByAHkAQwBvAHUAbgB0ACIAOgAwACwAIgBtAF8AQgB1AG4AZABsAGUATgBhAG0AZQAiADoAIgBhADYANABjAGMAOQA3ADcANQAyAGQANAA3AGMANgBkAGYAMwAxAGEAZgA0ADUAMABlAGYANwBiAGEAYQBjAGMAIgAsACIAbQBfAEEAcwBzAGUAdABMAG8AYQBkAE0AbwBkAGUAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBTAGkAegBlACIAOgAzADgAMwAyADYANAAyACwAIgBtAF8AVQBzAGUAQwByAGMARgBvAHIAQwBhAGMAaABlAGQAQgB1AG4AZABsAGUAcwAiADoAdAByAHUAZQAsACIAbQBfAFUAcwBlAFUAVwBSAEYAbwByAEwAbwBjAGEAbABCAHUAbgBkAGwAZQBzACIAOgBmAGEAbABzAGUALAAiAG0AXwBDAGwAZQBhAHIATwB0AGgAZQByAEMAYQBjAGgAZQBkAFYAZQByAHMAaQBvAG4AcwBXAGgAZQBuAEwAbwBhAGQAZQBkACIAOgB0AHIAdQBlAH0AB0xVbml0eS5SZXNvdXJjZU1hbmFnZXIsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsSlVuaXR5RW5naW5lLlJlc291cmNlTWFuYWdlbWVudC5SZXNvdXJjZVByb3ZpZGVycy5Bc3NldEJ1bmRsZVJlcXVlc3RPcHRpb25zpgIAAHsAIgBtAF8ASABhAHMAaAAiADoAIgA4ADIAOQA2ADQAMAA1ADYANwBhADUANgAyAGEAOQBlADMANwBmAGEAYQAyADEAOQA5ADgANABlADMANQAzADIAIgAsACIAbQBfAEMAcgBjACIAOgA5ADUANAAyADIAOAA3ADYALAAiAG0AXwBUAGkAbQBlAG8AdQB0ACIAOgAwACwAIgBtAF8AQwBoAHUAbgBrAGUAZABUAHIAYQBuAHMAZgBlAHIAIgA6AGYAYQBsAHMAZQAsACIAbQBfAFIAZQBkAGkAcgBlAGMAdABMAGkAbQBpAHQAIgA6AC0AMQAsACIAbQBfAFIAZQB0AHIAeQBDAG8AdQBuAHQAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBOAGEAbQBlACIAOgAiAGEAZQA4ADEAOAAzADIAYQBhAGEAMgA2ADUAMQA3ADYAMgA3AGIANQBkAGMANgBiADkAZQAzADUAYwA3AGIANQAiACwAIgBtAF8AQQBzAHMAZQB0AEwAbwBhAGQATQBvAGQAZQAiADoAMAAsACIAbQBfAEIAdQBuAGQAbABlAFMAaQB6AGUAIgA6ADYANgA0ADQANgAsACIAbQBfAFUAcwBlAEMAcgBjAEYAbwByAEMAYQBjAGgAZQBkAEIAdQBuAGQAbABlAHMAIgA6AHQAcgB1AGUALAAiAG0AXwBVAHMAZQBVAFcAUgBGAG8AcgBMAG8AYwBhAGwAQgB1AG4AZABsAGUAcwAiADoAZgBhAGwAcwBlACwAIgBtAF8AQwBsAGUAYQByAE8AdABoAGUAcgBDAGEAYwBoAGUAZABWAGUAcgBzAGkAbwBuAHMAVwBoAGUAbgBMAG8AYQBkAGUAZAAiADoAdAByAHUAZQB9AAdMVW5pdHkuUmVzb3VyY2VNYW5hZ2VyLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbEpVbml0eUVuZ2luZS5SZXNvdXJjZU1hbmFnZW1lbnQuUmVzb3VyY2VQcm92aWRlcnMuQXNzZXRCdW5kbGVSZXF1ZXN0T3B0aW9uc6gCAAB7ACIAbQBfAEgAYQBzAGgAIgA6ACIAMQAyADkAMwA3ADYAYwBlADgAOAA5ADEAZQAyADcAMAA1ADAAZgA5AGQANAAxADgAMwBmAGEAOQA2AGIANABlACIALAAiAG0AXwBDAHIAYwAiADoAMwA0ADYAOQA0ADYAOQAyADcANgAsACIAbQBfAFQAaQBtAGUAbwB1AHQAIgA6ADAALAAiAG0AXwBDAGgAdQBuAGsAZQBkAFQAcgBhAG4AcwBmAGUAcgAiADoAZgBhAGwAcwBlACwAIgBtAF8AUgBlAGQAaQByAGUAYwB0AEwAaQBtAGkAdAAiADoALQAxACwAIgBtAF8AUgBlAHQAcgB5AEMAbwB1AG4AdAAiADoAMAAsACIAbQBfAEIAdQBuAGQAbABlAE4AYQBtAGUAIgA6ACIAMwA1AGIAYQA1AGEAYQAyAGIANgAwADIAOQBjAGIANgA3AGYAMgA4ADAAZQBmADMAZgBiADAAZABjADkAMwBjACIALAAiAG0AXwBBAHMAcwBlAHQATABvAGEAZABNAG8AZABlACIAOgAwACwAIgBtAF8AQgB1AG4AZABsAGUAUwBpAHoAZQAiADoAMgA0ADQANwAsACIAbQBfAFUAcwBlAEMAcgBjAEYAbwByAEMAYQBjAGgAZQBkAEIAdQBuAGQAbABlAHMAIgA6AHQAcgB1AGUALAAiAG0AXwBVAHMAZQBVAFcAUgBGAG8AcgBMAG8AYwBhAGwAQgB1AG4AZABsAGUAcwAiADoAZgBhAGwAcwBlACwAIgBtAF8AQwBsAGUAYQByAE8AdABoAGUAcgBDAGEAYwBoAGUAZABWAGUAcgBzAGkAbwBuAHMAVwBoAGUAbgBMAG8AYQBkAGUAZAAiADoAdAByAHUAZQB9AAdMVW5pdHkuUmVzb3VyY2VNYW5hZ2VyLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbEpVbml0eUVuZ2luZS5SZXNvdXJjZU1hbmFnZW1lbnQuUmVzb3VyY2VQcm92aWRlcnMuQXNzZXRCdW5kbGVSZXF1ZXN0T3B0aW9uc6YCAAB7ACIAbQBfAEgAYQBzAGgAIgA6ACIAMAA4ADYAOQBiADYAZQA3ADcAOAA3ADAAZABkADMANAA1ADkAZgAyADcANgA2ADQAYwBhAGYANgAzADAAMgAxACIALAAiAG0AXwBDAHIAYwAiADoANQA1ADEAMgAyADQANgAzADAALAAiAG0AXwBUAGkAbQBlAG8AdQB0ACIAOgAwACwAIgBtAF8AQwBoAHUAbgBrAGUAZABUAHIAYQBuAHMAZgBlAHIAIgA6AGYAYQBsAHMAZQAsACIAbQBfAFIAZQBkAGkAcgBlAGMAdABMAGkAbQBpAHQAIgA6AC0AMQAsACIAbQBfAFIAZQB0AHIAeQBDAG8AdQBuAHQAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBOAGEAbQBlACIAOgAiAGMAOAA4ADkAYgAwAGYAYwAzAGYAZQA3ADYANwBhADQAYwA3ADUAZQBlAGMAYQA1ADUAMAA2ADUAMQBlAGEANAAiACwAIgBtAF8AQQBzAHMAZQB0AEwAbwBhAGQATQBvAGQAZQAiADoAMAAsACIAbQBfAEIAdQBuAGQAbABlAFMAaQB6AGUAIgA6ADQAMwAwADkALAAiAG0AXwBVAHMAZQBDAHIAYwBGAG8AcgBDAGEAYwBoAGUAZABCAHUAbgBkAGwAZQBzACIAOgB0AHIAdQBlACwAIgBtAF8AVQBzAGUAVQBXAFIARgBvAHIATABvAGMAYQBsAEIAdQBuAGQAbABlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBfAEMAbABlAGEAcgBPAHQAaABlAHIAQwBhAGMAaABlAGQAVgBlAHIAcwBpAG8AbgBzAFcAaABlAG4ATABvAGEAZABlAGQAIgA6AHQAcgB1AGUAfQAHTFVuaXR5LlJlc291cmNlTWFuYWdlciwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxKVW5pdHlFbmdpbmUuUmVzb3VyY2VNYW5hZ2VtZW50LlJlc291cmNlUHJvdmlkZXJzLkFzc2V0QnVuZGxlUmVxdWVzdE9wdGlvbnPUAgAAewAiAG0AXwBIAGEAcwBoACIAOgAiADgANgBkADMAYQBmADkAYgA3ADMANQAwAGEAMgA0ADgAYQAyAGUANAAwAGIAMgBiADcAMAA1ADgANwA4AGUAZQAiACwAIgBtAF8AQwByAGMAIgA6ADMAOQAzADEAOAA4ADUANAAyADUALAAiAG0AXwBUAGkAbQBlAG8AdQB0ACIAOgAwACwAIgBtAF8AQwBoAHUAbgBrAGUAZABUAHIAYQBuAHMAZgBlAHIAIgA6AGYAYQBsAHMAZQAsACIAbQBfAFIAZQBkAGkAcgBlAGMAdABMAGkAbQBpAHQAIgA6AC0AMQAsACIAbQBfAFIAZQB0AHIAeQBDAG8AdQBuAHQAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBOAGEAbQBlACIAOgAiAGYANwAzAGYANwA3AGYAOAA1AGMAZQA0ADYANQBhADUAYwA0AGYAYQAzADcAOQBhADIAZgBkADMANgBiADcAZgBfAHUAbgBpAHQAeQBiAHUAaQBsAHQAaQBuAHMAaABhAGQAZQByAHMAIgAsACIAbQBfAEEAcwBzAGUAdABMAG8AYQBkAE0AbwBkAGUAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBTAGkAegBlACIAOgAyADIAMwA2ADYAMAAsACIAbQBfAFUAcwBlAEMAcgBjAEYAbwByAEMAYQBjAGgAZQBkAEIAdQBuAGQAbABlAHMAIgA6AHQAcgB1AGUALAAiAG0AXwBVAHMAZQBVAFcAUgBGAG8AcgBMAG8AYwBhAGwAQgB1AG4AZABsAGUAcwAiADoAZgBhAGwAcwBlACwAIgBtAF8AQwBsAGUAYQByAE8AdABoAGUAcgBDAGEAYwBoAGUAZABWAGUAcgBzAGkAbwBuAHMAVwBoAGUAbgBMAG8AYQBkAGUAZAAiADoAdAByAHUAZQB9AAdMVW5pdHkuUmVzb3VyY2VNYW5hZ2VyLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbEpVbml0eUVuZ2luZS5SZXNvdXJjZU1hbmFnZW1lbnQuUmVzb3VyY2VQcm92aWRlcnMuQXNzZXRCdW5kbGVSZXF1ZXN0T3B0aW9uc6wCAAB7ACIAbQBfAEgAYQBzAGgAIgA6ACIAOAAzADIANAAzAGIAMwAwAGQAMQA2ADkAZgBkAGIAZgBlADYAYwA4ADEAMgA0AGIANwA1AGEAMwBkAGMAMABlACIALAAiAG0AXwBDAHIAYwAiADoAMwAwADEAOQAyADgANgA0ADIANQAsACIAbQBfAFQAaQBtAGUAbwB1AHQAIgA6ADAALAAiAG0AXwBDAGgAdQBuAGsAZQBkAFQAcgBhAG4AcwBmAGUAcgAiADoAZgBhAGwAcwBlACwAIgBtAF8AUgBlAGQAaQByAGUAYwB0AEwAaQBtAGkAdAAiADoALQAxACwAIgBtAF8AUgBlAHQAcgB5AEMAbwB1AG4AdAAiADoAMAAsACIAbQBfAEIAdQBuAGQAbABlAE4AYQBtAGUAIgA6ACIAZAA1AGUANgA1ADcAMQAyAGYAMgBjAGEAMQAwAGQANAAyAGEANwBiADYAOABiADcAMgA2ADUAOABkAGIANwA1ACIALAAiAG0AXwBBAHMAcwBlAHQATABvAGEAZABNAG8AZABlACIAOgAwACwAIgBtAF8AQgB1AG4AZABsAGUAUwBpAHoAZQAiADoAMwA1ADMAMwAzADQALAAiAG0AXwBVAHMAZQBDAHIAYwBGAG8AcgBDAGEAYwBoAGUAZABCAHUAbgBkAGwAZQBzACIAOgB0AHIAdQBlACwAIgBtAF8AVQBzAGUAVQBXAFIARgBvAHIATABvAGMAYQBsAEIAdQBuAGQAbABlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBfAEMAbABlAGEAcgBPAHQAaABlAHIAQwBhAGMAaABlAGQAVgBlAHIAcwBpAG8AbgBzAFcAaABlAG4ATABvAGEAZABlAGQAIgA6AHQAcgB1AGUAfQAHTFVuaXR5LlJlc291cmNlTWFuYWdlciwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxKVW5pdHlFbmdpbmUuUmVzb3VyY2VNYW5hZ2VtZW50LlJlc291cmNlUHJvdmlkZXJzLkFzc2V0QnVuZGxlUmVxdWVzdE9wdGlvbnOwAgAAewAiAG0AXwBIAGEAcwBoACIAOgAiADQANgAyAGUAMgBkADIAYwA0AGYAYgA1ADYANQBiADEAOQA1AGUAZQBjADMANQBiAGIAYQBhADcAMAAyADcAOAAiACwAIgBtAF8AQwByAGMAIgA6ADEAMgA0ADQAMgA0ADkAMgA1ADUALAAiAG0AXwBUAGkAbQBlAG8AdQB0ACIAOgAwACwAIgBtAF8AQwBoAHUAbgBrAGUAZABUAHIAYQBuAHMAZgBlAHIAIgA6AGYAYQBsAHMAZQAsACIAbQBfAFIAZQBkAGkAcgBlAGMAdABMAGkAbQBpAHQAIgA6AC0AMQAsACIAbQBfAFIAZQB0AHIAeQBDAG8AdQBuAHQAIgA6ADAALAAiAG0AXwBCAHUAbgBkAGwAZQBOAGEAbQBlACIAOgAiAGMANQA5ADAAZgA5AGMAMgAzAGQAOQA0ADUAMgBlADkANwBiADYANAA0AGQAMgBhAGUAOABkADMAZQBjADIAMQAiACwAIgBtAF8AQQBzAHMAZQB0AEwAbwBhAGQATQBvAGQAZQAiADoAMAAsACIAbQBfAEIAdQBuAGQAbABlAFMAaQB6AGUAIgA6ADEAMAA2ADcAOAAzADYALAAiAG0AXwBVAHMAZQBDAHIAYwBGAG8AcgBDAGEAYwBoAGUAZABCAHUAbgBkAGwAZQBzACIAOgB0AHIAdQBlACwAIgBtAF8AVQBzAGUAVQBXAFIARgBvAHIATABvAGMAYQBsAEIAdQBuAGQAbABlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBfAEMAbABlAGEAcgBPAHQAaABlAHIAQwBhAGMAaABlAGQAVgBlAHIAcwBpAG8AbgBzAFcAaABlAG4ATABvAGEAZABlAGQAIgA6AGYAYQBsAHMAZQB9AAdMVW5pdHkuUmVzb3VyY2VNYW5hZ2VyLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbEpVbml0eUVuZ2luZS5SZXNvdXJjZU1hbmFnZW1lbnQuUmVzb3VyY2VQcm92aWRlcnMuQXNzZXRCdW5kbGVSZXF1ZXN0T3B0aW9uc7QCAAB7ACIAbQBfAEgAYQBzAGgAIgA6ACIAZgAzADUANwA4ADgAMwBjADgANABhADgAMAAyADMAMQA0ADgANgBiADAANAAwADQAYgAxAGQAYwAyAGYAOQBmACIALAAiAG0AXwBDAHIAYwAiADoAMgAwADYAOAA1ADEAMgA0ADYAMQAsACIAbQBfAFQAaQBtAGUAbwB1AHQAIgA6ADAALAAiAG0AXwBDAGgAdQBuAGsAZQBkAFQAcgBhAG4AcwBmAGUAcgAiADoAZgBhAGwAcwBlACwAIgBtAF8AUgBlAGQAaQByAGUAYwB0AEwAaQBtAGkAdAAiADoALQAxACwAIgBtAF8AUgBlAHQAcgB5AEMAbwB1AG4AdAAiADoAMAAsACIAbQBfAEIAdQBuAGQAbABlAE4AYQBtAGUAIgA6ACIAMwA0ADAAMQA1AGYAOQA3AGIAMAA1AGMAOAAzAGUAOQAwAGQAMABhADYANwBhADEAOAA2ADAANwAwADAANQA2ACIALAAiAG0AXwBBAHMAcwBlAHQATABvAGEAZABNAG8AZABlACIAOgAwACwAIgBtAF8AQgB1AG4AZABsAGUAUwBpAHoAZQAiADoAMgAxADQANgAxADAAOAA1ADIALAAiAG0AXwBVAHMAZQBDAHIAYwBGAG8AcgBDAGEAYwBoAGUAZABCAHUAbgBkAGwAZQBzACIAOgB0AHIAdQBlACwAIgBtAF8AVQBzAGUAVQBXAFIARgBvAHIATABvAGMAYQBsAEIAdQBuAGQAbABlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBfAEMAbABlAGEAcgBPAHQAaABlAHIAQwBhAGMAaABlAGQAVgBlAHIAcwBpAG8AbgBzAFcAaABlAG4ATABvAGEAZABlAGQAIgA6AGYAYQBsAHMAZQB9AA==","m_resourceTypes":[{"m_AssemblyName":"Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.ResourceManagement.ResourceProviders.IAssetBundleResource"},{"m_AssemblyName":"UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.GameObject"},{"m_AssemblyName":"UnityEngine.UIElementsModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.UIElements.VisualTreeAsset"},{"m_AssemblyName":"UnityEngine.UIElementsModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.UIElements.StyleSheet"},{"m_AssemblyName":"UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.Material"},{"m_AssemblyName":"UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.Mesh"},{"m_AssemblyName":"UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.Shader"}],"m_InternalIdPrefixes":[]}
\ No newline at end of file
diff --git a/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/settings.json b/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/settings.json
index 85835d3..ec5d19a 100644
--- a/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/settings.json
+++ b/template/Bathing/BathingPlayer_Data/StreamingAssets/aa/settings.json
@@ -1,1 +1,1 @@
-{"m_buildTarget":"StandaloneLinux64","m_SettingsHash":"26dc9acde2b22f68c07fe63969da9108","m_CatalogLocations":[{"m_Keys":["AddressablesMainContentCatalogRemoteHash"],"m_InternalId":"{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/catalog_2024.11.18.17.07.29.hash","m_Provider":"UnityEngine.ResourceManagement.ResourceProviders.TextDataProvider","m_Dependencies":[],"m_ResourceType":{"m_AssemblyName":"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","m_ClassName":"System.String"},"SerializedData":[7,76,85,110,105,116,121,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,114,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,75,85,110,105,116,121,69,110,103,105,110,101,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,109,101,110,116,46,82,101,115,111,117,114,99,101,80,114,111,118,105,100,101,114,115,46,80,114,111,118,105,100,101,114,76,111,97,100,82,101,113,117,101,115,116,79,112,116,105,111,110,115,50,0,0,0,123,0,34,0,109,0,95,0,73,0,103,0,110,0,111,0,114,0,101,0,70,0,97,0,105,0,108,0,117,0,114,0,101,0,115,0,34,0,58,0,116,0,114,0,117,0,101,0,125,0]},{"m_Keys":["AddressablesMainContentCatalogCacheHash"],"m_InternalId":"{UnityEngine.Application.persistentDataPath}/com.unity.addressables/catalog_2024.11.18.17.07.29.hash","m_Provider":"UnityEngine.ResourceManagement.ResourceProviders.TextDataProvider","m_Dependencies":[],"m_ResourceType":{"m_AssemblyName":"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","m_ClassName":"System.String"},"SerializedData":[7,76,85,110,105,116,121,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,114,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,75,85,110,105,116,121,69,110,103,105,110,101,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,109,101,110,116,46,82,101,115,111,117,114,99,101,80,114,111,118,105,100,101,114,115,46,80,114,111,118,105,100,101,114,76,111,97,100,82,101,113,117,101,115,116,79,112,116,105,111,110,115,50,0,0,0,123,0,34,0,109,0,95,0,73,0,103,0,110,0,111,0,114,0,101,0,70,0,97,0,105,0,108,0,117,0,114,0,101,0,115,0,34,0,58,0,116,0,114,0,117,0,101,0,125,0]},{"m_Keys":["AddressablesMainContentCatalog"],"m_InternalId":"{UnityEngine.AddressableAssets.Addressables.RuntimePath}/catalog.json","m_Provider":"UnityEngine.AddressableAssets.ResourceProviders.ContentCatalogProvider","m_Dependencies":["AddressablesMainContentCatalogRemoteHash","AddressablesMainContentCatalogCacheHash"],"m_ResourceType":{"m_AssemblyName":"Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.AddressableAssets.ResourceLocators.ContentCatalogData"},"SerializedData":[7,76,85,110,105,116,121,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,114,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,75,85,110,105,116,121,69,110,103,105,110,101,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,109,101,110,116,46,82,101,115,111,117,114,99,101,80,114,111,118,105,100,101,114,115,46,80,114,111,118,105,100,101,114,76,111,97,100,82,101,113,117,101,115,116,79,112,116,105,111,110,115,50,0,0,0,123,0,34,0,109,0,95,0,73,0,103,0,110,0,111,0,114,0,101,0,70,0,97,0,105,0,108,0,117,0,114,0,101,0,115,0,34,0,58,0,116,0,114,0,117,0,101,0,125,0]}],"m_ProfileEvents":false,"m_LogResourceManagerExceptions":true,"m_ExtraInitializationData":[],"m_DisableCatalogUpdateOnStart":false,"m_IsLocalCatalogInBundle":false,"m_CertificateHandlerType":{"m_AssemblyName":"","m_ClassName":""},"m_AddressablesVersion":"1.21.21","m_maxConcurrentWebRequests":500,"m_CatalogRequestsTimeout":0}
\ No newline at end of file
+{"m_buildTarget":"StandaloneLinux64","m_SettingsHash":"9e657822b4417684a383df4b1a9268b6","m_CatalogLocations":[{"m_Keys":["AddressablesMainContentCatalogRemoteHash"],"m_InternalId":"{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneLinux64/catalog_2024.12.02.19.53.16.hash","m_Provider":"UnityEngine.ResourceManagement.ResourceProviders.TextDataProvider","m_Dependencies":[],"m_ResourceType":{"m_AssemblyName":"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","m_ClassName":"System.String"},"SerializedData":[7,76,85,110,105,116,121,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,114,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,75,85,110,105,116,121,69,110,103,105,110,101,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,109,101,110,116,46,82,101,115,111,117,114,99,101,80,114,111,118,105,100,101,114,115,46,80,114,111,118,105,100,101,114,76,111,97,100,82,101,113,117,101,115,116,79,112,116,105,111,110,115,50,0,0,0,123,0,34,0,109,0,95,0,73,0,103,0,110,0,111,0,114,0,101,0,70,0,97,0,105,0,108,0,117,0,114,0,101,0,115,0,34,0,58,0,116,0,114,0,117,0,101,0,125,0]},{"m_Keys":["AddressablesMainContentCatalogCacheHash"],"m_InternalId":"{UnityEngine.Application.persistentDataPath}/com.unity.addressables/catalog_2024.12.02.19.53.16.hash","m_Provider":"UnityEngine.ResourceManagement.ResourceProviders.TextDataProvider","m_Dependencies":[],"m_ResourceType":{"m_AssemblyName":"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","m_ClassName":"System.String"},"SerializedData":[7,76,85,110,105,116,121,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,114,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,75,85,110,105,116,121,69,110,103,105,110,101,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,109,101,110,116,46,82,101,115,111,117,114,99,101,80,114,111,118,105,100,101,114,115,46,80,114,111,118,105,100,101,114,76,111,97,100,82,101,113,117,101,115,116,79,112,116,105,111,110,115,50,0,0,0,123,0,34,0,109,0,95,0,73,0,103,0,110,0,111,0,114,0,101,0,70,0,97,0,105,0,108,0,117,0,114,0,101,0,115,0,34,0,58,0,116,0,114,0,117,0,101,0,125,0]},{"m_Keys":["AddressablesMainContentCatalog"],"m_InternalId":"{UnityEngine.AddressableAssets.Addressables.RuntimePath}/catalog.json","m_Provider":"UnityEngine.AddressableAssets.ResourceProviders.ContentCatalogProvider","m_Dependencies":["AddressablesMainContentCatalogRemoteHash","AddressablesMainContentCatalogCacheHash"],"m_ResourceType":{"m_AssemblyName":"Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null","m_ClassName":"UnityEngine.AddressableAssets.ResourceLocators.ContentCatalogData"},"SerializedData":[7,76,85,110,105,116,121,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,114,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,75,85,110,105,116,121,69,110,103,105,110,101,46,82,101,115,111,117,114,99,101,77,97,110,97,103,101,109,101,110,116,46,82,101,115,111,117,114,99,101,80,114,111,118,105,100,101,114,115,46,80,114,111,118,105,100,101,114,76,111,97,100,82,101,113,117,101,115,116,79,112,116,105,111,110,115,50,0,0,0,123,0,34,0,109,0,95,0,73,0,103,0,110,0,111,0,114,0,101,0,70,0,97,0,105,0,108,0,117,0,114,0,101,0,115,0,34,0,58,0,116,0,114,0,117,0,101,0,125,0]}],"m_ProfileEvents":false,"m_LogResourceManagerExceptions":true,"m_ExtraInitializationData":[],"m_DisableCatalogUpdateOnStart":false,"m_IsLocalCatalogInBundle":false,"m_CertificateHandlerType":{"m_AssemblyName":"","m_ClassName":""},"m_AddressablesVersion":"1.21.21","m_maxConcurrentWebRequests":500,"m_CatalogRequestsTimeout":0}
\ No newline at end of file
diff --git a/template/Bathing/BathingPlayer_Data/boot.config b/template/Bathing/BathingPlayer_Data/boot.config
index 67b9b22..14a1077 100644
--- a/template/Bathing/BathingPlayer_Data/boot.config
+++ b/template/Bathing/BathingPlayer_Data/boot.config
@@ -2,4 +2,4 @@ wait-for-native-debugger=0
 hdr-display-enabled=0
 gc-max-time-slice=3
 force-d3d11-bitblt-model=
-build-guid=407fe9328f1c4c6d846d9630d9284a8b
+build-guid=9f0f37de82dd4dc2becf90b3587d600f
diff --git a/template/Bathing/BathingPlayer_Data/globalgamemanagers b/template/Bathing/BathingPlayer_Data/globalgamemanagers
index d794c85..f40e564 100644
Binary files a/template/Bathing/BathingPlayer_Data/globalgamemanagers and b/template/Bathing/BathingPlayer_Data/globalgamemanagers differ
diff --git a/template/Bathing/BathingPlayer_Data/resources.assets b/template/Bathing/BathingPlayer_Data/resources.assets
index 5d41615..82e955f 100644
Binary files a/template/Bathing/BathingPlayer_Data/resources.assets and b/template/Bathing/BathingPlayer_Data/resources.assets differ
diff --git a/template/test_bathing_force.py b/template/template_bathing_force.py
similarity index 59%
rename from template/test_bathing_force.py
rename to template/template_bathing_force.py
index 69d76b3..bda115b 100644
--- a/template/test_bathing_force.py
+++ b/template/template_bathing_force.py
@@ -7,16 +7,13 @@
 
 def _main(dev):
     '''
-    Runs the simulation to allow a developer to verify the sponge's force values from the Unity editor.
-
-    Note: This script requires the Unity Editor / EmPRISE Lab internal version of RCareWorld to be installed; for regular users, this will not work.
+    Runs the simulation  to verify the sponge's force values from the Unity executable or editor.
     '''
     # Initialize the environment
     if dev:
         env = BathingEnv(executable_file="@editor", seed=100)
     else:
-        print("This script requires the Unity Editor / EmPRISE Lab internal version of RCareWorld to be installed; for regular users, this will not work. However, you can follow the code to see how to access the sponge's force values.")
-        exit(1)
+        env = BathingEnv(seed=100)
     print(env.attrs)
 
     sponge = env.get_sponge()
@@ -31,7 +28,7 @@ def _main(dev):
         print(force)
 
 if __name__ == "__main__":
-    parser = argparse.ArgumentParser(description='Run RCareWorld bathing environment simulation.')
+    parser = argparse.ArgumentParser(description='Run RCareWorld bathing environment simulation for sponge forces.')
     parser.add_argument('-d', '--dev', action='store_true', help='Run in developer mode')
     args = parser.parse_args()
     _main(args.dev)
diff --git a/template/template_bathing_grasp_point.py b/template/template_bathing_grasp_point.py
new file mode 100644
index 0000000..595537c
--- /dev/null
+++ b/template/template_bathing_grasp_point.py
@@ -0,0 +1,54 @@
+import json
+from pyrcareworld.envs.bathing_env import BathingEnv
+import numpy as np
+import cv2
+import argparse
+
+
+def _main(dev):
+    '''
+    Runs the simulation to allow a developer to verify the grasp point position is being read from the Unity executable or editor.
+    '''
+    # Initialize the environment
+    if dev:
+        env = BathingEnv(executable_file="@editor", seed=100)
+    else:
+        env = BathingEnv(seed=100)
+    print(env.attrs)
+
+    robot = env.get_robot()
+
+    for _ in range(10):
+        pos, rot = robot.GetGraspPoint(euler=True)
+        env.step()
+
+        print(pos, rot)
+        
+    position1 = (0.492, 0.644, 0.03)
+
+    robot.IKTargetDoMove(
+        position=[position1[0], position1[1] + 0.5, position1[2]],
+        duration=2,
+        speed_based=False,
+    )
+    robot.WaitDo()
+    robot.IKTargetDoMove(
+        position=[position1[0], position1[1], position1[2]],
+        duration=2,
+        speed_based=False,
+    )
+    robot.WaitDo()
+    robot.IKTargetDoKill()
+
+    # Read collision output.
+    for _ in range(9000):
+        pos, rot = robot.GetGraspPoint(euler=True)
+        env.step()
+
+        print(pos, rot)
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description='Run RCareWorld bathing environment simulation for grasp point position.')
+    parser.add_argument('-d', '--dev', action='store_true', help='Run in developer mode')
+    args = parser.parse_args()
+    _main(args.dev)


Test patch:
diff --git a/tests/test_bathing_env.py b/tests/test_bathing_env.py
index fad5891..71cfe8d 100644
--- a/tests/test_bathing_env.py
+++ b/tests/test_bathing_env.py
@@ -231,4 +231,52 @@ def test_sponge_force():
         env.step()
 
         assert force[0] == 0.0, f"On iteration {i}, force was {force} but should be 0"
+    
+def test_grasp_point_position(bathing_env: BathingEnv):
+    """
+    Test for the grasp point position and rotation being read correctly.
+    """
+    robot = bathing_env.get_robot()
+
+    start_pos1 = [0.5203691124916077, 0.25160324573516846, 1.360432744026184]
+    start_pos2 = [0.5636255145072937, 0.2514449656009674, 0.8926234245300293]
+    start_rot1 = [0.00018492204253561795, 90.03585052490234, 359.6820373535156]
+    start_rot2 = [359.94793701171875, 103.28073120117188, 357.9418640136719]
+
+    # A few preemptive calls just in case grasp point not initialized.
+    for _ in range(10):
+        robot.GetGraspPoint()
+        bathing_env.step()
+
+    for _ in range(10):
+        pos, rot = robot.GetGraspPoint(euler=True)
+        bathing_env.step()
+
+        assert np.allclose(pos, start_pos1, atol=0.1) or np.allclose(pos, start_pos2, atol=0.1)
+        assert euler_angles_allclose(rot, start_rot1, atol=5) or euler_angles_allclose(rot, start_rot2, atol=5)
+
+    position1 = (0.492, 0.644, 0.03)
+
+    robot.IKTargetDoMove(
+        position=[position1[0], position1[1] + 0.5, position1[2]],
+        duration=2,
+        speed_based=False,
+    )
+    robot.WaitDo()
+    robot.IKTargetDoMove(
+        position=[position1[0], position1[1], position1[2]],
+        duration=2,
+        speed_based=False,
+    )
+    robot.WaitDo()
+    robot.IKTargetDoKill()
+
+    bathing_env.step(5)
+
+    for _ in range(10):
+        pos, rot = robot.GetGraspPoint(euler=True)
+        bathing_env.step()
+
+        assert not (np.allclose(pos, start_pos1, atol=0.1) or np.allclose(pos, start_pos2, atol=0.1))
+        assert not (euler_angles_allclose(rot, start_rot1, atol=5) or euler_angles_allclose(rot, start_rot2, atol=5))
     
\ No newline at end of file