From cd6e018d47c5d598049ae718515522896ba27c5d Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 24 Sep 2023 16:59:02 +0900 Subject: [PATCH] feat: MA World Fixed Object (#385) --- .../ActiveAnimationRetargeterTests.meta | 3 + .../ActiveAnimationRetargeterTests.cs | 44 ++ .../ActiveAnimationRetargeterTests.cs.meta | 3 + .../SimpleRetarget.anim | 116 +++++ .../SimpleRetarget.anim.meta | 8 + .../SimpleRetarget.controller | 103 +++++ .../SimpleRetarget.controller.meta | 8 + .../SimpleRetarget.prefab | 415 ++++++++++++++++++ .../SimpleRetarget.prefab.meta | 7 + .../EditModeTests/WorldFixedObjectTest.meta | 3 + .../WorldFixedObjectTest/Nested.prefab | 409 +++++++++++++++++ .../WorldFixedObjectTest/Nested.prefab.meta | 7 + .../WorldFixedObjectTest/Simple.prefab | 365 +++++++++++++++ .../WorldFixedObjectTest/Simple.prefab.meta | 7 + .../WorldFixedObjectTest.cs | 67 +++ .../WorldFixedObjectTest.cs.meta | 3 + .../nadena.dev.modular-avatar/Assets.meta | 3 + .../Assets/FixedPrefab.prefab | 32 ++ .../Assets/FixedPrefab.prefab.meta | 7 + .../Editor/ActiveAnimationRetargeter.cs | 162 +++++++ .../Editor/ActiveAnimationRetargeter.cs.meta | 3 + .../Editor/BuildContext.cs | 5 +- .../Inspector/WorldFixedObjectEditor.cs | 22 + .../Inspector/WorldFixedObjectEditor.cs.meta | 3 + .../Editor/Localization/en.json | 2 + .../Editor/Localization/ja.json | 2 + .../Editor/MergeArmatureHook.cs | 155 +------ .../PluginDefinition/PluginDefinition.cs | 3 + .../Editor/WorldFixedObjectProcessor.cs | 93 ++++ .../Editor/WorldFixedObjectProcessor.cs.meta | 3 + .../Runtime/ModularAvatarWorldFixedObject.cs | 11 + .../ModularAvatarWorldFixedObject.cs.meta | 11 + docs/docs/reference/world-fixed-object.md | 21 + docs/docs/reference/world-fixed-object.png | Bin 0 -> 56031 bytes .../current/reference/world-fixed-object.md | 20 + .../current/reference/world-fixed-object.png | Bin 0 -> 63289 bytes 36 files changed, 1975 insertions(+), 151 deletions(-) create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab create mode 100644 Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab create mode 100644 Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab create mode 100644 Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab.meta create mode 100644 Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs create mode 100644 Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs.meta create mode 100644 Packages/nadena.dev.modular-avatar/Assets.meta create mode 100644 Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab create mode 100644 Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab.meta create mode 100644 Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs create mode 100644 Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs.meta create mode 100644 Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs create mode 100644 Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs.meta create mode 100644 Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs create mode 100644 Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs.meta create mode 100644 Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs create mode 100644 Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs.meta create mode 100644 docs/docs/reference/world-fixed-object.md create mode 100644 docs/docs/reference/world-fixed-object.png create mode 100644 docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/world-fixed-object.md create mode 100644 docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/world-fixed-object.png diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests.meta b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests.meta new file mode 100644 index 00000000..1d14163d --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 24343d20eb4d4a258e26863ccb46cc1d +timeCreated: 1691928598 \ No newline at end of file diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs new file mode 100644 index 00000000..9f0db65c --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs @@ -0,0 +1,44 @@ +using modular_avatar_tests; +using nadena.dev.modular_avatar.animation; +using nadena.dev.modular_avatar.core.editor; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; +using VRC.SDK3.Avatars.Components; + +public class ActiveAnimationRetargeterTests : TestBase +{ + [Test] + public void SimpleRetarget() { + var avatar = CreatePrefab("SimpleRetarget.prefab"); + var descriptor = avatar.GetComponent(); + + // initialize context + var buildContext = new BuildContext(descriptor); + var pathMappings = buildContext.PluginBuildContext.ActivateExtensionContext(); + new MergeAnimatorProcessor().OnPreprocessAvatar(avatar, buildContext); // we need this for AnimationDatabase + buildContext.AnimationDatabase.Bootstrap(descriptor); + + // get game objects + var changedChild = avatar.transform.Find("Toggled/Child"); + var newParent = avatar.transform.Find("NewParent"); + + // do retargeting + var retargeter = new ActiveAnimationRetargeter(buildContext, new BoneDatabase(), changedChild); + var created = retargeter.CreateIntermediateObjects(newParent.gameObject); + retargeter.FixupAnimations(); + + // commit + buildContext.AnimationDatabase.Commit(); + + var clip = findFxClip(avatar, layerName: "retarget"); + var curveBindings = AnimationUtility.GetCurveBindings(clip); + + // Intermediate object must be created + Assert.That(created, Is.Not.EqualTo(newParent.gameObject)); + + // The created animation must have m_IsActive of intermediate object + Assert.That(curveBindings, Does.Contain(EditorCurveBinding.FloatCurve( + pathMappings.GetObjectIdentifier(created), typeof(GameObject), "m_IsActive"))); + } +} \ No newline at end of file diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs.meta b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs.meta new file mode 100644 index 00000000..c747dea4 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/ActiveAnimationRetargeterTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 644d89376db24e3fa21645116fc46ba1 +timeCreated: 1691928769 \ No newline at end of file diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim new file mode 100644 index 00000000..d72de040 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim @@ -0,0 +1,116 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SimpleRetarget + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.33333334 + value: 1 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_IsActive + path: Toggled + classID: 1 + script: {fileID: 0} + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 758104917 + attribute: 2086281974 + script: {fileID: 0} + typeID: 1 + customType: 0 + isPPtrCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.33333334 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 0 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.33333334 + value: 1 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_IsActive + path: Toggled + classID: 1 + script: {fileID: 0} + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim.meta b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim.meta new file mode 100644 index 00000000..c6e0c922 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5858d87cefe184199a2904d294b5f8d3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller new file mode 100644 index 00000000..e28eb598 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller @@ -0,0 +1,103 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1107 &-8599852744395466123 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: [] + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 0} +--- !u!1102 &-5862847857433847372 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SimpleRetarget + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 5858d87cefe184199a2904d294b5f8d3, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SimpleRetarget + serializedVersion: 5 + m_AnimatorParameters: [] + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: -8599852744395466123} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: retarget + m_StateMachine: {fileID: 898016236898757940} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1107 &898016236898757940 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: retarget + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -5862847857433847372} + m_Position: {x: 110, y: 200, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -5862847857433847372} diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller.meta b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller.meta new file mode 100644 index 00000000..6aadc783 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 27059e37876a5458285a0904e07b983f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab new file mode 100644 index 00000000..70ef55ef --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab @@ -0,0 +1,415 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3928259091898741543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8769549937025373208} + m_Layer: 0 + m_Name: Child + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8769549937025373208 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3928259091898741543} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4913003977449755838} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4892841545226093997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1404385703395384853} + - component: {fileID: 4034299884250139105} + - component: {fileID: 5057208987422739041} + - component: {fileID: 8116285043581302730} + m_Layer: 0 + m_Name: SimpleRetarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1404385703395384853 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4892841545226093997} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4913003977449755838} + - {fileID: 8273154166008081719} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &4034299884250139105 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4892841545226093997} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &5057208987422739041 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4892841545226093997} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: + ViewPosition: {x: 0, y: 1.6, z: 0.2} + Animations: 0 + ScaleIPD: 1 + lipSync: 0 + lipSyncJawBone: {fileID: 0} + lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1} + lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1} + VisemeSkinnedMesh: {fileID: 0} + MouthOpenBlendShapeName: Facial_Blends.Jaw_Down + VisemeBlendShapes: [] + unityVersion: + portraitCameraPositionOffset: {x: 0, y: 0, z: 0} + portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} + networkIDs: [] + customExpressions: 0 + expressionsMenu: {fileID: 0} + expressionParameters: {fileID: 0} + enableEyeLook: 0 + customEyeLookSettings: + eyeMovement: + confidence: 0.5 + excitement: 0.5 + leftEye: {fileID: 0} + rightEye: {fileID: 0} + eyesLookingStraight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingUp: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingDown: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingLeft: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingRight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidType: 0 + upperLeftEyelid: {fileID: 0} + upperRightEyelid: {fileID: 0} + lowerLeftEyelid: {fileID: 0} + lowerRightEyelid: {fileID: 0} + eyelidsDefault: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsClosed: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingUp: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingDown: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsSkinnedMesh: {fileID: 0} + eyelidsBlendshapes: + customizeAnimationLayers: 1 + baseAnimationLayers: + - isEnabled: 0 + type: 0 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 4 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 5 + animatorController: {fileID: 9100000, guid: 27059e37876a5458285a0904e07b983f, + type: 2} + mask: {fileID: 0} + isDefault: 0 + specialAnimationLayers: + - isEnabled: 0 + type: 6 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 7 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 8 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + AnimationPreset: {fileID: 0} + animationHashSet: [] + autoFootsteps: 1 + autoLocomotion: 1 + collider_head: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_torso: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} +--- !u!114 &8116285043581302730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4892841545226093997} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3} + m_Name: + m_EditorClassIdentifier: + launchedFromSDKPipeline: 0 + completedSDKPipeline: 0 + blueprintId: + contentType: 0 + assetBundleUnityVersion: + fallbackStatus: 0 +--- !u!1 &5552471151564693013 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8273154166008081719} + m_Layer: 0 + m_Name: NewParent + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8273154166008081719 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5552471151564693013} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1404385703395384853} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8530643608437214789 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4913003977449755838} + m_Layer: 0 + m_Name: Toggled + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4913003977449755838 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8530643608437214789} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8769549937025373208} + m_Father: {fileID: 1404385703395384853} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab.meta b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab.meta new file mode 100644 index 00000000..317fd738 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/ActiveAnimationRetargeterTests/SimpleRetarget.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 43df0f1469a9e41eb9d0e11067919c29 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest.meta b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest.meta new file mode 100644 index 00000000..80edc96a --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: db9b105182f24b07aa2d35a0265d37f0 +timeCreated: 1691932793 \ No newline at end of file diff --git a/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab new file mode 100644 index 00000000..22123d1e --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab @@ -0,0 +1,409 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &633397236186228200 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6024653815829872387} + - component: {fileID: 6995900281859911826} + m_Layer: 0 + m_Name: NestedFixed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6024653815829872387 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633397236186228200} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1793776364590335641} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6995900281859911826 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633397236186228200} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0e2d9f1d69e34b92a96e6cc162770fad, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1352002985630144344 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1630097882623414224} + - component: {fileID: 2950892147035252982} + - component: {fileID: 304181488106869769} + - component: {fileID: 475944055395189127} + m_Layer: 0 + m_Name: Nested + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1630097882623414224 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352002985630144344} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1793776364590335641} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &2950892147035252982 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352002985630144344} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &304181488106869769 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352002985630144344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: + ViewPosition: {x: 0, y: 1.6, z: 0.2} + Animations: 0 + ScaleIPD: 1 + lipSync: 0 + lipSyncJawBone: {fileID: 0} + lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1} + lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1} + VisemeSkinnedMesh: {fileID: 0} + MouthOpenBlendShapeName: Facial_Blends.Jaw_Down + VisemeBlendShapes: [] + unityVersion: + portraitCameraPositionOffset: {x: 0, y: 0, z: 0} + portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} + networkIDs: [] + customExpressions: 0 + expressionsMenu: {fileID: 0} + expressionParameters: {fileID: 0} + enableEyeLook: 0 + customEyeLookSettings: + eyeMovement: + confidence: 0.5 + excitement: 0.5 + leftEye: {fileID: 0} + rightEye: {fileID: 0} + eyesLookingStraight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingUp: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingDown: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingLeft: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingRight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidType: 0 + upperLeftEyelid: {fileID: 0} + upperRightEyelid: {fileID: 0} + lowerLeftEyelid: {fileID: 0} + lowerRightEyelid: {fileID: 0} + eyelidsDefault: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsClosed: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingUp: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingDown: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsSkinnedMesh: {fileID: 0} + eyelidsBlendshapes: + customizeAnimationLayers: 0 + baseAnimationLayers: + - isEnabled: 0 + type: 0 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 4 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 5 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + specialAnimationLayers: + - isEnabled: 0 + type: 6 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 7 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 8 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + AnimationPreset: {fileID: 0} + animationHashSet: [] + autoFootsteps: 1 + autoLocomotion: 1 + collider_head: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_torso: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} +--- !u!114 &475944055395189127 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352002985630144344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3} + m_Name: + m_EditorClassIdentifier: + launchedFromSDKPipeline: 0 + completedSDKPipeline: 0 + blueprintId: + contentType: 0 + assetBundleUnityVersion: + fallbackStatus: 0 +--- !u!1 &1805588812230664739 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1793776364590335641} + - component: {fileID: 9189897604033275492} + m_Layer: 0 + m_Name: FixedObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1793776364590335641 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1805588812230664739} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 6024653815829872387} + m_Father: {fileID: 1630097882623414224} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &9189897604033275492 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1805588812230664739} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0e2d9f1d69e34b92a96e6cc162770fad, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab.meta b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab.meta new file mode 100644 index 00000000..f26af330 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Nested.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: dd4f845656231418fa729c023ec9e3b1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab new file mode 100644 index 00000000..fadbd8df --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab @@ -0,0 +1,365 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6945812502350586737 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7029556924238088139} + - component: {fileID: 496475613106972470} + m_Layer: 0 + m_Name: FixedObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7029556924238088139 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6945812502350586737} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8067499159413706370} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &496475613106972470 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6945812502350586737} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0e2d9f1d69e34b92a96e6cc162770fad, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &7757874029049927178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8067499159413706370} + - component: {fileID: 5879847453762120100} + - component: {fileID: 9030400794333238619} + - component: {fileID: 9218906121517220053} + m_Layer: 0 + m_Name: Simple + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8067499159413706370 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7757874029049927178} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 7029556924238088139} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &5879847453762120100 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7757874029049927178} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &9030400794333238619 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7757874029049927178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: + ViewPosition: {x: 0, y: 1.6, z: 0.2} + Animations: 0 + ScaleIPD: 1 + lipSync: 0 + lipSyncJawBone: {fileID: 0} + lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1} + lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1} + VisemeSkinnedMesh: {fileID: 0} + MouthOpenBlendShapeName: Facial_Blends.Jaw_Down + VisemeBlendShapes: [] + unityVersion: + portraitCameraPositionOffset: {x: 0, y: 0, z: 0} + portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} + networkIDs: [] + customExpressions: 0 + expressionsMenu: {fileID: 0} + expressionParameters: {fileID: 0} + enableEyeLook: 0 + customEyeLookSettings: + eyeMovement: + confidence: 0.5 + excitement: 0.5 + leftEye: {fileID: 0} + rightEye: {fileID: 0} + eyesLookingStraight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingUp: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingDown: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingLeft: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyesLookingRight: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidType: 0 + upperLeftEyelid: {fileID: 0} + upperRightEyelid: {fileID: 0} + lowerLeftEyelid: {fileID: 0} + lowerRightEyelid: {fileID: 0} + eyelidsDefault: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsClosed: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingUp: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsLookingDown: + upper: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + lower: + linked: 1 + left: {x: 0, y: 0, z: 0, w: 0} + right: {x: 0, y: 0, z: 0, w: 0} + eyelidsSkinnedMesh: {fileID: 0} + eyelidsBlendshapes: + customizeAnimationLayers: 0 + baseAnimationLayers: + - isEnabled: 0 + type: 0 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 4 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 5 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + specialAnimationLayers: + - isEnabled: 0 + type: 6 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 7 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + - isEnabled: 0 + type: 8 + animatorController: {fileID: 0} + mask: {fileID: 0} + isDefault: 1 + AnimationPreset: {fileID: 0} + animationHashSet: [] + autoFootsteps: 1 + autoLocomotion: 1 + collider_head: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_torso: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_footL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_handL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleL: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerIndexR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerMiddleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerRingR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + collider_fingerLittleR: + isMirrored: 1 + state: 0 + transform: {fileID: 0} + radius: 0 + height: 0 + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} +--- !u!114 &9218906121517220053 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7757874029049927178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3} + m_Name: + m_EditorClassIdentifier: + launchedFromSDKPipeline: 0 + completedSDKPipeline: 0 + blueprintId: + contentType: 0 + assetBundleUnityVersion: + fallbackStatus: 0 diff --git a/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab.meta b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab.meta new file mode 100644 index 00000000..5e419cf3 --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/Simple.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 80c58abfb3541481fa146cfb8d98ede3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs new file mode 100644 index 00000000..1c54bf1d --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs @@ -0,0 +1,67 @@ +using modular_avatar_tests; +using nadena.dev.modular_avatar.animation; +using nadena.dev.modular_avatar.core.editor; +using NUnit.Framework; +using UnityEngine.Animations; +using VRC.SDK3.Avatars.Components; + +public class WorldFixedObjectTest : TestBase +{ + [Test] + public void SimpleTest() + { + var avatar = CreatePrefab("Simple.prefab"); + var descriptor = avatar.GetComponent(); + + var fixedObject = avatar.transform.Find("FixedObject"); + + // initialize context + var buildContext = new BuildContext(descriptor); + buildContext.PluginBuildContext.ActivateExtensionContext(); + + new WorldFixedObjectProcessor(descriptor).Process(buildContext); + + var fixedRoot = avatar.transform.Find("(MA WorldFixedRoot)"); + var movedFixedObject = avatar.transform.Find("(MA WorldFixedRoot)/FixedObject"); + + // fixed root is created + Assert.That(fixedRoot, Is.Not.Null); + Assert.That(fixedRoot.GetComponent(), Is.Not.Null); + + // objects are moved to fixed root + Assert.That(movedFixedObject, Is.Not.Null); + Assert.That(movedFixedObject, Is.EqualTo(fixedObject)); + } + + [Test] + public void NestedTest() + { + var avatar = CreatePrefab("Nested.prefab"); + var descriptor = avatar.GetComponent(); + + var fixedObject = avatar.transform.Find("FixedObject"); + var nestedFixed = avatar.transform.Find("FixedObject/NestedFixed"); + + // initialize context + var buildContext = new BuildContext(descriptor); + buildContext.PluginBuildContext.ActivateExtensionContext(); + + new WorldFixedObjectProcessor(descriptor).Process(buildContext); + + var fixedRoot = avatar.transform.Find("(MA WorldFixedRoot)"); + var movedFixedObject = avatar.transform.Find("(MA WorldFixedRoot)/FixedObject"); + var nestedFixedObject = avatar.transform.Find("(MA WorldFixedRoot)/NestedFixed"); + + // fixed root is created + Assert.That(fixedRoot, Is.Not.Null); + Assert.That(fixedRoot.GetComponent(), Is.Not.Null); + + // objects are moved to fixed root + Assert.That(movedFixedObject, Is.Not.Null); + Assert.That(movedFixedObject, Is.EqualTo(fixedObject)); + + // objects are moved to fixed root + Assert.That(nestedFixedObject, Is.Not.Null); + Assert.That(nestedFixedObject, Is.EqualTo(nestedFixed)); + } +} diff --git a/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs.meta b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs.meta new file mode 100644 index 00000000..2daa9a5e --- /dev/null +++ b/Assets/_ModularAvatar/EditModeTests/WorldFixedObjectTest/WorldFixedObjectTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dd65b27d8f9d40b0a33a36f4c5f125db +timeCreated: 1691932797 \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Assets.meta b/Packages/nadena.dev.modular-avatar/Assets.meta new file mode 100644 index 00000000..f3ba2ded --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Assets.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 45facc2394ac4e6d9c6a8427227dc931 +timeCreated: 1691906506 \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab b/Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab new file mode 100644 index 00000000..17457c6e --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab @@ -0,0 +1,32 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &4316036803263603590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8830680306940261232} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8830680306940261232 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4316036803263603590} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab.meta b/Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab.meta new file mode 100644 index 00000000..477f8162 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Assets/FixedPrefab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 78828bfbcb4cb4ce3b00de044eb2d927 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs b/Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs new file mode 100644 index 00000000..0fbad44e --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using nadena.dev.modular_avatar.animation; +using UnityEditor; +using UnityEngine; +using VRC.SDK3.Avatars.Components; +using Object = UnityEngine.Object; + +namespace nadena.dev.modular_avatar.core.editor +{ + /// + /// The class to retarget m_IsActive animation to moved multiple objects + /// + internal class ActiveAnimationRetargeter + { + private readonly BuildContext _context; + private readonly BoneDatabase _boneDatabase; + private readonly TrackObjectRenamesContext _pathMappings; + private readonly List _intermediateObjs = new List(); + + /// + /// Tracks an object whose Active state is animated, and which leads up to this Merge Animator component. + /// We use this tracking data to create proxy objects within the main armature, which track the same active + /// state. + /// + struct IntermediateObj + { + /// + /// The path of original object + /// + public string OriginalPath; + + /// + /// Name of the intermediate object. Used to name proxy objects. + /// + public string Name; + + /// + /// Whether this object is initially active. + /// + public bool InitiallyActive; + + /// + /// List of created Intermediate Objects + /// + public List Created; + } + + public ActiveAnimationRetargeter( + BuildContext context, + BoneDatabase boneDatabase, + Transform root + ) + { + _context = context; + _boneDatabase = boneDatabase; + _pathMappings = context.PluginBuildContext.Extension(); + + while (root != null && root.GetComponent() == null) + { + var originalPath = RuntimeUtil.AvatarRootPath(root.gameObject); + System.Diagnostics.Debug.Assert(originalPath != null); + + if (context.AnimationDatabase.ClipsForPath(originalPath).Any(clip => + GetActiveBinding(clip.CurrentClip as AnimationClip, originalPath) != null + )) + { + _intermediateObjs.Add(new IntermediateObj + { + OriginalPath = originalPath, + Name = $"{root.gameObject.name}${Guid.NewGuid()}", + InitiallyActive = root.gameObject.activeSelf, + Created = new List(), + }); + } + + root = root.parent; + } + + // currently _intermediateObjs is in child -> parent order. + // we want parent -> child order so reverse entire list + _intermediateObjs.Reverse(); + } + + public IEnumerable AddedGameObjects => _intermediateObjs.SelectMany(x => x.Created); + + public GameObject CreateIntermediateObjects(GameObject sourceBone) + { + for (var i = 0; i < _intermediateObjs.Count; i++) + { + var intermediate = _intermediateObjs[i]; + var preexisting = sourceBone.transform.Find(intermediate.Name); + if (preexisting != null) + { + sourceBone = preexisting.gameObject; + continue; + } + + var switchObj = new GameObject(intermediate.Name); + switchObj.transform.SetParent(sourceBone.transform, false); + switchObj.transform.localPosition = Vector3.zero; + switchObj.transform.localRotation = Quaternion.identity; + switchObj.transform.localScale = Vector3.one; + switchObj.SetActive(intermediate.InitiallyActive); + + if (i == 0) + { + // This new leaf can break parent bone physbones. Add a PB Blocker + // to prevent this becoming an issue. + switchObj.GetOrAddComponent(); + } + + intermediate.Created.Add(switchObj); + + sourceBone = switchObj; + + // Ensure mesh retargeting looks through this + _boneDatabase.AddMergedBone(sourceBone.transform); + _boneDatabase.RetainMergedBone(sourceBone.transform); + _pathMappings.MarkTransformLookthrough(sourceBone); + } + + return sourceBone; + } + + public void FixupAnimations() + { + foreach (var intermediate in _intermediateObjs) + { + var path = intermediate.OriginalPath; + + foreach (var holder in _context.AnimationDatabase.ClipsForPath(path)) + { + if (!Util.IsTemporaryAsset(holder.CurrentClip)) + { + holder.CurrentClip = Object.Instantiate(holder.CurrentClip); + } + + var clip = holder.CurrentClip as AnimationClip; + if (clip == null) continue; + + var curve = GetActiveBinding(clip, path); + if (curve != null) + { + foreach (var mapping in intermediate.Created) + { + clip.SetCurve(_pathMappings.GetObjectIdentifier(mapping), typeof(GameObject), "m_IsActive", + curve); + } + } + } + } + } + + private AnimationCurve GetActiveBinding(AnimationClip clip, string path) + { + return AnimationUtility.GetEditorCurve(clip, + EditorCurveBinding.FloatCurve(path, typeof(GameObject), "m_IsActive")); + } + } +} \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs.meta b/Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs.meta new file mode 100644 index 00000000..11dae49b --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/ActiveAnimationRetargeter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7ebce0ceba4d48c48992702b5c446936 +timeCreated: 1691915242 \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/BuildContext.cs b/Packages/nadena.dev.modular-avatar/Editor/BuildContext.cs index d6e82f63..57908f9d 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/BuildContext.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/BuildContext.cs @@ -21,7 +21,10 @@ namespace nadena.dev.modular_avatar.core.editor internal readonly Dictionary ClonedMenus = new Dictionary(); - + + public static implicit operator BuildContext(ndmf.BuildContext ctx) => + ctx.Extension().BuildContext; + /// /// This dictionary overrides the _original contents_ of ModularAvatarMenuInstallers. Notably, this does not /// replace the source menu for the purposes of identifying any other MAMIs that might install to the same diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs b/Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs new file mode 100644 index 00000000..4b3d64dd --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs @@ -0,0 +1,22 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace nadena.dev.modular_avatar.core.editor +{ + [CustomEditor(typeof(ModularAvatarWorldFixedObject))] + internal class WorldFixedObjectEditor : MAEditorBase + { + protected override void OnInnerInspectorGUI() + { +#if UNITY_ANDROID + EditorGUILayout.HelpBox(Localization.S("worldfixed.quest"), MessageType.Warning); + +#else + EditorGUILayout.HelpBox(Localization.S("worldfixed.normal"), MessageType.Info); +#endif + + Localization.ShowLanguageUI(); + } + } +} \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs.meta b/Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs.meta new file mode 100644 index 00000000..012f00db --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/WorldFixedObjectEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 649616c47b7842a6963efa48a0cace44 +timeCreated: 1691907086 \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json b/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json index a9fa0b84..85ccb2a1 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json +++ b/Packages/nadena.dev.modular-avatar/Editor/Localization/en.json @@ -51,6 +51,8 @@ "merge_animator.path_mode.tooltip": "How to interpret paths in animations. Using relative mode lets you record animations from an animator on this object.", "merge_animator.match_avatar_write_defaults": "Match Avatar Write Defaults", "merge_animator.match_avatar_write_defaults.tooltip": "Match the write defaults setting used on the avatar's animator. If the avatar's write defaults settings are inconsistent, the settings on the animator will be left alone.", + "worldfixed.quest": "This component is not compatible with the standalone Oculus Quest and will have no effect.", + "worldfixed.normal": "This object will be fixed to world unless you fixed to avatar with constraint.", "fpvisible.normal": "This object will be visible in your first person view.", "fpvisible.NotUnderHead": "This component has no effect when not placed under the head bone.", "fpvisible.quest": "This component is not compatible with the standalone Oculus Quest and will have no effect.", diff --git a/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json b/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json index 3282beb1..55898077 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json +++ b/Packages/nadena.dev.modular-avatar/Editor/Localization/ja.json @@ -50,6 +50,8 @@ "merge_animator.path_mode.tooltip": "アニメーション内のパスを解釈するモード。相対的にすると、このオブジェクトについているアニメーターでアニメーション編集できます", "merge_animator.match_avatar_write_defaults": "アバターのWrite Defaults設定に合わせる", "merge_animator.match_avatar_write_defaults.tooltip": "アバターの該当アニメーターのWrite Defaults設定に合わせます。アバター側の設定が矛盾する場合は、統合されるアニメーターのWD値がそのまま採用されます。", + "worldfixed.quest": "このコンポーネントはクエスト単体非対応のため無効となっています。", + "worldfixed.normal": "このオブジェクトはConstraint等でアバターに追従させない限りワールドに固定されます。", "fpvisible.normal": "このオブジェクトは一人視点で表示されます。", "fpvisible.quest": "このコンポーネントはクエスト単体非対応のため無効化となっています。", "fpvisible.NotUnderHead": "このコンポーネントはヘッドボーン外では効果がありません。", diff --git a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs index 663de664..6352f77a 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs @@ -31,7 +31,6 @@ using UnityEditor; using UnityEngine; using UnityEngine.Animations; using VRC.Dynamics; -using VRC.SDK3.Avatars.Components; using VRC.SDK3.Dynamics.PhysBone.Components; using Object = UnityEngine.Object; @@ -222,122 +221,20 @@ namespace nadena.dev.modular_avatar.core.editor return hasComponents; } - /// - /// Tracks an object whose Active state is animated, and which leads up to this Merge Animator component. - /// We use this tracking data to create proxy objects within the main armature, which track the same active - /// state. - /// - struct IntermediateObj - { - /// - /// Name of the intermediate object. Used to name proxy objects. - /// - public string name; - - /// - /// The original path of this intermediate object. - /// - public string originPath; - - /// - /// Whether this object is initially active. - /// - public bool active; - } - - private List intermediateObjects = new List(); - - private Dictionary> - activationPathMappings = new Dictionary>(); + private ActiveAnimationRetargeter _activeRetargeter; private void MergeArmature(ModularAvatarMergeArmature mergeArmature, GameObject mergeTargetObject) { // TODO: error reporting? if (mergeTargetObject == null) return; - GatherActiveStatePaths(mergeArmature.transform); + _activeRetargeter = new ActiveAnimationRetargeter(context, BoneDatabase, mergeArmature.transform); RecursiveMerge(mergeArmature, mergeArmature.gameObject, mergeTargetObject, true); - FixupAnimations(); - } + _activeRetargeter.FixupAnimations(); - private AnimationCurve GetActiveBinding(AnimationClip clip, string path) - { - return AnimationUtility.GetEditorCurve(clip, - EditorCurveBinding.FloatCurve(path, typeof(GameObject), "m_IsActive")); - } - - private void FixupAnimations() - { - foreach (var kvp in activationPathMappings) - { - var path = kvp.Key; - var mappings = kvp.Value; - - foreach (var holder in context.AnimationDatabase.ClipsForPath(path)) - { - if (!Util.IsTemporaryAsset(holder.CurrentClip)) - { - holder.CurrentClip = Object.Instantiate(holder.CurrentClip); - } - - var clip = holder.CurrentClip as AnimationClip; - if (clip == null) continue; - - var curve = GetActiveBinding(clip, path); - if (curve != null) - { - foreach (var mapping in mappings) - { - clip.SetCurve(PathMappings.GetObjectIdentifier(mapping), typeof(GameObject), "m_IsActive", - curve); - } - } - } - } - } - - private void GatherActiveStatePaths(Transform root) - { - intermediateObjects.Clear(); - activationPathMappings.Clear(); - - List rootPath = new List(); - - while (root != null && root.GetComponent() == null) - { - rootPath.Insert(0, new IntermediateObj() - { - name = root.name, - originPath = RuntimeUtil.AvatarRootPath(root.gameObject), - active = root.gameObject.activeSelf - }); - root = root.parent; - } - - var prefix = ""; - - for (int i = 1; i <= rootPath.Count; i++) - { - var srcPrefix = string.Join("/", rootPath.Take(i).Select(p => p.name)); - if (context.AnimationDatabase.ClipsForPath(srcPrefix).Any(clip => - GetActiveBinding(clip.CurrentClip as AnimationClip, srcPrefix) != null - )) - { - var intermediate = rootPath[i - 1].name + "$" + Guid.NewGuid().ToString(); - var originPath = rootPath[i - 1].originPath; - intermediateObjects.Add(new IntermediateObj() - { - name = intermediate, - originPath = originPath, - active = rootPath[i - 1].active - }); - if (prefix.Length > 0) prefix += "/"; - prefix += intermediate; - activationPathMappings[originPath] = new List(); - } - } + thisPassAdded.UnionWith(_activeRetargeter.AddedGameObjects.Select(x => x.transform)); } /** @@ -366,49 +263,7 @@ namespace nadena.dev.modular_avatar.core.editor GameObject mergedSrcBone = newParent; if (retain) - { - mergedSrcBone = newParent; - var switchPath = ""; - foreach (var intermediate in intermediateObjects) - { - var preexisting = mergedSrcBone.transform.Find(intermediate.name); - if (preexisting != null) - { - mergedSrcBone = preexisting.gameObject; - continue; - } - - var switchObj = new GameObject(intermediate.name); - switchObj.transform.SetParent(mergedSrcBone.transform, false); - switchObj.transform.localPosition = Vector3.zero; - switchObj.transform.localRotation = Quaternion.identity; - switchObj.transform.localScale = Vector3.one; - switchObj.SetActive(intermediate.active); - - if (switchPath.Length > 0) - { - switchPath += "/"; - } - else - { - // This new leaf can break parent bone physbones. Add a PB Blocker - // to prevent this becoming an issue. - switchObj.GetOrAddComponent(); - } - - switchPath += intermediate.name; - - activationPathMappings[intermediate.originPath].Add(switchObj); - - mergedSrcBone = switchObj; - - // Ensure mesh retargeting looks through this - BoneDatabase.AddMergedBone(mergedSrcBone.transform); - BoneDatabase.RetainMergedBone(mergedSrcBone.transform); - PathMappings.MarkTransformLookthrough(mergedSrcBone); - thisPassAdded.Add(mergedSrcBone.transform); - } - } + mergedSrcBone = _activeRetargeter.CreateIntermediateObjects(newParent); var isPrefabInstance = PrefabUtility.IsPartOfPrefabInstance(src.transform); var isPrefabAsset = PrefabUtility.IsPartOfPrefabAsset(src.transform); diff --git a/Packages/nadena.dev.modular-avatar/Editor/PluginDefinition/PluginDefinition.cs b/Packages/nadena.dev.modular-avatar/Editor/PluginDefinition/PluginDefinition.cs index 3be05e17..7d93cccc 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/PluginDefinition/PluginDefinition.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/PluginDefinition/PluginDefinition.cs @@ -41,6 +41,9 @@ namespace nadena.dev.modular_avatar.core.editor.plugin seq.Run(MergeArmaturePluginPass.Instance); seq.Run(BoneProxyPluginPass.Instance); seq.Run(VisibleHeadAccessoryPluginPass.Instance); + seq.Run("World Fixed Object", + ctx => new WorldFixedObjectProcessor(ctx.AvatarDescriptor).Process(ctx) + ); seq.Run(ReplaceObjectPluginPass.Instance); }); seq.Run(BlendshapeSyncAnimationPluginPass.Instance); diff --git a/Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs b/Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs new file mode 100644 index 00000000..fa5a5617 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs @@ -0,0 +1,93 @@ +using System.Linq; +using nadena.dev.modular_avatar.editor.ErrorReporting; +using UnityEditor; +using UnityEngine; +using UnityEngine.Animations; +using VRC.SDK3.Avatars.Components; + +namespace nadena.dev.modular_avatar.core.editor +{ + internal class WorldFixedObjectProcessor + { + private BuildContext _context; + private VRCAvatarDescriptor _avatar; + private Transform _proxy; + + public WorldFixedObjectProcessor(VRCAvatarDescriptor avatar) + { + _avatar = avatar; + } + + public void Process(BuildContext context) + { + _context = context; + foreach (var target in _avatar.GetComponentsInChildren(true) + .OrderByDescending(x => NestCount(x.transform))) + BuildReport.ReportingObject(target, () => Process(target)); + } + + int NestCount(Transform transform) + { + int count = 0; + while (transform.parent != null) transform = transform.parent; + return count; + } + + void Process(ModularAvatarWorldFixedObject target) + { + var retargeter = new ActiveAnimationRetargeter( + _context, + new BoneDatabase(), + target.transform + ); + + var proxy = CreateProxy(); + + var parent = retargeter.CreateIntermediateObjects(proxy.gameObject); + + var xform = target.transform; + + var pscale = proxy.lossyScale; + var oscale = xform.lossyScale; + xform.localScale = new Vector3(oscale.x / pscale.x, oscale.y / pscale.y, oscale.z / pscale.z); + + target.transform.SetParent(parent.transform, true); + + retargeter.FixupAnimations(); + + Object.DestroyImmediate(target); + } + + private Transform CreateProxy() + { + if (_proxy != null) return _proxy; + + // 78828bfbcb4cb4ce3b00de044eb2d927: Assets/FixedPrefab.prefab + var fixedGameObject = AssetDatabase.LoadAssetAtPath( + AssetDatabase.GUIDToAssetPath("78828bfbcb4cb4ce3b00de044eb2d927")); + + var avatarRoot = _avatar.transform; + GameObject obj = new GameObject("(MA WorldFixedRoot)"); + + obj.transform.SetParent(avatarRoot, false); + obj.transform.localPosition = Vector3.zero; + obj.transform.localRotation = Quaternion.identity; + obj.transform.localScale = Vector3.one; + + var constraint = obj.AddComponent(); + constraint.AddSource(new ConstraintSource() + { + weight = 1.0f, + sourceTransform = fixedGameObject.transform, + }); + constraint.constraintActive = true; + constraint.locked = true; + constraint.rotationOffsets = new[] {Vector3.zero}; + constraint.translationOffsets = new[] {Vector3.zero}; + + _proxy = obj.transform; + + return obj.transform; + } + } +} \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs.meta b/Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs.meta new file mode 100644 index 00000000..0cc5bba9 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Editor/WorldFixedObjectProcessor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 050f048a6b6a4714818573e27d1c19ac +timeCreated: 1691905335 \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs new file mode 100644 index 00000000..a42e9c30 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs @@ -0,0 +1,11 @@ +using UnityEngine; + +namespace nadena.dev.modular_avatar.core +{ + [AddComponentMenu("Modular Avatar/MA World Fixed Object")] + [DisallowMultipleComponent] + public class ModularAvatarWorldFixedObject : AvatarTagComponent + { + // no configuration needed + } +} \ No newline at end of file diff --git a/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs.meta b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs.meta new file mode 100644 index 00000000..9a468132 --- /dev/null +++ b/Packages/nadena.dev.modular-avatar/Runtime/ModularAvatarWorldFixedObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e2d9f1d69e34b92a96e6cc162770fad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: a8edd5bd1a0a64a40aa99cc09fb5f198, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/docs/reference/world-fixed-object.md b/docs/docs/reference/world-fixed-object.md new file mode 100644 index 00000000..7c871996 --- /dev/null +++ b/docs/docs/reference/world-fixed-object.md @@ -0,0 +1,21 @@ +# World Fixed Object + +![World Fixed Object component](world-fixed-object.png) + +This component can be used to make a GameObject stay in place relative to the world, even when the avatar moves. + +## When should I use it? + +When you want to have a prop or object stay in place when your avatar moves. + +## Setting up World Fixed Object + +Attach a `World Fixed Object` component to a GameObject. There are no configuration options to set. + +The component will automatically generate a world-origin fixed GameObject at the avatar root and move your GameObject +to its child. You can control the position of GameObjects within a World Fixed Object using e.g. Parent Constraints. + +Only one constraint will be generated, even if multiple World Fixed Object components are used. +As such, the performance impact of this component is the same whether you use one or dozens. + +Due to technical limitations on the Quest, this component has no effect when building for Quest standalone. \ No newline at end of file diff --git a/docs/docs/reference/world-fixed-object.png b/docs/docs/reference/world-fixed-object.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ed6711c6dbbbfc79391645b800957d7bf49fef GIT binary patch literal 56031 zcmb?@byyrt@^FxZ#e%!-!s1Q{65J)YyK8U@uE7&vSs=It2<`-z;4XpS7GQw{cb9K@ z@7}xn-TnLR^UU_lbXQAtb#+-!l!}rJCK@T)vuDpR>Fn&b4>JZj#;OsCxp?5QMkl;vW23hCfqQ88vu?-NU@WfNJNcGv z0$+{f72-2AsYM0lPalVwOU;f*K<*R!VfpU}-!cthNF9~O^f!flKlg!L`s{an41e3V zVGo=9w70rj%&TVAu&c0r)-yc?H+v< z-S~F6RCgW4j8T1i*TaCLzOItw>TJJhy^Gv7r35QM1!#uDB`u4W^7Z~MTlwb+qkV`e z3LQ@l4OY4l?Vu?KgeFTIhtv!bX^ElQdz}?{IDYx*mB|^g4drRuH~L?aC~tiIoJ>;M zPY?|>Qr?w_=o4fFeWOeka%4tgMX9*0M@G&Q{kGnGXgOO>sru;qYv~%9M$Vjdp6}{C z9O2QHI&xNuiqDwf_kd@}2&B)R!|xE_moNg^zwV_G7@i^h^&aurvk2Q~$p0*(1W%uS z5cu^3^N$n>8vYCg{)7v^ymAo#E{z1tLHhe1fe)VdOiW!uP7a=`o4Zx&e8uMEYR%5c&(F`!!NtzS#R@OM>gMg}ZtBJA z=tlF8O8%}#($dY`)z;bF*2xk0RIjO-lZU$yHT6?N|N8x-pO#*>|8B|A?VrPf50L#S zhn^|G|rm9%w$;|$)0@GDL(!N1D?PtLzv{0~T-e?#(daQr9a zf8_i(q^6sttAvvSyh(TAe^1vxf&Vk}pMZkwPb2>iO#B1Qf4zm{Sr|=_{a}8^47+8B;#Q7Xf zzAMnweO)?icu;TPf-v>zPbZIwETAVm6eE8~a^}gn)0~LlX_M>U9 z>#fHr7drw27j$H9zFH1{p82XswmVyy{mpLnKsMrZgW~_~>^WAmZ&cft-6 zyzIxy?pfX{tNmZE?B@%NMeHj($Ngq+*nBst&gZp6g+H?!8@aE?d$UCXXcIC+EvPpR z|8I?H0*L({F9#CA2=h$^E51JxIm#G`{0Hsl!ivY4Ikn;#JL++q9-DH;t1BwTfS_`{ zZ#6UJ`b6#u=AH{Jo|XHH4eXFON+BQa3+L6<|3W9ZawrDgxw)^UQsf1vXTxiM0|8qb6F_Llms zj2@?McEcEcDzx?wk%&aP zMPuTfovSwAjaaHO{QxJS(g*)sbU~GHOftgv^i7YO$;M+oHkOtJ#}TlW3Uwv^-e%83 z%8NXcXINj=-abCu@8>5dp%r$j_aRlQtmTrn8KM)iR85y^^Lp8AZD$+?Ew^|sGFP_Z zz9-=@3A*23eJKCtusE|4aO-e8s2l)2oG@=LXKb`c=eV3LQq3!KT5ZoA=!O$TcO2p6 zPQAlo4TYJU-~3|?FWNBP#}5?BeEs~lrGKrGQA~uaH32 zasTk~;SiISJ3D7C@VwMmaWTvVh};Cb*{y7lOQ4%}TB$aV@W0z6aAu=t0zNYVedNl^PUGt5aWDe=WEB zjcI=00VjZ+(tzcF+kGDYo3pxZu1nJmk%tWtJqHJeg@8nkhr+;{!W)nIi{e$Cp0JIu zAou-+>Gq>Ab{#3HFrk~@d25xC9QYnZG$5cv#7oT2S+bI+iWtfh>;cCgxuIEil&`~r zxal)0+b;B4PKKC~kmE!i8imd#B(8rQIsC=Q$=#4E8rP${2T*VjLosnIgAgz)2fVj4 zttExP&v8Rsiuq;TsDUzzNUo9~olsj7p`MZ@{IwULm2%LoZ+-PtWVaX;qATA3fiu%6 zBWg}>p~boREl5*E3MC}Y4@Pq_KOVr7u|AdkP)92#Ta7v}S@3q>clFk2Yx8G^jNHas zaV%&)j0PCme|K*D=;3-s0fTa3TnDs@tt}}!etS8zr1>H zxX>(c*g9q8yZ^1ugUG-+*#9h#3Uha+!qD#Vg#8g(-=^UdON-FieY`>S$hTdfsu`nF zmv3Uo^qwjmcGaun$b=A#FCm_HY_UC-xz=xUu+-GYrIk8D#Trm`(6p_>uoaIB@wy*H zu%-tdPaSE)H+w!xY~UVRo{buSmi`MUz4h__u;JCX;425b8!^VN>J*|=JJ~OVGzmfA zIP-v!Q=6e5BMAJ|Sb!W8Rl3An#t@G;>c@=k8TMdMd0NtocMKSIZ!0@>Po-;O3(lkKgTfJlHL)={T$AL%A%6@LM)w1)!xY#dYi9_i)4~)(f=<8{nl)w)@{= zAB5pznU3LKe3U`~hC^&4Nmm%YQ>*%q(oBDSC3IxRJF+A$bzx%BpgRXepF_uWv@Y#n`| zx&y*6EVFn|+aDh;JDffevA=BDqy~m^9g{$b5D!xMdfhC#`5oW3^E_vd-EQ=HT(=xM zL$1NPWW2m=SvhBGfkEHuSdI(dmI)pA;Fr@8^~B{M zRD-W#@*T5+iDSHCO>H~QXY{A66qE+A0SFOf7-vs3QGtL%%&79+Puy>&C$j4@UfiMWB3MIRT zvn*Kw|7sy1#!I=Y`@_KO_mnF+ckyp=5^@p*VAMdrW4Zk3X#N?iMBy$YY*_?Y4rj>Z zjnm_W(|H6WE(A&x7BL)&LlaViB`g@K(mKE&)e~$7(h|{Ye}qrqE(bbb@Q=2!zXwp+ zKnCAc9>@YS?m3?O3?>{GJpI%LA5}0c=ME&u0HPhduh|UxL@Bf&d=!ioI#KAH^U!^R zpfzjgxs0FNL+-UseXnFfp?B&3Cz{RU{PIKuca-+_qIkhqs zIc3tdx1m0pXv54rY$F?wciE5Xhu=13n2p7P#seQtc}%-PoiY9DMINumyItuJf_wZ< z60+;2lmyBjnrADGsk%~YXp5}7n;t}2xe3@~X+U@<**&SZL}tf3rIj%;JAbS}fmsZ!*YrrYjv!uHuLF3i$%;^?Ibu?}55aq{2QA6)L{ z8uEuriC7PunUE=|e&pNN8&CSi;X!(fOL)QW| zN^aJPI&`uj!^f%OfceV6`(2;m_iFLTRFnY}0`JR2%CHebCZm(lr9{*}v*_XqK3A<~ z{e}Ye7Lxmdd>s_ZArnc#*XLW1J6?}%Am{!e5?p}a2u^Zb53Rjtpxu5}9P|0r0RdB} zDYskzJ5Uu8b45ZMXMNp%dw`x52D>rft5sG%W`gknxRG&jGkd7{8yfeJ!PIM&aNJH9 zV1EZD@9L&!(5zUu&Je2(X!oTgGERL}L?7QCIhQ&0ccTFk$M(mN5dndZoIB|S-(isw zRVn!Ls78?dUcOa}Yf%4fd>wduQDm{+;?I&rLCHvoR#R8iBy`Rr1gy$Wh@7u-fO{IPFaX_~g{ z6Df@spvWf}++7&ia5tIUjz1%Echvo&DdzfBqX|88099^RH@)z2RFy)M=FqUz+KQ!8 z{4dF2!CY;IT%E&>dy2{^^Mq(HmS9&>)q_Oq6}9>WR@mz%W3}pjvJYHTa_F!>aB@PE z7cPj9t20-4fPBTqru?1?vNNsv@aQ7aduUeSUBj$ZC@b2;_VC92H+G-Zg8}_^=K|$( zX2HfjUxFpn(@x*s^R~;jLrn83kppKaAYN@voWZorMTz8(!l47rvxIb~o) z9QJqEC4*VNfA}}dL$dA2g1jd7qh@foqTAY%Mk`m`hH%$Lr{|~JWDaJ)8{9#-Kq78) zZDhhN3Y@D3zZ$oRZ2tHUf$=#4hPckyDeAaEE7fnlyZ5++1jE1R<2D-54$rF-w=}|u zGQ*aZbtZ}F5&G7P+z81Ezj%qJ;8&0TtY??hsxZ)1+4F3#h9ZM&wPm=fmvD162ahM2 ztSq_NSa=X}Lz$vQH7cN|CQY2M5BD3R*hz0@2$d>F1)r#?2&#(afy+Bbl6PYX11>siapV+hGMv@oEkuTPdFWttsn$W(2p%15F>?1@?m9%k7h_mmyucT2q${#+abX5@Fehzn(*LA5@0bvI7;(a-pA>RG1N#=5*DcUuG&qG6+B#b}~UMOBU^qZ9rJC!@j zO@qG7O;|%*6*|JavaH#f#m;hC>KmPCoHnxScXRApn6#*XEUH$)r9e43D5`i}`}L^P zjMJEh2sc3`%ta2%P!P15sw16#I09E2Ht6Vq=dxEJaEx<%B41IA$%t}Xm_Hz@^nM@jbvMzdBS|Rq?9z=O!dEga?gmr%5Rn`C+_nzPX19$kgy+_~A*q_t9G) z$~~PbMLalB0r@Pt?|J0J)5L{SEUHlf#-HYXWA!3e0zM<*%R`I#sn7^1gTn!`3NNg) zQqd@f0=W=~!!UZwIH4MKKm>>`DY`heQQ*BtULk7N2b5tHL|YJy{`1nP#*6s~gLs|M znB$sw3zlous5}gg%^){M=%>^~gImr**>}JXUIkpwlNl^y;^CY|xWjK0{m(si(ze0r zC%5(X?={(f_Q4sL;!wsVi65EhASvB(e4kkC`cO!ajAe=1+DWmp{}98gNQ=|CP)w3X zu?(+z(9&DTHW*=0bBqMb5=;SMmes_V9SU<(KbEJIk?rgXLw{94eW`yL1ncW-fNMdb zr{X!e*eukF2P(&e0i|9KTQtlvuaHam!}K<9B;(!#v{X?6L}6yQ-2`0h(1~YVmC+z| z$L7j_6a~bt@H&pNPuQh(JK7|ReDx{Fp~p2im^1wl%FhWsp_kYBbI8b>ne0s0SPYTi zZ1IfWEU{qo%~KqRLWtOT0pF~bP{s!oBsCj=g5c-b{O4K3o{?SK!k0}|Z@KQG!rwsX zLi^q^eB;EA)Va4%M!5jh(Fqq-dC52tE`Iry)_OMiwtKOtbxRGr!Fl|8Hh`h7y2qhH zZ9uM|i4hqlTWZp47g;%I#8gJpAIjCC+7x?x9L+T%QLYl41MN^@GAME;6ljB%O7vFv zbqP_pCC|nAMsMpt;R2snmh9IFCuAa1`XsTJ7gh@9nZ;!8ch=2ZV4By!iYv-^67|OOHQ_d8IfU z4eKa%-By6K@mD~E3hZ=%&W#?LRSQPwj3z8CrRB_J(%kD%D?-UH_M(mZ=*=|P1k-;nH`OkYS~Zo0F0DA$*w@Oz!0+L$!tTIfDWqaL{p^ z!6LLLr^kBB1+MckxOq`x#|}?R{DLJYSI`&9x#GQK`PD(35T_>d8~Yk(-c{a9Hoj*x zzyNPH(jznjGGY*Bk)m$(n^+wYJ#pR3Sf&Ot49)Z=X}Wlum8`AX0O zUiA4VL~Y3-cHQ>|=qy8_cO$RfKF~F64xzroFd8JMI{+ONqN1&{J@Cm03X<_xQk)jKg|q z$IzPsaOWW5deVMQH~`QOmXlQ-KIXa=1m0MlCmMFD zKNz;B`9b{rrT3FLB^ZSgFdX(EBZAXPDL44}yJER>2_1Hbo_j1Et zt}HBPUiyuda3(ictvmLOY8K}<&wjOC2qvt8$t>?GunSkMgZ)%FKjyntb?(G%@0FBR zpiL=;@AO{NSCZ{9{z=A|{^G};8_Ce?MGP1=_dRL;7=?cNMQ#S(clR13}Zo7zhO+8j`Y(7hn5HvxzX5%SN zF9TimKt`fy`c?pi!i6T5>M3wCb&osV2V)jSZb_yXdwU}Xyu({4tw4cHrEI--Qgo1W zMG^iZT*e=Gzw=@i{yfp}i`n>E{{C9EPL5B>2i?_M6#CiagbP}Ic#cGAAj_n?M5Gg! zAaA?%ka`%U3?>m`)M)#@3&n4J!6_zGF}}5IqW`rklHhqSelH$Z40Kd@;Qn%z%EzNB zqxEw>^J7)`V=N z6;a_;;+inE7_L}PjLi(cPbm{wJ(U`bJ>$r(IKIYJFAFH_@Oq-XgZ+Clc0=lFgyf+? zCOW38+D6{AiH)?TnJ9co^VqG9kmP(6zS;W;xTJb$+(nk)FUpWaUKw%7f%)|dxO>E_ z-kIDB#%zEccm8ApaYl}Pj@ZOxU<&w1X~N`v;y0W)IE2)D<;_hyg@h|aBjffGGZX!T z{>XjIt(wUT{~~-fF2pVibDE0Yk3>Ws2dT&wXCI8K*~li7l$BEcFy@jUj_d}erM--Ndw5T`yD&^Puw^;SGZwZ?ovaqIm`LY;Jt@7dO-8u(S*XakiN=}@=y zb53s-&5ffn(>3W>0t7jqpcE|1FTb0=j*lwxF5_?Ye?a3RJ~pMrdM#cJBxpijm-<$0 z5i85+9JSs5Q9@lDcjpu}G?eMR&KD>Y41_SXa?6P)Eb&6W!J7RpC7v|02mj+G|riPz)4<7BAk)>UB_*D4C*k=H<*XW9K7nLZIYhcftrICo0Ij zH;Zwu`V>M&a>)$hB99|Shcn7gA!t0Zdto>$zeOU!oK0Ss5S=f4t^8M1l(?-HkR)&g z!{={0P%)*GM!msT1w`@Jtm`pNPV0P2uR;?Q zvxS9D>o9%B(xSC1Zh3uXes3nU25$5Kg*1|*vO&9U1m=Mm%FB-jsv@-uOqEDyba3e_~^Xp59aPS*S|(>_~H{W!Yc z<&i7d9?Z0O4NUhc`5rX>Hw%k>7WIcXtOyc@OOZzmu%)eOaFlTrez*o+Z_VN(hVg&-tYuMjjJAABQ=vENEQ`#Sz0vyN-SAIS&R*biY=2B&6s#B|QMa;yq zM*xAWAF782$|WGg8U!hHKe5_aDrCSl^+-IW0H?-B@&w*hztgKGKz8w8itCd#Clo-Q zObMy0DnabZo4g=0!3;AFwk1Vi{BGXG=_LY9a@5gg>b#9-wQbVaK6QbwgkJ+VvhU5T zxtEU4ZuvgvBFF@23O{KD|FG%vA;-SOk|pJ52nxy%GcDJ*!J~SR{=i@f{p{yWH`oaT z^-xTz=RoEzVAYtc5`2;SbnQO|Wh88_-#?99w3kr+3~J8hwl$*i6F483|9^2n6}$lr z!l!yc_2X$1`9D6#*cXWXmVlWb&-%vK{>ItA9G<;0--Up^{Xb>g{|kydnEc7fio(&p z@IN(1#|7a**3EZl-u#!NFIMy=az+sBS)cZQy8vTFk8xy&5&q2AS|5-9`d>gey0H;% z=D#tpvx|K9r3VHW|Er7esrUXc#;H z{~+N1Q$xXf0Q)~eJv`@>?{=HdYeCFk=VN1q%6*Pft;!d59h1IV#c z=cbDbS&0L3_sP7{bZ;xHJeWrp-gEEHtSaPp)mQMArdsC_wwpLK%tqVn`B;Bg*WLzX zh(3)zSlGTp<8N%{@B^zF4C(a+t}sgZ|ESecei-4Y#14{X+15#ooqEu>ULafUg~UZvNZImeJMoTDDEAUBbCY+slQn z+-;r9Onvb=&Eb1rhXXmHbj)mvnc|3Z|A&t9@e|t_tJ#^2U2*?<_{>8H;1j27dYtrc zDo{Z~u0JQXdCNRrCuCm1Q<`P&zq$OoKA@PD@6_DN*K^@lSVH-5Gi`mX8{)G%<2-z?E7b2D1k>7=9SeDWmkcn3`j|Kd^ zVGUG=^Nnkw2Tdjvi@{+Y$1%Ja*Hy>GN$V6=p-l;^lav(PNtsc9cby?=u}F9;>y4*4nJ7DcXnz&}(4R zh~m|Ha|oJ43#%oH_p1l7%MP9q2lcfQ+KXRiqmy2ht1qL)rwY+;MXYJ>1IQ)dtD0Qm z=>F&52>l)v@;#W4)j_>OwcZ_OX+=PgTx>%74y86 zEB`rf!$+6;wX?WLKldr$*F>Q#b*dr|U95$HCS~3JW=+Bpt4#2u=z4Q2p+pj7rQApC zeh{#~Kyy-~iFz=6YvcFeqm{O=HC?9o&Z5z@7}H2#e4(`GFqX~V{(7GGYb(%qT3<5i z5SEOg&KB(}u>(4PE|Zi0S5%E2Jm_ba%xR|5xC5Fsg7RPX_}tMSN10>&>w7PEZIL*=kfoZaZvySqrJr(E8TaH zHCXgarJ!^S%~wxsMP~H}sG)m?yA?o zzd|K}F+qE)=Kip@->it7m-w$qz#xOH=o;PwsCNEB{ri3E*X9)pniUHT$`m}qZbI7d z!-dcC`1FrR;?)ikC5T$3?~6m-Ut@qZh9u=NsB5$pkvy4ATVrMpiQ;VvB|QdY9g^mu z+V*E(h|2b7Fy(a)?RIZtRCQ*M<5LiYo2B#X^Ux2Yk<=lS^TH^6ZyIsV=`|^y?6fTnoaL$ z*E^fFd|%=wu@E1`Ynvzd_?P8~04RPY{dV-NXI6M?k@rE6lA5MoL2h&X6_2PlHFi?- z=8Wm_TOP9uy!vvPFjmTdVEJ1k%QmC-<(m>*t(Nj@GIFcb@Jjer7)%F*F9B4zr26+B z0q-jxA|$Mw$rByNw$0a<;p3uJzm**bcM>s9Cb7r$oxhp>5`BBgF>ra>vlu#^)@i-a zcPwvn_)|hs5~PQ=xWlo{NtO>g$;|YbuTd9Qw~{5 zBGl^rq3gM(=^KX5)&!qG2>y!n{Tn?Bj3y@hMwNAKutma&m{v9mt~ipow;DsgfXzj= zl=H=W4Gz;~sW7NMuwy<=m*-@(#o-~vGZixlMKV|CEArXH4%wvQ@{dJZO4bWzmXRlI zLq7b8lEikA{zXajFA#kf-`BON!7d{$_OMCjW}4z0G`c$`;tedo8rcg?{7D)sYTi`k z3rvrBNzL(gBwRJc3wncgKi(3QFC5OW8k6S8cRZ911q^OjUGz*X1 ze?`qTcG*iLd8{@ryg5(-BzBd(FAv$p?JE6i!gMKWEew7cfOwJN5yh7$)lDo%O*1R7{17 zc{`fB9kADnm9EXVb&qWE@vJ2}nja%VhBOT&W%U|n+nGi`&RWzC9YyyfmdcqHj@p&y zMPkV94013w=d+W$WBUV#6R*#F6r+X@ca2L`wCJCv{~(MMbNT#S%VgqFhCN zw1?KFo;YH>?^sg1|X`DVi@k4wRI6v&|{2}vCIf73bQ0KI|@&bd{gg)D^#$&HY zC8y2T0j>}61U~rbH#lbQ&w;`w3m5#q};(x71R7n$R%E>SgheeCBh&nnH7t3&^2#_goZOxDYTW9KL< zZ_m$GYVbg@Zy(v)=Y+31vGm5XgdE_uje3hgT;C@X@wB$_w$73{v)F%W3}{Cr#%Ge4w?EtBX_GWpM?ZrGb_PY69S=8RD4B77+&Wlo=T9Wc=^w#tRhNKII zuEXW^PGA#xV6;u|S=OrdcV2Ve8%%bEJ>G)U#gHn&q~`VGhaEV%+rrf_xewi|a4kv% zQHQ=^FipFVYT>+L*Ag>zIaxX!H2ogakV zc)gXr507YhX$1K!|BenBoqgb7xn;k8(XrM#+kb|~0UEZl8Hrs);!|HP9z_M@nvfRa zg@xJBIQ7V#W@D~4OmuIUoEJGzV-7Qo*BRzjCT@%6>JF6>AI)T!rHj{oS$Hhupx5;Fc{Wv8RIqd z+cWc~roM%rthETy{dB2#ak5s3*0qg|(n=v**^9ns4Yc?4`Rn7F9{rN-3IvW!1S>zx z&-bKbf45LM0qPu=7v6a6STwBolp4D95=b*>eZ9Nt7pd>33S81E*Gp;|TqO#6X7tH{ z`r_>$J|#~V@jS2aGQVLaNv7rjvI(PHZDPKQlBp{te=J_P&Pvl&E?Tbyq8isUO$PiD z-*dm$luPeeNpafo#oHy3SA;L6GmR!~|wq`K{(*c06g+DJ!E>`H8t zU+z$V445qaY(bR@>AzSz6Q-0*%^YCQZJV^m2R?M2ChRV=edwdx{9?}{FjyvziNQFv zs20i`T>%2u&6Zak*lp`6uT2y?YVv6>^*&j6fg2%7nO^K(DiD^IMoZ4N|rlsiVkPy%}d8U7OC3K0rQ;~g< zRiWd;$d7i-QI?2?^5@mA7#YXmd{2C@u6=>L&~md!Et_F8axc+lgTrEd3D}20!yLYt zLC7}nh{k$&IJJrQYOA-K3!QUl9>=Uvn~yF$9J<_Xd+c3Q)oQ){yqVo>#Wzec9%45q zhTwFtlQVGpi%cBlOs)h|RKwS=bTC8vrIhGlcJ~sKK`d2o?cot>@>ot47; zO@pp;Y}fOoO21yVwzJ8ymV3CX1b`e0DH9Ln=U{W&fk#$fm7()jK>WWa`{8p?^IG1% z-(=)gO`*SLTZ)6{VrA2xh9?p*`8{|=UF}^h!lS8k$Bj3pjLpsAnzH>7$-5bPDe}W` z@$`k^7M0w)sQQ-rQ0buCpI1)CEwS~6{DjjmHI)}c1^&qum5#-lT8gN-y5-a7t<@ni zo&prZmqOEhyYNrU!u~*1^N+SP3BU5?P9py22rxH4J`bbn@1$0SuM@RsuQ^#t(-uNs!6mluQBiQ|1n<-hF4QRD z03Vu{wUUYy@R|`CAl8xvtOT#xq=<YAspw#{#}G1W#>=nA2#GbtJGP$5cyNz4WMC zl@K1V>+EWF-qS=wiWiqu@KOT;qo)rzH{!IeFU*UvUpipzbm73hi*l$mgUIpd6sqEB zWJtYHx+Ac#hKx13QqgjS8P4ox%Br8E6V5FokG}+oF-&1HUJVX2ZgI^9iTigx zCz`umeSC1nWXK-bkD|}2N;VGQXUJtJxJG_XRB+k6TTxp(_J$c7=YoDDs>62b>+{Kp z36C$LuL?QM`{tyG3@v7jd>w$m>FMcT2!fV`tw_>6T40T0iWh}5ng*5I# z=@{HWR;aTRi+=sciq9^q@6DgWZdc)ur2V>IeQg7RC|H!_2mR{GLetWph;d}`E^Ttf zQ%HL@;6Yk7+gZM2TchcPxAn!GRi=v_Z_vN}8hqQy9D@%(21Ur&9 zjqD{EMc5o+*&gwQnoU+S)M95xkpnGmJ9&>#Uxw8u;pyMI$tYQ{Ju-6TfRQeh?MyG0 zSEgBtw$a0MVgcK!D`1dXP)xCrNm3k|WW(j@;CKkqCes-F`c>_-(hbVMB3>)yU=$^! zL54D`Mi)!}QHs5UF|DkMp}8i6aB_r&U&FQO%a<-C{!M%Vc+8cyJjtEiAe3J8d>UsD0r+ zsr}22NB^T0SUT}+;2>@CoMo~hA-;+1vyj>K7~YjC-@`WEPyLP8p&Kt=k`qUwn2W_? zS4l9^1(S;-SvBPww!9B!!47$@J3tq69u$N}ocnWw@!co!?ESkzk0r7tBCkwJuU`nh zYhgt8Yh7W3hNK2o!rkGR=*Xz9q1yl_!d(!poRh(a54I?>441G(M)f^wk=xXRSv~(3 zElBgm%mu!z6g`@R4YzwT4m7JRjwde$Ug1h+VX4ol0hAYVZ}oC@y!25=cNl7d3cr0z z!`MP6E6>hrFWg1RbkrBPtmi3Fn^p(qIh>a*R2Y1cvR=+X)1>Ctteg+E4aDH5_|zof zmdbmuY(>pLS7~z;R1#%6+wfrXVUyNYahfGQl?HdzF1xjqTes(`+F*RPO=2t|+4?Hi zG&6|2t1Fp281cy{4peDRrod9Yj+ zypS;0hau)lC)41LIS?FkoV>lFzF1JJ`#}fy5XUZHmRu@_5h;W?L|Weg{->p z;d9Cyco=XkkKtEa9bG$9bB5KkwYhH4g)S*#0IVJ)KH1 zi<5$+;mh0cs#`sQ^{^lZ;nn*zez&jwhrX+|1)7@mhL=dN`~9du(0JGHUz+5{3zZI= z-_;#ZVr~JROU#>D2G|eyded(;bKmS>VL3#wzMhfaMWd#4p;S8~iVJLT(0a{eSAN)V zGSeKoohrzbSD}J?Yqr~R#J}5d6y}V4O`e`)UURmTE){(f1^7dZ!4euV>Zj6|G`le% z<=czYqIj=BnEi#k1++~`s=ev0ICxdq{;(*q>o*A3UfqP6w^s@x`K$Z+#=r}4r4YHj?QX;kPs;U_Sp8Sc;xjk9YWTwU#V_hooj0MY? z&UR(%iF|2U8B9S2tX`;unT5@A3yUzpaf<%sBE}yM>}?F3!O2QsWT=1v3<9n!DL1!6#H=Lt;CrehiW7ZVa#^Fo(PQ@?OVkh*v* z1|ZnNC@vdrEMKvioMDov+cntL zegf$y4z%^^l`a_N4M^8V?XHxorD#%&q76%lV|%|6r}yxd+AF`czgkb;9ll$~tWdRG zIo}RsJ72aA^a&jC9SUdl>1?iW$gqy;Cd18=0mIneoWH3xB_dxiM7==T7JS#1+~#eQ z`Q%~}HG*qIu&{pKH;AL?2;yZ>u<1>Kv6ev%iwozf`D0chu9A%;J|oKhYV+*-$%)d( zD-8<2_2j4|tH542&+OZLOqBs#Q+b&(*`8CvHIGt24{p-v67SZIhP`*IQlAn1bBSC^ zu|~Ex3^WKxhGautN6_CMr)eg+t92`(2N$7EKRT<;o&N!04!VPTNA|}uQNU#+wpvvwf{BnDoX=u01lZj({ccr1rFd!1dSosU0!L(6-Rz8I0+6Dihn zG0xv;{qdD*%>8_J2N;jO()%5Cve%%_PwOUQXeF(L0tEuwvLE9G>(w>Y4Duz_1WZC$ zX#_F4aNBax=1aWR`e!7(nY;u(vf^K-2t5c{ackyZo8iZ2{g^sHo&LVg6bL`M8hi&= zrv~HVoIH@z2oO2vGgN{MYb3`+9#4xc_WWw`5p2uz_u83AnhFi+OF`~ICn+USRI-39 zWbYTvLqq&3N#^1)57MEGn*tu{4PteT?IpR}b1(5f8A%jek)Qo8Do$bb9vn(sT2Pvq zB}lR!-pG@G-4nEp+bZs%$+KRtSpJFB2+)XOK};oeo?oBO+8FDp~i5LcX&w7 zTX<=hbvS$>9j=sN@*DTu6Oe(Br0B!AKQHhFN0?@wh-xV}@+55+$m>&RkJpU}@I2J+aBhu{JrksneqJlVPA4 z8s;wNBO@8HPwww|*pmSA{7F#*rufmzs!E0((8$iO zjA@dkm4LZ$cJI;OD`c@Ww(6#exn^3R8ZqRBp!}649 z1Z&Nc)#HBp9d{!dd#KO8d&+$zCKl?lkMxlrWA(&$=T2-A0$Da~8=Kyc?T|~_EV2#c zwl`MUK5Z9GTNCzYcU>Hu@5d74jg-CRUOEV#&}KDx_*hj4Z`0BCl;RSOgO9v!L1awb zioBYgfB84Mo+Jf6t@c8i3483E)63RsZ6^F*8Ht-zVfsfGo`#3NI5r3m7j9}!zD1GzsPev6E6J*4 z{7RCki974luKrC;OzO3YY!7{^pEYloeGUUoNSK=FOF*EG1ZpRw2A8zZwEX9JlE^L6 zE^Fz#c0ueeL$>y-b(PGho_&SRDKRV*`C_QEVj$|xn;h=ERw(hO6L=tc05>*Cqy$ec z+N61$kQFS98~jP^&+5}@pxmW*6`W+G^s5(nilQo8jBOtaQ7e_y;L(6`V>C@8{$j<8 zPVfVyTDrQaua;Q771}q&0RV8s_zex!wd~biZA=8w2k1EbR2G#uqopk8)oaZQ&mBi} zX$3V9y8oj_REhX%1K0U6pB^r5o0K@Av0o{P=H6$;YIUQVR6$aMDFn^!cT}xlJFoYH zvN*`pReK&}B|F+*HgDlyh4{y}00cMmileovE$u4h^%>&IVhA|j1s(~Me<2c7XK?}O$#^5`wY#Kim-PLXv8WK&%Nb+P@ekcpQE9$7*hKUB101tg(o$3W{ zTpAH%=*8CZPVh;ZhZa?^fw;MV*}mM_=oweeoN7(t*ut4&ke}osN)K`v&Rc#{)iXfT zS~!{bd9nTWm)Yl<5Fj-sDs9kHh-7FLFzs>kq=cJWseS+HvjKSwqML@IEFEVB>|qlP zex~oQW#k=LLxYa^-KhNGhxIVlwCDS1GvczS6X=y+Zhkxthn1RrcK8Hq-uIW8yTeH? zy6o?zRs8+`*gDIoDBp1FOAkm4-7rI^bR!_$-6@T9mo!6nOLupNgn&v(sC0KrhxB>; ze|g`t*7?XOlP!!eZ5w+a;pPPwgMiqv>HxU zNu|?+q65`$TmL{>f6DjtP9B>{yO_zZx*|a8FTQ}Mch1g-%ACjiS^x26bBhK!s=YBF zPuN%G=0=NNBbvVGMM^U*i+p|A|29x^(YX0sK z-nT#1Pm^0UcD62%px2%ic1;sa&hT@rRXx)xp$pQkc3nLYt>r`=28%Xj#vf=sr(x7c z#SCj<&@@Yw_qov*d7Ao5tRRe6iR`iXp?v1HEb_A|Mf!JtO`jqs@{~qdEz;zgQ2&TKwns z1&7Q`SJ{rZWQ;X8m~PV~-2`htU;LR>fM%A0KFH^Bxn-VSdwNiq$P%TCD@iy}`iL)9 zY@ad-)?UUI2>GD%>}0m?->s87FefLoOeYC=7Ox!%br=-d#7G<2epXI5m3*5KVy!o6 zXuvb5j3aPZ@+e3M=teeVz>bR~BI6XWJGdcYR@8q(W;|rBd$c-?0FU){WhMA-u4!$2 zP%7S)G27ACyQyMil(TkW`FP)7DqLUt$%?w<%4>Q)?jZMP1uEHcW>i83y3%^ z0Z;dd3F40OWn$qCtCvI97U>gl4?=KJvShyBvXS6QwuE**K_Q)pRA}#L$r6Oog)QlG z-PM8Tf81P)0S>wsVFscpv`zt*FK<(sC)#S&j;?x!z-O}p7d7g7Di#4Hd5q*z`zbiF zNL_5V3U^LW^|j~*mF{xd#3~mZy_NZD4g7LV_W@16!TYkk*I~cSN_4rFMl*WNjIMHQ z=y86@`#7*lWFApxlg@pvTw^d0REL_l!(3s}DO8mg47GL_Q}s_@0EtYjADG4% ziI~=a%L)Z(3fr$${?yRem)QGt zs>DyDQra;oNiL1wtZEI~o_K><{fujcn4T67|)sKpZ)=OG8kb zD@{mKP}{FWQ*}tQ$*UaJ2<(%7aNyU|_QaV#hlz<#+ZAUptzYRNu;U1EB`_nq3-PpH zk8bJ8NU{06Q-m=9_dWtPLbwCgG5YZd&e|H7&2%NRuTs4{vkv2rlhHuHmfT>txsfTL zhG@}Jlfg|_V%N+R5|{s6o--$bbN3Gr5FRZ7Tcp{s`6vc~Fnocnse1BhFdRIb4Pr$g zZUaD-T?hL}d`c&D3%YEnUJk@f z^DDU^6RFsXcK_39C$lH#*>!$4!2dcBOVziuB5`O5~wTv(6yd zZ(o4Gb++qD=`9Kz88w3CH@@2RcDJbOsmp2^2QBsjZrWIMC$7S(=5w@4&QGnUKlH8) z4c{A0C;4~aT>bak{crd7fy6N&mD>3SxMBwDg45SLr^NXcC^EV3X*q;=hp3uU~qB^DxNVFDR8%8fZGo)H} zjKeAw7ABpM*RCh^45-R!sPeqV z)ng=78%@Uka(7hCvFew=>qr#GkhDg#i!!D z{exo1F8~;W5bxQ3J2<(LrtoF*p0QJTvGF!y|1&F&I22foQKH#E2=06$I-l2J zqi^(;Idrq18F()3zg~*A0dBvtKVw$Iub%jJ8J53<%Qq&-9ca$0N6vK+29hLywzP^Z zCjZG?h%r5z?{*lWxu}k&gg5%9&Ufs4MUj$F5=;?lQX;>S%!j2TD;bM2MACJpCv@E^ z#O2klHBf-uM7K#GNn<}>6Co}!U=NFSCT5vq_>PZH<*0}F?USVY=A+!JNjz5+q6mu{ zg*TlvZf@Qx^zN==HnN`-sNjP6r()k|KpP!S3QxWYYTiZuJEpJ6!Qtjj{( z%dAZ5!A_9W{Vrc0aq2k$E+ONkPi{X*5D)mO(|4~$%4s26K}N7Q!YqlUGVpIjmw24N zoNo9A39fKx2#ClKc5?xXI;#tJy^K!6Jl{h`gKqD0(lZGu5eKgFFMcu>L z_IH-vtc=|L6G30HmTA%H0FRD|xsI`iC1`MzEa8?RLARUnTTE%*R1E_d%hyv(81!*e z%B75sFl1V&s zUC}AEyLjX>;@+B^yezF3?UZsm7GikuV*EqWw2gIwPt=St%s!Nnn&4-gSY99^<(`J;S?M&bcN$SryOFS!OC#rb^cB%EU zBMPU*A^&hLNH|HX=btQ`@RWUhYK(gXS?{t%sDK2ybOjF7&|4x|+?8|a+b)J63#D#|Dz$g=1*Kpp`(4hc)rRdg6x+duUg6_?IJ>+eFJDi&x?a?iEq zq1(z=<7{C4?!9s%)oun2#Q)(2gM8&5>LK;Y-XgNf*gZPpi?iPwMp%$oIOOBwyZJAo z`H2WH6!Z(-NHxsUA%IX7d)CYV21nxOF=r840i+FSF*Dk(KP#gSGDCT7dXpJFFdmPo zTg4teac^Aw+eHt#9otIowpPdD)504yjj7(l-x3JFEr@Ks7FX6k@Q6@=nYLMpiy!*T z#352E zO4ZvNYNetB>T*`144(yWH9zfTY73pST^(D*&N9L`|3xC@eGxdS>gM|In?Mk_nqFfHcmO)_*W32>D7==_VO7mV+?qjxmU?6pXy~W2%a8zHX&X*J zrSAT(3ECR8VN5pRzY`)K7-vZ+N3R7T(pi+Rd3>-UYy)~Q05!9t8 z30y7Dv^fGqHe`~(T;gX1}W)Ka&M+< ziegC}AK^A;Mj*ba>rSIHG0Yyu=V|nr-Mr*`&rWy$5nLhoZsC_(kXA~DG-f2uj>D4g zk;tu_)?RkrZ_*e(>tbr^D-0>= zx^6IM$RRaZtQl2w`=jMZjdp#)^&`=31`;+j_5BmoQSZJ~wd$s)6^om{$Z)6n;=|F9 zsCMAbJNu1G&nj_n789c@H5JFZPC9R$5@%R1^@U%o>g~01)%)M#1Tzfph?8#32~aP* zIepRP9Tsa7(HMn7t)EA_Y7DZ{6dR~HHtpP>S_uQ79%Rv>0}bDMubKzzgjz#mbE%;2 z1$2J9T={p3KT`v`5i}#Z00>ivhp4tf^xpVQG$A7GRZ9M&#o3Pn_Y83o39*K=loBkC zqAG2UFrVeXm!})RT|`o-yWncSd51RA+P@W?fvN%$pdC@I??OMOpG&k>fyST~g~Ln7E%I9=yi_6(E`Jb;Sgjx>bpbJ+6G zgrRlTwI8Jy30Gq8&NQ96_m#kB0MC=hdB>ptVM-sW)p?H_CLj?nX$D#_q)Tx0_KcLA zA)I?JEsQcFu;Mw&OqDPy#zR1p5kG2jdELFhp)ZZY{V``GTJuMCTNxx;ain=*H8ZS`T3)yX-t5O!>D9uwEpd!)$f`1s#oSH9^fhw_}Z$!sM@lUYJn(C{=(D1$$@uK~x>ef@&vR z>Skwai#awo%p+1L_G6>x)ZYmry^!4JMsBcw{~ZkOX4i}!P{;c%ZXMjuBP1?XpxDk2UR8ugcewGzX1e_f+DHAGN}NwGV2V#wV72rzyE4U#V5C zVZ-SIR4kZ04h3o~24~-FOeO9!8kZ zFzx}9dZAyFuM=n$L;m*Hu*W6SQEABohVbS707cJtTQge)@P z^D3Z=UTLMaFQiO8DFc~6Ttr)xD#X)yJ4|eNTJ`kFKta0+#0)%PVl)F?zB9a}C@!pU z4tJre!OtqQqCVuvECD}#>$31iFK2Zkl9HotExySSE_`>n5UEgfiVR&Xvx=yS<}tK% z6`HGK(8Z3F|K80dS~gYvTcc1%(e)brh_!z7)i*6`CVW_s{h`o+c8+VVFlAbVFbA28 zC8<^mqt0JM)XL5*_9Au%BKNA=jz>GjBYFx#M(*OgzseKp-RKDg`zd>3Y$*5QV&WvE z$YDr%U!7S_6BG9G14S4HF&O76iOKHsJK3?AxH-!0$NymdS?Qo1NFHwg`;Wqxn4esq zrR}=?{PcjL0=i?QDYqW;kvqwE$V~nWMs$5!fyV1`sA>%DXemCRb51u`oU3lUUMBMPS)K7Myd~to| zv{zUgcTMTWLffUR{^QbYIre|rYE;H5hjS>`6uQZ25}i(G=VoKvj|-~EXUa-`kcLOK zUfKuYeE(b->nM^Svpc`Ax`hvou+J6$&U-7snD$Zn8BJ1hHQBd+xJk`NZ+$P^be|`jLp%H0iDmHQ%};!T6)-I&lg zuF_0o)l71<)DkYgLK?MJ}4Of;tKP^9gUKJXdh%O|4v@^f#l5=^3JW72ydJ@?hM5 zfj;^}`qMdoL#hV*AD?T|Rhi^1snnO5rNn(JM&9!lcIvj`NFIr2oC`xGFF;eO_OTao zi}q`u2n@!tj&_?0wLK=R)iE$oP~~R*H8A(o3z`{ED4#Qj!#I=QpzlM#orFTdt=fooQg*$6XMfU$1&jH<`|&( z3B>}@@Jn=Z8?4Etj=@lr0<|iF)v$y8YVtki_Mq4-$q}*Ha-;bWvI@GXZBF)`Wd9{h zCyYrqhpSo9Wtr_V?a(@v*vh^eY)Cjat&64WYS{f&^KTXa&#MSR-q_3=ruWnS0p}V) zh?(Pcx=Jp>4Eh1^YaIYz=3O{H)6y*F+a+yWl0~PGg<}~>h_Q~|YUzi)??=J!ij~LF z?JCu!7+u0--|5@0PywHk41Jj4c`iBz7(XQK0AGo;A<9Yoz}Uxezol18fMSNGV@ws7 zgoG}em{Vku=o)+=^uTdcf3nvJ!`TQUF?WsII06p-Uzm>mSNWeg-(_m{rymKUq0aFn zu3BYvQl_ed1buio^vy-mB%P1LxyRL#%B%Ad*`s&{x{tp4GPRNX}7ehgAHk|eUir{#xQFcn%i4p7>B zaZ|oR$&cf8B9>HCBwm5~j^({hO8vl%L}uiV3QoB%(^w@J$_#7Oof#^3wbz=AKYuJ| z@LTON%X6cNU@3_=sw(@$$&1d~rh27H;C;YTl11sH(7lUc%)wRvYB-Fwkw%6-{OU3? zInJ*k&VQcJGXJg+qyc5pvA*RumZ)cV#wHy`F*Rqn0N5=848LECoQ4UtrXU}|Gvcs3 zD!&Qu%`d4gkd7-}M)z3p2{)RDX;C|NPX<^eR$*a`hIH^suJ1f1F}7#Y5my zepy!iJ!PTILe*g@^7+3dGz1qeuRISSIV!r(>mRTAH~mwq?M8lb)!-!AT8Bbfv9a2l z?-w;(t984EF=^ht8OmFCAdt-EVEtLdyWcMr$!*QQgmGXB_8Fzl*lE?W770)ss*Fl07oyVSVNf=?jffnJhn>9u!O{vEzFpmu zn~O>N0w!N_V-hZpFWOoIdVu>HFZi&AorSjP#^>@)QmtM@QY~5e+04H%!YlYz{4EFK zojOK;W~_sTPL&Fnr-A|X=>VoL_O&`Z|63`~Xy>YW)q2Z%14?4y{P-Sw>7Gb^#>sfi6Kbfx!s&b-75T~+6%FP7Y2V*gfslNm!1`z4+S#C?yD0rz?Qd!P~9+uG?Fq&ZDHQ&XTozi+zaW7cmxjAOD95JK3OrmXo4)FWEFV0!fp1bTc2*34|~`D zknvLx_>H@u@}%gGSD1^`MejOxyO8>iY&gwe7fajzQ#ulpnDW6H%%(jNu415XCDcBR zVYWf;nroW81KR50?Q>I_A_lL=WuBxKtJ{ZFeeCuBteR$z$}C>U1*ROHO-Q2AK)~7J zg90)B{vvtQ&cgpP=iZOgeiQU8@W1Qt2)V*gVXhhCg)b>Djy+n@?fBy@O~c9_tj5JO zS8-6(9v1xjAWpG~h~am`v?FEv)!h#H0tx#0XWP&rei%_fVM; zh`ZgmJt_Bt=~1WaY@vTzYLvJ-&pEE(WFlVS`*^gm3eBNyi#^xjQDf}ru&U(N7@b7E<4{Op;~{}e=&?8S(-MTfEN#!{ANUsA<=&R}Q9F@bW}X7L)z%UBiJ z?|yjlzmy50{}`dyGHF_XUtsFjJotX^N^iS?i%gq5;I2n^AmNJZSs~}d|Ra;qY%rD z)U@V7yS_Hl!yRl~j`kZ8``2<*l>V0be|0F+`u>cf05`>HJ(+@QXp6;rJ$P$Rc_W#K9?)j4cSuZ}0exNF7ZH;h;>|KQ(GJ)p=Y0m7rXtJ*kWrc5&nO(; zVKW_74tB5xu7oq@12)N^j&Xj@k-!nJ+4l7a^D>-`TW#+!-lOyX*C5t0LA@_E=ahkSAzeyRM zlUY5WP8`Rr=_O=IwP_R@j-Bx{_;8Oi$z>XaQP2Oa~4U7g!5rzrN5f_-CJfP>_mQ=0CcJlLElXyD-UU#kX zK<*tzY+^ZFmekkzt?z7QXQjy_+be~gu89{3nQd)I+D4I?<+x1*){UB!>oitJ1wqOQ z{Z>M}Oma6qq`mK5_jM9Id*N575EH8;5s=X<>P4iGYAj}$N2_e) zAB#z1>NY#oIG|}YdG_!`5|T4f%d>0^!DwSeU!)(#eUb4Xg`I`Ml}pg*{Wd4#g%}uP-((>$RnT$HVC-w z(zN|Gs|3r^7WVO3ej0{A7^$USCnetail8?g_EI|tt;({ZP)ju(@rUE&y&aV~Y5>x% zwI(%FHP`)iS+$C%0Xr=lQY)2HRZ1jI2zOTAdfst6?jutD?+X*zHTXX{7?a1681ZV( zWWdp*Pov6Ko?rslI9WhamldRVp1`)51#zbb!6cp2B68eT$K{{N%5&mESCPU@(^zxt zp9qEP`Hv9VdN14!I1Y^}54CGk=X253zQ{97O0QKhLgi9A>{;S;i3yY6V~(uL9{VvDXi3M6_GNQv?jYC9lJ14^?!=9<-3gZ^DJx=H0;@8y~oj5hnqGDdYTACBb z8Vs`6w)xuB?4%ebMN@5#J;ZuCuzqmMWcWeOKORMUsPzz4UC9aDjRuAn#zD(wPwT;e zg&=xa^m840Ki7zNt}1JN`^nT*tb>(l!!x}?kH~WH1o6=-#KynOQ%`=nQjM}R+97Vk zQNe(kC!MX2fDafoM1zgdu5I#*m0yx@z{2DJ&Au_oPK@5Q8#)pmxIu#Zl62K=J`_K- z^8nO7H2+hl8fOS&!oGlg-a2;f5Rh_N#bOg=;0fmaMtTB*m#^~@w|Pz8V88=LT{A3s z94E#ES$dxj54ySC_@tn*LuxAV!bk>KXccwW2G2^%XbrGw9z{5UBme;nx7ljQH)-)+ z&w?!r5HvvY=B)8;>}l7(R@lo8{e*`47wxY{-yu+imbZW!pRDs$(7DRphi;! z1XZZLVMu+4Gx}KdyDN?mRSls(wN!0Mla)CUu_ggvY(yM*ElnY%)c)!J>c)~!Q}c$@ zKh0HNno;_*b&l5PB{V@U6QpuF(_E7)&X(wrX1zGNL0Ebp^|j|bSyes5HSe%&*<`!? z=)SbjRVRn~GjCcDVCty80aCpVK>VvS$$E+iN(hHFjDRH!Ha?HVqjH~#H~OYlbD$qD zmA`EpiILloO_fMjhdK$j)%2sITBja!WU=$RJ-`l!7`yY)PZl{CB#l#nBptTC$F(`G zbRqXh=44!M9R$6)kny?zj8|p7xPGqk+uKt~&;Kagd0>$kd;CTS6U;6c?qM6JE>l2E zTFC2!tYNIx$$T~xE+5YHqvjv8)i`Vsja_7pG6g}?5Dvn!DVHxu==)Qc6mhu{!YW%J zSz-AE3}P;Zg&w1?#me7f$2I2%D}L%3voigWD&$8l%!65}zf~~C+gg}a3jFzbtQV$l zie6cZW2$F^4`|#jA!r77qmRIgA_nxc{O=cqGi3^e0k!A$;=^?zB8(^TlEVpx=aGfv zNtyaQhz?bqGYJJT(AXYdJ*3U|(2`LCDQl0$1#7=~pg8DY2zwxiR&7I>TJsH;r!jqS zj;)Tuo4?hXP1Zj+qI6=Z3X*#fte2gDfCBNXD@F1|h8W$M4UKuZ6M{!;UZ&#;%+P9)zCX*!>W-GZclS!7CQXB626^c^QKywAeKIhLi z2LJr4)W{9EKM0Qf%JJG?s*xHcShb*HoyVOe+5)H-f(SD#fM2Cv@vVAO#|9TI;^F+N z)F@A6cDY%wj?npTSp!7=7HagG2Lw13X2sQ2AL*5IZ2pyqAii>SFA)zBnG4!{8~FSv zHf3vPCxN=MJ)g)XyWZilWq&;1C|$}764PvZxIN9EBSq?mVnv7!8|+?7nehSj6V+8! zXfOt!fb{-XoBen6il4x#{=1s!?-ur&b2-ez$8!X@*4038K_wvwuwo!a=$H5YoiTb~ z9JX`tGGI@R;dNT=4${&(xR=&5EgNar%}eFl#hPc^`vEr7VW_ZsgVlF*+3Rm2R%@7xTl*AO+*W5oexv%k#@KrN^huhTZV;#(~5323l{Dl#3wcpXxZ)GWOts_-27!dSzkOf^BY*Wf(H>lsV}~w@p;A%_F6{edhO%bb9l6IT>-N zh!N-Ze76_T)RbZ9D%ay0*AyQTFhuS(-#jUjt)=E@vy4qGJ!#7@o)mO&VdBxJ=)8lDI;ta`1NLHeUcTriFE`hc?7K zhjJ{?Pw6DT6aD#|Eyb^aZRrca&dc+|DHcV_4-Vg}ebawd6Nz3_7=y`Qqus`^Zfi`1 zbe2X!V{hm({hcsJ?2rc+maywyu9q<+A`w#<>S6%hi+c!q4fJI!di7qCXA64Rrhptd zK#^}C+n=!WT6+uvtJ9&DuS>h{dg&!3wzgC1y=4JicCgA=r!l4~)l^!V@M0Man;sHY zu>HUf|Lq^x!o~SY4d8)=h_#78{55H-cKW4Z?hh;M??Y;Px5p}T(5=GeLY>17UnW;G zUkzy)efaA;ctJH%9m_J7uG1a-hX^5@*m(d(i!i9Hs4LDiLSs6{n^}~cNM%tLPAgU_ z9+qpS!i1?2#GJYSkIVk`dyOZ18?8*TrTJJ>w?R7J?u+Bmh>A+R!HW8rjX=Bnp|)4w z?a6~l^~2+B&WmWESLZ!3%eiG=Znjog%eWU+g0kQ3x>>tEV*fjEQ7D^tQWOr-U+y!7 z#1NOd&5ld0w$i338{W`gtP3ac)qZm*_x$sk%5Mi9G7HdOKZ!6Dsy0IMzgHdm?I`)T^hA4GHJOk^Pnu&@gj?JHYD_q8U7Onh8P#uRf z)BJvZmLy-zy`oLAAQl$eA$CECSxHe5Supayo{4|O-L)ClJOgw}`TJlgoicnd^T-Jj z5CokJhk(~{Y&1wDr!wvT^+q`Z$6RRQfn_{+w1AbBEEPl0Nvn{Ks8Z@Nh9*4CKo~&EpB7Q+L42pd>q-BjDD3_Aj-1YpK%DyU=ZkMDcnH(6PT+!w)=!|8=qd z`eGppYG{7@CEYGcdk<)Lx|ySgFq0+3Vk2%JH(x)0DDUSHV+nlt)Ba$WI4Tflhbr(5 z&$Py!-7iTad6odsDhN;Eh8grS6=k$Rvik+8DZgZ$6P^Rx<+mC`U#^SG3;5q_u60NGYUpraX*SfzS+pUDD5lt z4mS|plegp!=QHt0y-fWbfW}+vj?x z6)6nQDN&a>Tl6YBjA*Jkf<2VYH-G3#_3g#pD+ehPYyu5kXUsobg2~}XXkJz8jQW96 zCq-ZUOq%d%p@?3H3l?G!usuqqEN>m)3G@Oo#1B4_Ce2pkB)5QA-9?}0J+SmprcpO2 zqRS|HyX@xAPDw}E|2*>Q5wNga=!14i(BW796@obeZF73R0}vnLSB>4qc}@W9xfwN zKG~-Zh9!jBP$tLH(fv+xfX5LL(fgtA-{x@TA7jOB75ro;;wL@+dQI`eH}X}TrUwTq z$gf6IEyqDHJK`^iFCbZ8{)KAvV9ekz59LNFHWz6^1C!QM*|(iZOngC_h=X3#H*qL2 zxF)|WSW8xjOxkqyVp>0>Q6DEOn~mc|{T#|mX7C4jQY<(5st^R@Fu=c@t#@{4*iR!EA{G)u2x;WoBwM<-X1lORZ`Z$Fxcd*C zq^M)^NRgGC{0JMRkjibozdqWtd)k}KKh?=3^}^{w@cFWNz54O=`W{KX20{+7n@h9# zobu?QE|!8dO~pJNfW^SCQ-Sm1O8}@V1!)=apnb(N+k_D-C2R_h^i(_#LY86Vnfdwg zV(iJ*CsmaL%N+u+Tbt)#uo3J`4%v17~X{jLA+(KaK6=#AUpgG<*ZqIzG-&^dIOE|C|2=@w&%fEbwfb= z+Mr7Nod|LM{k`u?ZxJ54dhUUZ3jBcKp+#MzT4~|ZlxyXl4Eufrca5LknRT_(lDHWA zIi%YD|2Q9d!xO_1IaDYQm+zij?PlMM1%981*C&Hwobo4b_>v>OcRmiCr1$4kfHm2N z@|XpR%7|=oh2Jz^TWrBt&;FdY&&rUG_VGr8GmI;(eMBot7X)jWi=>8-VeM5j*L4h7mli#VG;t7u=1v1&9;AnA z_C=r><$1nU4~uiXyCaq@WNi2Mv(LEzP#dMI*NvR9G?c;G?M!6zsl|Ciyk2JGZSKMT z1R|n!pNI$NK!YiW2xz@{k4VG%=~yaUY)EYVX(6Ku>-)$AhE{}0cnjv%n5HlIaMxdq zpyQ*3k{<7o+4Y?22Ruu)tBb^SVIAgYDg0CJ=1Qewmh+E&oFoP_0o!+3Ok+Tx5FrXVFOgFg zqz@hqgpbjoU}I!FfA|{5DBrdj|NECY(7~0<){kZ`|2_0l#$@pE0|>Q_443m?EnEGh zTsm5;M`U;KHn4~2TGIrdvG`3)cb;wSH*4dnustqJ5F6N z)H#7P6^UwpPuN=pagOt(dvGZfZjrJ|LAsnOrl?msTHy>0mAzL>qp_LZE zo86pQ%VkBhWDvuz5WrDGR&IVRMR`dhj>f+o`t!-VstZ{~S35=h{(>q#!@UQW>GDP??@jkBPDa&jFo|T+ zu#*3LMPH8+b@WS#H*Ds_uD)j$W#!!zr3l44T1(y3G5f_9#z)O9f9;WjyK|teVVLhI z^al*(p}-H_niT}PEr#>`d!0iXEQ+B1O0I|n)eNVc8PzF!0!Y2TJQ!=>B2N5tm=by~ zq@WEm7)_iiXRo)h3crLj2Un1dW0b_9vCHd(rAk>NlDA1iC5&|){?FrsoCZ6LD6)NMIr zs}n2LQj$)fu-)ZRPH(-$QGySphhmJX#`-*%deE9s2v<3NeZtkl6)YPITzlPG9CGnp z=Lk~|>+6oz;hP%eZ3H_e!+Hddy1l~CJQlyQUo7_AP@d~wR>$hnR-sKym}a5c)C;{( zoX5np3f;r#xt^m7-n6b_hybEG6|V1{|ZZ`tP%r2Vo$BG{hJ(Aw3Bs`q98IRt0t?QRXE{f#H&AuMOeR+tD4DW={C2qZ|vsk)Ae&$Huw@wHbj4n1Xu3|7Sn#YIOB?OF*T@ONECi*m>V!!)% zY>4S56n+@Abq&s(nx)Fhx{ERC-kD&T7B>4(T0+1jbLpQO6|~AUHBPb#94WOos~D9? zN+{*a8afoE!8EI$P2FTP%&Ue646YV?OFI35PL|?kxvhBY6q*@Zp;==hX`X-5Uip!0 zXANE#=TRtEhbwW@^vj8f^UuDq{4lNR{Pla<8jKu)IGut#rR#)@c z-ojowyJ=iYla$VN;GX>EkW}R*;p-9hpp)TFS&yfVc^T}z>uzl3$+Fvo$6mfy?`}y3 z?;d3U{!^xPo(qs8D09;H@`jH%ZRAwG6u*KWB6EvvKYROlyz#N7`}b`~?`xOPW26!w zq~dr+oMv+q;$X8G(aLtySo1zY=S+_$;?+A5=Z5H|yo-9ExpfGa=qBw1f*bS(c5;?T z)53p;$mow)xz((U)Kw084XGKzv$Cv{k@Oj;YVL~Wxkhs?mBVt2%m3=B2|lF7yl z7A8dqoR41+u)J{=lIa+_9C%+&CJ?t1(FF$lW16C>|BQk6qk)&{AX;Z;qH>H%m92Ux z!NtFbgHXa~&~4k9XJ^pbJZwiOBE3Vs2?8cqm_a`#eyJ>L525b4j>%8a<=Qu8bJ%Z#^^L={UsrlIP8{fMe-U#u_k8E+ylQ z0UDO0ubLawA@O}n1BE0aj~e`yO9!$eU?OTfX+p3K5)O*fJt_P}jLBosL1S~Ck`_*zNTUc8k$9z<9kqXl#-9EPF?*Y$bJ_8KT;gXP;^`p1Xe zz_wg-1?nvj%!q8b_?>#)ef-Hx6{N)=E!`-P6qg-u?&NNuCD>15B;D|5@;Dc1f|oUX z2(yWu2v&3O=Rbqs{n&qp5vw!4yX=6?Ut&KHL2sDEP>mLHjsJS(M?1yOjQr7}9N2PU zql{o|tGSB%!$D851MS;)XI15}=vYv^>d(SgYyNa*{a6pnEsHx^Z#=@%PVX+t?9+(J z4p(GK^@@$sMn?~^#|Rk|sDnFCS1CMa(Iyj~$!$yaO=3QEn{KlPe8Ei&QbkN~`>Y{Z z?*7O)G2TUU-hjBTe7*U5&0vawL@6T(cAFjdzzV>35#EUudCL2RH07T)ir#JGo*GM9 zA?He{%3sl5pB8XOE_L*Kvi1HgnjBEopZ&EypNQ4Oq+{ff#>N$6i#_ll7O1A7v1RPD zgP(629E9kvl`Np=VF5pICqV)+?MV4~X?ZwZ**Hh@1r8m8pE|tZD}9HDY5i}LVn3p9 zhYFIs0GhfRCnLj}-}ej0PdjkIZ;rERf99ZMNmO?5$u3X&5#CO1Blft7nxD&y4krO& zMT`w9K}zWv2JaJrAOp|uXQikhIG<3AhG-@8+qUIQ^6-p;myG!rYIE!6aMn{y*I!>G zUSa#GsB?xwgawEB?Q2#2C)bRA?y7qz)!$@>h@|R`{NihyX6j1de#ZQIfpT9Ztgw03 z6^!KgRuFr+7Omtol2jK>qR4sS5ZZ(jYpK#XV)sn4B>MG8boiALKkNCSO2+36COu}& zz9eHCGj3tH!lmmzUJEfZpmHy+`GJ(a_FqeNQ1!P<+qfuRsH* zoe4oPn!UoSSGc!wlJ7JLEI1vz&!s8PQl26)IdSJtM1Wk)DjNSh-F?@(Q;4JX>ZITi zi;4|6usMseJ(|*9Vru*jAeYwGUT-6zl)rw{0r@aXqX8c>i~RAuU`TNaD8b%ZjNhb5 z-te`ouAH2ly`F(LrbRhB^B0?-JF#wX&6XoU2GXG`BJ4#gQ!ZBjzJt{GS(zwHd*yTr zu|&(-f)tp>2;rCzeJea?f8W@keSR1)vvvfz8zNTG<)84Xyw!Mj&yiI^wG-IA^IgvG zZG*P>8L|w$RRWv8$2p6R|8XB}3;BpUc{kCo;8pQDRmUY?uNFs?LxPK+b|yx%vM3SJ zq^WFED><*s9};nNLVH7x6?;c*FQjEtitr#y+;gY4P;eL*K@_zj)w@2&~@+$Xat0uJ^CulN@XRJO;BOG_e zHSrwsJ7@_P1I@*KfRg})wJnCU<`cCsy&e3W&4(GX&B4Y-0;?HO!H9LD9F$<*kQ-nP zJ!r=Up**Gx5%cmftWHi#v6L6%pZwRHdP0*lWJ8Qsr=1#D=<=>$1!n|p0=n==H!X`J zFzc0T4L^K;8(Bm$*YdAnU$HOn8Jr+=S_8mqiDmxa?d}P`nO&g#5bajHS5cy2nU*g% zrp1Glq_osGNzJ(CZl*7WwIC!Zt_V_;OcTRTAq>kYO5z1|+snhZv z+BO-{32UnNuK-eDsItRuK$o>kYW{;BJc$~-XeMCVSR|@e%7eH=D(Wer({qS6*Zaqp zQ9=w7sM;guDL>ap@p?JA6V=p*d+8nZJ9y_BcROY++ty!k8neZHl56?p`EQkV9^5Wg zPWq+lfFPQG@jaleUkC;v(b~GyE8P$gLE!0Mhfz=y-@X4Ri&f-hpZ?Pd_7E-h3BoaF z66g=4j6C$&8MN|?5Qg@fqrQbg6c~jZ%2!1OIieFY5rh5Mo&uY6*PEM0f)a%D9NKFR1LS>Fyc+)kroU(ROzFZ#JG|;Z zFK8p&%tT-!iIw|K6;VdN7SmXXH@QBR0VbC@@`1=$)O2j-mdaG|;Z*}6HM~E(d@9D^ zT)*e|Clc4HH&5RQMj;GPq2l&FqLidXMwcTF+dCk{!pHnk_(JQ2B>$J#KH5QH7@`rv zt@zu^(9lu`H=?8_ScG%9f}OzvSIMu){ZZKQ+Nr`?85}*VYN@K)H^w9@*BX8XLBa~O ztX`Aoiop$tG^Ky-3QWM_11OPSamBv(Q$UK(Sn^F9(Dfe1x(R6bgO^`;2ThnE(Q7DI zpeYFE86J6ACcM=t5`J1}`~Hxh=UuUOt&7dck&++jdVi+0J1DG+z9qnKZ8}BKL66eG ziuFXOQoos*aG0mWhvBx+=O23N{)OvEHP zmm(4M=OK?`8l)1ROVzfJU^I(GK1 z8}4_Nm7eGHEhw0;JvHt_JgIRj%w9uwgm*9cc|jHM6K^io4h25ubzJK($ct$j=(MSPHuV*+vY>Zm*fR%bRTZ_oDLoW&pV z@|qb%IHdD;_8??C?n!Ku&hIiJ%|N*hiXY`4p7Du>^`tXi=jU#)H$NMz zgT+y3DLX|~zTqTVZ_gxn%(f+Mn~gzz&M#niX)-2{LW*$%tU1=I%LN~77>cfraGh#V zQ{PqsO2Vkf5ZHIEKM`$MReHsKMLouLsU8tn*f{6T#a^57N47=nfGgCfp1;8FtamSb zR@%;(La$nPZt&!o+s%X@K2Vr2;R$v(&c`B3@&qYtXjrp|a4sJ){C<7WiWW6hUe`!_m%SeP_PIl&qnHLW7IMe7z@11q z#B1@f-b>9KYm;&(v-2lE0$Q#_y=;5XUN>_`@~s^59>LzPl09TIx}UU7BYSD!9;&@} zbax`&6@X-uAlR0in`lXXoM#ldHyMX$(7`zb;@e_oCsK}0XV+H^enX4fsz(=V$Lbdb z=dsh*SDn!)xem?;ZW37keC%>1 zteAI?7L6riMMeeBWbJ|?yvc2Ajk}1JgWZ%{9YLa<2UkZ@kLaGLQ`F+yVclw$5+Tk4 z`m2>)g>`quSJ6{RZ4CDQzQ+8oU%w_+7mMo`_EVt^$RVk^_D4W%c2rA1dkLZMXgq4% zkBbYDjY>ZFQbt3LMfXfK&TCI9;J_r4qq?LobA9P4@>ECyJrT~??|H=^T$WoAta=*Q z6{0HhsVr_WoOQDZ+oh7yHZ(;{8mJ?4=sleo#PQzXyd?e@$KTBZw ze*BPF=_@>FH9zH-KCPrVzpv9KLm1t~)V3zazu{GZt#oPDb`W$$-#?!!GCBRa{s<*n zF2O7CSKu|d*nHLm+v@gXRD#CB5J@n#qc)tTi)JO9Oaz)MetN;Wy4#QQP}&;5hRh+B z+$9)JSO~>q&#h11QZ3)q_zY&y6aLy$@cH54Q^3eDWGrl7VZ#C=s?b49L6KlsRh_g4 zVSWIy^n_VxJ=rKV#1aV9?uhRi2Xc%E7YZboOF(dFG=7o2Epmw-%rF<$EH28CACc0z z{*5b!wp4BY{B)NgH6YOrJ830z!Gw?`awWR8?80}`wn z9*O9k_g0)+8cv$UuVe}dgmG)_3)5>4EZ96h9KphJ81myn2;4Br&IPjM^AEJhwC`W25P7-j(OC#W&# zBoZz1Q19`x1CeBwHXQqQ`;H?1{LDAS#6$75Gr+Lllc2lwcH}sr-w)TdUa(Xkppfq1 z>)<4{oqI{wm9jS9$2N}r-W9g^YDsff9_-sM+l8K;(k~G>B*hT0?r3e)1&fkxG^l1c5f1P==}xE;9_lWx*Eh~-0k4oL&<;(p8WJqd%x68GCsM> z{+WYJ>VDzaU|yOs57t#%BgqIpT@;?M3$a*E6G)U7H0jt2tg;5RJG`I~^bJ5261E)D z@l!o{ykSn`XIAT(E0g&im97RHHD3fxEhXgh)?Orx*VGpZh-z~p`+>Da%! zIU{jL_;JqALxEM8^?Tkd`(pi2wp1Hi+vg-g@4Qg-0JjD9mKsh;SNCYhi`3(w3V*cd zX3CF+tz5bEuEtJvt7`#v8`++cUi=JZ-tD;MD(#s0gJi$EFD7-MFh2aPF-d2ij1f;2 zn?cq&Yi{i!PutCh+v|;)*`@eTzEb{tXRktV^>OKbVbFHJfT2U`2U^Wf1eZ4P(ZVAl zmY=9;uN5g|AAKPn=suU@mfgUN!i3r2Uk1`7t@&>C!;2x~r)-Z;z8@p?kgG)~@6bIuO5EmEN z;nDo4B7Cu9s3Ph}MzH!BVUd_V)jY_$hh*VosBn*~Y@rRj%FqyckGMj(rBRwh`eRyc zo&tf361y}<**$UCFy(t<)PgYtN!QWQu|*4qM(x}QBI4JD+hN!k;5Atv-R^a?)Ufgd z^*JvgGW_mA%?lWw4lYsp+g|UaEHW%?|4qnmh+=fPU$8IyN8gySF5I&TkUlY#Jm(E{|#_9 zk0#xv%Js*$j~yc))hF==OxP8c?Tl6NKE%<;c-kd_SbNz_zw?;0oJWITMe-?ZB#FRG z8)ie%xnsv^U3E1_{$yjlqo8s$%^;n}ehrhP|4(UKud3?$IqMBeg3!)Xw3!7iwVsi3 zhg7D|?qge4em%*G?p`4eEf*p!YBOz%#kf%O@suX$@;rY5_`oF`$64>Vqp zv`D#^FxQ0Ck_`ysM&Xe{SAYN|SOEgM&H`p&>kJitRAnzM9mcjL`cAIM-}mViJ#nzh z;h<+>f;G%-fm7Hme3Dad(MtC8{=59fIqAapG54|Peorf3kA@3sAaBbdW5O`@wans+KV(1$kaU(wLS?aa*e$R1HcovAw5y4*Fdeo6konG8!nR z+UDmt;dRx9596z+L~ z9yf3sYQq=JZV_g?s`Q(d=;gqhOsVe22VX4UrQDuGX^39>4-5hIIr=88oT5(+#%@8& zQ4~Fc!RADRjg?b9^NdSQZ&PuLIaupV%7~;bK0A?mnP{z8we^2Uvb6@8`SzUvFgM2# zT?Iaat3tOZTg`_X{I825>N6%6+9`jTtds z8PFX%K?<$f+WPthPPT(!MBHN}u>m14(CYPfQd-pScu!G{9X`w>-cqXI)4WLi-tnAI z`0RV*7cO3cs3FXHlQXYxlU0jXH>9>#F-nu6#2c1TNw!9nT$G``Z&kPYjUU5loqS*% zQ6BhYXG<^Rz@xrNC7HC@(XN|uwC`bD%p~gJm+|HCPz;r%F|{QG+uE=$*q7p+F*ZA_ zgYn7Nd_q|8Pkn$E218KbF)sIZEG0_je>|PH%HPS^k>n+cbJ8;5lCrceagxuRkyK-L zc1xdiL8Xc+h?&C;h9HUq7#^{Ootp*B8?cDMF;9TfSHjq5RokwrMN1BCc51xx)n$wN z9xYMp+Gl3x>9dbgQLb~*Qwr3%XXbo03D$L&_2B-sm{2wbqS|7~-wy+Qrdn*6)pu|1 zy||-Om_wK}AVX`TTTf`ae^{#S0uL(`_u+{A9&PzNY@cmW*YT?*)z7aD6yu}NQ>K}( z&DDQj%a;Nxx;=NrYl$MPS7e{YCaU^rt6Q#n@b`n{cjfUO%N?&C=d-qr+c0MBeO-5% zcFo};ch|;mlq~sXS=pGf6Z(D*>YPUXzyuhz&$LeZ=X?LQS~3KfAh|x$1?T@>*@0f! zsh8)L`LA*QYax@IcC1|-V2nMSk2<2xWeD(T&?l!kMDX4s{;$5 zOr3R(1?fNU@)R}`4hE_JH{7E~zkd_R!JYkA4)ib+v6)2tqHhObN-7!#CmjAIr|pN6X7i zS1lf^_ai%JD=n_BF5APdE@nH!8Jttxp4UJ5Y;B)DH-slcp(Ka>d#dgC_^Y^&sF~Q-{41b&KfV1F|A%45U%)HA62ATpR}pxA zxX3e2T$1|)EB*ed;QM!$6pfE-9G<{nWBu#H4l7G4o61r6gIP+9i5y6jUT$gV`yqfL ztQRE;fBd951a{cJ`TlZIx0*sMnELe`9!mex2OM0~9Na&ifE@ON==ZX^l~aEy7>meX zF?fGm9WO(cg4vsyF6j*OMGF1j2V#UB13RgHL1FQy5w&n*V3ox#)?KR)s)rhT2=ta% zs{1KzK?ja=qLN{O<7VM$1(Ex2b}`ogI$mr6s>MfJ$$Bnhf@hJOyDyB(Wd5*i4g<2f zp1LqOVac(K-mkbt^ZXA>03_R0cPo){fAQyYC%_l@8kc@m z%9m&WrOl0rYPx(IPv-N4F6WGnI#Jo2*jmn&zoO#F{4tbiDZY3yjEQ~BeYzfpTih$} zHyEE=33ve_Lj#EKYpYouY(DK-{%K}eSY-2fmnZF_*u6)zfukSr0j{tOCK-y(eg zImeCirXzmWd6VP@jT+O$^m=97e+?&=-(zxe1nMH3UsuP+7$SG?>INB0x--gt=K?kQ zZ<+5pkyrd$9vT=B|G4L_Ah;)GDS@Urh3oM1zUwDtl*RlPbWCRVpp%579mw<-ZvuaWgzq7Z5L0ItUW1o_p|G0 zBU+@~eGiZ+}+_Dj)=S+|SK@_-=n_J57i`c+`4|PgY!{ef`SaCdh;S18{$}tQ?k4f0bSl z2H8<(xosXLJy8pJx#w06_l8Cz6tZ#^vJmhx#fU8qmV*FQn2esxnp&M}IOTa4$T)bD za1#wx>56*M&bazR9FAZW+U(VjFW0&yqZHADqaXoH<((vaAuPHL^dBu66h%M1Q^b*FH`hNw@2#{Y@^O{nwy~TW7(#v2mc7u=Q<#QGd0{}TyZX(6V&DL!T707;& zYzuA;Fsb2mX-4lP!qEzOTsjS7;C@~<`|`8&i?zj}=8J}icLS3c!Ge}7dP)0dNmMdv z()OoIzojkS2xQd>QrNZbq)rU0WHmd`ByuM3Fvzp?)f8kGFKJAoZqazpc?a(NxECtZ zwm%fryj8N(NawpxQiaSJW1UfQeb?*)O^kMFK{Y}8aImACB!<92<(#7%2FK|wU~ClE zj-Z^;lY_o?^;E+00oS2|57!%i5lx#W%uQpt=k(#)q6a`x(S8KzVu2-jbHdk-hOQR} zT)`w%FyydYZle;o?_Z-spthm~_6)Qu;u?^d<)l-Ldp!Wxnv zJ6)I}rP{c3Y;>vKIz}H}5Z_>frW-yDZNKl2!0}Fg zHTz(-3I#%mNNb>4I2eQEhhp3blfTAOcAl=bU4K+obG7mwe63-dw)@MYD1oD&s83%F z5!yiV+qwihkKJw-z9ctfwtx3-16M4>x0YS21b@!YJJWgQ#8ihjnUnG511JtW zBeBldVo^s-l_$54xox>xapYoTDy{TCj-1r!^YO(>Og192sg2bFeRRBxk{vmEkZ8Z+RUx>@+)cpk@YRbF)(pi~PP5CQ;QS0uhmTDnvEDIL>@?$PbZp zS2A`Cv||}0oczv9F&wg*GCi?&4b*%$QYD8p4tXrPgPJ|1yRLsa40m#-9fK|Zz^vj9-tq$pTz`w6xB8vw>B$F|oUA#2=hS%PF>UC(PcXoyIKu6ym={bSj6BtXN z@dAN*-z#RP^$H>KMs43qEY5AS(*6D6msvrxYfmr{o|ue{h6tN{Iepbz@5CpsADrwG z#U1a5>)#`ZZ4%RgkDf#7R{m7I;r6J>Yl+>P-Zkr%7CJk0#Vh*>_%muFiZdKuhje6m zT`kYDRr*&L@doG=c#C1sz9cpiAn^X-<~>vwU~ya(qjtTVfRbS1xn`~cWjnO#5e9s0 zCIjJPz#z@^QAn%TZR3=JNQ+@&4Bb8Rp?cOi)cl1kAB8yCt2LiUEUYu}WY9Yg+! zGe}M@bqkhEtFfk!gHrKOS8rFYJatk#aahd0tR~5ybF%4e#3!0@wf%H`R%h;3kHO8J zXRGu^Roh;?4oH1A0V-cfzFA%y16I8RBuUZNT z?@KRQ2be;p;l}uFa=#GJCTG^|lrd*bII)NbZ}9ixXJZf_rrqE@ANmT)fq>>@P*0Xw zgq_1qi(U2C0F8~HE!4Ied)6zVLn4$$1knE-$sJ^TnFh&s!e=V%E6;BtH;A*My%m~% z=QlT~j@6uz7@1CV&FjsnHx26(*R0^1|NaVk%XQ!S1t}gipUFpL33#!}mPn@43@}zq zdnn&3VRM}p&bW-8q950D8RoHcr; z@!VU00cbipXgtBV1Zfv0Vm7n;pVU?gyn-}_Av2t z9ML|3Ml|-Kw~;@DezwCMT`t;PNo$A^vratQ_S3-0&wz5TkLxA3Ot_LH;?E{V}J=ajhD724A3W?a2t!5;l)o|)p z9Nc|Z{oOyP`Ls$C@O=kZd;Y^^{0bO0x6P|>6vwx zxzHgL!>}hYiXfXUw`tf)TA^lobIH;=ka^WQuz+Fufgp+PZZz~V+WVYJq-ogqLr{TJ z#J`7Z_UulN(*C%LzT_tlX9M?7gFe3CXollwk5`z-ACr3i>-}hy`q(X*-h}3vt|RcxAraeEL(WIM&E->4$TuRiB+Ggrqx7u%yDef zsrLHz?ck+algIq4N?I$;duDGT>v%{9O>TbAC#C69^f8Ns`ct%?bI2kRlRY-I*@a&S z&2OXMA|tUNR+naD&6zWJ-GzqQ!QY>vpuQu}JZjwAix;2zv3WCO-A~AdtCDYvd(nC$ zdF+c4RfK|A){BA{*3uUG+g%ZxfLvOfjl9mY9T2JiTxVoBYJ|hU=tK2Txb<}&R^C?W zrGRu)v*!l|)hy{72f+_owSq|)rtbxg>hpP4yUxSSgx}zu4HC4hGLs2E=K=k8y%ob@ z{k7eWZWW_`dX!zs>GH+>=r9h?Vv8{2(iw^#tB&|o!q0ZfRC^{)Li-7 zab^)Pu8~~{Jh-4qeb0V{h~;)eYEwK|y2?9>O!=$JJxioG{*u^}bpOmQ#qRld;OWbz z0744d-sY+IbwMyR+0$_OS8&Ih1y`0?=Tko>Hv7|b&-rThOT1RawCd@Kz_I zIv{u(-bU`!O#FqW@_0o=-Xh>^7%BoD6zV#bEZ+$s&qp5;%Xm3*>d%GD?U|_T(KjcQe567ZxxX_9Z6>H<`Iz zF%G>g-2%=_Qd5Xr>)caAFn=$Yc%8r3;zSOnLjmb`6>r1Y3Qs}o7n0#;W2pFN(WA6B zkG9LMk>@yv@=yig4CrgTH+Vzb#M}1W9x|lPg)VPWFIUZt)Rk}@l~+9A@njySv7;Jq zi+uLYi8Op5X(4+jYt|9OjwdZrMtWA1e5oDm(CbxEm>Ds|17h0~xuSaS*vu(2Nm!Oo zzLoqKE>$LvA%<6E1Wz-+K1p03CE%0jiw`bI8Ye^v9q5xn=TxAFNnu%eXLI_Xs4 z*6S7}5;&~)4MRskr^1H!n3u?uI@HYQYCHL0_nwp3)F=-f`NrUfi7=&$&b4%a-B37A zHepIZY{5_d+pL*Njf{GQ_)L%FWR%O6lyHOM(T{YVYz><@BA^l5TmtoEIMmGbcYH}u zH}lV|F7Z1A6)X>=1~V*9!gTVwH=$!_D9%{urI(#I9C%oh1CFbbCdfXs4y&7qRG&y? zvvzN)-%Ct=xw|&zj?w7gr8|F@(_KE0=S%LI<kixyXcTPc;sf1^8uwk)7 z7!zu1tYv!NYaca;|1fiQ$M<2^xLI|9P z`H`B4c<8M^&2xmP724&%5a+Eav@OSW$j40>FKlJ8vwkYaq^9i|FM|>q+kZLlfPxh6 zn|fd@mcW9qlICQ)0ZVl>XOu*u_`Vc2qF^}{MT$N<6?tCv)qB>vQ7KX;@(H)lU&fU< zNa##5zt*v2D=|2VUfb8;@N%qwOs(a|`+yOZs?>L)SoE`LK+=fx0$JY~$JqF7-1sJQ znE~ollsAuuZW5dXi~*snmh%Vf=fho3x7JAu4%jQPY}iZgzwYN{yWMPW5st9kW%jaY zl9uOF^&TM7($D?KD_t~voMa0%HPV+48(1joqs9O#{3K@EgWh-aHK@U%(Emu`n$04*d|Pgl#>afX6Di&RZ_3G(#?{ zUg0UNP5-kNg?e4E?Y`~>C0tB!w!KfdxznG#g@o43o2I`_P&`6Rh^-gpPDp9qE1ou5 zIbZ*=Jg9zHljOq6x?1bd)5CL9;QKVpI(x>ar+}TIvR-C!DXM98;hDg+1d1SgU@0eB z3LH)9>uI2q0%PN}G-*hv#vgovV%lnbwYm{QH4vCSzoBr|)Td!3eIp?$=5p8j`%yeMvC^J(&})U- zjA?JWftdeJ_+wPR9pVs(qd6!$RVA!mEl5=p_GqZ=ld0dM&yP%T?xZV$jdLN}Y&m9- z(WG~WPIz}caTBN)rwhOnv|~=_a5N|iF?9$dHen=pJ5Db>)Sr2;R6enqqQCCZC&d>* zTltc7(3NYmY_&Nf|0byILhyI8#F7W|CZ6|ipx3f%R+Yzj^!1lU29WhW!!Z5L-b7a3 zu>I_}kZk&~_@shW-)Rwn4O!ml+gqL5|G5=ztEo*m!&j3cHT2{uimpTmfrzp4rb4ip zF}siD+L;`$P8DtO(#?(VvMMfHR#1>Ul=NYJ8*o*6Q`ihj23tv;2JO!`)iw1uc=->8 zohk!aGd+s5+}x_^LPoq}f}LY5%=hl{>*s{YH>G!o&r+#(tS4zj4nDdW)FjZL&=d*M zlNSUT8fD(HKXixT-oJ2?ut(B145RUUQ0fUA$>v^mQaKjr{7jQT(b%bmgIU7HuRc6E z=g{75W*qTlouh5Z%Luw`49RTntx276ZjL^})j9-A^)3z9*MyzNnEe~mdILFK;n7&^C_Ty3-tab>>FTFAWG+gZF%{p~{sbKx zH|W^Vwe`J}Uvpg{swF~m_}ONQ07vVv)GB^G-=wNTZ(C%%XnFSKtq z@xN6;SoqhfU@7*kRDPl|aDi0H__CM-E%I4vywm&U$m3Gx9uzI{0HI2Il^+GESE3OS zWAt1;P7lajY3zpchUqP*bT|(axn}2S{G5pP&y+IC3B$gA`PHz*-%oEUJHT-&%^VgLQM8O*8S3Ptu`4o&PXQ#+b zz=)|%j^ga<+eaHH8`SW+WZKZKx3N4@(Azkt)UAyH;J>_RSf~=IdLP~p!H~f zB337Ts`|B;ux?u$qy-Nt==l#wrLZA+U7=+8KQ-`TEU#d84qHFFtPhY+iL~?deW--+LW%~x7xD_+EsR%2w7$GbA zzoVJ*`fJ*JJS?i%!b_qC3f_|j#n#V2QN%jIJnjH?e5@xoy!AOm zEHIvx#69DEe&#jvY5e0Rys2Ee4+YpQ>@55|k%4h!BoiMw^wE)tE)CM2JU)eLl^z?% z>3vCk79TyKgjZsDnp>Jfz4r83B2z+sY@6B!(O_1x*?Su^&oL&lD~>CwLG~-j3B^O< z%3H=UFTFQOwfjF6M8K+d#`1e{P)9d1>)FBD>C8 zAl)(Tz<%fS8|rMb^Ka+gvtf^bQEu91<|jIrxA{`PEVfwVbhR^Gda7z2oPz|HS;mr7 zAeAtErmdu)I90(3^bj{s=E_eAA#qV}GBUZ(QPJ7P*f$xNX5O2dj7{MbSA(}m;*gSu z=G&2w+1-a=(XN*hTUOtuM7Kr&_yfWMuPG1H@hWH{)*YVPJv>dXQiJR=`2s1j+Q=m* zCi)Qyy(wWNj^XDH?`MCZVB^E^?9rW@Xuo;x65=w((iTpgYB$Dn@Q+;xcf{dYfa&QcddnO_sk!sIkh>S~SImD<(v)3PNj2pK7$ zZ?y{#JA724vkyN$_!2ybDJ)o$-=>f=pRlN#Frk$y_w>IJf|Y5jhKcq67vSTI#D(ey zO!=b$jm?AP6%U_r4dk-)qojTsNuMjiALxWR{$F3|NcGZ_D~Wp)iZF7t&>o7R?~KlM%nXe!fN+yWA*{GRgL z***`GXN@3%y8Kp6=dF9=hcxom7uMy@oyc_GbY3M@XMi+1F=ihif}w29rk>*CC=&bw zxIqZ8&7~0nqYj{wBFeG(p2Y9kVQfJS%;DtWYFnECNZZM%y}Vp@)q^G#UEH?rJ9M80 zmS!F_pGc<*@c?|ZXZCY0z+Y@H59WcExznz62*M-N;S}t2RZZb4f^Onc)pEhpUg`?5 ze?YWx8|2yo*q1h>u1of|TZw9{Wrl#B_TCk6s(Op+M)~*a0s6oJO%0_`Q20#vx{W`x zDqZ^-LQ$DZQQh{l6SYd3Bfd+Qwp&v4J-~jw?w~4HI-c)sD?1(^fr!LGyJo?%gb$BB zp&CdY^g|IL61+$NRo0{PERC}?Y{r!XHDM?+WXVU9W}Mc86lyLV>mG`tR^jH_tME0oZh<*r3E43jaJ=Nje6(^z9)(!*1n%sPKV; z$M<$W(AL~um(cy!UU5rj$7Fv=X?1wl(vKy_F=sN*pQ7TdGMJA1gEoH~Au;k?{2wS( zGX^rmNdE1DB7|6ZfukX_&{q)T7>`nnq8OY?Set)#+5+JtjGlnemQ(?Q@>htNseUT* zd_7|rF&&f<%a*t=8tS$_&;ob(QdH&7wvnFClk(PBos>wPj z9Y1?IQT&f9tEKcyQiG_EAjKDP5Kry{Ur%zLA1&Ny*!pJE6bjVd4{E4^glW-GShOAj zC#pS+V>v*QZ{D`@+L2uFinrs%0IYQpr2Rb-HzlHo_vSLaq1b<)VhnqHC*P9kYu?zI zT!o=ztJF13kP%)EXDZ*_+L{|qjg5U|=Y&Y9z{lZX z$s`jZ-wCS|KPtX}k`HoAQ~1<1LxfrMCRYLC+~Oa0j5>NmA3nUKALk6ZLjBSpU?5k; z{e|~GoZjyjP7Lg+NGmUOejt0^s`*-)RryI%-7F(PIvcc$aBBuA%(SQms-#a#L{pIy zdiv}$Qp4D>2oQp39PI$O;ln70{jtb5(4wO8$7k<79pY6Rl|D^8tOU?^hE6~wftk%z z!a7M3B~ZpjzC|#@?rkUB`9jP`vB&2we+|3n{hJDsrWmmjN}D=WRE$S*Gz*_ zy6josKwK6q=<3cVWo|Ra^9L0*Tl+7%$R5Uz#c?uk3Ea_8p3et z-1SgB_1|^tg0qm}6ZG||6SJa#4=Bu`#|NMYgzc$l9;ZY7t9O>NpQS&4Xt@ zQ^6#Q;c}bbF;2JndSYtI>_M!PiJJQ4A4Wt@6Btn(m6{ZSDnTp4sJ-U{1pH1Q4PUp| zm8VGQ$kurf+QP%`X!siwmPx0I;4vr3#3(yTc+W9_Bch`n+E1GfvTQxV-cib7hpIs8 zO#v2k=>r-}Z55A^A#4D^^wL!2;ro(Le}{4_ZyaYpJ1NC58usMrmY~UsVFU}~tOJ?~ zr>XiSaK??-z6Apj6+=+QNg~4~i_*U=t4ayTA-P}oAd`G1+kP0WU6r+~?>^FC2Y2B!1aCU(gzL|8f6=)Z_>SD019P#f7P0F7)s6fjr5DKarr z423HmlvVXpMqDS>DAKBHgiWWD-JxF_huEnaqPSku3d<}5z0u3jjOO@P{J@tl z17=g2lV;yPju%QRTSGQhf&`-zZ7*!QeBDt@1DbGLZ*t$|(B`0VIX>lg`p8pdsE4BJ z7LE!cx#HDgs-ujkKVOCut3S_o7$^uSL-)21iA2V8kJ$It(7t22Z1$Y@b zF|a@aRHwnnZ$tM+RV|w@;ejdkxf%5TP^zFNssXcd^7{)w7#V6mOGQevuk#`e6yPf2Q?c#I)D6VDyZ0Ud#V8pwOQnPX*q@n46#Kk4K|a z7q)4ZGPW@fARQJP3o)2;=Bw z#E#)Q%h!P-mO}s{ri<6Fb7|&4`9I#y7s-jmZ*Qu&i9w~P-fcUz51p8oT`4746++() ziYv6ovV=&Q!mRMAt4N)}$>d)oyT-^zHDm`?SD+lA0bra(@}yj~u&|=(2%^Y)vlZF< z%T0B7v8+vB5~}{NkEi^j9;5%z@=gXNzszHnTfavz1~D)+c3#2TKg;`({>N{GLa4AI zH@hIF-k->q{H%^%;hS=vVgzIwRl-AI{_UH=n{hpY!Hd>yaW72M2{PpV0E>fCcKm;g zI3f)O-fnjq6qRx#|2bd(e|v0p>pAw> zzxb(AB8J_eMa+SLe+&o=wmAlD8jMAhdtAbwMrHwAw>|vnk1xS6B}nVflxjeaP!AQu zPKinXF|d;)tdRTpySow2F~QVuIs|H5T5%lkjR>%g+r#$1Z^nEI-q*e~DT)01n+tIv z$Tyt?t=|_G7L=!wVB^9ip@dS+uyzpeZzn=0RD&NJVxzFvuQxWYw8EkX8UM3jm0;0U zab%#R=P`U|xdM<9|b z;YX!JC^&kXiw16x=GPuc$l06%*fo`=B5Apu)cJpz0n&x7kG~0$&&kOp;M5j&Dh(t3 zDj!NTEqeumLUDYJg2eE$>hQlOJLD6*uFt)5b{1ZYauwrq;7^XEz(R2?eVZu#*Zp&9 zpsZ8t^+5&TtSyj@-$G_|J#5p^Q8LBA=Bcy^-I(j!W>4qQ-ms_t&T6?7E=zLs@N;MUJJUtKPRZSAZwB zF!nhcNV~s-5>}x7qnAPU*6S_^U$g%M5zlDb$1#CpL9@*G&tcA@@EfNf(rSbjY@t#s zCQ**x!5;vE34g7nA2=xMx(?7JzxkjRja0gRahCmisY2q^=l7LQB6I7n z>54``MOpbRycUSN1WuOPe91d9%D>zu6}A6zwth#_Ig1SBKwrB6%6*w$a0lnWWq^n4 zyvP#Qe*<0?(+RXJ{(O6A=d+J#S3N*$3z8J)t7E(yXdn$h9dVSH1CkrolNN$8VBH?wU#%*XvLyHmQhC^;NVR$2FM(}s%S;@){kpLIfO3DK zIngV+aN z1nM%)0^fp(2|jFddDx3L5TK~K_Vk;6jo2LrQi``Xv>Gg(47BJ?f6#v6Fs%O$eeb(b zXK$Fj1swwtzAIRyP%?JdNEEMjbT*>tr|SqT5j6X~bnD^Iilmos{}W`H3juFw_#-2k z@p7@bJ(Xb%fwb87Cyps6hi=h~fxcuPScUaaX2Nr$-g=*hv+N_FD1X-Qv)bhL#$2E2 z7syud3P1Od^4Nr;8gXshwAE>6SdMMWo09?Dsj@%Gp9X;BrSTfMKPl1{3WiQNlLw4k_Mnkv&2%jG--P|S3djqIT3P217gyTS`z4W^QJ^~Aibrk8|QQmmGi53 z`pOG3hkgTA&Q%lN6I+bR7|FT%!OW}9^Omdl>n*pU3 zF3SrXZYJq@-?+#E%&V;tk<7Dl+4&Lxu26~2Hhc78F+Jj;Xq^{jq|7Y01pz_+_JCI8 zqWJAJX>4+ssaPijrvXq5>tD>M=j*i8(02lYgIR^FrnVP1zTc=K1S&t%cKQv9odIq) zVZ|%vFW;2^VzRTdf^-GO*k~v=)e^{%tSh1@K33O2HSqyiip$xxWk0yN9kS`$GT;O5U#a}(`z*L5P9!zt_Cy%Q8k#YpAv#6M?}O6U(I ziQ;5imFABOWh4u=#Udj3CVMY@))jBaA-8Eh=`}tUU;}*e;A5_-RQ+$+^O1k0d2nu| z9Dk=~L^dkZ4xWJ{%#8+-?9_K@ed9|YSAVv8sQ1M^r=}VNuy4x{WyXZ#@nR^qs75Fq z97ssIp;3PBu)SS7f`n85_ipP&;LDe7Md8X-%+X*obA1(+v-ZJGT9e1jc~%K>VNmJQ zF%d^7JBtaz8=^e=9kGT=P>s8*U$!3*zxM$b%8INli4beyGe{M#i1ZDc2MW8?#?wRS zsRgaj6jNYd_A-x)y4CNn%vox&Z<&}`A2$Cd57QXj{#QAH&3z~N*mnAC{y zWUd-~rw78sz65elKTgdL^Duri1T45>>Q+W6w5Adx{x z=9WF7IT9SF8U5{&k6<#IHdYD=A8;`(hNqwjU}=|^m}gY}^=zJRB&pEC{dYu>p8=Ey zm^kRQ+1JiFinyJpIhAumz2#!8c+VblnD6KUbrgZZzjJPWtkn7eYQuSE$j$qwAL@J%;1K~~NJ~26&!wOL4(zW2!c*zIy!p6r) zRy)_-lG`9Rc|yVbh}c-Unfx5e4;9#;C!3qP++88>)n_Dlr7W{(8Ov8;*SP-u3|~9p2J2 zrw)-L!_i%G&&S$bp-jOj2{&9(me*qe}v^^STrwpj?311CQaq zYZ>No8aPavNoK!b887Y_CP0l6%w1$8pC%7%ePkNkHFOJV1|nO&NfZOal*NauKGg|M zj=dYyY&i@cdsD6S$3w%Y%@MeDogPVjPy`|PJ%1IDWD8mUI_=5 z6fm(~s$dI@(a}7uQu+NYkfvm<+}grstgP>aDYxC zp0G;&I~kf?IqvXfK;Je+`5;bS0qc*6_rXzFKao+TwycZP83nUqi_bKeJwpkapI%}t zDP32;!E7t7_vNEMlxE>1FA#7!P#5tSaFt~qz;t{&`JvUbIw2%gzvyO+Zzls|J7qKX z@6xbwXZW9QO<`gS?l07N!yfb&e0}21msMdpq!%TSHc-Y6{93O4n!xtuE)Ek!!OD)_ zGgOU+0Iy|Boc&ymBRj@C>-s&rKc+5>@?gD<%+yc(%3Y9mB6I{66UXks(xTLjpSF-Ov7!{uHKBga?A!GCvw4c-ZXD9 zG49wl9d4_==%k|`aKiYyWTjN3is9wL;@6CV#F?mZMKm~R5Um1vpTr(*_!ZlPoK>In z0`xO3Fa-=8eN&aE^xygF+J|;P(B%Sv03#C#9vL@42@&;zM!ygv9LP=1Y5?K8r*LVPvFlDPt3P`|9jkxI10V0bJ_u6 zDIH&Yr_mQe#YhesR-7???kS5h34N+>VDwGX48kmw;PRL{Wl!9|^m~q4g|4?m;MZhw zgl_Y_ze@7b(jPIgaD)zi=kulw1(y-Z0}9byT8Vxh18 zf~XnFZ=^fwb^n|Fz>9X;sFdW&$(adBvgI`n;!n_U^u0=nBG8|0&2w1r>J0$(5?3xU zDu~arp$2ER^;O{yfTdrkB{b0AGgD1B08bOJRrfqPlIWuIO#*_Dx~=PacUT$> zGLz`)UvEQ%)ovMxwfr(yY62L$ko(jp9nr8ac*NyfYTP_hM$vOI6oFO?6hFS)v(CN_ z4zwa|_V{*YNiLD~YBaW?li=5{HN6df*{?>>lYf1~eyS2>4#Cw0-3wl;K-5h_-umrI zu(E{20|JTKt$0eDqaXe5Hkz7(q8?}@nMadO*5`%un^YxkNLG!2CmH$)pMG;JEqP;NFZB)Mg-NTZ`=Q=?c~eVm()Nme!o zt(nR94?gc-&wI{!5AZzS-|so^aEYUb4!(_t@L5K8K zZ%(3Be*x8~iOGkOK$q2woAEPV+<>Zanz+n5$hqNaOfkVwBz;TnJ4jZ_ z>8};5Var2u9z?by&NsnR30I0c^2cSKPc!u>0W>S{1?aPSHkm)V;L{rA3%S}e1Agsm z>n?Y)hS!|S)8d-g@i%+~>wBjk`w*IMf*uzK)6hYj zge>jeT3V2fOFzqv>rn(H80sE*TcK#>`>)H$YJl80vK zQtr02w4-*}WT5x{T9TKK<|!FAC*YfCL~WsElD zSQA;_SwjZ81KI*QuoAU{&boGni@*ids}x-2ac;o}g?m6J(1}~&hAFe=DdAsmkC-1E zD3Uar1*FQCBz*rcm0GXY*!D_lmrZYUQ}DC!a1H=kZC*#b6?!O==fzH*H9Eku=BGru?I{p>V!J84SZZ*jf!&_$llr9eHc``hLn-r}a9%wr0VeMU}Z z`Js;nj#&jgY$>|6FpsAV*{>QC`&%dS|Iqy65B7fMb2i@0C>H79q~_Tld5-~yRe9EB zbhEnLw;h$mNIKx*uav5JMkh~Z|M>s5HLHx`-!29qYUxB*>2Xs?bf$*0oP3t&VELNc z&N?cF{XX6h@$Llae*7G={n*7p(-=|TqrSO)l~BTIL5Q-Y2zZybHa8WT?aGmtXxq4V zb&-T8jL)vFbND0^Iu;JAS3Q~dOU3eqY`!&qTi><1Rt#N{!8F8eH^RJ)-{o5&^XWV7 z8IvdWjyin&baGkBfYrYM6ZUDd-KG{9R8vUuh*D!BSHo74hfM zmZKxNF+rQ#nH~u2{=vL&<@ya;O0{(#@<0Z@O6#$xYYJUgqi@xtQ>yv?$RN$_>TK#m zHA&&W(6-KVUK6v44{<}~uEO4OVMw0wL7ECCga*MK;FNFClW}JqKmQ2uwY12urg^Eq zzGQB<4e;1uf$@S6O{=B>bldGIj&|j$g_p+$4;GtBsW<8HrPi6-n>InoisL}BYZ2I4 zoAOl8Q-$B^;&zNiyLg4cy)?vmfHq1*Y7)jC)Zym~lMl}qd7FKB-b-cf5?MI=O;#!i zKlOU<2k?5;brfY!#6Gt?FZD;t7A@-=IvQ$jEKe7dx^e(1P)B!b{}X;gw9T^tbSBwY zXm8LIumEUB@-Kg?{_KQSE1Xhr5A=riezqbCwnX7DGT+#(Q*!%VmZvWH|zU zfRnSzFcqIZlm?TTNrset;9eQDmQOVrx1CN9UG{rbLqQobIchj?6S#=(es1*ya^|0% CsY?I= literal 0 HcmV?d00001 diff --git a/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/world-fixed-object.md b/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/world-fixed-object.md new file mode 100644 index 00000000..cf151ef6 --- /dev/null +++ b/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/world-fixed-object.md @@ -0,0 +1,20 @@ +# World Fixed Object + +![World Fixed Object component](world-fixed-object.png) + +このコンポーネントを付けることで、GameObjectをワールドに固定できます。 + +## いつ使うもの? + +GameObjectをワールド固定したいとき。 + +## セットアップ方法 + +ワールド固定したいGameObjectにWorld Fixed Objectコンポーネントをつけるだけです。設定はありません。 + +このコンポーネントは自動的にワールド原点に固定されたGameObjectをアタバー直下に作り、その子にWorld Fixed ObjectのついたGameObjectを移動させます。 +World Fixed ObjectのついたGameObjectはParent Constraint等を使用してワールド内の位置を調整できます。 + +複数のWorld Fixed Objectコンポーネントを使っても、Constraintは一つだけです。なので、複数のGameObjectを指定しても、その分重くなることはありません。 + +技術的な制約により、Quest単体では動作できません。Quest向けのビルドはつけたままにしてもいいが、効果は発揮しません。 diff --git a/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/world-fixed-object.png b/docs/i18n/ja/docusaurus-plugin-content-docs/current/reference/world-fixed-object.png new file mode 100644 index 0000000000000000000000000000000000000000..24662471438e314865710828e031af331e026f5f GIT binary patch literal 63289 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

?t8gv*BEYu?@Gss-46g&spRvbRRP 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�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