From acb3fa11ca3ab000893e8c8e1064b46ba37245c1 Mon Sep 17 00:00:00 2001 From: Luke Skarth-Hayley Date: Tue, 7 Sep 2021 10:05:42 +0100 Subject: [PATCH] Add scripts and prefab plus unitypackage --- InputSystemFirstPersonCharacter.prefab | 290 ++++++++++++++++++ .../InputSystemFirstPersonCharacter.cs | 146 +++++++++ ...nputSystemFirstPersonControls.inputactions | 274 +++++++++++++++++ ...temFirstPersonSettings.inputsettings.asset | 26 ++ inputsystemfpcharacter_070.unitypackage | Bin 0 -> 6548 bytes 5 files changed, 736 insertions(+) create mode 100644 InputSystemFirstPersonCharacter.prefab create mode 100644 InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonCharacter.cs create mode 100644 InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonControls.inputactions create mode 100644 InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonSettings.inputsettings.asset create mode 100644 inputsystemfpcharacter_070.unitypackage diff --git a/InputSystemFirstPersonCharacter.prefab b/InputSystemFirstPersonCharacter.prefab new file mode 100644 index 0000000..a498956 --- /dev/null +++ b/InputSystemFirstPersonCharacter.prefab @@ -0,0 +1,290 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2240643064954224092 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2240643064954224089} + - component: {fileID: 2240643064954224094} + - component: {fileID: 2240643064954224095} + m_Layer: 0 + m_Name: FirstPersonCharacter + m_TagString: Player + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2240643064954224089 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643064954224092} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -5, y: 1.1, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2240643065093264019} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!143 &2240643064954224094 +CharacterController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643064954224092} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Height: 2 + m_Radius: 0.5 + m_SlopeLimit: 45 + m_StepOffset: 0.7 + m_SkinWidth: 0.08 + m_MinMoveDistance: 0.001 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &2240643064954224095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643064954224092} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c230aecc9f34fa848b4f5683019a8479, type: 3} + m_Name: + m_EditorClassIdentifier: + cam: {fileID: 2240643065093264031} + movementSpeed: 5 + lookSensitivity: 3.2 + gravity: -14.715 + zoomFOV: 30 + zoomSpeed: 9 +--- !u!1 &2240643065093264016 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2240643065093264019} + - component: {fileID: 2240643065093264031} + - component: {fileID: 2240643065093264028} + - component: {fileID: 2240643065093264029} + - component: {fileID: 2240643065093264018} + m_Layer: 0 + m_Name: FirstPersonCamera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2240643065093264019 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643065093264016} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.8, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2240643064954224089} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &2240643065093264031 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643065093264016} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 70 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &2240643065093264028 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643065093264016} + m_Enabled: 1 +--- !u!114 &2240643065093264029 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643065093264016} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 7 + m_ObsoleteRenderingPath: 0 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + clearColorMode: 0 + backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} + clearDepth: 1 + volumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + volumeAnchorOverride: {fileID: 0} + antialiasing: 0 + SMAAQuality: 2 + dithering: 0 + stopNaNs: 0 + taaSharpenStrength: 0.5 + TAAQuality: 1 + taaHistorySharpening: 0.35 + taaAntiFlicker: 0.5 + taaMotionVectorRejection: 0 + taaAntiHistoryRinging: 0 + physicalParameters: + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + flipYMode: 0 + xrRendering: 1 + fullscreenPassthrough: 0 + allowDynamicResolution: 0 + customRenderingSettings: 0 + invertFaceCulling: 0 + probeLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + hasPersistentHistory: 0 + exposureTarget: {fileID: 0} + m_RenderingPathCustomFrameSettings: + bitDatas: + data1: 72198262773251917 + data2: 13763000468760363032 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + materialQuality: 0 + renderingPathCustomFrameSettingsOverrideMask: + mask: + data1: 0 + data2: 0 + defaultFrameSettings: 0 +--- !u!114 &2240643065093264018 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2240643065093264016} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 113e4aa2cd3db44d1ac0cb7e9794964b, type: 3} + m_Name: + m_EditorClassIdentifier: + globalGainDb: 0 + occlusionMask: + serializedVersion: 2 + m_Bits: 4294967295 + stereoSpeakerModeEnabled: 0 + recorderSeamless: 0 + recorderSourceTag: Untagged + recorderFoldout: 0 diff --git a/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonCharacter.cs b/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonCharacter.cs new file mode 100644 index 0000000..89a3bdc --- /dev/null +++ b/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonCharacter.cs @@ -0,0 +1,146 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[RequireComponent(typeof(CharacterController))] +public class InputSystemFirstPersonCharacter : MonoBehaviour +{ + private InputSystemFirstPersonControls inputActions; + + private CharacterController controller; + + [SerializeField] private Camera cam; + [SerializeField] private float movementSpeed = 2.0f; + [SerializeField] public float lookSensitivity = 1.0f; + + private float xRotation = 0f; + + // Movement Vars + private Vector3 velocity; + public float gravity = -9.81f; + private bool grounded; + + // Zoom Vars - Zoom code adapted from @torahhorse's First Person Drifter scripts. + public float zoomFOV = 30.0f; + public float zoomSpeed = 9f; + private float targetFOV; + private float baseFOV; + + // Crouch Vars + private float initHeight; + [SerializeField] private float crouchHeight; + + private void Awake() + { + inputActions = new InputSystemFirstPersonControls(); + } + private void Start() + { + controller = GetComponent(); + initHeight = controller.height; + Cursor.lockState = CursorLockMode.Locked; + //Cursor.visible = false; + SetBaseFOV(cam.fieldOfView); + } + + private void OnEnable() + { + inputActions.Enable(); + } + + private void Update() + { + DoLooking(); + DoMovement(); + DoZoom(); + //DoCrouch(); + } + + private void DoLooking() + { + Vector2 looking = GetPlayerLook(); + float mouseX = looking.x * lookSensitivity * Time.deltaTime; + float mouseY = looking.y * lookSensitivity * Time.deltaTime; + + transform.Rotate(Vector3.up * mouseX); + + xRotation -= mouseY; + xRotation = Mathf.Clamp(xRotation, -90f, 90f); + cam.transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f); + } + + private void DoMovement() + { + grounded = controller.isGrounded; + if (grounded && velocity.y < 0) + { + velocity.y = -2f; + } + + Vector2 movement = GetPlayerMovement(); + Vector3 move = transform.right * movement.x + transform.forward * movement.y; + controller.Move(move * movementSpeed * Time.deltaTime); + + velocity.y += gravity * Time.deltaTime; + controller.Move(velocity * Time.deltaTime); + } + + private void DoZoom() + { + if (inputActions.FPSController.Zoom.ReadValue() > 0) + { + targetFOV = zoomFOV; + } + else + { + targetFOV = baseFOV; + } + UpdateZoom(); + } + + private void DoCrouch() + { + // TODO: check if underneath an object and stop at collision + if (inputActions.FPSController.Crouch.ReadValue() > 0) + { + controller.height = crouchHeight; + } + else + { + // this doesn't work to check collision... + if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.up), 0.5f)) + { + controller.height = crouchHeight; + } + else + { + controller.height = initHeight; + } + } + } + + private void UpdateZoom() + { + cam.fieldOfView = Mathf.Lerp(cam.fieldOfView, targetFOV, zoomSpeed * Time.deltaTime); + } + + public void SetBaseFOV(float fov) + { + baseFOV = fov; + } + + private void OnDisable() + { + inputActions.Disable(); + } + + public Vector2 GetPlayerMovement() + { + return inputActions.FPSController.Move.ReadValue(); + } + + public Vector2 GetPlayerLook() + { + return inputActions.FPSController.Look.ReadValue(); + } +} diff --git a/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonControls.inputactions b/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonControls.inputactions new file mode 100644 index 0000000..80d4961 --- /dev/null +++ b/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonControls.inputactions @@ -0,0 +1,274 @@ +{ + "name": "NewInputFirstPersonControls", + "maps": [ + { + "name": "FPSController", + "id": "2a8b124d-b40d-4089-9bb1-3e7687c3c29f", + "actions": [ + { + "name": "Move", + "type": "Value", + "id": "6e44727f-40d2-41de-9df8-ef9c859bb7f5", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "" + }, + { + "name": "Look", + "type": "Value", + "id": "5199bef6-c81b-4c89-a767-9d8947696c32", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "" + }, + { + "name": "Zoom", + "type": "Button", + "id": "0998abb7-9fab-4ed8-840b-668f6a9d41f7", + "expectedControlType": "Button", + "processors": "", + "interactions": "" + }, + { + "name": "Crouch", + "type": "Button", + "id": "c863efc0-5558-4bfd-9e1f-2f090a5f5683", + "expectedControlType": "Button", + "processors": "", + "interactions": "" + }, + { + "name": "PauseMenu", + "type": "Button", + "id": "a5ad4849-694e-45e5-818f-a2eb7914c14d", + "expectedControlType": "Button", + "processors": "", + "interactions": "Press" + } + ], + "bindings": [ + { + "name": "WASD", + "id": "e1c66f5d-86f8-4819-9ffb-46c51392ba9b", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "b2b620ce-fd94-4aa9-9452-511a00d48e5e", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "0a533e67-c661-464c-8486-a99fdbe48997", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "864a6caa-192d-4320-9e3e-06dc3d60bead", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "259e7673-3108-4433-8958-246644928eea", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "2D Vector", + "id": "f5a0feef-fa07-4fda-8e57-98862b13abfa", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "7ca7ef42-34ce-439e-ba30-93fd2fcc6708", + "path": "/leftStick/up", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "b894679b-485b-41e1-ab9e-7f1d5e02c2a8", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "bea5abaf-7361-4a3b-8ea0-96e1afaf7c92", + "path": "/leftStick/left", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "1c67ce8f-8e4b-47fc-bee9-35bf8a7fe760", + "path": "/leftStick/right", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "a4145e3e-192b-4cc8-82eb-ebae065cddae", + "path": "/rightStick", + "interactions": "", + "processors": "ScaleVector2(x=20,y=20)", + "groups": "FPSControllerInputs", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "de7cdca1-c0b2-4408-83fe-c06771dd6234", + "path": "/delta", + "interactions": "", + "processors": "ScaleVector2(x=2,y=2)", + "groups": "FPSControllerInputs", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "af2e03ea-44d0-47e1-af62-ae554b91a1d9", + "path": "/rightTrigger", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Zoom", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "86ffbc8f-e77d-421f-aba6-4660814d34b1", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Zoom", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "50e54fa5-3989-4d41-8bca-89dbd9160957", + "path": "/leftTrigger", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1fa13f20-80a4-4416-9374-e7b6f4381d11", + "path": "/leftCtrl", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4e0d6395-4dc0-46bc-8d08-393f5dc28b31", + "path": "/escape", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "PauseMenu", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "6776399b-937f-4092-83f0-07621e416be8", + "path": "/start", + "interactions": "", + "processors": "", + "groups": "FPSControllerInputs", + "action": "PauseMenu", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [ + { + "name": "FPSControllerInputs", + "bindingGroup": "FPSControllerInputs", + "devices": [ + { + "devicePath": "", + "isOptional": true, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + } + ] +} \ No newline at end of file diff --git a/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonSettings.inputsettings.asset b/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonSettings.inputsettings.asset new file mode 100644 index 0000000..c531621 --- /dev/null +++ b/InputSystemFirstPersonCharacterScripts/InputSystemFirstPersonSettings.inputsettings.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c46f07b5ed07e4e92aa78254188d3d10, type: 3} + m_Name: Rmes.inputsettings + m_EditorClassIdentifier: + m_SupportedDevices: [] + m_UpdateMode: 1 + m_CompensateForScreenOrientation: 1 + m_FilterNoiseOnCurrent: 0 + m_DefaultDeadzoneMin: 0.125 + m_DefaultDeadzoneMax: 0.925 + m_DefaultButtonPressPoint: 0.5 + m_DefaultTapTime: 0.2 + m_DefaultSlowTapTime: 0.5 + m_DefaultHoldTime: 0.4 + m_TapRadius: 5 + m_MultiTapDelayTime: 0.75 diff --git a/inputsystemfpcharacter_070.unitypackage b/inputsystemfpcharacter_070.unitypackage new file mode 100644 index 0000000000000000000000000000000000000000..0f2c7463555d54bd6ad4b41bb9d5a7e7be5ed4aa GIT binary patch literal 6548 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 literal 0 HcmV?d00001